diff --git a/lib/timerdclient/timerdclient.cpp b/lib/timerdclient/timerdclient.cpp index 2b6dd2863..243052c78 100644 --- a/lib/timerdclient/timerdclient.cpp +++ b/lib/timerdclient/timerdclient.cpp @@ -345,6 +345,7 @@ int CTimerdClient::addTimerEvent( CTimerd::CTimerEventTypes evType, void* data, tri.epg_starttime = ri->epg_starttime; tri.epgID = ri->epgID; tri.recordingSafety = ri->recordingSafety; + tri.autoAdjustToEPG = ri->autoAdjustToEPG; tri.channel_ci = ri->channel_ci; //NI strncpy(tri.recordingDir, ri->recordingDir, RECORD_DIR_MAXLEN-1); length = sizeof( CTimerd::TransferRecordingInfo); diff --git a/lib/timerdclient/timerdclient.h b/lib/timerdclient/timerdclient.h index acd5cedf5..40ee5a06f 100644 --- a/lib/timerdclient/timerdclient.h +++ b/lib/timerdclient/timerdclient.h @@ -111,7 +111,7 @@ class CTimerdClient:private CBasicClient // adds new record timer event int addRecordTimerEvent(const t_channel_id channel_id, time_t alarmtime, time_t stoptime, uint64_t epgID=0, time_t epg_starttime=0, time_t announcetime = 0, - unsigned char apids=TIMERD_APIDS_STD, bool safety=false,std::string recDir="", bool forceAdd=true, bool channel_ci=false) //NI + unsigned char apids=TIMERD_APIDS_STD, bool safety=false,bool autoAdjust=false, std::string recDir="", bool forceAdd=true, bool channel_ci=false) //NI { CTimerd::RecordingInfo eventInfo; eventInfo.channel_id = channel_id; @@ -119,6 +119,7 @@ class CTimerdClient:private CBasicClient eventInfo.epg_starttime = epg_starttime; eventInfo.apids = apids; eventInfo.recordingSafety = safety; + eventInfo.autoAdjustToEPG = autoAdjust; eventInfo.channel_ci = channel_ci; //NI strncpy(eventInfo.recordingDir, recDir.c_str(), RECORD_DIR_MAXLEN); return addTimerEvent(CTimerd::TIMER_RECORD, &eventInfo, announcetime, alarmtime, stoptime,CTimerd::TIMERREPEAT_ONCE, 0,forceAdd); @@ -133,6 +134,7 @@ class CTimerdClient:private CBasicClient eventInfo.epg_starttime = epg_starttime; eventInfo.apids = apids; eventInfo.recordingSafety = false; + eventInfo.autoAdjustToEPG = false; return addTimerEvent(CTimerd::TIMER_IMMEDIATE_RECORD, &eventInfo, 0, alarmtime, stoptime); }; diff --git a/lib/timerdclient/timerdtypes.h b/lib/timerdclient/timerdtypes.h index 8c7ab2432..56e24651a 100644 --- a/lib/timerdclient/timerdtypes.h +++ b/lib/timerdclient/timerdtypes.h @@ -87,6 +87,7 @@ class CTimerd t_channel_id channel_id; unsigned char apids; bool recordingSafety; + bool autoAdjustToEPG; bool channel_ci; //NI - channel is member of CI bouquet? }; @@ -97,6 +98,7 @@ class CTimerd t_channel_id channel_id; unsigned char apids; bool recordingSafety; + bool autoAdjustToEPG; bool channel_ci; //NI - channel is member of CI bouquet? }; @@ -118,6 +120,7 @@ class CTimerd epgID = e.epgID; epg_starttime = e.epg_starttime; recordingSafety = e.recordingSafety; + autoAdjustToEPG = e.autoAdjustToEPG; channel_ci = e.channel_ci; //NI }; RecordingInfo& operator = (EventInfo& e) @@ -127,6 +130,7 @@ class CTimerd epgID = e.epgID; epg_starttime = e.epg_starttime; recordingSafety = e.recordingSafety; + autoAdjustToEPG = e.autoAdjustToEPG; channel_ci = e.channel_ci; //NI return *this; } diff --git a/src/gui/components/cc_detailsline.cpp b/src/gui/components/cc_detailsline.cpp index bf2401656..95cf9cc47 100644 --- a/src/gui/components/cc_detailsline.cpp +++ b/src/gui/components/cc_detailsline.cpp @@ -146,6 +146,6 @@ void CComponentsDetailLine::paint(bool do_save_bg) //so you can ensure correct applied system colors in relevant objects with unchanged instances. void CComponentsDetailLine::syncSysColors() { - col_body = COL_MENUCONTENT_PLUS_6; + col_body = COL_MENUCONTENT_PLUS_1; //NI col_shadow = COL_SHADOW_PLUS_0; } diff --git a/src/gui/components/cc_detailsline.h b/src/gui/components/cc_detailsline.h index 37d01e4f0..3228b72b2 100644 --- a/src/gui/components/cc_detailsline.h +++ b/src/gui/components/cc_detailsline.h @@ -57,7 +57,7 @@ class CComponentsDetailLine : public CComponents public: CComponentsDetailLine( const int& x_pos = 1,const int& y_pos_top = 1, const int& y_pos_down = 1, const int& h_mark_top_ = CC_HEIGHT_MIN , const int& h_mark_down_ = CC_HEIGHT_MIN, - fb_pixel_t color_line = COL_MENUCONTENT_PLUS_6, fb_pixel_t color_shadow = COL_SHADOW_PLUS_0); + fb_pixel_t color_line = COL_MENUCONTENT_PLUS_1, fb_pixel_t color_shadow = COL_SHADOW_PLUS_0); //NI ~CComponentsDetailLine(); ///set colors diff --git a/src/gui/epgview.cpp b/src/gui/epgview.cpp index b7c529ea1..f1e5f5058 100644 --- a/src/gui/epgview.cpp +++ b/src/gui/epgview.cpp @@ -1182,7 +1182,7 @@ int CEpgData::show(const t_channel_id channel_id, uint64_t a_id, time_t* a_start epgData.epg_times.startzeit + epgData.epg_times.dauer, epgData.eventID, epgData.epg_times.startzeit, epgData.epg_times.startzeit - (ANNOUNCETIME + 120 ), - TIMERD_APIDS_CONF, true, recDir,false) == -1) + TIMERD_APIDS_CONF, true, epgData.epg_times.startzeit - (ANNOUNCETIME + 120) > time(NULL), recDir, false) == -1) { if (askUserOnTimerConflict(epgData.epg_times.startzeit - (ANNOUNCETIME + 120), epgData.epg_times.startzeit + epgData.epg_times.dauer)) @@ -1192,7 +1192,7 @@ int CEpgData::show(const t_channel_id channel_id, uint64_t a_id, time_t* a_start epgData.epg_times.startzeit + epgData.epg_times.dauer, epgData.eventID, epgData.epg_times.startzeit, epgData.epg_times.startzeit - (ANNOUNCETIME + 120 ), - TIMERD_APIDS_CONF, true, recDir,true); + TIMERD_APIDS_CONF, true, epgData.epg_times.startzeit - (ANNOUNCETIME + 120) > time(NULL), recDir, true); ShowMsg(LOCALE_TIMER_EVENTRECORD_TITLE, LOCALE_TIMER_EVENTRECORD_MSG, CMessageBox::mbrBack, CMessageBox::mbBack, NEUTRINO_ICON_INFO); timeoutEnd = CRCInput::calcTimeoutEnd(g_settings.timing[SNeutrinoSettings::TIMING_EPG]); } @@ -1282,7 +1282,7 @@ int CEpgData::show(const t_channel_id channel_id, uint64_t a_id, time_t* a_start picname = imdb->getFilename(channel, epgData.eventID); CFileHelpers fh; - if (!fh.copyFile(imdb->posterfile.c_str(), picname.c_str(), 644)) + if (!fh.copyFile(imdb->posterfile.c_str(), picname.c_str(), 0644)) perror( "IMDb: error copy file" ); sleep(2); diff --git a/src/gui/followscreenings.cpp b/src/gui/followscreenings.cpp index 30034fd56..475b8cdc4 100644 --- a/src/gui/followscreenings.cpp +++ b/src/gui/followscreenings.cpp @@ -111,7 +111,7 @@ int CFollowScreenings::exec(CMenuTarget* /*parent*/, const std::string & actionK CZapitChannel * ch = CServiceManager::getInstance()->FindChannel(channel_id); if (g_Timerd->addRecordTimerEvent(channel_id, e->startTime, e->startTime + e->duration, e->eventID, - e->startTime, e->startTime - (ANNOUNCETIME + 120 ), apids, true, recDir, true, ch->bUseCI) == -1) { //NI + e->startTime, e->startTime - (ANNOUNCETIME + 120 ), apids, true, e->startTime - (ANNOUNCETIME + 120) > time(NULL), recDir, true, ch->bUseCI) == -1) { //NI //FIXME -- no error handling, but this shouldn't happen ... } else { #if 0 diff --git a/src/gui/hdd_info.cpp b/src/gui/hdd_info.cpp index f8feafe1d..ad6bfb4ea 100644 --- a/src/gui/hdd_info.cpp +++ b/src/gui/hdd_info.cpp @@ -128,7 +128,9 @@ int CHDDInfoMenu::exec(CMenuTarget* parent, const std::string &actionKey) } else doLoop = false; } - else if((msg == CRCInput::RC_sat) || (msg == CRCInput::RC_favorites)) { + else if (CNeutrinoApp::getInstance()->listModeKey(msg)) + { + // do nothing } else { diff --git a/src/gui/imageinfo_ni.cpp b/src/gui/imageinfo_ni.cpp index 36fe29a22..f5769a66b 100644 --- a/src/gui/imageinfo_ni.cpp +++ b/src/gui/imageinfo_ni.cpp @@ -165,7 +165,7 @@ int CImageInfoNI::exec(CMenuTarget* parent, const std::string &) res = menu_return::RETURN_EXIT_ALL; break; } - else if((msg == CRCInput::RC_sat) || (msg == CRCInput::RC_favorites)) { + else if (CNeutrinoApp::getInstance()->listModeKey(msg)) { g_RCInput->postMsg (msg, 0); res = menu_return::RETURN_EXIT_ALL; break; diff --git a/src/gui/infoviewer_bb.cpp b/src/gui/infoviewer_bb.cpp index 49f7906c6..f6a04825b 100644 --- a/src/gui/infoviewer_bb.cpp +++ b/src/gui/infoviewer_bb.cpp @@ -1084,7 +1084,7 @@ int CInfoViewerBB::check_ecmInfo() { int caid = 0; CFileHelpers fh; - if (fh.copyFile("/tmp/ecm.info", "/tmp/ecm.info.tmp", 644)) { + if (fh.copyFile("/tmp/ecm.info", "/tmp/ecm.info.tmp", 0644)) { g_InfoViewer->md5_ecmInfo = filehash((char *)"/tmp/ecm.info.tmp"); caid = parse_ecmInfo("/tmp/ecm.info.tmp"); } diff --git a/src/gui/lcd4l.cpp b/src/gui/lcd4l.cpp index 51b93f1c4..44cfa1a1f 100644 --- a/src/gui/lcd4l.cpp +++ b/src/gui/lcd4l.cpp @@ -498,8 +498,8 @@ void CLCD4l::ParseInfo(uint64_t parseID, bool newID, bool firstRun) Service = g_Locale->getText(LOCALE_RECORDINGMENU_TIMESHIFT); else if (CMoviePlayerGui::getInstance().p_movie_info) { - if (!CMoviePlayerGui::getInstance().p_movie_info->epgChannel.empty()) - Service = CMoviePlayerGui::getInstance().p_movie_info->epgChannel; + if (!CMoviePlayerGui::getInstance().p_movie_info->channelName.empty()) + Service = CMoviePlayerGui::getInstance().p_movie_info->channelName; } if (Service.empty()) @@ -519,8 +519,8 @@ void CLCD4l::ParseInfo(uint64_t parseID, bool newID, bool firstRun) case 3: /* play */ if (ModeTshift && CMoviePlayerGui::getInstance().p_movie_info) /* show channel-logo */ { - if (!GetLogoName(CMoviePlayerGui::getInstance().p_movie_info->epgId, - CMoviePlayerGui::getInstance().p_movie_info->epgChannel, + if (!GetLogoName(CMoviePlayerGui::getInstance().p_movie_info->channelId, + CMoviePlayerGui::getInstance().p_movie_info->channelName, Logo)) Logo = ICONSDIR "/" NEUTRINO_ICON_PLAY ICONSEXT; } diff --git a/src/gui/moviebrowser/mb.cpp b/src/gui/moviebrowser/mb.cpp index 852cb3ef1..4c7af09a4 100644 --- a/src/gui/moviebrowser/mb.cpp +++ b/src/gui/moviebrowser/mb.cpp @@ -798,7 +798,7 @@ int CMovieBrowser::exec(CMenuTarget* parent, const std::string & actionKey) poster = m_movieSelectionHandler->file.Name.substr(0, pos); poster += ".jpg"; CFileHelpers fh; - if (fh.copyFile(imdb->posterfile.c_str(), poster.c_str(), 644)) + if (fh.copyFile(imdb->posterfile.c_str(), poster.c_str(), 0644)) printf("* poster: %s\n", poster.c_str()); else printf("* poster: copy error\n"); diff --git a/src/gui/ni_menu.cpp b/src/gui/ni_menu.cpp index b411dd47b..5e7d7e753 100644 --- a/src/gui/ni_menu.cpp +++ b/src/gui/ni_menu.cpp @@ -157,7 +157,7 @@ int CNIMenu::exec(CMenuTarget* parent, const std::string &actionkey) buffer=NULL; CFileHelpers fhlp; - if (fhlp.copyFile("/tmp/ecm.info", "/tmp/ecm.info.tmp", 644)) + if (fhlp.copyFile("/tmp/ecm.info", "/tmp/ecm.info.tmp", 0644)) { if ((fh = fopen("/tmp/ecm.info.tmp", "r"))) { diff --git a/src/gui/timerlist.cpp b/src/gui/timerlist.cpp index fcc76fdb4..d954370fb 100644 --- a/src/gui/timerlist.cpp +++ b/src/gui/timerlist.cpp @@ -316,6 +316,7 @@ int CTimerList::exec(CMenuTarget* parent, const std::string & actionKey) eventinfo.channel_id=timerNew.channel_id; eventinfo.apids = TIMERD_APIDS_CONF; eventinfo.recordingSafety = false; + eventinfo.autoAdjustToEPG = false; timerNew.standby_on = (timerNew_standby_on == 1); void *data=NULL; if (timerNew.eventType == CTimerd::TIMER_STANDBY) @@ -333,6 +334,7 @@ int CTimerList::exec(CMenuTarget* parent, const std::string & actionKey) recinfo.channel_id=timerNew.channel_id; recinfo.apids=TIMERD_APIDS_CONF; recinfo.recordingSafety = false; + recinfo.autoAdjustToEPG = false; // FIXME -- add GUI option? timerNew.announceTime-= 120; // 2 more mins for rec timer strncpy(recinfo.recordingDir,timerNew.recordingDir,sizeof(recinfo.recordingDir)-1); diff --git a/src/nhttpd/web/Y_Blocks.txt b/src/nhttpd/web/Y_Blocks.txt index 6ecaa3aad..7f08329f7 100644 --- a/src/nhttpd/web/Y_Blocks.txt +++ b/src/nhttpd/web/Y_Blocks.txt @@ -374,6 +374,7 @@ function do_submit() + @@ -446,9 +447,16 @@ start-block~frame_boxcontrol ~ {=if-equal:{=var-get:startpage=}~control~Y_Tools_Boxcontrol.yhtm ~ - {=if-equal:{=var-get:startpage=}~remote~Y_Tools_Rcsim.yhtm~Y_NI_blank.yhtm=} + {=if-equal:{=var-get:startpage=}~remote~Y_Tools_Rcsim.yhtm + ~ + {=if-equal:{=var-get:startpage=}~screenshot~Y_Tools_Screenshot.yhtm?osd=1 + ~ + Y_NI_blank.yhtm + =} + =} =} - =}=} + =} +=} {=include-block:Y_Blocks.txt;frame_secondary=} end-block~frame_boxcontrol diff --git a/src/nhttpd/web/Y_Settings_yWeb.yhtm b/src/nhttpd/web/Y_Settings_yWeb.yhtm index 6f4c4b2af..864947720 100644 --- a/src/nhttpd/web/Y_Settings_yWeb.yhtm +++ b/src/nhttpd/web/Y_Settings_yWeb.yhtm @@ -48,11 +48,12 @@ function do_init(){ document.f.fb.selectedIndex = sel; obj_set_radio_value('screenshot_rc', "{=ini-get:/var/tuxbox/config/Y-Web.conf;screenshot_rc;false~cache=}"); val = "{=ini-get:/var/tuxbox/config/Y-Web.conf;start_page;bouquets~cache=}"; - var sel=3; + var sel=4; switch(val){ case "bouquets": sel=0; break; case "control": sel=1; break; case "remote": sel=2; break; + case "screenshot": sel=3; break; } document.f.start_page.selectedIndex = sel; style_old = "{=ini-get:/var/tuxbox/config/Y-Web.conf;style~cache=}"; @@ -171,6 +172,7 @@ select { + diff --git a/src/timerd/timerd.cpp b/src/timerd/timerd.cpp index a0bfe7af7..313859c8c 100644 --- a/src/timerd/timerd.cpp +++ b/src/timerd/timerd.cpp @@ -305,7 +305,7 @@ bool timerd_parse_command(CBasicMessage::Header &rmsg, int connfd) CTimerd::TransferRecordingInfo recInfo; CBasicServer::receive_data(connfd, &recInfo, sizeof(CTimerd::TransferRecordingInfo)); - if(recInfo.recordingSafety) + if(recInfo.recordingSafety) { int pre,post; CTimerManager::getInstance()->getRecordingSafety(pre,post); @@ -324,6 +324,8 @@ bool timerd_parse_command(CBasicMessage::Header &rmsg, int connfd) msgAddTimer.eventRepeat, msgAddTimer.repeatCount, recInfo.recordingDir, + recInfo.recordingSafety, + recInfo.autoAdjustToEPG, recInfo.channel_ci); //NI rspAddTimer.eventID = CTimerManager::getInstance()->addEvent(event); diff --git a/src/timerd/timermanager.cpp b/src/timerd/timermanager.cpp index 5ee767e2c..2547995ac 100644 --- a/src/timerd/timermanager.cpp +++ b/src/timerd/timermanager.cpp @@ -1134,7 +1134,9 @@ CTimerEvent_Record::CTimerEvent_Record(time_t announce_Time, time_t alarm_Time, event_id_t epgID, time_t epg_starttime, unsigned char apids, CTimerd::CTimerEventRepeat evrepeat, - uint32_t repeatcount, const std::string &recDir, bool channel_ci) : //NI + uint32_t repeatcount, const std::string &recDir, + bool _recordingSafety, bool _autoAdjustToEPG, + bool channel_ci) : //NI CTimerEvent(getEventType(), announce_Time, alarm_Time, stop_Time, evrepeat, repeatcount) { eventInfo.epgID = epgID; @@ -1144,6 +1146,8 @@ CTimerEvent_Record::CTimerEvent_Record(time_t announce_Time, time_t alarm_Time, eventInfo.channel_ci = channel_ci; //NI recordingDir = recDir; epgTitle=""; + autoAdjustToEPG = _autoAdjustToEPG; + recordingSafety = _recordingSafety; CShortEPGData epgdata; if (CEitManager::getInstance()->getEPGidShort(epgID, &epgdata)) epgTitle=epgdata.title; @@ -1173,6 +1177,13 @@ CTimerEvent_Record::CTimerEvent_Record(CConfigFile *config, int iId): epgTitle = config->getString("EPG_TITLE_"+id); dprintf("read EPG_TITLE_%s %s (%p)\n",id.c_str(),epgTitle.c_str(),&epgTitle); + + recordingSafety = config->getInt32("RECORDING_SAFETY_"+id, true); + dprintf("read RECORDING_SAFETY_%s %d\n",id.c_str(), recordingSafety); + + autoAdjustToEPG = config->getInt32("EPG_AUTO_ADJUST_"+id, true); + dprintf("read EPG_AUTO_ADJUST_TO_EPG_%s %d\n",id.c_str(), autoAdjustToEPG); + //NI eventInfo.channel_ci = config->getBool("EVENT_INFO_CHANNEL_CI_"+id); dprintf("read EVENT_INFO_CHANNEL_CI_%s %i\n",id.c_str(),eventInfo.channel_ci); @@ -1180,6 +1191,8 @@ CTimerEvent_Record::CTimerEvent_Record(CConfigFile *config, int iId): //------------------------------------------------------------ void CTimerEvent_Record::fireEvent() { + if (adjustToCurrentEPG()) + return; Refresh(); CTimerd::RecordingInfo ri=eventInfo; ri.eventID=eventID; @@ -1194,6 +1207,8 @@ void CTimerEvent_Record::fireEvent() //------------------------------------------------------------ void CTimerEvent_Record::announceEvent() { + if (adjustToCurrentEPG()) + return; Refresh(); CTimerd::RecordingInfo ri=eventInfo; ri.eventID=eventID; @@ -1242,6 +1257,13 @@ void CTimerEvent_Record::saveToConfig(CConfigFile *config) config->setString("EPG_TITLE_"+id,epgTitle); dprintf("set EPG_TITLE_%s to %s (%p)\n",id.c_str(),epgTitle.c_str(), &epgTitle); + + config->setInt32("RECORDING_SAFETY_"+id, recordingSafety); + dprintf("set RECORDING_SAFETY_%s to %d\n",id.c_str(), recordingSafety); + + config->setInt32("EPG_AUTO_ADJUST_"+id, autoAdjustToEPG); + dprintf("set EPG_AUTO_ADJUST_TO_EPG_%s to %d\n",id.c_str(), autoAdjustToEPG); + //NI config->setBool("EVENT_INFO_CHANNEL_CI_"+id, eventInfo.channel_ci); dprintf("set EVENT_INFO_CHANNEL_CI_%s to %i\n",id.c_str(),eventInfo.channel_ci); @@ -1286,6 +1308,38 @@ void CTimerEvent_Record::Refresh() if (eventInfo.epgID == 0) getEpgId(); } +//------------------------------------------------------------ +bool CTimerEvent_Record::adjustToCurrentEPG() +{ + if (!autoAdjustToEPG) + return false; + + CChannelEventList evtlist; + CEitManager::getInstance()->getEventsServiceKey(eventInfo.channel_id, evtlist); + + time_t now = time(NULL); + CChannelEventList::iterator first = evtlist.end(); + for (CChannelEventList::iterator e = evtlist.begin(); e != evtlist.end(); ++e) + { + if (e->startTime < now) + continue; + if (first == evtlist.end() || first->startTime > e->startTime) + first = e; + if (alarmTime <= e->startTime && e->startTime + (int)e->duration <= stopTime) + return false; + } + if (first == evtlist.end()) + return false; + + CTimerEvent_Record *event= new CTimerEvent_Record(first->startTime - (alarmTime - announceTime), first->startTime, first->startTime + first->duration, + eventInfo.channel_id, eventInfo.epgID, first->startTime, eventInfo.apids, + CTimerd::TIMERREPEAT_ONCE, 1, recordingDir, recordingSafety, autoAdjustToEPG, + eventInfo.channel_ci); //NI + CTimerManager::getInstance()->addEvent(event,false); + setState(CTimerd::TIMERSTATE_HASFINISHED); + + return true; +} //============================================================= // Zapto Event //============================================================= diff --git a/src/timerd/timermanager.h b/src/timerd/timermanager.h index 84f8a1af9..fbae3f2d0 100644 --- a/src/timerd/timermanager.h +++ b/src/timerd/timermanager.h @@ -117,13 +117,17 @@ class CTimerEvent_Record : public CTimerEvent CTimerd::EventInfo eventInfo; std::string recordingDir; std::string epgTitle; + bool recordingSafety; + bool autoAdjustToEPG; CTimerEvent_Record(time_t announceTime, time_t alarmTime, time_t stopTime, t_channel_id channel_id, event_id_t epgID = 0, time_t epg_starttime = 0, unsigned char apids = TIMERD_APIDS_STD, CTimerd::CTimerEventRepeat evrepeat = CTimerd::TIMERREPEAT_ONCE, - uint32_t repeatcount = 1, const std::string &recDir = "", bool channel_ci=false); //NI + uint32_t repeatcount = 1, const std::string &recDir = "", + bool _recordingSafety = true, bool _autoAdjustToEPG = true, + bool channel_ci=false); //NI CTimerEvent_Record(CConfigFile *config, int iId); virtual ~CTimerEvent_Record(){}; virtual CTimerd::CTimerEventTypes getEventType(void) const { return CTimerd::TIMER_RECORD; }; @@ -134,6 +138,7 @@ class CTimerEvent_Record : public CTimerEvent virtual void Reschedule(); virtual void getEpgId(); virtual void Refresh(); + virtual bool adjustToCurrentEPG(); }; class CTimerEvent_Zapto : public CTimerEvent_Record