/*
 * 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_WSDL4C_PORT_TYPE_H
 #define AXIS2_WSDL4C_PORT_TYPE_H
 
 /**
 * @file axis2_wsdl4c_port_type.h
 * @brief defines WSDL4C_PORT_TYPE
 */
#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_port_type wsdl4c_port_type
 * @ingroup axis2_wsdl4c
 * @{
 */
    void *
    axis2_wsdl4c_port_type_create(void* parser);

    void
    axis2_wsdl4c_port_type_destroy(void *port_type);

    int
    axis2_wsdl4c_port_type_get_num_ops(void *port_type);

    /**
     * axis2_wsdl4c_port_type_get_operation
     * @param index of the operation index:0..number of operations
     * @return pointer to  the Operation
     */
    void *
    axis2_wsdl4c_port_type_get_operation_a_index(void *port_type, 
                                        int index);

    /**
     * axis2_wsdl4c_port_type_get_operation
     * @param name of the operation
     * @return pointer to  the Operation
     */
    void *
    axis2_wsdl4c_port_type_get_operation_a_qname(void *port_type, 
                                        void *qname);

    int
    axis2_wsdl4c_port_type_get_operation_index(void *port_type, 
                                                axis2_char_t *op_name);

    /**
     * axis2_wsdl4c_port_type_get_operations
     * @return axis2_array_list_t
     * returns array list of operations 
     */
    axis2_array_list_t *
    axis2_wsdl4c_port_type_get_operations(void *port_type);

    /**
     * @name   binding
     * @return const Binding*
     * returns Binding associated with the port type 
     * which has a binding protocol specified by 'nsp'
     */
    void *
    axis2_wsdl4c_port_type_binding(void *port_type, 
                            char *nsp);

    void
    axis2_wsdl4c_port_type_add_op(void *port_type, 
                        void *op);
    
    void
    axis2_wsdl4c_port_type_set_binding(void *port_type, 
                                void *bn);

    /**
     * get_name
     * @return name of the Wsdl Element
     */
    char *
    axis2_wsdl4c_port_type_get_name(void *port_type);

    /**
     * get_documentation
     *   
     */
    char *
    axis2_wsdl4c_port_type_get_documentation(void *port_type);  

    /**
     *@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_port_type_get_extensibility_elements(void *port_type,
                                                    char *namespc);

    int *
    axis2_wsdl4c_port_type_get_extensibility_attributes(void *port_type,
                                                        char *namespc);

    void
    axis2_wsdl4c_port_type_set_name(void *port_type,
                                    char *name);
  
    void
    axis2_wsdl4c_port_type_add_ext_element(void *port_type,
                                    int ident);
 
    void
    axis2_wsdl4c_port_type_add_ext_attribute(void *port_type,
                                            int ident);

    void
    axis2_wsdl4c_port_type_set_documentation(void *port_type, 
                                            char *doc);

/** @} */

#ifdef __cplusplus
}
#endif
#endif  /* AXIS2_WSDL4C_PORT_TYPE_H */
