/*
 * 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_DISP_CHECKER_H
#define AXIS2_DISP_CHECKER_H

/**
 * @file axis2_disp_checker.h
 * @brief Axis2 Dispatcher interface
 */

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

#ifdef __cplusplus
extern "C"
{
#endif

    struct axis2_disp_checker;
    struct axis2_disp_checker_ops;
    
/**
 * @defgroup axis2_disp_checker Dispatcher
 * @ingroup axis2_engine
 * @{
 */

/**
 *   \brief Dispatcher ops struct
 */
 AXIS2_DECLARE_DATA   typedef struct axis2_disp_checker_ops
    { 
        axis2_handler_t* (AXIS2_CALL *
		get_base) (struct axis2_disp_checker *disp_checker, 
                   axis2_env_t **env);
		
		
        axis2_qname_t* (AXIS2_CALL *
		get_qname) (struct axis2_disp_checker *disp_checker, 
                    axis2_env_t **env);
		
        axis2_status_t (AXIS2_CALL *
		set_qname) (struct axis2_disp_checker *disp_checker, 
                    axis2_env_t **env, 
					axis2_qname_t *qname);
		
        axis2_status_t (AXIS2_CALL *
		free) (struct axis2_disp_checker *disp_checker, 
               axis2_env_t **env);
        
    } axis2_disp_checker_ops_t;
	
   /** 
    * \brief Dispatcher struct
    */
    typedef struct axis2_disp_checker
    {
        /** Dispatcher related ops */
        axis2_disp_checker_ops_t *ops;
    } axis2_disp_checker_t;


/**
 * creates disp_checker struct
 * @param qname qname, can be NULL
 */
AXIS2_DECLARE(axis2_disp_checker_t*)
axis2_disp_checker_create(axis2_env_t **env, 
						  axis2_qname_t *qname);

#define AXIS2_DISP_CHECKER_GET_BASE(disp_checker, env) \
		((disp_checker)->ops->get_base(disp_checker, env))
	
#define AXIS2_DISP_CHECKER_GET_QNAME(disp_checker, env) \
		((disp_checker)->ops->get_qname(disp_checker, env))
	
#define AXIS2_DISP_CHECKER_SET_QNAME(disp_checker, env, name) \
		((disp_checker)->ops->set_qname(disp_checker, env, name))
	
#define AXIS2_DISP_CHECKER_FREE(disp_checker, env) \
		((disp_checker)->ops->free(disp_checker, env))
		
    
/** @} */
    
#ifdef __cplusplus
}
#endif

#endif    /* AXIS2_DISP_CHECKER_H */
