/*
 * 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_IN_DESC_H
#define AXIS2_TRANSPORT_IN_DESC_H

/**
 * @file axis2_transport_in_desc.h
 * @brief Axis2 description transport in 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_receiver.h>*/
#include <axis2_phase_meta.h>
#include <axis2_phase.h>
#include <axis2_flow.h>

#ifdef __cplusplus
extern "C"
{
#endif

struct axis2_phase;
struct axis2_transport_receiver;    
typedef struct axis2_transport_in_desc axis2_transport_in_desc_t;
typedef struct axis2_transport_in_desc_ops axis2_transport_in_desc_ops_t;

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

/** 
 * @brief Description Transport In ops struct
 * Encapsulator struct for ops of axis2_transport_in_desc
 */
AXIS2_DECLARE_DATA struct axis2_transport_in_desc_ops
{
	/** De-allocate memory
  	 * @return status code
  	 */
	axis2_status_t (AXIS2_CALL *free)(
                    axis2_transport_in_desc_t *transport_in_desc,
			        axis2_env_t **env);
    
    /**
     * @return
     */
    axis2_qname_t *(AXIS2_CALL *
    get_qname) (struct axis2_transport_in_desc *transport_in,
                                            axis2_env_t **env);
    
    /**
     * @param name
     */
    axis2_status_t (AXIS2_CALL *
    set_qname) (struct axis2_transport_in_desc *transport_in,
                                            axis2_env_t **env,
                                            axis2_qname_t *qname);
    
    struct axis2_flow *(AXIS2_CALL *
    get_inflow) (struct axis2_transport_in_desc *transport_in,
                                            axis2_env_t **env);
    
    axis2_status_t (AXIS2_CALL *
    set_inflow) (struct axis2_transport_in_desc *transport_in,
                                            axis2_env_t **env,
                                            struct axis2_flow *inflow);
    
    struct axis2_flow *(AXIS2_CALL *
    get_faultflow) (struct axis2_transport_in_desc *transport_in,
                                            axis2_env_t **env);
    
    axis2_status_t (AXIS2_CALL *
    set_faultflow) (struct axis2_transport_in_desc *transport_in,
                                            axis2_env_t **env,
                                            struct axis2_flow *faultflow);
    
    /**
     * @return
     */
    struct axis2_transport_receiver * (AXIS2_CALL *
    get_recv) (struct axis2_transport_in_desc *transport_in,
                                            axis2_env_t **env);
    
    /**
     * @param receiver
     */
    axis2_status_t (AXIS2_CALL *
    set_recv) (struct axis2_transport_in_desc *transport_in,
                                            axis2_env_t **env,
                                            struct axis2_transport_receiver *recv);
    
    struct axis2_phase * (AXIS2_CALL *
    get_in_phase) (struct axis2_transport_in_desc *transport_in,
                                            axis2_env_t **env);
    
    axis2_status_t (AXIS2_CALL *
    set_in_phase) (struct axis2_transport_in_desc *transport_in,
                                            axis2_env_t **env,
                                            struct axis2_phase *in_phase);
    
    struct axis2_phase *(AXIS2_CALL *
    get_faultphase) (struct axis2_transport_in_desc *transport_in,
                                            axis2_env_t **env);
    
    axis2_status_t (AXIS2_CALL *
    set_faultphase) (struct axis2_transport_in_desc *transport_in,
                                            axis2_env_t **env,
                                            struct axis2_phase *faultphase);
        

};

/** 
 * @brief Transport In struct  
 */  
AXIS2_DECLARE_DATA struct axis2_transport_in_desc
{
	axis2_transport_in_desc_ops_t *ops;
    axis2_param_container_t *param_container;
};

/**
 * Creates phase holder struct
 * @return pointer to newly created phase holder
 */
AXIS2_DECLARE(axis2_transport_in_desc_t *) 
axis2_transport_in_desc_create_with_qname (axis2_env_t **env, 
                                           axis2_qname_t *qname);

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

#define AXIS2_TRANSPORT_IN_DESC_FREE(transport_in_desc, env) \
		((transport_in_desc)->ops->free (transport_in_desc, env))

#define AXIS2_TRANSPORT_IN_DESC_GET_QNAME(transport_in_desc, env) \
		((transport_in_desc)->ops->get_qname (transport_in_desc, env))

#define AXIS2_TRANSPORT_IN_DESC_SET_QNAME(transport_in_desc, env, qname) \
		((transport_in_desc)->ops->set_qname (transport_in_desc, env, qname))

#define AXIS2_TRANSPORT_IN_DESC_GET_INFLOW(transport_in_desc, env) \
		((transport_in_desc)->ops->get_inflow (transport_in_desc, env))

#define AXIS2_TRANSPORT_IN_DESC_SET_INFLOW(transport_in_desc, env, inflow) \
		((transport_in_desc)->ops->set_inflow (transport_in_desc, env, inflow))       

#define AXIS2_TRANSPORT_IN_DESC_GET_FAULTFLOW(transport_in_desc, env) \
		((transport_in_desc)->ops->get_faultflow (transport_in_desc, env)) 
        
#define AXIS2_TRANSPORT_IN_DESC_SET_FAULTFLOW(transport_in_desc, env, faultflow) \
		((transport_in_desc)->ops->set_faultflow (transport_in_desc, env, faultflow)) 

#define AXIS2_TRANSPORT_IN_DESC_GET_RECV(transport_in_desc, env) \
		((transport_in_desc)->ops->get_recv (transport_in_desc, env)) 
        
#define AXIS2_TRANSPORT_IN_DESC_SET_RECV(transport_in_desc, env, recv) \
		((transport_in_desc)->ops->set_recv (transport_in_desc, env, recv)) 

#define AXIS2_TRANSPORT_IN_DESC_GET_IN_PHASE(transport_in_desc, env) \
		((transport_in_desc)->ops->get_in_phase (transport_in_desc, env)) 
        
#define AXIS2_TRANSPORT_IN_DESC_SET_IN_PHASE(transport_in_desc, env, in_phase) \
		((transport_in_desc)->ops->set_in_phase (transport_in_desc, env, in_phase)) 

#define AXIS2_TRANSPORT_IN_DESC_GET_FAULTPHASE(transport_in_desc, env) \
		((transport_in_desc)->ops->get_faultphase (transport_in_desc, env)) 
        
#define AXIS2_TRANSPORT_IN_DESC_SET_FAULTPHASE(transport_in_desc, env, faultphase) \
		((transport_in_desc)->ops->set_faultphase (transport_in_desc, env, faultphase))

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

/** @} */

#ifdef __cplusplus
}
#endif
#endif  /* AXIS2_TRANSPORT_IN_DESC_H */
