/*
 * 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_BINDING_MSG_REF_H
#define AXIS2_WSDL_BINDING_MSG_REF_H

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

#include <axis2_const.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_binding_msg_ref axis2_wsdl_binding_msg_ref_t;
typedef struct axis2_wsdl_binding_msg_ref_ops axis2_wsdl_binding_msg_ref_ops_t;

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

/** 
 * @brief Wsdl Binding Message Reference ops struct
 * Encapsulator struct for ops of axis2_wsdl_binding_msg_ref
 */
AXIS2_DECLARE_DATA struct axis2_wsdl_binding_msg_ref_ops
{
   /** De-allocate memory
      * @return status code
      */
   axis2_status_t (AXIS2_CALL *
    free)(axis2_wsdl_binding_msg_ref_t *wsdl_binding_msg_ref,
          const axis2_env_t *env);

    /**
     * Method getDirection
     *
     * @return
     */
    axis2_char_t * (AXIS2_CALL *
    get_direction) (axis2_wsdl_binding_msg_ref_t *binding_msg_ref,
                                                const axis2_env_t *env);
    
    /**
     * Method setDirection
     *
     * @param direction
     */
    axis2_status_t (AXIS2_CALL *
    set_direction) (axis2_wsdl_binding_msg_ref_t *binding_msg_ref,
                                                const axis2_env_t *env,
                                                const axis2_char_t *direction);
    
    /**
     * Method getMessageLabel
     *
     * @return
     */
    axis2_char_t * (AXIS2_CALL *
    get_msg_label) (axis2_wsdl_binding_msg_ref_t *binding_msg_ref,
                                                const axis2_env_t *env);
    
    /**
     * Method setMessageLabel
     *
     * @param messageLabel
     */
    axis2_status_t (AXIS2_CALL *
    set_msg_label) (axis2_wsdl_binding_msg_ref_t *binding_msg_ref,
                                                const axis2_env_t *env,
                                                const axis2_char_t *msg_label);
};

/** 
 * @brief Wsdl binding message reference struct  
 */  
AXIS2_DECLARE_DATA struct axis2_wsdl_binding_msg_ref
{
   axis2_wsdl_binding_msg_ref_ops_t *ops;
    struct axis2_wsdl_extensible_component *extensible_component;
};

/**
 * Creates wsdl binding message reference struct
 * @return pointer to newly created wsdl binding message reference
 */
AXIS2_EXTERN axis2_wsdl_binding_msg_ref_t * AXIS2_CALL 
axis2_wsdl_binding_msg_ref_create (const axis2_env_t *env);

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

#define AXIS2_WSDL_BINDING_MSG_REF_FREE(wsdl_binding_msg_ref, env) \
      ((wsdl_binding_msg_ref)->ops->free (wsdl_binding_msg_ref, env))

#define AXIS2_WSDL_BINDING_MSG_REF_GET_DIRECTION(wsdl_binding_msg_ref, env) \
      ((wsdl_binding_msg_ref)->ops->get_direction (wsdl_binding_msg_ref, env))

#define AXIS2_WSDL_BINDING_MSG_REF_SET_DIRECTION(wsdl_binding_msg_ref, env, direction) \
      ((wsdl_binding_msg_ref)->ops->set_direction (wsdl_binding_msg_ref, env, direction))       

#define AXIS2_WSDL_BINDING_MSG_REF_GET_MSG_LABEL(wsdl_binding_msg_ref, env) \
      ((wsdl_binding_msg_ref)->ops->get_msg_label (wsdl_binding_msg_ref, env))

#define AXIS2_WSDL_BINDING_MSG_REF_SET_MSG_LABEL(wsdl_binding_msg_ref, env, ref) \
      ((wsdl_binding_msg_ref)->ops->set_msg_label (wsdl_binding_msg_ref, env, msg_label))
        
/*************************** End of function macros ***************************/

/** @} */

#ifdef __cplusplus
}
#endif
#endif  /* AXIS2_WSDL_BINDING_MSG_REF_H */
