X-Git-Url: http://code.vuplus.com/gitweb/?p=vuplus_dvbapp;a=blobdiff_plain;f=lib%2Fbase%2Ffilepush.cpp;h=e9775e39e64fbeee41ec057b2db23c386f5e8ce4;hp=e3e2a13ad8e060a83678afbcfc9be841af0903da;hb=HEAD;hpb=e1cd84473da2da0d23f4cea1d4143f17a8fb5a2c diff --git a/lib/base/filepush.cpp b/lib/base/filepush.cpp index e3e2a13..e9775e3 100644 --- a/lib/base/filepush.cpp +++ b/lib/base/filepush.cpp @@ -1,12 +1,24 @@ #include #include +#include #include #include #include +#include +#if 0 +#include +#else +#include +#endif #define PVR_COMMIT 1 +#define MAJORSD_ 8 +#define MAJORMMCBLK 179 +#define LIMIT_FILESIZE_NOHDD 2*1024*1024*1024LL // 2GBytes + //FILE *f = fopen("/log.ts", "wb"); +static bool g_is_diskfull = false; eFilePushThread::eFilePushThread(int io_prio_class, int io_prio_level, int blocksize) :prio_class(io_prio_class), prio(io_prio_level), m_messagepump(eApp, 0) @@ -19,6 +31,8 @@ eFilePushThread::eFilePushThread(int io_prio_class, int io_prio_level, int block flush(); enablePVRCommit(0); CONNECT(m_messagepump.recv_msg, eFilePushThread::recvEvent); + m_is_timeshift = false; + m_hdd_connected = true; } static void signal_handler(int x) @@ -37,6 +51,40 @@ void eFilePushThread::thread() size_t written_since_last_sync = 0; +#if 0 + DIR *tsdir_info; + struct dirent *tsdir_entry; + tsdir_info = opendir("/sys/block"); + if (tsdir_info != NULL) { + m_hdd_connected = false; + while (tsdir_entry = readdir(tsdir_info)) { + if (strncmp(tsdir_entry->d_name, "sd", 2) == 0) { + eDebug("HDD found: %s", tsdir_entry->d_name); + m_hdd_connected = true; + break; + } + } + } +#else + if (m_tspath.empty()) + defaultTSPath(m_is_timeshift); + + struct stat tspath_st; + if (stat(m_tspath.c_str(), &tspath_st) == 0) { + if (major(tspath_st.st_dev) == MAJORSD_) { + eDebug("%s location on HDD!", m_tspath.c_str()); + m_hdd_connected = true; + } else if (major(tspath_st.st_dev) == MAJORMMCBLK) { + eDebug("%s location on eMMC!", m_tspath.c_str()); + m_hdd_connected = false; + } else { + eDebug("%s location on other device", m_tspath.c_str()); + } + } else { + eDebug("stat failed!"); + } +#endif + eDebug("FILEPUSH THREAD START"); /* we set the signal to not restart syscalls, so we can detect our signal. */ @@ -106,10 +154,19 @@ void eFilePushThread::thread() // eDebug("wrote %d bytes", w); if (w <= 0) { - if (errno == EINTR || errno == EAGAIN || errno == EBUSY) + if (w < 0 && (errno == EINTR || errno == EAGAIN || errno == EBUSY)) continue; eDebug("eFilePushThread WRITE ERROR"); sendEvent(evtWriteError); + + struct statfs fs; + if (statfs(m_tspath.c_str(), &fs) < 0) { + eDebug("statfs failed!"); + } + if ((off_t)fs.f_bavail < 1) { + eDebug("not enough diskspace!"); + g_is_diskfull = true; + } break; // ... we would stop the thread } @@ -131,6 +188,19 @@ void eFilePushThread::thread() continue; } + if (!m_hdd_connected) { + struct stat limit_filesize; + if (fstat(m_fd_dest, &limit_filesize) == 0) { + if (limit_filesize.st_size > LIMIT_FILESIZE_NOHDD) { + eDebug("eFilePushThread %lld > %lld LIMIT FILESIZE", limit_filesize.st_size, LIMIT_FILESIZE_NOHDD); + sendEvent(evtWriteError); + + g_is_diskfull = true; + break; + } + } + } + /* now fill our buffer. */ if (m_sg && !current_span_remaining) @@ -218,6 +288,11 @@ void eFilePushThread::thread() current_span_remaining -= m_buf_end; } // printf("FILEPUSH: read %d bytes\n", m_buf_end); + + if (g_is_diskfull) { + sendEvent(evtUser+3); + g_is_diskfull = false; + } } fdatasync(m_fd_dest); @@ -289,6 +364,16 @@ void eFilePushThread::setStreamMode(int s) m_stream_mode = s; } +void eFilePushThread::setTimeshift(bool s) +{ + m_is_timeshift = s; +} + +void eFilePushThread::setTSPath(const std::string s) +{ + m_tspath = s; +} + void eFilePushThread::setScatterGather(iFilePushScatterGather *sg) { m_sg = sg; @@ -304,6 +389,36 @@ void eFilePushThread::recvEvent(const int &evt) m_event(evt); } +void eFilePushThread::defaultTSPath(bool s) +{ + std::string tspath; + + if (s) { + if (ePythonConfigQuery::getConfigValue("config.usage.timeshift_path", tspath) == -1) + eDebug("could not query ts path from config"); + } else { + if (ePythonConfigQuery::getConfigValue("config.usage.instantrec_path", tspath) == -1) { + eDebug("could not query ts path from config"); + } else { + if (tspath == "") { + if (ePythonConfigQuery::getConfigValue("config.usage.default_path", tspath) == -1) + eDebug("could not query ts path from config"); + } else if (tspath == "") { + if (ePythonConfigQuery::getConfigValue("config.movielist.last_videodir", tspath) == -1) + eDebug("could not query ts path from config"); + } else if (tspath == "") { + if (ePythonConfigQuery::getConfigValue("config.movielist.last_timer_videodir", tspath) == -1) + eDebug("could not query ts path from config"); + } + } + } + + if (!tspath.empty()) + tspath.append("/"); + + m_tspath = tspath; +} + int eFilePushThread::filterRecordData(const unsigned char *data, int len, size_t ¤t_span_remaining) { return len;