aboutsummaryrefslogtreecommitdiff
path: root/lib/python/Components
diff options
context:
space:
mode:
Diffstat (limited to 'lib/python/Components')
-rwxr-xr-x[-rw-r--r--]lib/python/Components/HelpMenuList.py25
-rw-r--r--lib/python/Components/Language.py1
-rw-r--r--lib/python/Components/Lcd.py10
-rw-r--r--lib/python/Components/MediaPlayer.py3
-rw-r--r--lib/python/Components/MovieList.py38
-rwxr-xr-x[-rw-r--r--]lib/python/Components/Network.py359
-rw-r--r--lib/python/Components/NimManager.py90
-rw-r--r--lib/python/Components/Playlist.py17
-rw-r--r--lib/python/Components/TimerSanityCheck.py54
-rw-r--r--lib/python/Components/UsageConfig.py5
-rwxr-xr-x[-rw-r--r--]lib/python/Components/config.py20
11 files changed, 431 insertions, 191 deletions
diff --git a/lib/python/Components/HelpMenuList.py b/lib/python/Components/HelpMenuList.py
index 25c9b8b6..04815c8d 100644..100755
--- a/lib/python/Components/HelpMenuList.py
+++ b/lib/python/Components/HelpMenuList.py
@@ -1,7 +1,6 @@
from GUIComponent import GUIComponent
from enigma import eListboxPythonMultiContent, eListbox, gFont
-
from Tools.KeyBindings import queryKeyBinding, getKeyDescription
#getKeyPositions
@@ -13,6 +12,7 @@ class HelpMenuList(GUIComponent):
self.onSelChanged = [ ]
self.l = eListboxPythonMultiContent()
self.callback = callback
+ self.extendedHelp = False
l = [ ]
for (actionmap, context, actions) in list:
@@ -36,17 +36,26 @@ class HelpMenuList(GUIComponent):
if flags & 8: # for long keypresses, prepend l_ into the key name.
name = (name[0], "long")
- print "name:", name
-
entry.append( (actionmap, context, action, name ) )
- entry.append( (eListboxPythonMultiContent.TYPE_TEXT, 0, 0, 400, 28, 0, 0, help) )
-
+
+ if type(help).__name__== 'list':
+ self.extendedHelp = True
+ print "extendedHelpEntry found"
+ entry.append( (eListboxPythonMultiContent.TYPE_TEXT, 0, 0, 400, 26, 0, 0, help[0]) )
+ entry.append( (eListboxPythonMultiContent.TYPE_TEXT, 0, 28, 400, 20, 1, 0, help[1]) )
+ else:
+ entry.append( (eListboxPythonMultiContent.TYPE_TEXT, 0, 0, 400, 28, 0, 0, help) )
+
l.append(entry)
self.l.setList(l)
-
- self.l.setFont(0, gFont("Regular", 24))
- self.l.setItemHeight(38)
+ if self.extendedHelp is True:
+ self.l.setFont(0, gFont("Regular", 24))
+ self.l.setFont(1, gFont("Regular", 18))
+ self.l.setItemHeight(50)
+ else:
+ self.l.setFont(0, gFont("Regular", 24))
+ self.l.setItemHeight(38)
def ok(self):
# a list entry has a "private" tuple as first entry...
diff --git a/lib/python/Components/Language.py b/lib/python/Components/Language.py
index acb50e51..6d1e31f3 100644
--- a/lib/python/Components/Language.py
+++ b/lib/python/Components/Language.py
@@ -35,6 +35,7 @@ class Language:
self.addLanguage(_("Spanish"), "es", "ES")
self.addLanguage(_("Swedish"), "sv", "SE")
self.addLanguage(_("Turkish"), "tr", "TR")
+ self.addLanguage(_("Ukrainian"), "uk", "UA")
self.callbacks = []
diff --git a/lib/python/Components/Lcd.py b/lib/python/Components/Lcd.py
index 0471843c..0e501237 100644
--- a/lib/python/Components/Lcd.py
+++ b/lib/python/Components/Lcd.py
@@ -44,9 +44,14 @@ def InitLcd():
ilcd = LCD()
- config.lcd.bright = ConfigSlider(default=10, limits=(0, 10))
+ config.lcd.standby = ConfigSlider(default=0, limits=(0, 10))
+ config.lcd.standby.addNotifier(setLCDbright);
+ config.lcd.standby.apply = lambda : setLCDbright(config.lcd.standby)
+
+ config.lcd.bright = ConfigSlider(default=5, limits=(0, 10))
config.lcd.bright.addNotifier(setLCDbright);
config.lcd.bright.apply = lambda : setLCDbright(config.lcd.bright)
+ config.lcd.bright.callNotifiersOnSaveAndCancel = True
if not ilcd.isOled():
config.lcd.contrast = ConfigSlider(default=5, limits=(0, 20))
@@ -54,9 +59,6 @@ def InitLcd():
else:
config.lcd.contrast = ConfigNothing()
- config.lcd.standby = ConfigSlider(default=0, limits=(0, 10))
- config.lcd.standby.apply = lambda : setLCDbright(config.lcd.standby)
-
config.lcd.invert = ConfigYesNo(default=False)
config.lcd.invert.addNotifier(setLCDinverted);
else:
diff --git a/lib/python/Components/MediaPlayer.py b/lib/python/Components/MediaPlayer.py
index 791274fc..87ba977c 100644
--- a/lib/python/Components/MediaPlayer.py
+++ b/lib/python/Components/MediaPlayer.py
@@ -40,7 +40,7 @@ def PlaylistEntryComponent(serviceref, state):
if png is not None:
res.append((eListboxPythonMultiContent.TYPE_PIXMAP_ALPHATEST, 5, 0, 16, 16, png))
-
+
return res
class PlayList(MenuList):
@@ -76,6 +76,7 @@ class PlayList(MenuList):
def setCurrentPlaying(self, index):
self.oldCurrPlaying = self.currPlaying
self.currPlaying = index
+ self.moveToIndex(index)
def updateState(self, state):
if len(self.list) > self.oldCurrPlaying and self.oldCurrPlaying != -1:
diff --git a/lib/python/Components/MovieList.py b/lib/python/Components/MovieList.py
index ace36012..8568f3d6 100644
--- a/lib/python/Components/MovieList.py
+++ b/lib/python/Components/MovieList.py
@@ -103,7 +103,8 @@ class MovieList(GUIComponent):
txt = info.getName(serviceref)
service = ServiceReference(info.getInfoString(serviceref, iServiceInformation.sServiceref))
description = info.getInfoString(serviceref, iServiceInformation.sDescription)
-
+ tags = info.getInfoString(serviceref, iServiceInformation.sTags)
+
begin_string = ""
if begin > 0:
t = FuzzyTime(begin)
@@ -111,23 +112,33 @@ class MovieList(GUIComponent):
if self.list_type == MovieList.LISTTYPE_ORIGINAL:
res.append(MultiContentEntryText(pos=(0, 0), size=(width-182, 30), font = 0, flags = RT_HALIGN_LEFT, text=txt))
- if service is not None:
- res.append(MultiContentEntryText(pos=(width-180, 0), size=(180, 30), font = 2, flags = RT_HALIGN_RIGHT, text = service.getServiceName()))
+ if self.tags:
+ res.append(MultiContentEntryText(pos=(width-180, 0), size=(180, 30), font = 2, flags = RT_HALIGN_RIGHT, text = tags))
+ if service is not None:
+ res.append(MultiContentEntryText(pos=(200, 50), size=(200, 20), font = 1, flags = RT_HALIGN_LEFT, text = service.getServiceName()))
+ else:
+ if service is not None:
+ res.append(MultiContentEntryText(pos=(width-180, 0), size=(180, 30), font = 2, flags = RT_HALIGN_RIGHT, text = service.getServiceName()))
res.append(MultiContentEntryText(pos=(0, 30), size=(width, 20), font=1, flags=RT_HALIGN_LEFT, text=description))
- res.append(MultiContentEntryText(pos=(0, 50), size=(width-270, 20), font=1, flags=RT_HALIGN_LEFT, text=begin_string))
- res.append(MultiContentEntryText(pos=(width-200, 50), size=(200, 20), font=1, flags=RT_HALIGN_RIGHT, text=len))
+ res.append(MultiContentEntryText(pos=(0, 50), size=(200, 20), font=1, flags=RT_HALIGN_LEFT, text=begin_string))
+ res.append(MultiContentEntryText(pos=(width-200, 50), size=(198, 20), font=1, flags=RT_HALIGN_RIGHT, text=len))
elif self.list_type == MovieList.LISTTYPE_COMPACT_DESCRIPTION:
res.append(MultiContentEntryText(pos=(0, 0), size=(width-120, 20), font = 0, flags = RT_HALIGN_LEFT, text = txt))
- if service is not None:
- res.append(MultiContentEntryText(pos=(width-212, 20), size=(154, 17), font = 1, flags = RT_HALIGN_RIGHT, text = service.getServiceName()))
res.append(MultiContentEntryText(pos=(0, 20), size=(width-212, 17), font=1, flags=RT_HALIGN_LEFT, text=description))
res.append(MultiContentEntryText(pos=(width-120, 6), size=(120, 20), font=1, flags=RT_HALIGN_RIGHT, text=begin_string))
+ if service is not None:
+ res.append(MultiContentEntryText(pos=(width-212, 20), size=(154, 17), font = 1, flags = RT_HALIGN_RIGHT, text = service.getServiceName()))
res.append(MultiContentEntryText(pos=(width-58, 20), size=(58, 20), font=1, flags=RT_HALIGN_RIGHT, text=len))
elif self.list_type == MovieList.LISTTYPE_COMPACT:
res.append(MultiContentEntryText(pos=(0, 0), size=(width-77, 20), font = 0, flags = RT_HALIGN_LEFT, text = txt))
- if service is not None:
- res.append(MultiContentEntryText(pos=(width-200, 20), size=(200, 17), font = 1, flags = RT_HALIGN_RIGHT, text = service.getServiceName()))
- res.append(MultiContentEntryText(pos=(0, 20), size=(width-200, 17), font=1, flags=RT_HALIGN_LEFT, text=begin_string))
+ if self.tags:
+ res.append(MultiContentEntryText(pos=(width-200, 20), size=(200, 17), font = 1, flags = RT_HALIGN_RIGHT, text = tags))
+ if service is not None:
+ res.append(MultiContentEntryText(pos=(200, 20), size=(200, 17), font = 1, flags = RT_HALIGN_LEFT, text = service.getServiceName()))
+ else:
+ if service is not None:
+ res.append(MultiContentEntryText(pos=(width-200, 20), size=(200, 17), font = 1, flags = RT_HALIGN_RIGHT, text = service.getServiceName()))
+ res.append(MultiContentEntryText(pos=(0, 20), size=(200, 17), font=1, flags=RT_HALIGN_LEFT, text=begin_string))
res.append(MultiContentEntryText(pos=(width-75, 0), size=(75, 20), font=0, flags=RT_HALIGN_RIGHT, text=len))
else:
assert(self.list_type == MovieList.LISTTYPE_MINIMAL)
@@ -212,6 +223,7 @@ class MovieList(GUIComponent):
if this_tags == ['']:
this_tags = []
this_tags = set(this_tags)
+ tags |= this_tags
# filter_tags is either None (which means no filter at all), or
# a set. In this case, all elements of filter_tags must be present,
@@ -219,7 +231,6 @@ class MovieList(GUIComponent):
if filter_tags is not None and not this_tags.issuperset(filter_tags):
continue
- tags |= this_tags
self.list.append((serviceref, info, begin, -1))
if self.sort_type == MovieList.SORT_ALPHANUMERIC:
@@ -243,8 +254,9 @@ class MovieList(GUIComponent):
for x in self.list:
if x[0] == serviceref:
self.instance.moveSelectionTo(count)
- break
+ return True
count += 1
-
+ return False
+
def moveDown(self):
self.instance.moveSelection(self.instance.moveDown)
diff --git a/lib/python/Components/Network.py b/lib/python/Components/Network.py
index bed9d95f..64b3aa6c 100644..100755
--- a/lib/python/Components/Network.py
+++ b/lib/python/Components/Network.py
@@ -7,11 +7,21 @@ from Components.Console import Console
class Network:
def __init__(self):
self.ifaces = {}
- self.configuredInterfaces = []
+ self.configuredInterfaces = []
+ self.configuredNetworkAdapters = []
+ self.NetworkState = 0
+ self.DnsState = 0
self.nameservers = []
self.ethtool_bin = "/usr/sbin/ethtool"
self.container = eConsoleAppContainer()
self.Console = Console()
+ self.LinkConsole = Console()
+ self.restartConsole = Console()
+ self.deactivateConsole = Console()
+ self.deactivateInterfaceConsole = Console()
+ self.activateConsole = Console()
+ self.resetNetworkConsole = Console()
+ self.DnsConsole = Console()
self.getInterfaces()
def getInterfaces(self, callback = None):
@@ -28,6 +38,11 @@ class Network:
self.getDataForInterface(device, callback)
except AttributeError:
pass
+ #print "self.ifaces:", self.ifaces
+ #self.writeNetworkConfig()
+ #print ord(' ')
+ #for line in result:
+ # print ord(line[0])
# helper function
def regExpMatch(self, pattern, string):
@@ -46,66 +61,60 @@ class Network:
ip.append(int(x))
return ip
+ def getDataForInterface(self, iface,callback):
+ #get ip out of ip addr, as avahi sometimes overrides it in ifconfig.
+ if not self.Console:
+ self.Console = Console()
+ cmd = "ip -o addr"
+ self.Console.ePopen(cmd, self.IPaddrFinished, [iface,callback])
+
def IPaddrFinished(self, result, retval, extra_args):
(iface, callback ) = extra_args
data = { 'up': False, 'dhcp': False, 'preup' : False, 'postdown' : False }
globalIPpattern = re_compile("scope global")
ipRegexp = '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}'
- ipLinePattern = re_compile('inet ' + ipRegexp +'/')
+ netRegexp = '[0-9]{1,2}'
+ macRegexp = '[0-9]{2}\:[0-9]{2}\:[0-9]{2}\:[a-z0-9]{2}\:[a-z0-9]{2}\:[a-z0-9]{2}'
+ ipLinePattern = re_compile('inet ' + ipRegexp + '/')
ipPattern = re_compile(ipRegexp)
-
+ netmaskLinePattern = re_compile('/' + netRegexp)
+ netmaskPattern = re_compile(netRegexp)
+ bcastLinePattern = re_compile(' brd ' + ipRegexp)
+ upPattern = re_compile('UP')
+ macPattern = re_compile('[0-9]{2}\:[0-9]{2}\:[0-9]{2}\:[a-z0-9]{2}\:[a-z0-9]{2}\:[a-z0-9]{2}')
+ macLinePattern = re_compile('link/ether ' + macRegexp)
+
for line in result.splitlines():
split = line.strip().split(' ',2)
+ if (split[1][:-1] == iface):
+ up = self.regExpMatch(upPattern, split[2])
+ mac = self.regExpMatch(macPattern, self.regExpMatch(macLinePattern, split[2]))
+ if up is not None:
+ data['up'] = True
+ if iface is not 'lo':
+ self.configuredInterfaces.append(iface)
+ if mac is not None:
+ data['mac'] = mac
if (split[1] == iface):
if re_search(globalIPpattern, split[2]):
ip = self.regExpMatch(ipPattern, self.regExpMatch(ipLinePattern, split[2]))
+ netmask = self.calc_netmask(self.regExpMatch(netmaskPattern, self.regExpMatch(netmaskLinePattern, split[2])))
+ bcast = self.regExpMatch(ipPattern, self.regExpMatch(bcastLinePattern, split[2]))
if ip is not None:
data['ip'] = self.convertIP(ip)
+ if netmask is not None:
+ data['netmask'] = self.convertIP(netmask)
+ if bcast is not None:
+ data['bcast'] = self.convertIP(bcast)
+
if not data.has_key('ip'):
data['dhcp'] = True
data['ip'] = [0, 0, 0, 0]
data['netmask'] = [0, 0, 0, 0]
data['gateway'] = [0, 0, 0, 0]
- cmd = "ifconfig " + iface
- self.Console.ePopen(cmd, self.ifconfigFinished, [iface, data, callback])
-
- def getDataForInterface(self, iface,callback):
- #get ip out of ip addr, as avahi sometimes overrides it in ifconfig.
- cmd = "ip -o addr"
- self.Console.ePopen(cmd, self.IPaddrFinished, [iface,callback])
-
- def ifconfigFinished(self, result, retval, extra_args ):
- (iface, data, callback ) = extra_args
- ipRegexp = '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}'
- ipLinePattern = re_compile('inet addr:' + ipRegexp)
- netmaskLinePattern = re_compile('Mask:' + ipRegexp)
- bcastLinePattern = re_compile('Bcast:' + ipRegexp)
- ipPattern = re_compile(ipRegexp)
- upPattern = re_compile('UP ')
- macPattern = re_compile('[0-9]{2}\:[0-9]{2}\:[0-9]{2}\:[0-9]{2}\:[0-9]{2}\:[0-9]{2}')
-
- for line in result.splitlines():
- #ip = self.regExpMatch(ipPattern, self.regExpMatch(ipLinePattern, line))
- netmask = self.regExpMatch(ipPattern, self.regExpMatch(netmaskLinePattern, line))
- bcast = self.regExpMatch(ipPattern, self.regExpMatch(bcastLinePattern, line))
- up = self.regExpMatch(upPattern, line)
- mac = self.regExpMatch(macPattern, line)
- #if ip is not None:
- # data['ip'] = self.convertIP(ip)
- if netmask is not None:
- data['netmask'] = self.convertIP(netmask)
- if bcast is not None:
- data['bcast'] = self.convertIP(bcast)
- if up is not None:
- data['up'] = True
- if iface is not 'lo':
- self.configuredInterfaces.append(iface)
- if mac is not None:
- data['mac'] = mac
-
cmd = "route -n | grep " + iface
- self.Console.ePopen(cmd,self.routeFinished,[iface,data,callback])
+ self.Console.ePopen(cmd,self.routeFinished, [iface, data, callback])
def routeFinished(self, result, retval, extra_args):
(iface, data, callback) = extra_args
@@ -119,16 +128,7 @@ class Network:
gateway = self.regExpMatch(ipPattern, line[16:31])
if gateway is not None:
data['gateway'] = self.convertIP(gateway)
-
- for line in result.splitlines(): #get real netmask in case avahi has overridden ifconfig netmask
- split = line.strip().split(' ')
- if re_search(ipPattern, split[0]):
- foundip = self.convertIP(split[0])
- if (foundip[0] == data['ip'][0] and foundip[1] == data['ip'][1]):
- if re_search(ipPattern, split[4]):
- mask = self.regExpMatch(ipPattern, self.regExpMatch(ipLinePattern, split[4]))
- if mask is not None:
- data['netmask'] = self.convertIP(mask)
+
self.ifaces[iface] = data
self.loadNetworkConfig(iface,callback)
@@ -214,13 +214,16 @@ class Network:
for ifacename, iface in ifaces.items():
if self.ifaces.has_key(ifacename):
self.ifaces[ifacename]["dhcp"] = iface["dhcp"]
- if len(self.Console.appContainers) == 0:
- # load ns only once
- self.loadNameserverConfig()
- print "read configured interfac:", ifaces
- print "self.ifaces after loading:", self.ifaces
- if callback is not None:
- callback(True)
+ if self.Console:
+ if len(self.Console.appContainers) == 0:
+ # save configured interfacelist
+ self.configuredNetworkAdapters = self.configuredInterfaces
+ # load ns only once
+ self.loadNameserverConfig()
+ print "read configured interfac:", ifaces
+ print "self.ifaces after loading:", self.ifaces
+ if callback is not None:
+ callback(True)
def loadNameserverConfig(self):
ipRegexp = "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}"
@@ -244,16 +247,39 @@ class Network:
print "nameservers:", self.nameservers
- def deactivateNetworkConfig(self):
+ def deactivateNetworkConfig(self, callback = None):
+ self.deactivateConsole = Console()
+ self.commands = []
+ self.commands.append("/etc/init.d/avahi-daemon stop")
for iface in self.ifaces.keys():
- system("ip addr flush " + iface)
- system("/etc/init.d/networking stop")
- system("killall -9 udhcpc")
- system("rm /var/run/udhcpc*")
+ cmd = "ip addr flush " + iface
+ self.commands.append(cmd)
+ self.commands.append("/etc/init.d/networking stop")
+ self.commands.append("killall -9 udhcpc")
+ self.commands.append("rm /var/run/udhcpc*")
+ self.deactivateConsole.eBatch(self.commands, self.deactivateNetworkFinished, callback, debug=True)
+
+ def deactivateNetworkFinished(self,extra_args):
+ callback = extra_args
+ if len(self.deactivateConsole.appContainers) == 0:
+ if callback is not None:
+ callback(True)
- def activateNetworkConfig(self):
- system("/etc/init.d/networking start")
- self.getInterfaces()
+ def activateNetworkConfig(self, callback = None):
+ self.activateConsole = Console()
+ self.commands = []
+ self.commands.append("/etc/init.d/networking start")
+ self.commands.append("/etc/init.d/avahi-daemon start")
+ self.activateConsole.eBatch(self.commands, self.activateNetworkFinished, callback, debug=True)
+
+ def activateNetworkFinished(self,extra_args):
+ callback = extra_args
+ if len(self.activateConsole.appContainers) == 0:
+ if callback is not None:
+ callback(True)
+
+ def getConfiguredAdapters(self):
+ return self.configuredNetworkAdapters
def getNumberOfAdapters(self):
return len(self.ifaces)
@@ -312,7 +338,24 @@ class Network:
if self.nameservers[i] == oldnameserver:
self.nameservers[i] = newnameserver
- def writeDefaultNetworkConfig(self,mode='lan'):
+ def resetNetworkConfig(self, mode='lan', callback = None):
+ self.resetNetworkConsole = Console()
+ self.commands = []
+ self.commands.append("/etc/init.d/avahi-daemon stop")
+ for iface in self.ifaces.keys():
+ cmd = "ip addr flush " + iface
+ self.commands.append(cmd)
+ self.commands.append("/etc/init.d/networking stop")
+ self.commands.append("killall -9 udhcpc")
+ self.commands.append("rm /var/run/udhcpc*")
+ self.resetNetworkConsole.eBatch(self.commands, self.resetNetworkFinishedCB, [mode, callback], debug=True)
+
+ def resetNetworkFinishedCB(self, extra_args):
+ (mode, callback) = extra_args
+ if len(self.resetNetworkConsole.appContainers) == 0:
+ self.writeDefaultNetworkConfig(mode, callback)
+
+ def writeDefaultNetworkConfig(self,mode='lan', callback = None):
fp = file('/etc/network/interfaces', 'w')
fp.write("# automatically generated by enigma 2\n# do NOT change manually!\n\n")
fp.write("auto lo\n")
@@ -329,50 +372,100 @@ class Network:
fp.write("\n")
fp.close()
- def resetNetworkConfig(self,mode='lan'):
- self.deactivateNetworkConfig()
- self.writeDefaultNetworkConfig(mode)
+ self.resetNetworkConsole = Console()
+ self.commands = []
if mode == 'wlan':
- system("ifconfig eth0 down")
- system("ifconfig ath0 down")
- system("ifconfig wlan0 up")
+ self.commands.append("ifconfig eth0 down")
+ self.commands.append("ifconfig ath0 down")
+ self.commands.append("ifconfig wlan0 up")
if mode == 'wlan-mpci':
- system("ifconfig eth0 down")
- system("ifconfig wlan0 down")
- system("ifconfig ath0 up")
+ self.commands.append("ifconfig eth0 down")
+ self.commands.append("ifconfig wlan0 down")
+ self.commands.append("ifconfig ath0 up")
if mode == 'lan':
- system("ifconfig eth0 up")
- system("ifconfig wlan0 down")
- system("ifconfig ath0 down")
- self.getInterfaces()
-
- def checkNetworkState(self):
- # www.dream-multimedia-tv.de, www.heise.de, www.google.de
- return system("ping -c 1 82.149.226.170") == 0 or \
- system("ping -c 1 193.99.144.85") == 0 or \
- system("ping -c 1 209.85.135.103") == 0
-
- def restartNetwork(self):
- iNetwork.deactivateNetworkConfig()
- iNetwork.activateNetworkConfig()
+ self.commands.append("ifconfig eth0 up")
+ self.commands.append("ifconfig wlan0 down")
+ self.commands.append("ifconfig ath0 down")
+ self.commands.append("/etc/init.d/avahi-daemon start")
+ self.resetNetworkConsole.eBatch(self.commands, self.resetNetworkFinished, [mode,callback], debug=True)
+
+ def resetNetworkFinished(self,extra_args):
+ (mode, callback) = extra_args
+ if len(self.resetNetworkConsole.appContainers) == 0:
+ if callback is not None:
+ callback(True,mode)
+
+ def checkNetworkState(self,statecallback):
+ # www.dream-multimedia-tv.de, www.heise.de, www.google.de
+ cmd1 = "ping -c 1 82.149.226.170"
+ cmd2 = "ping -c 1 193.99.144.85"
+ cmd3 = "ping -c 1 209.85.135.103"
+ self.PingConsole = Console()
+ self.PingConsole.ePopen(cmd1, self.checkNetworkStateFinished,statecallback)
+ self.PingConsole.ePopen(cmd2, self.checkNetworkStateFinished,statecallback)
+ self.PingConsole.ePopen(cmd3, self.checkNetworkStateFinished,statecallback)
+
+ def checkNetworkStateFinished(self, result, retval,extra_args):
+ (statecallback) = extra_args
+ if self.PingConsole is not None:
+ if retval == 0:
+ self.PingConsole = None
+ statecallback(self.NetworkState)
+ else:
+ self.NetworkState += 1
+ if len(self.PingConsole.appContainers) == 0:
+ statecallback(self.NetworkState)
+
+ def restartNetwork(self,callback = None):
+ self.restartConsole = Console()
+ self.commands = []
+ self.commands.append("/etc/init.d/avahi-daemon stop")
+ for iface in self.ifaces.keys():
+ cmd = "ip addr flush " + iface
+ self.commands.append(cmd)
+ self.commands.append("/etc/init.d/networking stop")
+ self.commands.append("killall -9 udhcpc")
+ self.commands.append("rm /var/run/udhcpc*")
+ self.commands.append("/etc/init.d/networking start")
+ self.commands.append("/etc/init.d/avahi-daemon start")
+ self.restartConsole.eBatch(self.commands, self.restartNetworkFinished, callback, debug=True)
+
+ def restartNetworkFinished(self,extra_args):
+ ( callback ) = extra_args
+ if callback is not None:
+ callback(True)
def getLinkState(self,iface,callback):
- self.dataAvail = callback
cmd = self.ethtool_bin + " " + iface
- self.container.appClosed.append(self.cmdFinished)
- self.container.dataAvail.append(callback)
- self.container.execute(cmd)
-
- def cmdFinished(self,retval):
- self.container.appClosed.remove(self.cmdFinished)
- self.container.dataAvail.remove(self.dataAvail)
-
- def stopContainer(self):
- self.container.kill()
-
- def ContainerRunning(self):
- return self.container.running()
-
+ self.LinkConsole = Console()
+ self.LinkConsole.ePopen(cmd, self.getLinkStateFinished,callback)
+
+ def getLinkStateFinished(self, result, retval,extra_args):
+ (callback) = extra_args
+ if self.LinkConsole is not None:
+ if len(self.LinkConsole.appContainers) == 0:
+ callback(result)
+
+ def stopLinkStateConsole(self):
+ if self.LinkConsole is not None:
+ self.LinkConsole = None
+
+ def stopDNSConsole(self):
+ if self.DnsConsole is not None:
+ self.DnsConsole = None
+
+ def stopRestartConsole(self):
+ if self.restartConsole is not None:
+ self.restartConsole = None
+
+ def stopGetInterfacesConsole(self):
+ if self.Console is not None:
+ self.Console = None
+
+ def stopDeactivateInterfaceConsole(self):
+ if self.deactivateInterfaceConsole:
+ self.deactivateInterfaceConsole = None
+
def checkforInterface(self,iface):
if self.getAdapterAttribute(iface, 'up') is True:
return True
@@ -384,13 +477,41 @@ class Network:
else:
return False
- def checkDNSLookup(self):
- return system("nslookup www.dream-multimedia-tv.de") == 0 or \
- system("nslookup www.heise.de") == 0 or \
- system("nslookup www.google.de")
-
- def deactivateInterface(self,iface):
- system("ifconfig " + iface + " down")
+ def checkDNSLookup(self,statecallback):
+ cmd1 = "nslookup www.dream-multimedia-tv.de"
+ cmd2 = "nslookup www.heise.de"
+ cmd3 = "nslookup www.google.de"
+ self.DnsConsole = Console()
+ self.DnsConsole.ePopen(cmd1, self.checkDNSLookupFinished,statecallback)
+ self.DnsConsole.ePopen(cmd2, self.checkDNSLookupFinished,statecallback)
+ self.DnsConsole.ePopen(cmd3, self.checkDNSLookupFinished,statecallback)
+
+ def checkDNSLookupFinished(self, result, retval,extra_args):
+ (statecallback) = extra_args
+ if self.DnsConsole is not None:
+ if retval == 0:
+ self.DnsConsole = None
+ statecallback(self.DnsState)
+ else:
+ self.DnsState += 1
+ if len(self.DnsConsole.appContainers) == 0:
+ statecallback(self.DnsState)
+
+ def deactivateInterface(self,iface,callback = None):
+ self.deactivateInterfaceConsole = Console()
+ self.commands = []
+ cmd1 = "ip addr flush " + iface
+ cmd2 = "ifconfig " + iface + " down"
+ self.commands.append(cmd1)
+ self.commands.append(cmd2)
+ self.deactivateInterfaceConsole.eBatch(self.commands, self.deactivateInterfaceFinished, callback, debug=True)
+
+ def deactivateInterfaceFinished(self,extra_args):
+ callback = extra_args
+ if self.deactivateInterfaceConsole:
+ if len(self.deactivateInterfaceConsole.appContainers) == 0:
+ if callback is not None:
+ callback(True)
def detectWlanModule(self):
self.wlanmodule = None
@@ -411,6 +532,20 @@ class Network:
self.wlanmodule = 'zydas'
return self.wlanmodule
+ def calc_netmask(self,nmask):
+ from struct import pack, unpack
+ from socket import inet_ntoa, inet_aton
+ mask = 1L<<31
+ xnet = (1L<<32)-1
+ cidr_range = range(0, 32)
+ cidr = long(nmask)
+ if cidr not in cidr_range:
+ print 'cidr invalid: %d' % cidr
+ return None
+ else:
+ nm = ((1L<<cidr)-1)<<(32-cidr)
+ netmask = str(inet_ntoa(pack('>L', nm)))
+ return netmask
iNetwork = Network()
diff --git a/lib/python/Components/NimManager.py b/lib/python/Components/NimManager.py
index 3c7a147e..f4e91083 100644
--- a/lib/python/Components/NimManager.py
+++ b/lib/python/Components/NimManager.py
@@ -1,3 +1,5 @@
+from Tools.HardwareInfo import HardwareInfo
+
from config import config, ConfigSubsection, ConfigSelection, ConfigFloat, \
ConfigSatlist, ConfigYesNo, ConfigInteger, ConfigSubList, ConfigNothing, \
ConfigSubDict, ConfigOnOff, ConfigDateTime
@@ -37,8 +39,8 @@ class SecConfigure:
sec.addSatellite(orbpos)
self.configuredSatellites.add(orbpos)
- def addLNBSimple(self, sec, slotid, diseqcmode, toneburstmode = diseqcParam.NO, diseqcpos = diseqcParam.SENDNO, orbpos = 0, longitude = 0, latitude = 0, loDirection = 0, laDirection = 0, turningSpeed = rotorParam.FAST, useInputPower=True, inputPowerDelta=50):
- if orbpos is None:
+ def addLNBSimple(self, sec, slotid, diseqcmode, toneburstmode = diseqcParam.NO, diseqcpos = diseqcParam.SENDNO, orbpos = 0, longitude = 0, latitude = 0, loDirection = 0, laDirection = 0, turningSpeed = rotorParam.FAST, useInputPower=True, inputPowerDelta=50, fastDiSEqC = False, setVoltageTone = True):
+ if orbpos is None or orbpos == 3601:
return
#simple defaults
sec.addLNB()
@@ -54,10 +56,8 @@ class SecConfigure:
sec.setLNBThreshold(11700000)
sec.setLNBIncreasedVoltage(lnbParam.OFF)
sec.setRepeats(0)
- sec.setFastDiSEqC(0)
+ sec.setFastDiSEqC(fastDiSEqC)
sec.setSeqRepeat(0)
- sec.setVoltageMode(switchParam.HV)
- sec.setToneMode(switchParam.HILO)
sec.setCommandOrder(0)
#user values
@@ -69,6 +69,12 @@ class SecConfigure:
if 0 <= diseqcmode < 3:
self.addSatellite(sec, orbpos)
+ if setVoltageTone:
+ sec.setVoltageMode(switchParam.HV)
+ sec.setToneMode(switchParam.HILO)
+ else:
+ sec.setVoltageMode(switchParam._14V)
+ sec.setToneMode(switchParam.OFF)
elif (diseqcmode == 3): # diseqc 1.2
if self.satposdepends.has_key(slotid):
for slot in self.satposdepends[slotid]:
@@ -153,6 +159,7 @@ class SecConfigure:
for slot in nim_slots:
x = slot.slot
nim = slot.config
+ hw = HardwareInfo()
if slot.isCompatible("DVB-S"):
print "slot: " + str(x) + " configmode: " + str(nim.configMode.value)
if nim.configMode.value in [ "loopthrough", "satposdepends", "nothing" ]:
@@ -164,18 +171,25 @@ class SecConfigure:
elif nim.configMode.value == "simple": #simple config
print "diseqcmode: ", nim.diseqcMode.value
if nim.diseqcMode.value == "single": #single
- self.addLNBSimple(sec, slotid = x, orbpos = nim.diseqcA.orbital_position, toneburstmode = diseqcParam.NO, diseqcmode = diseqcParam.NONE, diseqcpos = diseqcParam.SENDNO)
+ if nim.simpleSingleSendDiSEqC.value:
+ self.addLNBSimple(sec, slotid = x, orbpos = nim.diseqcA.orbital_position, toneburstmode = diseqcParam.NO, diseqcmode = diseqcParam.V1_0, diseqcpos = diseqcParam.AA)
+ else:
+ self.addLNBSimple(sec, slotid = x, orbpos = nim.diseqcA.orbital_position, toneburstmode = diseqcParam.NO, diseqcmode = diseqcParam.NONE, diseqcpos = diseqcParam.SENDNO)
elif nim.diseqcMode.value == "toneburst_a_b": #Toneburst A/B
self.addLNBSimple(sec, slotid = x, orbpos = nim.diseqcA.orbital_position, toneburstmode = diseqcParam.A, diseqcmode = diseqcParam.V1_0, diseqcpos = diseqcParam.SENDNO)
self.addLNBSimple(sec, slotid = x, orbpos = nim.diseqcB.orbital_position, toneburstmode = diseqcParam.B, diseqcmode = diseqcParam.V1_0, diseqcpos = diseqcParam.SENDNO)
elif nim.diseqcMode.value == "diseqc_a_b": #DiSEqC A/B
- self.addLNBSimple(sec, slotid = x, orbpos = nim.diseqcA.orbital_position, toneburstmode = diseqcParam.NO, diseqcmode = diseqcParam.V1_0, diseqcpos = diseqcParam.AA)
- self.addLNBSimple(sec, slotid = x, orbpos = nim.diseqcB.orbital_position, toneburstmode = diseqcParam.NO, diseqcmode = diseqcParam.V1_0, diseqcpos = diseqcParam.AB)
+ fastDiSEqC = nim.simpleDiSEqCOnlyOnSatChange.value
+ setVoltageTone = nim.simpleDiSEqCSetVoltageTone.value
+ self.addLNBSimple(sec, slotid = x, orbpos = nim.diseqcA.orbital_position, toneburstmode = diseqcParam.NO, diseqcmode = diseqcParam.V1_0, diseqcpos = diseqcParam.AA, fastDiSEqC = fastDiSEqC, setVoltageTone = setVoltageTone)
+ self.addLNBSimple(sec, slotid = x, orbpos = nim.diseqcB.orbital_position, toneburstmode = diseqcParam.NO, diseqcmode = diseqcParam.V1_0, diseqcpos = diseqcParam.AB, fastDiSEqC = fastDiSEqC, setVoltageTone = setVoltageTone)
elif nim.diseqcMode.value == "diseqc_a_b_c_d": #DiSEqC A/B/C/D
- self.addLNBSimple(sec, slotid = x, orbpos = nim.diseqcA.orbital_position, toneburstmode = diseqcParam.NO, diseqcmode = diseqcParam.V1_0, diseqcpos = diseqcParam.AA)
- self.addLNBSimple(sec, slotid = x, orbpos = nim.diseqcB.orbital_position, toneburstmode = diseqcParam.NO, diseqcmode = diseqcParam.V1_0, diseqcpos = diseqcParam.AB)
- self.addLNBSimple(sec, slotid = x, orbpos = nim.diseqcC.orbital_position, toneburstmode = diseqcParam.NO, diseqcmode = diseqcParam.V1_0, diseqcpos = diseqcParam.BA)
- self.addLNBSimple(sec, slotid = x, orbpos = nim.diseqcD.orbital_position, toneburstmode = diseqcParam.NO, diseqcmode = diseqcParam.V1_0, diseqcpos = diseqcParam.BB)
+ fastDiSEqC = nim.simpleDiSEqCOnlyOnSatChange.value
+ setVoltageTone = nim.simpleDiSEqCSetVoltageTone.value
+ self.addLNBSimple(sec, slotid = x, orbpos = nim.diseqcA.orbital_position, toneburstmode = diseqcParam.NO, diseqcmode = diseqcParam.V1_0, diseqcpos = diseqcParam.AA, fastDiSEqC = fastDiSEqC, setVoltageTone = setVoltageTone)
+ self.addLNBSimple(sec, slotid = x, orbpos = nim.diseqcB.orbital_position, toneburstmode = diseqcParam.NO, diseqcmode = diseqcParam.V1_0, diseqcpos = diseqcParam.AB, fastDiSEqC = fastDiSEqC, setVoltageTone = setVoltageTone)
+ self.addLNBSimple(sec, slotid = x, orbpos = nim.diseqcC.orbital_position, toneburstmode = diseqcParam.NO, diseqcmode = diseqcParam.V1_0, diseqcpos = diseqcParam.BA, fastDiSEqC = fastDiSEqC, setVoltageTone = setVoltageTone)
+ self.addLNBSimple(sec, slotid = x, orbpos = nim.diseqcD.orbital_position, toneburstmode = diseqcParam.NO, diseqcmode = diseqcParam.V1_0, diseqcpos = diseqcParam.BB, fastDiSEqC = fastDiSEqC, setVoltageTone = setVoltageTone)
elif nim.diseqcMode.value == "positioner": #Positioner
if nim.latitudeOrientation.value == "north":
laValue = rotorParam.NORTH
@@ -185,12 +199,11 @@ class SecConfigure:
loValue = rotorParam.EAST
else:
loValue = rotorParam.WEST
- inputPowerDelta=50
+ inputPowerDelta=nim.powerThreshold.value
useInputPower=False
turning_speed=0
if nim.powerMeasurement.value:
useInputPower=True
- inputPowerDelta=nim.powerThreshold.value
turn_speed_dict = { "fast": rotorParam.FAST, "slow": rotorParam.SLOW }
if turn_speed_dict.has_key(nim.turningSpeed.value):
turning_speed = turn_speed_dict[nim.turningSpeed.value]
@@ -656,7 +669,7 @@ class NimManager:
def canEqualTo(self, slotid):
type = self.getNimType(slotid)
- if self.getNimConfig(slotid) == "DVB-S2":
+ if type == "DVB-S2":
type = "DVB-S"
nimList = self.getNimListOfType(type, slotid)
for nim in nimList[:]:
@@ -664,10 +677,10 @@ class NimManager:
if mode.configMode.value == "loopthrough" or mode.configMode.value == "satposdepends":
nimList.remove(nim)
return nimList
-
+
def canDependOn(self, slotid):
type = self.getNimType(slotid)
- if self.getNimConfig(slotid) == "DVB-S2":
+ if type == "DVB-S2":
type = "DVB-S"
nimList = self.getNimListOfType(type, slotid)
positionerList = []
@@ -680,6 +693,13 @@ class NimManager:
if lnb != 0:
nimHaveRotor = True
break
+ if not nimHaveRotor:
+ for sat in mode.advanced.sat.values():
+ lnb_num = int(sat.lnb.value)
+ diseqcmode = lnb_num and mode.advanced.lnb[lnb_num].diseqcMode.value or ""
+ if diseqcmode == "1_2":
+ nimHaveRotor = True
+ break
if nimHaveRotor:
alreadyConnected = False
for testnim in nimList:
@@ -725,12 +745,16 @@ class NimManager:
if configMode == "simple":
dm = nim.diseqcMode.value
if dm in ["single", "toneburst_a_b", "diseqc_a_b", "diseqc_a_b_c_d"]:
- list.append(self.satList[nim.diseqcA.index])
+ if nim.diseqcA.orbital_position != 3601:
+ list.append(self.satList[nim.diseqcA.index-1])
if dm in ["toneburst_a_b", "diseqc_a_b", "diseqc_a_b_c_d"]:
- list.append(self.satList[nim.diseqcB.index])
+ if nim.diseqcB.orbital_position != 3601:
+ list.append(self.satList[nim.diseqcB.index-1])
if dm == "diseqc_a_b_c_d":
- list.append(self.satList[nim.diseqcC.index])
- list.append(self.satList[nim.diseqcD.index])
+ if nim.diseqcC.orbital_position != 3601:
+ list.append(self.satList[nim.diseqcC.index-1])
+ if nim.diseqcD.orbital_position != 3601:
+ list.append(self.satList[nim.diseqcD.index-1])
if dm == "positioner":
for x in self.satList:
list.append(x)
@@ -834,6 +858,14 @@ def InitSecParams():
x.addNotifier(lambda configElement: secClass.setParam(secClass.MOTOR_COMMAND_RETRIES, configElement.value))
config.sec.motor_command_retries = x
+ x = ConfigInteger(default=50, limits = (0, 9999))
+ x.addNotifier(lambda configElement: secClass.setParam(secClass.DELAY_AFTER_DISEQC_RESET_CMD, configElement.value))
+ config.sec.delay_after_diseqc_reset_cmd = x
+
+ x = ConfigInteger(default=150, limits = (0, 9999))
+ x.addNotifier(lambda configElement: secClass.setParam(secClass.DELAY_AFTER_DISEQC_PERIPHERIAL_POWERON_CMD, configElement.value))
+ config.sec.delay_after_diseqc_peripherial_poweron_cmd = x
+
# TODO add support for satpos depending nims to advanced nim configuration
# so a second/third/fourth cable from a motorized lnb can used behind a
# diseqc 1.0 / diseqc 1.1 / toneburst switch
@@ -842,6 +874,7 @@ def InitSecParams():
def InitNimManager(nimmgr):
InitSecParams()
+ hw = HardwareInfo()
config.Nims = ConfigSubList()
for x in range(len(nimmgr.nim_slots)):
@@ -883,10 +916,13 @@ def InitNimManager(nimmgr):
if id != x:
choices.append((str(id), nimmgr.getNimDescription(id)))
nim.connectedTo = ConfigSelection(choices = choices)
- nim.diseqcA = getConfigSatlist(192, nimmgr.satList)
- nim.diseqcB = getConfigSatlist(130, nimmgr.satList)
- nim.diseqcC = ConfigSatlist(list = nimmgr.satList)
- nim.diseqcD = ConfigSatlist(list = nimmgr.satList)
+ nim.simpleSingleSendDiSEqC = ConfigYesNo(default=False)
+ nim.simpleDiSEqCSetVoltageTone = ConfigYesNo(default=True)
+ nim.simpleDiSEqCOnlyOnSatChange = ConfigYesNo(default=False)
+ nim.diseqcA = getConfigSatlist(192, [(3601, _('nothing connected'), 1)] + nimmgr.satList)
+ nim.diseqcB = getConfigSatlist(130, [(3601, _('nothing connected'), 1)] + nimmgr.satList)
+ nim.diseqcC = ConfigSatlist(list = [(3601, _('nothing connected'), 1)] + nimmgr.satList)
+ nim.diseqcD = ConfigSatlist(list = [(3601, _('nothing connected'), 1)] + nimmgr.satList)
nim.positionerMode = ConfigSelection(
choices = [
("usals", _("USALS")),
@@ -897,7 +933,7 @@ def InitNimManager(nimmgr):
nim.latitude = ConfigFloat(default=[50,767], limits=[(0,359),(0,999)])
nim.latitudeOrientation = ConfigSelection(choices={"north": _("North"), "south": _("South")}, default="north")
nim.powerMeasurement = ConfigYesNo(default=True)
- nim.powerThreshold = ConfigInteger(default=50, limits=(0, 100))
+ nim.powerThreshold = ConfigInteger(default=hw.get_device_name() == "dm8000" and 15 or 50, limits=(0, 100))
nim.turningSpeed = ConfigSelection(choices = [("fast", _("Fast")), ("slow", _("Slow")), ("fast epoch", _("Fast epoch")) ], default = "fast")
btime = datetime(1970, 1, 1, 7, 0);
nim.fastTurningBegin = ConfigDateTime(default = mktime(btime.timetuple()), formatstring = _("%H:%M"), increment = 900)
@@ -972,7 +1008,7 @@ def InitNimManager(nimmgr):
nim.advanced.lnb[x].latitude = ConfigFloat(default = [50,767], limits = [(0,359),(0,999)])
nim.advanced.lnb[x].latitudeOrientation = ConfigSelection(choices = [("north", _("North")), ("south", _("South"))], default = "north")
nim.advanced.lnb[x].powerMeasurement = ConfigYesNo(default=True)
- nim.advanced.lnb[x].powerThreshold = ConfigInteger(default=50, limits=(0, 100))
+ nim.advanced.lnb[x].powerThreshold = ConfigInteger(default=hw.get_device_name() == "dm8000" and 15 or 50, limits=(0, 100))
nim.advanced.lnb[x].turningSpeed = ConfigSelection(choices = [("fast", _("Fast")), ("slow", _("Slow")), ("fast epoch", _("Fast epoch"))], default = "fast")
btime = datetime(1970, 1, 1, 7, 0);
nim.advanced.lnb[x].fastTurningBegin = ConfigDateTime(default=mktime(btime.timetuple()), formatstring = _("%H:%M"), increment = 600)
diff --git a/lib/python/Components/Playlist.py b/lib/python/Components/Playlist.py
index 744ee3af..c9ebe479 100644
--- a/lib/python/Components/Playlist.py
+++ b/lib/python/Components/Playlist.py
@@ -58,6 +58,7 @@ class PlaylistIOM3U(PlaylistIO):
def open(self, filename):
self.clear()
+ self.displayname = None
try:
file = open(filename, "r")
except IOError:
@@ -66,14 +67,22 @@ class PlaylistIOM3U(PlaylistIO):
entry = file.readline().strip()
if entry == "":
break
- if entry[0] != "#":
+ if entry.startswith("#EXTINF:"):
+ extinf = entry.split(',',1)
+ if len(extinf) > 1:
+ self.displayname = extinf[1]
# TODO: use e2 facilities to create a service ref from file
+ elif entry[0] != "#":
if entry[0] == "/":
- self.addService(ServiceReference("4097:0:0:0:0:0:0:0:0:0:" + entry))
+ sref = ServiceReference("4097:0:0:0:0:0:0:0:0:0:" + entry)
elif entry.startswith("http"):
- self.addService(ServiceReference("4097:0:0:0:0:0:0:0:0:0:" + entry.replace(':',"%3a")))
+ sref = ServiceReference("4097:0:0:0:0:0:0:0:0:0:" + entry.replace(':',"%3a"))
else:
- self.addService(ServiceReference("4097:0:0:0:0:0:0:0:0:0:" + os.path.dirname(filename) + "/" + entry))
+ sref = ServiceReference("4097:0:0:0:0:0:0:0:0:0:" + os.path.dirname(filename) + "/" + entry)
+ if self.displayname:
+ sref.ref.setName(self.displayname)
+ self.displayname = None
+ self.addService(sref)
file.close()
return self.list
diff --git a/lib/python/Components/TimerSanityCheck.py b/lib/python/Components/TimerSanityCheck.py
index e793cdcd..031c9cae 100644
--- a/lib/python/Components/TimerSanityCheck.py
+++ b/lib/python/Components/TimerSanityCheck.py
@@ -1,9 +1,7 @@
-import string
import NavigationInstance
from time import localtime
-from Components.NimManager import nimmanager
from ServiceReference import ServiceReference
-from enigma import iServiceInformation, eServiceCenter
+from enigma import iServiceInformation, eServiceCenter, eServiceReference
class TimerSanityCheck:
def __init__(self, timerlist, newtimer=None):
@@ -54,6 +52,7 @@ class TimerSanityCheck:
# index -1 for the new Timer, 0..n index of the existing timers
# count of running timers
+ serviceHandler = eServiceCenter.getInstance()
print "checkTimerlist"
# create a list with all start and end times
# split it into recurring and singleshot timers
@@ -149,9 +148,7 @@ class TimerSanityCheck:
fakeRecList = []
ConflictTimer = None
ConflictTunerType = None
- ConflictSlot = None
newTimerTunerType = None
- newTimerTunerSlot = None
cnt = 0
idx = 0
overlaplist = []
@@ -162,24 +159,45 @@ class TimerSanityCheck:
else:
timer = self.timerlist[event[2]]
if event[1] == self.bflag:
- fakeRecService = NavigationInstance.instance.recordService(timer.service_ref)
- fakeRecResult = fakeRecService.start(True)
- feinfo = fakeRecService.frontendInfo().getFrontendData()
- tunerType = feinfo.get("tuner_type")
- tunerSlot = feinfo.get("tuner_number")
+ tunerType = [ ]
+ fakeRecService = NavigationInstance.instance.recordService(timer.service_ref, True)
+ if fakeRecService:
+ fakeRecResult = fakeRecService.start(True)
+ else:
+ fakeRecResult = -1
+ if not fakeRecResult: # tune okay
+ feinfo = fakeRecService.frontendInfo().getFrontendData()
+ tunerType.append(feinfo.get("tuner_type"))
+ else: # tune failed.. so we must go another way to get service type (DVB-S, DVB-T, DVB-C)
+
+ def getServiceType(ref): # helper function to get a service type of a service reference
+ serviceInfo = serviceHandler.info(ref)
+ serviceInfo = serviceInfo and serviceInfo.getInfoObject(ref, iServiceInformation.sTransponderData)
+ if serviceInfo:
+ return { "Satellite" : "DVB-S", "Cable" : "DVB-C", "Terrestrial" : "DVB-T"}[serviceInfo["type"]]
+
+ ref = timer.service_ref.ref
+ if ref.flags & eServiceReference.isGroup: # service group ?
+ serviceList = serviceHandler.list(ref) # get all alternative services
+ if serviceList:
+ for ref in serviceList.getContent("R"): # iterate over all group service references
+ type = getServiceType(ref)
+ if not type in tunerType: # just add single time
+ tunerType.append(type)
+ else:
+ tunerType.append(getServiceType(ref))
+
if event[2] == -1: # new timer
newTimerTunerType = tunerType
- newTimerTunerSlot = tunerSlot
- overlaplist.append((fakeRecResult, timer, tunerType, tunerSlot))
+ overlaplist.append((fakeRecResult, timer, tunerType))
fakeRecList.append((timer, fakeRecService))
if fakeRecResult:
if ConflictTimer is None: # just take care of the first conflict
ConflictTimer = timer
ConflictTunerType = tunerType
- ConflictTunerSlot = tunerSlot
elif event[1] == self.eflag:
for fakeRec in fakeRecList:
- if timer == fakeRec[0]:
+ if timer == fakeRec[0] and fakeRec[1]:
NavigationInstance.instance.stopRecordService(fakeRec[1])
fakeRecList.remove(fakeRec)
del fakeRec
@@ -211,7 +229,6 @@ class TimerSanityCheck:
if nt and kt:
ConflictTimer = self.newtimer
ConflictTunerType = newTimerTunerType
- ConflictSlot = newTimerTunerSlot
break
self.simultimer = [ ConflictTimer ]
@@ -223,8 +240,11 @@ class TimerSanityCheck:
else:
continue
for entry in event[4]:
- if not self.simultimer.count(entry[1]) and (entry[2] == ConflictTunerType or entry[3] == ConflictTunerSlot):
- self.simultimer.append(entry[1])
+ if not entry[1] in self.simultimer:
+ for x in entry[2]:
+ if x in ConflictTunerType:
+ self.simultimer.append(entry[1])
+ break
if len(self.simultimer) < 2:
print "Bug: unknown Conflict!"
diff --git a/lib/python/Components/UsageConfig.py b/lib/python/Components/UsageConfig.py
index 714d366d..6ed87840 100644
--- a/lib/python/Components/UsageConfig.py
+++ b/lib/python/Components/UsageConfig.py
@@ -1,5 +1,5 @@
from Components.Harddisk import harddiskmanager
-from config import ConfigSubsection, ConfigYesNo, config, ConfigSelection, ConfigText, ConfigNumber, ConfigSet
+from config import ConfigSubsection, ConfigYesNo, config, ConfigSelection, ConfigText, ConfigNumber, ConfigSet, ConfigLocations
from enigma import Misc_Options, setTunerTypePriorityOrder;
from SystemInfo import SystemInfo
import os
@@ -30,6 +30,9 @@ def InitUsageConfig():
("standard", _("standard")), ("swap", _("swap PiP and main picture")),
("swapstop", _("move PiP to main picture")), ("stop", _("stop PiP")) ])
+ config.usage.allowed_timeshift_paths = ConfigLocations(default = ["/media/hdd/"])
+ config.usage.timeshift_path = ConfigText(default = "/media/hdd")
+
config.usage.on_movie_start = ConfigSelection(default = "ask", choices = [
("ask", _("Ask user")), ("resume", _("Resume from last position")), ("beginning", _("Start from the beginning")) ])
config.usage.on_movie_stop = ConfigSelection(default = "ask", choices = [
diff --git a/lib/python/Components/config.py b/lib/python/Components/config.py
index b448ca6d..4d57bbb9 100644..100755
--- a/lib/python/Components/config.py
+++ b/lib/python/Components/config.py
@@ -34,6 +34,7 @@ class ConfigElement(object):
self.save_disabled = False
self.notifiers = []
self.enabled = True
+ self.callNotifiersOnSaveAndCancel = False
# you need to override this to do input validation
def setValue(self, value):
@@ -66,9 +67,13 @@ class ConfigElement(object):
self.saved_value = None
else:
self.saved_value = self.tostring(self.value)
+ if self.callNotifiersOnSaveAndCancel:
+ self.changed()
def cancel(self):
self.load()
+ if self.callNotifiersOnSaveAndCancel:
+ self.changed()
def isChanged(self):
sv = self.saved_value
@@ -513,6 +518,7 @@ class ConfigIP(ConfigSequence):
self.auto_jump = auto_jump
def handleKey(self, key):
+
if key == KEY_LEFT:
if self.marked_block > 0:
self.marked_block -= 1
@@ -531,8 +537,14 @@ class ConfigIP(ConfigSequence):
self.marked_block = len(self.limits)-1
self.overwrite = True
- if key in KEY_NUMBERS:
- number = getKeyNumber(key)
+ if key in KEY_NUMBERS or key == KEY_ASCII:
+ if key == KEY_ASCII:
+ code = getPrevAsciiCode()
+ if code < 48 or code > 57:
+ return
+ number = code - 48
+ else:
+ number = getKeyNumber(key)
oldvalue = self._value[self.marked_block]
if self.overwrite:
@@ -770,12 +782,12 @@ class ConfigText(ConfigElement, NumericalTextInput):
def getValue(self):
return self.text.encode("utf-8")
-
+
def setValue(self, val):
try:
self.text = val.decode("utf-8")
except UnicodeDecodeError:
- self.text = val
+ self.text = val.decode("utf-8", "ignore")
print "Broken UTF8!"
value = property(getValue, setValue)