fix frequently segfault on clean shutdown
[enigma2.git] / lib / python / Components / config.py
index 6c683bca4d48ad7858f1672f1d29d09d1a297102..de06871a59dff3936f14cf4b1dac388dba81a6ec 100644 (file)
@@ -194,10 +194,16 @@ class ConfigSelection(ConfigElement):
                        self.value = self.choices[(i + 1) % nchoices]
 
        def getText(self):
-               return _(self.description[self.value])
+               descr = self.description[self.value]
+               if len(descr):
+                       return _(descr)
+               return descr
 
        def getMulti(self, selected):
-               return ("text", _(self.description[self.value]))
+               descr = self.description[self.value]
+               if len(descr):
+                       return ("text", _(descr))
+               return ("text", descr)
 
        # HTML
        def getHTML(self, id):
@@ -229,12 +235,18 @@ class ConfigBoolean(ConfigElement):
                        self.value = not self.value
 
        def getText(self):
-               return _(self.descriptions[self.value])
+               descr = self.descriptions[self.value]
+               if len(descr):
+                       return _(descr)
+               return descr
 
        def getMulti(self, selected):
-               return ("text", _(self.descriptions[self.value]))
+               descr = self.descriptions[self.value]
+               if len(descr):
+                       return ("text", _(descr))
+               return ("text", descr)
 
-       def tostring(self, value):
+       def tostring(self, value):
                if not value:
                        return "false"
                else:
@@ -285,7 +297,6 @@ class ConfigDateTime(ConfigElement):
                if key == KEY_RIGHT:
                        self.value = self.value + self.increment
 
-
        def getText(self):
                return time.strftime(self.formatstring, time.localtime(self.value))
 
@@ -317,6 +328,8 @@ class ConfigSequence(ConfigElement):
                
                self.default = default
                self.value = copy.copy(default)
+               
+               self.endNotifier = []
 
        def validate(self):
                max_pos = 0
@@ -325,7 +338,7 @@ class ConfigSequence(ConfigElement):
                        max_pos += len(str(self.limits[num][1]))
 
                        while self._value[num] < self.limits[num][0]:
-                               self.value[num] += 1
+                               self._value[num] += 1
 
                        while self._value[num] > self.limits[num][1]:
                                self._value[num] -= 1
@@ -333,6 +346,8 @@ class ConfigSequence(ConfigElement):
                        num += 1
 
                if self.marked_pos >= max_pos:
+                       for x in self.endNotifier:
+                               x(self)
                        self.marked_pos = max_pos - 1
 
                if self.marked_pos < 0:
@@ -346,6 +361,9 @@ class ConfigSequence(ConfigElement):
 
                if self.marked_pos >= total_len:
                        self.marked_pos = total_len - 1
+                       
+       def addEndNotifier(self, notifier):
+               self.endNotifier.append(notifier)
 
        def handleKey(self, key):
                if key == KEY_LEFT:
@@ -429,11 +447,15 @@ class ConfigSequence(ConfigElement):
                return str(v)
 
        def fromstring(self, value):
-               return [int(x) for x in self.saved_value.split(self.seperator)]
+               return [int(x) for x in value.split(self.seperator)]
 
 class ConfigIP(ConfigSequence):
        def __init__(self, default):
                ConfigSequence.__init__(self, seperator = ".", limits = [(0,255),(0,255),(0,255),(0,255)], default = default)
+       
+       def getHTML(self, id):
+               # we definitely don't want leading zeros
+               return '.'.join(["%d" % d for d in self.value])
 
 class ConfigMAC(ConfigSequence):
        def __init__(self, default):
@@ -501,10 +523,10 @@ class ConfigText(ConfigElement, NumericalTextInput):
                self.value = self.default = default
 
        def validateMarker(self):
-               if self.marked_pos < 0:
-                       self.marked_pos = 0
                if self.marked_pos >= len(self.text):
                        self.marked_pos = len(self.text) - 1
+               if self.marked_pos < 0:
+                       self.marked_pos = 0
 
        #def nextEntry(self):
        #       self.vals[1](self.getConfigPath())
@@ -518,9 +540,7 @@ class ConfigText(ConfigElement, NumericalTextInput):
                        self.marked_pos -= 1
                elif key == KEY_RIGHT:
                        self.marked_pos += 1
-                       if not self.fixed_size:
-                               if self.marked_pos >= len(self.text):
-                                       self.text = self.text.ljust(len(self.text) + 1)
+                       self.maybeExpand()
                elif key in KEY_NUMBERS:
                        number = self.getKey(getKeyNumber(key))
                        self.text = self.text[0:self.marked_pos] + unicode(number) + self.text[self.marked_pos + 1:]
@@ -531,8 +551,14 @@ class ConfigText(ConfigElement, NumericalTextInput):
                self.validateMarker()
                self.changed()
 
+       def maybeExpand(self):
+               if not self.fixed_size:
+                       if self.marked_pos >= len(self.text):
+                               self.text = self.text.ljust(len(self.text) + 1)
+
        def nextFunc(self):
                self.marked_pos += 1
+               self.maybeExpand()
                self.validateMarker()
                self.changed()
 
@@ -607,7 +633,7 @@ class ConfigSatlist(ConfigSelection):
        def __init__(self, list, default = None):
                if default is not None:
                        default = str(default)
-               ConfigSelection.__init__(self, choices = [(str(orbpos), desc) for (orbpos, desc) in list], default = default)
+               ConfigSelection.__init__(self, choices = [(str(orbpos), desc) for (orbpos, desc, flags) in list], default = default)
 
        def getOrbitalPosition(self):
                if self.value == "":
@@ -683,6 +709,12 @@ class ConfigSubList(list, object):
                        item.saved_value = self.stored_values[i]
                        item.load()
 
+       def dict(self):
+               res = dict()
+               for index in range(len(self)):
+                       res[str(index)] = self[index]
+               return res
+
 # same as ConfigSubList, just as a dictionary.
 # care must be taken that the 'key' has a proper
 # str() method, because it will be used in the config
@@ -722,6 +754,9 @@ class ConfigSubDict(dict, object):
                        item.saved_value = self.stored_values[str(key)]
                        item.load()
 
+       def dict(self):
+               return self
+
 # Like the classes above, just with a more "native"
 # syntax.
 #
@@ -782,6 +817,9 @@ class ConfigSubsection(object):
                for x in self.content.items.values():
                        x.load()
 
+       def dict(self):
+               return self.content.items
+
 # the root config object, which also can "pickle" (=serialize)
 # down the whole config tree.
 #
@@ -863,7 +901,7 @@ class ConfigFile:
        def __resolveValue(self, pickles, cmap):
                if cmap.has_key(pickles[0]):
                        if len(pickles) > 1:
-                               return self.__resolveValue(pickles[1:], cmap[pickles[0]].content.items)
+                               return self.__resolveValue(pickles[1:], cmap[pickles[0]].dict())
                        else:
                                return str(cmap[pickles[0]].value)
                return None