fix caching
authorFelix Domke <tmbinc@elitedvb.net>
Wed, 9 Aug 2006 00:26:15 +0000 (00:26 +0000)
committerFelix Domke <tmbinc@elitedvb.net>
Wed, 9 Aug 2006 00:26:15 +0000 (00:26 +0000)
17 files changed:
lib/python/Components/Converter/ClockToText.py
lib/python/Components/Converter/ConditionalShowHide.py
lib/python/Components/Converter/EventName.py
lib/python/Components/Converter/EventTime.py
lib/python/Components/Converter/FrontendInfo.py
lib/python/Components/Converter/RemainingToText.py
lib/python/Components/Converter/ServiceInfo.py
lib/python/Components/Converter/ServiceName.py
lib/python/Components/Converter/ServicePosition.py
lib/python/Components/Converter/StringList.py
lib/python/Components/Converter/ValueRange.py
lib/python/Components/Element.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/MenuList.py

index 5d5df65..5cc709f 100644 (file)
@@ -1,5 +1,6 @@
 from Converter import Converter
 from time import localtime, strftime
+from Components.Element import cached
 
 class ClockToText(Converter, object):
        DEFAULT = 0
@@ -21,6 +22,7 @@ class ClockToText(Converter, object):
                else:
                        self.type = self.DEFAULT
 
+       @cached
        def getText(self):
                time = self.source.time
                if time is None:
index cc98288..d72447d 100644 (file)
@@ -1,7 +1,6 @@
 from Converter import Converter
 
 class ConditionalShowHide(Converter, object):
-
        def __init__(self, type):
                Converter.__init__(self, type)
                self.invert = type == "Invert"
index f128133..919dd3b 100644 (file)
@@ -1,4 +1,5 @@
 from Components.Converter.Converter import Converter
+from Components.Element import cached
 
 class EventName(Converter, object):
        NAME = 0
@@ -14,12 +15,8 @@ class EventName(Converter, object):
                else:
                        self.type = self.NAME
 
+       @cached
        def getText(self):
-               if self.cache is None:
-                       self.cache = self.__getText()
-               return self.cache
-
-       def __getText(self):
                event = self.source.event
                if event is None:
                        return "N/A"
index 4a73e0a..955fdbc 100644 (file)
@@ -1,6 +1,7 @@
 from Converter import Converter
 from Poll import Poll
 from time import time
+from Components.Element import cached
 
 class EventTime(Poll, Converter, object):
        STARTTIME = 0
@@ -29,12 +30,8 @@ class EventTime(Poll, Converter, object):
                else:
                        raise str("'%s' is not <StartTime|EndTime|Remaining|Duration> for EventTime converter" % type)
 
+       @cached
        def getTime(self):
-               if self.cache is None or self.cache[0] is None:
-                       self.cache = (self.__getTime(), self.cache and self.cache[1])
-               return self.cache[0]
-       
-       def __getTime(self):    
                assert self.type != self.PROGRESS
 
                event = self.source.event
@@ -57,12 +54,8 @@ class EventTime(Poll, Converter, object):
                        else:
                                return (duration, None)
 
+       @cached
        def getValue(self):
-               if self.cache is None or self.cache[1] is None:
-                       self.cache = (self.cache and self.cache[0], self.__getValue())
-               return self.cache[1]
-
-       def __getValue(self):
                assert self.type == self.PROGRESS
 
                event = self.source.event
index 347f7a1..e2923a9 100644 (file)
@@ -1,4 +1,5 @@
 from Components.Converter.Converter import Converter
+from Components.Element import cached
 
 class FrontendInfo(Converter, object):
        BER = 0
@@ -17,6 +18,7 @@ class FrontendInfo(Converter, object):
                else:
                        self.type = self.LOCK
 
+       @cached
        def getText(self):
                assert self.type != self.LOCK, "the text output of FrontendInfo cannot be used for lock info"
                if self.type == self.BER: # as count
@@ -35,6 +37,7 @@ class FrontendInfo(Converter, object):
 
                return "%d %%" % (percent * 100 / 65536)
 
+       @cached
        def getBool(self):
                assert self.type in [self.LOCK, self.BER], "the boolean output of FrontendInfo can only be used for lock or BER info"
                if self.type == self.LOCK:
@@ -46,6 +49,7 @@ class FrontendInfo(Converter, object):
 
        boolean = property(getBool)
 
+       @cached
        def getValue(self):
                assert self.type != self.LOCK, "the value/range output of FrontendInfo can not be used for lock info"
                if self.type == self.AGC:
