/*
 * 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, 
              const axis2_env_t *env);
   
   
    struct axis2_conf_ctx* (AXIS2_CALL *
   get_parent)(struct axis2_svc_grp_ctx *svc_grp_ctx, 
                const axis2_env_t *env);
   
   
    axis2_status_t (AXIS2_CALL *
   free)(struct axis2_svc_grp_ctx *svc_grp_ctx, 
          const 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, 
        const axis2_env_t *env,
        struct axis2_conf *conf);
           
        
    axis2_char_t* (AXIS2_CALL *
   get_id)(struct axis2_svc_grp_ctx *svc_grp_ctx, 
            const axis2_env_t *env);
   
   
    axis2_status_t (AXIS2_CALL *
   set_id)(struct axis2_svc_grp_ctx *svc_grp_ctx, 
            const 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, 
             const 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, 
                      const axis2_env_t *env);
   
   
    struct axis2_svc_grp* (AXIS2_CALL *
   get_svc_grp)(struct axis2_svc_grp_ctx *svc_grp_ctx, 
                 const axis2_env_t *env);
   
   
    axis2_hash_t* (AXIS2_CALL *
   get_svc_ctx_map)(struct axis2_svc_grp_ctx *svc_grp_ctx, 
                     const axis2_env_t *env);
};

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


AXIS2_EXTERN axis2_svc_grp_ctx_t* AXIS2_CALL 
axis2_svc_grp_ctx_create(const 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 */
