/*
 * 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_WSDL_BINDING_H
#define AXIS2_WSDL_BINDING_H

/**
 * @file axis2_wsdl_binding.h
 * @brief Axis2 Wsdl binding interface
 */

#include <axis2.h>
#include <axis2_error.h>
#include <axis2_defines.h>
#include <axis2_env.h>
#include <axis2_allocator.h>
#include <axis2_hash.h>
#include <axis2_wsdl_binding_op.h>
#include <axis2_wsdl_binding_fault.h>
#include <axis2_qname.h>
#include <axis2_wsdl_interface.h>

#ifdef __cplusplus
extern "C"
{
#endif

struct axis2_wsdl_interface;
struct axis2_wsdl_binding_op;
struct axis2_wsdl_binding_fault;
struct axis2_wsdl_extensible_component;    
typedef struct axis2_wsdl_binding axis2_wsdl_binding_t;
typedef struct axis2_wsdl_binding_ops axis2_wsdl_binding_ops_t;

/** @defgroup axis2_wsdl_binding Wsdl Binding
 * @ingroup axis2_wsdl
 * @{
 */

/** 
 * @brief Wsdl Binding ops struct
 * Encapsulator struct for ops of axis2_wsdl_binding
 */
AXIS2_DECLARE_DATA struct axis2_wsdl_binding_ops
{
	/** De-allocate memory
  	 * @return status code
  	 */
	axis2_status_t (AXIS2_CALL *
    free)(axis2_wsdl_binding_t *wsdl_binding,
		    axis2_env_t **env);
                               
    /**
     * Method getBoundInterface
     *
     * @return  WSDLInterface
     */
    struct axis2_wsdl_interface * (AXIS2_CALL *
    get_bound_interface) (axis2_wsdl_binding_t *binding,
                                            axis2_env_t **env);
    
    /**
     * Method setBoundInterface
     *
     * @param boundInterface
     */
    axis2_status_t (AXIS2_CALL *
    set_bound_interface) (axis2_wsdl_binding_t *binding,
                                            axis2_env_t **env,
                                            struct axis2_wsdl_interface *bound_interface);
    
    /**
     * Method getName
     *
     * @return  QName
     */
    axis2_qname_t * (AXIS2_CALL *
    get_name) (axis2_wsdl_binding_t *binding,
                                axis2_env_t **env);
    
    /**
     * Method setName
     *
     * @param name
     */
    axis2_status_t (AXIS2_CALL *
    set_name) (axis2_wsdl_binding_t *binding,
                                axis2_env_t **env,
                                axis2_qname_t *qname);
    
    /**
     * Method getTargetNameSpace
     *
     * @return String
     */
    axis2_char_t * (AXIS2_CALL *
    get_target_namespace) (axis2_wsdl_binding_t *binding,
                                                axis2_env_t **env);
    
    /**
     * Method getBindingFaults
     *
     * @return  Hashmap
     */
    axis2_hash_t * (AXIS2_CALL *
    get_binding_faults) (axis2_wsdl_binding_t *binding,
                                            axis2_env_t **env);
    
    /**
     * Method setBindingFaults
     *
     * @param bindingFaults
     */
    axis2_status_t (AXIS2_CALL *
    set_binding_faults) (axis2_wsdl_binding_t *binding,
                                            axis2_env_t **env,
                                            axis2_hash_t *binding_faults);
    
    /**
     * Method getBindingOperations
     *
     * @return Hashmap
     */
    axis2_hash_t * (AXIS2_CALL *
    get_binding_ops) (axis2_wsdl_binding_t *binding,
                                                axis2_env_t **env);
    
    /**
     * Method setBindingOperations
     *
     * @param bindingOperations
     */
    axis2_status_t (AXIS2_CALL *
    set_binding_ops) (axis2_wsdl_binding_t *binding,
                                                axis2_env_t **env,
                                                axis2_hash_t *binding_ops);
    
    /**
     * Method addBindingOperation
     *
     * @param bindingOperation
     */
    axis2_status_t (AXIS2_CALL *
    add_binding_op) (
                            axis2_wsdl_binding_t *binding,
                            axis2_env_t **env,
                            struct axis2_wsdl_binding_op *binding_op);
    
    /**
     * Method getBindingOperation
     *
     * @param qName
     * @return WSDLBindingOperation
     */
    struct axis2_wsdl_binding_op *(AXIS2_CALL *
    get_binding_op) (axis2_wsdl_binding_t *binding,
                                                axis2_env_t **env,
                                                axis2_qname_t *qName);
    
    /**
     * Method addBindingFaults
     *
     * @param bindingFault
     */
    axis2_status_t (AXIS2_CALL *
    add_binding_fault) (axis2_wsdl_binding_t *binding,
                                            axis2_env_t **env,
                                            struct axis2_wsdl_binding_fault *binding_fault);
    
    /**
     * Method getBindingFault
     *
     * @param ref
     * @return WSDLBindingFault
     */
    struct axis2_wsdl_binding_fault * (AXIS2_CALL *
    get_binding_fault) (axis2_wsdl_binding_t *binding,
                                            axis2_env_t **env,
                                            axis2_qname_t *ref);

};

/** 
 * @brief Wsdl binding struct  
 */  
AXIS2_DECLARE_DATA struct axis2_wsdl_binding
{
	axis2_wsdl_binding_ops_t *ops;
    struct axis2_wsdl_extensible_component *extensible_component;
};

/**
 * Creates wsdl binding struct
 * @return pointer to newly created wsdl binding
 */
AXIS2_DECLARE(axis2_wsdl_binding_t *) axis2_wsdl_binding_create (axis2_env_t **env);

/*************************** Function macros **********************************/

#define AXIS2_WSDL_BINDING_FREE(wsdl_binding, env) \
		((wsdl_binding)->ops->free (wsdl_binding, env))

#define AXIS2_WSDL_BINDING_GET_BOUND_INTERFACE(wsdl_binding, env) \
		((wsdl_binding)->ops->get_bound_interface (wsdl_binding, env))

#define AXIS2_WSDL_BINDING_SET_BOUND_INTERFACE(wsdl_binding, env, interface) \
		((wsdl_binding)->ops->set_bound_interface (wsdl_binding, env, interface))
        
#define AXIS2_WSDL_BINDING_GET_NAME(wsdl_binding, env) \
		((wsdl_binding)->ops->get_name (wsdl_binding, env))

#define AXIS2_WSDL_BINDING_SET_NAME(wsdl_binding, env, qname) \
		((wsdl_binding)->ops->set_name (wsdl_binding, env, qname))        

#define AXIS2_WSDL_BINDING_GET_TARGET_NAMESPACE(wsdl_binding, env) \
		((wsdl_binding)->ops->get_target_namespace (wsdl_binding, env))

#define AXIS2_WSDL_BINDING_GET_BINDING_FAULTS(wsdl_binding, env) \
		((wsdl_binding)->ops->get_binding_faults (wsdl_binding, env)) 
        
#define AXIS2_WSDL_BINDING_SET_BINDING_FAULTS(wsdl_binding, env, faults) \
		((wsdl_binding)->ops->set_binding_faults (wsdl_binding, env, faults))

#define AXIS2_WSDL_BINDING_GET_BINDING_OPS(wsdl_binding, env) \
		((wsdl_binding)->ops->get_binding_ops (wsdl_binding, env))

#define AXIS2_WSDL_BINDING_SET_BINDING_OPS(wsdl_binding, env, ops) \
		((wsdl_binding)->ops->set_binding_ops (wsdl_binding, env, ops)) 
        
#define AXIS2_WSDL_BINDING_ADD_BINDING_OP(wsdl_binding, env, op) \
		((wsdl_binding)->ops->add_binding_op (wsdl_binding, env, op))

#define AXIS2_WSDL_BINDING_GET_BINDING_OP(wsdl_binding, env) \
		((wsdl_binding)->ops->get_binding_op (wsdl_binding, env)) 

#define AXIS2_WSDL_BINDING_ADD_BINDING_FAULT(wsdl_binding, env, op) \
		((wsdl_binding)->ops->add_binding_fault (wsdl_binding, env, fault))

#define AXIS2_WSDL_BINDING_GET_BINDING_FAULT(wsdl_binding, env) \
		((wsdl_binding)->ops->get_binding_fault (wsdl_binding, env)) 
/*************************** End of function macros ***************************/

/** @} */

#ifdef __cplusplus
}
#endif
#endif  /* AXIS2_WSDL_BINDING_H */
