/*
 * 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_const.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,
                 const axis2_env_t *env);
    
    /**
     * @return
     */
    axis2_qname_t *(AXIS2_CALL *
    get_qname) (struct axis2_transport_in_desc *transport_in,
                                            const axis2_env_t *env);
    
    /**
     * @param name
     */
    axis2_status_t (AXIS2_CALL *
    set_qname) (struct axis2_transport_in_desc *transport_in,
                                            const axis2_env_t *env,
                                            axis2_qname_t *qname);
    
    struct axis2_flow *(AXIS2_CALL *
    get_inflow) (struct axis2_transport_in_desc *transport_in,
                                            const axis2_env_t *env);
    
    axis2_status_t (AXIS2_CALL *
    set_inflow) (struct axis2_transport_in_desc *transport_in,
                                            const axis2_env_t *env,
                                            struct axis2_flow *inflow);
    
    struct axis2_flow *(AXIS2_CALL *
    get_faultflow) (struct axis2_transport_in_desc *transport_in,
                                            const axis2_env_t *env);
    
    axis2_status_t (AXIS2_CALL *
    set_faultflow) (struct axis2_transport_in_desc *transport_in,
                                            const axis2_env_t *env,
                                            struct axis2_flow *faultflow);
    
    /**
     * @return
     */
    struct axis2_transport_receiver * (AXIS2_CALL *
    get_recv) (struct axis2_transport_in_desc *transport_in,
                                            const axis2_env_t *env);
    
    /**
     * @param receiver
     */
    axis2_status_t (AXIS2_CALL *
    set_recv) (struct axis2_transport_in_desc *transport_in,
                                            const axis2_env_t *env,
                                            struct axis2_transport_receiver *recv);
    
    struct axis2_phase * (AXIS2_CALL *
    get_in_phase) (struct axis2_transport_in_desc *transport_in,
                                            const axis2_env_t *env);
    
    axis2_status_t (AXIS2_CALL *
    set_in_phase) (struct axis2_transport_in_desc *transport_in,
                                            const axis2_env_t *env,
                                            struct axis2_phase *in_phase);
    
    struct axis2_phase *(AXIS2_CALL *
    get_faultphase) (struct axis2_transport_in_desc *transport_in,
                                            const axis2_env_t *env);
    
    axis2_status_t (AXIS2_CALL *
    set_faultphase) (struct axis2_transport_in_desc *transport_in,
                                            const axis2_env_t *env,
                                            struct axis2_phase *faultphase);
    axis2_status_t (AXIS2_CALL *
    add_param) (axis2_transport_in_desc_t *transport_in_desc,
                const axis2_env_t *env,
                axis2_param_t *param);

    axis2_param_t *(AXIS2_CALL *
    get_param) (axis2_transport_in_desc_t *transport_in_desc,
                const axis2_env_t *env,
                axis2_char_t *param_name);

    axis2_bool_t (AXIS2_CALL *
    is_param_locked) (axis2_transport_in_desc_t *transport_in_desc,
                      const axis2_env_t *env,
                      axis2_char_t *param_name);
        

};

/** 
 * @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_EXTERN axis2_transport_in_desc_t * AXIS2_CALL 
axis2_transport_in_desc_create_with_qname (const 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))

#define AXIS2_TRANSPORT_IN_DESC_ADD_PARAM(transport_in_desc, env, param) \
      ((transport_in_desc)->ops->add_param (transport_in_desc, env, param)) 

#define AXIS2_TRANSPORT_IN_DESC_GET_PARAM(transport_in_desc, env, param_name) \
      ((transport_in_desc)->ops->get_param (transport_in_desc, env, param_name)) 

#define AXIS2_TRANSPORT_IN_DESC_IS_PARAM_LOCKED(transport_in_desc, env, param_name) \
      ((transport_in_desc)->ops->is_param_locked (transport_in_desc, env, param_name)) 

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

/** @} */

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