/*
 * 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_HEADER_BLOCK_H
 #define AXIS2_SOAP_HEADER_BLOCK_H

  
   /**
    * @file axis2_soap_header_block.h
    * @brief axis2_soap_header_block struct
    */
#include <axis2_env.h>
#include <axis2_om_node.h>
#include <axis2_om_element.h>
#include <axis2_array_list.h>
#include <axis2_soap_header.h>

#ifdef __cplusplus
extern "C"
{
#endif

    typedef struct axis2_soap_header_block axis2_soap_header_block_t;
    typedef struct axis2_soap_header_block_ops axis2_soap_header_block_ops_t;
    
/**
 * @defgroup axis2_soap_header_block
 * @ingroup axis2_soap
 * @{
 */

/**
 *   \brief soap_header_block operations struct
 *   ops Encapsulator struct of axis2_soap header_block
 */
 AXIS2_DECLARE_DATA   struct axis2_soap_header_block_ops
    {
      /**
        * Free an axis2_soap_header_block
        * @param  header_block pointer to soap_header_block struct
        * @param  env Environment. MUST NOT be NULL
        * @return satus of the op. AXIS2_SUCCESS on success 
        *         else AXIS2_FAILURE
        */
        axis2_status_t (AXIS2_CALL *
		free_fn)(axis2_soap_header_block_t *header_block,
                 axis2_env_t **env);
                                             
        axis2_status_t (AXIS2_CALL *
		set_role)(axis2_soap_header_block_t *header_block,
                  axis2_env_t **env,
                  axis2_char_t *uri);  
        
        axis2_status_t (AXIS2_CALL *
		set_must_understand_with_bool)(axis2_soap_header_block_t *header_block,
                             		   axis2_env_t **env,
                             	 	   axis2_bool_t *must_understand);
                             
        axis2_status_t (AXIS2_CALL *
		set_must_understand_with_string)(axis2_soap_header_block_t *header_block,
                             			 axis2_env_t **env,
                             			 axis2_char_t *must_understand);
                                             
        axis2_bool_t (AXIS2_CALL *
		get_must_understand)(axis2_soap_header_block_t *header_block,
                             axis2_env_t **env);
                             
                             
        axis2_bool_t (AXIS2_CALL *
		is_processed)(axis2_soap_header_block_t *header_block,
                      axis2_env_t **env);
                             
        axis2_status_t (AXIS2_CALL *
		set_processed)(axis2_soap_header_block_t *header_block,
                       axis2_env_t **env);
					   
        axis2_char_t* (AXIS2_CALL *
		get_role)(axis2_soap_header_block_t *header_block,
                  axis2_env_t **env);
          
        axis2_status_t (AXIS2_CALL *
		set_attribute)(axis2_soap_header_block_t *header_block,
                       axis2_env_t **env,
                       axis2_char_t *attr_name,
                       axis2_char_t *attr_value,
                       axis2_char_t *soap_envelope_namespace_uri);
					   
                             
        axis2_char_t* (AXIS2_CALL *
		get_attribute)(axis2_soap_header_block_t *header_block,
                       axis2_env_t **env,
                       axis2_char_t *attr_name,
                       axis2_char_t *soap_envelope_namespace_uri);                            
                                       
                                              
        axis2_om_node_t* (AXIS2_CALL *
		get_base_node)(axis2_soap_header_block_t *header_block,
                       axis2_env_t **env);
        
        int (AXIS2_CALL *
		get_soap_version)(axis2_soap_header_block_t *header_block,
                          axis2_env_t **env);

    };

  /**
    * \brief soap_header_block struct
    * represent a soap_header_block
    */
    struct axis2_soap_header_block
    {
        /** operation of axis2_soap_header_block struct */
        axis2_soap_header_block_ops_t *ops;
       
    };

/**
* creates a soap struct 
* @param env Environment. MUST NOT be NULL
* this is an internal function.    
*/


AXIS2_DECLARE(axis2_soap_header_block_t *)
axis2_soap_header_block_create_with_parent(axis2_env_t **env,
                                           axis2_char_t *localname,
                                           axis2_om_namespace_t *ns,
                                           struct axis2_soap_header *parent);
                            
/******************** Macros **************************************************/
    
/** free soap_header_block */
#define AXIS2_SOAP_HEADER_BLOCK_FREE(header_block , env) \
        ((header_block)->ops->free_fn(header_block, env))
        
#define AXIS2_SOAP_HEADER_BLOCK_GET_ROLE(header_block , env) \
        ((header_block)->ops->get_role(header_block, env))

#define AXIS2_SOAP_HEADER_BLOCK_IS_PROCESSED(header_block , env) \
        ((header_block)->ops->is_processed(header_block, env))

#define AXIS2_SOAP_HEADER_BLOCK_SET_PRECESSED(header_block , env) \
        ((header_block)->ops->set_processed(header_block, env))
        
#define AXIS2_SOAP_HEADER_BLOCK_GET_MUST_UNDERSTAND(header_block, env) \
        ((header_block)->ops->get_must_understand(header_block, env)) 

#define AXIS2_SOAP_HEADER_BLOCK_SET_MUST_UNDERSTAND_WITH_BOOL(header_block,\
             env, must_understand) \
        ((header_block)->ops->get_must_understand_with_bool(header_block, \
             env, must_understand)) 
             
#define AXIS2_SOAP_HEADER_BLOCK_SET_MUST_UNDERSTAND_WITH_STRING(header_block,\
             env, must_understand) \
        ((header_block)->ops->get_must_understand_with_string(header_block, \
             env, must_understand))                    

#define AXIS2_SOAP_HEADER_BLOCK_GET_BASE_NODE(header_block, env) \
        ((header_block)->ops->get_base_node(header_block, env))   
        
#define AXIS2_SOAP_HEADER_BLOCK_GET_SOAP_VERSION(header_block, env) \
        ((header_block)->ops->get_soap_version(header_block, env))
        
#define AXIS2_SOAP_HEADER_BLOCK_GET_ATTRIBUTE(header_block, env,\
            attr_name, soap_envelope_namespace_uri)  \
        ((header_block)->ops->get_attribute(header_block, env, \
            attr_name, soap_envelope_namespace_uri))
            
#define AXIS2_SOAP_HEADER_BLOCK_SET_ATTRIBUTE(header_block, env,\
            attr_name, soap_envelope_namespace_uri)  \
        ((header_block)->ops->set_attribute(header_block, env, \
            attr_name, soap_envelope_namespace_uri))            

/** @} */

#ifdef __cplusplus
}
#endif
#endif /* AXIS2_SOAP_HEADER_BLOCK_H */
