diff options
author | woro <woro@e10066b5-e1e2-0310-b819-94efdf66514b> | 2008-04-18 01:17:40 +0000 |
---|---|---|
committer | woro <woro@e10066b5-e1e2-0310-b819-94efdf66514b> | 2008-04-18 01:17:40 +0000 |
commit | 8b0cbed65b4fc8337e8d32abc0d8cd6eaa48e010 (patch) | |
tree | bb0fece4305a04e8abf3ca6e4c30999d1da78a3c | |
parent | 56a3b81426620761e0e54c389744daf37c5b636c (diff) | |
download | vdr-plugin-muggle-8b0cbed65b4fc8337e8d32abc0d8cd6eaa48e010.tar.gz vdr-plugin-muggle-8b0cbed65b4fc8337e8d32abc0d8cd6eaa48e010.tar.bz2 |
guard against null dereference if no player active and player
commands are entered
better separate mgSelMenu and mgMenu in ProcessKey
make sure a displayed list is never empty. If the database
is empty, show just one item "Synchronize database"
git-svn-id: https://vdr-muggle.svn.sourceforge.net/svnroot/vdr-muggle/trunk/muggle-plugin@1191 e10066b5-e1e2-0310-b819-94efdf66514b
-rw-r--r-- | HISTORY | 4 | ||||
-rw-r--r-- | mg_menu.c | 62 | ||||
-rw-r--r-- | mg_selection.c | 18 | ||||
-rw-r--r-- | mg_selection.h | 2 | ||||
-rw-r--r-- | po/de.po | 6 | ||||
-rw-r--r-- | po/fr.po | 6 | ||||
-rw-r--r-- | po/muggle.pot | 5 | ||||
-rw-r--r-- | vdr_menu.c | 77 | ||||
-rw-r--r-- | vdr_player.c | 34 |
9 files changed, 92 insertions, 122 deletions
@@ -296,7 +296,7 @@ XXXXXXXXXX: Version 0.0.8-ALPHA 2008-01-04: Version 0.1.12-BETA - Fix compilation and some compiler warnings. - Fix build with FLAC++ >= 1.1.3. -- Rename image_convert.sh to muggle-image-convert, install it in + "make install", make it a bit more robust. 2008-4-11: Version 0.2.0-BETA @@ -344,3 +344,5 @@ XXXXXXXXXX: Version 0.0.8-ALPHA finished. And the message "loading lyrics" will only appear after they have been loaded. If you don't like it, update vdr or send me a patch. - make the compile option USE_BITMAP work again on unmodified FF cards +- make sure a displayed list is never empty by moving up in the tree if needed. + If the list is then still empty, display an item "Synchronize data base". @@ -342,32 +342,7 @@ mgOsd::Message1(const char *msg, const string &arg) { eOSState mgOsd::ProcessKey (eKeys key) { eOSState result = osContinue; - if (Menus.size()<1) - mgError("mgOsd::ProcessKey: Menus is empty"); - newmenu = Menus.back(); // Default: Stay in current menu - newposition = -1; - - { - mgMenu * oldmenu = newmenu; - - // item specific key logic: - result = cOsdMenu::ProcessKey (key); - - // mgMenu specific key logic: - if (result == osUnknown) - result = oldmenu->Process (key); - } - // catch osBack for empty OSD lists . This should only happen for playlistitems - // (because if the list was empty, no mgActions::ProcessKey was ever called) - if (result == osBack) { - // do as if there was an entry - mgAction *a = Menus.back()->GenerateAction(actEntry,actEntry); - if (a) { - result = a->Back(); - delete a; - } - } - switch (key) { + switch (key) { case kFastRew: case kFastRew|k_Repeat: case kFastFwd: @@ -377,15 +352,41 @@ eOSState mgOsd::ProcessKey (eKeys key) { case kPrev|k_Repeat: case kNext: case kNext|k_Repeat: + case kChanUp: + case kChanUp|k_Repeat: + case kChanDn: + case kChanDn|k_Repeat: // case kStop: does hide the player osd, but the player is still there in limbo case kPause: { mgPlayerControl *c = PlayerControl(); - if (c) c->ProcessKey(key); + if (c) { + result=c->ProcessKey(key); + goto pr_exit; + } break; } default: break; } + if (Menus.size()<1) + mgError("mgOsd::ProcessKey: Menus is empty"); + newmenu = Menus.back(); // Default: Stay in current menu + newposition = -1; + + { + mgMenu * oldmenu = newmenu; + + // item specific key logic: + result = cOsdMenu::ProcessKey (key); + + // mgMenu specific key logic: + if (result == osUnknown) + result = oldmenu->Process (key); + } + if (result == osBack) { + mgError("vdr_menu found osBack: Should never happen"); + result=osUnknown; + } // do nothing for unknown keys: if (result == osUnknown) goto pr_exit; @@ -408,6 +409,11 @@ eOSState mgOsd::ProcessKey (eKeys key) { if (forcerefresh) { forcerefresh = false; + if (newposition<0) { + mgSelMenu*sm = dynamic_cast<mgSelMenu*>(this); + if (sm) + newposition = sm->selection()->gotoPosition(); + } Menus.back ()->Display (); } pr_exit: @@ -458,7 +464,7 @@ mgOsd::AddMenu (mgMenu * m,int position) { m->setParentName(Get(Current())->Text()); if (position<0) position=0; newposition = position; - m->Display (); +// m->Display (); } void diff --git a/mg_selection.c b/mg_selection.c index ceb6aeb..dd729ee 100644 --- a/mg_selection.c +++ b/mg_selection.c @@ -9,6 +9,7 @@ * */ + #include <sys/types.h> #include <sys/time.h> #include <sys/stat.h> @@ -23,11 +24,16 @@ #include "mg_item_gd.h" +#define __STL_CONFIG_H +#include <vdr/i18n.h> + #if VDRVERSNUM >= 10307 #include <vdr/interface.h> #include <vdr/skins.h> #endif + + /*! \brief returns a random integer within some range */ unsigned int @@ -422,7 +428,7 @@ string mgSelection::exportM3U () { } bool -mgSelection::empty() { +mgSelection::empty() const { listitems.refresh(); return ( listitems.size () == 0); } @@ -464,12 +470,16 @@ unsigned int mgSelection::gotoPosition () { assert(m_level<ordersize()); listitems.refresh(); - if (listitems.size()==0 && m_level>0) { + while (listitems.size()==0 && m_level>0) { if (m_level>0) { DecLevel(); refreshValues(); } - return 0; + if (listitems.size()) + return 0; +//TODO testen: DB loeschen, muggle starten:Darf keine leere Liste zeigen. +//evtl einen Dummmy-Eintrag "Nichts gefunden" mit passender Action +//danach in mg_menu das spezielle osBack entfernen - respektive assert machen } unsigned int itemsize = listitems.size(); if (itemsize==0) @@ -568,6 +578,8 @@ mgSelection::getCompletedLength () const string mgSelection::getListname () const { + if (empty()) + return tr("Database is empty"); list<string> st; for (unsigned int i = 0; i < m_level; i++) { string val=getKeyItem(i)->value(); diff --git a/mg_selection.h b/mg_selection.h index cd48e83..f256dcd 100644 --- a/mg_selection.h +++ b/mg_selection.h @@ -202,7 +202,7 @@ class mgSelection } //! \brief true if the selection holds no items - bool empty(); + bool empty() const; /*! \brief returns detailed info about all selected items. * The ordering is done only by the keyfield of the current level. @@ -10,7 +10,7 @@ msgid "" msgstr "" "Project-Id-Version: de\n" "Report-Msgid-Bugs-To: <vdr-muggle-develop@sourceforge.net>\n" -"POT-Creation-Date: 2008-04-11 19:35+0200\n" +"POT-Creation-Date: 2008-04-15 03:21+0200\n" "PO-Revision-Date: 2008-04-11 19:38+0200\n" "Last-Translator: Wolfgang Rohdewald <wolfgang@rohdewald.de>\n" "Language-Team: deutsch <vdr-muggle-i18n@sourceforge.net>\n" @@ -37,6 +37,9 @@ msgstr "Datei %s nicht gefunden" msgid "Commands" msgstr "Befehle" +msgid "Database is empty" +msgstr "" + msgid "Genre" msgstr "Stil" @@ -373,4 +376,3 @@ msgstr "Setup.muggle$Transparenz für Cover" msgid "Delete stale references" msgstr "Einträge löschen, wenn Datei fehlt" - @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: fr\n" "Report-Msgid-Bugs-To: <vdr-muggle-develop@sourceforge.net>\n" -"POT-Creation-Date: 2008-04-11 19:35+0200\n" +"POT-Creation-Date: 2008-04-15 03:21+0200\n" "PO-Revision-Date: 2008-04-11 20:27+0200\n" "Last-Translator: Wolfgang Rohdewald <wolfgang@rohdewald.de>\n" "Language-Team: deutsch <vdr-muggle-i18n@sourceforge.net>\n" @@ -36,6 +36,9 @@ msgstr "Fichier %s pas trouvé" msgid "Commands" msgstr "Commandes" +msgid "Database is empty" +msgstr "" + msgid "Genre" msgstr "Genre" @@ -372,4 +375,3 @@ msgstr "Setup.muggle$Transparancy de l'image" msgid "Delete stale references" msgstr "Effacer références éventées" - diff --git a/po/muggle.pot b/po/muggle.pot index 8f57265..2c10cac 100644 --- a/po/muggle.pot +++ b/po/muggle.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: <vdr-muggle-develop@sourceforge.net>\n" -"POT-Creation-Date: 2008-04-13 09:27+0200\n" +"POT-Creation-Date: 2008-04-15 07:37+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Language-Team: LANGUAGE <LL@li.org>\n" @@ -33,6 +33,9 @@ msgstr "" msgid "Commands" msgstr "" +msgid "Database is empty" +msgstr "" + msgid "Genre" msgstr "" @@ -311,6 +311,7 @@ mgSelOsd::mgSelOsd () { m_selroot->CollGreenAction = mgActions(nmain.getuint("CollGreenAction")); m_selroot->CollYellowAction = mgActions(nmain.getuint("CollYellowAction")); AddMenu (m_root,posi); + m_root->Display(); forcerefresh = false; } @@ -583,14 +584,12 @@ void mgTree::BuildOsd () { InitOsd (false); AddSelectionItems (selection()); + if (m_osd->Count()==0) + AddAction(actSync); } eOSState mgSelOsd::ProcessKey (eKeys key) { - // TODO factor out to mgOsd eOSState result = osContinue; - if (Menus.size()<1) - mgError("mgSelOsd::ProcessKey: Menus is empty"); - mgPlayerControl * c = PlayerControl (); if (c) { if (!c->Playing ()) { @@ -605,9 +604,6 @@ eOSState mgSelOsd::ProcessKey (eKeys key) { } else { switch (key) { - case kPause: - c->Pause (); - break; case kStop: if (instant_playing && queue_playing) { PlayQueue(); @@ -617,12 +613,6 @@ eOSState mgSelOsd::ProcessKey (eKeys key) { c->Stop (); } break; - case kChanUp: - c->Forward (); - break; - case kChanDn: - c->Backward (); - break; default: goto otherkeys; } @@ -635,58 +625,8 @@ eOSState mgSelOsd::ProcessKey (eKeys key) { goto pr_exit; } otherkeys: - newmenu = Menus.back(); // Default: Stay in current menu - newposition = -1; - - { - mgMenu * oldmenu = newmenu; - - // item specific key logic: - result = cOsdMenu::ProcessKey (key); - - // mgMenu specific key logic: - if (result == osUnknown) - result = oldmenu->Process (key); - } - // catch osBack for empty OSD lists . This should only happen for playlistitems - // (because if the list was empty, no mgActions::ProcessKey was ever called) - if (result == osBack) { - // do as if there was an entry - mgAction *a = Menus.back()->GenerateAction(actEntry,actEntry); - if (a) { - result = a->Back(); - delete a; - } - } - - // do nothing for unknown keys: - if (result == osUnknown) - goto pr_exit; - - // change OSD menu as requested: - if (newmenu == NULL) { - if (Menus.size () > 1) { - CloseMenu(); - forcerefresh = true; - } - else { - result = osBack; // game over - goto pr_exit; - } - } - else if (newmenu != Menus.back ()) - AddMenu (newmenu,newposition); - forcerefresh |= selection()->cacheIsEmpty(); - - forcerefresh |= (newposition>=0); - - if (forcerefresh) { - forcerefresh = false; - if (newposition<0) - newposition = selection()->gotoPosition(); - Menus.back ()->Display (); - } + return mgOsd::ProcessKey(key); pr_exit: showMessage(); return result; @@ -706,15 +646,8 @@ showimportcount(unsigned int impcount,bool final=false) { void mgSelOsd::AddMenu (mgMenu * m,int position) { - // TODO zwischen mgSelOsd und mgOsd auseinanderdividieren - Menus.push_back (m); selection()->Activate(); - m->setosd (this); - m->setParentIndex(Current()); - if (Get(Current())) - m->setParentName(Get(Current())->Text()); - newposition = position; - m->Display (); + mgOsd::AddMenu(m,position); } void diff --git a/vdr_player.c b/vdr_player.c index 474717e..a9f1f7c 100644 --- a/vdr_player.c +++ b/vdr_player.c @@ -363,7 +363,7 @@ mgPlayerControl::InitLayout(void) { InfoBottom = PBTop - 1; int imagex1,imagey1,imagex2,imagey2; listdepth=4; - if (the_setup.BackgrMode==1) { + if (the_setup.BackgrMode==BackgroundCoverSmall) { CoverWidth = PBBottom-lh; while (1) { CoverX = osdwidth - CoverWidth -3*fw -2; @@ -383,7 +383,7 @@ mgPlayerControl::InitLayout(void) { else CoverWidth--; } - } else if (the_setup.BackgrMode==2) { + } else if (the_setup.BackgrMode==BackgroundCoverBig) { CoverWidth=0; CoverX = osdwidth; CoverX /=4; @@ -598,7 +598,10 @@ void mgPlayerControl::ShowProgress (bool open) { CheckImage(); int current_frame, total_frames; - player->GetIndex (current_frame, total_frames); + if (player) + player->GetIndex (current_frame, total_frames); + else + current_frame=total_frames=0; if (!osd) { osd=cOsdProvider::NewOsd(Setup.OSDLeft, Setup.OSDTop,50); if (!osd) return; @@ -665,7 +668,7 @@ mgPlayerControl::ShowProgress (bool open) { } currItem=CurrentItem(); - currPos=player->Position(); + currPos=player?player->Position():0; bool changed=(prevItem != currItem); char buf[256]; @@ -731,7 +734,7 @@ mgPlayerControl::ShowProgress (bool open) { flush=true; } - switch(player->PlayMode()) { + switch(player?player->PlayMode():pmStopped) { case pmStopped: osd->DrawBitmap(osdwidth - 3*fw - 160, fh , bmStop, clrTopItemActiveFG, clrTopItemBG1); osd->DrawBitmap(osdwidth - 3*fw - 130, fh , bmPlay, clrTopItemInactiveFG, clrTopItemBG1); @@ -903,7 +906,7 @@ mgPlayerControl::Scroll(int by) { int listsize=PlayList()->items().size(); if (ScrollPosition<0) - ScrollPosition=player->Position(); + ScrollPosition=player?player->Position():0; ScrollPosition += by; if (ScrollPosition<0) ScrollPosition=0; if (ScrollPosition>listsize-1) @@ -916,6 +919,7 @@ mgPlayerControl::ShowCommandMenu() { cmdOsd = new mgPlayOsd; cmdMenu = new mgPlayerCommands; cmdOsd->AddMenu(cmdMenu); + cmdMenu->Display(); cmdOsd->Display(); } @@ -933,23 +937,27 @@ eOSState mgPlayerControl::ProcessKey(eKeys Key) { switch(Key) { case kFastRew: case kFastRew|k_Repeat: - player->SkipSeconds(-the_setup.Jumptime); + SkipSeconds(-the_setup.Jumptime); skiprew=1; return osContinue; case kFastFwd: case kFastFwd|k_Repeat: skipfwd=1; - player->SkipSeconds(the_setup.Jumptime); + SkipSeconds(the_setup.Jumptime); return osContinue; case kPlay: - player->Play(); + Play(); return osContinue; case kPrev: case kPrev|k_Repeat: + case kChanDn: + case kChanDn|k_Repeat: Backward(); return osContinue; case kNext: case kNext|k_Repeat: + case kChanUp: + case kChanUp|k_Repeat: Forward(); return osContinue; case kPause: @@ -972,7 +980,7 @@ eOSState mgPlayerControl::ProcessKey(eKeys Key) { return osContinue; } - if (!player->Active()) return osEnd; + if (!Active()) return osEnd; if (timecount>0) timecount--; @@ -1135,7 +1143,7 @@ eOSState mgPlayerControl::ProcessKey(eKeys Key) { case kBack: if (ScrollPosition>=0) { - ScrollPosition=player->Position(); + ScrollPosition=player?player->Position():0; Display(); } @@ -1375,7 +1383,7 @@ void mgPlayerControl::JumpProcess(eKeys Key) { case kFastFwd: case kGreen: case kYellow: - player->SkipSeconds(jumpmm*d * ((Key==kGreen) ? -1:1)); + SkipSeconds(jumpmm*d * ((Key==kGreen) ? -1:1)); // fall through default: jumpactive=false; @@ -1421,6 +1429,8 @@ void mgPlayerControl::CheckImage() { if (!m_img_provider) return; + if (!player) + return; #ifdef USE_BITMAP if (cmdOsd) return; #endif |