
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements.  See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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 <axutil_param_container.h>
#include <axis2_svc_grp.h>
#include <axis2_transport_in_desc.h>
#include <axis2_transport_out_desc.h>
#include <axutil_qname.h>
#include <axutil_hash.h>
#include <axis2_phases_info.h>
#include <axis2_msg_recv.h>

#ifdef __cplusplus
extern "C"
{
#endif

    /** 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;

    /**
     * Frees conf struct.
     * @param conf pointer to conf struct
     * @param env pointer to environment struct
     * @return AXIS2_SUCCESS on success, else AXIS2_FAILURE
     */
    AXIS2_EXTERN void AXIS2_CALL
    axis2_conf_free(
        axis2_conf_t * conf,
        const axutil_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_EXTERN axis2_status_t AXIS2_CALL
    axis2_conf_add_svc_grp(
        axis2_conf_t * conf,
        const axutil_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
     */
    AXIS2_EXTERN struct axis2_svc_grp *AXIS2_CALL
                axis2_conf_get_svc_grp(
                    const axis2_conf_t * conf,
                    const axutil_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_EXTERN axutil_hash_t *AXIS2_CALL
    axis2_conf_get_all_svc_grps(
        const axis2_conf_t * conf,
        const axutil_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_EXTERN axis2_status_t AXIS2_CALL
    axis2_conf_add_svc(
        axis2_conf_t * conf,
        const axutil_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
     */
    AXIS2_EXTERN struct axis2_svc *AXIS2_CALL
                axis2_conf_get_svc(
                    const axis2_conf_t * conf,
                    const axutil_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_EXTERN axis2_status_t AXIS2_CALL
    axis2_conf_remove_svc(
        axis2_conf_t * conf,
        const axutil_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_EXTERN axis2_status_t AXIS2_CALL
    axis2_conf_add_param(
        axis2_conf_t * conf,
        const axutil_env_t * env,
        axutil_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_EXTERN axutil_param_t *AXIS2_CALL
    axis2_conf_get_param(
        const axis2_conf_t * conf,
        const axutil_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_EXTERN axutil_array_list_t *AXIS2_CALL
    axis2_conf_get_all_params(
        const axis2_conf_t * conf,
        const axutil_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_EXTERN axis2_bool_t AXIS2_CALL
    axis2_conf_is_param_locked(
        const axis2_conf_t * conf,
        const axutil_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_EXTERN axis2_transport_in_desc_t *AXIS2_CALL

    axis2_conf_get_transport_in(
        const axis2_conf_t * conf,
        const axutil_env_t * env,
        const AXIS2_TRANSPORT_ENUMS trans_enum);

    /**
     * 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_EXTERN axis2_status_t AXIS2_CALL
    axis2_conf_add_transport_in(
        axis2_conf_t * conf,
        const axutil_env_t * env,
        axis2_transport_in_desc_t * transport,
        const AXIS2_TRANSPORT_ENUMS trans_enum);

    /**
     * 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_EXTERN axis2_transport_out_desc_t *AXIS2_CALL

    axis2_conf_get_transport_out(
        const axis2_conf_t * conf,
        const axutil_env_t * env,
        const AXIS2_TRANSPORT_ENUMS trans_enum);

    /**
     * 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_EXTERN axis2_status_t AXIS2_CALL
    axis2_conf_add_transport_out(
        axis2_conf_t * conf,
        const axutil_env_t * env,
        axis2_transport_out_desc_t * transport,
        const AXIS2_TRANSPORT_ENUMS trans_enum);

    /**
     * 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_EXTERN axis2_transport_in_desc_t **AXIS2_CALL

    axis2_conf_get_all_in_transports(
        const axis2_conf_t * conf,
        const axutil_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_EXTERN axis2_transport_out_desc_t **AXIS2_CALL

    axis2_conf_get_all_out_transports(
        const axis2_conf_t * conf,
        const axutil_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
     */
    AXIS2_EXTERN struct axis2_module_desc *AXIS2_CALL
                axis2_conf_get_module(
                    const axis2_conf_t * conf,
                    const axutil_env_t * env,
                    const axutil_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_EXTERN axutil_array_list_t *AXIS2_CALL

    axis2_conf_get_all_engaged_modules(
        const axis2_conf_t * conf,
        const axutil_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_EXTERN axutil_array_list_t *AXIS2_CALL

    axis2_conf_get_in_phases_upto_and_including_post_dispatch(
        const axis2_conf_t * conf,
        const axutil_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_EXTERN axutil_array_list_t *AXIS2_CALL
    axis2_conf_get_out_flow(
        const axis2_conf_t * conf,
        const axutil_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_EXTERN axutil_array_list_t *AXIS2_CALL

    axis2_conf_get_in_fault_flow(
        const axis2_conf_t * conf,
        const axutil_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_EXTERN axutil_array_list_t *AXIS2_CALL

    axis2_conf_get_out_fault_flow(
        const axis2_conf_t * conf,
        const axutil_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_EXTERN axutil_hash_t *AXIS2_CALL
    axis2_conf_get_all_faulty_svcs(
        const axis2_conf_t * conf,
        const axutil_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_EXTERN axutil_hash_t *AXIS2_CALL
    axis2_conf_get_all_faulty_modules(
        const axis2_conf_t * conf,
        const axutil_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_EXTERN axutil_hash_t *AXIS2_CALL
    axis2_conf_get_all_svcs(
        const axis2_conf_t * conf,
        const axutil_env_t * env);

    /**
     * Gets all the list of services that need to be loaded into configuration
     * at the start up of the axis2 engine.
     * @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_EXTERN axutil_hash_t *AXIS2_CALL
    axis2_conf_get_all_svcs_to_load(
        const axis2_conf_t * conf,
        const axutil_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_EXTERN axis2_bool_t AXIS2_CALL
    axis2_conf_is_engaged(
        axis2_conf_t * conf,
        const axutil_env_t * env,
        const axutil_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
     */
    AXIS2_EXTERN struct axis2_phases_info *AXIS2_CALL

                axis2_conf_get_phases_info(
                    const axis2_conf_t * conf,
                    const axutil_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_EXTERN axis2_status_t AXIS2_CALL
    axis2_conf_set_phases_info(
        axis2_conf_t * conf,
        const axutil_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_EXTERN axis2_status_t AXIS2_CALL
    axis2_conf_add_msg_recv(
        axis2_conf_t * conf,
        const axutil_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
     */
    AXIS2_EXTERN struct axis2_msg_recv *AXIS2_CALL
                axis2_conf_get_msg_recv(
                    const axis2_conf_t * conf,
                    const axutil_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_EXTERN axis2_status_t AXIS2_CALL
    axis2_conf_set_out_phases(
        axis2_conf_t * conf,
        const axutil_env_t * env,
        axutil_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_EXTERN axutil_array_list_t *AXIS2_CALL
    axis2_conf_get_out_phases(
        const axis2_conf_t * conf,
        const axutil_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_EXTERN axis2_status_t AXIS2_CALL
    axis2_conf_set_in_fault_phases(
        axis2_conf_t * conf,
        const axutil_env_t * env,
        axutil_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_EXTERN axis2_status_t AXIS2_CALL
    axis2_conf_set_out_fault_phases(
        axis2_conf_t * conf,
        const axutil_env_t * env,
        axutil_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_EXTERN axutil_hash_t *AXIS2_CALL
    axis2_conf_get_all_modules(
        const axis2_conf_t * conf,
        const axutil_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_EXTERN axis2_status_t AXIS2_CALL
    axis2_conf_add_module(
        axis2_conf_t * conf,
        const axutil_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_EXTERN axis2_status_t AXIS2_CALL

    axis2_conf_set_default_dispatchers(
        axis2_conf_t * conf,
        const axutil_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_EXTERN axis2_status_t AXIS2_CALL
    axis2_conf_set_dispatch_phase(
        axis2_conf_t * conf,
        const axutil_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
     */
    AXIS2_EXTERN const axis2_char_t *AXIS2_CALL
    axis2_conf_get_repo(
        const axis2_conf_t * conf,
        const axutil_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_EXTERN axis2_status_t AXIS2_CALL
    axis2_conf_set_repo(
        axis2_conf_t * conf,
        const axutil_env_t * env,
        axis2_char_t * axis2_repo);
	
	
	/**
     * Gets the axis2.xml location.
     * @param conf pointer to conf struct
     * @param env pointer to environment struct
     * @return returns repository location as a string
     */
    AXIS2_EXTERN const axis2_char_t *AXIS2_CALL
    axis2_conf_get_axis2_xml(
        const axis2_conf_t * conf,
        const axutil_env_t * env);

    /**
     * Sets the axis2.xml location.
     * @param conf pointer to conf struct
     * @param env pointer to environment struct
     * @param axis2_xml repository location as a string
     * @return AXIS2_SUCCESS on success, else AXIS2_FAILURE
     */
    AXIS2_EXTERN axis2_status_t AXIS2_CALL
    axis2_conf_set_axis2_xml(
        axis2_conf_t * conf,
        const axutil_env_t * env,
        axis2_char_t * axis2_xml);

    /**
     * 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_EXTERN axis2_status_t AXIS2_CALL
    axis2_conf_engage_module(
        axis2_conf_t * conf,
        const axutil_env_t * env,
        const axutil_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_EXTERN axis2_status_t AXIS2_CALL
    axis2_conf_set_dep_engine(
        axis2_conf_t * conf,
        const axutil_env_t * env,
        struct axis2_dep_engine *dep_engine);

    /**
     * Gets the deployment engine.
     * @param conf pointer to conf struct
     * @param env pointer to environment struct
     * @return dep_engine pointer to dep_engine struct
     */
    AXIS2_EXTERN struct axis2_dep_engine * AXIS2_CALL
    axis2_conf_get_dep_engine(
        axis2_conf_t * conf,
        const axutil_env_t * env);

    /**
     * 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
     */
    AXIS2_EXTERN const axis2_char_t *AXIS2_CALL

    axis2_conf_get_default_module_version(
        const axis2_conf_t * conf,
        const axutil_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
     */
    AXIS2_EXTERN struct axis2_module_desc *AXIS2_CALL

                axis2_conf_get_default_module(
                    const axis2_conf_t * conf,
                    const axutil_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_EXTERN axis2_status_t AXIS2_CALL

    axis2_conf_add_default_module_version(
        axis2_conf_t * conf,
        const axutil_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_EXTERN axis2_status_t AXIS2_CALL

    axis2_conf_engage_module_with_version(
        axis2_conf_t * conf,
        const axutil_env_t * env,
        const axis2_char_t * module_name,
        const axis2_char_t * version_id);

    /**
     * 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 axutil_env_t * env);

    AXIS2_EXTERN axis2_bool_t AXIS2_CALL
    axis2_conf_get_enable_mtom(
        axis2_conf_t * conf,
        const axutil_env_t * env);

    AXIS2_EXTERN axis2_status_t AXIS2_CALL
    axis2_conf_set_enable_mtom(
        axis2_conf_t * conf,
        const axutil_env_t * env,
        axis2_bool_t enable_mtom);
	
	/**
	 * set a flag to mark conf created by axis2.xml
	 */
	AXIS2_EXTERN axis2_bool_t AXIS2_CALL
    axis2_conf_get_axis2_flag(
        axis2_conf_t * conf,
        const axutil_env_t * env);

    AXIS2_EXTERN axis2_status_t AXIS2_CALL
    axis2_conf_set_axis2_flag(
        axis2_conf_t * conf,
        const axutil_env_t * env,
        axis2_bool_t axis2_flag);

    /*The following two methods are used in Rampart to
     *check whether security is engaed. */

    AXIS2_EXTERN axis2_bool_t AXIS2_CALL
    axis2_conf_get_enable_security(
        axis2_conf_t * conf,
        const axutil_env_t * env);

    AXIS2_EXTERN axis2_status_t AXIS2_CALL
    axis2_conf_set_enable_security(
        axis2_conf_t * conf,
        const axutil_env_t * env,
        axis2_bool_t enable_security);

    AXIS2_EXTERN void *AXIS2_CALL
    axis2_conf_get_security_context(
        axis2_conf_t * conf,
        const axutil_env_t * env);

    AXIS2_EXTERN axis2_status_t AXIS2_CALL
    axis2_conf_set_security_context(
        axis2_conf_t * conf,
        const axutil_env_t * env,
        void *security_context);

    AXIS2_EXTERN axutil_param_container_t *AXIS2_CALL

    axis2_conf_get_param_container(
        const axis2_conf_t * conf,
        const axutil_env_t * env);

    /**
     * Gets base description.
     * @param conf pointer to message
     * @param env pointer to environment struct
     * @return pointer to base description struct
     */
    AXIS2_EXTERN axis2_desc_t *AXIS2_CALL
    axis2_conf_get_base(
        const axis2_conf_t * conf,
        const axutil_env_t * env);

	AXIS2_EXTERN axutil_array_list_t * AXIS2_CALL
	axis2_conf_get_handlers(const axis2_conf_t * conf,
		const axutil_env_t * env);

	/**
	 * Disengage a module 
	 * @param 
	 *
	 */
	AXIS2_EXTERN axis2_status_t AXIS2_CALL
	axis2_conf_disengage_module(
		const axis2_conf_t *conf,
		const axutil_env_t *env,
		const axutil_qname_t *module_ref
		);
#ifdef __cplusplus
}
#endif
#endif                          /* AXIS2_CONFIG_H */
