some cleanups,
authorAndreas Monzner <andreas.monzner@multimedia-labs.de>
Fri, 27 Jun 2008 14:43:24 +0000 (14:43 +0000)
committerAndreas Monzner <andreas.monzner@multimedia-labs.de>
Fri, 27 Jun 2008 14:43:24 +0000 (14:43 +0000)
add missing destroy calls,
fix incomplete destroy calls,
small speedup

14 files changed:
lib/python/Components/Element.py
lib/python/Components/PerServiceDisplay.py
lib/python/Components/ServiceEventTracker.py
lib/python/Components/ServicePosition.py
lib/python/Components/Sources/Boolean.py
lib/python/Components/Sources/Clock.py
lib/python/Components/Sources/CurrentService.py
lib/python/Components/Sources/EventInfo.py
lib/python/Components/Sources/FrontendInfo.py
lib/python/Components/Sources/FrontendStatus.py
lib/python/Components/Sources/RdsDecoder.py
lib/python/Screens/InfoBarGenerics.py
lib/python/Screens/Screen.py
lib/python/Screens/SessionGlobals.py

index 437d934bb507529969571bdeaa487c1503dc825e..2af5779351b6f192a233ca455a6b63a66995c3d0 100644 (file)
@@ -8,11 +8,12 @@ from Tools.CList import CList
 def cached(f):
        name = f.__name__
        def wrapper(self):
-               if self.cache is None:
+               cache = self.cache
+               if cache is None:
                        return f(self)
-               if name not in self.cache:
-                       self.cache[name] = (True, f(self))
-               return self.cache[name][1]
+               if name not in cache:
+                       cache[name] = (True, f(self))
+               return cache[name][1]
        return wrapper
 
 class Element(object):
index 2d0a71e7270b9529c0a212c742d7308394698822..cb86bd84a35603c0f0e50e54d3fe6cfa87f1d6f4 100644 (file)
@@ -22,12 +22,13 @@ class PerServiceBase(object):
 
        def event_callback(self, ev):
                # loop up if we need to handle this event
-               if self.eventmap.has_key(ev):
+               func = self.eventmap.get(ev)
+               if func:
                        # call handler
                        if self.with_event:
-                               self.eventmap[ev](ev)
+                               func(ev)
                        else:
-                               self.eventmap[ev]()
+                               func()
        
        def enablePolling(self, interval=60000):
                if interval:
@@ -48,6 +49,10 @@ class PerServiceDisplay(PerServiceBase, VariableText, GUIComponent):
                VariableText.__init__(self)
                PerServiceBase.__init__(self, navcore, eventmap)
 
+       def destroy(self):
+               PerServiceBase.destroy(self)
+               GUIComponent.destroy(self)
+
        GUI_WIDGET = eLabel
 
 class PerServiceDisplayProgress(PerServiceBase, VariableValue, GUIComponent):
@@ -63,3 +68,7 @@ class PerServiceDisplayProgress(PerServiceBase, VariableValue, GUIComponent):
                self.event(iPlayableService.evEnd)
 
        GUI_WIDGET = eSlider
+
+       def destroy(self):
+               PerServiceBase.destroy(self)
+               GUIComponent.destroy(self)
index 1c42ecc881362fc7907c6d54891919cb327a8882..265d566e992112e02f4398c9acd0c1e015c54e38 100644 (file)
@@ -26,22 +26,23 @@ class ServiceEventTracker:
                self.screen.session.nav.event.remove(self.__event)
 
        def __event(self, ev):
-               set = ServiceEventTracker
-               screen = self.screen
-               nav = screen.session.nav
-               cur_ref = nav.getCurrentlyPlayingServiceReference()
-               old_service_running = set.oldRef and cur_ref and cur_ref == set.oldRef and set.oldService and set.oldService == str(nav.getCurrentService())
-               if not old_service_running:
-                       set.oldService = None
-                       set.oldRef = None
+               func = self.__eventmap.get(ev)
+               if func:
+                       set = ServiceEventTracker
+                       screen = self.screen
+                       nav = screen.session.nav
+                       cur_ref = nav.getCurrentlyPlayingServiceReference()
+                       old_service_running = set.oldRef and cur_ref and cur_ref == set.oldRef and set.oldService and set.oldService == str(nav.getCurrentService())
+                       if not old_service_running:
+                               set.oldService = None
+                               set.oldRef = None
 #              print "old_service_running", old_service_running
