summaryrefslogtreecommitdiff
path: root/src/eNetworkPumpThread.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/eNetworkPumpThread.cpp')
-rw-r--r--src/eNetworkPumpThread.cpp92
1 files changed, 92 insertions, 0 deletions
diff --git a/src/eNetworkPumpThread.cpp b/src/eNetworkPumpThread.cpp
new file mode 100644
index 0000000..842b434
--- /dev/null
+++ b/src/eNetworkPumpThread.cpp
@@ -0,0 +1,92 @@
+/*
+ * eDemuxPumpThread.cpp
+ *
+ * Created on: 2013. 9. 12.
+ * Author: kos
+ */
+
+#include <poll.h>
+#include <stdio.h>
+#include <errno.h>
+#include <string.h>
+#include <unistd.h>
+#include <sys/ioctl.h>
+
+#include "ePreDefine.h"
+#include "eNetworkPumpThread.h"
+//-------------------------------------------------------------------------------
+
+#ifdef DEBUG_LOG
+//#undef LOG
+//#define LOG(X,...) { do{}while(0); }
+#endif
+
+eNetworkPumpThread::eNetworkPumpThread(int aDeviceFd)
+ : mTermFlag(0), mDeviceFd(aDeviceFd), uThread("eNetworkPumpThread")
+{
+}
+//-------------------------------------------------------------------------------
+
+eNetworkPumpThread::~eNetworkPumpThread()
+{
+}
+//-------------------------------------------------------------------------------
+
+void eNetworkPumpThread::Run()
+{
+ int rc = 0, wc = 0;
+ unsigned char buffer[BUFFER_SIZE];
+ struct pollfd pollevt;
+
+ pollevt.fd = mDeviceFd;
+ pollevt.events = POLLIN | POLLHUP;
+ pollevt.revents = 0;
+
+ mTermFlag = true;
+
+ const char *c = "\
+HTTP/1.0 200 OK\r\n\
+Connection: close\r\n\
+Content-Type: video/mpeg\r\n\
+Server: stream_enigma2\r\n\
+\r\n";
+
+ wc = write(1, c, strlen(c));
+#ifdef DEBUG_LOG
+ LOG("network pump start.", rc);
+#endif
+ while(mTermFlag) {
+ rc = poll((struct pollfd*)&pollevt, 1, 500);
+ if (pollevt.revents & POLLIN) {
+ rc = read(mDeviceFd, buffer, BUFFER_SIZE);
+
+ if (errno == EINTR || errno == EAGAIN || errno == EBUSY || errno == EOVERFLOW) {
+#ifdef DEBUG_LOG
+ LOG("(retry... errno : %d)", errno);
+#endif
+ continue;
+ }
+ wc = write(1, buffer, rc);
+#ifdef DEBUG_LOG
+ if(wc != rc) {
+ LOG("need rewrite.. rc[%d], wc[%d]", rc, wc);
+ }
+#endif
+ } else if (pollevt.revents & POLLHUP) {
+ ioctl(mDeviceFd, 200, 0);
+ break;
+ }
+ }
+#ifdef DEBUG_LOG
+ LOG("network pump stoped.", rc);
+#endif
+ mTermFlag = false;
+}
+//-------------------------------------------------------------------------------
+
+void eNetworkPumpThread::Terminate()
+{
+ mTermFlag = false;
+}
+//-------------------------------------------------------------------------------
+