fix recursive close crashes
authorAndreas Monzner <andreas.monzner@multimedia-labs.de>
Wed, 19 Apr 2006 20:34:38 +0000 (20:34 +0000)
committerAndreas Monzner <andreas.monzner@multimedia-labs.de>
Wed, 19 Apr 2006 20:34:38 +0000 (20:34 +0000)
lib/python/Screens/ChannelSelection.py
lib/python/Screens/InfoBarGenerics.py

index 7db3a1c896533befc2b1613c75bf7a4929de553d..0e3ee2fcbb13c29c9b1bb900b70ca8fda48291ef 100644 (file)
@@ -43,9 +43,11 @@ class BouquetSelector(Screen):
                self.close(False)
 
 class ChannelContextMenu(Screen):
                self.close(False)
 
 class ChannelContextMenu(Screen):
+       
        def __init__(self, session, csel):
                Screen.__init__(self, session)
                self.csel = csel
        def __init__(self, session, csel):
                Screen.__init__(self, session)
                self.csel = csel
+               self.bsel = None
 
                self["actions"] = ActionMap(["OkCancelActions"],
                        {
 
                self["actions"] = ActionMap(["OkCancelActions"],
                        {
@@ -117,13 +119,14 @@ class ChannelContextMenu(Screen):
                else:
                        cnt = len(bouquets)
                if cnt > 1: # show bouquet list
                else:
                        cnt = len(bouquets)
                if cnt > 1: # show bouquet list
-                       self.session.openWithCallback(self.bouquetSelClosed, BouquetSelector, bouquets, self.addCurrentServiceToBouquet)
+                       self.bsel = self.session.openWithCallback(self.bouquetSelClosed, BouquetSelector, bouquets, self.addCurrentServiceToBouquet)
                elif cnt == 1: # add to only one existing bouquet
                        self.addCurrentServiceToBouquet(bouquets[0][1])
                else: #no bouquets in root.. so assume only one favourite list is used
                        self.addCurrentServiceToBouquet(self.csel.bouquet_root)
 
        def bouquetSelClosed(self, recursive):
                elif cnt == 1: # add to only one existing bouquet
                        self.addCurrentServiceToBouquet(bouquets[0][1])
                else: #no bouquets in root.. so assume only one favourite list is used
                        self.addCurrentServiceToBouquet(self.csel.bouquet_root)
 
        def bouquetSelClosed(self, recursive):
+               self.bsel = None
                if recursive:
                        self.close(False)
 
                if recursive:
                        self.close(False)
 
@@ -137,7 +140,10 @@ class ChannelContextMenu(Screen):
 
        def addCurrentServiceToBouquet(self, dest):
                self.csel.addCurrentServiceToBouquet(dest)
 
        def addCurrentServiceToBouquet(self, dest):
                self.csel.addCurrentServiceToBouquet(dest)
-               self.close(True) # close bouquet selection
+               if self.bsel is not None:
+                       self.bsel.close(True)
+               else:
+                       self.close(True) # close bouquet selection
 
        def removeCurrentService(self):
                self.csel.removeCurrentService()
 
        def removeCurrentService(self):
                self.csel.removeCurrentService()
index 77fca5597aaf287ca8f21b276519aa93d00ca778..79b3e145961a79e891755661d2dae174cb7bcacb 100644 (file)
@@ -342,6 +342,7 @@ class InfoBarSimpleEventView:
 class InfoBarEPG:
        """ EPG - Opens an EPG list when the showEPGList action fires """
        def __init__(self):
 class InfoBarEPG:
        """ EPG - Opens an EPG list when the showEPGList action fires """
        def __init__(self):
+               self.dlg_stack = [ ]
                self["EPGActions"] = HelpableActionMap(self, "InfobarEPGActions", 
                        {
                                "showEventInfo": (self.openEventView, _("show EPG...")),
                self["EPGActions"] = HelpableActionMap(self, "InfobarEPGActions", 
                        {
                                "showEventInfo": (self.openEventView, _("show EPG...")),
@@ -372,13 +373,16 @@ class InfoBarEPG:
                if len(services):
                        self.epg_bouquet = bouquet
                        if withCallback:
                if len(services):
                        self.epg_bouquet = bouquet
                        if withCallback:
-                               self.session.openWithCallback(self.closed, EPGSelection, services, self.zapToService)
+                               self.dlg_stack.append(self.session.openWithCallback(self.closed, EPGSelection, services, self.zapToService))
                        else:
                                self.session.open(EPGSelection, services, self.zapToService)
 
        def closed(self, ret):
                        else:
                                self.session.open(EPGSelection, services, self.zapToService)
 
        def closed(self, ret):
+               self.dlg_stack.pop()
                if ret:
                if ret:
-                       self.close(ret)
+                       dlgs=len(self.dlg_stack)
+                       assert dlgs>0
+                       self.dlg_stack[dlgs-1].close(dlgs > 1)
 
        def openMultiServiceEPG(self, withCallback=True):
                bouquets = self.servicelist.getBouquetList()
 
        def openMultiServiceEPG(self, withCallback=True):
                bouquets = self.servicelist.getBouquetList()
@@ -388,7 +392,7 @@ class InfoBarEPG:
                        cnt = len(bouquets)
                if cnt > 1: # show bouquet list
                        if withCallback:
                        cnt = len(bouquets)
                if cnt > 1: # show bouquet list
                        if withCallback:
-                               self.session.openWithCallback(self.closed, BouquetSelector, bouquets, self.openBouquetEPG)
+                               self.dlg_stack.append(self.session.openWithCallback(self.closed, BouquetSelector, bouquets, self.openBouquetEPG))
                        else:
                                self.session.open(BouquetSelector, bouquets, self.openBouquetEPG)
                elif cnt == 1: 
                        else:
                                self.session.open(BouquetSelector, bouquets, self.openBouquetEPG)
                elif cnt == 1: 
@@ -421,7 +425,7 @@ class InfoBarEPG:
                                if ptr:
                                        self.epglist.append(ptr)
                if len(self.epglist) > 0:
                                if ptr:
                                        self.epglist.append(ptr)
                if len(self.epglist) > 0:
-                       self.session.open(EventViewEPGSelect, self.epglist[0], ServiceReference(ref), self.eventViewCallback, self.openSingleServiceEPG, self.openMultiServiceEPG, self.openSimilarList)
+                       self.dlg_stack.append(self.session.openWithCallback(self.closed, EventViewEPGSelect, self.epglist[0], ServiceReference(ref), self.eventViewCallback, self.openSingleServiceEPG, self.openMultiServiceEPG, self.openSimilarList))
                else:
                        print "no epg for the service avail.. so we show multiepg instead of eventinfo"
                        self.openMultiServiceEPG(False)
                else:
                        print "no epg for the service avail.. so we show multiepg instead of eventinfo"
                        self.openMultiServiceEPG(False)