/*
 * 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_MESSAGE_H
 #define AXIS2_WSDL4C_MESSAGE_H
 
 /**
 * @file axis2_wsdl4c_message.h
 * @brief defines WSDL4C_MESSAGE
 */
#include <axis2_array_list.h>
#include <axis2_allocator.h>
#include <axis2_env.h>
#include <axis2_error.h>
#include <axis2_wsdl4c_part.h>

#ifdef __cplusplus
extern "C"
{
#endif

/**
 * @defgroup axis2_wsdl4c_message wsdl4c_message
 * @ingroup axis2_wsdl4c
 * @{
 */
    void *
    axis2_wsdl4c_msg_create(void* parser);


    void
    axis2_wsdl4c_msg_destroy(void *message);
 

    /**
     * @name axis2_wsdl4c_msg_get_num_parts
     * @return number of parts in the message
     */
    int
    axis2_wsdl4c_msg_get_num_parts(void *message); 


    /**
     * @name axis2_wsdl4c_msg_get_part_index
     * @param the name of the part
     * @return index of the of the part whose name is passed
     *         index:0..number of parts
     */
    int
    axis2_wsdl4c_msg_get_part_index(void *message, 
                                    char *name);

    /** 
     * @name axis2_wsdl4c_msg_get_part_type
     * @param the index  of the part       index:0..number of parts
     * @return type id  of the part
     *         for ex if we have <part name="one" type="xsd:int">
     *         the id returned represents xsd:int,the schema type for integers
     */
    int
    axis2_wsdl4c_msg_get_part_type_a_index(void *message, 
                                            int index);


    int
    axis2_wsdl4c_msg_get_part_type_a_name(void *message, 
                                            char *name); 


    /** 
     * @name axis2_wsdl4c_msg_get_part_element
     * @param the index  of the part  index:0..number of parts
     * @return pointer to the Element which the part uses
     *         for ex if we have <part name="one" element="ns:elem">
     *         a pointer to the Element representing ns:elem is returned
     *         If the part's reftype is Type ,0 is returned
     */
    void *
    axis2_wsdl4c_msg_get_part_element(void *message, 
                                        int index);


    /** 
     * @name axis2_wsdl4c_msg_get_message_part
     * @param the index  of the part,or the name
     * @return pointer to the Part
     */
    void*
    axis2_wsdl4c_msg_get_message_part_a_index(void *message, 
                                                size_t index); 


    void *
    axis2_wsdl4c_msg_get_message_part_a_nam(void *message, 
                                            char *nam);


    /**
     * @name axis2_wsdl4c_msg_get_part_content_schema_id
     * @param the index  of the part,or the name
     * @return schema id to which the part's type or element belongs to
     */
    int
    axis2_wsdl4c_msg_get_part_content_schema_id_a_index(void *message, 
                                                        int index);


    int
    axis2_wsdl4c_msg_get_part_content_schema_id_a_name(void *message, 
                                                        char *name);


    char *
    axis2_wsdl4c_msg_get_part_name(void *message, 
                                    int index);


    axis2_wsdl4c_part_ref_type_t
    axis2_wsdl4c_msg_get_part_ref_type_a_nam(void *message, 
                                                char *nam);


    axis2_wsdl4c_part_ref_type_t
    axis2_wsdl4c_msg_get_part_ref_type_a_index(void *message, 
                                                int index);


    void
    axis2_wsdl4c_msg_add_part(void *message, char *pname, 
                                axis2_wsdl4c_part_ref_type_t reftype, 
                                void *d, 
                                int schema_id);

    /**
     * get_name
     * @return name of the Wsdl Element
     */
    char *
    axis2_wsdl4c_msg_get_name(void *message);

    /**
     * get_documentation
     *   
     */
    char *
    axis2_wsdl4c_msg_get_documentation(void *message);  

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

    int *
    axis2_wsdl4c_msg_get_extensibility_attributes(void *message,
                                                        char *namespc);

    void
    axis2_wsdl4c_msg_set_name(void *message,
                                    char *name);
  
    void
    axis2_wsdl4c_msg_add_ext_element(void *message,
                                    int ident);
 
    void
    axis2_wsdl4c_msg_add_ext_attribute(void *message,
                                            int ident);

    void
    axis2_wsdl4c_msg_set_documentation(void *message, 
                                            char *doc);


/** @} */

#ifdef __cplusplus
}
#endif
#endif  /* AXIS2_WSDL4C_MESSAGE_H */
