diff options
-rw-r--r-- | status_thread.c | 250 | ||||
-rw-r--r-- | status_thread.h | 65 |
2 files changed, 0 insertions, 315 deletions
diff --git a/status_thread.c b/status_thread.c deleted file mode 100644 index 1092694..0000000 --- a/status_thread.c +++ /dev/null @@ -1,250 +0,0 @@ -/* -*- c++ -*- -Copyright (C) 2004-2013 Christian Wieninger - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -Or, point your browser to http://www.gnu.org/licenses/old-licenses/gpl-2.0.html - -The author can be reached at cwieninger@gmx.de - -The project's page is at http://winni.vdr-developer.org/epgsearch -*/ - -#include <string> -#include <list> -#ifdef __FreeBSD__ -#include <netinet/in.h> -#endif -#include "timer_thread.h" -#include "epgsearchcfg.h" -#include "epgsearchtools.h" -#include "services.h" -#include "svdrpclient.h" -#include "timerstatus.h" -#include "recstatus.h" -#include "recdone.h" -#include "conflictcheck_thread.h" -#include "status_thread.h" -#include <math.h> - -#include <vdr/tools.h> -#include <vdr/plugin.h> - -#define ALLOWED_BREAK_INSECS 2 - -extern int updateForced; - -cStatusThread *cStatusThread::m_Instance = NULL; -StatusThreadStatus cStatusThread::m_Status = StatusThreadReady; -int gl_StatusProgged=0; // Flag that indicates, when programming is finished - -cStatusThread::cStatusThread() -: cThread("EPGSearch: recstatus") -{ - m_Active = false; -} - -cStatusThread::~cStatusThread() { - if (m_Active) - Stop(); - cStatusThread::m_Instance = NULL; -} - -void cStatusThread::Init(const cDevice *Device, const char *Name, const char *Filename, bool On) { - if (m_Instance == NULL) { - m_Instance = new cStatusThread; - } - else { - if (m_Instance->m_Active) { - LogFile.eSysLog("Epgsearch recstatus_thread called too fast"); //should stack - return; - } - } - m_Instance->m_device=Device; - m_Instance->m_name=Name; - m_Instance->m_filename=Filename; - m_Instance->m_on=On; - m_Instance->Start(); -} - -void cStatusThread::Exit(void) { - if (m_Instance != NULL) { - m_Instance->Stop(); - DELETENULL(m_Instance); - } - -} - -void cStatusThread::Stop(void) { - m_Active = false; - Cancel(3); -} - -void cStatusThread::Action(void) -{ - m_Active = true; - time_t now = time(NULL); - // insert new timers currently recording in TimersRecording - if (m_on && m_name) - { - if (EPGSearchConfig.checkTimerConflOnRecording) - cConflictCheckThread::Init((cPluginEpgsearch*)cPluginManager::GetPlugin("epgsearch"), true); - - LOCK_TIMERS_READ; - - for (const cTimer *ti = Timers->First(); ti; ti = Timers->Next(ti)) - if (ti->Recording()) - { - // check if this is a new entry - cRecDoneTimerObj *tiRFound = NULL; - for (cRecDoneTimerObj *tiR = gl_recStatusMonitor->TimersRecording.First(); tiR; tiR = gl_recStatusMonitor->TimersRecording.Next(tiR)) - if (tiR->timer == ti) - { - tiRFound = tiR; - break; - } - - if (tiRFound) // already handled, perhaps a resume - { - if (tiRFound->lastBreak > 0 && now - tiRFound->lastBreak <= ALLOWED_BREAK_INSECS) - { - LogFile.Log(1,"accepting resume of '%s' on device %d", m_name, m_device->CardIndex()); - tiRFound->lastBreak = 0; - } - continue; - } - - cRecDoneTimerObj* timerObj = new cRecDoneTimerObj(ti, m_device->DeviceNumber()); - gl_recStatusMonitor->TimersRecording.Add(timerObj); - - cSearchExt* search = TriggeredFromSearchTimer(ti); - if (!search || (search->avoidRepeats == 0 && search->delMode == 0)) // ignore if not avoid repeats and no auto-delete - continue; - - bool vpsUsed = ti->HasFlags(tfVps) && ti->Event() && ti->Event()->Vps(); - LogFile.Log(1,"recording started '%s' on device %d (search timer '%s'); VPS used: %s", m_name, m_device->CardIndex(), search->search, vpsUsed ? "Yes": "No"); - const cEvent* event = ti->Event(); - if (!event) - { - event = GetEvent(ti); - if (event) - LogFile.Log(3,"timer had no event: assigning '%s'", event->Title()); - } - if (!event) - { - LogFile.Log(1,"no event for timer found! will be ignored in done list"); - continue; - } - time_t now = time(NULL); - if (vpsUsed || now < ti->StartTime() + 60) // allow a delay of one minute - { - timerObj->recDone = new cRecDone(ti, event, search); - return; - } - else - LogFile.Log(1,"recording started too late! will be ignored"); - } - } - - if (!m_on) - { - cMutexLock RecsDoneLock(&RecsDone); - // remove timers that finished recording from TimersRecording - // incomplete recordings are kept for a while, perhaps they will be resumed - cRecDoneTimerObj *tiR = gl_recStatusMonitor->TimersRecording.First(); - while(tiR) - { - // check if timer still exists - bool found = false; - LOCK_TIMERS_READ; - for (const cTimer *ti = Timers->First(); ti; ti = Timers->Next(ti)) - if (ti == tiR->timer) - { - found = true; - break; - } - if (found && !tiR->timer->Recording()) - { - if (tiR->recDone) - { - cSearchExt* search = SearchExts.GetSearchFromID(tiR->recDone->searchID); - if (!search) return; - - // check if recording has ended before timer end - - bool complete = true; - LOCK_RECORDINGS_READ; - const cRecording *pRecording = Recordings->GetByName(m_filename); - long timerLengthSecs = tiR->timer->StopTime()-tiR->timer->StartTime(); - int recFraction = 100; - if (pRecording && timerLengthSecs) - { - int recLen = gl_recStatusMonitor->RecLengthInSecs(pRecording); - recFraction = double(recLen) * 100 / timerLengthSecs; - } - bool vpsUsed = tiR->timer->HasFlags(tfVps) && tiR->timer->Event() && tiR->timer->Event()->Vps(); - if ((!vpsUsed && now < tiR->timer->StopTime()) || recFraction < (vpsUsed ? 90: 98)) // assure timer has reached its end or at least 98% were recorded - { - complete = false; - LogFile.Log(1,"finished: '%s' (not complete! - recorded only %d%%); search timer: '%s'; VPS used: %s", tiR->timer->File(), recFraction, search->search, vpsUsed ? "Yes": "No"); - } - else - { - LogFile.Log(1,"finished: '%s'; search timer: '%s'; VPS used: %s", tiR->timer->File(), search->search, vpsUsed ? "Yes": "No"); - if (recFraction < 100) - LogFile.Log(2,"recorded %d%%'", recFraction); - } - if (complete) - { - RecsDone.Add(tiR->recDone); - LogFile.Log(1,"added rec done for '%s~%s';%s", tiR->recDone->title?tiR->recDone->title:"unknown title", - tiR->recDone->shortText?tiR->recDone->shortText:"unknown subtitle", - search->search); - RecsDone.Save(); - tiR->recDone = NULL; // prevent deletion - tiR->lastBreak = 0; - - // check for search timers to delete automatically - SearchExts.CheckForAutoDelete(search); - - // trigger a search timer update (skip running events) - search->skipRunningEvents = true; - updateForced = 1; - } - else if (tiR->lastBreak == 0) // store first break - tiR->lastBreak = now; - } - if (tiR->lastBreak == 0 || (now - tiR->lastBreak) > ALLOWED_BREAK_INSECS) - { // remove finished recordings or those with an unallowed break - if (tiR->recDone) delete tiR->recDone; // clean up - cRecDoneTimerObj *tiRNext = gl_recStatusMonitor->TimersRecording.Next(tiR); - gl_recStatusMonitor->TimersRecording.Del(tiR); - tiR = tiRNext; - continue; - } - break; - } - if (!found) - { - if (tiR->recDone) delete tiR->recDone; // clean up - cRecDoneTimerObj *tiRNext = gl_recStatusMonitor->TimersRecording.Next(tiR); - gl_recStatusMonitor->TimersRecording.Del(tiR); - tiR = tiRNext; - continue; - } - tiR = gl_recStatusMonitor->TimersRecording.Next(tiR); - } - } - m_Active = false; -} diff --git a/status_thread.h b/status_thread.h deleted file mode 100644 index e2bdb6e..0000000 --- a/status_thread.h +++ /dev/null @@ -1,65 +0,0 @@ -/* -*- c++ -*- -Copyright (C) 2004-2013 Christian Wieninger - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -Or, point your browser to http://www.gnu.org/licenses/old-licenses/gpl-2.0.html - -The author can be reached at cwieninger@gmx.de - -The project's page is at http://winni.vdr-developer.org/epgsearch -*/ - -#ifndef VDR_STATUS_THREAD_H -#define VDR_STATUS_THREAD_H - -#include <vdr/thread.h> -#include <vdr/status.h> -#include "epgsearchext.h" -#include "recdone.h" -#include "epgsearchtools.h" -#include "log.h" - -extern int gl_StatusProgged; - -typedef enum -{ - StatusThreadReady, - StatusThreadWorking, - StatusThreadError, - StatusThreadDone -} StatusThreadStatus; - -class cStatusThread: public cThread { -private: - static cStatusThread *m_Instance; - const cDevice * m_device; - const char * m_name; - const char * m_filename; - bool m_on; - static StatusThreadStatus m_Status; -protected: - virtual void Action(void); - void Stop(void); -public: - bool m_Active; - StatusThreadStatus GetStatus() { return cStatusThread::m_Status; } - void SetStatus(StatusThreadStatus Status) { LogFile.eSysLog("%d", int(Status)); cStatusThread::m_Status = Status; } - cStatusThread(); - virtual ~cStatusThread(); - static void Init(const cDevice *Device, const char *Name, const char *Filename, bool On); - void Exit(void); -}; - -#endif |