dol: initial dol commit
[jump.git] / dol / src / dol / visitor / hdsd / scd / scd_in_connector.cpp
1 #include "scd_in_connector.h"
2
3 #include "scd_logging.h"
4 #include "scd_cont_man_master.h"
5
6
7 scd_in_connector::scd_in_connector(scd_simulator &sim, scd_socket* sock):
8     _sim(sim), _socket(sock), _is_connecting(true)
9 {
10     // register this event handler
11     _sim.get_poller().register_handler(*this, SOCK_EV_READ | SOCK_EV_CLOSE);
12
13     // set the socket for the reader
14     _reader.set_socket(*sock);
15 }
16
17
18 scd_in_connector::~scd_in_connector()
19 {
20     if (_is_connecting)
21     {
22         _cleanup();
23     }
24 }
25
26
27 bool scd_in_connector::is_connecting() { return _is_connecting; }
28
29
30 void scd_in_connector::handle_sock_ev(sock_ev events)
31 {
32     if (events & SOCK_EV_CLOSE)
33     {
34         scd_debug("in_connector: received close event");
35         _cleanup();
36     }
37     else if (events & SOCK_EV_READ)
38     {
39         _reader.read();
40
41         if (!_socket->is_valid())
42         {
43             // connection closed
44             _cleanup();
45             scd_debug("in_connector: connection closed");
46             return;
47         }
48
49         if (!_reader.is_reading() && !_reader.has_command())
50         {
51             // received an illegal command
52             scd_debug("in_connector: received illegal command");
53             _cleanup();
54             return;
55         }
56
57         if (_reader.has_command())
58         {
59             scd_command* cmd = _reader.get_command();
60
61             if (cmd->get_type() == SCD_CM_REGISTER &&
62                     cmd->get_subtype() == SCD_CM_NETSIM)
63             {
64                 // register host
65                 scd_debug("in_connector: received cmd \"register host\"");
66
67                 try
68                 {
69                     // check if we are the master
70                     scd_cont_man_master& master =
71                         dynamic_cast<scd_cont_man_master&>(_sim.get_cont_man());
72
73                     _sim.get_poller().remove_handler(*this);
74
75                     master.connect_slave(*cmd, _socket);
76
77                     delete cmd;
78                     _is_connecting = false;
79                     return;
80                 }
81                 catch ( std::bad_cast e)
82                 {
83                     scd_warn("slave tried to register");
84                     delete cmd;
85                     _cleanup();
86                     return;
87                 }
88             } // end register host
89             else if (cmd->get_type() == SCD_CM_REGISTER &&
90                     cmd->get_subtype() == SCD_CM_CHANNEL)
91             {
92                 // register channel
93                 scd_debug("in_connector: received cmd \"register channel\"");
94
95                 _sim.get_poller().remove_handler(*this);
96
97                 _sim.get_chan_man().connect_channel(*cmd, _socket);
98
99                 delete cmd;
100                 _is_connecting = false;
101                 return;
102             } // end register channel
103             else
104             {
105                 // received wrong command
106                 scd_debug("in_connector: received unknown command");
107                 delete cmd;
108                 _cleanup();
109                 return;
110             }
111         } // end receive command
112     } // end read event
113
114 } // handle_sock_ev()
115
116
117 const scd_socket& scd_in_connector::get_sock()
118 {
119     return *_socket;
120 }
121
122
123 void scd_in_connector::_cleanup()
124 {
125     if (_is_connecting)
126         _sim.get_poller().remove_handler(*this);
127     _socket->close();
128     delete _socket;
129     _is_connecting = false;
130 }