/*
 * 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_SIMPLE_HTTP_SVR_CONN_H
#define AXIS2_SIMPLE_HTTP_SVR_CONN_H

/**
 * @file axis2_simple_http_svr_conn.h
 * @brief Axis2 simple http server connection
 */

#include <axis2.h>
#include <axis2_defines.h>
#include <axis2_env.h>
#include <axis2_http_simple_request.h>
#include <axis2_http_simple_response.h>
#include <axis2_http_response_writer.h>

#ifdef __cplusplus
extern "C"
{
#endif

    typedef struct axis2_simple_http_svr_conn_ops 
                    axis2_simple_http_svr_conn_ops_t;
    typedef struct axis2_simple_http_svr_conn axis2_simple_http_svr_conn_t;
  	
/**
 * @ingroup axis2_core_transport_http
 * @{
 */

/**
 *   \brief Simple HTTP Server Connection ops struct
 */
AXIS2_DECLARE_DATA struct axis2_simple_http_svr_conn_ops
{        
        axis2_status_t (AXIS2_CALL *
		close) (axis2_simple_http_svr_conn_t *svr_conn, 
                axis2_env_t **env);
	
        axis2_bool_t (AXIS2_CALL *
		is_open) (axis2_simple_http_svr_conn_t *svr_conn, 
                  axis2_env_t **env);
	
        axis2_status_t (AXIS2_CALL *
		set_keep_alive) (axis2_simple_http_svr_conn_t *svr_conn, 
                        axis2_env_t **env, 
						axis2_bool_t keep_alive);
	
        axis2_bool_t (AXIS2_CALL *
		is_keep_alive) (axis2_simple_http_svr_conn_t *svr_conn, 
                        axis2_env_t **env);
	
        axis2_stream_t* (AXIS2_CALL *
		get_stream) (axis2_simple_http_svr_conn_t *svr_conn, 
                     axis2_env_t **env);
	
	
        axis2_http_response_writer_t* (AXIS2_CALL *
		get_writer)(axis2_simple_http_svr_conn_t *svr_conn, 
                    axis2_env_t **env);
					
        axis2_http_simple_request_t* (AXIS2_CALL *
		read_request)(axis2_simple_http_svr_conn_t *svr_conn, 
                      axis2_env_t **env);
					  
        axis2_status_t (AXIS2_CALL *
		write_response)(axis2_simple_http_svr_conn_t *svr_conn, 
                        axis2_env_t **env, 
                        axis2_http_simple_response_t *response);
						
        axis2_status_t (AXIS2_CALL *
		set_rcv_timeout)(axis2_simple_http_svr_conn_t *svr_conn, 
                         axis2_env_t **env, 
						 int timeout);
						 
        axis2_status_t (AXIS2_CALL *
		set_snd_timeout)(axis2_simple_http_svr_conn_t *svr_conn, 
                         axis2_env_t **env, 
						 int timeout);
						 
        axis2_char_t* (AXIS2_CALL *
		get_svr_ip) (axis2_simple_http_svr_conn_t *svr_conn, 
                     axis2_env_t **env);
					 
        axis2_status_t (AXIS2_CALL *
		free)(axis2_simple_http_svr_conn_t *svr_conn, 
              axis2_env_t **env);
 };
    
/** 
* \brief Simple HTTP Server Connection struct
*/
AXIS2_DECLARE_DATA struct axis2_simple_http_svr_conn
{
    /** Simple HTTP Server Connection related ops */
    axis2_simple_http_svr_conn_ops_t *ops;
};


/**
 * creates axis2_simple_http_svr_conn struct
 */
AXIS2_DECLARE(axis2_simple_http_svr_conn_t*) 
axis2_simple_http_svr_conn_create(axis2_env_t **env, int sockfd);
  
#define AXIS2_SIMPLE_HTTP_SVR_CONN_CLOSE(svr_conn, env) \
                    ((svr_conn)->ops->close(svr_conn, env))
#define AXIS2_SIMPLE_HTTP_SVR_CONN_IS_OPEN(svr_conn, env) \
                    ((svr_conn)->ops->is_open(svr_conn, env))
#define AXIS2_SIMPLE_HTTP_SVR_CONN_SET_KEEP_ALIVE(svr_conn, env, keep_alive)\
                    ((svr_conn)->ops->set_keep_alive(svr_conn, env, keep_alive))
#define AXIS2_SIMPLE_HTTP_SVR_CONN_IS_KEEP_ALIVE(svr_conn, env) \
                    ((svr_conn)->ops->is_keep_alive(svr_conn, env))
#define AXIS2_SIMPLE_HTTP_SVR_CONN_GET_STREAM(svr_conn, env) \
                    ((svr_conn)->ops->get_stream(svr_conn, env))
#define AXIS2_SIMPLE_HTTP_SVR_CONN_SET_WRITER(svr_conn, env, writer) \
                    ((svr_conn)->ops->set_writer(svr_conn, env, writer))
#define AXIS2_SIMPLE_HTTP_SVR_CONN_READ_REQUEST(svr_conn, env) \
                    ((svr_conn)->ops->read_request(svr_conn, env))
#define AXIS2_SIMPLE_HTTP_SVR_CONN_WRITE_RESPONSE(svr_conn, env, response) \
                    ((svr_conn)->ops->write_response(svr_conn, env, response))
#define AXIS2_SIMPLE_HTTP_SVR_CONN_SET_SND_TIMEOUT(svr_conn, env, timeout) \
                    ((svr_conn)->ops->set_snd_timeout(svr_conn, env, timeout))
#define AXIS2_SIMPLE_HTTP_SVR_CONN_SET_RCV_TIMEOUT(svr_conn, env, timeout) \
                    ((svr_conn)->ops->set_rcv_timeout(svr_conn, env, timeout))
#define AXIS2_SIMPLE_HTTP_SVR_CONN_GET_SVR_IP(svr_conn, env) \
                    ((svr_conn)->ops->get_svr_ip(svr_conn, env))
#define AXIS2_SIMPLE_HTTP_SVR_CONN_FREE(svr_conn, env) \
                    ((svr_conn)->ops->free(svr_conn, env))
    
/** @} */
    
#ifdef __cplusplus
}
#endif

#endif    /* AXIS2_SIMPLE_HTTP_SVR_CONN_H */
