/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef AXIS2_WSDL_SOAP_OP_H
#define AXIS2_WSDL_SOAP_OP_H

/**
 * @file axis2_wsdl_soap_op.h
 * @brief Axis2 Wsdl soap op interface
 */

#include <axis2_const.h>
#include <axis2_error.h>
#include <axis2_defines.h>
#include <axis2_env.h>
#include <axis2_allocator.h>
#include <axis2_qname.h>
#include <axis2_wsdl_extensible_element.h>
#include <axis2_wsdl.h>

#ifdef __cplusplus
extern "C"
{
#endif

typedef struct axis2_wsdl_soap_op axis2_wsdl_soap_op_t;
typedef struct axis2_wsdl_soap_op_ops axis2_wsdl_soap_op_ops_t;

/** @defgroup axis2_wsdl_soap_op Wsdl Extensible Element
 * @ingroup axis2_wsdl
 * @{
 */

/** 
 * @brief Wsdl Extensible Element ops struct
 * Encapsulator struct for ops of axis2_wsdl_soap_op
 */
 struct axis2_wsdl_soap_op_ops
{
   /** De-allocate memory
      * @return status code
      */
   axis2_status_t (AXIS2_CALL *free)(
                    axis2_wsdl_soap_op_t *wsdl_soap_op,
                 const axis2_env_t *env);

    axis2_char_t *(AXIS2_CALL *
    get_style) (axis2_wsdl_soap_op_t *soap_op,
                                        const axis2_env_t *env);
        
    axis2_status_t (AXIS2_CALL *
    set_style) (axis2_wsdl_soap_op_t *soap_op,
                                        const axis2_env_t *env,
                                        axis2_char_t *style);
    
    axis2_char_t * (AXIS2_CALL *
    get_soap_action) (axis2_wsdl_soap_op_t *soap_op,
                                        const axis2_env_t *env);
    
    axis2_status_t (AXIS2_CALL *
    set_soap_action) (axis2_wsdl_soap_op_t *soap_op,
                                        const axis2_env_t *env,
                                        axis2_char_t *soap_action);
};

/** 
 * @brief Wsdl container struct
 *   Property for params  
 */  
 struct axis2_wsdl_soap_op
{
   axis2_wsdl_soap_op_ops_t *ops;
    axis2_wsdl_extensible_element_t *extensible_element;
};

/**
 * Creates wsdl property struct
 * @return pointer to newly created wsdl property
 */
AXIS2_EXTERN axis2_wsdl_soap_op_t * AXIS2_CALL 
axis2_wsdl_soap_op_create (const axis2_env_t *env);

/**
 * Creates wsdl property struct
 * @param type 
 * @return pointer to newly created wsdl property
 */
AXIS2_EXTERN axis2_wsdl_soap_op_t * AXIS2_CALL 
axis2_wsdl_soap_op_create_with_type (const axis2_env_t *env, axis2_qname_t *type);

/*************************** Function macros **********************************/

#define AXIS2_WSDL_SOAP_OP_FREE(soap_op, env) \
      ((soap_op)->ops->free (soap_op, env))

#define AXIS2_WSDL_SOAP_OP_GET_STYLE(soap_op, env) \
      ((soap_op)->ops->get_style (soap_op, env))

#define AXIS2_WSDL_SOAP_OP_SET_STYLE(soap_op, env, style) \
      ((soap_op)->ops->set_style (soap_op, env, style))

#define AXIS2_WSDL_SOAP_OP_GET_SOAP_ACTION(soap_op, env) \
      ((soap_op)->ops->get_soap_action (soap_op, env))

#define AXIS2_WSDL_SOAP_OP_SET_SOAP_ACTION(soap_op, env, soap_action) \
      ((soap_op)->ops->set_soap_action (soap_op, env, soap_action))       

/*************************** End of function macros ***************************/

/** @} */

#ifdef __cplusplus
}
#endif
#endif  /* AXIS2_WSDL_SOAP_OP_H */
