/*
 * 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_CONF_CTX_H
#define AXIS2_CONF_CTX_H


/**
  * @file axis2_conf_ctx.h
  * @brief axis2 Message Context interface
  */

#include <axis2_defines.h>
#include <axis2_hash.h>
#include <axis2_env.h>
#include <axis2_ctx.h>
#include <axis2_svc_grp_ctx.h>

#ifdef __cplusplus
extern "C"
{
#endif

/** @defgroup axis2_conf_ctx Message Context 
 * @ingroup axis2_core_context
 * @{
 */
    
typedef struct axis2_conf_ctx_ops axis2_conf_ctx_ops_t;
typedef struct axis2_conf_ctx axis2_conf_ctx_t; 
struct axis2_conf;
    
/** 
 * @brief Message Context ops struct
 * Encapsulator struct for ops of axis2_conf_ctx
 */  
struct axis2_conf_ctx_ops
{
    /**
     * @param configuration
     */
    axis2_status_t (AXIS2_CALL *set_conf)(struct axis2_conf_ctx *conf_ctx, 
        const axis2_env_t *env, 
        struct axis2_conf *conf);
    /**
     */
    axis2_ctx_t* (AXIS2_CALL *get_base)(struct axis2_conf_ctx *conf_ctx, 
        const axis2_env_t *env);
    /**
     */
    struct axis2_conf* (AXIS2_CALL *get_conf)(struct axis2_conf_ctx *conf_ctx, 
        const axis2_env_t *env);
    axis2_hash_t* (AXIS2_CALL *get_op_ctx_map)(struct axis2_conf_ctx *conf_ctx, 
        const axis2_env_t *env);
    axis2_hash_t* (AXIS2_CALL *get_svc_ctx_map)(struct axis2_conf_ctx *conf_ctx, 
        const axis2_env_t *env);
    axis2_hash_t* (AXIS2_CALL *get_svc_grp_ctx_map)(struct axis2_conf_ctx *conf_ctx, 
                                                                const axis2_env_t *env);
    /**
     * Register a struct axis2_op_ctx against a given Message ID.
     *
     * @param messageID
     * @param mepContext
     */
    axis2_status_t (AXIS2_CALL *register_op_ctx)(struct axis2_conf_ctx *conf_ctx, 
                                                                    const axis2_env_t *env,
                                                                    axis2_char_t *message_id,
                                                                    struct axis2_op_ctx *op_ctx);
    /**
     * get axis2_op_ctx struct given a Message ID
     *
     * @param message_id
     * @return struct axis2_op_ctx * <code>struct axis2_op_ctx *<code>
     */
    struct axis2_op_ctx* (AXIS2_CALL *get_op_ctx)(struct axis2_conf_ctx *conf_ctx, 
                                                                            const axis2_env_t *env,
                                                                            axis2_char_t *message_id);
    /**
     * Register a struct axis2_svc_ctx against a given Message ID.
     *
     * @param svc_id
     * @param mepContext
     */
    axis2_status_t (AXIS2_CALL *register_svc_ctx)(struct axis2_conf_ctx *conf_ctx, 
                                                                    const axis2_env_t *env,
                                                                    axis2_char_t *svc_id,
                                                                    struct axis2_svc_ctx *svc_ctx);
    /**
     * get axis2_svc_ctx struct given a Message ID
     *
     * @param svc_id
     * @return struct axis2_svc_ctx * <code>struct axis2_svc_ctx *<code>
     */
    struct axis2_svc_ctx* (AXIS2_CALL *get_svc_ctx)(struct axis2_conf_ctx *conf_ctx, 
                                                                            const axis2_env_t *env,
                                                                            axis2_char_t *svc_id);
    /**
     * Register a struct axis2_svc_grp_ctx against a given Message ID.
     *
     * @param svc_grp_id
     * @param mepContext
     */
    axis2_status_t (AXIS2_CALL *register_svc_grp_ctx)(struct axis2_conf_ctx *conf_ctx, 
                                                                    const axis2_env_t *env,
                                                                    axis2_char_t *svc_grp_id,
                                                                    struct axis2_svc_grp_ctx *svc_grp_ctx);
    /**
     * get axis2_svc_grp_ctx struct given a service group ID
     *
     * @param svc_grp_id
     * @return struct axis2_svc_grp_ctx * <code>struct axis2_svc_grp_ctx *<code>
     */
    struct axis2_svc_grp_ctx* (AXIS2_CALL *get_svc_grp_ctx)(struct axis2_conf_ctx *conf_ctx, 
                                                                            const axis2_env_t *env,
                                                                            axis2_char_t *svc_grp_id);
    /**
     * This method allows users to reolve the paths relative to the
     * root diretory
     *
     * @param path
     */
    axis2_char_t* (AXIS2_CALL *get_root_dir)(struct axis2_conf_ctx *conf_ctx, 
                                                            const axis2_env_t *env);
    /**
     * @param file
     */
    axis2_status_t (AXIS2_CALL *set_root_dir)(struct axis2_conf_ctx *conf_ctx, 
                                                            const axis2_env_t *env,
                                                            axis2_char_t *path);
    axis2_status_t (AXIS2_CALL *init)(struct axis2_conf_ctx *conf_ctx, 
                                                            const axis2_env_t *env,
                                                            struct axis2_conf *conf);
    axis2_status_t (AXIS2_CALL *free)(struct axis2_conf_ctx *conf_ctx, 
                                       const axis2_env_t *env);
    /**
     * This method should search for a service group context in the map with given id as the key.
     * If(key != null && found)
     * check for a service context for the intended service.
     * if (!found)
     * create one and hook up to service group context
     * else
     * create new service group context with the given key or if key is null with a new key
     * create a new service context for the service
     *
     * @param messageContext
     */
    struct axis2_svc_grp_ctx* (AXIS2_CALL *fill_ctxs)(struct axis2_conf_ctx *conf_ctx, 
                                                   const axis2_env_t *env,
                                                   axis2_msg_ctx_t *msg_ctx);
};

/** 
 * @brief Message Context struct
  *   Axis2 Message Context
 */
struct axis2_conf_ctx
{
    axis2_conf_ctx_ops_t *ops;    
};

AXIS2_EXTERN axis2_conf_ctx_t *AXIS2_CALL axis2_conf_ctx_create(const axis2_env_t *env, struct axis2_conf *conf);
    
/************************** Start of function macros **************************/

#define AXIS2_CONF_CTX_SET_CONF(conf_ctx, env, conf) ((conf_ctx)->ops->set_conf(conf_ctx, env, conf))
#define AXIS2_CONF_CTX_GET_BASE(conf_ctx, env) ((conf_ctx)->ops->get_base(conf_ctx, env))
#define AXIS2_CONF_CTX_GET_CONF(conf_ctx, env) ((conf_ctx)->ops->get_conf(conf_ctx, env))
#define AXIS2_CONF_CTX_GET_OP_CTX_MAP(conf_ctx, env) ((conf_ctx)->ops->get_op_ctx_map(conf_ctx, env))
#define AXIS2_CONF_CTX_GET_SVC_CTX_MAP(conf_ctx, env) ((conf_ctx)->ops->get_svc_ctx_map(conf_ctx, env))
#define AXIS2_CONF_CTX_GET_SVC_GRP_CTX_MAP(conf_ctx, env) ((conf_ctx)->ops->get_svc_grp_ctx_map(conf_ctx, env))
#define AXIS2_CONF_CTX_REGISTER_OP_CTX(conf_ctx, env, message_id, op_ctx) ((conf_ctx)->ops->register_op_ctx(conf_ctx, env, message_id, op_ctx))
#define AXIS2_CONF_CTX_GET_OP_CTX(conf_ctx, env, message_id) ((conf_ctx)->ops->get_op_ctx(conf_ctx, env, message_id))
#define AXIS2_CONF_CTX_REGISTER_SVC_CTX(conf_ctx, env, svc_id, svc_ctx) ((conf_ctx)->ops->register_svc_ctx(conf_ctx, env, svc_id, svc_ctx))
#define AXIS2_CONF_CTX_GET_SVC_CTX(conf_ctx, env, svc_id) ((conf_ctx)->ops->get_svc_ctx(conf_ctx, env, svc_id))
#define AXIS2_CONF_CTX_REGISTER_SVC_GRP_CTX(conf_ctx, env, svc_grp_id, svc_grp_ctx) ((conf_ctx)->ops->register_svc_grp_ctx(conf_ctx, env, svc_grp_id, svc_grp_ctx))
#define AXIS2_CONF_CTX_GET_SVC_GRP_CTX(conf_ctx, env, svc_grp_id) ((conf_ctx)->ops->get_svc_grp_ctx(conf_ctx, env, svc_grp_id))
#define AXIS2_CONF_CTX_GET_ROOT_DIR(conf_ctx, env) ((conf_ctx)->ops->get_root_dir(conf_ctx, env))
#define AXIS2_CONF_CTX_SET_ROOT_DIR(conf_ctx, env, path) ((conf_ctx)->ops->set_root_dir(conf_ctx, env, path))
#define AXIS2_CONF_CTX_INIT(conf_ctx, env, conf) ((conf_ctx)->ops->init(conf_ctx, env, conf))
#define AXIS2_CONF_CTX_FREE(conf_ctx, env) ((conf_ctx)->ops->free(conf_ctx, env))
#define AXIS2_CONF_CTX_FILL_CTXS(conf_ctx, env, msg_ctx) ((conf_ctx)->ops->fill_ctxs(conf_ctx, env, msg_ctx))

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

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

#endif                          /* AXIS2_CONF_CTX_H */
