hsms_cnx.cpp

00001 /*   
00002  *   (c) Copyright 2008 Philipp Skadorov (philipp_s@users.sourceforge.net)
00003  *
00004  *   This file is part of FREESECS.
00005  *
00006  *   FREESECS is free software: you can redistribute it and/or modify
00007  *   it under the terms of the GNU General Public License as published by
00008  *   the Free Software Foundation, either version 3 of the License, or
00009  *   (at your option) any later version.
00010  *
00011  *   FREESECS is distributed in the hope that it will be useful,
00012  *   but WITHOUT ANY WARRANTY; without even the implied warranty of
00013  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00014  *   GNU General Public License for more details.
00015  *
00016  *   You should have received a copy of the GNU General Public License
00017  *   along with FREESECS, see COPYING.
00018  *   If not, see <http://www.gnu.org/licenses/>.
00019  */
00020 #include <iostream>
00021 #include <pthread.h>
00022 #include "hsms_socket.h"
00023 #include "hsms_statemachine.h"
00024 #include "hsms_cnx.h"
00025 
00026 using namespace freesecs;
00027 
00028 #define HSMS_CNX_LOG_LEVEL 10
00029 
00030 #define ASSERT_RETURN_VALUE(a, e, v) if((e) != (a)){return v;} 
00031 hsms_cnx_t::hsms_cnx_t (const char *name, 
00032                         uint16_t session_id, 
00033                         const char *remote_ip, 
00034                         unsigned remote_port)
00035 :_socket(name, remote_ip, remote_port)
00036 ,_name(name)
00037 ,_session_id(session_id)
00038 {
00039     _socket.msg_signal.add_handler(this, &freesecs::hsms_cnx_t::sock_msg_rcv_handler);
00040     _socket.cnx_state_signal.add_handler(this, &freesecs::hsms_cnx_t::sock_cnx_state_change_handler);
00041     _socket.cnx_failed_signal.add_handler(this, &freesecs::hsms_cnx_t::sock_cnx_failed_handler);
00042 
00043     _socket.data_partially_recvd.add_handler(this, &freesecs::hsms_cnx_t::sock_data_partially_recvd_handler);
00044     _socket.recv_error.add_handler(this, &freesecs::hsms_cnx_t::sock_recv_error_handler);
00045 }
00046 
00047 hsms_cnx_t::hsms_cnx_t (const char *name, 
00048                         uint16_t session_id, 
00049                         unsigned local_port)
00050 :_socket(name, local_port)
00051 ,_name(name)
00052 ,_session_id(session_id)
00053 {
00054     _socket.msg_signal.add_handler(this, &freesecs::hsms_cnx_t::sock_msg_rcv_handler);
00055     _socket.cnx_state_signal.add_handler(this, &freesecs::hsms_cnx_t::sock_cnx_state_change_handler);
00056     _socket.cnx_failed_signal.add_handler(this, &freesecs::hsms_cnx_t::sock_cnx_failed_handler);
00057 
00058     _socket.data_partially_recvd.add_handler(this, &freesecs::hsms_cnx_t::sock_data_partially_recvd_handler);
00059     _socket.recv_error.add_handler(this, &freesecs::hsms_cnx_t::sock_recv_error_handler);
00060 }
00061 
00062 
00063 hsms_cnx_t::~hsms_cnx_t ()
00064 {
00065 }
00066 
00067 const char *
00068 hsms_cnx_t::name() const
00069 {
00070     return _name.c_str();
00071 }
00072 
00073 uint16_t 
00074 hsms_cnx_t::session_id() const
00075 {
00076     return _session_id;
00077 }
00078 
00079 int freesecs::hsms_cnx_t::start()
00080 {
00081     return _socket.connect();
00082 }
00083 
00084 
00085 int
00086 hsms_cnx_t::stop ()
00087 {
00088     TRACE_DEBUG(HSMS_CNX_LOG_LEVEL, "stopping %s...", _name.c_str());
00089     hsms_event_t ev = {e_cnx_term_req,};
00090     *this << ev;
00091     return 0;
00092 }
00093 
00094 int
00095 hsms_cnx_t::send (pdata_t pdata)
00096 {
00097     data_msg<data_t> msg;
00098 
00099     if((HSMS_LEN_BYTES_LEN + HSMS_HDR_LEN) < pdata->size())
00100     {
00101         msg.set_session_id(*pdata, _session_id);
00102     }
00103 
00104     hsms_event_t ev = {e_datamsg_send_req, pdata};
00105     return process_event(ev);
00106 }
00107 
00108 int 
00109 hsms_cnx_t::sock_cnx_state_change_handler(const hsms_socket_t::cnx_state_et& state)
00110 {
00111     hsms_event_t ev;
00112 
00113     switch(state)
00114     {
00115         case hsms_socket_t::NOT_CONNECTED:
00116 #if 0
00117             //hack to avoid re-entrance
00118             if(e_hsms_not_connected != get_state())
00119             {
00120                 ev.type = e_tcpip_broken;
00121                 *this << ev;
00122             }
00123 #endif
00124         break;
00125         case hsms_socket_t::CONNECTING:
00126         break;
00127         case hsms_socket_t::CONNECTED:
00128             ev.type = e_tcpip_established;
00129             *this << ev;
00130         break;
00131         default:
00132         break;
00133     }
00134     return 0;
00135 }
00136 
00137 int
00138 hsms_cnx_t::sock_cnx_failed_handler()
00139 {
00140     hsms_event_t ev = {e_tcpip_cnx_failure,};
00141     *this << ev;
00142     return 0;
00143 }
00144 
00145 int 
00146 hsms_cnx_t::sock_msg_rcv_handler(const pdata_t& pdata)
00147 {
00148     hsms_event_t ev = {e_hsms_msg_rcvd, pdata};
00149     *this << ev;
00150 
00151     return 0;
00152 }
00153 
00154 int
00155 hsms_cnx_t::sock_data_partially_recvd_handler()
00156 {
00157     hsms_event_t ev = {e_data_received,};
00158     *this << ev;
00159     return 0;
00160 }
00161 
00162 int 
00163 hsms_cnx_t::sock_recv_error_handler()
00164 {
00165     hsms_event_t ev = {e_tcpip_error,};
00166     *this << ev;
00167     return 0;
00168 }
00169 
00170 int 
00171 hsms_cnx_t::open_tcp()
00172 {
00173     return _socket.connect();
00174 }
00175 
00176 int 
00177 hsms_cnx_t::close_tcp()
00178 {
00179     return _socket.disconnect();
00180 }
00181 
00182 int 
00183 hsms_cnx_t::send_over_tcp(hsms_socket_t::pdata_t pd)
00184 {
00185     return _socket.send(pd);
00186 }
00187 
00188 int 
00189 hsms_cnx_t::recv_from_tcp(hsms_socket_t::pdata_t pd)
00190 {
00191     return _socket.receive(pd);
00192 }
00193 
00194 void 
00195 hsms_cnx_t::hsms_msg_received(hsms_socket_t::pdata_t pd)
00196 {
00197     rx_signal(pd);
00198 }
00199 
00200 hsms_passive_cnx_t::hsms_passive_cnx_t(const hsms_passive_params_t &params)
00201 :hsms_cnx_t(params.name.c_str(), params.session_id, params.port)
00202 ,passive_hsms_sm_t(params)
00203 {
00204 }
00205 
00206 hsms_passive_cnx_t::~hsms_passive_cnx_t()
00207 {
00208 }
00209 
00210 hsms_active_cnx_t::hsms_active_cnx_t(const hsms_active_params_t &params)
00211 :hsms_cnx_t(params.name.c_str(), params.session_id, params.ip.c_str(), params.port)
00212 ,active_hsms_sm_t(params)
00213 {
00214 }
00215 
00216 hsms_active_cnx_t::~hsms_active_cnx_t()
00217 {
00218 }

Generated on Fri Oct 3 15:30:01 2008 for FREESECS hsms by  doxygen 1.5.1