diff --git a/data/locale/deutsch.locale b/data/locale/deutsch.locale index f6b29c1f1..ff8429e72 100644 --- a/data/locale/deutsch.locale +++ b/data/locale/deutsch.locale @@ -956,6 +956,7 @@ menu.hint_epg_max_events Maxiale Anzahl der Events im Zwischenspeicher menu.hint_epg_old_events Veraltete EPG-Daten werden nach dieser Zeit (in Stunden) verworfen menu.hint_epg_read Liest nach einem Neustart die EPG-Daten von einem externen Datenträger wieder ein menu.hint_epg_save Speichert die EPG-Daten beim Herunterfahren auf einem externen Datenträger +menu.hint_epg_save_frequently Speichert die EPG-Daten in regelmäßigen Abständen auf einem externen Datenträger menu.hint_epg_save_standby Speichert die EPG-Daten auch, wenn in den Standby-Modus geschalten wird menu.hint_epg_scan Zu scannende Bouquets wählen. Aktuelles Bouquet beim Umschalten, markierte Bouquets oder alle Favoriten menu.hint_epg_scan_mode Aktivieren Sie den Hintergrundscan der EPG-Daten, wenn ein freier Tuner vorhanden ist @@ -1390,6 +1391,7 @@ miscsettings.epg_old_events_hint1 Wie lange abgelaufene EPG-Daten aufheben? miscsettings.epg_old_events_hint2 Angabe in Stunden miscsettings.epg_read Gespeicherte EPG-Daten einlesen miscsettings.epg_save EPG zwischenspeichern +miscsettings.epg_save_frequently EPG regelmäßig speichern miscsettings.epg_save_standby EPG speichern in Standby-Modus miscsettings.epg_scan Hintergrundscan EPG miscsettings.epg_scan_always Immer diff --git a/data/locale/english.locale b/data/locale/english.locale index 1aeed4f70..20ad812c9 100644 --- a/data/locale/english.locale +++ b/data/locale/english.locale @@ -956,6 +956,7 @@ menu.hint_epg_max_events Maximum events to cache. After reaching limit\nEPG cach menu.hint_epg_old_events Hours after event end time to consider\nevent old and remove it from cache menu.hint_epg_read Read saved EPG data after boot from an external device menu.hint_epg_save Save cached EPG data to an external device +menu.hint_epg_save_frequently Save cached EPG data in frequently intervals to an external device menu.hint_epg_save_standby Save EPG on soft standby mode menu.hint_epg_scan Select bouquets to scan epg, current on zap,\nall or selected favorites menu.hint_epg_scan_mode Enable background epg scan using free tuner @@ -1390,6 +1391,7 @@ miscsettings.epg_old_events_hint1 How long will EPG-Data be stored after they ti miscsettings.epg_old_events_hint2 Set in hours miscsettings.epg_read Restore EPG on boot miscsettings.epg_save Save EPG on shutdown +miscsettings.epg_save_frequently Save EPG frequently miscsettings.epg_save_standby Save EPG on soft standby miscsettings.epg_scan EPG scan mode miscsettings.epg_scan_always Always diff --git a/lib/sectionsdclient/sectionsdMsg.h b/lib/sectionsdclient/sectionsdMsg.h index 9358e8340..9b6b666a4 100644 --- a/lib/sectionsdclient/sectionsdMsg.h +++ b/lib/sectionsdclient/sectionsdMsg.h @@ -101,6 +101,7 @@ struct sectionsd int epg_extendedcache; // std::string network_ntpserver; // std::string epg_dir; + int epg_save_frequently; }; }; diff --git a/lib/sectionsdclient/sectionsdclient.cpp b/lib/sectionsdclient/sectionsdclient.cpp index c50066926..e4dcee4e5 100644 --- a/lib/sectionsdclient/sectionsdclient.cpp +++ b/lib/sectionsdclient/sectionsdclient.cpp @@ -206,6 +206,7 @@ void CSectionsdClient::setConfig(const epg_config config) msg->network_ntprefresh = config.network_ntprefresh; msg->network_ntpenable = config.network_ntpenable; msg->epg_extendedcache = config.epg_extendedcache; + msg->epg_save_frequently= config.epg_save_frequently; // config.network_ntpserver: strcpy(&pData[sizeof(sectionsd::commandSetConfig)], config.network_ntpserver.c_str()); // config.epg_dir: diff --git a/lib/sectionsdclient/sectionsdclient.h b/lib/sectionsdclient/sectionsdclient.h index f202ed94d..b020407a0 100644 --- a/lib/sectionsdclient/sectionsdclient.h +++ b/lib/sectionsdclient/sectionsdclient.h @@ -162,6 +162,7 @@ class CSectionsdClient : private CBasicClient int network_ntpenable; int epg_extendedcache; std::string network_ntpserver; + int epg_save_frequently; std::string epg_dir; } epg_config; diff --git a/src/eitd/sectionsd.cpp b/src/eitd/sectionsd.cpp index 50e1522da..17aef38ad 100644 --- a/src/eitd/sectionsd.cpp +++ b/src/eitd/sectionsd.cpp @@ -71,6 +71,7 @@ static bool notify_complete = false; /* period to clean cached sections and force restart sections read */ #define META_HOUSEKEEPING_COUNT (24 * 60 * 60) / HOUSEKEEPING_SLEEP // meta housekeeping after XX housekeepings - every 24h - #define STANDBY_HOUSEKEEPING_COUNT (60 * 60) / HOUSEKEEPING_SLEEP +#define EPG_SAVE_FREQUENTLY_COUNT (60 * 60) / HOUSEKEEPING_SLEEP // Timeout bei tcp/ip connections in ms #define READ_TIMEOUT_IN_SECONDS 2 @@ -82,6 +83,7 @@ static bool notify_complete = false; // number of timeouts after which we stop waiting for an EIT version number #define TIMEOUTS_EIT_VERSION_WAIT (2 * CHECK_RESTART_DMX_AFTER_TIMEOUTS) +static unsigned int epg_save_frequently; static long secondsToCache; static long secondsExtendedTextCache; static long oldEventsAre; @@ -1108,6 +1110,7 @@ static void commandSetConfig(int connfd, char *data, const unsigned /*dataLength oldEventsAre = (long)(pmsg->epg_old_events)*60L*60L; secondsExtendedTextCache = (long)(pmsg->epg_extendedcache)*60L*60L; max_events = pmsg->epg_max_events; + epg_save_frequently = pmsg->epg_save_frequently; unlockEvents(); bool time_wakeup = false; @@ -2036,7 +2039,7 @@ static void print_meminfo(void) //--------------------------------------------------------------------- static void *houseKeepingThread(void *) { - int count = 0, scount = 0; + int count = 0, scount = 0, ecount = 0; dprintf("housekeeping-thread started.\n"); pthread_setcanceltype (PTHREAD_CANCEL_ASYNCHRONOUS, 0); @@ -2065,6 +2068,23 @@ static void *houseKeepingThread(void *) removeOldEvents(oldEventsAre); // alte Events + ecount++; + if (ecount == EPG_SAVE_FREQUENTLY_COUNT) + { + if (epg_save_frequently > 0) + { + std::string d = epg_dir; + if (d.length() > 1) + { + std::string::iterator it = d.end() - 1; + if (*it == '/') + d.erase(it); + } + writeEventsToFile((char *)d.c_str()); + } + ecount = 0; + } + readLockEvents(); dprintf("Number of sptr events (event-ID): %u\n", (unsigned)mySIeventsOrderUniqueKey.size()); dprintf("Number of sptr events (service-id, start time, event-id): %u\n", (unsigned)mySIeventsOrderServiceUniqueKeyFirstStartTimeEventUniqueKey.size()); @@ -2118,6 +2138,7 @@ bool CEitManager::Start() secondsExtendedTextCache = config.epg_extendedcache*60L*60L; //hours oldEventsAre = config.epg_old_events*60L*60L; //hours max_events = config.epg_max_events; + epg_save_frequently = config.epg_save_frequently; if (find_executable("ntpdate").empty()) ntp_system_cmd_prefix = "ntpd -n -q -p "; diff --git a/src/gui/miscsettings_menu.cpp b/src/gui/miscsettings_menu.cpp index 6626ca77a..898b2e3b2 100644 --- a/src/gui/miscsettings_menu.cpp +++ b/src/gui/miscsettings_menu.cpp @@ -66,6 +66,7 @@ CMiscMenue::CMiscMenue() epg_save = NULL; epg_save_standby = NULL; + epg_save_frequently = NULL; epg_read = NULL; epg_dir = NULL; } @@ -80,6 +81,10 @@ CMiscMenue::~CMiscMenue() delete epg_save_standby; epg_save_standby = NULL; } + if (epg_save_frequently) { + delete epg_save_frequently; + epg_save_frequently = NULL; + } if (epg_read) { delete epg_read; epg_read = NULL; @@ -415,6 +420,9 @@ void CMiscMenue::showMiscSettingsMenuEpg(CMenuWidget *ms_epg) epg_save_standby = new CMenuOptionChooser(LOCALE_MISCSETTINGS_EPG_SAVE_STANDBY, &g_settings.epg_save_standby, OPTIONS_OFF0_ON1_OPTIONS, OPTIONS_OFF0_ON1_OPTION_COUNT, g_settings.epg_save); epg_save_standby->setHint("", LOCALE_MENU_HINT_EPG_SAVE_STANDBY); + epg_save_frequently = new CMenuOptionChooser(LOCALE_MISCSETTINGS_EPG_SAVE_FREQUENTLY, &g_settings.epg_save_frequently, OPTIONS_OFF0_ON1_OPTIONS, OPTIONS_OFF0_ON1_OPTION_COUNT, g_settings.epg_save, sectionsdConfigNotifier); + epg_save_frequently->setHint("", LOCALE_MENU_HINT_EPG_SAVE_FREQUENTLY); + epg_read = new CMenuOptionChooser(LOCALE_MISCSETTINGS_EPG_READ, &g_settings.epg_read, OPTIONS_OFF0_ON1_OPTIONS, OPTIONS_OFF0_ON1_OPTION_COUNT, true, this); epg_read->setHint("", LOCALE_MENU_HINT_EPG_READ); @@ -462,6 +470,7 @@ void CMiscMenue::showMiscSettingsMenuEpg(CMenuWidget *ms_epg) ms_epg->addItem(epg_save); ms_epg->addItem(epg_save_standby); + ms_epg->addItem(epg_save_frequently); ms_epg->addItem(epg_read); ms_epg->addItem(epg_dir); ms_epg->addItem(GenericMenuSeparatorLine); @@ -581,8 +590,11 @@ bool CMiscMenue::changeNotify(const neutrino_locale_t OptionName, void * /*data* if (g_settings.epg_save) g_settings.epg_read = true; epg_save_standby->setActive(g_settings.epg_save); + epg_save_frequently->setActive(g_settings.epg_save); epg_dir->setActive(g_settings.epg_save || g_settings.epg_read); + CNeutrinoApp::getInstance()->SendSectionsdConfig(); + ret = menu_return::RETURN_REPAINT; } else if (ARE_LOCALES_EQUAL(OptionName, LOCALE_MISCSETTINGS_EPG_READ)) diff --git a/src/gui/miscsettings_menu.h b/src/gui/miscsettings_menu.h index 6e82d409d..7cc778774 100644 --- a/src/gui/miscsettings_menu.h +++ b/src/gui/miscsettings_menu.h @@ -44,6 +44,7 @@ class CMiscMenue : public CMenuTarget, CChangeObserver COnOffNotifier* miscEpgScanNotifier; CMenuOptionChooser * epg_save; CMenuOptionChooser * epg_save_standby; + CMenuOptionChooser * epg_save_frequently; CMenuOptionChooser * epg_read; CMenuForwarder * epg_dir; int width; diff --git a/src/neutrino.cpp b/src/neutrino.cpp index 5cd71037b..438893820 100644 --- a/src/neutrino.cpp +++ b/src/neutrino.cpp @@ -512,6 +512,7 @@ int CNeutrinoApp::loadSetup(const char * fname) g_settings.epg_save = configfile.getBool("epg_save", false); g_settings.epg_save_standby = configfile.getBool("epg_save_standby", true); + g_settings.epg_save_frequently = configfile.getInt32("epg_save_frequently", false); g_settings.epg_read = configfile.getBool("epg_read", g_settings.epg_save); g_settings.epg_scan = configfile.getInt32("epg_scan", CEpgScan::SCAN_CURRENT); g_settings.epg_scan_mode = configfile.getInt32("epg_scan_mode", CEpgScan::MODE_OFF); @@ -1019,6 +1020,7 @@ void CNeutrinoApp::saveSetup(const char * fname) // epg configfile.setBool("epg_save", g_settings.epg_save); configfile.setBool("epg_save_standby", g_settings.epg_save_standby); + configfile.setInt32("epg_save_frequently", g_settings.epg_save_frequently); configfile.setBool("epg_read", g_settings.epg_read); configfile.setInt32("epg_scan", g_settings.epg_scan); configfile.setInt32("epg_scan_mode", g_settings.epg_scan_mode); @@ -1674,6 +1676,7 @@ void CNeutrinoApp::MakeSectionsdConfig(CSectionsdClient::epg_config& config) config.epg_old_events = g_settings.epg_old_events; config.epg_max_events = g_settings.epg_max_events; config.epg_extendedcache = g_settings.epg_extendedcache; + config.epg_save_frequently = g_settings.epg_save ? g_settings.epg_save_frequently : 0; config.epg_dir = g_settings.epg_dir; config.network_ntpserver = g_settings.network_ntpserver; config.network_ntprefresh = atoi(g_settings.network_ntprefresh.c_str()); diff --git a/src/system/locals.h b/src/system/locals.h index 2a5cf0779..ad1f4c7e3 100644 --- a/src/system/locals.h +++ b/src/system/locals.h @@ -983,6 +983,7 @@ typedef enum LOCALE_MENU_HINT_EPG_OLD_EVENTS, LOCALE_MENU_HINT_EPG_READ, LOCALE_MENU_HINT_EPG_SAVE, + LOCALE_MENU_HINT_EPG_SAVE_FREQUENTLY, LOCALE_MENU_HINT_EPG_SAVE_STANDBY, LOCALE_MENU_HINT_EPG_SCAN, LOCALE_MENU_HINT_EPG_SCAN_MODE, @@ -1417,6 +1418,7 @@ typedef enum LOCALE_MISCSETTINGS_EPG_OLD_EVENTS_HINT2, LOCALE_MISCSETTINGS_EPG_READ, LOCALE_MISCSETTINGS_EPG_SAVE, + LOCALE_MISCSETTINGS_EPG_SAVE_FREQUENTLY, LOCALE_MISCSETTINGS_EPG_SAVE_STANDBY, LOCALE_MISCSETTINGS_EPG_SCAN, LOCALE_MISCSETTINGS_EPG_SCAN_ALWAYS, diff --git a/src/system/locals_intern.h b/src/system/locals_intern.h index 0121fb3ca..38e37da30 100644 --- a/src/system/locals_intern.h +++ b/src/system/locals_intern.h @@ -983,6 +983,7 @@ const char * locale_real_names[] = "menu.hint_epg_old_events", "menu.hint_epg_read", "menu.hint_epg_save", + "menu.hint_epg_save_frequently", "menu.hint_epg_save_standby", "menu.hint_epg_scan", "menu.hint_epg_scan_mode", @@ -1417,6 +1418,7 @@ const char * locale_real_names[] = "miscsettings.epg_old_events_hint2", "miscsettings.epg_read", "miscsettings.epg_save", + "miscsettings.epg_save_frequently", "miscsettings.epg_save_standby", "miscsettings.epg_scan", "miscsettings.epg_scan_always", diff --git a/src/system/settings.h b/src/system/settings.h index c4c3e468b..5dde15d88 100644 --- a/src/system/settings.h +++ b/src/system/settings.h @@ -219,6 +219,7 @@ struct SNeutrinoSettings // EPG int epg_save; int epg_save_standby; + int epg_save_frequently; int epg_read; int epg_cache; int epg_old_events;