X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;ds=inline;f=source%2Fnetwork%2Fclient.cpp;fp=source%2Fnetwork%2Fclient.cpp;h=4eb4b25f5aefdd81498cd06a66b78925426b03f8;hb=010d8321e982d1684fcbff5bf6fc2bdec7cb7bae;hp=0000000000000000000000000000000000000000;hpb=6109a2122226e1c71e9cc71e4c21036e99e43601;p=r2c2.git diff --git a/source/network/client.cpp b/source/network/client.cpp new file mode 100644 index 0000000..4eb4b25 --- /dev/null +++ b/source/network/client.cpp @@ -0,0 +1,76 @@ +/* $Id$ + +This file is part of the MSP Märklin suite +Copyright © 2009 Mikkosoft Productions, Mikko Rasa +Distributed under the GPL +*/ + +#include "client.h" + +using namespace std; +using namespace Msp; + +namespace Marklin { + +Client::Client(const Catalogue &c): + catalogue(c), + socket(0), + comm(0), + event_disp(0) +{ } + +Client::~Client() +{ + delete comm; + delete socket; + for(map::iterator i=trains.begin(); i!=trains.end(); ++i) + delete i->second; +} + +void Client::use_event_dispatcher(Msp::IO::EventDispatcher &ed) +{ + event_disp = &ed; + if(socket) + event_disp->add(*socket); +} + +void Client::connect(const Net::SockAddr &addr) +{ + socket = new Net::StreamSocket(addr.get_family()); + socket->connect(addr); + if(event_disp) + event_disp->add(*socket); + comm = new Net::Communicator(*socket, proto, *this); +} + +NetTrain &Client::get_train(unsigned addr) +{ + map::iterator i = trains.find(addr); + if(i==trains.end()) + throw KeyError("Unknown train"); + return *i->second; +} + +void Client::receive(const TrainInfoPacket &pkt) +{ + NetTrain *train = new NetTrain(*this, pkt); + trains[pkt.address] = train; + signal_train_added.emit(*train); +} + +void Client::receive(const TrainSpeedPacket &pkt) +{ + get_train(pkt.address).process_packet(pkt); +} + +void Client::receive(const TrainFunctionPacket &pkt) +{ + get_train(pkt.address).process_packet(pkt); +} + +void Client::receive(const TrainStatusPacket &pkt) +{ + get_train(pkt.address).process_packet(pkt); +} + +} // namespace Marklin