index 007095e..adefe9c 100644 (file)
@@ -1,11 +1,12 @@
 from Components.Converter.Converter import Converter
+from Components.Element import cached
 
 class RemainingToText(Converter, object):
        def __init__(self, type):
                Converter.__init__(self, type)
 
+       @cached
        def getText(self):
-
                r = self.source.time
                if r is None:
                        return ""
index e1351c5..c581ed7 100644 (file)
@@ -1,5 +1,6 @@
 from Components.Converter.Converter import Converter
 from enigma import iServiceInformation, iPlayableService
+from Components.Element import cached
 
 class ServiceInfo(Converter, object):
        HAS_TELETEXT = 0
@@ -26,18 +27,15 @@ class ServiceInfo(Converter, object):
                                self.SUBSERVICES_AVAILABLE: [iPlayableService.evUpdatedEventInfo]
                        }[self.type]
 
+       @cached
        def getServiceInfoValue(self, info, what):
                v = info.getInfo(what)
                if v != -2:
                        return "N/A"
                return info.getInfoString(what)
 
+       @cached
        def getBoolean(self):
-               if self.cache is None:
-                       self.cache = self.__getBoolean()
-               return self.cache
-
-       def __getBoolean(self):
                service = self.source.service
                info = service and service.info()
                if not info:
index cffe494..5de8910 100644 (file)
@@ -1,5 +1,6 @@
 from Components.Converter.Converter import Converter
 from enigma import iServiceInformation, iPlayableService
+from Components.Element import cached
 
 class ServiceName(Converter, object):
        NAME = 0
@@ -12,12 +13,14 @@ class ServiceName(Converter, object):
                else:
                        self.type = self.NAME
 
+       @cached
        def getServiceInfoValue(self, info, what):
                v = info.getInfo(what)
                if v != -2:
                        return "N/A"
                return info.getInfoString(what)
 
+       @cached
        def getText(self):
                service = self.source.service
                info = service and service.info()
index dfb792a..c285385 100644 (file)
@@ -1,6 +1,7 @@
 from Converter import Converter
 from Poll import Poll
 from enigma import iPlayableService
+from Components.Element import cached
 
 class ServicePosition(Converter, Poll, object):
        TYPE_LENGTH = 0,
@@ -27,6 +28,7 @@ class ServicePosition(Converter, Poll, object):
                s = self.source.service
                return s and s.seek()
        
+       @cached
        def getPosition(self):
                seek = self.getSeek()
                if seek is None:
@@ -36,6 +38,7 @@ class ServicePosition(Converter, Poll, object):
                        return 0
                return pos[1]
        
+       @cached
        def getLength(self):
                seek = self.getSeek()
                if seek is None:
@@ -45,11 +48,13 @@ class ServicePosition(Converter, Poll, object):
                        return 0
                return length[1]
        
+       @cached
        def getCutlist(self):
                service = self.source.service
                cue = service and service.cueSheet()
                return cue and cue.getCutList()
        
+       @cached
        def getText(self):
                seek = self.getSeek()
                if seek is None:
index ed26465..1304c64 100644 (file)
@@ -1,6 +1,6 @@
 from Converter import Converter
 from enigma import eListboxPythonStringContent
-
+from Components.Element import cached
 
 class StringList(Converter):
        """Turns a simple python list into a list which can be used in a listbox."""
@@ -20,6 +20,7 @@ class StringList(Converter):
                        if x is not self.master:
                                x.index = index
 
+       @cached
        def getCurrent(self):
                if self.source is None:
                        return None
@@ -28,6 +29,7 @@ class StringList(Converter):
        current = property(getCurrent)
 
        # pass through: getIndex / setIndex to master
+       @cached
        def getIndex(self):
                if self.master is None:
                        return None
index 443e7a3..774d021 100644 (file)
@@ -1,10 +1,12 @@
 from Converter import Converter
+from Components.Element import cached
 
 class ValueRange(Converter, object):
        def __init__(self, arg):
                Converter.__init__(self, arg)
                (self.lower, self.upper) = [int(x) for x in arg.split(',')]
 
+       @cached
        def getBoolean(self):
                if self.lower < self.upper:
                        return self.lower < self.source.value < self.upper
index 019155c..baab4cf 100644 (file)
@@ -4,6 +4,17 @@ from Tools.CList import CList
 # Render Converter Converter Source
 
 # a bidirectional connection
