--- /dev/null
+/* $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