66f0501cdd8b4632a699f6fcdce5d7292a5dda0e
[mediaserv.git] / Server / Connection.cc
1 // $Id$
2 //
3 // Copyright (C) 2006 
4
5 // Definition of non-inline non-template functions
6
7 #include "Connection.hh"
8 //#include "Connection.ih"
9
10 // Custom includes
11
12 //#include "Connection.mpp"
13 #define prefix_
14 ///////////////////////////////cc.p////////////////////////////////////////
15
16 prefix_ g0dil::mediaserv::Connection::Connection(int fileFd, unsigned bytesPerSecond,
17                                                  ClientHandle client, unsigned bufferMSecs)
18     : fileFd_(fileFd), bytesPerSecond_(bytesPerSecond), client_(client),
19       bufferMSecs_(bufferMSecs), bytesWritten_(0), start_(satcom::lib::now()),
20       bufferSize_(0), terminate_(false)
21 {
22     registerCallback();
23     fillBuffer();
24 }
25
26 prefix_ void g0dil::mediaserv::Connection::fillBuffer()
27 {
28     bufferSize_ = ::read(fileFd_,buffer_,packetSize);
29     if (bufferSize_ < packetSize)
30         terminate_ = true;
31     // TODO: Check error;
32 }
33
34 prefix_ void g0dil::mediaserv::Connection::callback(ClientHandle client,
35                                                     satcom::lib::Scheduler::EventId)
36 {
37     unsigned target (targetBytes());
38     if (target - bytesWritten_ >= bufferSize_) {
39         if (client_.write(buffer_,bufferSize_) < bufferSize_)
40             // TODO: Destroy client handle ..
41             ;
42         bytesWritten_ += bufferSize_;
43         if (terminate_) {
44             unregisterCallback();
45             // TODO: Destroy client handle
46         } else
47             fillBuffer();
48     } else {
49         unregisterCallback();
50         registerTimeout(((bufferSize_-(target-bytesWritten_))*1000)/bytesPerSecond_);
51     }
52 }
53
54 prefix_ void g0dil::mediaserv::Connection::timeout()
55 {
56     registerCallback();
57 }
58
59 ///////////////////////////////cc.e////////////////////////////////////////
60 #undef prefix_
61 //#include "Connection.mpp"
62
63 \f
64 // Local Variables:
65 // mode: c++
66 // End: