/*
 * 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_SERVICE_H
 #define AXIS2_WSDL4C_SERVICE_H
 
 /**
 * @file axis2_wsdl4c_service.h
 * @brief defines WSDL4C_SERVICE
 */
#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_service wsdl4c_service
 * @ingroup axis2_wsdl4c
 * @{
 */
    void *
    axis2_wsdl4c_service_create(void* parser);

    void
    axis2_wsdl4c_service_destroy(void *service);

    /**
     * axis2_wsdl4c_service_add_port
     * @return the extensibility element id of the  main binding extension 
     * element. In case of soap it would  be the id of the soap:binding element
     */
    void
    axis2_wsdl4c_service_add_port(void *service,
                                    char *name,
                                    void *binding,
                                    int svc_ext_id);
 
   /**
   * @param name of the port
   * @return service extension id of the port
   */   
    int
    axis2_wsdl4c_service_get_port_extention(void *service,
                                            char *name);
 
   /**
   * Get the binding associated with the port
   * @param port name
   * @return binding associated with the port
   */   
    void *
    axis2_wsdl4c_service_get_port_binding(void *service,
                                            char *name);

   /**
    * return names of the ports associated with the service
    */
    axis2_array_list_t *
    axis2_wsdl4c_service_get_ports(void *service);

    /**
     * get_name
     * @return name of the Wsdl Element
     */
    char *
    axis2_wsdl4c_service_get_name(void *service);

    /**
     * get_documentation
     *   
     */
    char *
    axis2_wsdl4c_service_get_documentation(void *service);  

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

    int *
    axis2_wsdl4c_service_get_extensibility_attributes(void *service,
                                                        char *namespc);

    void
    axis2_wsdl4c_service_set_name(void *service,
                                    char *name);
  
    void
    axis2_wsdl4c_service_add_ext_element(void *service,
                                    int ident);
 
    void
    axis2_wsdl4c_service_add_ext_attribute(void *service,
                                            int ident);

    void
    axis2_wsdl4c_service_set_documentation(void *service, 
                                            char *doc);

/** @} */

#ifdef __cplusplus
}
#endif
#endif  /* AXIS2_WSDL4C_SERVICE_H */
