c749c59baa4d086d07149dc8e096e4db97559630
[mediaserv.git] / Server / SimpleHTTPServer.cc
1 // $Id$
2 //
3 // Copyright (C) 2006 
4
5 // Definition of non-inline non-template functions
6
7 // TODO: success logging
8 // TODO: limit max number of clients
9
10 #include "SimpleHTTPServer.hh"
11 //#include "SimpleHTTPServer.ih"
12
13 // Custom includes
14 #include "Utils/membind.hh"
15
16 //#include "SimpleHTTPServer.mpp"
17 #define prefix_
18 ///////////////////////////////cc.p////////////////////////////////////////
19
20 g0dil::mediaserv::SimpleHTTPServer * g0dil::mediaserv::SimpleHTTPServer::instance_ = 0;
21
22 prefix_ g0dil::mediaserv::SimpleHTTPServer::SimpleHTTPServer(ServerHandle socket,
23                                                              HTTPLogger & logger)
24     : socket_(socket), logger_(logger)
25 {
26     instance_ = this;
27     satcom::lib::Scheduler::instance()
28         .add(socket_, 
29              satcom::lib::membind(&SimpleHTTPServer::newConnection,this),
30              satcom::lib::Scheduler::EV_READ);
31 }
32
33 prefix_ g0dil::mediaserv::SimpleHTTPServer::~SimpleHTTPServer()
34 {
35     instance_ = 0;
36 }
37
38 prefix_ void
39 g0dil::mediaserv::SimpleHTTPServer::newConnection(ServerHandle handle,
40                                                   satcom::lib::Scheduler::EventId event)
41 {
42     if (event != satcom::lib::Scheduler::EV_READ) {
43         logger_.failedRequest("unexpected event on server socket .. shuting down ..");
44         satcom::lib::Scheduler::instance().terminate();
45         return;
46     }
47     try {
48         ServerHandle::ClientSocketHandle client (socket_.accept());
49         if (! client.valid()) {
50             logger_.failedRequest("accept() would block !?");
51             return;
52         }
53         connections_.insert(HTTPConnection::ptr(new HTTPConnection(client,*this,logger_)));
54     }
55     catch (std::exception & ex) {
56         logger_.failedRequest(ex.what());
57     }
58 }
59
60 prefix_ void g0dil::mediaserv::SimpleHTTPServer::done(HTTPConnection::ptr connection)
61 {
62     connections_.erase(connection);
63 }
64
65 ///////////////////////////////cc.e////////////////////////////////////////
66 #undef prefix_
67 //#include "SimpleHTTPServer.mpp"
68
69 \f
70 // Local Variables:
71 // mode: c++
72 // End: