/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements.  See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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_OUT_TRANSPORT_INFO_H
#define AXIS2_HTTP_OUT_TRANSPORT_INFO_H

/**
 * @defgroup axis2_http_out_transport_info http out transport info
 * @ingroup axis2_core_trans_http
 * Description
 * @{
 */

/**
 * @file axis2_http_out_transport_info.h
 * @brief axis2 HTTP Out Transport Info
 */

#include <axis2_const.h>
#include <axis2_defines.h>
#include <axis2_env.h>
#include <axis2_http_simple_response.h>


#ifdef __cplusplus
extern "C"
{
#endif

    /** Type name for struct axis2_http_out_transport_info_ops */
    typedef struct axis2_http_out_transport_info_ops axis2_http_out_transport_info_ops_t;
    /** Type name for struct axis2_http_out_transport_info */
    typedef struct axis2_http_out_transport_info axis2_http_out_transport_info_t;


    /**
     * HTTP Out Transport Info ops struct
     * Encapsulator struct for ops of axis2_http_out_transport_info
     */
    struct axis2_http_out_transport_info_ops
    {
        /**
         * @param info pointer to info
         * @param env pointer to environment struct
         * @param content_type pointer to content type
         */
        int (AXIS2_CALL *
                set_content_type)(
                    axis2_http_out_transport_info_t *info,
                    const axis2_env_t *env,
                    const axis2_char_t *content_type);

        /**
         * @param info pointer to info
         * @param env pointer to environment struct
         * @param encoding pointer to encoding
         * @return AXIS2_SUCCESS on success, else AXIS2_FAILURE
         */
        axis2_status_t (AXIS2_CALL *
                set_char_encoding)(
                    axis2_http_out_transport_info_t *info,
                    const axis2_env_t *env,
                    const axis2_char_t *encoding);

        /**
         * @param out_transport_info pointer to out transport info
         * @param env pointer to environment struct
         * @return AXIS2_SUCCESS on success, else AXIS2_FAILURE
         */
        axis2_status_t (AXIS2_CALL *
                free)(
                    axis2_http_out_transport_info_t *out_transport_info,
                    const axis2_env_t *env);
    };

    /**
     * axis2 http out transport info
     */
    struct axis2_http_out_transport_info
    {
        /** operations of http out transport info */
        axis2_http_out_transport_info_ops_t *ops;
    };


    /**
     * @param env pointer to environment struct
     * @param response pointer to response
     */
    AXIS2_EXTERN axis2_http_out_transport_info_t *AXIS2_CALL
    axis2_http_out_transport_info_create(
        const axis2_env_t *env,
        axis2_http_simple_response_t *response);

    /**
     * Free http_out_transport_info passed as void pointer. This will be
     * cast into appropriate type and then pass the cast object
     * into the http_out_transport_info structure's free method
     * @param transport_info pointer to transport info
     * @param env pointer to environment struct
     */
    AXIS2_EXTERN axis2_status_t AXIS2_CALL
    axis2_http_out_transport_info_free_void_arg(
        void *transport_info,
        const axis2_env_t *env);

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

/** Set content type.
    @sa axis2_http_out_transport_info_ops#set_content_type */
#define AXIS2_HTTP_OUT_TRANSPORT_INFO_SET_CONTENT_TYPE(out_transport_info, \
               env, content_type) ((out_transport_info)->ops->\
               set_content_type (out_transport_info, env, content_type))

/** Set cahr encoding.
    @sa axis2_http_out_transport_info_ops#set_char_encoding */
#define AXIS2_HTTP_OUT_TRANSPORT_INFO_SET_CHAR_ENCODING(out_transport_info,\
               env, encoding) ((out_transport_info)->ops->set_char_encoding \
               (out_transport_info, env, encoding))

/** Free.
    @sa axis2_http_out_transport_info_ops#free */
#define AXIS2_HTTP_OUT_TRANSPORT_INFO_FREE(out_transport_info, env)\
                    ((out_transport_info)->ops->free(out_transport_info, env))

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

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