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


/**
  * @file axis2_url.h
  * @brief axis2 URL container implementation
  */
  
#include <axis2.h>
#include <axis2_defines.h>
#include <axis2_env.h>

#ifdef __cplusplus
extern "C"
{
#endif

/**
 * @ingroup axis2_core_transport_http
 * @{
 */

typedef struct axis2_url_ops axis2_url_ops_t;
typedef struct axis2_url axis2_url_t;

    
/** 
 * @brief URL ops struct
 * Encapsulator struct for ops of axis2_url
 */  
AXIS2_DECLARE_DATA struct axis2_url_ops
{
    axis2_char_t* (AXIS2_CALL *
	to_external_form) (axis2_url_t *url, 
                       axis2_env_t **env);
	
    axis2_status_t (AXIS2_CALL *
	set_protocol)(axis2_url_t *url, 
                  axis2_env_t **env, 
	              axis2_char_t *protocol);
	
	
	axis2_char_t* (AXIS2_CALL *
	get_protocol) (axis2_url_t *url, 
                   axis2_env_t **env);
	
	axis2_status_t (AXIS2_CALL *
	set_server)(axis2_url_t *url, 
                axis2_env_t **env, 
				axis2_char_t *server);
	
	
    axis2_char_t* (AXIS2_CALL *
	get_server)(axis2_url_t *url, 
                axis2_env_t **env);
				
				
	axis2_status_t (AXIS2_CALL *
	set_port)(axis2_url_t *url, 
              axis2_env_t **env, 
			  int port);
			  
			  
    int (AXIS2_CALL *
	get_port) (axis2_url_t *url, 
               axis2_env_t **env);
			   
			   
	axis2_status_t (AXIS2_CALL *
	set_path)(axis2_url_t *url, 
              axis2_env_t **env, 
			  axis2_char_t *path);
			  
			  
	axis2_char_t* (AXIS2_CALL *
	get_path)(axis2_url_t *url, 
              axis2_env_t **env);
			  
    axis2_status_t (AXIS2_CALL *
	free) (axis2_url_t *url, 
           axis2_env_t **env);
};

/** 
 * @brief URL struct
 *    Axis2 URL
 */
AXIS2_DECLARE_DATA struct axis2_url
{
    axis2_url_ops_t *ops;    
};


AXIS2_DECLARE(axis2_url_t *) 
axis2_url_create (axis2_env_t **env, 
				  axis2_char_t *protocol, 
				  axis2_char_t *server, 
                  int port, 
                  axis2_char_t *path);


AXIS2_DECLARE(axis2_url_t *)
axis2_url_parse_string(axis2_env_t **env, 
                       axis2_char_t *str_url);

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

#define AXIS2_URL_TO_EXTERNAL_FORM(url, env) \
		((url)->ops->to_external_form(url, env))

#define AXIS2_URL_SET_PROTOCOL(url, env, protocol) \
        ((url)->ops->set_prtocol(url, env, protocol))
		
#define AXIS2_URL_GET_PROTOCOL(url, env) \
		((url)->ops->get_protocol(url, env))
		
#define AXIS2_URL_SET_SERVER(url, env, server) \
        ((url)->ops->set_server(url, env, server))
		
#define AXIS2_URL_GET_SERVER(url, env) \
		((url)->ops->get_server(url, env))
		
#define AXIS2_URL_SET_PORT(url, env, port) \
		((url)->ops->set_port(url, env, port))
		
#define AXIS2_URL_GET_PORT(url, env) \
		((url)->ops->get_port(url, env))
		
#define AXIS2_URL_SET_PATH(url, env, path) \
        ((url)->ops->set_path(url, env, path))
		
#define AXIS2_URL_GET_PATH(url, env) \
		((url)->ops->get_path(url, env))
		
#define AXIS2_URL_FREE(url, env) \
		((url)->ops->free(url, env))

/************************** End of function macros ****************************/    

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

#endif                          /* AXIS2_URL_H */
