X-Git-Url: http://sraa.de/git/?a=blobdiff_plain;f=dol%2Fsrc%2Fdol%2Fvisitor%2Fhdsd%2Fscd%2Fscd_in_connector.cpp;fp=dol%2Fsrc%2Fdol%2Fvisitor%2Fhdsd%2Fscd%2Fscd_in_connector.cpp;h=e289d254ac18efecd490201ead5381ad16dcd526;hb=8c411cf24ed0eb889191aaeafd8fa1e69081df42;hp=0000000000000000000000000000000000000000;hpb=dea7a4fb1ed110d3ce6e6d9255103d724bd66c0e;p=jump.git diff --git a/dol/src/dol/visitor/hdsd/scd/scd_in_connector.cpp b/dol/src/dol/visitor/hdsd/scd/scd_in_connector.cpp new file mode 100644 index 0000000..e289d25 --- /dev/null +++ b/dol/src/dol/visitor/hdsd/scd/scd_in_connector.cpp @@ -0,0 +1,130 @@ +#include "scd_in_connector.h" + +#include "scd_logging.h" +#include "scd_cont_man_master.h" + + +scd_in_connector::scd_in_connector(scd_simulator &sim, scd_socket* sock): + _sim(sim), _socket(sock), _is_connecting(true) +{ + // register this event handler + _sim.get_poller().register_handler(*this, SOCK_EV_READ | SOCK_EV_CLOSE); + + // set the socket for the reader + _reader.set_socket(*sock); +} + + +scd_in_connector::~scd_in_connector() +{ + if (_is_connecting) + { + _cleanup(); + } +} + + +bool scd_in_connector::is_connecting() { return _is_connecting; } + + +void scd_in_connector::handle_sock_ev(sock_ev events) +{ + if (events & SOCK_EV_CLOSE) + { + scd_debug("in_connector: received close event"); + _cleanup(); + } + else if (events & SOCK_EV_READ) + { + _reader.read(); + + if (!_socket->is_valid()) + { + // connection closed + _cleanup(); + scd_debug("in_connector: connection closed"); + return; + } + + if (!_reader.is_reading() && !_reader.has_command()) + { + // received an illegal command + scd_debug("in_connector: received illegal command"); + _cleanup(); + return; + } + + if (_reader.has_command()) + { + scd_command* cmd = _reader.get_command(); + + if (cmd->get_type() == SCD_CM_REGISTER && + cmd->get_subtype() == SCD_CM_NETSIM) + { + // register host + scd_debug("in_connector: received cmd \"register host\""); + + try + { + // check if we are the master + scd_cont_man_master& master = + dynamic_cast(_sim.get_cont_man()); + + _sim.get_poller().remove_handler(*this); + + master.connect_slave(*cmd, _socket); + + delete cmd; + _is_connecting = false; + return; + } + catch ( std::bad_cast e) + { + scd_warn("slave tried to register"); + delete cmd; + _cleanup(); + return; + } + } // end register host + else if (cmd->get_type() == SCD_CM_REGISTER && + cmd->get_subtype() == SCD_CM_CHANNEL) + { + // register channel + scd_debug("in_connector: received cmd \"register channel\""); + + _sim.get_poller().remove_handler(*this); + + _sim.get_chan_man().connect_channel(*cmd, _socket); + + delete cmd; + _is_connecting = false; + return; + } // end register channel + else + { + // received wrong command + scd_debug("in_connector: received unknown command"); + delete cmd; + _cleanup(); + return; + } + } // end receive command + } // end read event + +} // handle_sock_ev() + + +const scd_socket& scd_in_connector::get_sock() +{ + return *_socket; +} + + +void scd_in_connector::_cleanup() +{ + if (_is_connecting) + _sim.get_poller().remove_handler(*this); + _socket->close(); + delete _socket; + _is_connecting = false; +}