void cSchedules::Cleanup(bool Force) { if (Force) lastDump = 0; time_t now = time(NULL); struct tm tm_r; struct tm *ptm = localtime_r(&now, &tm_r); if (now - lastCleanup > 3600) { isyslog("cleaning up schedules data"); cSchedulesLock SchedulesLock(true, 1000); cSchedules *s = (cSchedules *)Schedules(SchedulesLock); if (s) { for (cSchedule *p = s->First(); p; p = s->Next(p)) p->Cleanup(now); } lastCleanup = now; if (ptm->tm_hour == 5) ReportEpgBugFixStats(true); } if (epgDataFileName && now - lastDump > 600) { cSafeFile f(epgDataFileName); if (f.Open()) { Dump(f); f.Close(); } else LOG_ERROR; lastDump = now; } }
bool cSchedules::Read(FILE *f) { cSchedulesLock SchedulesLock(true, 1000); cSchedules *s = (cSchedules *)Schedules(SchedulesLock); if (s) { bool OwnFile = f == NULL; if (OwnFile) { if (epgDataFileName && access(epgDataFileName, R_OK) == 0) { dsyslog("reading EPG data from %s", epgDataFileName); if ((f = fopen(epgDataFileName, "r")) == NULL) { LOG_ERROR; return false; } } else return false; } bool result = cSchedule::Read(f, s); if (OwnFile) fclose(f); if (result) { // Initialize the channels' schedule pointers, so that the first WhatsOn menu will come up faster: for (cChannel *Channel = Channels.First(); Channel; Channel = Channels.Next(Channel)) s->GetSchedule(Channel); } return result; } return false; }
bool cSchedules::Dump(FILE *f, const char *Prefix, eDumpMode DumpMode, time_t AtTime) { cSchedulesLock SchedulesLock; cSchedules *s = (cSchedules *)Schedules(SchedulesLock); if (s) { cSafeFile *sf = NULL; if (!f) { sf = new cSafeFile(epgDataFileName); if (sf->Open()) f = *sf; else { LOG_ERROR; delete sf; return false; } } for (cSchedule *p = s->First(); p; p = s->Next(p)) p->Dump(f, Prefix, DumpMode, AtTime); if (sf) { sf->Close(); delete sf; } return true; } return false; }
void cSchedules::ResetVersions(void) { cSchedulesLock SchedulesLock(true); cSchedules *s = (cSchedules *)Schedules(SchedulesLock); if (s) { for (cSchedule *Schedule = s->First(); Schedule; Schedule = s->Next(Schedule)) Schedule->ResetVersions(); } }
bool cSchedules::Dump(FILE *f, const char *Prefix, eDumpMode DumpMode, time_t AtTime) { cSchedulesLock SchedulesLock; cSchedules *s = (cSchedules *)Schedules(SchedulesLock); if (s) { for (cSchedule *p = s->First(); p; p = s->Next(p)) p->Dump(f, Prefix, DumpMode, AtTime); return true; } return false; }
bool cSchedules::ClearAll(void) { cSchedulesLock SchedulesLock(true, 1000); cSchedules *s = (cSchedules *)Schedules(SchedulesLock); if (s) { for (cTimer *Timer = Timers.First(); Timer; Timer = Timers.Next(Timer)) Timer->SetEvent(NULL); for (cSchedule *Schedule = s->First(); Schedule; Schedule = s->Next(Schedule)) Schedule->Cleanup(INT_MAX); return true; } return false; }