]> git.tdb.fi Git - xinema.git/blob - source/networkinterface.cpp
74c80dc6263aa9a17963f26ffa3e4da2a4bb09dc
[xinema.git] / source / networkinterface.cpp
1 #include <msp/net/inet6.h>
2 #include <msp/net/resolve.h>
3 #include "client.h"
4 #include "networkinterface.h"
5
6 using namespace std;
7 using namespace Msp;
8
9 NetworkInterface::NetworkInterface(Xinema &x):
10         xinema(x)
11 {
12         Net::SockAddr *addr = Net::resolve("::", "34588", Net::INET6);
13         server_sock = new Net::StreamServerSocket(addr->get_family());
14         server_sock->listen(*addr);
15         delete addr;
16
17         server_sock->signal_data_available.connect(sigc::mem_fun(this, &NetworkInterface::connection_available));
18
19         event_disp.add(*server_sock);
20
21         thread = new NetworkThread(*this);
22 }
23
24 NetworkInterface::~NetworkInterface()
25 {
26         thread->terminate();
27         delete thread;
28         delete server_sock;
29 }
30
31 void NetworkInterface::connection_available()
32 {
33         Net::StreamSocket *sock = server_sock->accept();
34         event_disp.add(*sock);
35         clients.push_back(new Client(xinema, sock));
36 }
37
38
39 NetworkInterface::NetworkThread::NetworkThread(NetworkInterface &n):
40         network(n),
41         done(false)
42 {
43         network.event_disp.add(wakeup_pipe);
44         launch();
45 }
46
47 void NetworkInterface::NetworkThread::terminate()
48 {
49         done = true;
50         wakeup_pipe.put('w');
51         join();
52 }
53
54 void NetworkInterface::NetworkThread::main()
55 {
56         while(!done)
57         {
58                 network.event_disp.tick();
59
60                 for(list<Client *>::iterator i=network.clients.begin(); i!=network.clients.end(); )
61                 {
62                         if((*i)->is_stale())
63                         {
64                                 delete *i;
65                                 network.clients.erase(i++);
66                         }
67                         else
68                                 ++i;
69                 }
70         }
71 }