-               if ev in self.__eventmap:
                        ssize = set.InfoBarStackSize
                        stack = set.InfoBarStack
                        if (not isinstance(screen, InfoBarBase) or # let pass all events to screens not derived from InfoBarBase
                                (not old_service_running and ssize and stack[ssize-1] == screen) or # let pass events from currently running service just to current active screen (derived from InfoBarBase)
                                (old_service_running and ssize > 1 and stack[ssize-2] == screen)): # let pass events from old running service just to previous active screen (derived from InfoBarBase)
-                               self.__eventmap[ev]()
+                               func()
 #                      else:
 #                              print "ignore event", ev, "for inactive infobar '" + str(self.screen) + "'"
 
index 985f884162e466e3fe06d00bef2192c938b35345..b496425042ca2f97a5836a04cd48bc6c058fc34f 100644 (file)
@@ -164,3 +164,7 @@ class ServicePositionGauge(PerServiceBase, GUIComponent):
                        self.instance.setSeekPosition(pos)
        
        seek_pointer_position = property(getSeekPosition, setSeekPosition)
+
+       def destroy(self):
+               PerServiceBase.destroy(self)
+               GUIComponent.destroy(self)
index c92027ae24f4bd11eaf6adc52e7eca8b7d27e80c..212d2198600397fd35bf198cff2faa306fd6470f 100644 (file)
@@ -41,3 +41,4 @@ class Boolean(Source, object):
        def destroy(self):
                if self.poll_timer:
                        self.poll_timer.callback.remove(self.poll)
+               Source.destroy(self)
index 5130b21db01bf44d11d837f08eb9ecbca6c07d97..ba672825cd06d40c7bd3f9eacf4e54f17fa00ea8 100644 (file)
@@ -29,3 +29,4 @@ class Clock(Source):
 
        def destroy(self):
                self.clock_timer.callback.remove(self.poll)
+               Source.destroy(self)
index acc624a2860a433b22db5c2877a8ba9762c11518..2501c176f787226e0b3123ece71ca27b04b43430 100644 (file)
@@ -27,3 +27,8 @@ class CurrentService(PerServiceBase, Source):
                return self.navcore.getCurrentService()
 
        service = property(getCurrentService)
+
+       def destroy(self):
+               PerServiceBase.destroy(self)
+               Source.destroy(self)
+
index f3fd6e885a68de3bbac744e15f8c9e2352275fd4..5af0bf9740372e7653962e31c30d48afc1cb73dc 100644 (file)
@@ -35,3 +35,8 @@ class EventInfo(PerServiceBase, Source, object):
                        self.changed((self.CHANGED_CLEAR,))
                else:
                        self.changed((self.CHANGED_ALL,))
+
+       def destroy(self):
+               PerServiceBase.destroy(self)
+               Source.destroy(self)
+
index 142573c9cb7c1cbb25ff2e0aa6af660c909d75e4..bcca7c3d480c7a96e14d94ff9d6c9b9fabae6c6a 100644 (file)
@@ -1,12 +1,27 @@
+from enigma import iPlayableService
 from Source import Source
+from Components.PerServiceDisplay import PerServiceBase
 
-class FrontendInfo(Source):
-       def __init__(self, service_source = None, frontend_source = None):
+class FrontendInfo(Source, PerServiceBase):
+       def __init__(self, service_source = None, frontend_source = None, navcore = None):
+               self.navcore = None
                Source.__init__(self)
+               if navcore:
+                       PerServiceBase.__init__(self, navcore,
+                       {
+                               iPlayableService.evTunedIn: self.updateFrontendData,
+                               iPlayableService.evEnd: self.serviceEnd
+                       })
                self.service_source = service_source
                self.frontend_source = frontend_source
                self.updateFrontendData()
 
+       def serviceEnd(self):
+#              import pdb
+#              pdb.set_trace()
+               self.slot_number = self.frontend_type = None
+               self.changed((self.CHANGED_CLEAR, ))
+
        def updateFrontendData(self):
                data = self.getFrontendData()
                if not data:
@@ -24,8 +39,17 @@ class FrontendInfo(Source):
                                frontend.getFrontendData(dict)
                        return dict
                elif self.service_source:
-                       service = self.service_source()
+                       service = self.navcore and self.service_source()
+                       feinfo = service and service.frontendInfo()
+                       return feinfo and feinfo.getFrontendData()
+               elif self.navcore:
+                       service = self.navcore.getCurrentService()
                        feinfo = service and service.frontendInfo()
                        return feinfo and feinfo.getFrontendData()
                else:
                        return None
