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

/**
 * @file axis2_svc_name.h
 * @brief Axis2 core addressing interface
 */

#include <axis2_defines.h>
#include <axis2_env.h>
#include <axis2.h>
#include <axis2_qname.h>

#ifdef __cplusplus
extern "C"
{
#endif

    struct axis2_svc_name;
    struct axis2_svc_name_ops;
    
/**
 * @defgroup axis2_svc_name Addressing service name
 * @ingroup axis2_addr
 * @{
 */

/**
 *   \brief Dispatcher ops struct
 */
 AXIS2_DECLARE_DATA typedef struct axis2_svc_name_ops
    { 
        /**
         * Method getName
         *
         * @return
         */
        axis2_qname_t* (AXIS2_CALL *get_qname)(struct axis2_svc_name *svc_name, 
                                                       axis2_env_t **env);
        /**
         * Method setName
         *
         * @param qname
         */
        axis2_status_t (AXIS2_CALL *set_qname)(struct axis2_svc_name *svc_name, 
                                                       axis2_env_t **env, axis2_qname_t *qname);
        /**
         * Method getEndpointName
         *
         * @return
         */
        axis2_char_t* (AXIS2_CALL *get_endpoint_name)(struct axis2_svc_name *svc_name, 
                                                       axis2_env_t **env);
        /**
         * Method setEndpointName
         *
         * @param endpoint_name
         */
        axis2_status_t (AXIS2_CALL *set_endpoint_name)(struct axis2_svc_name *svc_name, 
                                                       axis2_env_t **env, axis2_char_t *endpoint_name);
        axis2_status_t (AXIS2_CALL *free)(struct axis2_svc_name *svc_name, 
                                                       axis2_env_t **env);
    } axis2_svc_name_ops_t;
	
   /** 
    * \brief Dispatcher struct
    */
    typedef struct axis2_svc_name
    {
        /** Dispatcher related ops */
        axis2_svc_name_ops_t *ops;
    } axis2_svc_name_t;


/**
 * creates svc_name struct
 *
 * @param value
 * @param relationship_type
 */
AXIS2_DECLARE(axis2_svc_name_t*) axis2_svc_name_create(axis2_env_t **env, axis2_qname_t *qname, axis2_char_t *endpoint_name) ;
    
#define AXIS2_SVC_NAME_GET_QNAME(svc_name, env) ((svc_name)->ops->get_qname(svc_name, env))
#define AXIS2_SVC_NAME_SET_QNAME(svc_name, env, qname) ((svc_name)->ops->set_qname(svc_name, env, qname))
#define AXIS2_SVC_NAME_GET_ENDPOINT_NAME(svc_name, env) ((svc_name)->ops->get_endpoint_name(svc_name, env))
#define AXIS2_SVC_NAME_SET_ENDPOINT_NAME(svc_name, env, endpoint_name) ((svc_name)->ops->set_endpoint_name(svc_name, env, endpoint_name))
#define AXIS2_SVC_NAME_FREE(svc_name, env) ((svc_name)->ops->free(svc_name, env))

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

#endif    /* AXIS2_SVC_NAME_H */
