aboutsummaryrefslogtreecommitdiff
path: root/lib/python
diff options
context:
space:
mode:
Diffstat (limited to 'lib/python')
-rw-r--r--lib/python/Components/Converter/ClockToText.py2
-rw-r--r--lib/python/Components/Converter/ConditionalShowHide.py1
-rw-r--r--lib/python/Components/Converter/EventName.py7
-rw-r--r--lib/python/Components/Converter/EventTime.py13
-rw-r--r--lib/python/Components/Converter/FrontendInfo.py4
-rw-r--r--lib/python/Components/Converter/RemainingToText.py3
-rw-r--r--lib/python/Components/Converter/ServiceInfo.py8
-rw-r--r--lib/python/Components/Converter/ServiceName.py3
-rw-r--r--lib/python/Components/Converter/ServicePosition.py5
-rw-r--r--lib/python/Components/Converter/StringList.py4
-rw-r--r--lib/python/Components/Converter/ValueRange.py2
-rw-r--r--lib/python/Components/Element.py20
-rw-r--r--lib/python/Components/Sources/Boolean.py2
-rw-r--r--lib/python/Components/Sources/Clock.py3
-rw-r--r--lib/python/Components/Sources/CurrentService.py6
-rw-r--r--lib/python/Components/Sources/EventInfo.py13
-rw-r--r--lib/python/Components/Sources/MenuList.py40
17 files changed, 56 insertions, 80 deletions
diff --git a/lib/python/Components/Converter/ClockToText.py b/lib/python/Components/Converter/ClockToText.py
index 5d5df651..5cc709f2 100644
--- a/lib/python/Components/Converter/ClockToText.py
+++ b/lib/python/Components/Converter/ClockToText.py
@@ -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:
diff --git a/lib/python/Components/Converter/ConditionalShowHide.py b/lib/python/Components/Converter/ConditionalShowHide.py
index cc98288f..d72447d9 100644
--- a/lib/python/Components/Converter/ConditionalShowHide.py
+++ b/lib/python/Components/Converter/ConditionalShowHide.py
@@ -1,7 +1,6 @@
from Converter import Converter
class ConditionalShowHide(Converter, object):
-
def __init__(self, type):
Converter.__init__(self, type)
self.invert = type == "Invert"
diff --git a/lib/python/Components/Converter/EventName.py b/lib/python/Components/Converter/EventName.py
index f128133a..919dd3b0 100644
--- a/lib/python/Components/Converter/EventName.py
+++ b/lib/python/Components/Converter/EventName.py
@@ -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"
diff --git a/lib/python/Components/Converter/EventTime.py b/lib/python/Components/Converter/EventTime.py
index 4a73e0ac..955fdbcf 100644
--- a/lib/python/Components/Converter/EventTime.py
+++ b/lib/python/Components/Converter/EventTime.py
@@ -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
diff --git a/lib/python/Components/Converter/FrontendInfo.py b/lib/python/Components/Converter/FrontendInfo.py
index 347f7a13..e2923a95 100644
--- a/lib/python/Components/Converter/FrontendInfo.py
+++ b/lib/python/Components/Converter/FrontendInfo.py
@@ -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:
diff --git a/lib/python/Components/Converter/RemainingToText.py b/lib/python/Components/Converter/RemainingToText.py
index 007095e0..adefe9cf 100644
--- a/lib/python/Components/Converter/RemainingToText.py
+++ b/lib/python/Components/Converter/RemainingToText.py
@@ -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 ""
diff --git a/lib/python/Components/Converter/ServiceInfo.py b/lib/python/Components/Converter/ServiceInfo.py
index e1351c56..c581ed73 100644
--- a/lib/python/Components/Converter/ServiceInfo.py
+++ b/lib/python/Components/Converter/ServiceInfo.py
@@ -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:
diff --git a/lib/python/Components/Converter/ServiceName.py b/lib/python/Components/Converter/ServiceName.py
index cffe494d..5de89103 100644
--- a/lib/python/Components/Converter/ServiceName.py
+++ b/lib/python/Components/Converter/ServiceName.py
@@ -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()
diff --git a/lib/python/Components/Converter/ServicePosition.py b/lib/python/Components/Converter/ServicePosition.py
index dfb792ad..c285385a 100644
--- a/lib/python/Components/Converter/ServicePosition.py
+++ b/lib/python/Components/Converter/ServicePosition.py
@@ -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:
diff --git a/lib/python/Components/Converter/StringList.py b/lib/python/Components/Converter/StringList.py
index ed264651..1304c643 100644
--- a/lib/python/Components/Converter/StringList.py
+++ b/lib/python/Components/Converter/StringList.py
@@ -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
diff --git a/lib/python/Components/Converter/ValueRange.py b/lib/python/Components/Converter/ValueRange.py
index 443e7a33..774d021c 100644
--- a/lib/python/Components/Converter/ValueRange.py
+++ b/lib/python/Components/Converter/ValueRange.py
@@ -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
diff --git a/lib/python/Components/Element.py b/lib/python/Components/Element.py
index 019155c6..baab4cfb 100644
--- a/lib/python/Components/Element.py
+++ b/lib/python/Components/Element.py
@@ -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:
diff --git a/lib/python/Components/Sources/Boolean.py b/lib/python/Components/Sources/Boolean.py
index bd5222af..9ca5613d 100644
--- a/lib/python/Components/Sources/Boolean.py
+++ b/lib/python/Components/Sources/Boolean.py
@@ -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()
diff --git a/lib/python/Components/Sources/Clock.py b/lib/python/Components/Sources/Clock.py
index 7f1a8d7f..4833ddde 100644
--- a/lib/python/Components/Sources/Clock.py
+++ b/lib/python/Components/Sources/Clock.py
@@ -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()
-
diff --git a/lib/python/Components/Sources/CurrentService.py b/lib/python/Components/Sources/CurrentService.py
index 08d67eee..f49f0323 100644
--- a/lib/python/Components/Sources/CurrentService.py
+++ b/lib/python/Components/Sources/CurrentService.py
@@ -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)
diff --git a/lib/python/Components/Sources/EventInfo.py b/lib/python/Components/Sources/EventInfo.py
index 20e5f104..72d5f18d 100644
--- a/lib/python/Components/Sources/EventInfo.py
+++ b/lib/python/Components/Sources/EventInfo.py
@@ -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)
diff --git a/lib/python/Components/Sources/MenuList.py b/lib/python/Components/Sources/MenuList.py
index dd5e18f7..e69de29b 100644
--- a/lib/python/Components/Sources/MenuList.py
+++ b/lib/python/Components/Sources/MenuList.py
@@ -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)