+
+def cached(f):
+       name = f.__name__
+       def wrapper(self):
+               if self.cache is None:
+                       return f(self)
+               if name not in self.cache:
+                       self.cache[name] = (True, f(self))
+               return self.cache[name][1]
+       return wrapper
+
 class Element(object):
        CHANGED_DEFAULT = 0   # initial "pull" state
        CHANGED_ALL = 1       # really everything changed
@@ -16,7 +27,7 @@ class Element(object):
                self.master = None
                self.source = None
                self.__suspended = True
-               self.clearCache()
+               self.cache = None
 
        def connectDownstream(self, downstream):
                self.downstream_elements.append(downstream)
@@ -52,17 +63,14 @@ class Element(object):
 
        # default action: push downstream
        def changed(self, *args, **kwargs):
-               self.clearCache()
+               self.cache = { }
                self.downstream_elements.changed(*args, **kwargs)
-               self.clearCache()
+               self.cache = None
 
        def reconnectUpstream(self, new_upstream):
                assert self.source is not None
                self.source = new_upstream
 
-       def clearCache(self):
-               self.cache = None
-
        def setSuspend(self, suspended):
                changed = self.__suspended != suspended
                if not self.__suspended and suspended:
index bd5222a..9ca5613 100644 (file)
@@ -1,4 +1,5 @@
 from Source import Source
+from Components.Element import cached
 from enigma import eTimer
 
 # a small warning:
@@ -16,6 +17,7 @@ class Boolean(Source, object):
                        self.poll_timer.timeout.get().append(self.poll)
                        self.poll_timer.start(poll)
 
+       @cached
        def getBoolean(self):
                if self.function is not None:
                        return self.function()
index 7f1a8d7..4833ddd 100644 (file)
@@ -1,4 +1,5 @@
 from Tools.Event import Event
+from Components.Element import cached
 from enigma import eTimer
 import time
 
@@ -11,6 +12,7 @@ class Clock(Source):
                self.clock_timer.timeout.get().append(self.poll)
                self.clock_timer.start(1000)
 
+       @cached
        def getClock(self):
                return time.time()
 
@@ -25,4 +27,3 @@ class Clock(Source):
                else:
                        self.clock_timer.start(1000)
                        self.poll()
-
index 08d67ee..f49f032 100644 (file)
@@ -1,6 +1,7 @@
 from Components.PerServiceDisplay import PerServiceBase
 from enigma import iPlayableService
 from Source import Source
+from Components.Element import cached
 
 from time import time
 
@@ -22,9 +23,8 @@ class CurrentService(PerServiceBase, Source):
        def serviceEvent(self, event):
                self.changed((self.CHANGED_SPECIFIC, event))
 
+       @cached
        def getCurrentService(self):
-               if self.cache is None:
-                       self.cache = self.navcore.getCurrentService()
-               return self.cache
+               return self.navcore.getCurrentService()
 
        service = property(getCurrentService)
index 20e5f10..72d5f18 100644 (file)
@@ -1,4 +1,5 @@
 from Components.PerServiceDisplay import PerServiceBase
+from Components.Element import cached
 from Tools.Event import Event
 from enigma import iPlayableService
 from Source import Source
@@ -19,14 +20,12 @@ class EventInfo(PerServiceBase, Source, object):
                        }, with_event=True)
                
                self.now_or_next = now_or_next
-               
+
+       @cached
        def getEvent(self):
-               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]
+               service = self.navcore.getCurrentService()
+               info = service and service.info()
+               return info and info.getEvent(self.now_or_next)
 
        event = property(getEvent)
 
index dd5e18f..e69de29 100644 (file)
@@ -1,40 +0,0 @@
-from Source import Source
-from Tools.Event import Event
-
-class MenuList(Source, object):
-       def __init__(self, list = [ ], enableWrapAround = False):
-               Source.__init__(self)
-               self.__list = list
-               self.onSelectionChanged = [ ]
-       
-       def setList(self, list):
-               self.__list = list
-               self.changed((self.CHANGED_ALL,))
-       
-       list = property(lambda self: self.__list, setList)
-
-       def entry_changed(self, index):
-               self.downstream_elements.entry_changed(self, index)
-
-       def selectionChanged(self, index):
-               for x in self.onSelectionChanged:
-                       x()
-
-       def getCurrent(self):
-               return self.master and self.master.current
-
-       current = property(getCurrent)
-
-       def setIndex(self, index):
-               if self.master is not None:
-                       self.master = index
-       
-       def getIndex(self, index):
-               if self.master is not None:
-                       return self.master.index
-               else:
-                       return -1
-
-       setCurrentIndex = setIndex
-       
-       index = property(getIndex, setIndex)