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

/**
 * @file axis2_wsdl_svc.h
 * @brief axis2 wsdl service interface
 */

#include <axis2.h>
#include <axis2_error.h>
#include <axis2_defines.h>
#include <axis2_env.h>
#include <axis2_allocator.h>
#include <axis2_string.h>
#include <axis2_hash.h>
#include <axis2_qname.h>
#include <axis2_wsdl_interface.h>
#include <axis2_wsdl_component.h>
#include <axis2_wsdl_endpoint.h>

#ifdef __cplusplus
extern "C"
{
#endif
	
/** @defgroup axis2_wsdl_svc Wsdl Service
  * @ingroup axis2_wsdl
  * @{
  */

struct axis2_wsdl_endpoint; 
struct axis2_wsdl_interface; 
struct axis2_wsdl_component;    
typedef struct axis2_wsdl_svc_ops axis2_wsdl_svc_ops_t;
typedef struct axis2_wsdl_svc axis2_wsdl_svc_t;

#define AXIS2_STYLE_RPC  "rpc"
#define AXIS2_STYLE_DOC  "doc"
#define AXIS2_STYLE_MSG  "msg"
/** 
 * @brief Wsdl Service ops struct
 * Encapsulator struct for ops of axis2_wsdl_service
 */
struct axis2_wsdl_svc_ops
{
    /** Deallocate memory
     * @return status code
     */
	axis2_status_t (AXIS2_CALL *free) (axis2_wsdl_svc_t *wsdl_svc, 
                                        axis2_env_t **env);

    /**
     * Get wsdl service name
     * @return wsdl service name
     */
    axis2_qname_t * (AXIS2_CALL *get_qname)(axis2_wsdl_svc_t *wsdl_svc,
                                            axis2_env_t **env);

    /**
     * Set wsdl serivce name
     * @param set wsdl service name
     */
    axis2_status_t (AXIS2_CALL *set_qname) (axis2_wsdl_svc_t *wsdl_svc,
                                            axis2_env_t **env,
                                            axis2_qname_t *qname);
    
    /**
     * Method getEndpoints
     *
     * @return
     */
    axis2_hash_t *(AXIS2_CALL *
    get_endpoints) (axis2_wsdl_svc_t *wsdl_svc,
                                        axis2_env_t **env);
    
    /**
     * Method setEndpoints
     *
     * @param endpoints
     */
    axis2_status_t (AXIS2_CALL *
    set_endpoints) (axis2_wsdl_svc_t *wsdl_svc,
                                    axis2_env_t **env,
                                    axis2_hash_t *endpoints);
    
    /**
     * Will add a WSDLEndpoint object to the WOM keyed with qname;
     *
     * @param endpoint
     */
    axis2_status_t (AXIS2_CALL *
    set_endpoint) (axis2_wsdl_svc_t *wsdl_svc,
                                    axis2_env_t **env,
                                    struct axis2_wsdl_endpoint *endpoint);
    
    /**
     * Endpoint will be retrived by its qname.
     *
     * @param qName qname of the Service
     * @return <code>WSDLEndpoint</code> Object.
     */
    struct axis2_wsdl_endpoint * (AXIS2_CALL *
    get_endpoint) (axis2_wsdl_svc_t *wsdl_svc,
                                    axis2_env_t **env,
                                    axis2_qname_t *qname);

    /**
     * If the Name of the <code>WSDLService</code> is not set a
     * <code>WSDLProcessingException</code> will be thrown.
     *
     * @return Target Namespace as a <code>String</code>
     */
    axis2_char_t *(AXIS2_CALL *
    get_namespace) (axis2_wsdl_svc_t *wsdl_svc,
                                    axis2_env_t **env);

    /**
     * Method getServiceInterface
     *
     * @return
     */
    struct axis2_wsdl_interface * (AXIS2_CALL *
    get_svc_interface) (axis2_wsdl_svc_t *wsdl_svc,
                                        axis2_env_t **env);
    
    /**
     * Method setServiceInterface
     *
     * @param svc_interface
     */
    axis2_status_t (AXIS2_CALL *
    set_svc_interface) (axis2_wsdl_svc_t *wsdl_svc,
                                        axis2_env_t **env,
                                        struct axis2_wsdl_interface *svc_interface);

};

/**
 * @brief Wsdl Service struct
 * Axis2 Wsdl Service
 */
struct axis2_wsdl_svc
{
	axis2_wsdl_svc_ops_t *ops;
    struct axis2_wsdl_component *wsdl_component;
};

/** create Wsdl Service struct
 * @return pointer to newly created wsdl service
 */
AXIS2_DECLARE(axis2_wsdl_svc_t *) 
axis2_wsdl_svc_create (axis2_env_t **env);

/**************************** Start of function macros ************************/

#define AXIS2_WSDL_SVC_FREE(wsdl_svc, env) ((wsdl_svc)->ops->free (wsdl_svc, \
		env))

#define AXIS2_WSDL_SVC_GET_QNAME(wsdl_svc, env) \
        ((wsdl_svc)->ops->get_qname (wsdl_svc, env))

#define AXIS2_WSDL_SVC_SET_QNAME(wsdl_svc, env, qname) \
        ((wsdl_svc)->ops->set_qname (wsdl_svc, env, qname))

#define AXIS2_WSDL_SVC_GET_ENDPOINTS(wsdl_svc, env) \
        ((wsdl_svc)->ops->get_endpoints(wsdl_svc, env))

#define AXIS2_WSDL_SVC_SET_ENDPOINTS(wsdl_svc, env, endpoints) \
        ((wsdl_svc)->ops->set_endpoints(wsdl_svc, env, endpoints))

#define AXIS2_WSDL_SVC_SET_ENDPOINT(wsdl_svc, env, endpoint) \
        ((wsdl_svc)->ops->set_endpoint(wsdl_svc, env, endpoint))

#define AXIS2_WSDL_SVC_GET_ENDPOINT(wsdl_svc, env, qname) \
        ((wsdl_svc)->ops->get_endpoint(wsdl_svc, env, qname))

#define AXIS2_WSDL_SVC_GET_NAMESPACE(wsdl_svc, env) \
        ((wsdl_svc)->ops->get_namespace(wsdl_svc, env))
        
#define AXIS2_WSDL_SVC_GET_SVC_INTERFACE(wsdl_svc, env) \
        ((wsdl_svc)->ops->get_svc_interface(wsdl_svc, env))        

#define AXIS2_WSDL_SVC_SET_SVC_INTERFACE(wsdl_svc, env, svc_interface) \
        ((wsdl_svc)->ops->set_svc_interface(wsdl_svc, env, svc_interface))
        
/**************************** End of function macros **************************/
/** @} */
#ifdef __cplusplus
}
#endif
#endif /* AXIS2_WSDL_SVC_H  */
