/*
 * Copyright 2004,2005 The Apache Software Foundation.
 *
 * Licensed 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_WSDL4C_OPERATION_H
 #define AXIS2_WSDL4C_OPERATION_H
 
 /**
 * @file axis2_wsdl4c_operation.h
 * @brief defines WSDL4C_OPERATION
 */
#include <axis2_array_list.h>
#include <axis2_allocator.h>
#include <axis2_env.h>
#include <axis2_error.h>

#ifdef __cplusplus
extern "C"
{
#endif

/**
 * @defgroup axis2_wsdl4c_operation wsdl4c_operation
 * @ingroup axis2_wsdl4c
 * @{
 */

    enum axis2_wsdl4c_optype
    {
        AXIS2_WSDL4C_OP_NONE ,
        AXIS2_WSDL4C_OP_IN ,
        AXIS2_WSDL4C_OP_OUT ,
        AXIS2_WSDL4C_OP_IN_OUT ,
        AXIS2_WSDL4C_OP_OUT_IN
    };

    enum axis2_wsdl4c_msg_type
    {
        AXIS2_WSDL4C_INPUT,
        AXIS2_WSDL4C_OUTPUT,
        AXIS2_WSDL4C_FAULT
    };

    typedef enum axis2_wsdl4c_optype axis2_wsdl4c_optype_t;
    typedef enum axis2_wsdl4c_msg_type axis2_wsdl4c_msg_type_t;

    void *
    axis2_wsdl4c_operation_create(void* parser, 
                                    void *port_type);

    void
    axis2_wsdl4c_operation_destroy(void *operation);

    /**
     * axis2_wsdl4c_operation_get_message
     * @param mesage type , WSDL4C_INPUT, WSDL4C_OUTPUT or WSDL4C_FAULT
     * @return pointer to the message
     */
    void *
    axis2_wsdl4c_operation_get_message(void *operation, 
                                        axis2_wsdl4c_msg_type_t type );

    axis2_array_list_t *
    axis2_wsdl4c_operation_get_faults(void *operation);

    /**
     * axis2_wsdl4c_operation_get_optype
     * @return type of the operation in,in-out,out,out-in
     */
    axis2_wsdl4c_optype_t
    axis2_wsdl4c_operation_get_type(void *operation);

    /**
     * axis2_wsdl4c_operation_port_type
     * @return The port type to which this operation belongs
     */
    void *
    axis2_wsdl4c_operation_port_type(void *operation);

    void
    axis2_wsdl4c_operation_set_message(void *operation, 
                                        void *message, 
                                        axis2_wsdl4c_msg_type_t type);

    /**
     * get_name
     * @return name of the Wsdl Element
     */
    char *
    axis2_wsdl4c_operation_get_name(void *operation);

    /**
     * get_documentation
     *   
     */
    char *
    axis2_wsdl4c_operation_get_documentation(void *operation);  

    /**
     *@name get_extensibility_elements/get_extensibility_attributes
     *@brief return the extensibility elements/attributes belonging 
     *       to a given namespace
     *@params namspace uri
     *@params reference to a vector<int>
     *@return true if any extensibility elements were found
     */
    int *
    axis2_wsdl4c_operation_get_extensibility_elements(void *operation,
                                                    char *namespc);

    int *
    axis2_wsdl4c_operation_get_extensibility_attributes(void *operation,
                                                        char *namespc);

    void
    axis2_wsdl4c_operation_set_name(void *operation,
                                    char *name);
  
    void
    axis2_wsdl4c_operation_add_ext_element(void *operation,
                                    int ident);
 
    void
    axis2_wsdl4c_operation_add_ext_attribute(void *operation,
                                            int ident);

    void
    axis2_wsdl4c_operation_set_documentation(void *operation, 
                                            char *doc);

/** @} */

#ifdef __cplusplus
}
#endif
#endif  /* AXIS2_WSDL4C_OPERATION_H */
