/*
 * 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_DESC_H
#define AXIS2_HANDLER_DESC_H

/**
 * @file axis2_handler_desc.h
 * @brief Axis2 handler_desc interface
 */

#include <axis2_utils_defines.h>
#include <axis2_qname.h>
#include <axis2_param.h>
#include <axis2_param_container.h>
#include <axis2_phase_rule.h>
#include <axis2_handler.h>

#ifdef __cplusplus
extern "C"
{
#endif

    struct axis2_handler_desc;
    struct axis2_handler_desc_ops;
    
/**
 * @defgroup axis2_handler_desc Handler Description
 * @ingroup axis2_description
 * @{
 */

/**
 *   \brief Handler Description ops struct
 */
 AXIS2_DECLARE_DATA   typedef struct axis2_handler_desc_ops
    { 
        axis2_qname_t* (AXIS2_CALL *
        get_qname) (struct axis2_handler_desc *handler_desc, 
                        const axis2_env_t *env);
        
        axis2_status_t (AXIS2_CALL *
        set_qname) (struct axis2_handler_desc *handler_desc, 
                        const axis2_env_t *env, 
                        axis2_qname_t *qname);
        
        axis2_phase_rule_t* (AXIS2_CALL *
        get_rules) (struct axis2_handler_desc *handler_desc, 
                        const axis2_env_t *env);
        
        axis2_status_t (AXIS2_CALL *
        set_rules) (struct axis2_handler_desc *handler_desc, 
                        const axis2_env_t *env, 
                        axis2_phase_rule_t *phase_rule);
        
        axis2_param_t* (AXIS2_CALL *
        get_param) (struct axis2_handler_desc *handler_desc, 
                        const axis2_env_t *env, 
                        axis2_char_t *name);
        
        axis2_status_t (AXIS2_CALL *
        add_param) (struct axis2_handler_desc *handler_desc, 
                        const axis2_env_t *env, 
                        axis2_param_t * param);
        
        axis2_array_list_t* (AXIS2_CALL *
        get_params) (struct axis2_handler_desc *handler_desc, 
                     const axis2_env_t *env);

        /**
        * checks whether the paramter is locked at any levle 
        */
        axis2_bool_t (AXIS2_CALL *
        is_param_locked)(struct axis2_handler_desc *handler_desc, 
                         const axis2_env_t *env, axis2_char_t * param_name);
        
        axis2_handler_t* (AXIS2_CALL *
        get_handler) (struct axis2_handler_desc *handler_desc, 
                      const axis2_env_t *env);
        
        axis2_status_t (AXIS2_CALL *
        set_handler) (struct axis2_handler_desc *handler_desc, 
                        const axis2_env_t *env, 
                        axis2_handler_t * handler);
        
        axis2_char_t* (AXIS2_CALL *
        get_class_name) (struct axis2_handler_desc *handler_desc, 
                            const axis2_env_t *env);
        
        axis2_status_t (AXIS2_CALL *
        set_class_name) (struct axis2_handler_desc *handler_desc, 
                            const axis2_env_t *env, 
                            axis2_char_t *class_name);
        
        axis2_param_container_t* (AXIS2_CALL *
        get_parent) (struct axis2_handler_desc *handler_desc, 
                                               const axis2_env_t *env);
        
        axis2_status_t (AXIS2_CALL *
        set_parent) (struct axis2_handler_desc *handler_desc, 
                        const axis2_env_t *env,
                        axis2_param_container_t * parent);
        
        axis2_status_t (AXIS2_CALL *
        free) (struct axis2_handler_desc *handler_desc, 
                const axis2_env_t *env);
        
    } axis2_handler_desc_ops_t;
   
   /** 
    * \brief Handler Description struct
    */
    typedef struct axis2_handler_desc
    {
        /** Handler Description related ops */
        axis2_handler_desc_ops_t *ops;
        
        /** param container */
        axis2_param_container_t *param_container;
        
    } axis2_handler_desc_t;


/**
 * creates handler_desc struct
 * @param qname qname, can be NULL
 */
AXIS2_EXTERN axis2_handler_desc_t* AXIS2_CALL 
axis2_handler_desc_create_with_qname(const axis2_env_t *env, axis2_qname_t *qname);

#define AXIS2_HANDLER_DESC_GET_HANDLER(handler_desc, env) \
        ((handler_desc)->ops->get_handler(handler_desc, env))
    
#define AXIS2_HANDLER_DESC_SET_HANDLER(handler_desc, env, handler) \
        ((handler_desc)->ops->set_handler(handler_desc, env, handler))
    
#define AXIS2_HANDLER_DESC_GET_RULES(handler_desc, env) \
        ((handler_desc)->ops->get_rules(handler_desc, env))
    
#define AXIS2_HANDLER_DESC_SET_RULES(handler_desc, env, rules) \
        ((handler_desc)->ops->set_rules(handler_desc, env, rules))
    
#define AXIS2_HANDLER_DESC_GET_QNAME(handler_desc, env) \
        ((handler_desc)->ops->get_qname(handler_desc, env))
    
#define AXIS2_HANDLER_DESC_SET_QNAME(handler_desc, env, name) \
        ((handler_desc)->ops->set_qname(handler_desc, env, name))
    
#define AXIS2_HANDLER_DESC_GET_PARAM(handler_desc, env, name) \
        ((handler_desc)->ops->get_param(handler_desc, env, name))
        
#define AXIS2_HANDLER_DESC_ADD_PARAM(handler_desc, env, param) \
        ((handler_desc)->ops->add_param(handler_desc, env, param))
        
#define AXIS2_HANDLER_DESC_IS_PHASE_FIRST(handler_desc, env) \
        ((handler_desc)->ops->is_phase_first((handler_desc, env))
        
#define AXIS2_HANDLER_DESC_GET_PHASE_FIRST(handler_desc, env, phase_first) \
        ((handler_desc)->ops->set_phase_first(handler_desc, env, phase_first))
        
#define AXIS2_HANDLER_DESC_IS_PHASE_LAST(handler_desc, env) \
        ((handler_desc)->ops->is_phase_last(handler_desc, env))
        
#define AXIS2_HANDLER_DESC_GET_PHASE_LAST(handler_desc, env, phase_last) \
        ((handler_desc)->ops->set_phase_last(handler_desc, env, phase_last))

#define AXIS2_HANDLER_DESC_GET_CLASS_NAME(handler_desc, env) \
        ((handler_desc)->ops->get_class_name(handler_desc, env))
        
#define AXIS2_HANDLER_DESC_SET_CLASS_NAME(handler_desc, env, class_name) \
        ((handler_desc)->ops->set_class_name(handler_desc, env, class_name))

#define AXIS2_HANDLER_DESC_GET_PARENT(handler_desc, env) \
        ((handler_desc)->ops->get_parent(handler_desc, env))
        
#define AXIS2_HANDLER_DESC_SET_PARENT(handler_desc, env, parent) \
        ((handler_desc)->ops->set_parent(handler_desc, env, parent))
        
#define AXIS2_HANDLER_DESC_FREE(handler_desc, env) \
        ((handler_desc)->ops->free(handler_desc, env))
    
/** @} */
    
#ifdef __cplusplus
}
#endif

#endif    /* AXIS2_HANDLER_DESC_H */
