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

/**
 * @defgroup axis2_http_simple_request http simple request
 * @ingroup axis2_core_trans_http
 * @{
 */

/**
 * @file axis2_http_simple_request.h
 * @brief axis2 HTTP Simple Request
 */

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


#ifdef __cplusplus
extern "C"
{
#endif

    /** Type name for struct axis2_http_simple_request_ops */
    typedef struct axis2_http_simple_request_ops
                axis2_http_simple_request_ops_t;
    /** Type name for struct axis2_http_simple_request */
    typedef struct axis2_http_simple_request axis2_http_simple_request_t;

    /**
     * HTTP Simple Request ops struct
     * Encapsulator struct for ops of axis2_http_simple_request
     */
    struct axis2_http_simple_request_ops
    {
        /**
         * @param simple_request pointer to simple request
         * @param env pointer to environment struct
         */
        axis2_http_request_line_t *(AXIS2_CALL *
                get_request_line)(
                    const axis2_http_simple_request_t *simple_request,
                    const axis2_env_t *env);

        /**
         * @param simple_request pointer to simple request
         * @param env pointer to environment struct
         * @param request_line pointer to request line
         * @return AXIS2_SUCCESS on success, else AXIS2_FAILURE
         */
        axis2_status_t (AXIS2_CALL *
                set_request_line)(
                    axis2_http_simple_request_t *simple_request,
                    const axis2_env_t *env,
                    axis2_http_request_line_t *request_line);

        /**
         * @param simple_request pointer to simple request
         * @param env pointer to environment struct
         * @param name pointer to name
         */
        axis2_bool_t (AXIS2_CALL *
                contains_header)(
                    axis2_http_simple_request_t *simple_request,
                    const axis2_env_t *env,
                    const axis2_char_t *name);

        /**
         * @param simple_request pointer to simple request
         * @param env pointer to environment struct
         */
        axis2_array_list_t *(AXIS2_CALL *
                get_headers)(
                    const axis2_http_simple_request_t *simple_request,
                    const axis2_env_t *env);

        /**
         * @param simple_request pointer to simple request
         * @param env pointer to environment struct
         * @param str pointer to str
         */
        axis2_http_header_t *(AXIS2_CALL *
                get_first_header)(
                    const axis2_http_simple_request_t *simple_request,
                    const axis2_env_t *env,
                    const axis2_char_t *str);

        /**
         * @param simple_request pointer to simple request
         * @param env pointer to environment struct
         * @param str pointer to str
         * @return AXIS2_SUCCESS on success, else AXIS2_FAILURE
         */
        axis2_status_t (AXIS2_CALL *
                remove_headers)(
                    axis2_http_simple_request_t *simple_request,
                    const axis2_env_t *env,
                    const axis2_char_t *str);

        /**
         * @param simple_request pointer to simple request
         * @param env pointer to environment struct
         * @param header pointer to header
         * @return AXIS2_SUCCESS on success, else AXIS2_FAILURE
         */
        axis2_status_t (AXIS2_CALL *
                add_header)(
                    axis2_http_simple_request_t *simple_request,
                    const axis2_env_t *env,
                    axis2_http_header_t *header);

        /**
         * @param simple_request pointer to simple request
         * @param env pointer to environment struct
         */
        const axis2_char_t *(AXIS2_CALL *
                get_content_type)(
                    const axis2_http_simple_request_t *simple_request,
                    const axis2_env_t *env);

        /**
         * @param simple_request pointer to simple request
         * @param env pointer to environment struct
         */
        const axis2_char_t *(AXIS2_CALL *
                get_charset)(
                    const axis2_http_simple_request_t *simple_request,
                    const axis2_env_t *env);

        /**
         * @param simple_request pointer to simple request
         * @param env pointer to environment struct
         */
        axis2_ssize_t (AXIS2_CALL *
                get_content_length)(
                    const axis2_http_simple_request_t *simple_request,
                    const axis2_env_t *env);

        /**
         * @param simple_request pointer to simple request
         * @param env pointer to environment struct
         */
        axis2_stream_t *(AXIS2_CALL *
                get_body)(
                    const axis2_http_simple_request_t *simple_request,
                    const axis2_env_t *env);

        /**
         * @param simple_request pointer to simple request
         * @param env pointer to environment struct
         * @param buf double pointer to buf
         */
        axis2_ssize_t (AXIS2_CALL *
                get_body_bytes)(
                    const axis2_http_simple_request_t *simple_request,
                    const axis2_env_t *env,
                    char **buf);

        /**
         * @param simple_request pointer to simple request
         * @param env pointer to environment struct
         * @param str pointer to str
         * @return AXIS2_SUCCESS on success, else AXIS2_FAILURE
         */
        axis2_status_t (AXIS2_CALL *
                set_body_string)(
                    axis2_http_simple_request_t *simple_request,
                    const axis2_env_t *env,
                    axis2_char_t *str);

        /**
         * @param simple_request pointer to simple request
         * @param env pointer to environment struct
         * @return AXIS2_SUCCESS on success, else AXIS2_FAILURE
         */
        axis2_status_t (AXIS2_CALL *
                free)(
                    axis2_http_simple_request_t *simple_request,
                    const axis2_env_t *env);

    };

    /**
     * axis2 http simple request
     */
    struct axis2_http_simple_request
    {
        /** operations of axis2 http simple request */
        axis2_http_simple_request_ops_t *ops;
    };

    /**
     * @param env pointer to environment struct
     * @param request_line pointer to request line
     * @param http_headers double pointer to http headers
     * @param http_hdr_count
     * @param content pointer to content
     */
    AXIS2_EXTERN axis2_http_simple_request_t *AXIS2_CALL
    axis2_http_simple_request_create (
        const axis2_env_t *env,
        axis2_http_request_line_t *request_line,
        axis2_http_header_t **http_headers,
        axis2_ssize_t http_hdr_count,
        axis2_stream_t *content);

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

/** Gets the request line.
    @sa axis2_http_simple_request_ops#get_request_line */
#define AXIS2_HTTP_SIMPLE_REQUEST_GET_REQUEST_LINE(simple_request, env) \
                            ((simple_request)->ops->get_request_line\
                            (simple_request, env))

/** Set request line.
    @sa axis2_http_simple_request_ops#set_request_line */
#define AXIS2_HTTP_SIMPLE_REQUEST_SET_REQUEST_LINE\
                            (simple_request, env, request_line) \
                            ((simple_request)->ops->set_request_line\
                            (simple_request, env, request_line))

/** Contains header.
    @sa axis2_http_simple_request_ops#contains_header */
#define AXIS2_HTTP_SIMPLE_REQUEST_CONTAINS_HEADER(simple_request, env, name)\
                            ((simple_request)->ops->contains_header\
                            (simple_request, env, name))

/** Get headers.
    @sa axis2_http_simple_request_ops#get_headers */
#define AXIS2_HTTP_SIMPLE_REQUEST_GET_HEADERS(simple_request, env)\
                            ((simple_request)->ops->get_headers(simple_request, env))

/** Gets the first header.
    @sa axis2_http_simple_request_ops#get_first_header */
#define AXIS2_HTTP_SIMPLE_REQUEST_GET_FIRST_HEADER(simple_request, env, str) \
                            ((simple_request)->ops->get_first_header\
                            (simple_request, env, str))

/** Remove headers.
    @sa axis2_http_simple_request_ops#remove_headers */
#define AXIS2_HTTP_SIMPLE_REQUEST_REMOVE_HEADERS(simple_request, env, str) \
                            ((simple_request)->ops->remove_headers\
                            (simple_request, env, str))

/** Add header.
    @sa axis2_http_simple_request_ops#add_header */
#define AXIS2_HTTP_SIMPLE_REQUEST_ADD_HEADER(simple_request, env, header) \
                            ((simple_request)->ops->add_header\
                            (simple_request, env, header))

/** Gets the content type.
    @sa axis2_http_simple_request_ops#get_content_type */
#define AXIS2_HTTP_SIMPLE_REQUEST_GET_CONTENT_TYPE(simple_request, env)\
                            ((simple_request)->ops->get_content_type\
                            (simple_request, env))

/** Gets the charset.
    @sa axis2_http_simple_request_ops#get_charset */
#define AXIS2_HTTP_SIMPLE_REQUEST_GET_CHARSET(simple_request, env) \
                            ((simple_request)->ops->get_charset\
                            (simple_request, env))

/** Gets the content length.
    @sa axis2_http_simple_request_ops#get_content_length */
#define AXIS2_HTTP_SIMPLE_REQUEST_GET_CONTENT_LENGTH(simple_request, env)\
                            ((simple_request)->ops->get_content_length\
                            (simple_request, env))

/** Gets the body.
    @sa axis2_http_simple_request_ops#get_body */
#define AXIS2_HTTP_SIMPLE_REQUEST_GET_BODY(simple_request, env)\
                            ((simple_request)->ops->get_body\
                            (simple_request, env))

/** Get body bytes.
    @sa axis2_http_simple_request_ops#get_body_bytes */
#define AXIS2_HTTP_SIMPLE_REQUEST_GET_BODY_BYTES(simple_request, env, buf)\
                            ((simple_request)->ops->get_body_bytes\
                            (simple_request, env, buf))

/** Sets the body string.
    @sa axis2_http_simple_request_ops#set_body_string */
#define AXIS2_HTTP_SIMPLE_REQUEST_SET_BODY_STRING(simple_request, env, str)\
                            ((simple_request)->ops->set_body_string\
                            (simple_request, env, str))

/** Frees the http simple request.
    @sa axis2_http_simple_request_ops#free */
#define AXIS2_HTTP_SIMPLE_REQUEST_FREE(simple_request, env) \
                            ((simple_request)->ops->free(simple_request, env))

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

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

#endif                          /* AXIS2_HTTP_SIMPLE_REQUEST_H */
