/*
 * 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_MODULE_DESC_H
#define AXIS2_MODULE_DESC_H

/**
 * @file axis2_module_desc.h
 * @brief axis2 module_desc interface
 * <p>This holds the information about a Module. </p>
 * <ol>
 * <li>parameters<li>
 * <li>handlers<li>
 * <ol>
 * <p>Handler are registered once they are avlible but they avalibe to all 
 * services if axis2.xml has a module ref="." or avalible to a single service 
 * if services.xml have module ref=".."</p>
 */

#include <axis2_const.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_param_container.h>
#include <axis2_flow_container.h>
#include <axis2_param.h>
#include <axis2_op.h>
#include <axis2_conf.h>
#include <axis2_module.h>


#ifdef __cplusplus
extern "C"
{
#endif

struct axis2_op;
struct axis2_conf;   
typedef struct axis2_module_desc_ops axis2_module_desc_ops_t;
typedef struct axis2_module_desc axis2_module_desc_t;   
   

/** @defgroup axis2_module_desc Module Description
  * @ingroup axis2_module_desc
  * @{
  */

/** 
 * @brief Module Description ops struct
 * Encapsulator struct for ops of axis2_module_desc
 */
struct axis2_module_desc_ops
{
    axis2_status_t (AXIS2_CALL *
    free) (axis2_module_desc_t *module_desc,
                                const axis2_env_t *env);
        
    /**
     * Get fault out flow
     * @return in flow
     */
    axis2_flow_t *(AXIS2_CALL *
    get_inflow) (axis2_module_desc_t *module_desc,
                                        const axis2_env_t *env);
    
    /**
     * Set in flow
     * @param inflow in flow
     */
    axis2_status_t (AXIS2_CALL *
    set_inflow) (axis2_module_desc_t *module_desc,
                                        const axis2_env_t *env,
                                        axis2_flow_t *inflow);
    
    /**
     * Get out flow
     * @return out flow
     */
    axis2_flow_t *(AXIS2_CALL *
    get_outflow) (axis2_module_desc_t *module_desc,
                                        const axis2_env_t *env);
    
    /**
     * Set out flow
     * @param outflow out flow
     */
    axis2_status_t (AXIS2_CALL *
    set_outflow) (axis2_module_desc_t *module_desc,
                                        const 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_module_desc_t *module_desc,
                                            const axis2_env_t *env);
    
    /**
     * set fault in flow
     * @param falut_inflow falut in flow
     */
    axis2_status_t (AXIS2_CALL *
    set_fault_inflow) (axis2_module_desc_t *module_desc,
                                            const 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_module_desc_t *module_desc,
                                                const axis2_env_t *env);
    
    /**
     * Set fault out flow
     * @param fault_outflow fault out flow
     */
    axis2_status_t (AXIS2_CALL *
    set_fault_outflow) (axis2_module_desc_t *module_desc,
                                                const axis2_env_t *env,
                                                axis2_flow_t *fault_outflow);
    
    /**
     * @return
     */
    axis2_qname_t * (AXIS2_CALL *
    get_name ) (axis2_module_desc_t *module_desc,
                                    const axis2_env_t *env);
    
    /**
     * @param name
     */
    axis2_status_t (AXIS2_CALL *
    set_name ) (axis2_module_desc_t *module_desc,
                                    const axis2_env_t *env,
                                    axis2_qname_t *qname);
    
    axis2_status_t (AXIS2_CALL *
    add_op ) (axis2_module_desc_t *module_desc,
                                        const axis2_env_t *env,
                                        struct axis2_op *op);
    
    axis2_hash_t * (AXIS2_CALL *
    get_ops ) (axis2_module_desc_t *module_desc,
                                        const axis2_env_t *env);
    
    struct axis2_conf * (AXIS2_CALL *
    get_parent ) (axis2_module_desc_t *module_desc,
                                    const axis2_env_t *env);
    
    axis2_status_t (AXIS2_CALL *
    set_parent ) (axis2_module_desc_t *module_desc,
                                    const axis2_env_t *env,
                                    struct axis2_conf *parent);
    
    /**
     * Add parameter
     * @param param
     */
    axis2_status_t (AXIS2_CALL *
    add_param) (axis2_module_desc_t *module_desc,
                                        const axis2_env_t *env,
                                        axis2_param_t *param);
    
    /**
     * @param name
     * @return parameter
     */
    axis2_param_t * (AXIS2_CALL *
    get_param) (axis2_module_desc_t *module_desc,
                                        const axis2_env_t *env,
                                        axis2_char_t *name);
    
    axis2_array_list_t * (AXIS2_CALL *
    get_params) (axis2_module_desc_t *module_desc,
                                        const axis2_env_t *env);
    
    /**
     * To check whether a given paramter is locked
     * @param param_name
     * @return whether parameter is locked
     */
    axis2_bool_t (AXIS2_CALL *
    is_param_locked ) (axis2_module_desc_t *module_desc,
                                        const axis2_env_t *env,
                                        axis2_char_t *param_name);
                                        
    /**
     * @return
     */
    struct axis2_module *(AXIS2_CALL *
    get_module) (axis2_module_desc_t *module_desc,
                                        const axis2_env_t *env);
    
    /**
     * @param module
     */
    axis2_status_t (AXIS2_CALL *
    set_module) (axis2_module_desc_t *module_desc,
                                    const axis2_env_t *env,
                                    struct axis2_module *module);                                        

};

/**
 * @brief Module Description struct
 * Axis2 Module Description
 * <p>This holds the information about a Module. </p>
 * <ol>
 * <li>parameters<li>
 * <li>handlers<li>
 * <ol>
 * <p>Handler are registered once they are avlible but they avalibe to all 
 * services if axis2.xml has a module ref="." or avalible to a single service if
 *     services.xml have module ref=".."</p>
 */
struct axis2_module_desc
{
   axis2_module_desc_ops_t *ops;
    
    axis2_flow_container_t *flow_container;
    
    axis2_param_container_t *params;
    
};

/** create Module Description struct
 * @return pointer to newly created module description
 */
AXIS2_EXTERN axis2_module_desc_t * AXIS2_CALL 
axis2_module_desc_create (const axis2_env_t *env);

/** create Module Description struct
 * @return pointer to newly created module description
 */
AXIS2_EXTERN axis2_module_desc_t * AXIS2_CALL 
axis2_module_desc_create_with_qname (const axis2_env_t *env, 
                                        axis2_qname_t *qname);

/**
 * Free module_desc passed as void pointer. This will be
 * cast into appropriate type and then pass the cast object
 * into the module_desc structure's free method
 */
AXIS2_EXTERN axis2_status_t AXIS2_CALL 
axis2_module_desc_free_void_arg (void *module_desc,
                                        const axis2_env_t *env);

                                
/************************* Start of function macros   ***************************/
   
#define AXIS2_MODULE_DESC_FREE(module_desc, env) \
      ((module_desc)->ops->free(module_desc, env))
   
#define AXIS2_MODULE_DESC_GET_INFLOW(module_desc, env) \
        ((module_desc)->ops->get_inflow (module_desc, env))

#define AXIS2_MODULE_DESC_SET_INFLOW(module_desc, env, inflow) \
        ((module_desc)->ops->set_inflow (module_desc, env, inflow))

#define AXIS2_MODULE_DESC_GET_OUTFLOW(module_desc, env) \
      ((module_desc)->ops->get_outflow (module_desc, env))
      
#define AXIS2_MODULE_DESC_SET_OUTFLOW(module_desc, env, outflow) \
      ((module_desc)->ops->set_outflow (module_desc, env, outflow))

#define AXIS2_MODULE_DESC_GET_FAULT_INFLOW(module_desc, env) \
      ((module_desc)->ops->get_fault_inflow (module_desc, env))
        
#define AXIS2_MODULE_DESC_SET_FAULT_INFLOW(module_desc, env, falut_inflow) \
        ((module_desc)->ops->set_fault_inflow(module_desc , env, falut_inflow))
      
#define AXIS2_MODULE_DESC_GET_FAULT_OUTFLOW(module_desc, env) \
        ((module_desc)->ops->get_fault_outflow(module_desc , env))
      
#define AXIS2_MODULE_DESC_SET_FAULT_OUTFLOW(module_desc, env, falut_outflow) \
        ((module_desc)->ops->set_fault_outflow(module_desc , env, falut_outflow))
      
#define AXIS2_MODULE_DESC_GET_NAME(module_desc, env) \
        ((module_desc)->ops->get_name(module_desc, env))

#define AXIS2_MODULE_DESC_SET_NAME(module_desc, env, qname) \
        ((module_desc)->ops->set_name(module_desc, env, qname))

#define AXIS2_MODULE_DESC_ADD_OP(module_desc, env, op) \
        ((module_desc)->ops->add_op(module_desc, env, op))
        
#define AXIS2_MODULE_DESC_GET_OPS(module_desc, env) \
        ((module_desc)->ops->get_ops(module_desc, env))

#define AXIS2_MODULE_DESC_GET_PARENT(module_desc, env) \
        ((module_desc)->ops->get_parent(module_desc, env))
        
#define AXIS2_MODULE_DESC_SET_PARENT(module_desc, env, parent) \
        ((module_desc)->ops->set_parent(module_desc, env, parent))

#define AXIS2_MODULE_DESC_ADD_PARAM(module_desc, env, param) \
        ((module_desc)->ops->add_param(module_desc, env, param))
        
#define AXIS2_MODULE_DESC_GET_PARAM(module_desc, env, name) \
        ((module_desc)->ops->get_param(module_desc, env, name))

#define AXIS2_MODULE_DESC_GET_PARAMS(module_desc, env) \
        ((module_desc)->ops->get_params(module_desc, env))
        
#define AXIS2_MODULE_DESC_IS_PARAM_LOCKED(module_desc, env, param_name) \
        ((module_desc)->ops->is_param_locked(module_desc, env, param_name))

#define AXIS2_MODULE_DESC_GET_MODULE(module_desc, env) \
        ((module_desc)->ops->get_module(module_desc, env))
        
#define AXIS2_MODULE_DESC_SET_MODULE(module_desc, env, module) \
        ((module_desc)->ops->set_module(module_desc, env, module))        
        
/************************* End of function macros *****************************/
/** @} */

#ifdef __cplusplus
}
#endif
#endif /* AXIS2_MODULE_DESC_H */
