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


/**
  * @file axis2_simple_http_response.h
  * @brief axis2 HTTP Simple Response
  */

#include <axis2_const.h>
#include <axis2_defines.h>
#include <axis2_env.h>
#include <axis2_array_list.h>
#include <axis2_http_status_line.h>
#include <axis2_http_header.h>
#include <axis2_stream.h>


#ifdef __cplusplus
extern "C"
{
#endif

/**
 * @ingroup axis2_core_transport_http
 * @{
 */
    typedef struct axis2_http_simple_response_ops 
            axis2_http_simple_response_ops_t;
    typedef struct axis2_http_simple_response axis2_http_simple_response_t; 
    
/** 
 * @brief HTTP Simple Response ops struct
 * Encapsulator struct for ops of axis2_http_simple_response
 */  
AXIS2_DECLARE_DATA struct axis2_http_simple_response_ops
{
    axis2_status_t (AXIS2_CALL *
	set_status_line)(struct axis2_http_simple_response *simple_response, 
                    axis2_env_t **env, 
	                const axis2_char_t *http_ver, 
                    const int status_code, 
	                const axis2_char_t *phrase);
    
    axis2_char_t* (AXIS2_CALL *
	get_phrase)(axis2_http_simple_response_t *simple_response, 
                axis2_env_t **env);
    
    int (AXIS2_CALL *
	get_status_code)(axis2_http_simple_response_t *simple_response, 
                    axis2_env_t **env);

    axis2_char_t* (AXIS2_CALL *
	get_http_version)(axis2_http_simple_response_t *simple_response, 
                      axis2_env_t **env);

    axis2_char_t* (AXIS2_CALL *
	get_status_line)(axis2_http_simple_response_t *simple_response, 
                     axis2_env_t **env);

    axis2_bool_t (AXIS2_CALL *
	contains_header)(axis2_http_simple_response_t *simple_response, 
                     axis2_env_t **env, 
					 axis2_char_t *name);

    axis2_array_list_t* (AXIS2_CALL *
	get_headers)(axis2_http_simple_response_t *simple_response, 
                 axis2_env_t **env);
    
    axis2_http_header_t* (AXIS2_CALL *
	get_first_header)(axis2_http_simple_response_t *simple_response, 
                      axis2_env_t **env, 
					  axis2_char_t *str);
    
    axis2_status_t (AXIS2_CALL *
	remove_headers)(axis2_http_simple_response_t *simple_response, 
                    axis2_env_t **env, 
					const axis2_char_t *str);
    
    axis2_status_t (AXIS2_CALL *
	set_header)(axis2_http_simple_response_t *simple_response, 
                axis2_env_t **env, 
				axis2_http_header_t* header);

    axis2_status_t (AXIS2_CALL *
	set_headers)(axis2_http_simple_response_t *simple_response, 
                 axis2_env_t **env, 
				 axis2_http_header_t** headers, 
                 axis2_ssize_t array_size);
    
    axis2_char_t* (AXIS2_CALL *
	get_charset)(axis2_http_simple_response_t *simple_response, 
                 axis2_env_t **env);
    
    axis2_ssize_t (AXIS2_CALL *
	get_content_length)(axis2_http_simple_response_t *simple_response, 
                        axis2_env_t **env);
    
    axis2_char_t* (AXIS2_CALL *
	get_content_type)(axis2_http_simple_response_t *simple_response, 
                      axis2_env_t **env);

    axis2_status_t (AXIS2_CALL *
	set_body_string)(axis2_http_simple_response_t *simple_response, 
                     axis2_env_t **env, 
					 axis2_char_t *str);
    
    axis2_status_t (AXIS2_CALL *
	set_body_stream)(axis2_http_simple_response_t *simple_response, 
                     axis2_env_t **env, 
					 axis2_stream_t *stream);    

    axis2_stream_t* (AXIS2_CALL *
	get_body)(axis2_http_simple_response_t *simple_response, 
              axis2_env_t **env);

    axis2_ssize_t (AXIS2_CALL *
	get_body_bytes)(axis2_http_simple_response_t *simple_response, 
                    axis2_env_t **env, 
					axis2_char_t **buf);

    axis2_status_t (AXIS2_CALL *
	free)(axis2_http_simple_response_t *simple_response, 
          axis2_env_t **env);
    
};

/** 
  * @brief HTTP Simple Response struct
  *    Axis2 HTTP Simple Response
  */
AXIS2_DECLARE_DATA struct axis2_http_simple_response
{
    axis2_http_simple_response_ops_t *ops;    
};


AXIS2_DECLARE(axis2_http_simple_response_t *) 
axis2_http_simple_response_create (axis2_env_t **env,
                        axis2_http_status_line_t *status_line,
                        const axis2_http_header_t **http_headers,
                        const axis2_ssize_t http_hdr_count,
                        axis2_stream_t *content);

AXIS2_DECLARE(axis2_http_simple_response_t *) 
axis2_http_simple_response_create_default(axis2_env_t **env);
    
/************************** Start of function macros **************************/


#define AXIS2_HTTP_SIMPLE_RESPONSE_SET_STATUS_LINE(\
					simple_response, env, http_version, status_code, phrase)\
                    ((simple_response)->ops->set_status_line\
                    (simple_response, env, http_version, status_code, phrase))
