/*
 * 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_const.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, 
                const axis2_env_t *env);
   
        axis2_bool_t (AXIS2_CALL *
      is_open) (axis2_simple_http_svr_conn_t *svr_conn, 
                  const axis2_env_t *env);
   
        axis2_status_t (AXIS2_CALL *
      set_keep_alive) (axis2_simple_http_svr_conn_t *svr_conn, 
                        const 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, 
                        const axis2_env_t *env);
   
        axis2_stream_t* (AXIS2_CALL *
      get_stream) (axis2_simple_http_svr_conn_t *svr_conn, 
                     const axis2_env_t *env);
   
   
        axis2_http_response_writer_t* (AXIS2_CALL *
      get_writer)(axis2_simple_http_svr_conn_t *svr_conn, 
                    const axis2_env_t *env);
               
        axis2_http_simple_request_t* (AXIS2_CALL *
      read_request)(axis2_simple_http_svr_conn_t *svr_conn, 
                      const axis2_env_t *env);
                 
        axis2_status_t (AXIS2_CALL *
      write_response)(axis2_simple_http_svr_conn_t *svr_conn, 
                        const 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, 
                         const axis2_env_t *env, 
                   int timeout);
                   
        axis2_status_t (AXIS2_CALL *
      set_snd_timeout)(axis2_simple_http_svr_conn_t *svr_conn, 
                         const axis2_env_t *env, 
                   int timeout);
                   
        axis2_char_t* (AXIS2_CALL *
      get_svr_ip) (axis2_simple_http_svr_conn_t *svr_conn, 
                     const axis2_env_t *env);
                
        axis2_status_t (AXIS2_CALL *
      free)(axis2_simple_http_svr_conn_t *svr_conn, 
              const 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_EXTERN axis2_simple_http_svr_conn_t* AXIS2_CALL 
axis2_simple_http_svr_conn_create(const 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 */
