filepush.h/cpp: migrate to iDataSource
[vuplus_dvbapp] / lib / base / filepush.cpp
index e99e956..0d599f9 100644 (file)
@@ -37,7 +37,6 @@ void eFilePushThread::thread()
        
        size_t written_since_last_sync = 0;
 
-       int already_empty = 0;
        eDebug("FILEPUSH THREAD START");
        
                /* we set the signal to not restart syscalls, so we can detect our signal. */
@@ -48,7 +47,7 @@ void eFilePushThread::thread()
        
        hasStarted();
        
-       source_pos = m_raw_source.lseek(0, SEEK_CUR);
+       source_pos = m_raw_source->lseek(0, SEEK_CUR);
        
                /* m_stop must be evaluated after each syscall. */
        while (!m_stop)
@@ -142,7 +141,7 @@ void eFilePushThread::thread()
                        ASSERT(!(current_span_remaining % m_blocksize));
 
                        if (source_pos != current_span_offset)
-                               source_pos = m_raw_source.lseek(current_span_offset, SEEK_SET);
+                               source_pos = m_raw_source->lseek(current_span_offset, SEEK_SET);
                        bytes_read = 0;
                }
                
@@ -160,7 +159,7 @@ void eFilePushThread::thread()
                m_buf_end = 0;
                
                if (maxread)
-                       m_buf_end = m_raw_source.read(m_buffer, maxread);
+                       m_buf_end = m_raw_source->read(m_buffer, maxread);
 
                if (m_buf_end < 0)
                {
@@ -179,22 +178,30 @@ void eFilePushThread::thread()
                int d = m_buf_end % m_blocksize;
                if (d)
                {
-                       m_raw_source.lseek(-d, SEEK_CUR);
+                       m_raw_source->lseek(-d, SEEK_CUR);
                        m_buf_end -= d;
                }
 
                if (m_buf_end == 0)
                {
                                /* on EOF, try COMMITting once. */
-                       if (m_send_pvr_commit && !already_empty)
+                       if (m_send_pvr_commit)
                        {
-                               eDebug("sending PVR commit");
-                               already_empty = 1;
-                               if (::ioctl(m_fd_dest, PVR_COMMIT) < 0 && errno == EINTR)
-                                       continue;
-                               eDebug("commit done");
-                                               /* well check again */
-                               continue;
+                               struct pollfd pfd;
+                               pfd.fd = m_fd_dest;
+                               pfd.events = POLLIN;
+                               switch (poll(&pfd, 1, 250)) // wait for 250ms
+                               {
+                                       case 0:
+                                               eDebug("wait for driver eof timeout");
+                                               continue;
+                                       case 1:
+                                               eDebug("wait for driver eof ok");
+                                               break;
+                                       default:
+                                               eDebug("wait for driver eof aborted by signal");
+                                               continue;
+                               }
                        }
                        
                                /* in stream_mode, we are sending EOF events 
@@ -211,7 +218,7 @@ void eFilePushThread::thread()
                        }
 #if 0
                        eDebug("FILEPUSH: end-of-file! (currently unhandled)");
-                       if (!m_raw_source.lseek(0, SEEK_SET))
+                       if (!m_raw_source->lseek(0, SEEK_SET))
                        {
                                eDebug("(looping)");
                                continue;
@@ -224,7 +231,6 @@ void eFilePushThread::thread()
                        bytes_read += m_buf_end;
                        if (m_sg)
                                current_span_remaining -= m_buf_end;
-                       already_empty = 0;
                }
 //             printf("FILEPUSH: read %d bytes\n", m_buf_end);
        }
@@ -233,20 +239,30 @@ void eFilePushThread::thread()
        eDebug("FILEPUSH THREAD STOP");
 }
 
-void eFilePushThread::start(int fd_source, int fd_dest)
+void eFilePushThread::start(int fd, int fd_dest)
 {
-       m_raw_source.setfd(fd_source);
+       eRawFile *f = new eRawFile();
+       f->setfd(fd);
+       m_raw_source = f;
        m_fd_dest = fd_dest;
        resume();
 }
 
-int eFilePushThread::start(const char *filename, int fd_dest)
+int eFilePushThread::start(const char *file, int fd_dest)
 {
-       if (m_raw_source.open(filename) < 0)
+       eRawFile *f = new eRawFile();
+       ePtr<iDataSource> source = f;
+       if (f->open(file) < 0)
                return -1;
+       start(source, fd_dest);
+       return 0;
+}
+
+void eFilePushThread::start(ePtr<iDataSource> source, int fd_dest)
+{
+       m_raw_source = source;
        m_fd_dest = fd_dest;
        resume();
-       return 0;
 }
 
 void eFilePushThread::stop()
@@ -257,10 +273,7 @@ void eFilePushThread::stop()
 
        m_stop = 1;
 
-       // fixmee.. here we need a better solution to ensure
-       // that the thread context take notice of the signal
-       // even when no syscall is in progress
-       eDebug("if enigma hangs here, the filepush thread is non-responsive. FIX THAT DAMN THREAD.");
+       eDebug("stopping thread."); /* just do it ONCE. it won't help to do this more than once. */
        sendSignal(SIGUSR1);
        kill(0);
 }
@@ -272,7 +285,7 @@ void eFilePushThread::pause()
 
 void eFilePushThread::seek(int whence, off_t where)
 {
-       m_raw_source.lseek(where, whence);
+       m_raw_source->lseek(where, whence);
 }
 
 void eFilePushThread::resume()