/*
 * 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_TRANSPORT_OUT_DESC_H
#define AXIS2_TRANSPORT_OUT_DESC_H

/**
 * @file axis2_transport_out_desc.h
 * @brief Axis2 description transport out 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_array_list.h>
#include <axis2_transport_sender.h>
#include <axis2_phase_meta.h>
#include <axis2_phase.h>
#include <axis2_flow.h>
#include <axis2_wsdl.h>

#ifdef __cplusplus
extern "C"
{
#endif

struct axis2_phase;
struct axis2_transport_sender;    
typedef struct axis2_transport_out_desc axis2_transport_out_desc_t;
typedef struct axis2_transport_out_desc_ops axis2_transport_out_desc_ops_t;

/** @defgroup axis2_transport_out_desc Transport in
 * @ingroup axis2_descriptions
 * @{
 */

/** 
 * @brief Description Transport Out operations struct
 * Encapsulator struct for operations of axis2_transport_out_desc
 */
AXIS2_DECLARE_DATA struct axis2_transport_out_desc_ops
{
	/** De-allocate memory
  	 * @return status code
  	 */
	axis2_status_t (AXIS2_CALL *free)(
                    axis2_transport_out_desc_t *transport_out_desc,
			        axis2_env_t **env);
    
    /**
     * @return
     */
    axis2_qname_t *(AXIS2_CALL *
    get_qname) (struct axis2_transport_out_desc *transport_out,
                                            axis2_env_t **env);
    
    /**
     * @param name
     */
    axis2_status_t (AXIS2_CALL *
    set_qname) (struct axis2_transport_out_desc *transport_out,
                                            axis2_env_t **env,
                                            axis2_qname_t *qname);
    
    struct axis2_flow *(AXIS2_CALL *
    get_outflow) (struct axis2_transport_out_desc *transport_out,
                                            axis2_env_t **env);
    
    axis2_status_t (AXIS2_CALL *
    set_outflow) (struct axis2_transport_out_desc *transport_out,
                                            axis2_env_t **env,
                                            struct axis2_flow *outflow);
    
    struct axis2_flow *(AXIS2_CALL *
    get_faultflow) (struct axis2_transport_out_desc *transport_out,
                                            axis2_env_t **env);
    
    axis2_status_t (AXIS2_CALL *
    set_faultflow) (struct axis2_transport_out_desc *transport_out,
                                            axis2_env_t **env,
                                            struct axis2_flow *faultflow);
    
    /**
     * @return
     */
    struct axis2_transport_sender * (AXIS2_CALL *
    get_sender) (struct axis2_transport_out_desc *transport_out,
                                            axis2_env_t **env);
    
    /**
     * @param receiver
     */
    axis2_status_t (AXIS2_CALL *
    set_sender) (struct axis2_transport_out_desc *transport_out,
                                            axis2_env_t **env,
                                            struct axis2_transport_sender *sender);
    
    struct axis2_phase * (AXIS2_CALL *
    get_outphase) (struct axis2_transport_out_desc *transport_out,
                                            axis2_env_t **env);
    
    axis2_status_t (AXIS2_CALL *
    set_outphase) (struct axis2_transport_out_desc *transport_out,
                                            axis2_env_t **env,
                                            struct axis2_phase *outphase);
    
    struct axis2_phase *(AXIS2_CALL *
    get_faultphase) (struct axis2_transport_out_desc *transport_out,
                                            axis2_env_t **env);
    
    axis2_status_t (AXIS2_CALL *
    set_faultphase) (struct axis2_transport_out_desc *transport_out,
                                            axis2_env_t **env,
                                            struct axis2_phase *faultphase);
        

};

/** 
 * @brief Transport Out struct  
 */  
AXIS2_DECLARE_DATA struct axis2_transport_out_desc
{
	axis2_transport_out_desc_ops_t *ops;
    axis2_param_container_t *param_container;
};

/**
 * Creates transport out struct
 * @return pointer to newly created transport out
 */
AXIS2_DECLARE(axis2_transport_out_desc_t *) 
axis2_transport_out_desc_create_with_qname (axis2_env_t **env, axis2_qname_t *qname);

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

#define AXIS2_TRANSPORT_OUT_DESC_FREE(transport_out_desc, env) \
		((transport_out_desc->ops)->free (transport_out_desc, env))

#define AXIS2_TRANSPORT_OUT_DESC_GET_QNAME(transport_out_desc, env) \
		((transport_out_desc->ops)->get_qname (transport_out_desc, env))

#define AXIS2_TRANSPORT_OUT_DESC_SET_QNAME(transport_out_desc, env, qname) \
		((transport_out_desc->ops)->set_qname (transport_out_desc, env, qname))

#define AXIS2_TRANSPORT_OUT_DESC_GET_OUTFLOW(transport_out_desc, env) \
		((transport_out_desc->ops)->get_outflow (transport_out_desc, env))

#define AXIS2_TRANSPORT_OUT_DESC_SET_OUTFLOW(transport_out_desc, env, outflow) \
		((transport_out_desc->ops)->set_outflow (transport_out_desc, env, outflow))       

#define AXIS2_TRANSPORT_OUT_DESC_GET_FAULTFLOW(transport_out_desc, env) \
		((transport_out_desc->ops)->get_faultflow (transport_out_desc, env)) 
        
#define AXIS2_TRANSPORT_OUT_DESC_SET_FAULTFLOW(transport_out_desc, env, faultflow) \
		((transport_out_desc->ops)->set_faultflow (transport_out_desc, env, faultflow)) 

#define AXIS2_TRANSPORT_OUT_DESC_GET_SENDER(transport_out_desc, env) \
		((transport_out_desc->ops)->get_sender (transport_out_desc, env)) 
        
#define AXIS2_TRANSPORT_OUT_DESC_SET_SENDER(transport_out_desc, env, sender) \
		((transport_out_desc->ops)->set_sender (transport_out_desc, env, sender)) 

#define AXIS2_TRANSPORT_OUT_DESC_GET_OUTPHASE(transport_out_desc, env) \
		((transport_out_desc->ops)->get_outphase (transport_out_desc, env)) 
        
#define AXIS2_TRANSPORT_OUT_DESC_SET_OUTPHASE(transport_out_desc, env, outphase) \
		((transport_out_desc->ops)->set_outphase (transport_out_desc, env, outphase)) 

#define AXIS2_TRANSPORT_OUT_DESC_GET_FAULTPHASE(transport_out_desc, env) \
		((transport_out_desc->ops)->get_faultphase (transport_out_desc, env)) 
        
#define AXIS2_TRANSPORT_OUT_DESC_SET_FAULTPHASE(transport_out_desc, env, faultphase) \
		((transport_out_desc->ops)->set_faultphase (transport_out_desc, env, faultphase))

/*************************** End of function macros ***************************/

/** @} */

#ifdef __cplusplus
}
#endif
#endif  /* AXIS2_TRANSPORT_OUT_DESC_H */
