Finished version 0.1 of media server .. Jay !!!
[mediaserv.git] / Server / StreamConnection.cc
diff --git a/Server/StreamConnection.cc b/Server/StreamConnection.cc
new file mode 100644 (file)
index 0000000..130abf8
--- /dev/null
@@ -0,0 +1,88 @@
+// $Id$
+//
+// Copyright (C) 2006 
+
+// Definition of non-inline non-template functions
+
+#include "StreamConnection.hh"
+//#include "StreamConnection.ih"
+
+// Custom includes
+#include <unistd.h>
+#include "SimpleHTTPServer.hh"
+
+//#include "StreamConnection.mpp"
+#define prefix_
+///////////////////////////////cc.p////////////////////////////////////////
+
+prefix_ g0dil::mediaserv::StreamConnection::StreamConnection(int fileFd,
+                                                             unsigned bytesPerSecond,
+                                                             ClientHandle client,
+                                                             unsigned bufferMSecs,
+                                                             Callback callback)
+    : fileFd_(fileFd), bytesPerSecond_(bytesPerSecond), client_(client),
+      bufferMSecs_(bufferMSecs), callback_(callback), bytesWritten_(0),
+      start_(satcom::lib::now()), bufferSize_(0), terminate_(false) 
+{
+    fillBuffer();
+}
+
+
+prefix_ void g0dil::mediaserv::StreamConnection::start()
+{
+    registerCallback();
+}
+
+prefix_ g0dil::mediaserv::StreamConnection::~StreamConnection()
+{
+    unregisterCallback();
+    // FIXME: unregisterTimeout
+}
+
+prefix_ void g0dil::mediaserv::StreamConnection::fillBuffer()
+{
+    bufferSize_ = ::read(fileFd_,buffer_,packetSize);
+    if (bufferSize_ < 0)
+       callback_();
+    else if (bufferSize_ < packetSize)
+       terminate_ = true;
+}
+
+prefix_ void g0dil::mediaserv::StreamConnection::callback(ClientHandle client,
+                                                    satcom::lib::Scheduler::EventId event)
+{
+    if (event != satcom::lib::Scheduler::EV_WRITE) {
+       callback_();
+       return;
+    }
+    unsigned target (targetBytes());
+    if (target - bytesWritten_ >= bufferSize_) {
+       if (client_.write(buffer_,bufferSize_) < bufferSize_) {
+           callback_();
+           return;
+       }
+       bytesWritten_ += bufferSize_;
+       if (terminate_) {
+           callback_();
+           return;
+       } else
+           fillBuffer();
+    } else {
+       unregisterCallback();
+       registerTimeout(((bufferSize_-(target-bytesWritten_))*1000)/bytesPerSecond_);
+    }
+}
+
+prefix_ void g0dil::mediaserv::StreamConnection::timeout()
+{
+    registerCallback();
+}
+
+///////////////////////////////cc.e////////////////////////////////////////
+#undef prefix_
+//#include "StreamConnection.mpp"
+
+\f
+// Local Variables:
+// mode: c++
+// End: