/*
* 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_CONFIG_H
#define AXIS2_CONFIG_H

/**
 * @defgroup axis2_engine engine
 * @ingroup axis2
 * @{
 * @}
 */

/** 
 * @defgroup axis2_config configuration
 * @ingroup axis2_engine
 * Axis2 configuration captures all configuration information. Configuration
 * information includes user preferences along with module and 
 * service information that is either statically configured using axis2.xml
 * file, service.xml files and module.xml files or dynamically using the 
 * functions defined in the ops struct related to this conf struct.
 * @{
 */

/**
 * @file axis2_config.h
 */

#include <axis2_param_container.h>
#include <axis2_svc_grp.h>
#include <axis2_transport_in_desc.h>
#include <axis2_transport_out_desc.h>
#include <axis2_qname.h>
#include <axis2_hash.h>
#include <axis2_phases_info.h>
#include <axis2_msg_recv.h>
#include <axis2_disp_checker.h>

#ifdef __cplusplus
extern "C"
{
#endif

    /** Type name for struct axis2_conf_ops */
    typedef struct axis2_conf_ops axis2_conf_ops_t;
    /** Type name for struct axis2_conf */
    typedef struct axis2_conf axis2_conf_t;

    struct axis2_msg_recv;
    struct axis2_phases_info;
    struct axis2_svc_grp;
    struct axis2_svc;
    struct axis2_op;
    struct axis2_dep_engine;
    struct axis2_desp;

    /**
     * configuration ops struct.
     * Encapsulator struct for ops of axis2_conf.
     */
    struct axis2_conf_ops
    {
        /**
         * Frees conf struct.
         * @param conf pointer to conf struct
         * @param env pointer to environment struct
         * @return AXIS2_SUCCESS on success, else AXIS2_FAILURE
         */
        axis2_status_t (AXIS2_CALL *
                free)(
                    axis2_conf_t *conf,
                    const axis2_env_t *env);

        /**
         * Adds a service group to the configuration.
         * @param conf pointer to conf struct
         * @param env pointer to environment struct
         * @param svc_grp pointer to service group, conf takes over the 
         * ownership of the service group
         * @return AXIS2_SUCCESS on success, else AXIS2_FAILURE
         */
        axis2_status_t (AXIS2_CALL *
                add_svc_grp)(
                    axis2_conf_t *conf,
                    const axis2_env_t *env,
                    struct axis2_svc_grp *svc_grp);

        /** 
         * Gets a named service group.
         * @param conf pointer to conf struct
         * @param env pointer to environment struct
         * @param svc_grp_name name of the service group to be accessed
         * @return pointer to service group with the given name if exists, 
         * else NULL. Returns a reference, not a cloned copy
         */
        struct axis2_svc_grp *(AXIS2_CALL *
                get_svc_grp)(
                    const axis2_conf_t *conf,
                    const axis2_env_t *env,
                    const axis2_char_t *svc_grp_name);

        /** 
         * Gets all service group added to conf.
         * @param conf pointer to conf struct
         * @param env pointer to environment struct
         * @return pointer to hash table containing the service groups, returns 
         * a reference, not a cloned copy
         */
        axis2_hash_t *(AXIS2_CALL *
                get_all_svc_grps)(
                    const axis2_conf_t *conf,
                    const axis2_env_t *env);

        /**
         * Adds a service to configuration.
         * @param conf pointer to conf struct
         * @param env pointer to environment struct
         * @param svc pointer to service, conf takes over the ownership of the 
         * service
         * @return AXIS2_SUCCESS on success, else AXIS2_FAILURE
         */
        axis2_status_t (AXIS2_CALL *
                add_svc)(
                    axis2_conf_t *conf,
                    const axis2_env_t *env,
                    struct axis2_svc* svc);

        /**
         * Gets a service with given name.
         * @param conf pointer to conf struct
         * @param env pointer to environment struct
         * @param svc_name service name string
         * @return pointer to service with the given name if exists, else NULL.
         * Returns a reference, not a cloned copy
         */
        struct axis2_svc *(AXIS2_CALL *
                get_svc)(
                    const axis2_conf_t *conf,
                    const axis2_env_t *env,
                    const axis2_char_t* svc_name);

        /**
         * Removes the named service from configuration.
         * @param conf pointer to conf struct
         * @param env pointer to environment struct
         * @param name name of service to be removed
         * @return AXIS2_SUCCESS on success, else AXIS2_FAILURE
         */
        axis2_status_t (AXIS2_CALL *
                remove_svc)(
                    axis2_conf_t *conf,
                    const axis2_env_t *env,
                    const axis2_char_t *name);

        /**
         * Adds a parameter to configuration.
         * @param conf pointer to conf struct
         * @param env pointer to environment struct
         * @param param pointer to parameter struct to be added
         * @return AXIS2_SUCCESS on success, else AXIS2_FAILURE
         */
        axis2_status_t (AXIS2_CALL *
                add_param)(
                    axis2_conf_t *conf,
                    const axis2_env_t *env,
                    axis2_param_t *param);

        /**
         * Gets a parameter with the given name.
         * @param conf pointer to conf struct
         * @param env pointer to environment struct
         * @param name name of the parameter to be accessed
         * @return pointer to parameter with the given name if exists, else NULL.
         * Returns a reference, not a cloned copy
         */
        axis2_param_t *(AXIS2_CALL *
                get_param)(
                    const axis2_conf_t *conf,
                    const axis2_env_t *env,
                    const axis2_char_t *name);

        /**
         * Gets all the parameters added to the configuration.
         * @param conf pointer to conf struct
         * @param env pointer to environment
         * @return pointer to array list containing parameters if exists, 
         * else NULL. Returns a reference, not a cloned copy
         */
        axis2_array_list_t *(AXIS2_CALL *
                get_all_params)(
                    const axis2_conf_t *conf,
                    const axis2_env_t *env);

        /**
         * Checks if the named parameter is locked.
         * @param conf pointer to conf struct
         * @param env pointer to environment struct
         * @param param_name name of the parameter
         * @return AXIS2_TRUE if parameter is locked, else AXIS2_FALSE
         */
        axis2_bool_t (AXIS2_CALL *
                is_param_locked)(
                    const axis2_conf_t *conf,
                    const axis2_env_t *env,
                    const axis2_char_t *param_name);

        /**
         * Gets in transport corresponding to the given transport QName.
         * @param conf pointer to conf struct
         * @param env pointer to environment struct
         * @param qname QName of transport 
         * @return pointer to transport in description if exists, 
         * else NULL. Returns a reference, not a cloned copy
         */
        axis2_transport_in_desc_t *(AXIS2_CALL *
                get_transport_in)(
                    const axis2_conf_t *conf,
                    const axis2_env_t *env,
                    const axis2_qname_t *qname);

        /**
         * Adds a transport in description.
         * @param conf pointer to conf struct
         * @param env pointer to environment struct
         * @param transport  pointer to transport in description. conf assumes
         * ownership of the struct
         * @return AXIS2_SUCCESS on success, else AXIS2_FAILURE
         */
        axis2_status_t (AXIS2_CALL *
                add_transport_in)(
                    axis2_conf_t *conf,
                    const axis2_env_t *env,
                    axis2_transport_in_desc_t *transport);

        /**
         * Gets out transport corresponding to the given transport QName.
         * @param conf pointer to conf struct
         * @param env pointer to environment strcut
         * @param qname pointer to transport qname
         * @return pointer to transport out description if exists, 
         * else NULL. Returns a reference, not a cloned copy
         */
        axis2_transport_out_desc_t *(AXIS2_CALL *
                get_transport_out)(
                    const axis2_conf_t *conf,
                    const axis2_env_t *env,
                    const axis2_qname_t *qname);

       /**
        * Adds a transport out description.
        * @param conf pointer to conf struct
        * @param env pointer to environment struct
        * @param transport pointer to transport out description. conf assumes
        * ownership of the struct
        * @return AXIS2_SUCCESS on success, else AXIS2_FAILURE
        */
        axis2_status_t (AXIS2_CALL *
                add_transport_out)(
                    axis2_conf_t *conf,
                    const axis2_env_t *env,
                    axis2_transport_out_desc_t *transport);

        /**
         * Gets all in transports.
         * @param conf pointer to conf struct
         * @param env pointer to environment struct
         * @return hash table containing all transport in descriptions. 
         * Returns a reference, not a cloned copy
         */
        axis2_hash_t *(AXIS2_CALL *
                get_all_in_transports)(
                    const axis2_conf_t *conf,
                    const axis2_env_t *env);

        /**
         * Gets all out transports.
         * @param conf pointer to conf struct
         * @param env pointer to environment struct
         * @return hash table containing all transport out descriptions. 
         * Returns a reference, not a cloned copy
         */
        axis2_hash_t *(AXIS2_CALL *
                get_all_out_transports)(
                    const axis2_conf_t *conf,
                    const axis2_env_t *env);

       /**
        * Gets a module with given QName.
        * @param conf pointer to conf struct
        * @param env pointer to environment struct
        * @param qname pointer to qname
        * @return module description corresponding to the given qname
        */
        struct axis2_module_desc *(AXIS2_CALL *
                get_module)(
                    const axis2_conf_t *conf,
                    const axis2_env_t *env,
                    const axis2_qname_t *qname);

       /**
        * Gets the list of engaged modules.
        * @param conf pointer to conf struct
        * @param env pointer to environment struct
        * @return a pointer to the array list of engaged modules. Returns a 
        * reference, not a cloned copy
        */
        axis2_array_list_t *(AXIS2_CALL *
                get_all_engaged_modules)( 
                    const axis2_conf_t *conf,
                    const axis2_env_t *env);

        /**
         * Gets the in phases up to and including port dispatch phase.
         * @param conf pointer to conf struct
         * @param env pointer to environment struct
         * @return a pointer to the array list of in phases up to post dispatch
         * inclusive. Returns a reference, not a cloned copy
         */
        axis2_array_list_t *(AXIS2_CALL *
                get_in_phases_upto_and_including_post_dispatch)(
                    const axis2_conf_t *conf,
                    const axis2_env_t *env);

        /**
         * Gets the out flow. Out flow is a list of phases invoked in the out 
         * path of execution of the engine.
         * @param conf pointer to conf struct
         * @param env pointer to environment struct
         * @return a pointer to the array list of out flow phases. Returns a 
         * reference, not a cloned copy
         */
        axis2_array_list_t *(AXIS2_CALL *
                get_out_flow)(
                    const axis2_conf_t *conf,
                    const axis2_env_t *env);


       /**
        * Gets the in fault flow. In fault flow is a list of phases invoked in 
        * the in path of execution, if some fault happens.
        * @param conf pointer to conf struct
        * @param env pointer to environment struct
        * @return a pointer to the array list of in fault flow phases. Returns a 
        * reference, not a cloned copy
        */
        axis2_array_list_t *(AXIS2_CALL *
                get_in_fault_flow)(
                    const axis2_conf_t *conf,
                    const axis2_env_t *env);

       /**
        * Gets the out fault flow. Out fault flow is a list of phases invoked in 
        * the out path of execution, if some fault happens.
        * @param conf pointer to conf struct
        * @param env pointer to environment struct
        * @return a pointer to the array list of out fault flow phases. Returns a 
        * reference, not a cloned copy
        */
        axis2_array_list_t *(AXIS2_CALL *
                get_out_fault_flow)(
                    const axis2_conf_t *conf,
                    const axis2_env_t *env);

        /**
         * Gets faulty services. A faulty service is a service that does not 
         * meet the service configuration criteria or a service with errors in 
         * the service dynamic link library.
         * @param conf pointer to conf struct
         * @param env pointer to environment struct
         * @return a pointer to the hash table of faulty services. Returns a 
         * reference, not a cloned copy
         */
        axis2_hash_t *(AXIS2_CALL *
                get_all_faulty_svcs)(
                    const axis2_conf_t *conf,
                    const axis2_env_t *env);

        /**
         * Gets faulty modules. A faulty module is a module that does not 
         * meet the module configuration criteria or a module with errors in 
         * the service dynamic link library.
         * @param conf pointer to conf struct
         * @param env pointer to environment struct
         * @return a pointer to the hash table of faulty modules. Returns a 
         * reference, not a cloned copy
         */
        axis2_hash_t *(AXIS2_CALL *
                get_all_faulty_modules)(
                    const axis2_conf_t *conf,
                    const axis2_env_t *env);

        /**        
         * Gets all the list of services loaded into configuration.
         * @param conf pointer to conf struct
         * @param env pointer to environment struct
         * @return a pointer to the hash table of services. Returns a 
         * reference, not a cloned copy
         */
        axis2_hash_t *(AXIS2_CALL *
                get_all_svcs)(
                    const axis2_conf_t *conf,
                    const axis2_env_t *env);

        /**
         * Checks is the named module is engaged.
         * @param conf pointer to conf struct
         * @param env pointer to environment struct
         * @param module_name pointer to QName representing the module name
         * @return AXIS2_TRUE if named module is engaged, else AXIS2_FALSE
         */
        axis2_bool_t (AXIS2_CALL *
                is_engaged)(
                    axis2_conf_t *conf,
                    const axis2_env_t *env,
                    const axis2_qname_t *module_name);

        /**
         * Gets phases information struct.
         * @param conf pointer to conf struct
         * @param env pointer to environment struct
         * @return a pointer to the struct containing phases information. 
         * Returns a reference, not a cloned copy
         */
        struct axis2_phases_info *(AXIS2_CALL *
                get_phases_info)(
                    const axis2_conf_t *conf,
                    const axis2_env_t *env);

        /**
         * Sets phases information struct.
         * @param conf pointer to conf struct
         * @param env pointer to environment struct
         * @param phases_info pointer to phases_info struct. conf assumes 
         * ownership of the struct
         * @return AXIS2_SUCCESS on success, else AXIS2_FAILURE
         */
        axis2_status_t (AXIS2_CALL *
                set_phases_info)(
                    axis2_conf_t *conf,
                    const axis2_env_t *env,
                    struct axis2_phases_info *phases_info);

        /**
         * Adds message receiver with the given key.
         * @param conf pointer to conf struct
         * @param env pointer to environment struct
         * @param key key string with which the message receive is to be added
         * @param msg_recv pointer to message receiver 
         * @return AXIS2_SUCCESS on success, else AXIS2_FAILURE
         */
        axis2_status_t (AXIS2_CALL *
                add_msg_recv)(
                    axis2_conf_t *conf,
                    const axis2_env_t *env,
                    const axis2_char_t *key,
                    struct axis2_msg_recv *msg_recv);

        /**
         * Gets message receiver with the given key.
         * @param conf pointer to conf struct
         * @param env pointer to environment struct
         * @param key key string corresponding to the message receiver to 
         * be retrieved
         * @return pointer to the message receiver with the given key if it 
         * exists, else null. Returns a reference, not a cloned copy
         */
        struct axis2_msg_recv *(AXIS2_CALL *
                get_msg_recv)(
                    const axis2_conf_t *conf,
                    const axis2_env_t *env,
                    axis2_char_t *key);

        /**
         * Sets the list of out phases.
         * @param conf pointer to conf struct
         * @param env pointer to environment struct
         * @param out_phases pointer to array list of the phases. conf assumes 
         * ownership of the struct
         * @return AXIS2_SUCCESS on success, else AXIS2_FAILURE
         */
        axis2_status_t (AXIS2_CALL *
                set_out_phases)(
                    axis2_conf_t *conf,
                    const axis2_env_t *env,
                    axis2_array_list_t *out_phases);

        /**
         * Gets the list of out phases.
         * @param conf pointer to conf struct
         * @param env pointer to environment struct
         * @return pointer to array list of out phases. Returns a reference, 
         * not a cloned copy
         */
        axis2_array_list_t *(AXIS2_CALL *
                get_out_phases)(
                    const axis2_conf_t *conf,
                    const axis2_env_t *env);

        /**
         * Sets fault phases for in path.
         * @param conf pointer to conf struct
         * @param env pointer to environment struct
         * @param list pointer to array list of phases
         * @return AXIS2_SUCCESS on success, else AXIS2_FAILURE
         */
        axis2_status_t (AXIS2_CALL *
                set_in_fault_phases)(
                    axis2_conf_t *conf,
                    const axis2_env_t *env,
                    axis2_array_list_t *list);

        /**
         * Sets fault phases for out path.
         * @param conf pointer to conf struct
         * @param env pointer to environment struct
         * @param list pointer to array list of phases
         * @return AXIS2_SUCCESS on success, else AXIS2_FAILURE
         */
        axis2_status_t (AXIS2_CALL *
                set_out_fault_phases)(
                    axis2_conf_t *conf,
                    const axis2_env_t *env,
                    axis2_array_list_t *list);

        /**
         * Gets all modules configured,
         * @param conf pointer to conf struct
         * @param env pointer to environment struct
         * @return a pointer to hash table containing the list of modules. 
         * Returns a reference, not a cloned copy
         */
        axis2_hash_t *(AXIS2_CALL *
                get_all_modules)(
                    const axis2_conf_t *conf,
                    const axis2_env_t *env);

        /**
         * Adds a module.
         * @param conf pointer to conf struct
         * @param env pointer to environment struct
         * @param module pointer to module struct to be added
         * @return AXIS2_SUCCESS on success, else AXIS2_FAILURE
         */
        axis2_status_t (AXIS2_CALL *
                add_module)(
                    axis2_conf_t *conf,
                    const axis2_env_t *env,
                    struct axis2_module_desc *module);

        /**
         * Sets the default dispatchers.
         * @param conf pointer to conf struct
         * @param env pointer to environment struct
         * @return AXIS2_SUCCESS on success, else AXIS2_FAILURE
         */
        axis2_status_t (AXIS2_CALL *
                set_default_dispatchers)(
                    axis2_conf_t *conf,
                    const axis2_env_t *env);

        /**
         * Sets a custom dispatching phase.
         * @param conf pointer to conf struct
         * @param env pointer to environment struct
         * @param dispatch pointer to phase to be dispatched
         * @return AXIS2_SUCCESS on success, else AXIS2_FAILURE
         */
        axis2_status_t (AXIS2_CALL *
                set_dispatch_phase)(
                    axis2_conf_t *conf,
                    const axis2_env_t *env,
                    axis2_phase_t *dispatch);

        /**
         * Gets the repository location.
         * @param conf pointer to conf struct
         * @param env pointer to environment struct
         * @return returns repository location as a string
         */
        const axis2_char_t *(AXIS2_CALL *
                get_repo)(
                    const axis2_conf_t *conf,
                    const axis2_env_t *env);

        /**
         * Sets the repository location.
         * @param conf pointer to conf struct
         * @param env pointer to environment struct
         * @param axis2_repo repository location as a string
         * @return AXIS2_SUCCESS on success, else AXIS2_FAILURE
         */
        axis2_status_t (AXIS2_CALL *
                set_repo)(
                    axis2_conf_t *conf,
                    const axis2_env_t *env,
                    axis2_char_t *axis2_repo);

        /**
         * Engages the named module.
         * @param conf pointer to conf struct
         * @param env pointer to environment struct
         * @param module_ref pointer to the QName of the module to be engaged
         * @return AXIS2_SUCCESS on success, else AXIS2_FAILURE
         */
        axis2_status_t (AXIS2_CALL *
                engage_module)(
                    axis2_conf_t *conf,
                    const axis2_env_t *env,
                    const axis2_qname_t *module_ref);

        /**
         * Sets the deployment engine.
         * @param conf pointer to conf struct
         * @param env pointer to environment struct
         * @param dep_engine pointer to dep_engine struct
         * @return AXIS2_SUCCESS on success, else AXIS2_FAILURE
         */
        axis2_status_t (AXIS2_CALL *
                set_dep_engine)(
                    axis2_conf_t *conf,
                    const axis2_env_t *env,
                    struct axis2_dep_engine *dep_engine);

        /**
         * Gets the default module version for the named module.
         * @param conf pointer to conf struct
         * @param env pointer to environment struct
         * @param module_name module name string
         * @return default module version as a string
         */
        const axis2_char_t *(AXIS2_CALL *
                get_default_module_version)(
                    const axis2_conf_t *conf,
                    const axis2_env_t *env,
                    const axis2_char_t *module_name);

        /**
         * Gets the default module reference for the named module.
         * @param conf pointer to conf struct
         * @param env pointer to environment struct
         * @param module_name module name string
         * @return pointer to the module description struct corresponding to
         * the given name
         */
        struct axis2_module_desc *(AXIS2_CALL *
                get_default_module)(
                    const axis2_conf_t *conf, 
                    const axis2_env_t *env,
                    const axis2_char_t *module_name);

        /**
         * Adds a default module version for the named module.
         * @param conf pointer to conf struct
         * @param env pointer to environment struct
         * @param module_name name of the module
         * @param module_version default version for the module
         * @return AXIS2_SUCCESS on success, else AXIS2_FAILURE
         */
        axis2_status_t (AXIS2_CALL *
                add_default_module_version)(
                    axis2_conf_t *conf, 
                    const axis2_env_t *env,
                    const axis2_char_t *module_name,
                    const axis2_char_t *module_version);

        /**
         * Engages the module with the given version.
         * @param conf pointer to conf struct
         * @param env pointer to environment struct
         * @param module_name name of the module to be engaged
         * @param version_id version of the module to be engaged
         * @return AXIS2_SUCCESS on success, else AXIS2_FAILURE
         */
        axis2_status_t (AXIS2_CALL *
                engage_module_with_version)(
                    axis2_conf_t *conf, 
                    const axis2_env_t *env,
                    const axis2_char_t *module_name,
                    const axis2_char_t *version_id);

    };

    /**
     * configuration struct.
     */
    struct axis2_conf
    {
        /** operations of configuration struct */
        axis2_conf_ops_t *ops;
        /** configuration parameter container */
        axis2_param_container_t *param_container;
    };

    /** 
     * Creates configuration struct.
     * @param env pointer to environment struct
     * @return pointer to newly created configuration
     */
    AXIS2_EXTERN axis2_conf_t *AXIS2_CALL
    axis2_conf_create(
        const axis2_env_t *env);


/** Frees the conf.
    @sa axis2_conf_ops#free */
#define AXIS2_CONF_FREE(conf, env) \
      ((conf)->ops->free(conf, env))

/** Adds a service group.
    @sa axis2_conf_ops#add_svc_grp */
#define AXIS2_CONF_ADD_SVC_GRP(conf, env, svc_grp) \
        ((conf)->ops->add_svc_grp (conf, env, svc_grp))

/** Gets the named service group.
    @sa axis2_conf_ops#get_svc_grp */
#define AXIS2_CONF_GET_SVC_GRP(conf, env, svc_grp_name) \
        ((conf)->ops->get_svc_grp (conf, env, svc_grp_name))

/** Gets all the service groups.
    @sa axis2_conf_ops#get_all_svc_grps */
#define AXIS2_CONF_GET_ALL_SVC_GRPS(conf, env) \
        ((conf)->ops->get_all_svc_grps (conf, env))

/** Adds a service.
    @sa axis2_conf_ops#add_svc */
#define AXIS2_CONF_ADD_SVC(conf, env, svc) \
      ((conf)->ops->add_svc (conf, env, svc))

/** Gets the named service.
    @sa axis2_conf_ops#get_svc */
#define AXIS2_CONF_GET_SVC(conf, env, svc_name) \
      ((conf)->ops->get_svc (conf, env, svc_name))

/** Removes the named service.
    @sa axis2_conf_ops#remove_svc */
#define AXIS2_CONF_REMOVE_SVC(conf, env, svc_name) \
      ((conf)->ops->remove_svc (conf, env, svc_name))

/** Adds a parameter.
    @sa axis2_conf_ops#add_param */
#define AXIS2_CONF_ADD_PARAM(conf, env, param) \
        ((conf)->ops->add_param(conf , env, param))

/** Gets the named parameter.
    @sa axis2_conf_ops#get_param */
#define AXIS2_CONF_GET_PARAM(conf, env, name) \
        ((conf)->ops->get_param(conf , env, name))

/** Gets all the parameters.
    @sa axis2_conf_ops#get_all_params */
#define AXIS2_CONF_GET_ALL_PARAMS(conf, env) \
        ((conf)->ops->get_all_params(conf , env))

/** Checks is the named parameter is locked.
    @sa axis2_conf_ops#is_param_locked */
#define AXIS2_CONF_IS_PARAM_LOCKED(conf, env, param_name) \
        ((conf)->ops->is_param_locked(conf, env, param_name))

/** Gets transport in description with given QName.
    @sa axis2_conf_ops#get_transport_in */
#define AXIS2_CONF_GET_TRANSPORT_IN(conf, env, qname) \
        ((conf)->ops->get_transport_in(conf , env, qname))

/** Adds a transport in.
    @sa axis2_conf_ops#add_transport_in */
#define AXIS2_CONF_ADD_TRANSPORT_IN(conf, env, transport) \
        ((conf)->ops->add_transport_in(conf , env, transport))

/** Gets transport out description with given QName.
    @sa axis2_conf_ops#get_transport_out */
#define AXIS2_CONF_GET_TRANSPORT_OUT(conf, env, qname) \
        ((conf)->ops->get_transport_out(conf , env, qname))

/** Adds a transport out.
    @sa axis2_conf_ops#add_transport_out */
#define AXIS2_CONF_ADD_TRANSPORT_OUT(conf, env, transport) \
        ((conf)->ops->add_transport_out(conf , env, transport))

/** Gets all the in transports.
    @sa axis2_conf_ops#get_all_in_transports */
#define AXIS2_CONF_GET_ALL_IN_TRANSPORTS(conf, env) \
        ((conf)->ops->get_all_in_transports(conf , env))

/** Gets all the out transport.
    @sa axis2_conf_ops#get_all_out_transports */
#define AXIS2_CONF_GET_ALL_OUT_TRANSPORTS(conf, env) \
        ((conf)->ops->get_all_out_transports(conf , env))

/** Gets the named module.
    @sa axis2_conf_ops#get_module */
#define AXIS2_CONF_GET_MODULE(conf, env, qname) \
        ((conf)->ops->get_module(conf , env, qname))

/** Gets all the engaged modules.
    @sa axis2_conf_ops#get_all_engaged_modules */
#define AXIS2_CONF_GET_ALL_ENGAGED_MODULES(conf, env) \
        ((conf)->ops->get_all_engaged_modules(conf , env))

/** Get in phases up to and including post dispatch.
    @sa axis2_conf_ops#get_in_phases_upto_and_including_post_dispatch */
#define AXIS2_CONF_GET_IN_PHASES_UPTO_AND_INCLUDING_POST_DISPATCH(conf, env) \
        ((conf)->ops->get_in_phases_upto_and_including_post_dispatch(conf , env))

/** Gets out flow.
    @sa axis2_conf_ops#get_out_flow */
#define AXIS2_CONF_GET_OUT_FLOW(conf, env) \
        ((conf)->ops->get_out_flow(conf , env))

/** Gets in fault flow.
    @sa axis2_conf_ops#get_in_fault_flow */
#define AXIS2_CONF_GET_IN_FAULT_FLOW(conf, env) \
        ((conf)->ops->get_in_fault_flow(conf , env))

/** Gets out fault flow.
    @sa axis2_conf_ops#get_out_fault_flow */
#define AXIS2_CONF_GET_OUT_FAULT_FLOW(conf, env) \
        ((conf)->ops->get_out_fault_flow(conf , env))

/** Gets all faulty services.
    @sa axis2_conf_ops#get_all_faulty_svcs */
#define AXIS2_CONF_GET_ALL_FAULTY_SVCS(conf, env) \
        ((conf)->ops->get_all_faulty_svcs(conf , env))

/** Gets all faulty modules.
    @sa axis2_conf_ops#get_all_faulty_modules */
#define AXIS2_CONF_GET_ALL_FAULTY_MODULES(conf, env) \
        ((conf)->ops->get_all_faulty_modules(conf , env))

/** Gets all services.
    @sa axis2_conf_ops#get_all_svcs */
#define AXIS2_CONF_GET_ALL_SVCS(conf, env) \
        ((conf)->ops->get_all_svcs(conf , env))

/** Checks if the named module is engaged.
    @sa axis2_conf_ops#is_engaged */
#define AXIS2_CONF_IS_ENGAGED(conf, env, module_name) \
        ((conf)->ops->is_engaged(conf , env, module_name))

/** Gets phase information.
    @sa axis2_conf_ops#get_phases_info */
#define AXIS2_CONF_GET_PHASES_INFO(conf, env) \
        ((conf)->ops->get_phases_info(conf , env))

/** Sets phase information.
    @sa axis2_conf_ops#set_phases_info */
#define AXIS2_CONF_SET_PHASES_INFO(conf, env, phases_info) \
        ((conf)->ops->set_phases_info(conf , env, phases_info))

/** Adds a message receiver with the given name.
    @sa axis2_conf_ops#add_msg_recv */
#define AXIS2_CONF_ADD_MSG_RECV(conf, env, key, msg_recv) \
        ((conf)->ops->add_msg_recv(conf , env, key, msg_recv))

/** Gets the message receiver with given key.
    @sa axis2_conf_ops#get_msg_recv */
#define AXIS2_CONF_GET_MSG_RECV(conf, env, key) \
        ((conf)->ops->get_msg_recv(conf , env, key))

/** Sets out phases.
    @sa axis2_conf_ops#set_out_phases */
#define AXIS2_CONF_SET_OUT_PHASES(conf, env, out_phases) \
        ((conf)->ops->set_out_phases(conf , env, out_phases))

/** Gets out phases.
    @sa axis2_conf_ops#get_out_phases */
#define AXIS2_CONF_GET_OUT_PHASES(conf, env) \
        ((conf)->ops->get_out_phases(conf , env))

/** Sets in fault phases.
    @sa axis2_conf_ops#set_in_fault_phases */
#define AXIS2_CONF_SET_IN_FAULT_PHASES(conf, env, list) \
        ((conf)->ops->set_in_fault_phases(conf , env, list))

/** Sets out fault phases.
    @sa axis2_conf_ops#set_out_fault_phases */
#define AXIS2_CONF_SET_OUT_FAULT_PHASES(conf, env, list) \
        ((conf)->ops->set_out_fault_phases(conf , env, list))

/** Gets all the modules.
    @sa axis2_conf_ops#get_all_modules */
#define AXIS2_CONF_GET_ALL_MODULES(conf, env) \
        ((conf)->ops->get_all_modules(conf , env))

/** Adds a module.
    @sa axis2_conf_ops#add_module */
#define AXIS2_CONF_ADD_MODULE(conf, env, module) \
        ((conf)->ops->add_module(conf , env, module))

/** Sets the default dispatchers.
    @sa axis2_conf_ops#set_default_dispatchers */
#define AXIS2_CONF_SET_DEFAULT_DISPATCHERS(conf, env) \
        ((conf)->ops->set_default_dispatchers(conf , env))

/** Sets a custom dispatch phase.
    @sa axis2_conf_ops#set_dispatch_phase */
#define AXIS2_CONF_SET_DISPATCH_PHASE(conf, env, dispatch) \
        ((conf)->ops->set_dispatch_phase(conf , env, dispatch))

/** Gets repository location.
    @sa axis2_conf_ops#get_repo */
#define AXIS2_CONF_GET_REPO(conf, env) \
        ((conf)->ops->get_repo(conf , env))

/** Sets repository location.
    @sa axis2_conf_ops#set_repo */
#define AXIS2_CONF_SET_REPO(conf, env, axis2_repos) \
        ((conf)->ops->set_repo(conf , env, axis2_repos))

/** Engages a module.
    @sa axis2_conf_ops#engage_module */
#define AXIS2_CONF_ENGAGE_MODULE(conf, env, module_ref) \
        ((conf)->ops->engage_module(conf , env, module_ref))

/** Sets the deployment engine.
    @sa axis2_conf_ops#set_dep_engine */
#define AXIS2_CONF_SET_DEP_ENGINE(conf, env, dep_engine) \
        ((conf)->ops->set_dep_engine(conf, env, dep_engine))

/** Gets the default module version.
    @sa axis2_conf_ops#get_default_module_version */
#define AXIS2_CONF_GET_DEFAULT_MODULE_VERSION(conf, env, module_name)\
        ((conf)->ops->get_default_module_version(conf, env, module_name))

/** Gets the default module.
    @sa axis2_conf_ops#get_default_module */
#define AXIS2_CONF_GET_DEFAULT_MODULE(conf, env, module_name)\
        ((conf)->ops->get_default_module(conf, env, module_name))

/** Adds the default module version for a named module.
    @sa axis2_conf_ops#add_default_module_version */
#define AXIS2_CONF_ADD_DEFAULT_MODULE_VERSION(conf, env, mod_name, mod_ver)\
        ((conf)->ops->add_default_module_version(conf, env, mod_name, mod_ver))

/** Engages a module with a given version.
    @sa axis2_conf_ops#engage_module_with_version */
#define AXIS2_CONF_ENGAGE_MODULE_WITH_VERSION(conf, env, mod_name, mod_ver)\
        ((conf)->ops->engage_module_with_version(conf, env, mod_name, mod_ver))

/** @} */
#ifdef __cplusplus
}
#endif
#endif /* AXIS2_CONFIG_H */
