]> git.tdb.fi Git - xinema.git/blobdiff - source/networkinterface.cpp
Add a simple networked command interface
[xinema.git] / source / networkinterface.cpp
diff --git a/source/networkinterface.cpp b/source/networkinterface.cpp
new file mode 100644 (file)
index 0000000..74c80dc
--- /dev/null
@@ -0,0 +1,71 @@
+#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;
+               }
+       }
+}