From 4623e7b345f850ac44cdcacbd0e43e139a4baa6a Mon Sep 17 00:00:00 2001 From: louis Date: Sun, 13 Mar 2016 16:07:21 +0100 Subject: added VDR 2.3.1 compatibility --- recmenuview.c | 1757 +++++++++++++++++++++++++++++---------------------------- 1 file changed, 897 insertions(+), 860 deletions(-) (limited to 'recmenuview.c') diff --git a/recmenuview.c b/recmenuview.c index a4c8ceb..67c4ac4 100644 --- a/recmenuview.c +++ b/recmenuview.c @@ -1,860 +1,897 @@ -#include "tvguidengosd.h" -#include "recmenuview.h" - -cRecMenuView::cRecMenuView(void) { - active = false; - recMenuView = NULL; - recMenuViewBuffer = NULL; - recMenuViewBuffer2 = NULL; - event = NULL; - displayEvent = NULL; - activeMenu = NULL; - activeMenuBuffer = NULL; - activeMenuBuffer2 = NULL; - recManager = new cRecManager(); - recManager->SetEPGSearchPlugin(); - timerConflicts = NULL; -} - -cRecMenuView::~cRecMenuView() { - if (activeMenu) - delete activeMenu; - if (activeMenuBuffer) - delete activeMenuBuffer; - if (activeMenuBuffer2) - delete activeMenuBuffer2; - if (recMenuView) - delete recMenuView; - if (recMenuViewBuffer) - delete recMenuViewBuffer; - if (recMenuViewBuffer2) - delete recMenuViewBuffer2; -} - -void cRecMenuView::Init(skindesignerapi::cOsdView *recMenuView, skindesignerapi::cOsdView *recMenuViewBuffer, skindesignerapi::cOsdView *recMenuViewBuffer2) { - active = true; - this->recMenuView = recMenuView; - this->recMenuViewBuffer = recMenuViewBuffer; - this->recMenuViewBuffer2 = recMenuViewBuffer2; -} - -void cRecMenuView::DisplayRecMenu(const cEvent *event) { - if (!event) { - return; - } - this->event = event; - activeMenu = new cRecMenuMain(recManager->EpgSearchAvailable(), recManager->CheckEventForTimer(event), SwitchTimers.EventInSwitchList(event)); - DisplayMenu(); -} - -void cRecMenuView::DisplayFavorites(void) { - vector favorites; - recManager->GetFavorites(&favorites); - activeMenu = new cRecMenuFavorites(favorites); - DisplayMenu(); -} - -void cRecMenuView::DisplayRecSearch(const cEvent *e) { - activeMenu = new cRecMenuRecordingSearch(e->Title() ? e->Title() : ""); - DisplayMenu(); -} - -void cRecMenuView::DisplaySearchEPG(const cEvent *e) { - activeMenu = new cRecMenuSearch(e->Title() ? e->Title() : "", false); - DisplayMenu(); -} - -void cRecMenuView::Close(void) { - if (activeMenu) { - delete activeMenu; - activeMenu = NULL; - } - if (activeMenuBuffer) { - delete activeMenuBuffer; - activeMenuBuffer = NULL; - } - if (activeMenuBuffer2) { - delete activeMenuBuffer2; - activeMenuBuffer2 = NULL; - } - delete recMenuView; - recMenuView = NULL; - delete recMenuViewBuffer; - recMenuViewBuffer = NULL; - delete recMenuViewBuffer2; - recMenuViewBuffer2 = NULL; - active = false; -} - -void cRecMenuView::Hide(bool full) { - if (recMenuViewBuffer) { - recMenuViewBuffer->Deactivate(true); - if (full) - recMenuView->Deactivate(true); - } else - recMenuView->Deactivate(true); -} - -void cRecMenuView::Activate(bool full) { - if (recMenuViewBuffer) { - recMenuViewBuffer->Activate(); - if (full) - recMenuView->Activate(); - } else - recMenuView->Activate(); -} - -eOSState cRecMenuView::ProcessKey(eKeys Key) { - eOSState state = osContinue; - eRecMenuState nextState = rmsContinue; - if (!activeMenu) - return state; - nextState = activeMenu->ProcessKey(Key); - if ((nextState == rmsClose) || ((nextState == rmsNotConsumed)&&(Key == kBack))) { - if (activeMenuBuffer2) { - delete activeMenu; - activeMenu = activeMenuBuffer2; - activeMenuBuffer2 = NULL; - activeMenu->Show(); - return osContinue; - } else if (activeMenuBuffer) { - delete activeMenu; - activeMenu = activeMenuBuffer; - activeMenuBuffer = NULL; - activeMenu->Show(); - return osContinue; - } else { - Close(); - return osEnd; - } - } - state = StateMachine(nextState); - if (activeMenu) - activeMenu->Flush(); - return state; -} - -void cRecMenuView::DisplayMenu(bool buffer, bool buffer2) { - if (!activeMenu) - return; - if (buffer) { - activeMenu->Init(recMenuViewBuffer); - } else if (buffer2) { - activeMenu->Init(recMenuViewBuffer2); - } else { - activeMenu->Init(recMenuView); - } - if (cRecMenuTimeline *timeline = dynamic_cast(activeMenu)) { - timeline->SetHeaderTimer(); - } - activeMenu->Draw(); -} - -void cRecMenuView::DisplaySearchTimerList(void) { - delete activeMenu; - vector searchTimers; - recManager->GetSearchTimers(&searchTimers); - activeMenu = new cRecMenuSearchTimers(searchTimers); - DisplayMenu(); -} - -bool cRecMenuView::DisplayTimerConflict(cTimer *timer) { - int timerID = 0; - for (cTimer *t = Timers.First(); t; t = Timers.Next(t)) { - if (t == timer) - return DisplayTimerConflict(timerID); - timerID++; - } - return false; -} - -bool cRecMenuView::DisplayTimerConflict(int timerID) { - if (timerConflicts) - delete timerConflicts; - timerConflicts = recManager->CheckTimerConflict(); - if (!timerConflicts) - return false; - int showTimerConflict = timerConflicts->GetCorrespondingConflict(timerID); - if (showTimerConflict > -1) { - timerConflicts->SetCurrentConflict(showTimerConflict); - cTVGuideTimerConflict *conflict = timerConflicts->GetCurrentConflict(); - if (!conflict) - return false; - activeMenu = new cRecMenuTimerConflict(conflict); - DisplayMenu(); - return true; - } - return false; -} - -void cRecMenuView::DisplayFavoriteResults(string header, const cEvent **result, int numResults) { - if (numResults) { - activeMenuBuffer = activeMenu; - activeMenuBuffer->Hide(); - activeMenu = new cRecMenuSearchTimerResults(header, result, numResults, "", rmsFavoritesRecord); - } else { - activeMenuBuffer = activeMenu; - activeMenuBuffer->Hide(); - activeMenu = new cRecMenuSearchTimerNothingFound(header); - } - DisplayMenu(true); -} - -eOSState cRecMenuView::StateMachine(eRecMenuState nextState) { - eOSState state = osContinue; - switch (nextState) { -/*************************************************************************************** -* INSTANT RECORDING -****************************************************************************************/ - case rmsInstantRecord: { - //caller: main menu or folder chooser - //Creating timer for active Event, if no conflict, confirm and exit - string recFolder = ""; - if (cRecMenuAskFolder *menu = dynamic_cast(activeMenu)) { - recFolder = menu->GetFolder(); - } - delete activeMenu; - cTimer *timer = recManager->createTimer(event, recFolder); - if (!DisplayTimerConflict(timer)) { - activeMenu = new cRecMenuConfirmTimer(event); - DisplayMenu(); - } - break; } - case rmsInstantRecordFolder: { - //caller: main menu - //Asking for Folder - delete activeMenu; - activeMenu = new cRecMenuAskFolder(event, rmsInstantRecord); - DisplayMenu(); - break; } - case rmsDeleteTimer: { - //caller: main menu - //delete timer for active event - delete activeMenu; - if (recManager->IsRecorded(event)) { - activeMenu = new cRecMenuAskDeleteTimer(event); - } else { - recManager->DeleteTimer(event); - activeMenu = new cRecMenuConfirmDeleteTimer(event); - } - DisplayMenu(); - break; } - case rmsDeleteTimerConfirmation: { - //delete running timer for active event - recManager->DeleteTimer(event); - delete activeMenu; - activeMenu = new cRecMenuConfirmDeleteTimer(event); - DisplayMenu(); - break; } - case rmsEditTimer: { - //edit timer for active event - cTimer *timer = recManager->GetTimerForEvent(event); - if (timer) { - delete activeMenu; - activeMenu = new cRecMenuEditTimer(timer, rmsSaveTimer); - DisplayMenu(); - } - break; } - case rmsSaveTimer: { - //caller: cRecMenuEditTimer - //save timer for active event - cTimer timerModified; - cTimer *originalTimer; - if (cRecMenuEditTimer *menu = dynamic_cast(activeMenu)) { - timerModified = menu->GetTimer(); - originalTimer = menu->GetOriginalTimer(); - } else break; - recManager->SaveTimer(originalTimer, timerModified); - Close(); - state = osEnd; - break; } - case rmsIgnoreTimerConflict: - //caller: cRecMenuTimerConflict - //Confirming created Timer - delete activeMenu; - activeMenu = new cRecMenuConfirmTimer(event); - DisplayMenu(); - break; - case rmsTimerConflictShowInfo: { - //caller: cRecMenuTimerConflict - int timerIndex; - if (cRecMenuTimerConflict *menu = dynamic_cast(activeMenu)) { - timerIndex = menu->GetTimerConflictIndex(); - } else break; - int timerID = timerConflicts->GetCurrentConflictTimerID(timerIndex); - cTimer *t = Timers.Get(timerID); - if (t) { - displayEvent = t->Event(); - if (displayEvent) { - state = osUser1; - } - } - break; } - case rmsDeleteTimerConflictMenu: { - //caller: cRecMenuTimerConflict - //delete timer out of current timer conflict - int timerIndex; - if (cRecMenuTimerConflict *menu = dynamic_cast(activeMenu)) { - timerIndex = menu->GetTimerConflictIndex(); - } else break; - int timerID = timerConflicts->GetCurrentConflictTimerID(timerIndex); - recManager->DeleteTimer(timerID); - delete activeMenu; - if (!DisplayTimerConflict(timerID)) { - activeMenu = new cRecMenuConfirmTimer(event); - DisplayMenu(); - } - break; } - case rmsEditTimerConflictMenu: { - //caller: cRecMenuTimerConflict - //edit timer out of current timer conflict - int timerIndex; - if (cRecMenuTimerConflict *menu = dynamic_cast(activeMenu)) { - timerIndex = menu->GetTimerConflictIndex(); - } else break; - int timerID = timerConflicts->GetCurrentConflictTimerID(timerIndex); - cTimer *timer = Timers.Get(timerID); - if (timer) { - delete activeMenu; - activeMenu = new cRecMenuEditTimer(timer, rmsSaveTimerConflictMenu); - DisplayMenu(); - } - break; } - case rmsSaveTimerConflictMenu: { - //caller: cRecMenuEditTimer - //save timer from current timer conflict - cTimer timerModified; - cTimer *originalTimer; - if (cRecMenuEditTimer *menu = dynamic_cast(activeMenu)) { - timerModified = menu->GetTimer(); - originalTimer = menu->GetOriginalTimer(); - } else break; - recManager->SaveTimer(originalTimer, timerModified); - delete activeMenu; - if (!DisplayTimerConflict(originalTimer)) { - activeMenu = new cRecMenuConfirmTimer(event); - DisplayMenu(); - } - break; } -/*************************************************************************************** -* SERIES TIMER -****************************************************************************************/ - case rmsSeriesTimer: { - //caller: main menu oder folder chooser - string recFolder = ""; - if (cRecMenuAskFolder *menu = dynamic_cast(activeMenu)) { - recFolder = menu->GetFolder(); - } - delete activeMenu; - cChannel *channel = Channels.GetByChannelID(event->ChannelID()); - activeMenu = new cRecMenuSeriesTimer(channel, event, recFolder); - DisplayMenu(); - break; } - case rmsSeriesTimerFolder: - //caller: main menu - //Asking for Folder - delete activeMenu; - activeMenu = new cRecMenuAskFolder(event, rmsSeriesTimer); - DisplayMenu(); - break; - case rmsSeriesTimerCreate: { - //caller: cRecMenuSeriesTimer - cTimer *seriesTimer; - if (cRecMenuSeriesTimer *menu = dynamic_cast(activeMenu)) { - seriesTimer = menu->GetTimer(); - } else break; - recManager->CreateSeriesTimer(seriesTimer); - delete activeMenu; - activeMenu = new cRecMenuConfirmSeriesTimer(seriesTimer); - DisplayMenu(); - break; } -/********************************************************************************************** - * SWITCH TIMER - ***********************************************************************************************/ - case rmsSwitchTimer: - delete activeMenu; - activeMenu = new cRecMenuSwitchTimer(); - DisplayMenu(); - break; - case rmsSwitchTimerCreate: { - cSwitchTimer switchTimer; - if (cRecMenuSwitchTimer *menu = dynamic_cast(activeMenu)) { - switchTimer = menu->GetSwitchTimer(); - } else break; - bool success = recManager->CreateSwitchTimer(event, switchTimer); - delete activeMenu; - activeMenu = new cRecMenuSwitchTimerConfirm(success); - DisplayMenu(); - break; } - case rmsSwitchTimerDelete: - recManager->DeleteSwitchTimer(event); - delete activeMenu; - activeMenu = new cRecMenuSwitchTimerDelete(); - DisplayMenu(); - break; -/********************************************************************************************** - * SEARCH TIMER - ***********************************************************************************************/ - case rmsSearchTimer: - //Caller: main menu - //set search String for search timer - delete activeMenu; - activeMenu = new cRecMenuSearchTimer(event); - DisplayMenu(); - break; - case rmsSearchTimerOptions: { - //Caller: cRecMenuSearchTimer, cRecMenuSearchTimerTemplates - //Choose to set options manually or by template - string searchString; - cTVGuideSearchTimer searchTimer; - bool reload = false; - if (cRecMenuSearchTimer *menu = dynamic_cast(activeMenu)) { - searchString = menu->GetSearchString(); - } else if (cRecMenuSearchTimerTemplatesCreate *menu = dynamic_cast(activeMenu)) { - searchTimer = menu->GetSearchTimer(); - reload = true; - } else break; - delete activeMenu; - if (searchString.size() < 4) { - activeMenu = new cRecMenuSearchTimer(event); - } else { - if (!reload) { - searchTimer.SetSearchString(searchString); - } - vector epgSearchTemplates; - recManager->ReadEPGSearchTemplates(&epgSearchTemplates); - if (epgSearchTemplates.size() > 0) { - activeMenu = new cRecMenuSearchTimerTemplates(searchTimer, epgSearchTemplates); - } else { - activeMenu = new cRecMenuSearchTimerEdit(searchTimer, false); - } - } - DisplayMenu(); - break; } - case rmsSearchTimers: { - //caller: main menu - DisplaySearchTimerList(); - break; } - case rmsSearchTimerEdit: - case rmsSearchTimerEditAdvanced: { - //caller: cRecMenuSearchTimers, cRecMenuSearchTimerEdit, cRecMenuSearchTimerTemplates - cTVGuideSearchTimer searchTimer; - bool advancedOptions = false; - if (cRecMenuSearchTimers *menu = dynamic_cast(activeMenu)) { - searchTimer = menu->GetSearchTimer(); - } else if (cRecMenuSearchTimerEdit *menu = dynamic_cast(activeMenu)) { - searchTimer = menu->GetSearchTimer(); - advancedOptions = (nextState == rmsSearchTimerEditAdvanced)?true:false; - } else if (cRecMenuSearchTimerTemplates *menu = dynamic_cast(activeMenu)) { - searchTimer = menu->GetSearchTimer(); - } else break; - delete activeMenu; - activeMenu = new cRecMenuSearchTimerEdit(searchTimer, advancedOptions); - DisplayMenu(); - break; } - case rmsSearchTimerTest: { - //caller: cRecMenuSearchTimerEdit, cRecMenuSearchTimerTemplatesCreate, cRecMenuSearchTimers, cRecMenuFavorites - //show results of currently choosen search timer - cTVGuideSearchTimer searchTimer; - eRecMenuState recState = rmsDisabled; - if (cRecMenuSearchTimerEdit *menu = dynamic_cast(activeMenu)) { - searchTimer = menu->GetSearchTimer(); - recState = rmsSearchTimerRecord; - } else if (cRecMenuSearchTimers *menu = dynamic_cast(activeMenu)) { - searchTimer = menu->GetSearchTimer(); - recState = rmsSearchTimerRecord; - } else if (cRecMenuSearchTimerTemplatesCreate *menu = dynamic_cast(activeMenu)) { - searchTimer = menu->GetSearchTimer(); - TVGuideEPGSearchTemplate tmpl = menu->GetTemplate(); - searchTimer.SetTemplate(tmpl.templValue); - searchTimer.Parse(true); - } else if (cRecMenuFavorites *menu = dynamic_cast(activeMenu)) { - searchTimer = menu->GetFavorite(); - recState = rmsFavoritesRecord; - } - else break; - int numSearchResults = 0; - string searchString = searchTimer.BuildSearchString(); - const cEvent **searchResult = recManager->PerformSearchTimerSearch(searchString, numSearchResults); - if (numSearchResults) { - activeMenuBuffer = activeMenu; - activeMenuBuffer->Hide(); - activeMenu = new cRecMenuSearchTimerResults(searchTimer.SearchString(), searchResult, numSearchResults, "", recState); - } else { - activeMenuBuffer = activeMenu; - activeMenuBuffer->Hide(); - activeMenu = new cRecMenuSearchTimerNothingFound(searchTimer.SearchString()); - } - DisplayMenu(true); - break; } - case rmsSearchTimerSave: { - //caller: cRecMenuSearchTimerEdit, cRecMenuSearchTimerTemplatesCreate - //create new or modify existing search timer - cTVGuideSearchTimer searchTimer; - if (cRecMenuSearchTimerEdit *menu = dynamic_cast(activeMenu)) { - searchTimer = menu->GetSearchTimer(); - } else if (cRecMenuSearchTimerTemplatesCreate *menu = dynamic_cast(activeMenu)) { - searchTimer = menu->GetSearchTimer(); - TVGuideEPGSearchTemplate tmpl = menu->GetTemplate(); - searchTimer.SetTemplate(tmpl.templValue); - searchTimer.Parse(true); - } else break; - bool success = recManager->SaveSearchTimer(&searchTimer); - recManager->UpdateSearchTimers(); - if (searchTimer.GetID() >= 0) { - //Timer modified, show list - DisplaySearchTimerList(); - } else { - //new timer, confirm - delete activeMenu; - activeMenu = new cRecMenuSearchTimerCreateConfirm(success); - DisplayMenu(); - } - break; } - case rmsSearchTimerCreateWithTemplate: { - //caller: cRecMenuSearchTimerTemplates - //create new search timer from template - TVGuideEPGSearchTemplate templ; - cTVGuideSearchTimer searchTimer; - if (cRecMenuSearchTimerTemplates *menu = dynamic_cast(activeMenu)) { - templ = menu->GetTemplate(); - searchTimer = menu->GetSearchTimer(); - } else break; - delete activeMenu; - activeMenu = new cRecMenuSearchTimerTemplatesCreate(templ, searchTimer); - DisplayMenu(); - break; } - case rmsSearchTimerDeleteConfirm: { - //caller: cRecMenuSearchTimers - //Ask for confirmation and if timers created by this search timer should alo be deleted - cTVGuideSearchTimer searchTimer; - if (cRecMenuSearchTimers *menu = dynamic_cast(activeMenu)) { - searchTimer = menu->GetSearchTimer(); - } else break; - activeMenuBuffer = activeMenu; - activeMenuBuffer->Hide(); - activeMenu = new cRecMenuSearchTimerDeleteConfirm(searchTimer); - DisplayMenu(true); - break; } - case rmsSearchTimerDelete: - case rmsSearchTimerDeleteWithTimers: { - //caller: cRecMenuSearchTimerDeleteConfirm - //actually delete searchtimer - cTVGuideSearchTimer searchTimer; - if (cRecMenuSearchTimerDeleteConfirm *menu = dynamic_cast(activeMenu)) { - searchTimer = menu->GetSearchTimer(); - } else break; - bool delTimers = (nextState==rmsSearchTimerDeleteWithTimers)?true:false; - recManager->DeleteSearchTimer(&searchTimer, delTimers); - delete activeMenuBuffer; - activeMenuBuffer = NULL; - DisplaySearchTimerList(); - break; } - case rmsSearchTimerRecord: { - //caller: cRecMenuSearchTimerResults - const cEvent *ev = NULL; - if (cRecMenuSearchTimerResults *menu = dynamic_cast(activeMenu)) { - ev = menu->GetEvent(); - } else break; - if (!ev) - break; - recManager->createTimer(ev, ""); - activeMenuBuffer2 = activeMenu; - activeMenuBuffer2->Hide(); - activeMenu = new cRecMenuSearchConfirmTimer(ev); - DisplayMenu(false, true); - break; } -/********************************************************************************************** -* SEARCH -***********************************************************************************************/ - case rmsSearch: - case rmsSearchWithOptions: { - //caller: main menu, cRecMenuSearch, cRecMenuSearchResults - bool withOptions = false; - string searchString = event->Title(); - if (cRecMenuSearch *menu = dynamic_cast(activeMenu)) { - withOptions = true; - searchString = menu->GetSearchString(); - } else if (cRecMenuSearchResults *menu = dynamic_cast(activeMenu)) { - searchString = menu->GetSearchString(); - } - delete activeMenu; - activeMenu = new cRecMenuSearch(searchString, withOptions); - DisplayMenu(); - break; } - case rmsSearchPerform: { - //caller: cRecMenuSearch - bool useBuffer = false; - Epgsearch_searchresults_v1_0 epgSearchData; - if (cRecMenuSearch *menu = dynamic_cast(activeMenu)) { - epgSearchData = menu->GetEPGSearchStruct(); - } else break; - string searchString = epgSearchData.query; - if (searchString.size() < 3) { - activeMenu->Hide(); - activeMenuBuffer = activeMenu; - useBuffer = true; - activeMenu = new cRecMenuSearchNothingFound(searchString, true); - } else { - int numSearchResults = 0; - const cEvent **searchResult = recManager->PerformSearch(epgSearchData, numSearchResults); - if (searchResult) { - delete activeMenu; - activeMenu = new cRecMenuSearchResults(searchString, searchResult, numSearchResults); - } else { - activeMenu->Hide(); - activeMenuBuffer = activeMenu; - useBuffer = true; - activeMenu = new cRecMenuSearchNothingFound(searchString); - } - } - DisplayMenu(useBuffer); - break; } - case rmsSearchShowInfo: { - //caller: cRecMenuSearchResults, cRecMenuSearchTimerResults, cRecMenuRerunResults - if (cRecMenuSearchResults *menu = dynamic_cast(activeMenu)) { - displayEvent = menu->GetEvent(); - } else if (cRecMenuSearchTimerResults *menu = dynamic_cast(activeMenu)) { - displayEvent = menu->GetEvent(); - } else if (cRecMenuRerunResults *menu = dynamic_cast(activeMenu)) { - displayEvent = menu->GetEvent(); - } else break; - if (displayEvent) { - state = osUser1; - } - break;} - case rmsSearchRecord: { - //caller: cRecMenuSearchResults - const cEvent *ev = NULL; - if (cRecMenuSearchResults *menu = dynamic_cast(activeMenu)) { - ev = menu->GetEvent(); - } else break; - if (!ev) - break; - recManager->createTimer(ev, ""); - activeMenuBuffer = activeMenu; - activeMenuBuffer->Hide(); - activeMenu = new cRecMenuSearchConfirmTimer(ev); - DisplayMenu(true); - break;} -/********************************************************************************************** - * CHECK FOR TIMER CONFLICTS - ***********************************************************************************************/ - case rmsTimerConflicts: { - //caller: main menu - //Show timer conflict - if (timerConflicts) { - delete timerConflicts; - } - timerConflicts = recManager->CheckTimerConflict(); - delete activeMenu; - int numConflicts = timerConflicts->NumConflicts(); - if (numConflicts > 0) { - activeMenu = new cRecMenuTimerConflicts(timerConflicts); - } else { - activeMenu = new cRecMenuNoTimerConflict(); - } - DisplayMenu(); - break; } - case rmsTimerConflict: { - //caller: cRecMenuTimerConflicts - //Show timer conflict - if (!timerConflicts) - break; - int timerConflict; - if (cRecMenuTimerConflicts *menu = dynamic_cast(activeMenu)) { - timerConflict = menu->GetTimerConflict(); - } else break; - timerConflicts->SetCurrentConflict(timerConflict); - delete activeMenu; - activeMenu = new cRecMenuTimerConflict(timerConflicts->GetCurrentConflict()); - DisplayMenu(); - break; } - case rmsSearchRerunsTimerConflictMenu: { - //caller: cRecMenuTimerConflict - //Show reruns for timer from timer conflict - if (!timerConflicts) - break; - int timerConflict; - if (cRecMenuTimerConflict *menu = dynamic_cast(activeMenu)) { - timerConflict = menu->GetTimerConflictIndex(); - } else break; - int timerID = timerConflicts->GetCurrentConflictTimerID(timerConflict); - cTimer *timer = Timers.Get(timerID); - if (timer) { - const cEvent *event = timer->Event(); - if (event) { - int numReruns = 0; - const cEvent **reruns = recManager->LoadReruns(event, numReruns); - if (reruns && (numReruns > 0)) { - activeMenuBuffer = activeMenu; - activeMenuBuffer->Hide(); - activeMenu = new cRecMenuRerunResults(event, reruns, numReruns); - } else { - activeMenuBuffer = activeMenu; - activeMenuBuffer->Hide(); - activeMenu = new cRecMenuNoRerunsFound((event->Title())?event->Title():""); - } - DisplayMenu(true); - } - } - break; } - case rmsTimerConflictRecordRerun: { - //caller: cRecMenuRerunResults - //buffer: cRecMenuTimerConflict - if (!activeMenuBuffer) - break; - if (!timerConflicts) - break; - const cEvent *replace; - int originalConflictIndex; - if (cRecMenuRerunResults *menu = dynamic_cast(activeMenu)) { - replace = menu->GetEvent(); - } else break; - if (cRecMenuTimerConflict *menu = dynamic_cast(activeMenuBuffer)) { - originalConflictIndex = menu->GetTimerConflictIndex(); - } else break; - int originalTimerID = timerConflicts->GetCurrentConflictTimerID(originalConflictIndex); - cTimer *timerOriginal = Timers.Get(originalTimerID); - if (replace && timerOriginal) { - recManager->DeleteTimer(timerOriginal->Event()); - recManager->createTimer(replace); - activeMenuBuffer->Show(); - delete activeMenuBuffer; - activeMenuBuffer = NULL; - delete activeMenu; - activeMenu = new cRecMenuConfirmRerunUsed(timerOriginal->Event(), replace); - DisplayMenu(); - } - break; } - /********************************************************************************************** - * TIMELINE - ***********************************************************************************************/ - case rmsTimeline: { - delete activeMenu; - activeMenu = new cRecMenuTimeline(); - DisplayMenu(); - break; } - case rmsTimelineTimerEdit: { - cTimer *timer; - if (cRecMenuTimeline *menu = dynamic_cast(activeMenu)) { - timer = menu->GetTimer(); - } else break; - if (timer) { - delete activeMenu; - activeMenu = new cRecMenuEditTimer(timer, rmsTimelineTimerSave); - DisplayMenu(); - } - break;} - case rmsTimelineTimerSave: { - cTimer timerModified; - cTimer *originalTimer; - if (cRecMenuEditTimer *menu = dynamic_cast(activeMenu)) { - timerModified = menu->GetTimer(); - originalTimer = menu->GetOriginalTimer(); - } else break; - recManager->SaveTimer(originalTimer, timerModified); - delete activeMenu; - activeMenu = new cRecMenuTimeline(); - DisplayMenu(); - break; } - case rmsTimelineTimerDelete: { - cTimer *timer; - if (cRecMenuEditTimer *menu = dynamic_cast(activeMenu)) { - timer = menu->GetOriginalTimer(); - } else break; - recManager->DeleteTimer(timer); - delete activeMenu; - activeMenu = new cRecMenuTimeline(); - DisplayMenu(); - break; } - default: - break; -/********************************************************************************************** - * RECORDINGS SEARCH - ***********************************************************************************************/ - case rmsRecordingSearch: { - //caller: main menu or rmsRecordingSearchResult - string searchString = event->Title(); - if (cRecMenuRecordingSearchResults *menu = dynamic_cast(activeMenu)) { - searchString = menu->GetSearchString(); - }; - delete activeMenu; - activeMenu = new cRecMenuRecordingSearch(searchString); - DisplayMenu(); - break; } - case rmsRecordingSearchResult: { - //caller: cRecMenuRecordingSearch - string searchString; - if (cRecMenuRecordingSearch *menu = dynamic_cast(activeMenu)) { - searchString = menu->GetSearchString(); - } else break; - delete activeMenu; - if (searchString.size() < 4) { - activeMenu = new cRecMenuRecordingSearch(searchString); - } else { - int numSearchResults = 0; - cRecording **searchResult = recManager->SearchForRecordings(searchString, numSearchResults); - if (numSearchResults == 0) { - activeMenu = new cRecMenuRecordingSearchNotFound(searchString); - } else { - activeMenu = new cRecMenuRecordingSearchResults(searchString, searchResult, numSearchResults); - } - } - DisplayMenu(); - break; } - /********************************************************************************************** - * FAVORITES - *********************************************************************************************/ - case rmsFavoritesRecord: { - //caller: cRecMenuSearchTimerResults - const cEvent *ev = NULL; - if (cRecMenuSearchTimerResults *menu = dynamic_cast(activeMenu)) { - ev = menu->GetEvent(); - } else break; - if (!ev) - break; - recManager->createTimer(ev, ""); - activeMenuBuffer2 = activeMenu; - activeMenuBuffer2->Hide(); - activeMenu = new cRecMenuSearchConfirmTimer(ev); - DisplayMenu(false, true); - break;} - case rmsFavoritesNow: - case rmsFavoritesNext: { - int numResults = 0; - bool nowOrNext; - string header; - if (nextState == rmsFavoritesNow) { - nowOrNext = true; - header = tr("What's on now"); - } else { - nowOrNext = false; - header = tr("What's on next"); - } - const cEvent **result = recManager->WhatsOnNow(nowOrNext, numResults); - DisplayFavoriteResults(header, result, numResults); - break; } - case rmsFavoritesUser1: { - int numResults = 0; - const cEvent **result = recManager->UserDefinedTime(1, numResults); - DisplayFavoriteResults(config.descUser1, result, numResults); - break; } - case rmsFavoritesUser2: { - int numResults = 0; - const cEvent **result = recManager->UserDefinedTime(2, numResults); - DisplayFavoriteResults(config.descUser2, result, numResults); - break; } - case rmsFavoritesUser3: { - int numResults = 0; - const cEvent **result = recManager->UserDefinedTime(3, numResults); - DisplayFavoriteResults(config.descUser3, result, numResults); - break; } - case rmsFavoritesUser4: { - int numResults = 0; - const cEvent **result = recManager->UserDefinedTime(4, numResults); - DisplayFavoriteResults(config.descUser4, result, numResults); - break; } - } - return state; -} +#include "tvguidengosd.h" +#include "recmenuview.h" + +cRecMenuView::cRecMenuView(void) { + active = false; + recMenuView = NULL; + recMenuViewBuffer = NULL; + recMenuViewBuffer2 = NULL; + event = NULL; + displayEvent = NULL; + activeMenu = NULL; + activeMenuBuffer = NULL; + activeMenuBuffer2 = NULL; + recManager = new cRecManager(); + recManager->SetEPGSearchPlugin(); + timerConflicts = NULL; +} + +cRecMenuView::~cRecMenuView() { + if (activeMenu) + delete activeMenu; + if (activeMenuBuffer) + delete activeMenuBuffer; + if (activeMenuBuffer2) + delete activeMenuBuffer2; + if (recMenuView) + delete recMenuView; + if (recMenuViewBuffer) + delete recMenuViewBuffer; + if (recMenuViewBuffer2) + delete recMenuViewBuffer2; +} + +void cRecMenuView::Init(skindesignerapi::cOsdView *recMenuView, skindesignerapi::cOsdView *recMenuViewBuffer, skindesignerapi::cOsdView *recMenuViewBuffer2) { + active = true; + this->recMenuView = recMenuView; + this->recMenuViewBuffer = recMenuViewBuffer; + this->recMenuViewBuffer2 = recMenuViewBuffer2; +} + +void cRecMenuView::DisplayRecMenu(const cEvent *event) { + if (!event) { + return; + } + this->event = event; + activeMenu = new cRecMenuMain(recManager->EpgSearchAvailable(), recManager->CheckEventForTimer(event), SwitchTimers.EventInSwitchList(event)); + DisplayMenu(); +} + +void cRecMenuView::DisplayFavorites(void) { + vector favorites; + recManager->GetFavorites(&favorites); + activeMenu = new cRecMenuFavorites(favorites); + DisplayMenu(); +} + +void cRecMenuView::DisplayRecSearch(const cEvent *e) { + activeMenu = new cRecMenuRecordingSearch(e->Title() ? e->Title() : ""); + DisplayMenu(); +} + +void cRecMenuView::DisplaySearchEPG(const cEvent *e) { + activeMenu = new cRecMenuSearch(e->Title() ? e->Title() : "", false); + DisplayMenu(); +} + +void cRecMenuView::Close(void) { + if (activeMenu) { + delete activeMenu; + activeMenu = NULL; + } + if (activeMenuBuffer) { + delete activeMenuBuffer; + activeMenuBuffer = NULL; + } + if (activeMenuBuffer2) { + delete activeMenuBuffer2; + activeMenuBuffer2 = NULL; + } + delete recMenuView; + recMenuView = NULL; + delete recMenuViewBuffer; + recMenuViewBuffer = NULL; + delete recMenuViewBuffer2; + recMenuViewBuffer2 = NULL; + active = false; +} + +void cRecMenuView::Hide(bool full) { + if (recMenuViewBuffer) { + recMenuViewBuffer->Deactivate(true); + if (full) + recMenuView->Deactivate(true); + } else + recMenuView->Deactivate(true); +} + +void cRecMenuView::Activate(bool full) { + if (recMenuViewBuffer) { + recMenuViewBuffer->Activate(); + if (full) + recMenuView->Activate(); + } else + recMenuView->Activate(); +} + +eOSState cRecMenuView::ProcessKey(eKeys Key) { + eOSState state = osContinue; + eRecMenuState nextState = rmsContinue; + if (!activeMenu) + return state; + nextState = activeMenu->ProcessKey(Key); + if ((nextState == rmsClose) || ((nextState == rmsNotConsumed)&&(Key == kBack))) { + if (activeMenuBuffer2) { + delete activeMenu; + activeMenu = activeMenuBuffer2; + activeMenuBuffer2 = NULL; + activeMenu->Show(); + return osContinue; + } else if (activeMenuBuffer) { + delete activeMenu; + activeMenu = activeMenuBuffer; + activeMenuBuffer = NULL; + activeMenu->Show(); + return osContinue; + } else { + Close(); + return osEnd; + } + } + state = StateMachine(nextState); + if (activeMenu) + activeMenu->Flush(); + return state; +} + +void cRecMenuView::DisplayMenu(bool buffer, bool buffer2) { + if (!activeMenu) + return; + if (buffer) { + activeMenu->Init(recMenuViewBuffer); + } else if (buffer2) { + activeMenu->Init(recMenuViewBuffer2); + } else { + activeMenu->Init(recMenuView); + } + if (cRecMenuTimeline *timeline = dynamic_cast(activeMenu)) { + timeline->SetHeaderTimer(); + } + activeMenu->Draw(); +} + +void cRecMenuView::DisplaySearchTimerList(void) { + delete activeMenu; + vector searchTimers; + recManager->GetSearchTimers(&searchTimers); + activeMenu = new cRecMenuSearchTimers(searchTimers); + DisplayMenu(); +} + +bool cRecMenuView::DisplayTimerConflict(const cTimer *timer) { + int timerID = 0; +#if defined (APIVERSNUM) && (APIVERSNUM >= 20301) + LOCK_TIMERS_READ; + const cTimers* timers = Timers; +#else + const cTimers* timers = &Timers; +#endif + for (const cTimer *t = timers->First(); t; t = timers->Next(t)) { + if (t == timer) + return DisplayTimerConflict(timerID); + timerID++; + } + return false; +} + +bool cRecMenuView::DisplayTimerConflict(int timerID) { + if (timerConflicts) + delete timerConflicts; + timerConflicts = recManager->CheckTimerConflict(); + if (!timerConflicts) + return false; + int showTimerConflict = timerConflicts->GetCorrespondingConflict(timerID); + if (showTimerConflict > -1) { + timerConflicts->SetCurrentConflict(showTimerConflict); + cTVGuideTimerConflict *conflict = timerConflicts->GetCurrentConflict(); + if (!conflict) + return false; + activeMenu = new cRecMenuTimerConflict(conflict); + DisplayMenu(); + return true; + } + return false; +} + +void cRecMenuView::DisplayFavoriteResults(string header, const cEvent **result, int numResults) { + if (numResults) { + activeMenuBuffer = activeMenu; + activeMenuBuffer->Hide(); + activeMenu = new cRecMenuSearchTimerResults(header, result, numResults, "", rmsFavoritesRecord); + } else { + activeMenuBuffer = activeMenu; + activeMenuBuffer->Hide(); + activeMenu = new cRecMenuSearchTimerNothingFound(header); + } + DisplayMenu(true); +} + +eOSState cRecMenuView::StateMachine(eRecMenuState nextState) { + eOSState state = osContinue; + switch (nextState) { +/*************************************************************************************** +* INSTANT RECORDING +****************************************************************************************/ + case rmsInstantRecord: { + //caller: main menu or folder chooser + //Creating timer for active Event, if no conflict, confirm and exit + string recFolder = ""; + if (cRecMenuAskFolder *menu = dynamic_cast(activeMenu)) { + recFolder = menu->GetFolder(); + } + delete activeMenu; + cTimer *timer = recManager->createTimer(event, recFolder); + if (!DisplayTimerConflict(timer)) { + activeMenu = new cRecMenuConfirmTimer(event); + DisplayMenu(); + } + break; } + case rmsInstantRecordFolder: { + //caller: main menu + //Asking for Folder + delete activeMenu; + activeMenu = new cRecMenuAskFolder(event, rmsInstantRecord); + DisplayMenu(); + break; } + case rmsDeleteTimer: { + //caller: main menu + //delete timer for active event + delete activeMenu; + if (recManager->IsRecorded(event)) { + activeMenu = new cRecMenuAskDeleteTimer(event); + } else { + recManager->DeleteTimer(event); + activeMenu = new cRecMenuConfirmDeleteTimer(event); + } + DisplayMenu(); + break; } + case rmsDeleteTimerConfirmation: { + //delete running timer for active event + recManager->DeleteTimer(event); + delete activeMenu; + activeMenu = new cRecMenuConfirmDeleteTimer(event); + DisplayMenu(); + break; } + case rmsEditTimer: { + //edit timer for active event + const cTimer *timer = recManager->GetTimerForEvent(event); + if (timer) { + delete activeMenu; + activeMenu = new cRecMenuEditTimer(timer, rmsSaveTimer); + DisplayMenu(); + } + break; } + case rmsSaveTimer: { + //caller: cRecMenuEditTimer + //save timer for active event + cTimer timerModified; + const cTimer *originalTimer; + if (cRecMenuEditTimer *menu = dynamic_cast(activeMenu)) { + timerModified = menu->GetTimer(); + originalTimer = menu->GetOriginalTimer(); + } else break; + recManager->SaveTimer(originalTimer, timerModified); + Close(); + state = osEnd; + break; } + case rmsIgnoreTimerConflict: + //caller: cRecMenuTimerConflict + //Confirming created Timer + delete activeMenu; + activeMenu = new cRecMenuConfirmTimer(event); + DisplayMenu(); + break; + case rmsTimerConflictShowInfo: { + //caller: cRecMenuTimerConflict + int timerIndex; + if (cRecMenuTimerConflict *menu = dynamic_cast(activeMenu)) { + timerIndex = menu->GetTimerConflictIndex(); + } else break; + int timerID = timerConflicts->GetCurrentConflictTimerID(timerIndex); +#if defined (APIVERSNUM) && (APIVERSNUM >= 20301) + LOCK_TIMERS_READ; + const cTimers* timers = Timers; +#else + const cTimers* timers = &Timers; +#endif + const cTimer *t = timers->Get(timerID); + if (t) { + displayEvent = t->Event(); + if (displayEvent) { + state = osUser1; + } + } + break; } + case rmsDeleteTimerConflictMenu: { + //caller: cRecMenuTimerConflict + //delete timer out of current timer conflict + int timerIndex; + if (cRecMenuTimerConflict *menu = dynamic_cast(activeMenu)) { + timerIndex = menu->GetTimerConflictIndex(); + } else break; + int timerID = timerConflicts->GetCurrentConflictTimerID(timerIndex); + recManager->DeleteTimer(timerID); + delete activeMenu; + if (!DisplayTimerConflict(timerID)) { + activeMenu = new cRecMenuConfirmTimer(event); + DisplayMenu(); + } + break; } + case rmsEditTimerConflictMenu: { + //caller: cRecMenuTimerConflict + //edit timer out of current timer conflict + int timerIndex; + if (cRecMenuTimerConflict *menu = dynamic_cast(activeMenu)) { + timerIndex = menu->GetTimerConflictIndex(); + } else break; + int timerID = timerConflicts->GetCurrentConflictTimerID(timerIndex); +#if defined (APIVERSNUM) && (APIVERSNUM >= 20301) + LOCK_TIMERS_READ; + const cTimers* timers = Timers; +#else + const cTimers* timers = &Timers; +#endif + const cTimer *timer = timers->Get(timerID); + if (timer) { + delete activeMenu; + activeMenu = new cRecMenuEditTimer(timer, rmsSaveTimerConflictMenu); + DisplayMenu(); + } + break; } + case rmsSaveTimerConflictMenu: { + //caller: cRecMenuEditTimer + //save timer from current timer conflict + cTimer timerModified; + const cTimer *originalTimer; + if (cRecMenuEditTimer *menu = dynamic_cast(activeMenu)) { + timerModified = menu->GetTimer(); + originalTimer = menu->GetOriginalTimer(); + } else break; + recManager->SaveTimer(originalTimer, timerModified); + delete activeMenu; + if (!DisplayTimerConflict(originalTimer)) { + activeMenu = new cRecMenuConfirmTimer(event); + DisplayMenu(); + } + break; } +/*************************************************************************************** +* SERIES TIMER +****************************************************************************************/ + case rmsSeriesTimer: { + //caller: main menu oder folder chooser + string recFolder = ""; + if (cRecMenuAskFolder *menu = dynamic_cast(activeMenu)) { + recFolder = menu->GetFolder(); + } + delete activeMenu; +#if defined (APIVERSNUM) && (APIVERSNUM >= 20301) + LOCK_CHANNELS_READ; + const cChannels* channels = Channels; +#else + cChannels* channels = &Channels; +#endif + + const cChannel *channel = channels->GetByChannelID(event->ChannelID()); + activeMenu = new cRecMenuSeriesTimer(channel, event, recFolder); + DisplayMenu(); + break; } + case rmsSeriesTimerFolder: + //caller: main menu + //Asking for Folder + delete activeMenu; + activeMenu = new cRecMenuAskFolder(event, rmsSeriesTimer); + DisplayMenu(); + break; + case rmsSeriesTimerCreate: { + //caller: cRecMenuSeriesTimer + cTimer *seriesTimer; + if (cRecMenuSeriesTimer *menu = dynamic_cast(activeMenu)) { + seriesTimer = menu->GetTimer(); + } else break; + recManager->CreateSeriesTimer(seriesTimer); + delete activeMenu; + activeMenu = new cRecMenuConfirmSeriesTimer(seriesTimer); + DisplayMenu(); + break; } +/********************************************************************************************** + * SWITCH TIMER + ***********************************************************************************************/ + case rmsSwitchTimer: + delete activeMenu; + activeMenu = new cRecMenuSwitchTimer(); + DisplayMenu(); + break; + case rmsSwitchTimerCreate: { + cSwitchTimer switchTimer; + if (cRecMenuSwitchTimer *menu = dynamic_cast(activeMenu)) { + switchTimer = menu->GetSwitchTimer(); + } else break; + bool success = recManager->CreateSwitchTimer(event, switchTimer); + delete activeMenu; + activeMenu = new cRecMenuSwitchTimerConfirm(success); + DisplayMenu(); + break; } + case rmsSwitchTimerDelete: + recManager->DeleteSwitchTimer(event); + delete activeMenu; + activeMenu = new cRecMenuSwitchTimerDelete(); + DisplayMenu(); + break; +/********************************************************************************************** + * SEARCH TIMER + ***********************************************************************************************/ + case rmsSearchTimer: + //Caller: main menu + //set search String for search timer + delete activeMenu; + activeMenu = new cRecMenuSearchTimer(event); + DisplayMenu(); + break; + case rmsSearchTimerOptions: { + //Caller: cRecMenuSearchTimer, cRecMenuSearchTimerTemplates + //Choose to set options manually or by template + string searchString; + cTVGuideSearchTimer searchTimer; + bool reload = false; + if (cRecMenuSearchTimer *menu = dynamic_cast(activeMenu)) { + searchString = menu->GetSearchString(); + } else if (cRecMenuSearchTimerTemplatesCreate *menu = dynamic_cast(activeMenu)) { + searchTimer = menu->GetSearchTimer(); + reload = true; + } else break; + delete activeMenu; + if (searchString.size() < 4) { + activeMenu = new cRecMenuSearchTimer(event); + } else { + if (!reload) { + searchTimer.SetSearchString(searchString); + } + vector epgSearchTemplates; + recManager->ReadEPGSearchTemplates(&epgSearchTemplates); + if (epgSearchTemplates.size() > 0) { + activeMenu = new cRecMenuSearchTimerTemplates(searchTimer, epgSearchTemplates); + } else { + activeMenu = new cRecMenuSearchTimerEdit(searchTimer, false); + } + } + DisplayMenu(); + break; } + case rmsSearchTimers: { + //caller: main menu + DisplaySearchTimerList(); + break; } + case rmsSearchTimerEdit: + case rmsSearchTimerEditAdvanced: { + //caller: cRecMenuSearchTimers, cRecMenuSearchTimerEdit, cRecMenuSearchTimerTemplates + cTVGuideSearchTimer searchTimer; + bool advancedOptions = false; + if (cRecMenuSearchTimers *menu = dynamic_cast(activeMenu)) { + searchTimer = menu->GetSearchTimer(); + } else if (cRecMenuSearchTimerEdit *menu = dynamic_cast(activeMenu)) { + searchTimer = menu->GetSearchTimer(); + advancedOptions = (nextState == rmsSearchTimerEditAdvanced)?true:false; + } else if (cRecMenuSearchTimerTemplates *menu = dynamic_cast(activeMenu)) { + searchTimer = menu->GetSearchTimer(); + } else break; + delete activeMenu; + activeMenu = new cRecMenuSearchTimerEdit(searchTimer, advancedOptions); + DisplayMenu(); + break; } + case rmsSearchTimerTest: { + //caller: cRecMenuSearchTimerEdit, cRecMenuSearchTimerTemplatesCreate, cRecMenuSearchTimers, cRecMenuFavorites + //show results of currently choosen search timer + cTVGuideSearchTimer searchTimer; + eRecMenuState recState = rmsDisabled; + if (cRecMenuSearchTimerEdit *menu = dynamic_cast(activeMenu)) { + searchTimer = menu->GetSearchTimer(); + recState = rmsSearchTimerRecord; + } else if (cRecMenuSearchTimers *menu = dynamic_cast(activeMenu)) { + searchTimer = menu->GetSearchTimer(); + recState = rmsSearchTimerRecord; + } else if (cRecMenuSearchTimerTemplatesCreate *menu = dynamic_cast(activeMenu)) { + searchTimer = menu->GetSearchTimer(); + TVGuideEPGSearchTemplate tmpl = menu->GetTemplate(); + searchTimer.SetTemplate(tmpl.templValue); + searchTimer.Parse(true); + } else if (cRecMenuFavorites *menu = dynamic_cast(activeMenu)) { + searchTimer = menu->GetFavorite(); + recState = rmsFavoritesRecord; + } + else break; + int numSearchResults = 0; + string searchString = searchTimer.BuildSearchString(); + const cEvent **searchResult = recManager->PerformSearchTimerSearch(searchString, numSearchResults); + if (numSearchResults) { + activeMenuBuffer = activeMenu; + activeMenuBuffer->Hide(); + activeMenu = new cRecMenuSearchTimerResults(searchTimer.SearchString(), searchResult, numSearchResults, "", recState); + } else { + activeMenuBuffer = activeMenu; + activeMenuBuffer->Hide(); + activeMenu = new cRecMenuSearchTimerNothingFound(searchTimer.SearchString()); + } + DisplayMenu(true); + break; } + case rmsSearchTimerSave: { + //caller: cRecMenuSearchTimerEdit, cRecMenuSearchTimerTemplatesCreate + //create new or modify existing search timer + cTVGuideSearchTimer searchTimer; + if (cRecMenuSearchTimerEdit *menu = dynamic_cast(activeMenu)) { + searchTimer = menu->GetSearchTimer(); + } else if (cRecMenuSearchTimerTemplatesCreate *menu = dynamic_cast(activeMenu)) { + searchTimer = menu->GetSearchTimer(); + TVGuideEPGSearchTemplate tmpl = menu->GetTemplate(); + searchTimer.SetTemplate(tmpl.templValue); + searchTimer.Parse(true); + } else break; + bool success = recManager->SaveSearchTimer(&searchTimer); + recManager->UpdateSearchTimers(); + if (searchTimer.GetID() >= 0) { + //Timer modified, show list + DisplaySearchTimerList(); + } else { + //new timer, confirm + delete activeMenu; + activeMenu = new cRecMenuSearchTimerCreateConfirm(success); + DisplayMenu(); + } + break; } + case rmsSearchTimerCreateWithTemplate: { + //caller: cRecMenuSearchTimerTemplates + //create new search timer from template + TVGuideEPGSearchTemplate templ; + cTVGuideSearchTimer searchTimer; + if (cRecMenuSearchTimerTemplates *menu = dynamic_cast(activeMenu)) { + templ = menu->GetTemplate(); + searchTimer = menu->GetSearchTimer(); + } else break; + delete activeMenu; + activeMenu = new cRecMenuSearchTimerTemplatesCreate(templ, searchTimer); + DisplayMenu(); + break; } + case rmsSearchTimerDeleteConfirm: { + //caller: cRecMenuSearchTimers + //Ask for confirmation and if timers created by this search timer should alo be deleted + cTVGuideSearchTimer searchTimer; + if (cRecMenuSearchTimers *menu = dynamic_cast(activeMenu)) { + searchTimer = menu->GetSearchTimer(); + } else break; + activeMenuBuffer = activeMenu; + activeMenuBuffer->Hide(); + activeMenu = new cRecMenuSearchTimerDeleteConfirm(searchTimer); + DisplayMenu(true); + break; } + case rmsSearchTimerDelete: + case rmsSearchTimerDeleteWithTimers: { + //caller: cRecMenuSearchTimerDeleteConfirm + //actually delete searchtimer + cTVGuideSearchTimer searchTimer; + if (cRecMenuSearchTimerDeleteConfirm *menu = dynamic_cast(activeMenu)) { + searchTimer = menu->GetSearchTimer(); + } else break; + bool delTimers = (nextState==rmsSearchTimerDeleteWithTimers)?true:false; + recManager->DeleteSearchTimer(&searchTimer, delTimers); + delete activeMenuBuffer; + activeMenuBuffer = NULL; + DisplaySearchTimerList(); + break; } + case rmsSearchTimerRecord: { + //caller: cRecMenuSearchTimerResults + const cEvent *ev = NULL; + if (cRecMenuSearchTimerResults *menu = dynamic_cast(activeMenu)) { + ev = menu->GetEvent(); + } else break; + if (!ev) + break; + recManager->createTimer(ev, ""); + activeMenuBuffer2 = activeMenu; + activeMenuBuffer2->Hide(); + activeMenu = new cRecMenuSearchConfirmTimer(ev); + DisplayMenu(false, true); + break; } +/********************************************************************************************** +* SEARCH +***********************************************************************************************/ + case rmsSearch: + case rmsSearchWithOptions: { + //caller: main menu, cRecMenuSearch, cRecMenuSearchResults + bool withOptions = false; + string searchString = event->Title(); + if (cRecMenuSearch *menu = dynamic_cast(activeMenu)) { + withOptions = true; + searchString = menu->GetSearchString(); + } else if (cRecMenuSearchResults *menu = dynamic_cast(activeMenu)) { + searchString = menu->GetSearchString(); + } + delete activeMenu; + activeMenu = new cRecMenuSearch(searchString, withOptions); + DisplayMenu(); + break; } + case rmsSearchPerform: { + //caller: cRecMenuSearch + bool useBuffer = false; + Epgsearch_searchresults_v1_0 epgSearchData; + if (cRecMenuSearch *menu = dynamic_cast(activeMenu)) { + epgSearchData = menu->GetEPGSearchStruct(); + } else break; + string searchString = epgSearchData.query; + if (searchString.size() < 3) { + activeMenu->Hide(); + activeMenuBuffer = activeMenu; + useBuffer = true; + activeMenu = new cRecMenuSearchNothingFound(searchString, true); + } else { + int numSearchResults = 0; + const cEvent **searchResult = recManager->PerformSearch(epgSearchData, numSearchResults); + if (searchResult) { + delete activeMenu; + activeMenu = new cRecMenuSearchResults(searchString, searchResult, numSearchResults); + } else { + activeMenu->Hide(); + activeMenuBuffer = activeMenu; + useBuffer = true; + activeMenu = new cRecMenuSearchNothingFound(searchString); + } + } + DisplayMenu(useBuffer); + break; } + case rmsSearchShowInfo: { + //caller: cRecMenuSearchResults, cRecMenuSearchTimerResults, cRecMenuRerunResults + if (cRecMenuSearchResults *menu = dynamic_cast(activeMenu)) { + displayEvent = menu->GetEvent(); + } else if (cRecMenuSearchTimerResults *menu = dynamic_cast(activeMenu)) { + displayEvent = menu->GetEvent(); + } else if (cRecMenuRerunResults *menu = dynamic_cast(activeMenu)) { + displayEvent = menu->GetEvent(); + } else break; + if (displayEvent) { + state = osUser1; + } + break;} + case rmsSearchRecord: { + //caller: cRecMenuSearchResults + const cEvent *ev = NULL; + if (cRecMenuSearchResults *menu = dynamic_cast(activeMenu)) { + ev = menu->GetEvent(); + } else break; + if (!ev) + break; + recManager->createTimer(ev, ""); + activeMenuBuffer = activeMenu; + activeMenuBuffer->Hide(); + activeMenu = new cRecMenuSearchConfirmTimer(ev); + DisplayMenu(true); + break;} +/********************************************************************************************** + * CHECK FOR TIMER CONFLICTS + ***********************************************************************************************/ + case rmsTimerConflicts: { + //caller: main menu + //Show timer conflict + if (timerConflicts) { + delete timerConflicts; + } + timerConflicts = recManager->CheckTimerConflict(); + delete activeMenu; + int numConflicts = timerConflicts->NumConflicts(); + if (numConflicts > 0) { + activeMenu = new cRecMenuTimerConflicts(timerConflicts); + } else { + activeMenu = new cRecMenuNoTimerConflict(); + } + DisplayMenu(); + break; } + case rmsTimerConflict: { + //caller: cRecMenuTimerConflicts + //Show timer conflict + if (!timerConflicts) + break; + int timerConflict; + if (cRecMenuTimerConflicts *menu = dynamic_cast(activeMenu)) { + timerConflict = menu->GetTimerConflict(); + } else break; + timerConflicts->SetCurrentConflict(timerConflict); + delete activeMenu; + activeMenu = new cRecMenuTimerConflict(timerConflicts->GetCurrentConflict()); + DisplayMenu(); + break; } + case rmsSearchRerunsTimerConflictMenu: { + //caller: cRecMenuTimerConflict + //Show reruns for timer from timer conflict + if (!timerConflicts) + break; + int timerConflict; + if (cRecMenuTimerConflict *menu = dynamic_cast(activeMenu)) { + timerConflict = menu->GetTimerConflictIndex(); + } else break; + int timerID = timerConflicts->GetCurrentConflictTimerID(timerConflict); +#if defined (APIVERSNUM) && (APIVERSNUM >= 20301) + LOCK_TIMERS_READ; + const cTimers* timers = Timers; +#else + const cTimers* timers = &Timers; +#endif + const cTimer *timer = timers->Get(timerID); + if (timer) { + const cEvent *event = timer->Event(); + if (event) { + int numReruns = 0; + const cEvent **reruns = recManager->LoadReruns(event, numReruns); + if (reruns && (numReruns > 0)) { + activeMenuBuffer = activeMenu; + activeMenuBuffer->Hide(); + activeMenu = new cRecMenuRerunResults(event, reruns, numReruns); + } else { + activeMenuBuffer = activeMenu; + activeMenuBuffer->Hide(); + activeMenu = new cRecMenuNoRerunsFound((event->Title())?event->Title():""); + } + DisplayMenu(true); + } + } + break; } + case rmsTimerConflictRecordRerun: { + //caller: cRecMenuRerunResults + //buffer: cRecMenuTimerConflict + if (!activeMenuBuffer) + break; + if (!timerConflicts) + break; + const cEvent *replace; + int originalConflictIndex; + if (cRecMenuRerunResults *menu = dynamic_cast(activeMenu)) { + replace = menu->GetEvent(); + } else break; + if (cRecMenuTimerConflict *menu = dynamic_cast(activeMenuBuffer)) { + originalConflictIndex = menu->GetTimerConflictIndex(); + } else break; + int originalTimerID = timerConflicts->GetCurrentConflictTimerID(originalConflictIndex); +#if defined (APIVERSNUM) && (APIVERSNUM >= 20301) + LOCK_TIMERS_READ; + const cTimers* timers = Timers; +#else + const cTimers* timers = &Timers; +#endif + const cTimer *timerOriginal = timers->Get(originalTimerID); + if (replace && timerOriginal) { + recManager->DeleteTimer(timerOriginal->Event()); + recManager->createTimer(replace); + activeMenuBuffer->Show(); + delete activeMenuBuffer; + activeMenuBuffer = NULL; + delete activeMenu; + activeMenu = new cRecMenuConfirmRerunUsed(timerOriginal->Event(), replace); + DisplayMenu(); + } + break; } + /********************************************************************************************** + * TIMELINE + ***********************************************************************************************/ + case rmsTimeline: { + delete activeMenu; + activeMenu = new cRecMenuTimeline(); + DisplayMenu(); + break; } + case rmsTimelineTimerEdit: { + const cTimer *timer; + if (cRecMenuTimeline *menu = dynamic_cast(activeMenu)) { + timer = menu->GetTimer(); + } else break; + if (timer) { + delete activeMenu; + activeMenu = new cRecMenuEditTimer(timer, rmsTimelineTimerSave); + DisplayMenu(); + } + break;} + case rmsTimelineTimerSave: { + cTimer timerModified; + const cTimer *originalTimer; + if (cRecMenuEditTimer *menu = dynamic_cast(activeMenu)) { + timerModified = menu->GetTimer(); + originalTimer = menu->GetOriginalTimer(); + } else break; + recManager->SaveTimer(originalTimer, timerModified); + delete activeMenu; + activeMenu = new cRecMenuTimeline(); + DisplayMenu(); + break; } + case rmsTimelineTimerDelete: { + const cTimer *timer; + if (cRecMenuEditTimer *menu = dynamic_cast(activeMenu)) { + timer = menu->GetOriginalTimer(); + } else break; + recManager->DeleteTimer(timer); + delete activeMenu; + activeMenu = new cRecMenuTimeline(); + DisplayMenu(); + break; } + default: + break; +/********************************************************************************************** + * RECORDINGS SEARCH + ***********************************************************************************************/ + case rmsRecordingSearch: { + //caller: main menu or rmsRecordingSearchResult + string searchString = event->Title(); + if (cRecMenuRecordingSearchResults *menu = dynamic_cast(activeMenu)) { + searchString = menu->GetSearchString(); + }; + delete activeMenu; + activeMenu = new cRecMenuRecordingSearch(searchString); + DisplayMenu(); + break; } + case rmsRecordingSearchResult: { + //caller: cRecMenuRecordingSearch + string searchString; + if (cRecMenuRecordingSearch *menu = dynamic_cast(activeMenu)) { + searchString = menu->GetSearchString(); + } else break; + delete activeMenu; + if (searchString.size() < 4) { + activeMenu = new cRecMenuRecordingSearch(searchString); + } else { + int numSearchResults = 0; + const cRecording **searchResult = recManager->SearchForRecordings(searchString, numSearchResults); + if (numSearchResults == 0) { + activeMenu = new cRecMenuRecordingSearchNotFound(searchString); + } else { + activeMenu = new cRecMenuRecordingSearchResults(searchString, searchResult, numSearchResults); + } + } + DisplayMenu(); + break; } + /********************************************************************************************** + * FAVORITES + *********************************************************************************************/ + case rmsFavoritesRecord: { + //caller: cRecMenuSearchTimerResults + const cEvent *ev = NULL; + if (cRecMenuSearchTimerResults *menu = dynamic_cast(activeMenu)) { + ev = menu->GetEvent(); + } else break; + if (!ev) + break; + recManager->createTimer(ev, ""); + activeMenuBuffer2 = activeMenu; + activeMenuBuffer2->Hide(); + activeMenu = new cRecMenuSearchConfirmTimer(ev); + DisplayMenu(false, true); + break;} + case rmsFavoritesNow: + case rmsFavoritesNext: { + int numResults = 0; + bool nowOrNext; + string header; + if (nextState == rmsFavoritesNow) { + nowOrNext = true; + header = tr("What's on now"); + } else { + nowOrNext = false; + header = tr("What's on next"); + } + const cEvent **result = recManager->WhatsOnNow(nowOrNext, numResults); + DisplayFavoriteResults(header, result, numResults); + break; } + case rmsFavoritesUser1: { + int numResults = 0; + const cEvent **result = recManager->UserDefinedTime(1, numResults); + DisplayFavoriteResults(config.descUser1, result, numResults); + break; } + case rmsFavoritesUser2: { + int numResults = 0; + const cEvent **result = recManager->UserDefinedTime(2, numResults); + DisplayFavoriteResults(config.descUser2, result, numResults); + break; } + case rmsFavoritesUser3: { + int numResults = 0; + const cEvent **result = recManager->UserDefinedTime(3, numResults); + DisplayFavoriteResults(config.descUser3, result, numResults); + break; } + case rmsFavoritesUser4: { + int numResults = 0; + const cEvent **result = recManager->UserDefinedTime(4, numResults); + DisplayFavoriteResults(config.descUser4, result, numResults); + break; } + } + return state; +} -- cgit v1.2.3