summaryrefslogtreecommitdiff
path: root/epgsearch.c
diff options
context:
space:
mode:
Diffstat (limited to 'epgsearch.c')
-rw-r--r--epgsearch.c648
1 files changed, 648 insertions, 0 deletions
diff --git a/epgsearch.c b/epgsearch.c
new file mode 100644
index 0000000..464a083
--- /dev/null
+++ b/epgsearch.c
@@ -0,0 +1,648 @@
+/*
+Copyright (C) 2004-2007 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
+*/
+
+/*
+ * epgsearch.c: A plugin for the Video Disk Recorder
+ *
+ */
+
+#include <vector>
+#include <vdr/plugin.h>
+#include <vdr/status.h>
+#include <vdr/epg.h>
+#include <getopt.h>
+#include "menu_event.h"
+#include "menu_main.h"
+#include "menu_whatson.h"
+#include "i18n.h"
+#include "epgsearchsetup.h"
+#include "epgsearchcfg.h"
+#include "epgsearchext.h"
+#include "epgsearchcats.h"
+#include "menu_searchresults.h"
+#include "searchtimer_thread.h"
+#include "switchtimer_thread.h"
+#include "menu_myedittimer.h"
+#include "epgsearchtools.h"
+#include "rcfile.h"
+#include "changrp.h"
+#include "recstatus.h"
+#include "recdone.h"
+#include "blacklist.h"
+#include "menu_search.h"
+#include "templatefile.h"
+#include "menu_conflictcheck.h"
+#include "epgsearch.h"
+#include "conflictcheck_thread.h"
+#include "uservars.h"
+#include "mail.h"
+#include "svdrpclient.h"
+#include "noannounce.h"
+#include "menu_deftimercheckmethod.h"
+#include "timerdone.h"
+#include "epgsearchservices.h"
+#include "menu_quicksearch.h"
+#include "menu_announcelist.h"
+
+static const char VERSION[] = "0.9.24.beta9";
+static const char DESCRIPTION[] = trNOOP("search the EPG for repeats and more");
+
+// globals
+char *ConfigDir = NULL;
+bool reloadMenuConf = false;
+int updateForced = 0;
+
+// LogFile declaration and statics
+cLogFile LogFile;
+char *cLogFile::LogFileName = NULL;
+int cLogFile::loglevellimit = 0;
+
+// external SVDRPCommand
+const char *cSVDRPClient::SVDRPSendCmd = "svdrpsend.pl";
+
+cPluginEpgsearch::cPluginEpgsearch(void)
+{
+ showConflicts = false;
+ showAnnounces = false;
+ gl_recStatusMonitor = NULL;
+}
+
+cPluginEpgsearch::~cPluginEpgsearch()
+{
+ delete gl_recStatusMonitor;
+ cSearchTimerThread::Exit();
+ cSwitchTimerThread::Exit();
+ cConflictCheckThread::Exit();
+ if (ConfigDir) free(ConfigDir);
+}
+
+const char* cPluginEpgsearch::Version(void)
+{
+ return VERSION;
+}
+
+const char* cPluginEpgsearch::Description(void)
+{
+ return tr(DESCRIPTION);
+}
+
+const char *cPluginEpgsearch::CommandLineHelp(void)
+{
+ return " -f file, --svdrpsendcmd=file the path to svdrpsend.pl for external\n"
+ " SVDRP communitcation (default is internal\n"
+ " communication)\n"
+ " -c path, --config=path to specify a specific config dir for epgsearch\n"
+ " -l file, --logfile=file to specify a specific logfile for epgsearch\n"
+ " -v n, --verbose=n verbose level for logfile\n"
+ " -r, --reloadmenuconf reload epgsearchmenu.conf with plugin call\n"
+ " -m file, --mailcmd=file path to an alternative mail script for mail\n"
+ " notification\n";
+
+}
+
+const char *cPluginEpgsearch::MainMenuEntry(void)
+{
+ if (EPGSearchConfig.hidemenu)
+ return NULL;
+ if (isempty(EPGSearchConfig.mainmenuentry))
+ return tr("Program guide");
+ else
+ return EPGSearchConfig.mainmenuentry;
+}
+
+bool cPluginEpgsearch::ProcessArgs(int argc, char *argv[])
+{
+ // Implement command line argument processing here if applicable.
+
+
+ if (argc==5 && !strcmp(argv[0], "timermenu"))
+ { // yes, this is an ugly hack!
+ argv[1] = (char*) new cMenuMyEditTimer((cTimer*) argv[2], (bool) argv[3], (const cEvent*) argv[4]);
+ return true;
+ }
+
+ if (argc==8 && !strcmp(argv[0], "searchepg"))
+ {
+ cSearchExt* SearchExt = new cSearchExt;
+ strcpy(SearchExt->search,argv[2]);
+ if (atoi(argv[3]) > 0)
+ {
+ SearchExt->useChannel = true;
+ SearchExt->channelMin = Channels.GetByNumber(atoi(argv[3]));
+ SearchExt->channelMax = Channels.GetByNumber(atoi(argv[3]));
+ }
+ SearchExt->mode = atoi(argv[4]);
+ SearchExt->useTitle = atoi(argv[5]);
+ SearchExt->useSubtitle = atoi(argv[6]);
+ SearchExt->useDescription = atoi(argv[7]);
+ argv[1] = (char*) new cMenuSearchResultsForSearch(SearchExt, cTemplFile::GetTemplateByName("MenuSearchResults"));
+ return true;
+ }
+
+ static const struct option long_options[] = {
+ { "svdrpsendcmd", required_argument, NULL, 'f' },
+ { "config", required_argument, NULL, 'c' },
+ { "logfile", required_argument, NULL, 'l' },
+ { "verbose", required_argument, NULL, 'v' },
+ { "mailcmd", required_argument, NULL, 'm' },
+ { "reloadmenuconf", no_argument, NULL, 'r' },
+ { NULL }
+ };
+
+ int c=0,i=0;
+
+ while ((c = getopt_long(argc, argv, "f:c:l:v:m:r", long_options, &i)) != -1) {
+ switch (c) {
+
+ case 'f':
+ cSVDRPClient::SVDRPSendCmd = optarg;
+ EPGSearchConfig.useExternalSVDRP = 1;
+ break;
+ case 'c':
+ ConfigDir = strdup(optarg);
+ break;
+ case 'l':
+ cLogFile::LogFileName = optarg;
+ break;
+ case 'v':
+ cLogFile::loglevellimit = atoi(optarg);
+ break;
+ case 'r':
+ reloadMenuConf = true;
+ break;
+ case 'm':
+ cMailNotifier::MailCmd = optarg;
+ break;
+ default: return false;
+ }
+ }
+
+ if (EPGSearchConfig.useExternalSVDRP && access(cSVDRPClient::SVDRPSendCmd, F_OK) != 0)
+ {
+ LogFile.eSysLog("ERROR - can't find SVDRPSend script: '%s'", cSVDRPClient::SVDRPSendCmd);
+ cSVDRPClient::SVDRPSendCmd = NULL;
+ }
+
+ return true;
+}
+
+bool cPluginEpgsearch::Service(const char *Id, void *Data)
+{
+ if (strcmp(Id, "MainMenuHooksPatch-v1.0::osSchedule") == 0 && EPGSearchConfig.ReplaceOrgSchedule!=0)
+ {
+ if (Data == NULL)
+ return true;
+ cOsdMenu **menu = (cOsdMenu**) Data;
+ if (menu)
+ *menu = (cOsdMenu*) MainMenuAction();
+ return true;
+ }
+
+ if (strcmp(Id, "Epgsearch-search-v1.0") == 0) {
+ if (Data == NULL)
+ return true;
+ cSearchExt* SearchExt = new cSearchExt;
+
+ Epgsearch_search_v1_0* searchData = (Epgsearch_search_v1_0*) Data;
+ searchData->pResultMenu = NULL;
+ strcpy(SearchExt->search,searchData->query);
+ if (searchData->channelNr > 0)
+ {
+ SearchExt->useChannel = true;
+ SearchExt->channelMin = Channels.GetByNumber(searchData->channelNr);
+ SearchExt->channelMax = Channels.GetByNumber(searchData->channelNr);
+ }
+ SearchExt->mode = searchData->mode;
+ SearchExt->useTitle = searchData->useTitle;
+ SearchExt->useSubtitle = searchData->useSubTitle;
+ SearchExt->useDescription = searchData->useDescription;
+ searchData->pResultMenu = new cMenuSearchResultsForSearch(SearchExt, cTemplFile::GetTemplateByName("MenuSearchResults"));
+
+ return true;
+ }
+ if (strcmp(Id, "Epgsearch-exttimeredit-v1.0") == 0) {
+ if (Data == NULL)
+ return true;
+
+ Epgsearch_exttimeredit_v1_0* serviceData = (Epgsearch_exttimeredit_v1_0*) Data;
+ serviceData->pTimerMenu = new cMenuMyEditTimer(serviceData->timer, serviceData->bNew, serviceData->event);
+
+ return true;
+ }
+ if (strcmp(Id, "Epgsearch-updatesearchtimers-v1.0") == 0) {
+ if (Data == NULL)
+ return true;
+ else
+ {
+ Epgsearch_updatesearchtimers_v1_0* serviceData = (Epgsearch_updatesearchtimers_v1_0*) Data;
+ updateForced = serviceData->showMessage?2:1;
+ }
+ return true;
+ }
+ if (strcmp(Id, "Epgsearch-osdmessage-v1.0") == 0) {
+ if (Data == NULL)
+ return true;
+ else
+ {
+ Epgsearch_osdmessage_v1_0* serviceData = (Epgsearch_osdmessage_v1_0*) Data;
+ Skins.Message(serviceData->type, serviceData->message,5);
+ }
+ return true;
+ }
+ if (strcmp(Id, "Epgsearch-searchmenu-v1.0") == 0) {
+ if (Data == NULL)
+ return true;
+
+ EpgSearchMenu_v1_0* serviceData = (EpgSearchMenu_v1_0*) Data;
+ serviceData->Menu = new cMenuEPGSearchExt();
+
+ return true;
+ }
+ if (strcmp(Id, "Epgsearch-conflictmenu-v1.0") == 0) {
+ if (Data == NULL)
+ return true;
+
+ EpgSearchMenu_v1_0* serviceData = (EpgSearchMenu_v1_0*) Data;
+ serviceData->Menu = new cMenuConflictCheck();
+
+ return true;
+ }
+ if (strcmp(Id, "Epgsearch-lastconflictinfo-v1.0") == 0) {
+ if (Data == NULL)
+ return true;
+
+ Epgsearch_lastconflictinfo_v1_0* serviceData = (Epgsearch_lastconflictinfo_v1_0*) Data;
+ serviceData->nextConflict = cConflictCheckThread::m_cacheNextConflict;
+ serviceData->relevantConflicts = cConflictCheckThread::m_cacheRelevantConflicts;
+ serviceData->totalConflicts = cConflictCheckThread::m_cacheTotalConflicts;
+
+ return true;
+ }
+ if (strcmp(Id, "Epgsearch-searchresults-v1.0") == 0) {
+ if (Data == NULL)
+ return true;
+ cSearchExt* SearchExt = new cSearchExt;
+
+ Epgsearch_searchresults_v1_0* searchData = (Epgsearch_searchresults_v1_0*) Data;
+ searchData->pResultList = NULL;
+ strcpy(SearchExt->search,searchData->query);
+ if (searchData->channelNr > 0)
+ {
+ SearchExt->useChannel = true;
+ SearchExt->channelMin = Channels.GetByNumber(searchData->channelNr);
+ SearchExt->channelMax = Channels.GetByNumber(searchData->channelNr);
+ }
+ SearchExt->mode = searchData->mode;
+ SearchExt->useTitle = searchData->useTitle;
+ SearchExt->useSubtitle = searchData->useSubTitle;
+ SearchExt->useDescription = searchData->useDescription;
+
+ cSearchResults* results = SearchExt->Run();
+ // transfer to result list
+ if (results)
+ {
+ results->SortBy(CompareEventTime);
+ searchData->pResultList = new cList<Epgsearch_searchresults_v1_0::cServiceSearchResult>;
+ cSearchResult *result = results->First();
+ while (result)
+ {
+ searchData->pResultList->Add(new Epgsearch_searchresults_v1_0::cServiceSearchResult(result->event));
+ result = results->Next(result);
+ }
+ }
+ return true;
+ }
+ if (strcmp(Id, "Epgsearch-switchtimer-v1.0") == 0) {
+ if (Data == NULL)
+ return true;
+ else
+ {
+ Epgsearch_switchtimer_v1_0* serviceData = (Epgsearch_switchtimer_v1_0*) Data;
+ if (!serviceData->event)
+ return false;
+ switch(serviceData->mode){
+ case 0: {// query existance
+ cSwitchTimer *lTimer = SwitchTimers.InSwitchList(serviceData->event);
+ if (lTimer) {
+ serviceData->switchMinsBefore = lTimer->switchMinsBefore;
+ serviceData->announceOnly = lTimer->announceOnly;
+ } // if
+ serviceData->success=lTimer!=NULL;
+ break;
+ } // 0
+ case 1: { // add/modify
+ cSwitchTimer *lTimer = SwitchTimers.InSwitchList(serviceData->event);
+ if (lTimer) {
+ lTimer->switchMinsBefore = serviceData->switchMinsBefore;
+ lTimer->announceOnly = serviceData->announceOnly;
+ } else {
+ cMutexLock SwitchTimersLock(&SwitchTimers);
+ SwitchTimers.Add(new cSwitchTimer(serviceData->event,serviceData->switchMinsBefore,serviceData->announceOnly));
+ SwitchTimers.Save();
+ cSwitchTimerThread::Init();
+ } // if
+ serviceData->success=true;
+ break;
+ } // 1
+ case 2: {// delete
+ cSwitchTimer *lTimer = SwitchTimers.InSwitchList(serviceData->event);
+ serviceData->success=lTimer!=NULL;
+ if (lTimer) {
+ cMutexLock SwitchTimersLock(&SwitchTimers);
+ SwitchTimers.Del(lTimer);
+ SwitchTimers.Save();
+ } // if
+ break;
+ } // 2
+ default:
+ serviceData->success=false;
+ break;
+ } // switch
+ } // if
+ return true;
+ } // if
+ if (strcmp(Id, "Epgsearch-quicksearch-v1.0") == 0) {
+ if (Data == NULL)
+ return true;
+
+ EpgSearchMenu_v1_0* serviceData = (EpgSearchMenu_v1_0*) Data;
+ serviceData->Menu = new cMenuQuickSearch(new cSearchExt);
+
+ return true;
+ }
+ if (strcmp(Id, "Epgsearch-services-v1.0") == 0) {
+ if (Data == NULL)
+ return true;
+ Epgsearch_services_v1_0* serviceData = (Epgsearch_services_v1_0*) Data;
+ std::auto_ptr<cEpgsearchServiceHandler> autoHandler(new cEpgsearchServiceHandler);
+ serviceData->handler = autoHandler;
+ return true;
+ }
+
+ return false;
+}
+
+bool cPluginEpgsearch::Initialize(void)
+{
+#if APIVERSNUM < 10507
+ RegisterI18n(Phrases);
+#endif
+ return true;
+}
+
+bool cPluginEpgsearch::Start(void)
+{
+ if (!ConfigDir)
+ ConfigDir = strdup(cPlugin::ConfigDirectory("epgsearch"));
+
+ cPlugconfdirVar::dir = cPlugin::ConfigDirectory();
+
+ if (cLogFile::LogFileName)
+ LogFile.Open(cLogFile::LogFileName, Version());
+ else
+ LogFile.Open(AddDirectory(CONFIGDIR, "epgsearch.log"), Version());
+
+ gl_recStatusMonitor = new cRecStatusMonitor;
+
+ SearchExtCats.Load(AddDirectory(CONFIGDIR, "epgsearchcats.conf"), true);
+ ChannelGroups.Load(AddDirectory(CONFIGDIR, "epgsearchchangrps.conf"), true);
+ Blacklists.Load(AddDirectory(CONFIGDIR, "epgsearchblacklists.conf"));
+ SearchExts.Load(AddDirectory(CONFIGDIR, "epgsearch.conf"));
+ SearchTemplates.Load(AddDirectory(CONFIGDIR, "epgsearchtemplates.conf"));
+ RecsDone.Load(AddDirectory(CONFIGDIR, "epgsearchdone.data"));
+ SwitchTimers.Load(AddDirectory(CONFIGDIR, "epgsearchswitchtimers.conf"));
+ NoAnnounces.Load(AddDirectory(CONFIGDIR, "noannounce.conf"));
+ DefTimerCheckModes.Load(AddDirectory(CONFIGDIR, "deftimerchkmodes.conf"));
+ TimersDone.Load(AddDirectory(CONFIGDIR, "timersdone.conf"));
+
+ LoadMenuTemplates();
+ LoadUserVars();
+
+ cSearchTimerThread::Init(this);
+ cSwitchTimerThread::Init();
+ cConflictCheckThread::Init(this);
+
+ return true;
+}
+
+void cPluginEpgsearch::Stop(void)
+{
+ cSearchTimerThread::Exit();
+ cSwitchTimerThread::Exit();
+}
+
+void cPluginEpgsearch::Housekeeping(void)
+{
+ // Perform any cleanup or other regular tasks.
+}
+
+cOsdObject *cPluginEpgsearch::DoInitialSearch(char* rcFilename)
+{
+ cRCFile rcFile;
+ if (rcFile.Load(rcFilename))
+ {
+ cSearchExt* SearchExt = new cSearchExt;
+ strcpy(SearchExt->search,rcFile.Search);
+ if (rcFile.ChannelNr != -1)
+ {
+ SearchExt->useChannel = true;
+ SearchExt->channelMin = Channels.GetByNumber(rcFile.ChannelNr);
+ SearchExt->channelMax = Channels.GetByNumber(rcFile.ChannelNr);
+ }
+ SearchExt->mode = rcFile.SearchMode;
+ SearchExt->useTitle = rcFile.UseTitle;
+ SearchExt->useSubtitle = rcFile.UseSubtitle;
+ SearchExt->useDescription = rcFile.UseDescr;
+
+ remove(rcFilename);
+ return new cMenuSearchResultsForSearch(SearchExt, cTemplFile::GetTemplateByName("MenuSearchResults"));
+ }
+ else
+ LogFile.eSysLog("could not load '%s'", rcFilename);
+
+ return NULL;
+}
+
+cOsdObject *cPluginEpgsearch::MainMenuAction(void)
+{
+ if (reloadMenuConf)
+ LoadMenuTemplates();
+
+ if (showConflicts)
+ {
+ showConflicts = false;
+ return new cMenuConflictCheck();
+ }
+
+ if (showAnnounces)
+ {
+ showAnnounces = false;
+ return new cMenuAnnounceList(cSearchTimerThread::announceList);
+ }
+
+ // Perform the action when selected from the main VDR menu.
+ cOsdObject* pMenu = NULL;
+ char* rcFilename = strdup(AddDirectory(CONFIGDIR, ".epgsearchrc"));
+ if (access(rcFilename, F_OK) == 0)
+ pMenu = DoInitialSearch(rcFilename);
+ else
+ pMenu = new cMenuSearchMain();
+
+ free(rcFilename);
+ return pMenu;
+}
+
+void cPluginEpgsearch::LoadMenuTemplates()
+{
+ char* templateFilename = strdup(AddDirectory(CONFIGDIR, "epgsearchmenu.conf"));
+ if (access(templateFilename, F_OK) == 0)
+ {
+ cTemplFile templFile;
+ if (!templFile.Load(templateFilename))
+ {
+ templFile.Reset();
+ LogFile.eSysLog("could not load '%s'", templateFilename);
+ }
+ }
+ cTemplFile::PrepareDefaultTemplates();
+ free(templateFilename);
+}
+
+void cPluginEpgsearch::LoadUserVars()
+{
+ char* userVarFilename = strdup(AddDirectory(CONFIGDIR, "epgsearchuservars.conf"));
+ if (access(userVarFilename, F_OK) == 0)
+ {
+ LogFile.Log(1, "loading %s", userVarFilename);
+ cUserVarFile userVarFile;
+ if (!userVarFile.Load(userVarFilename))
+ LogFile.eSysLog("could not load '%s'", userVarFilename);
+ else
+ LogFile.Log(2,"loaded uservars from %s", userVarFilename);
+ }
+ free(userVarFilename);
+ UserVars.InitInternalVars();
+ UserVars.InitExtEPGVars();
+}
+
+cMenuSetupPage *cPluginEpgsearch::SetupMenu(void)
+{
+ // Return a setup menu in case the plugin supports one.
+ return new cMenuEPGSearchSetup;
+}
+
+bool cPluginEpgsearch::SetupParse(const char *Name, const char *Value)
+{
+ if (!strcasecmp(Name, "IsOrgSchedule")) return (EPGSearchConfig.ReplaceOrgSchedule == false);
+
+ if (!strcasecmp(Name, "HideMenu")) EPGSearchConfig.hidemenu = atoi(Value);
+ if (!strcasecmp(Name, "MainMenuEntry")) strcpy(EPGSearchConfig.mainmenuentry, Value);
+ if (!strcasecmp(Name, "ReplaceOrgSchedule")) EPGSearchConfig.ReplaceOrgSchedule = atoi(Value);
+ if (!strcasecmp(Name, "StartMenu")) EPGSearchConfig.StartMenu = atoi(Value);
+ if (!strcasecmp(Name, "RedKeyMode")) EPGSearchConfig.redkeymode = atoi(Value);
+ if (!strcasecmp(Name, "BlueKeyMode")) EPGSearchConfig.bluekeymode = atoi(Value);
+ if (!strcasecmp(Name, "ShowProgress")) EPGSearchConfig.showProgress = atoi(Value);
+ if (!strcasecmp(Name, "ShowChannelNr")) EPGSearchConfig.showChannelNr = atoi(Value);
+ if (!strcasecmp(Name, "UseOkForSwitch")) EPGSearchConfig.useOkForSwitch = atoi(Value);
+ if (!strcasecmp(Name, "MaxChannelMenuNow")) EPGSearchConfig.maxChannelMenuNow = atoi(Value);
+
+ if (!strcasecmp(Name, "ShowRadioChannels")) EPGSearchConfig.showRadioChannels = atoi(Value);
+ if (!strcasecmp(Name, "OnePressTimerCreation")) EPGSearchConfig.onePressTimerCreation = atoi(Value);
+ if (!strcasecmp(Name, "ShowFavoritesMenu")) EPGSearchConfig.showFavoritesMenu = atoi(Value);
+ if (!strcasecmp(Name, "FavoritesMenuTimespan")) EPGSearchConfig.FavoritesMenuTimespan = atoi(Value);
+
+ if (!strcasecmp(Name, "UserMode1Description")) EPGSearchConfig.ShowModes[showUserMode1].SetDescription(Value);
+ if (!strcasecmp(Name, "UserMode1Time")) EPGSearchConfig.ShowModes[showUserMode1].SetTime(atoi(Value));
+ if (!strcasecmp(Name, "UserMode1UseIt")) EPGSearchConfig.ShowModes[showUserMode1].SetUsage(atoi(Value));
+
+ if (!strcasecmp(Name, "UserMode2Description")) EPGSearchConfig.ShowModes[showUserMode2].SetDescription(Value);
+ if (!strcasecmp(Name, "UserMode2Time")) EPGSearchConfig.ShowModes[showUserMode2].SetTime(atoi(Value));
+ if (!strcasecmp(Name, "UserMode2UseIt")) EPGSearchConfig.ShowModes[showUserMode2].SetUsage(atoi(Value));
+
+ if (!strcasecmp(Name, "UserMode3Description")) EPGSearchConfig.ShowModes[showUserMode3].SetDescription(Value);
+ if (!strcasecmp(Name, "UserMode3Time")) EPGSearchConfig.ShowModes[showUserMode3].SetTime(atoi(Value));
+ if (!strcasecmp(Name, "UserMode3UseIt")) EPGSearchConfig.ShowModes[showUserMode3].SetUsage(atoi(Value));
+
+ if (!strcasecmp(Name, "UserMode4Description")) EPGSearchConfig.ShowModes[showUserMode4].SetDescription(Value);
+ if (!strcasecmp(Name, "UserMode4Time")) EPGSearchConfig.ShowModes[showUserMode4].SetTime(atoi(Value));
+ if (!strcasecmp(Name, "UserMode4UseIt")) EPGSearchConfig.ShowModes[showUserMode4].SetUsage(atoi(Value));
+
+ if (!strcasecmp(Name, "UseSearchTimers")) EPGSearchConfig.useSearchTimers = atoi(Value);
+ if (!strcasecmp(Name, "UpdateIntervall")) EPGSearchConfig.UpdateIntervall = atoi(Value);
+ if (!strcasecmp(Name, "SVDRPPort")) EPGSearchConfig.SVDRPPort = atoi(Value);
+ if (!strcasecmp(Name, "CheckTimerConflicts")) EPGSearchConfig.checkTimerConflictsAfterUpdate = atoi(Value);
+ if (!strcasecmp(Name, "CheckTimerConflictsPriority")) EPGSearchConfig.checkMinPriority = atoi(Value);
+ if (!strcasecmp(Name, "CheckTimerConflictsDays")) EPGSearchConfig.checkMaxDays = atoi(Value);
+ if (!strcasecmp(Name, "CheckConflictsIntervall")) EPGSearchConfig.conflictCheckIntervall = atoi(Value);
+ if (!strcasecmp(Name, "CheckConflictsWithinLimit")) EPGSearchConfig.conflictCheckWithinLimit = atoi(Value);
+ if (!strcasecmp(Name, "CheckConflictsIntervall2")) EPGSearchConfig.conflictCheckIntervall2 = atoi(Value);
+ if (!strcasecmp(Name, "CheckConflictsMinDuration")) EPGSearchConfig.checkMinDuration = atoi(Value);
+ if (!strcasecmp(Name, "CheckConflictsAfterTimerProg")) EPGSearchConfig.checkTimerConflAfterTimerProg = atoi(Value);
+ if (!strcasecmp(Name, "CheckConflictsOnRecording")) EPGSearchConfig.checkTimerConflOnRecording = atoi(Value);
+ if (!strcasecmp(Name, "NoConflMsgWhileReplay")) EPGSearchConfig.noConflMsgWhileReplay = atoi(Value);
+ if (!strcasecmp(Name, "NoAnnounceWhileReplay")) EPGSearchConfig.noAnnounceWhileReplay = atoi(Value);
+ if (!strcasecmp(Name, "TimerProgRepeat")) EPGSearchConfig.TimerProgRepeat = atoi(Value);
+
+ if (!strcasecmp(Name, "TimeIntervallFRFF")) EPGSearchConfig.timeShiftValue = atoi(Value);
+ if (!strcasecmp(Name, "ToggleGreenYellow")) EPGSearchConfig.toggleGreenYellow = atoi(Value);
+
+ if (!strcasecmp(Name, "DefPriority")) EPGSearchConfig.DefPriority = atoi(Value);
+ if (!strcasecmp(Name, "DefLifetime")) EPGSearchConfig.DefLifetime = atoi(Value);
+ if (!strcasecmp(Name, "DefMarginStart")) EPGSearchConfig.DefMarginStart = atoi(Value);
+ if (!strcasecmp(Name, "DefMarginStop")) EPGSearchConfig.DefMarginStop = atoi(Value);
+
+ if (!strcasecmp(Name, "IgnorePayTV")) EPGSearchConfig.ignorePayTV = atoi(Value);
+
+ if (!strcasecmp(Name, "DefRecordingDir")) strcpy(EPGSearchConfig.defrecdir, Value);
+ if (!strcasecmp(Name, "UseVDRTimerEditMenu")) EPGSearchConfig.useVDRTimerEditMenu = atoi(Value);
+
+ if (!strcasecmp(Name, "ShowChannelGroups")) EPGSearchConfig.showChannelGroups = atoi(Value);
+ if (!strcasecmp(Name, "ShowDaySeparators")) EPGSearchConfig.showDaySeparators = atoi(Value);
+
+ if (!strcasecmp(Name, "ShowEmptyChannels")) EPGSearchConfig.showEmptyChannels = atoi(Value);
+
+ if (!strcasecmp(Name, "DefSearchTemplateID")) EPGSearchConfig.DefSearchTemplateID = atoi(Value);
+
+ if (!strcasecmp(Name, "AddSubtitleToTimerMode")) EPGSearchConfig.addSubtitleToTimer = (addSubtitleToTimerMode) atoi(Value);
+
+ if (!strcasecmp(Name, "MailViaScript")) EPGSearchConfig.mailViaScript = atoi(Value);
+ if (!strcasecmp(Name, "MailNotificationSearchtimers")) EPGSearchConfig.sendMailOnSearchtimers = atoi(Value);
+ if (!strcasecmp(Name, "MailNotificationConflicts")) EPGSearchConfig.sendMailOnConflicts = atoi(Value);
+ if (!strcasecmp(Name, "MailAddress")) strcpy(EPGSearchConfig.MailAddress, Value);
+ if (!strcasecmp(Name, "MailAddressTo")) strcpy(EPGSearchConfig.MailAddressTo, Value);
+
+ if (isempty(EPGSearchConfig.MailAddressTo))
+ strcpy(EPGSearchConfig.MailAddressTo, EPGSearchConfig.MailAddress);
+
+ if (!strcasecmp(Name, "MailServer")) strcpy(EPGSearchConfig.MailServer, Value);
+ if (!strcasecmp(Name, "MailUseAuth")) EPGSearchConfig.MailUseAuth = atoi(Value);
+ if (!strcasecmp(Name, "MailAuthUser")) strcpy(EPGSearchConfig.MailAuthUser, Value);
+ if (!strcasecmp(Name, "MailAuthPass")) strcpy(EPGSearchConfig.MailAuthPass, Value);
+
+ if (!strcasecmp(Name, "LastMailConflicts")) strcpy(EPGSearchConfig.LastMailConflicts, Value);
+
+ return true;
+}
+
+VDRPLUGINCREATOR(cPluginEpgsearch); // Don't touch this!
+