diff options
Diffstat (limited to 'src/eNetworkPumpThread.cpp')
-rw-r--r-- | src/eNetworkPumpThread.cpp | 90 |
1 files changed, 90 insertions, 0 deletions
diff --git a/src/eNetworkPumpThread.cpp b/src/eNetworkPumpThread.cpp new file mode 100644 index 0000000..dc8972e --- /dev/null +++ b/src/eNetworkPumpThread.cpp @@ -0,0 +1,90 @@ +/* + * eDemuxPumpThread.cpp + * + * Created on: 2013. 9. 12. + * Author: kos + */ + +//#include "uLogger.h" +//#include "uDemux.h" + +#include <poll.h> +#include <stdio.h> +#include <errno.h> +#include <string.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"; + + write(1, c, strlen(c)); + + while(mTermFlag) { + rc = poll((struct pollfd*)&pollevt, 1, 1000); + 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; + } +#ifdef DEBUG_LOG + LOG("%d byte read", rc); +#endif + wc = write(1, buffer, rc); +#ifdef DEBUG_LOG + LOG("%d byte write", wc); +#endif + } else if (pollevt.revents & POLLHUP) { + ioctl(mDeviceFd, 200, 0); + break; + } + } + mTermFlag = false; +} +//------------------------------------------------------------------------------- + +void eNetworkPumpThread::Terminate() +{ + mTermFlag = false; +} +//------------------------------------------------------------------------------- + |