#define AXIS2_HTTP_SIMPLE_RESPONSE_GET_PHRASE\
                    (simple_response, env) ((simple_response)->ops->get_phrase\
                    (simple_response, env))
#define AXIS2_HTTP_SIMPLE_RESPONSE_GET_HTTP_VERSION(simple_response, env)\
                    ((simple_response)->ops->get_http_version\
                    (simple_response, env))
#define AXIS2_HTTP_SIMPLE_RESPONSE_GET_STATUS_CODE(simple_response, env)\
                    ((simple_response)->ops->get_status_code\
                    (simple_response, env))
#define AXIS2_HTTP_SIMPLE_RESPONSE_GET_STATUS_LINE(simple_response, env) \
                    ((simple_response)->ops->get_status_line\
                    (simple_response, env))
#define AXIS2_HTTP_SIMPLE_RESPONSE_CONTAINS_HEADER(simple_response, env, name)\
                    ((simple_response)->ops->contains_header\
                    (simple_response, env, name))
#define AXIS2_HTTP_SIMPLE_RESPONSE_GET_HEADERS(simple_response, env) \
                    ((simple_response)->ops->get_headers\
                    (simple_response, env))
#define AXIS2_HTTP_SIMPLE_RESPONSE_GET_FIRST_HEADER(simple_response, env, str) \
                    ((simple_response)->ops->get_first_header\
                    (simple_response, env, str))
#define AXIS2_HTTP_SIMPLE_RESPONSE_REMOVE_HEADERS(simple_response, env, str)\
                    ((simple_response)->ops->remove_headers\
                    (simple_response, env, str))
#define AXIS2_HTTP_SIMPLE_RESPONSE_SET_HEADER(simple_response, env, header) \
                    ((simple_response)->ops->set_header\
                    (simple_response, env, header))
#define AXIS2_HTTP_SIMPLE_RESPONSE_SET_HEADERS(simple_response, env, headers) \
                    ((simple_response)->ops->set_headers\
                    (simple_response, env, headers))
#define AXIS2_HTTP_SIMPLE_RESPONSE_GET_CHARSET(simple_response, env) \
                    ((simple_response)->ops->get_charset(simple_response, env))
#define AXIS2_HTTP_SIMPLE_RESPONSE_GET_CONTENT_LENGTH(simple_response, env) \
                    ((simple_response)->ops->get_content_length\
                    (simple_response, env))
#define AXIS2_HTTP_SIMPLE_RESPONSE_GET_CONTENT_TYPE(simple_response, env) \
                    ((simple_response)->ops->get_content_type\
                    (simple_response, env))
#define AXIS2_HTTP_SIMPLE_RESPONSE_SET_BODY_STRING(simple_response, env, str)\
                    ((simple_response)->ops->set_body_string\
                    (simple_response, env, str))
#define AXIS2_HTTP_SIMPLE_RESPONSE_SET_BODY_STREAM(simple_response, env, stream)\
                    ((simple_response)->ops->set_body_stream\
                    (simple_response, env, stream))
#define AXIS2_HTTP_SIMPLE_RESPONSE_GET_BODY(simple_response, env)\
                    ((simple_response)->ops->get_body\
                    (simple_response, env))
#define AXIS2_HTTP_SIMPLE_RESPONSE_GET_BODY_BYTES(simple_response, env, buf)\
                    ((simple_response)->ops->get_body_bytes\
                    (simple_response, env, buf))
#define AXIS2_HTTP_SIMPLE_RESPONSE_FREE(simple_response, env)\
                    ((simple_response)->ops->free(simple_response, env))

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

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

#endif                          /* AXIS2_HTTP_SIMPLE_RESPONSE_H */
