]> git.tdb.fi Git - r2c2.git/blobdiff - source/network/client.cpp
Add networking library and a remote control program
[r2c2.git] / source / network / client.cpp
diff --git a/source/network/client.cpp b/source/network/client.cpp
new file mode 100644 (file)
index 0000000..4eb4b25
--- /dev/null
@@ -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<unsigned, NetTrain *>::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<unsigned, NetTrain *>::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