+
+       def destroy(self):
+               if not self.frontend_source and not self.service_source:
+                       PerServiceBase.destroy(self)
+               Source.destroy(self)
index 3e469e0da9b4fc5142bd1c2ca6ca7c340bd58a59..821c9f12077f223fca9de258b3202cd907064871 100644 (file)
@@ -49,4 +49,5 @@ class FrontendStatus(Source):
 
        def destroy(self):
                self.poll_timer.callback.remove(self.updateFrontendStatus)
+               Source.destroy(self)
 
index 886f81f62a57d576ae61b30c93d385b00accd82c..3ec9a25db60fa65e02d9c8396eee977dd808140b 100644 (file)
@@ -27,3 +27,7 @@ class RdsDecoder(PerServiceBase, Source, object):
                        self.changed((self.CHANGED_CLEAR,))
                else:
                        self.changed((self.CHANGED_SPECIFIC, what))
+
+       def destroy(self):
+               PerServiceBase.destroy(self)
+               Source.destroy(self)
index e7f71daf7766c5ee1f572e5dea7e36e3e7ef9c0f..2227f8b99e4ea414a328b0ddf96eed889220d96c 100644 (file)
@@ -1619,16 +1619,18 @@ class InfoBarSubserviceSelection:
                        }, -1)
                self["SubserviceQuickzapAction"].setEnabled(False)
 
-               self.session.nav.event.append(self.checkSubservicesAvail) # we like to get service events
+               self.__event_tracker = ServiceEventTracker(screen=self, eventmap=
+                       {
+                               iPlayableService.evUpdatedInfo: self.checkSubservicesAvail
+                       })
 
                self.bsel = None
 
-       def checkSubservicesAvail(self, ev):
-               if ev == iPlayableService.evUpdatedEventInfo:
-                       service = self.session.nav.getCurrentService()
-                       subservices = service and service.subServices()
-                       if not subservices or subservices.getNumberOfSubservices() == 0:
-                               self["SubserviceQuickzapAction"].setEnabled(False)
+       def checkSubservicesAvail(self):
+               service = self.session.nav.getCurrentService()
+               subservices = service and service.subServices()
+               if not subservices or subservices.getNumberOfSubservices() == 0:
+                       self["SubserviceQuickzapAction"].setEnabled(False)
 
        def nextSubservice(self):
                self.changeSubservice(+1)
index 508309dbfa98a0a6966616083fd93140f1b2b453..287847baf93247c1ec01a8e355c47afb993d01e3 100644 (file)
@@ -75,10 +75,11 @@ class Screen(dict, GUISkin):
                                x()
        
        def execEnd(self):
+               active_components = self.active_components
 #              for (name, val) in self.items():
-               for val in self.active_components:
+               self.active_components = None
+               for val in active_components:
                        val.execEnd()
-               del self.active_components
 #              assert self.session != None, "execEnd on non-execing screen!"
 #              self.session = None
                self.execing = False
index a9636cacc8df03696921a1411bb8afab7137248f..d65acb4d00f610f0fc5a67217c7fbed7fe2f4120 100644 (file)
@@ -1,4 +1,3 @@
-from enigma import iPlayableService
 from Screens.Screen import Screen
 from Components.Sources.CurrentService import CurrentService
 from Components.Sources.EventInfo import EventInfo
@@ -16,20 +15,8 @@ class SessionGlobals(Screen):
                self["Event_Now"] = EventInfo(session.nav, EventInfo.NOW)
                self["Event_Next"] = EventInfo(session.nav, EventInfo.NEXT)
                self["FrontendStatus"] = FrontendStatus(service_source = session.nav.getCurrentService)
-               self["FrontendInfo"] = FrontendInfo(service_source = session.nav.getCurrentService)
+               self["FrontendInfo"] = FrontendInfo(navcore = session.nav)
                self["VideoPicture"] = Source()
                self["TunerInfo"] = TunerInfo()
                self["RecordState"] = RecordState(session)
-               session.nav.event.append(self.serviceEvent)
-               self.service_state = 0
-
                FrontpanelLed().connect(self["RecordState"])
-
-       def serviceEvent(self, evt):
-               if evt == iPlayableService.evStart:
-                       self.service_state = 1
-               elif evt == iPlayableService.evEnd:
-                       self.service_state = 0
-               elif evt == iPlayableService.evUpdatedInfo and self.service_state == 1:
-                       self.service_state = 2
-                       self["FrontendInfo"].updateFrontendData()