/*
 * 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_SVC_GRP_CTX_H
#define AXIS2_SVC_GRP_CTX_H


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

#include <axis2_defines.h>
#include <axis2_env.h>
#include <axis2_svc_ctx.h>
#include <axis2_svc_grp.h>

#ifdef __cplusplus
extern "C"
{
#endif

/** @defgroup axis2_svc_grp_ctx Message Context 
 * @ingroup axis2_core_context
 * @{
 */

struct axis2_svc_grp;    
typedef struct axis2_svc_grp_ctx_ops axis2_svc_grp_ctx_ops_t;
typedef struct axis2_svc_grp_ctx axis2_svc_grp_ctx_t; 

    
/** 
 * @brief Message Context ops struct
 * Encapsulator struct for ops of axis2_svc_grp_ctx
 */  
struct axis2_svc_grp_ctx_ops
{
    axis2_ctx_t* (AXIS2_CALL *get_base)(struct axis2_svc_grp_ctx *svc_grp_ctx, 
                                                axis2_env_t **env);
    struct axis2_conf_ctx* (AXIS2_CALL *get_parent)(struct axis2_svc_grp_ctx *svc_grp_ctx, 
           axis2_env_t **env);
    axis2_status_t (AXIS2_CALL *free)(struct axis2_svc_grp_ctx *svc_grp_ctx, 
                                       axis2_env_t **env);
    /**
     * The method is used to do the intialization of the EngineContext
     */
    axis2_status_t (AXIS2_CALL *init)(struct axis2_svc_grp_ctx *svc_grp_ctx, 
                                        axis2_env_t **env,
                                        struct axis2_conf *conf);
    axis2_char_t* (AXIS2_CALL *get_id)(struct axis2_svc_grp_ctx *svc_grp_ctx, 
                            axis2_env_t **env);
    axis2_status_t (AXIS2_CALL *set_id)(struct axis2_svc_grp_ctx *svc_grp_ctx, 
                            axis2_env_t **env, axis2_char_t *id);
    /** if the servic name is foo:bar , you should pass only bar */
    struct axis2_svc_ctx* (AXIS2_CALL *get_svc_ctx)(struct axis2_svc_grp_ctx *svc_grp_ctx, 
                            axis2_env_t **env,
                            axis2_char_t *svc_name);
    /**
     * This will create one service context per each service in descrpition
     * if service group has 2 service init , then two service contexts will be
     * created
     */
    axis2_status_t (AXIS2_CALL *fill_svc_ctx_map)(struct axis2_svc_grp_ctx *svc_grp_ctx, 
                            axis2_env_t **env);
    struct axis2_svc_grp* (AXIS2_CALL *get_svc_grp)(struct axis2_svc_grp_ctx *svc_grp_ctx, 
                            axis2_env_t **env);
    axis2_hash_t* (AXIS2_CALL *get_svc_ctx_map)(struct axis2_svc_grp_ctx *svc_grp_ctx, 
                            axis2_env_t **env);
};

/** 
 * @brief Message Context struct
  *	Axis2 Message Context
 */
struct axis2_svc_grp_ctx
{
    axis2_svc_grp_ctx_ops_t *ops;    
};


AXIS2_DECLARE(axis2_svc_grp_ctx_t*) 
axis2_svc_grp_ctx_create(axis2_env_t **env, 
                        struct axis2_svc_grp *svc_grp, 
                        struct axis2_conf_ctx *conf_ctx);

/****************** Start of function macros **************************/

#define AXIS2_SVC_GRP_CTX_GET_BASE(svc_grp_ctx, env) ((svc_grp_ctx)->ops->get_base(svc_grp_ctx, env))
#define AXIS2_SVC_GRP_CTX_GET_PARENT(svc_grp_ctx, env) ((svc_grp_ctx)->ops->get_parent(svc_grp_ctx, env))
#define AXIS2_SVC_GRP_CTX_FREE(svc_grp_ctx, env) ((svc_grp_ctx)->ops->free(svc_grp_ctx, env))
#define AXIS2_SVC_GRP_CTX_INIT(svc_grp_ctx, env, conf) ((svc_grp_ctx)->ops->init(svc_grp_ctx, env, conf))
#define AXIS2_SVC_GRP_CTX_GET_ID(svc_grp_ctx, env) ((svc_grp_ctx)->ops->get_id(svc_grp_ctx, env))
#define AXIS2_SVC_GRP_CTX_SET_ID(svc_grp_ctx, env, id) ((svc_grp_ctx)->ops->set_id(svc_grp_ctx, env, id))
#define AXIS2_SVC_GRP_CTX_GET_SVC_CTX(svc_grp_ctx, env, svc_name) ((svc_grp_ctx)->ops->get_svc_ctx(svc_grp_ctx, env, svc_name))
#define AXIS2_SVC_GRP_CTX_FILL_SVC_CTX_MAP(svc_grp_ctx, env) ((svc_grp_ctx)->ops->fill_svc_ctx_map(svc_grp_ctx, env))
#define AXIS2_SVC_GRP_GET_SVC_GRP(svc_grp_ctx, env) ((svc_grp_ctx)->ops->get_svc_grp(svc_grp_ctx, env))
#define AXIS2_SVC_GRP_GET_SVC_CTX_MAP(svc_grp_ctx, env) ((svc_grp_ctx)->ops->get_svc_ctx_map(svc_grp_ctx, env))
    
/************************** End of function macros ****************************/    

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

#endif                          /* AXIS2_SVC_GRP_CTX_H */
