/*
 * 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_FLOW_CONTAINER_H
#define AXIS2_FLOW_CONTAINER_H

/**
 * @file axis2_flow_container.h
 * @brief axis2 flow container interface
 */

#include <axis2.h>
#include <axis2_error.h>
#include <axis2_defines.h>
#include <axis2_env.h>
#include <axis2_allocator.h>
#include <axis2_string.h>
#include <axis2_array_list.h>
#include <axis2_flow.h>


#ifdef __cplusplus
extern "C"
{
#endif
	
typedef struct axis2_flow_container_ops axis2_flow_container_ops_t;
typedef struct axis2_flow_container axis2_flow_container_t;	
	

/** @defgroup axis2_flow_container Flow Container
  * @ingroup axis2_flow_container
  * @{
  */

/** 
 * @brief Flow Container operations struct
 * Encapsulator struct for operations of axis2_flow_container
 */
struct axis2_flow_container_ops
{
	/** Deallocate memory
     * @return status code
     */
    axis2_status_t (AXIS2_CALL *free) (axis2_flow_container_t *flow_container,
                                        axis2_env_t **env);

    /**
     * Get fault out flow
     * @return in flow
     */
    axis2_flow_t *(AXIS2_CALL *get_inflow)(axis2_flow_container_t *flow_container,
                                                axis2_env_t **env);
    
    /**
     * Set in flow
     * @param inflow in flow
     */
    axis2_status_t (AXIS2_CALL *set_inflow)(
                                        axis2_flow_container_t *flow_container,
                                        axis2_env_t **env,
                                        axis2_flow_t *inflow);
    
    /**
     * Get out flow
     * @return out flow
     */
    axis2_flow_t *(AXIS2_CALL *get_outflow)(
                                        axis2_flow_container_t *flow_container,
                                        axis2_env_t **env);
    
    /**
     * Set out flow
     * @param outflow out flow
     */
    axis2_status_t (AXIS2_CALL *set_outflow)(
                                        axis2_flow_container_t *flow_container,
                                        axis2_env_t **env,
                                        axis2_flow_t *outflow);
    
    /**
     * Get fault in flow
     * @return fault in flow
     */
    axis2_flow_t * (AXIS2_CALL *get_fault_inflow)(
                                        axis2_flow_container_t *flow_container,
                                        axis2_env_t **env);
    
    /**
     * set fault in flow
     * @param falut_inflow falut in flow
     */
    axis2_status_t (AXIS2_CALL *set_fault_inflow)(
                                        axis2_flow_container_t *flow_container,
                                        axis2_env_t **env,
                                        axis2_flow_t *falut_inflow);
    /**
     * Get fault out flow
     * @return fault out flow
     */
    axis2_flow_t *(AXIS2_CALL *get_fault_outflow)(
                                        axis2_flow_container_t *flow_container,
                                        axis2_env_t **env);
    
    /**
     * Set fault out flow
     * @param fault_outflow fault out flow
     */
    axis2_status_t (AXIS2_CALL *set_fault_outflow)(
                                        axis2_flow_container_t *flow_container,
                                        axis2_env_t **env,
                                        axis2_flow_t *fault_outflow);  
};

/** 
 * @brief Flow container struct
 *	Container for flows  
 */ 
struct axis2_flow_container
{
	axis2_flow_container_ops_t *ops;
};

/**
 * Creates flow container struct
 * @return pointer to newly created flow container
 */
AXIS2_DECLARE(axis2_flow_container_t *) 
axis2_flow_container_create (axis2_env_t **env);

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

#define AXIS2_FLOW_CONTAINER_FREE(flow_container, env) \
        ((flow_container->ops)->free (flow_container, env))

#define AXIS2_FLOW_CONTAINER_GET_INFLOW(flow_container, env) \
        ((flow_container->ops)->get_inflow (flow_container, env))

#define AXIS2_FLOW_CONTAINER_SET_INFLOW(flow_container, env, inflow) \
        ((flow_container->ops)->set_inflow (flow_container, env, inflow))

#define AXIS2_FLOW_CONTAINER_GET_OUTFLOW(flow_container, env) \
        ((flow_container->ops)->get_outflow (flow_container, env))
        
#define AXIS2_FLOW_CONTAINER_SET_OUTFLOW(flow_container, env, outflow) \
        ((flow_container->ops)->set_outflow (flow_container, env, outflow))

#define AXIS2_FLOW_CONTAINER_GET_FAULT_INFLOW(flow_container, env) \
        ((flow_container->ops)->get_fault_inflow (flow_container, env))
        
#define AXIS2_FLOW_CONTAINER_SET_FAULT_INFLOW(flow_container, env, fault_inflow) \
        ((flow_container->ops)->set_fault_inflow (flow_container, env, fault_inflow))

#define AXIS2_FLOW_CONTAINER_GET_FAULT_OUTFLOW(flow_container, env) \
        ((flow_container->ops)->get_fault_outflow (flow_container, env))
        
#define AXIS2_FLOW_CONTAINER_SET_FAULT_OUTFLOW(flow_container, env, fault_outflow) \
        ((flow_container->ops)->set_fault_outflow (flow_container, env, fault_outflow))        

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

/** @} */

#ifdef __cplusplus
}
#endif
#endif  /* AXIS2_FLOW_CONTAINER_H */
