00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
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
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 ¶ms)
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 ¶ms)
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 }