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

/**
 * @file woden_soap_binding_exts.h
 * @brief Axis2 Soap Binding Extensions Interface
 * This interface represents the properties from the SOAP namespace
 * added to the WSDL 2.0 <code>Binding</code> component as part 
 * of the SOAP binding extension. 
 * <p>
 * These include:
 * <ul>
 * <li>{soap version}</li>
 * <li>{soap underlying protocol}</li>
 * <li>{soap mep default}</li>
 * <li>{soap modules}</li>
 * </ul> 
 * 
 */

#include <woden.h>
#include <woden_component_exts.h>
#include <axis2_array_list.h>

/** @defgroup woden_soap_binding_exts Soap Binding Extensions
  * @ingroup woden
  * @{
  */

typedef union woden_soap_binding_exts_base woden_soap_binding_exts_base_t;
typedef struct woden_soap_binding_exts woden_soap_binding_exts_t;
typedef struct woden_soap_binding_exts_ops woden_soap_binding_exts_ops_t;


#ifdef __cplusplus
extern "C"
{
#endif

struct woden_soap_binding_exts_ops
{
   /** 
     * Deallocate memory
     * @return status code
     */
    axis2_status_t (AXIS2_CALL *
    free) (void *soap_binding_exts,
            const axis2_env_t *env);

    axis2_hash_t *(AXIS2_CALL *
    super_objs) (void *soap_binding_exts,
            const axis2_env_t *env);

    woden_obj_types_t (AXIS2_CALL *
    type) (void *soap_binding_exts,
            const axis2_env_t *env);
    /**
     * @return the base implementation class
     */
    struct woden_component_exts *(AXIS2_CALL *
    get_base_impl) (
            void *soap_binding_exts,
            const axis2_env_t *env);

    axis2_char_t *(AXIS2_CALL *
    get_soap_version) (
            void *binding_exts,
            const axis2_env_t *env);

    axis2_uri_t *(AXIS2_CALL *
    get_soap_underlying_protocol) (
            void *binding_exts,
            const axis2_env_t *env);

    axis2_uri_t *(AXIS2_CALL *
    get_soap_mep_default) (
            void *binding_exts,
            const axis2_env_t *env);

    axis2_array_list_t *(AXIS2_CALL *
    get_soap_modules) (
            void *binding_exts,
            const axis2_env_t *env); 


};

struct woden_soap_binding_exts
{
    woden_component_exts_t component_exts;
    woden_soap_binding_exts_ops_t *ops;
};

AXIS2_EXTERN woden_soap_binding_exts_t * AXIS2_CALL
woden_soap_binding_exts_create(
        const axis2_env_t *env);


/***************************Woden C Internal Methods***************************/
AXIS2_EXTERN woden_soap_binding_exts_t * AXIS2_CALL
woden_soap_binding_exts_to_component_exts(
        void *soap_binding_exts,
        const axis2_env_t *env);

AXIS2_EXTERN axis2_status_t AXIS2_CALL
woden_soap_binding_exts_resolve_methods(
        woden_soap_binding_exts_t *soap_binding_exts,
        const axis2_env_t *env,
        woden_soap_binding_exts_t *soap_binding_exts_impl,
        axis2_hash_t *methods);
/************************End of Woden C Internal Methods***********************/

#define WODEN_SOAP_BINDING_EXTS_FREE(soap_binding_exts, env) \
      (((woden_soap_binding_exts_t *) soap_binding_exts)->ops->free(soap_binding_exts, env))

#define WODEN_SOAP_BINDING_EXTS_SUPER_OBJS(soap_binding_exts, env) \
      (((woden_soap_binding_exts_t *) soap_binding_exts)->ops->super_objs(soap_binding_exts, env))

#define WODEN_SOAP_BINDING_EXTS_TYPE(soap_binding_exts, env) \
      (((woden_soap_binding_exts_t *) soap_binding_exts)->ops->type(soap_binding_exts, env))

#define WODEN_SOAP_BINDING_EXTS_GET_BASE_IMPL(soap_binding_exts, env) \
      (((woden_soap_binding_exts_t *) soap_binding_exts)->ops->get_base_impl(soap_binding_exts, env))

#define WODEN_SOAP_BINDING_EXTS_GET_SOAP_VERSION(soap_binding_exts, env) \
      (((woden_soap_binding_exts_t *) soap_binding_exts)->ops->\
        get_soap_version (soap_binding_exts, env))

#define WODEN_SOAP_BINDING_EXTS_GET_SOAP_UNDERLYING_PROTOCOL(soap_binding_exts, env) \
      (((woden_soap_binding_exts_t *) soap_binding_exts)->ops->\
        get_soap_underlying_protocol (soap_binding_exts, env))

#define WODEN_SOAP_BINDING_EXTS_GET_SOAP_MEP_DEFAULT(soap_binding_exts, env) \
      (((woden_soap_binding_exts_t *) soap_binding_exts)->ops->\
        get_soap_mep_default (soap_binding_exts, env))

#define WODEN_SOAP_BINDING_EXTS_GET_SOAP_MODULES(soap_binding_exts, env) \
      (((woden_soap_binding_exts_t *) soap_binding_exts)->ops->\
        get_soap_modules (soap_binding_exts, env))

/** @} */
#ifdef __cplusplus
}
#endif
#endif /* WODEN_SOAP_BINDING_EXTS_H */
