/*
 * 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_HANDLER_H
#define AXIS2_HANDLER_H

/**
 * @file axis2_handler.h
 * @brief Axis2 handler interface
 */

#include <axis2_defines.h>
#include <axis2_qname.h>
#include <axis2_param.h>

#ifdef __cplusplus
extern "C"
{
#endif

    struct axis2_handler;
    struct axis2_handler_ops;
    struct axis2_handler_desc;
    struct axis2_msg_ctx;


/**
 * @defgroup axis2_handler Handlers
 * @ingroup axis2_core_handlers
 * @{
 */

/**
 *   \brief Handler ops struct
 */
 AXIS2_DECLARE_DATA   typedef struct axis2_handler_ops
    {
      /**
        * Free an axis2_handler struct
        * @param env Environment. MUST NOT be NULL, if NULL behaviour is undefined.
        * @param axis2_handler pointer to axis2_handler struct to be freed
        * @return satus of the op. AXIS2_SUCCESS on success else AXIS2_FAILURE
        */
        axis2_status_t (AXIS2_CALL *
		free) (struct axis2_handler * handler, 
               axis2_env_t **env);
         

      /**
        * Method init
        *
        * @param handlerdesc
        */
        axis2_status_t (AXIS2_CALL *
		init) (struct axis2_handler * handler, 
               axis2_env_t **env, 
               struct axis2_handler_desc *handler_desc);

      /**
        * Invoke is called to do the actual work of the Handler object.
        * If there is a fault during the processing of this method it is
        * invoke's job to report the error and undo any partial work
        * that has been completed. 
        *
        * @param msgContext the <code>axis2_context_message</code> to process with this
        *                   <code>Handler</code>.
        */
        axis2_status_t (AXIS2_CALL *
		invoke) (struct axis2_handler * handler,
				 axis2_env_t **env,
				 struct axis2_msg_ctx *msg_ctx);

      /**
        * Method getName
        *
        * @return
        */
        axis2_qname_t* (AXIS2_CALL *
		get_name) (struct axis2_handler * handler, 
                   axis2_env_t **env);

       /**
         * Method getParameter
         *
         * @param name
         * @return
         */
         axis2_param_t* (AXIS2_CALL *
		get_param) (struct axis2_handler * handler, 
                    axis2_env_t **env, 
                    axis2_char_t *name);

      /**
        * To get the phaseRule of a handler it is required to get the HnadlerDescription of the handler
        * so the argumnet pass when it call return as HnadlerDescription
        *
        * @return
        */
        struct axis2_handler_desc* (AXIS2_CALL *
		get_handler_desc) (struct axis2_handler * handler, 
                           axis2_env_t **env);
      /**
        * derived struct accessor
        */        
        /*void* (AXIS2_CALL *get_derived)(struct axis2_handler * handler, 
                                                          axis2_env_t **env);
        */
      /**
        * derived struct mutator
        */        
        /*axis2_status_t (AXIS2_CALL *set_derived)(struct axis2_handler * handler, 
                                                          axis2_env_t **env, void* derived);
        */
    } axis2_handler_ops_t;
	
   /** 
    * \brief Handler struct
    */
    typedef struct axis2_handler
    {
        /** Handler related ops */
        axis2_handler_ops_t *ops;
    } axis2_handler_t;

    typedef axis2_handler_t *(AXIS2_CALL * 
    AXIS2_HANDLER_CREATE_FUNC) (axis2_env_t **env, 
                                axis2_qname_t *qname);
    
/**
 * creates handler struct
 */
AXIS2_DECLARE(axis2_handler_t*) 
axis2_handler_create(axis2_env_t **env);

AXIS2_DECLARE(axis2_handler_t*) 
axis2_ctx_handler_create(axis2_env_t **env, axis2_qname_t *qname);
    
#define AXIS2_HANDLER_FREE(handler, env) \
	    ((handler)->ops->free(handler, env))
	
	
#define AXIS2_HANDLER_INIT(handler, env, handler_desc) \
	    ((handler)->ops->init(handler, env, handler_desc))
	
#define AXIS2_HANDLER_INVOKE(handler, env, msg_ctx) \
        ((handler)->ops->invoke(handler, env, msg_ctx))
		
#define AXIS2_HANDLER_SET_INVOKE(handler, env, invoke) \
        ((handler)->ops->set_invoke(handler, env, invoke))
		
#define AXIS2_HANDLER_GET_NAME(handler, env) \
        ((handler)->ops->get_name(handler, env))
		
#define AXIS2_HANDLER_GET_PARAM(handler, env, name) \
		((handler)->ops->get_param(handler, env, name))
		
#define AXIS2_HANDLER_GET_HANDLER_DESC(handler, env) \
		((handler)->ops->get_handler_desc(handler, env))
		
/*#define AXIS2_HANDLER_GET_DERIVED(handler, env) ((handler)->ops->get_derived(handler, env))
#define AXIS2_HANDLER_SET_DERIVED(handler, env, derived) ((handler)->ops->set_derived(handler, env, derived))
    */
/** @} */
    
#ifdef __cplusplus
}
#endif

#endif    /* AXIS2_HANDLER_H */
