/*
 * 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_WSDL_MSG_REF_H
#define AXIS2_WSDL_MSG_REF_H

/**
 * @file axis2_wsdl_msg_ref.h
 * @brief Axis2 Wsdl bindig message reference interface
 */

#include <axis2.h>
#include <axis2_error.h>
#include <axis2_defines.h>
#include <axis2_env.h>
#include <axis2_allocator.h>
#include <axis2_qname.h>
#include <axis2_wsdl_extensible_component.h>

#ifdef __cplusplus
extern "C"
{
#endif

struct axis2_wsdl_extensible_component;
typedef struct axis2_wsdl_msg_ref axis2_wsdl_msg_ref_t;
typedef struct axis2_wsdl_msg_ref_ops axis2_wsdl_msg_ref_ops_t;

/** @defgroup axis2_wsdl_msg_ref Wsdl Binding Fault
 * @ingroup axis2_wsdl
 * @{
 */

/** 
 * @brief Wsdl Binding Message Reference ops struct
 * Encapsulator struct for ops of axis2_wsdl_msg_ref
 */
AXIS2_DECLARE_DATA struct axis2_wsdl_msg_ref_ops
{
    /** De-allocate memory
     * @return status code
     */
    axis2_status_t (AXIS2_CALL *
    free)(axis2_wsdl_msg_ref_t *wsdl_msg_ref,
		    axis2_env_t **env);

    /**
     * Method getDirection
     *
     * @return
     */
    axis2_char_t * (AXIS2_CALL *
    get_direction) (axis2_wsdl_msg_ref_t *msg_ref,
                                                axis2_env_t **env);
    
    /**
     * Method setDirection
     *
     * @param direction
     */
    axis2_status_t (AXIS2_CALL *
    set_direction) (axis2_wsdl_msg_ref_t *msg_ref,
                                                axis2_env_t **env,
                                                axis2_char_t *direction);
    
    /**
     * Method getMessageLabel
     *
     * @return
     */
    axis2_char_t * (AXIS2_CALL *
    get_msg_label) (axis2_wsdl_msg_ref_t *msg_ref,
                                                axis2_env_t **env);
    
    /**
     * Method setMessageLabel
     *
     * @param messageLabel
     */
    axis2_status_t (AXIS2_CALL *
    set_msg_label) (axis2_wsdl_msg_ref_t *msg_ref,
                                                axis2_env_t **env,
                                                axis2_char_t *msg_label);
                                                
    /**
     * Returns an Element which refers to the actual message that will get 
     *transported. This Element Abstracts all the Message Parts that was defined in 
     * the WSDL 1.1.
     * @return
     */
    axis2_qname_t * (AXIS2_CALL *
    get_element) (axis2_wsdl_msg_ref_t *msg_ref,
                                    axis2_env_t **env);
    
    /**
     * Sets the Element that will Abstract the actual message. All the parts defined 
     * in WSDL 1.1 per message should be Encapsulated in this Element.
     * @param element
     */
    axis2_status_t (AXIS2_CALL *
    set_element) (axis2_wsdl_msg_ref_t *msg_ref,
                                    axis2_env_t **env,
                                    axis2_qname_t *element);                                              
};

/** 
 * @brief Wsdl  message reference struct  
 */  
AXIS2_DECLARE_DATA struct axis2_wsdl_msg_ref
{
	axis2_wsdl_msg_ref_ops_t *ops;
    struct axis2_wsdl_extensible_component *extensible_component;
};

/**
 * Creates wsdl  message reference struct
 * @return pointer to newly created wsdl  message reference
 */
AXIS2_DECLARE(axis2_wsdl_msg_ref_t *) 
axis2_wsdl_msg_ref_create (axis2_env_t **env);

/*************************** Function macros **********************************/

#define AXIS2_WSDL_MSG_REF_FREE(wsdl_msg_ref, env) \
		((wsdl_msg_ref)->ops->free (wsdl_msg_ref, env))

#define AXIS2_WSDL_MSG_REF_GET_DIRECTION(wsdl_msg_ref, env) \
		((wsdl_msg_ref)->ops->get_direction (wsdl_msg_ref, env))

#define AXIS2_WSDL_MSG_REF_SET_DIRECTION(wsdl_msg_ref, env, direction) \
		((wsdl_msg_ref)->ops->set_direction (wsdl_msg_ref, env, direction))       

#define AXIS2_WSDL_MSG_REF_GET_MSG_LABEL(wsdl_msg_ref, env) \
		((wsdl_msg_ref)->ops->get_msg_label (wsdl_msg_ref, env))

#define AXIS2_WSDL_MSG_REF_SET_MSG_LABEL(wsdl_msg_ref, env, msg_label) \
		((wsdl_msg_ref)->ops->set_msg_label (wsdl_msg_ref, env, msg_label))
        
#define AXIS2_WSDL_MSG_REF_GET_ELEMENT(wsdl_msg_ref, env) \
		((wsdl_msg_ref)->ops->get_element (wsdl_msg_ref, env))

#define AXIS2_WSDL_MSG_REF_SET_ELEMENT(wsdl_msg_ref, env, element) \
		((wsdl_msg_ref)->ops->set_element (wsdl_msg_ref, env, element))        
        
/*************************** End of function macros ***************************/

/** @} */

#ifdef __cplusplus
}
#endif
#endif  /* AXIS2_WSDL_MSG_REF_H */
