--- /dev/null
+// $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: