/*
 * 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_SOAP_BUILDER_H
 #define AXIS2_SOAP_BUILDER_H
 
 #include <axis2_om_stax_builder.h>
 #include <axis2_soap_envelope.h>
 
/**
 * @file axis2_soap_builder.h
 * @brief axis2_soap_builder struct 
 */

#ifdef __cplusplus
extern "C"
{
#endif


typedef struct axis2_soap_builder axis2_soap_builder_t;
typedef struct axis2_soap_builder_ops  axis2_soap_builder_ops_t;
    
/**
 * @defgroup axis2_soap_builder
 * @ingroup axis2_soap_model builder
 * @{
 */

/**
 *   \brief soap_model builder operations struct
 *   ops Encapsulator struct of axis2_soap_operations 
 */

AXIS2_DECLARE_DATA   struct axis2_soap_builder_ops
{
        axis2_status_t (AXIS2_CALL *free)(axis2_soap_builder_t *builder,
                                          axis2_env_t **env);

        axis2_soap_envelope_t* (AXIS2_CALL *get_soap_envelope)
                                         (axis2_soap_builder_t *builder,
                                          axis2_env_t **env);
                                          
        axis2_om_document_t* (AXIS2_CALL *get_document)
                                         (axis2_soap_builder_t *builder,
                                          axis2_env_t **env);
                                          
        axis2_status_t (AXIS2_CALL *next)(axis2_soap_builder_t *builder,
                                axis2_env_t **env);
                                
                                                     
        axis2_om_node_t* (AXIS2_CALL *get_document_element)
                                            (axis2_soap_builder_t *builder,
                                             axis2_env_t **env); 
                                             
        axis2_status_t (AXIS2_CALL *set_bool_processing_mandatory_fault_elements)
                                            (axis2_soap_builder_t *builder,
                                             axis2_env_t **env,
                                             axis2_bool_t value);
        
        axis2_status_t (AXIS2_CALL *set_processing_detail_elements)
                                    (axis2_soap_builder_t *builder,
                                     axis2_env_t **env,
                                     axis2_bool_t value);
                                     
        axis2_bool_t (AXIS2_CALL *is_processing_detail_elements)
                                    (axis2_soap_builder_t *builder, 
                                     axis2_env_t **env);
                                     
                                     
        int (AXIS2_CALL *get_soap_version)(axis2_soap_builder_t *builder,
                                           axis2_env_t **env);
                                           
        axis2_status_t (AXIS2_CALL *set_element_level)
                                          (axis2_soap_builder_t *builder,
                                           axis2_env_t **env,
                                           int ele_level);

        axis2_status_t (AXIS2_CALL *process_namespace_data)
                                          (axis2_soap_builder_t *builder,
                                           axis2_env_t **env,
                                           axis2_om_node_t *om_node,
                                           axis2_bool_t is_soap_element);
};
                                                      

/**
 * \brief soap_body struct
 * represent a soap_body
 */
 
struct axis2_soap_builder
{
    /** operation of axis2_soap_body struct */
    axis2_soap_builder_ops_t *ops;
};

/**
 * creates a axis2_soap_builder struct
 * @param env Environment. MUST NOT be NULL
 */

AXIS2_DECLARE(axis2_soap_builder_t *)
axis2_soap_builder_create(axis2_env_t **env,
                                axis2_om_stax_builder_t *builder,
                                axis2_char_t *soap_version);

/******************** Macros **************************************************/
    
#define AXIS2_SOAP_BUILDER_FREE(builder, env) \
        ((builder)->ops->free(builder, env))

#define AXIS2_SOAP_BUILDER_GET_SOAP_ENVELOPE(builder, env) \
        ((builder)->ops->get_soap_envelope(builder, env))
        
#define AXIS2_SOAP_BUILDER_GET_DOCUMENT_ELEMENT(builder, env) \
        ((builder)->ops->get_document_element(builder, env))
        
#define AXIS2_SOAP_BUILDER_NEXT(builder, env) \
        ((builder)->ops->next(builder, env))
        
#define AXIS2_SOAP_BUILDER_GET_DOCUMENT(builder, env) \
        ((builder)->ops->get_document(builder, env))
        
#define AXIS2_SOAP_BUILDER_NEXT(builder, env) \
        ((builder)->ops->next(builder, env)) 
        
#define AXIS2_SOAP_BUILDER_SET_BOOL_PROCESSING_MANDATORY_FAULT_ELEMENTS(builder, env, value) \
        ((builder)->ops->set_bool_processing_mandatory_fault_elements(builder, env, value))
 
#define AXIS2_SOAP_BUILDER_SET_PROCESSING_DETAIL_ELEMENTS(builder, env, value) \
        ((builder)->ops->set_processing_detail_elements(builder, env, value))
        
#define AXIS2_SOAP_BUILDER_IS_PROCESSING_DETAIL_ELEMENTS(builder, env) \
        ((builder)->ops->is_processing_detail_elements(builder, env))                         


#define AXIS2_SOAP_BUILDER_GET_SOAP_VERSION(builder, env) \
        ((builder)->ops->get_soap_version(builder, env))
        
#define AXIS2_SOAP_BUILDER_SET_ELEMENT_LEVEL(builder, env, ele_level) \
        ((builder)->ops->set_element_level(builder, env, ele_level))
        
#define AXIS2_SOAP_BUILDER_PROCESS_NAMESPACE_DATA(builder, env, om_node, is_soap_element) \
        ((builder)->ops->process_namespace_data(builder, env, om_node, is_soap_element))
        
                
/** @} */
#ifdef __cplusplus
}
#endif 
 


#endif /* AXIS2_SOAP_BUILDER_H */
