--- /dev/null
+#include <msp/net/inet6.h>
+#include <msp/net/resolve.h>
+#include "client.h"
+#include "networkinterface.h"
+
+using namespace std;
+using namespace Msp;
+
+NetworkInterface::NetworkInterface(Xinema &x):
+ xinema(x)
+{
+ Net::SockAddr *addr = Net::resolve("::", "34588", Net::INET6);
+ server_sock = new Net::StreamServerSocket(addr->get_family());
+ server_sock->listen(*addr);
+ delete addr;
+
+ server_sock->signal_data_available.connect(sigc::mem_fun(this, &NetworkInterface::connection_available));
+
+ event_disp.add(*server_sock);
+
+ thread = new NetworkThread(*this);
+}
+
+NetworkInterface::~NetworkInterface()
+{
+ thread->terminate();
+ delete thread;
+ delete server_sock;
+}
+
+void NetworkInterface::connection_available()
+{
+ Net::StreamSocket *sock = server_sock->accept();
+ event_disp.add(*sock);
+ clients.push_back(new Client(xinema, sock));
+}
+
+
+NetworkInterface::NetworkThread::NetworkThread(NetworkInterface &n):
+ network(n),
+ done(false)
+{
+ network.event_disp.add(wakeup_pipe);
+ launch();
+}
+
+void NetworkInterface::NetworkThread::terminate()
+{
+ done = true;
+ wakeup_pipe.put('w');
+ join();
+}
+
+void NetworkInterface::NetworkThread::main()
+{
+ while(!done)
+ {
+ network.event_disp.tick();
+
+ for(list<Client *>::iterator i=network.clients.begin(); i!=network.clients.end(); )
+ {
+ if((*i)->is_stale())
+ {
+ delete *i;
+ network.clients.erase(i++);
+ }
+ else
+ ++i;
+ }
+ }
+}