some minor speedups using caches and more selective updating
[enigma2.git] / lib / python / Components / Sources / EventInfo.py
index 40269993565795e476da47009ccbbf9138ed045b..20e5f104ed52f84759bdc27b1338a8d39d92f87a 100644 (file)
@@ -3,6 +3,8 @@ from Tools.Event import Event
 from enigma import iPlayableService
 from Source import Source
 
 from enigma import iPlayableService
 from Source import Source
 
+from time import time
+
 class EventInfo(PerServiceBase, Source, object):
        NOW = 0
        NEXT = 1
 class EventInfo(PerServiceBase, Source, object):
        NOW = 0
        NEXT = 1
@@ -11,16 +13,25 @@ class EventInfo(PerServiceBase, Source, object):
                Source.__init__(self)
                PerServiceBase.__init__(self, navcore, 
                        { 
                Source.__init__(self)
                PerServiceBase.__init__(self, navcore, 
                        { 
-                               iPlayableService.evStart: self.changed,
-                               iPlayableService.evUpdatedEventInfo: self.changed,
-                               iPlayableService.evEnd: self.changed
-                       })
+                               iPlayableService.evStart: self.gotEvent,
+                               iPlayableService.evUpdatedEventInfo: self.gotEvent,
+                               iPlayableService.evEnd: self.gotEvent
+                       }, with_event=True)
                
                self.now_or_next = now_or_next
                
        def getEvent(self):
                
                self.now_or_next = now_or_next
                
        def getEvent(self):
-               service = self.navcore.getCurrentService()
-               info = service and service.info()
-               return info and info.getEvent(self.now_or_next)
+               if self.cache is None:
+                       service = self.navcore.getCurrentService()
+                       info = service and service.info()
+                       self.cache = (True, info and info.getEvent(self.now_or_next)) # we always store a tuple for negative caching
+               
+               return self.cache[1]
 
        event = property(getEvent)
 
        event = property(getEvent)
+
+       def gotEvent(self, what):
+               if what in [iPlayableService.evStart, iPlayableService.evEnd]:
+                       self.changed((self.CHANGED_CLEAR,))
+               else:
+                       self.changed((self.CHANGED_ALL,))