Merge commit 'origin/bug_578_translateable_meta_descriptions'
authoracid-burn <acid-burn@opendreambox.org>
Tue, 5 Oct 2010 11:00:54 +0000 (13:00 +0200)
committeracid-burn <acid-burn@opendreambox.org>
Tue, 5 Oct 2010 11:00:54 +0000 (13:00 +0200)
Conflicts:
lib/python/Plugins/Extensions/GraphMultiEPG/meta/plugin_graphmultiepg.xml

70 files changed:
RecordTimer.py [changed mode: 0644->0755]
data/defaults/Dream/hdbouquets/userbouquet.favourites.tv
data/defaults/Dream/sdbouquets/userbouquet.favourites.tv
data/menu.xml
data/setup.xml [changed mode: 0644->0755]
data/skin_default.xml
data/skin_default/icons/Makefile.am [changed mode: 0644->0755]
data/skin_default/icons/input_keyboard-configured.png [new file with mode: 0644]
data/skin_default/icons/input_keyboard.png [new file with mode: 0644]
data/skin_default/icons/input_mouse-configured.png [new file with mode: 0644]
data/skin_default/icons/input_mouse.png [new file with mode: 0644]
data/skin_default/icons/input_rcnew-configured.png [new file with mode: 0644]
data/skin_default/icons/input_rcnew.png [new file with mode: 0644]
data/skin_default/icons/input_rcold-configured.png [new file with mode: 0644]
data/skin_default/icons/input_rcold.png [new file with mode: 0644]
data/skin_default/icons/network_wired-active.png [new file with mode: 0755]
data/skin_default/icons/network_wired-inactive.png [new file with mode: 0755]
data/skin_default/icons/network_wired.png [new file with mode: 0755]
data/skin_default/icons/network_wireless-active.png [new file with mode: 0755]
data/skin_default/icons/network_wireless-inactive.png [new file with mode: 0755]
data/skin_default/icons/network_wireless.png [new file with mode: 0755]
lib/python/Components/About.py [changed mode: 0644->0755]
lib/python/Components/Converter/TemplatedMultiContent.py [changed mode: 0644->0755]
lib/python/Components/InputDevice.py [changed mode: 0644->0755]
lib/python/Components/Network.py
lib/python/Components/RecordingConfig.py [changed mode: 0644->0755]
lib/python/Components/Renderer/Listbox.py [changed mode: 0644->0755]
lib/python/Plugins/SystemPlugins/NetworkWizard/NetworkWizard.py
lib/python/Plugins/SystemPlugins/SoftwareManager/BackupRestore.py
lib/python/Plugins/SystemPlugins/SoftwareManager/SoftwareTools.py
lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py
lib/python/Plugins/SystemPlugins/WirelessLan/Makefile.am
lib/python/Plugins/SystemPlugins/WirelessLan/Wlan.py
lib/python/Plugins/SystemPlugins/WirelessLan/flags.py [deleted file]
lib/python/Plugins/SystemPlugins/WirelessLan/iwlibs.py [deleted file]
lib/python/Plugins/SystemPlugins/WirelessLan/plugin.py
lib/python/Screens/InputDeviceSetup.py [new file with mode: 0755]
lib/python/Screens/Ipkg.py
lib/python/Screens/Makefile.am
lib/python/Screens/NetworkSetup.py
po/ar.po
po/ca.po
po/cs.po
po/da.po
po/de.po
po/el.po
po/en.po
po/enigma2.pot
po/es.po
po/et.po
po/fi.po
po/fr.po
po/fy.po
po/hr.po
po/hu.po
po/is.po
po/it.po
po/lt.po
po/lv.po
po/nl.po
po/no.po
po/pl.po
po/pt.po
po/ru.po
po/sk.po
po/sl.po
po/sr.po
po/sv.po
po/tr.po
po/uk.po

old mode 100644 (file)
new mode 100755 (executable)
index f670417..1608caa
@@ -129,6 +129,7 @@ class RecordTimerEntry(timer.TimerEntry, object):
        def calculateFilename(self):
                service_name = self.service_ref.getServiceName()
                begin_date = strftime("%Y%m%d %H%M", localtime(self.begin))
+               begin_shortdate = strftime("%Y%m%d", localtime(self.begin))
                
                print "begin_date: ", begin_date
                print "service_name: ", service_name
@@ -137,7 +138,15 @@ class RecordTimerEntry(timer.TimerEntry, object):
                
                filename = begin_date + " - " + service_name
                if self.name:
-                       filename += " - " + self.name
+                       if config.usage.setup_level.index >= 2: # expert+
+                               if config.recording.filename_composition.value == "short":
+                                       filename = begin_shortdate + " - " + self.name
+                               elif config.recording.filename_composition.value == "long":
+                                       filename += " - " + self.name + " - " + self.description
+                               else:
+                                       filename += " - " + self.name # standard
+                       else:
+                               filename += " - " + self.name
 
                if config.recording.ascii_filenames.value:
                        filename = ASCIItranslit.legacyEncode(filename)
index 91536b1..b6bc62f 100644 (file)
@@ -11,6 +11,7 @@
 #SERVICE 1:0:1:701:5:85:C00000:0:0:0:\r
 #SERVICE 1:0:1:2F1C:441:1:C00000:0:0:0:\r
 #SERVICE 1:0:1:6D6E:437:1:C00000:0:0:0:\r
+#SERVICE 1:0:1:308:5:85:C00000:0:0:0:\r
 #SERVICE 1:0:1:2FC:5:85:C00000:0:0:0:\r
 #SERVICE 1:0:1:F98:454:1:C00000:0:0:0:\r
 #SERVICE 1:0:19:2B70:3F3:1:C00000:0:0:0:\r
 #SERVICE 1:0:1:6E42:431:1:C00000:0:0:0:\r
 #SERVICE 1:64:B:0:0:0:0:0:0:0::Doku/Wissen/Themen\r
 #DESCRIPTION Doku/Wissen/Themen\r
-#SERVICE 1:0:1:6DD0:44D:1:C00000:0:0:0:\r
+#SERVICE 1:0:1:6F47:445:1:C00000:0:0:0:\r
 #SERVICE 1:0:1:6D6B:437:1:C00000:0:0:0:\r
 #SERVICE 1:0:1:2775:444:1:C00000:0:0:0:\r
 #SERVICE 1:0:1:293:5:85:C00000:0:0:0:\r
 #SERVICE 1:0:1:6D70:437:1:C00000:0:0:0:\r
-#SERVICE 1:0:1:277B:444:1:C00000:0:0:0:\r
+#SERVICE 1:0:1:49:5:85:C00000:0:0:0:\r
 #SERVICE 1:0:1:332D:45B:1:C00000:0:0:0:\r
 #SERVICE 1:0:1:3139:459:1:C00000:0:0:0:\r
 #SERVICE 1:0:1:2F5A:454:1:C00000:0:0:0:\r
index 5f89c48..1cea366 100644 (file)
@@ -11,6 +11,7 @@
 #SERVICE 1:0:1:701:5:85:C00000:0:0:0:\r
 #SERVICE 1:0:1:2F1C:441:1:C00000:0:0:0:\r
 #SERVICE 1:0:1:6D6E:437:1:C00000:0:0:0:\r
+#SERVICE 1:0:1:308:5:85:C00000:0:0:0:\r
 #SERVICE 1:0:1:2FC:5:85:C00000:0:0:0:\r
 #SERVICE 1:0:1:F98:454:1:C00000:0:0:0:\r
 #SERVICE 1:0:1:7034:41B:1:C00000:0:0:0:\r
 #SERVICE 1:0:1:6E42:431:1:C00000:0:0:0:\r
 #SERVICE 1:64:B:0:0:0:0:0:0:0::Doku/Wissen/Themen\r
 #DESCRIPTION Doku/Wissen/Themen\r
-#SERVICE 1:0:1:6DD0:44D:1:C00000:0:0:0:\r
+#SERVICE 1:0:1:6F47:445:1:C00000:0:0:0:\r
 #SERVICE 1:0:1:6D6B:437:1:C00000:0:0:0:\r
 #SERVICE 1:0:1:2775:444:1:C00000:0:0:0:\r
 #SERVICE 1:0:1:293:5:85:C00000:0:0:0:\r
 #SERVICE 1:0:1:6D70:437:1:C00000:0:0:0:\r
-#SERVICE 1:0:1:277B:444:1:C00000:0:0:0:\r
+#SERVICE 1:0:1:49:5:85:C00000:0:0:0:\r
 #SERVICE 1:0:1:332D:45B:1:C00000:0:0:0:\r
 #SERVICE 1:0:1:3139:459:1:C00000:0:0:0:\r
 #SERVICE 1:0:1:2F5A:454:1:C00000:0:0:0:\r
index b437fbc..6507bfe 100755 (executable)
@@ -62,8 +62,9 @@
                                </menu>
                                <!--<item text="Remote Control"><setup id="rc" /></item>-->
                                <!--<item text="OSD"><setup id="osd" /></item>-->
-                               <item requires="Display"><setup level="1" id="lcd" /></item>
                                <item level="0" text="Network" entryID="network_setup"><screen module="NetworkSetup" screen="NetworkAdapterSelection" /></item>
+                               <item level="1" text="Input devices" entryID="input_device_setup"><screen module="InputDeviceSetup" screen="InputDeviceSelection" /></item>
+                               <item requires="Display"><setup level="1" id="lcd" /></item>
                                <item text="Keyboard"><setup id="keyboard" /></item>
                                <!--<menu level="1" text="Network..." entryID="network_setup">
                                        <id val="network" />
old mode 100644 (file)
new mode 100755 (executable)
index 9425afd..2333825
@@ -70,6 +70,7 @@
                        <item level="2" text="Behavior of 0 key in PiP-mode">config.usage.pip_zero_button</item>
                        <item level="2" text="Alternative services tuner priority">config.usage.alternatives_priority</item>
                        <item level="2" text="Limited character set for recording filenames">config.recording.ascii_filenames</item>
+                       <item level="2" text="Composition of the recording filenames">config.recording.filename_composition</item>
                </setup>
                <setup key="harddisk" title="Harddisk setup" >
                        <item level="0" text="Harddisk standby after">config.usage.hdd_standby</item>
index 0114349..497d33a 100755 (executable)
@@ -577,7 +577,19 @@ self.instance.move(ePoint(orgpos.x() + (orgwidth - newwidth)/2, orgpos.y()))
                <widget source="key_green" render="Label" position="140,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" transparent="1" />
                <widget source="key_yellow" render="Label" position="280,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#a08500" transparent="1" />
                <widget source="key_blue" render="Label" position="420,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#18188b" transparent="1" />
-               <widget name="list" position="5,50" size="550,280" scrollbarMode="showOnDemand" zPosition="10"/>
+               <widget source="list" render="Listbox" position="5,50" size="550,280" zPosition="10" scrollbarMode="showOnDemand">
+                       <convert type="TemplatedMultiContent"> <!--  iface, name, description, interfacepng, defaultpng, activepng, divpng  -->
+                               {"template": [
+                                               MultiContentEntryText(pos = (85, 6), size = (440, 28), font=0, flags = RT_HALIGN_LEFT|RT_VALIGN_TOP, text = 1), # index 1 is the interfacename
+                                               MultiContentEntryText(pos = (85, 43), size = (440, 20), font=1, flags = RT_HALIGN_LEFT|RT_VALIGN_BOTTOM, text = 2), # index 2 is the description
+                                               MultiContentEntryPixmapAlphaTest(pos = (2, 8), size = (54, 54), png = 3), # index 3 is the interface pixmap
+                                               MultiContentEntryPixmapAlphaTest(pos = (63, 46), size = (15, 16), png = 4), # index 4 is the default pixmap
+                                       ],
+                               "fonts": [gFont("Regular", 28),gFont("Regular", 20)],
+                               "itemHeight": 70
+                               }
+                       </convert>
+               </widget>
                <ePixmap pixmap="skin_default/div-h.png" position="0,340" zPosition="1" size="560,2" />
                <widget source="introduction" render="Label" position="0,350" size="560,50" zPosition="10" font="Regular;21" halign="center" valign="center" backgroundColor="#25062748" transparent="1" />
        </screen>
old mode 100644 (file)
new mode 100755 (executable)
index 8e2052b..c6cb269
@@ -27,13 +27,27 @@ dist_install_DATA = \
        icon_view.png \
        input_error.png \
        input_info.png \
+       input_keyboard-configured.png \
+       input_keyboard.png \
+       input_mouse-configured.png \
+       input_mouse.png \
        input_question.png \
+       input_rcnew-configured.png \
+       input_rcnew.png \
+       input_rcold-configured.png \
+       input_rcold.png \
        lock_error.png \
        lock_off.png \
        lock_on.png \
        lock.png \
        marker.png \
        mp_buttons.png \
+       network_wired.png \
+       network_wired-active.png \
+       network_wired-inactive.png \    
+       network_wireless.png \
+       network_wireless-active.png \
+       network_wireless-inactive.png \ 
        plugin.png \
        rass_logo.png \
        rass_page1.png \
@@ -48,3 +62,4 @@ dist_install_DATA = \
        scan-s.png \
        scan-t.png \
        selectioncross.png
+
diff --git a/data/skin_default/icons/input_keyboard-configured.png b/data/skin_default/icons/input_keyboard-configured.png
new file mode 100644 (file)
index 0000000..c6623a5
Binary files /dev/null and b/data/skin_default/icons/input_keyboard-configured.png differ
diff --git a/data/skin_default/icons/input_keyboard.png b/data/skin_default/icons/input_keyboard.png
new file mode 100644 (file)
index 0000000..a922c89
Binary files /dev/null and b/data/skin_default/icons/input_keyboard.png differ
diff --git a/data/skin_default/icons/input_mouse-configured.png b/data/skin_default/icons/input_mouse-configured.png
new file mode 100644 (file)
index 0000000..3db9447
Binary files /dev/null and b/data/skin_default/icons/input_mouse-configured.png differ
diff --git a/data/skin_default/icons/input_mouse.png b/data/skin_default/icons/input_mouse.png
new file mode 100644 (file)
index 0000000..f70c84e
Binary files /dev/null and b/data/skin_default/icons/input_mouse.png differ
diff --git a/data/skin_default/icons/input_rcnew-configured.png b/data/skin_default/icons/input_rcnew-configured.png
new file mode 100644 (file)
index 0000000..6b16d39
Binary files /dev/null and b/data/skin_default/icons/input_rcnew-configured.png differ
diff --git a/data/skin_default/icons/input_rcnew.png b/data/skin_default/icons/input_rcnew.png
new file mode 100644 (file)
index 0000000..19cdeea
Binary files /dev/null and b/data/skin_default/icons/input_rcnew.png differ
diff --git a/data/skin_default/icons/input_rcold-configured.png b/data/skin_default/icons/input_rcold-configured.png
new file mode 100644 (file)
index 0000000..8d62685
Binary files /dev/null and b/data/skin_default/icons/input_rcold-configured.png differ
diff --git a/data/skin_default/icons/input_rcold.png b/data/skin_default/icons/input_rcold.png
new file mode 100644 (file)
index 0000000..ef8680b
Binary files /dev/null and b/data/skin_default/icons/input_rcold.png differ
diff --git a/data/skin_default/icons/network_wired-active.png b/data/skin_default/icons/network_wired-active.png
new file mode 100755 (executable)
index 0000000..d8efc9c
Binary files /dev/null and b/data/skin_default/icons/network_wired-active.png differ
diff --git a/data/skin_default/icons/network_wired-inactive.png b/data/skin_default/icons/network_wired-inactive.png
new file mode 100755 (executable)
index 0000000..18f2c70
Binary files /dev/null and b/data/skin_default/icons/network_wired-inactive.png differ
diff --git a/data/skin_default/icons/network_wired.png b/data/skin_default/icons/network_wired.png
new file mode 100755 (executable)
index 0000000..db695ad
Binary files /dev/null and b/data/skin_default/icons/network_wired.png differ
diff --git a/data/skin_default/icons/network_wireless-active.png b/data/skin_default/icons/network_wireless-active.png
new file mode 100755 (executable)
index 0000000..07a2187
Binary files /dev/null and b/data/skin_default/icons/network_wireless-active.png differ
diff --git a/data/skin_default/icons/network_wireless-inactive.png b/data/skin_default/icons/network_wireless-inactive.png
new file mode 100755 (executable)
index 0000000..5bd69f9
Binary files /dev/null and b/data/skin_default/icons/network_wireless-inactive.png differ
diff --git a/data/skin_default/icons/network_wireless.png b/data/skin_default/icons/network_wireless.png
new file mode 100755 (executable)
index 0000000..629a05a
Binary files /dev/null and b/data/skin_default/icons/network_wireless.png differ
old mode 100644 (file)
new mode 100755 (executable)
index 8e332e3..6b322c9
@@ -1,5 +1,6 @@
 from Tools.Directories import resolveFilename, SCOPE_SYSETC
 from enigma import getEnigmaVersionString
+from os import popen
 
 class About:
        def __init__(self):
@@ -43,4 +44,14 @@ class About:
        def getEnigmaVersionString(self):
                return getEnigmaVersionString()
 
+       def getKernelVersionString(self):
+               try:
+                       result = popen("uname -r","r").read().strip("\n").split('-')
+                       kernel_version = result[0]
+                       return kernel_version
+               except:
+                       pass
+
+               return "unknown"
+
 about = About()
old mode 100644 (file)
new mode 100755 (executable)
index b5a9844..b1d89f5
@@ -53,14 +53,18 @@ class TemplatedMultiContent(StringList):
                        template = self.template.get("template")
                        itemheight = self.template["itemHeight"]
                        selectionEnabled = self.template.get("selectionEnabled", True)
+                       scrollbarMode = self.template.get("scrollbarMode", "showOnDemand")
 
                        if templates and style and style in templates: # if we have a custom style defined in the source, and different templates in the skin, look it up
                                template = templates[style][1]
                                itemheight = templates[style][0]
                                if len(templates[style]) > 2:
                                        selectionEnabled = templates[style][2]
+                               if len(templates[style]) > 3:
+                                       scrollbarMode = templates[style][3]
 
                        self.content.setTemplate(template)
                        self.content.setItemHeight(itemheight)
                        self.selectionEnabled = selectionEnabled
+                       self.scrollbarMode = scrollbarMode
                        self.active_style = style
old mode 100644 (file)
new mode 100755 (executable)
index 3c3bd7a..d675ca3
-from config import config, ConfigSlider, ConfigSubsection
+# coding: utf-8
+from config import config, configfile, ConfigSlider, ConfigSubsection, ConfigYesNo, ConfigText
+
+import struct, sys, time, errno
+from fcntl import ioctl
+from os import path as os_path, listdir, open as os_open, close as os_close, write as os_write, read as os_read, O_RDWR, O_NONBLOCK
+
+# asm-generic/ioctl.h
+IOC_NRBITS = 8L
+IOC_TYPEBITS = 8L
+IOC_SIZEBITS = 13L
+IOC_DIRBITS = 3L
+
+IOC_NRSHIFT = 0L
+IOC_TYPESHIFT = IOC_NRSHIFT+IOC_NRBITS
+IOC_SIZESHIFT = IOC_TYPESHIFT+IOC_TYPEBITS
+IOC_DIRSHIFT = IOC_SIZESHIFT+IOC_SIZEBITS
+
+IOC_READ = 2L
+
+def EVIOCGNAME(length):
+       return (IOC_READ<<IOC_DIRSHIFT)|(length<<IOC_SIZESHIFT)|(0x45<<IOC_TYPESHIFT)|(0x06<<IOC_NRSHIFT)
+
 
 class inputDevices:
+
+       def __init__(self):
+               self.Devices = {}
+               self.currentDevice = ""
+               self.getInputDevices()
+       
+       def getInputDevices(self):
+               devices = listdir("/dev/input/")
+
+               for evdev in devices:
+                       try:
+                               buffer = "\0"*512
+                               self.fd = os_open("/dev/input/" + evdev, O_RDWR | O_NONBLOCK)
+                               self.name = ioctl(self.fd, EVIOCGNAME(256), buffer)
+                               self.name = self.name[:self.name.find("\0")]
+                               os_close(self.fd)
+                       except (IOError,OSError), err:
+                               print '[iInputDevices] getInputDevices  <ERROR: ioctl(EVIOCGNAME): ' + str(err) + ' >'
+                               self.name = None
+                       
+                       if self.name:
+                               if self.name == 'dreambox front panel':
+                                       continue
+                               if self.name == "dreambox advanced remote control (native)" and config.misc.rcused.value != 0:
+                                       continue
+                               if self.name == "dreambox remote control (native)" and config.misc.rcused.value == 0:
+                                       continue
+                               self.Devices[evdev] = {'name': self.name, 'type': self.getInputDeviceType(self.name),'enabled': False, 'configuredName': None }
+       
+
+       def getInputDeviceType(self,name):
+               if name.find("remote control") != -1:
+                       return "remote"
+               elif name.find("keyboard") != -1:
+                       return "keyboard"
+               elif name.find("mouse") != -1:
+                       return "mouse"
+               else:
+                       print "Unknown device type:",name
+                       return None
+                       
+       def getDeviceName(self, x):
+               if x in self.Devices.keys():
+                       return self.Devices[x].get("name", x)
+               else:
+                       return "Unknown device name"
+
+       def getDeviceList(self):
+               return sorted(self.Devices.iterkeys())
+
+       def getDefaultRCdeviceName(self):
+               if config.misc.rcused.value == 0:
+                       for device in self.Devices.iterkeys():
+                               if self.Devices[device]["name"] == "dreambox advanced remote control (native)":
+                                       return device
+               else:
+                       for device in self.Devices.iterkeys():
+                               if self.Devices[device]["name"] == "dreambox remote control (native)":
+                                       return device
+
+       def setDeviceAttribute(self, device, attribute, value):
+               #print "[iInputDevices] setting for device", device, "attribute", attribute, " to value", value
+               if self.Devices.has_key(device):
+                       self.Devices[device][attribute] = value
+                       
+       def getDeviceAttribute(self, device, attribute):
+               if self.Devices.has_key(device):
+                       if self.Devices[device].has_key(attribute):
+                               return self.Devices[device][attribute]
+               return None
+                       
+       def setEnabled(self, device, value):
+               oldval = self.getDeviceAttribute(device, 'enabled')
+               #print "[iInputDevices] setEnabled for device %s to %s from %s" % (device,value,oldval)
+               self.setDeviceAttribute(device, 'enabled', value)
+               if oldval is True and value is False:
+                       self.setDefaults(device)
+
+       def setName(self, device, value):
+               #print "[iInputDevices] setName for device %s to %s" % (device,value)
+               self.setDeviceAttribute(device, 'configuredName', value)
+               
+       #struct input_event {
+       #       struct timeval time;    -> ignored
+       #       __u16 type;             -> EV_REP (0x14)
+       #       __u16 code;             -> REP_DELAY (0x00) or REP_PERIOD (0x01)
+       #       __s32 value;            -> DEFAULTS: 700(REP_DELAY) or 100(REP_PERIOD)
+       #}; -> size = 16
+
+       def setDefaults(self, device):
+               print "[iInputDevices] setDefaults for device %s" % (device)
+               self.setDeviceAttribute(device, 'configuredName', None)
+               event_repeat = struct.pack('iihhi', 0, 0, 0x14, 0x01, 100)
+               event_delay = struct.pack('iihhi', 0, 0, 0x14, 0x00, 700)
+               fd = os_open("/dev/input/" + device, O_RDWR)
+               os_write(fd, event_repeat)
+               os_write(fd, event_delay)
+               os_close(fd)
+
+       def setRepeat(self, device, value): #REP_PERIOD
+               if self.getDeviceAttribute(device, 'enabled') == True:
+                       print "[iInputDevices] setRepeat for device %s to %d ms" % (device,value)
+                       event = struct.pack('iihhi', 0, 0, 0x14, 0x01, int(value))
+                       fd = os_open("/dev/input/" + device, O_RDWR)
+                       os_write(fd, event)
+                       os_close(fd)
+
+       def setDelay(self, device, value): #REP_DELAY
+               if self.getDeviceAttribute(device, 'enabled') == True:
+                       print "[iInputDevices] setDelay for device %s to %d ms" % (device,value)
+                       event = struct.pack('iihhi', 0, 0, 0x14, 0x00, int(value))
+                       fd = os_open("/dev/input/" + device, O_RDWR)
+                       os_write(fd, event)
+                       os_close(fd)
+
+
+class InitInputDevices:
+       
        def __init__(self):
-               pass
-       def setRepeat(self, value):
-               #print "setup rc repeat"
-               pass
-       def setDelay(self, value):
-               #print "setup rc delay"
-               pass
-
-def InitInputDevices():
-       config.inputDevices = ConfigSubsection();
-       config.inputDevices.repeat = ConfigSlider(default=5, limits=(1, 10))
-       config.inputDevices.delay = ConfigSlider(default=4, limits=(1, 10))
-
-       #this instance anywhere else needed?    
-       iDevices = inputDevices();      
+               self.currentDevice = ""
+               self.createConfig()
        
-       def inputDevicesRepeatChanged(configElement):
-               iDevices.setRepeat(configElement.value);
+       def createConfig(self, *args):
+               config.inputDevices = ConfigSubsection()
+               for device in sorted(iInputDevices.Devices.iterkeys()):
+                       self.currentDevice = device
+                       #print "[InitInputDevices] -> creating config entry for device: %s -> %s  " % (self.currentDevice, iInputDevices.Devices[device]["name"])
+                       self.setupConfigEntries(self.currentDevice)
+                       self.currentDevice = ""
+
+       def inputDevicesEnabledChanged(self,configElement):
+               if self.currentDevice != "" and iInputDevices.currentDevice == "":
+                       iInputDevices.setEnabled(self.currentDevice, configElement.value)
+               elif iInputDevices.currentDevice != "":
+                       iInputDevices.setEnabled(iInputDevices.currentDevice, configElement.value)
+
+       def inputDevicesNameChanged(self,configElement):
+               if self.currentDevice != "" and iInputDevices.currentDevice == "":
+                       iInputDevices.setName(self.currentDevice, configElement.value)
+                       if configElement.value != "":
+                               devname = iInputDevices.getDeviceAttribute(self.currentDevice, 'name')
+                               if devname != configElement.value:
+                                       cmd = "config.inputDevices." + self.currentDevice + ".enabled.value = False"
+                                       exec (cmd)
+                                       cmd = "config.inputDevices." + self.currentDevice + ".enabled.save()"
+                                       exec (cmd)
+               elif iInputDevices.currentDevice != "":
+                       iInputDevices.setName(iInputDevices.currentDevice, configElement.value)
+
+       def inputDevicesRepeatChanged(self,configElement):
+               if self.currentDevice != "" and iInputDevices.currentDevice == "":
+                       iInputDevices.setRepeat(self.currentDevice, configElement.value)
+               elif iInputDevices.currentDevice != "":
+                       iInputDevices.setRepeat(iInputDevices.currentDevice, configElement.value)
+               
+       def inputDevicesDelayChanged(self,configElement):
+               if self.currentDevice != "" and iInputDevices.currentDevice == "":
+                       iInputDevices.setDelay(self.currentDevice, configElement.value)
+               elif iInputDevices.currentDevice != "":
+                       iInputDevices.setDelay(iInputDevices.currentDevice, configElement.value)
+
+       def setupConfigEntries(self,device):
+               cmd = "config.inputDevices." + device + " = ConfigSubsection()"
+               exec (cmd)
+               cmd = "config.inputDevices." + device + ".enabled = ConfigYesNo(default = False)"
+               exec (cmd)
+               cmd = "config.inputDevices." + device + ".enabled.addNotifier(self.inputDevicesEnabledChanged,config.inputDevices." + device + ".enabled)"
+               exec (cmd)
+               cmd = "config.inputDevices." + device + '.name = ConfigText(default="")'
+               exec (cmd)
+               cmd = "config.inputDevices." + device + ".name.addNotifier(self.inputDevicesNameChanged,config.inputDevices." + device + ".name)"
+               exec (cmd)
+               cmd = "config.inputDevices." + device + ".repeat = ConfigSlider(default=100, increment = 10, limits=(0, 500))"
+               exec (cmd)
+               cmd = "config.inputDevices." + device + ".repeat.addNotifier(self.inputDevicesRepeatChanged,config.inputDevices." + device + ".repeat)"
+               exec (cmd)
+               cmd = "config.inputDevices." + device + ".delay = ConfigSlider(default=700, increment = 100, limits=(0, 5000))"
+               exec (cmd)
+               cmd = "config.inputDevices." + device + ".delay.addNotifier(self.inputDevicesDelayChanged,config.inputDevices." + device + ".delay)"
+               exec (cmd)
 
-       def inputDevicesDelayChanged(configElement):
-               iDevices.setDelay(configElement.value);
 
-       # this will call the "setup-val" initial
-       config.inputDevices.repeat.addNotifier(inputDevicesRepeatChanged);
-       config.inputDevices.delay.addNotifier(inputDevicesDelayChanged);
+iInputDevices = inputDevices()
index b9da48d..e980cb8 100755 (executable)
@@ -4,6 +4,7 @@ from socket import *
 from enigma import eConsoleAppContainer
 from Components.Console import Console
 from Components.PluginComponent import plugins
+from Components.About import about
 from Plugins.Plugin import PluginDescriptor
 
 class Network:
@@ -26,6 +27,9 @@ class Network:
                self.DnsConsole = Console()
                self.PingConsole = Console()
                self.config_ready = None
+               self.friendlyNames = {}
+               self.lan_interfaces = []
+               self.wlan_interfaces = []
                self.getInterfaces()
 
        def onRemoteRootFS(self):
@@ -309,13 +313,49 @@ class Network:
                return len(self.ifaces)
 
        def getFriendlyAdapterName(self, x):
-               # maybe this needs to be replaced by an external list.
-               friendlyNames = {
-                       "eth0": _("Integrated Ethernet"),
-                       "wlan0": _("Wireless"),
-                       "ath0": _("Integrated Wireless")
-               }
-               return friendlyNames.get(x, x) # when we have no friendly name, use adapter name
+               if x in self.friendlyNames.keys():
+                       return self.friendlyNames.get(x, x)
+               else:
+                       self.friendlyNames[x] = self.getFriendlyAdapterNaming(x)
+                       return self.friendlyNames.get(x, x) # when we have no friendly name, use adapter name
+
+       def getFriendlyAdapterNaming(self, iface):
+               if iface.startswith('eth'):
+                       if iface not in self.lan_interfaces and len(self.lan_interfaces) == 0:
+                               self.lan_interfaces.append(iface)
+                               return _("LAN connection")
+                       elif iface not in self.lan_interfaces and len(self.lan_interfaces) >= 1:
+                               self.lan_interfaces.append(iface)
+                               return _("LAN connection") + " " + str(len(self.lan_interfaces))
+               else:
+                       if iface not in self.wlan_interfaces and len(self.wlan_interfaces) == 0:
+                               self.wlan_interfaces.append(iface)
+                               return _("WLAN connection")
+                       elif iface not in self.wlan_interfaces and len(self.wlan_interfaces) >= 1:
+                               self.wlan_interfaces.append(iface)
+                               return _("WLAN connection") + " " + str(len(self.wlan_interfaces))
+
+       def getFriendlyAdapterDescription(self, iface):
+               if iface == 'eth0':
+                       return _("Internal LAN adapter.")
+               else:
+                       classdir = "/sys/class/net/" + iface + "/device/"
+                       driverdir = "/sys/class/net/" + iface + "/device/driver/"
+                       if os_path.exists(classdir):
+                               files = listdir(classdir)
+                               if 'driver' in files:
+                                       if os_path.realpath(driverdir).endswith('ath_pci'):
+                                               return _("Atheros")+ " " + str(os_path.basename(os_path.realpath(driverdir))) + " " + _("WLAN adapter.") 
+                                       elif os_path.realpath(driverdir).endswith('zd1211b'):
+                                               return _("Zydas")+ " " + str(os_path.basename(os_path.realpath(driverdir))) + " " + _("WLAN adapter.") 
+                                       elif os_path.realpath(driverdir).endswith('rt73'):
+                                               return _("Ralink")+ " " + str(os_path.basename(os_path.realpath(driverdir))) + " " + _("WLAN adapter.") 
+                                       elif os_path.realpath(driverdir).endswith('rt73usb'):
+                                               return _("Ralink")+ " " + str(os_path.basename(os_path.realpath(driverdir))) + " " + _("WLAN adapter.") 
+                                       else:
+                                               return str(os_path.basename(os_path.realpath(driverdir))) + " " + _("WLAN adapter.") 
+                               else:
+                                       return _("Unknown network adapter.")
 
        def getAdapterName(self, iface):
                return iface
@@ -569,24 +609,39 @@ class Network:
                                if callback is not None:
                                        callback(True)
 
-       def detectWlanModule(self):
+       def detectWlanModule(self, iface = None):
                self.wlanmodule = None
-               rt73_dir = "/sys/bus/usb/drivers/rt73/"
-               zd1211b_dir = "/sys/bus/usb/drivers/zd1211b/"
-               madwifi_dir = "/sys/bus/pci/drivers/ath_pci/"
-               if os_path.exists(madwifi_dir):
-                       files = listdir(madwifi_dir)
-                       if len(files) >= 1:
-                               self.wlanmodule = 'madwifi'
-               if os_path.exists(rt73_dir):
-                       rtfiles = listdir(rt73_dir)
-                       if len(rtfiles) == 2 or len(rtfiles) == 5:
-                               self.wlanmodule = 'ralink'
-               if os_path.exists(zd1211b_dir):
-                       zdfiles = listdir(zd1211b_dir)
-                       if len(zdfiles) == 1 or len(zdfiles) == 5:
-                               self.wlanmodule = 'zydas'
-               return self.wlanmodule
+               classdir = "/sys/class/net/" + iface + "/device/"
+               driverdir = "/sys/class/net/" + iface + "/device/driver/"
+               if os_path.exists(classdir):
+                       classfiles = listdir(classdir)
+                       driver_found = False
+                       nl80211_found = False
+                       for x in classfiles:
+                               if x == 'driver':
+                                       driver_found = True
+                               if x.startswith('ieee80211:'):
+                                       nl80211_found = True
+
+                       if driver_found and nl80211_found:
+                               #print about.getKernelVersionString()
+                               self.wlanmodule = "nl80211"
+                       else:
+                               if driver_found and not nl80211_found:
+                                       driverfiles = listdir(driverdir)
+                                       if os_path.realpath(driverdir).endswith('ath_pci'):
+                                               if len(driverfiles) >= 1:
+                                                       self.wlanmodule = 'madwifi'
+                                       if os_path.realpath(driverdir).endswith('rt73'):
+                                               if len(driverfiles) == 2 or len(driverfiles) == 5:
+                                                       self.wlanmodule = 'ralink'                                      
+                                       if os_path.realpath(driverdir).endswith('zd1211b'):
+                                               if len(driverfiles) == 1 or len(driverfiles) == 5:
+                                                       self.wlanmodule = 'zydas'
+                       if self.wlanmodule is None:
+                               self.wlanmodule = "wext"
+                       print 'Using "%s" as wpa-supplicant driver' % (self.wlanmodule)
+                       return self.wlanmodule
        
        def calc_netmask(self,nmask):
                from struct import pack, unpack
old mode 100644 (file)
new mode 100755 (executable)
index fe9284d..40dfb2c
@@ -1,4 +1,4 @@
-from config import ConfigNumber, ConfigYesNo, ConfigSubsection, config
+from config import ConfigNumber, ConfigYesNo, ConfigSubsection, ConfigSelection, config
 
 def InitRecordingConfig():
        config.recording = ConfigSubsection();
@@ -8,3 +8,7 @@ def InitRecordingConfig():
        config.recording.margin_after = ConfigNumber(default=0)
        config.recording.debug = ConfigYesNo(default = False)
        config.recording.ascii_filenames = ConfigYesNo(default = False)
+       config.recording.filename_composition = ConfigSelection(default = "standard", choices = [
+               ("standard", _("standard")),
+               ("short", _("Short filenames")),
+               ("long", _("Long filenames")) ] )
\ No newline at end of file
old mode 100644 (file)
new mode 100755 (executable)
index 640121e..716fe44
@@ -19,6 +19,7 @@ class Listbox(Renderer, object):
                self.__content = None
                self.__wrap_around = False
                self.__selection_enabled = True
+               self.__scrollbarMode = "showOnDemand"
 
        GUI_WIDGET = eListbox
 
@@ -38,6 +39,7 @@ class Listbox(Renderer, object):
                instance.selectionChanged.get().append(self.selectionChanged)
                self.wrap_around = self.wrap_around # trigger
                self.selection_enabled = self.selection_enabled # trigger
+               self.scrollbarMode = self.scrollbarMode # trigger
 
        def preWidgetRemove(self, instance):
                instance.setContent(None)
@@ -76,9 +78,22 @@ class Listbox(Renderer, object):
 
        selection_enabled = property(lambda self: self.__selection_enabled, setSelectionEnabled)
 
+       def setScrollbarMode(self, mode):
+               self.__scrollbarMode = mode
+               if self.instance is not None:
+                       self.instance.setScrollbarMode(int(
+                               { "showOnDemand": 0,
+                                 "showAlways": 1,
+                                 "showNever": 2,
+                               }[mode]))
+
+       scrollbarMode = property(lambda self: self.__scrollbarMode, setScrollbarMode)
+       
        def changed(self, what):
                if hasattr(self.source, "selectionEnabled"):
                        self.selection_enabled = self.source.selectionEnabled
+               if hasattr(self.source, "scrollbarMode"):
+                       self.scrollbarMode = self.source.scrollbarMode
                if len(what) > 1 and isinstance(what[1], str) and what[1] == "style":
                        return
                self.content = self.source.content
index 6096ca8..d7e8307 100755 (executable)
@@ -257,7 +257,7 @@ class NetworkWizard(WizardLanguage, Rc):
                                        text1 = _("Your Dreambox is now ready to use.\n\nYour internet connection is working now.\n\n")
                                        text2 = _('Accesspoint:') + "\t" + str(status[self.selectedInterface]["acesspoint"]) + "\n"
                                        text3 = _('SSID:') + "\t" + str(status[self.selectedInterface]["essid"]) + "\n"
-                                       text4 = _('Link Quality:') + "\t" + str(status[self.selectedInterface]["quality"])+"%" + "\n"
+                                       text4 = _('Link Quality:') + "\t" + str(status[self.selectedInterface]["quality"])+ "\n"
                                        text5 = _('Signal Strength:') + "\t" + str(status[self.selectedInterface]["signal"]) + "\n"
                                        text6 = _('Bitrate:') + "\t" + str(status[self.selectedInterface]["bitrate"]) + "\n"
                                        text7 = _('Encryption:') + " " + str(status[self.selectedInterface]["encryption"]) + "\n"
@@ -421,3 +421,4 @@ class NetworkWizard(WizardLanguage, Rc):
 
        def ChoicesSelectionMoved(self):
                pass
+
index dcff3ca..7bd7d7a 100755 (executable)
@@ -251,8 +251,9 @@ class RestoreMenu(Screen):
        def KeyOk(self):
                if (self.exe == False) and (self.entry == True):
                        self.sel = self["filelist"].getCurrent()
-                       self.val = self.path + "/" + self.sel
-                       self.session.openWithCallback(self.startRestore, MessageBox, _("Are you sure you want to restore\nfollowing backup:\n") + self.sel + _("\nSystem will restart after the restore!"))
+                       if self.sel:
+                               self.val = self.path + "/" + self.sel
+                               self.session.openWithCallback(self.startRestore, MessageBox, _("Are you sure you want to restore\nfollowing backup:\n") + self.sel + _("\nSystem will restart after the restore!"))
 
        def keyCancel(self):
                self.close()
@@ -265,8 +266,9 @@ class RestoreMenu(Screen):
        def deleteFile(self):
                if (self.exe == False) and (self.entry == True):
                        self.sel = self["filelist"].getCurrent()
-                       self.val = self.path + "/" + self.sel
-                       self.session.openWithCallback(self.startDelete, MessageBox, _("Are you sure you want to delete\nfollowing backup:\n" + self.sel ))
+                       if self.sel:
+                               self.val = self.path + "/" + self.sel
+                               self.session.openWithCallback(self.startDelete, MessageBox, _("Are you sure you want to delete\nfollowing backup:\n" + self.sel ))
 
        def startDelete(self, ret = False):
                if (ret == True):
index e3a9acb..879bec1 100755 (executable)
@@ -1,4 +1,5 @@
-from enigma import eConsoleAppContainer
+# -*- coding: iso-8859-1 -*-
+from enigma import eConsoleAppContainer,eTPM
 from Components.Console import Console
 from Components.About import about
 from Components.DreamInfoHandler import DreamInfoHandler
@@ -8,9 +9,49 @@ from Components.Ipkg import IpkgComponent
 from Components.Network import iNetwork
 from Tools.Directories import pathExists, fileExists, resolveFilename, SCOPE_METADIR
 from Tools.HardwareInfo import HardwareInfo
+import sha
 
 from time import time
 
+def bin2long(s):
+       return reduce( lambda x,y:(x<<8L)+y, map(ord, s))
+
+def long2bin(l):
+       res = ""
+       for byte in range(128):
+               res += chr((l >> (1024 - (byte + 1) * 8)) & 0xff)
+       return res
+
+def rsa_pub1024(src, mod):
+       return long2bin(pow(bin2long(src), 65537, bin2long(mod)))
+       
+def decrypt_block(src, mod):
+       if len(src) != 128 and len(src) != 202:
+               return None
+       dest = rsa_pub1024(src[:128], mod)
+       hash = sha.new(dest[1:107])
+       if len(src) == 202:
+               hash.update(src[131:192])       
+       result = hash.digest()
+       if result == dest[107:127]:
+               return dest
+       return None
+
+def validate_cert(cert, key):
+       buf = decrypt_block(cert[8:], key) 
+       if buf is None:
+               return None
+       return buf[36:107] + cert[139:196]
+
+def read_random():
+       try:
+               fd = open("/dev/urandom", "r")
+               buf = fd.read(8)
+               fd.close()
+               return buf
+       except:
+               return None
+
 class SoftwareTools(DreamInfoHandler):
        lastDownloadDate = None
        NetworkConnectionAvailable = None
@@ -58,24 +99,71 @@ class SoftwareTools(DreamInfoHandler):
                                self.getUpdates()
 
        def getUpdates(self, callback = None):
-               if SoftwareTools.NetworkConnectionAvailable == True:
-                       SoftwareTools.lastDownloadDate = time()
-                       if SoftwareTools.list_updating is False and callback is None:
-                               SoftwareTools.list_updating = True
-                               self.ipkg.startCmd(IpkgComponent.CMD_UPDATE)
-                       elif SoftwareTools.list_updating is False and callback is not None:
-                               SoftwareTools.list_updating = True
-                               self.NotifierCallback = callback
-                               self.ipkg.startCmd(IpkgComponent.CMD_UPDATE)
-                       elif SoftwareTools.list_updating is True and callback is not None:
-                               #update info collecting already in progress
-                               self.NotifierCallback = callback
+               if SoftwareTools.lastDownloadDate is None:
+                       if  self.hardware_info.device_name != "dm7025":
+                               rootkey = ['\x9f', '|', '\xe4', 'G', '\xc9', '\xb4', '\xf4', '#', '&', '\xce', '\xb3', '\xfe', '\xda', '\xc9', 'U', '`', '\xd8', '\x8c', 's', 'o', '\x90', '\x9b', '\\', 'b', '\xc0', '\x89', '\xd1', '\x8c', '\x9e', 'J', 'T', '\xc5', 'X', '\xa1', '\xb8', '\x13', '5', 'E', '\x02', '\xc9', '\xb2', '\xe6', 't', '\x89', '\xde', '\xcd', '\x9d', '\x11', '\xdd', '\xc7', '\xf4', '\xe4', '\xe4', '\xbc', '\xdb', '\x9c', '\xea', '}', '\xad', '\xda', 't', 'r', '\x9b', '\xdc', '\xbc', '\x18', '3', '\xe7', '\xaf', '|', '\xae', '\x0c', '\xe3', '\xb5', '\x84', '\x8d', '\r', '\x8d', '\x9d', '2', '\xd0', '\xce', '\xd5', 'q', '\t', '\x84', 'c', '\xa8', ')', '\x99', '\xdc', '<', '"', 'x', '\xe8', '\x87', '\x8f', '\x02', ';', 'S', 'm', '\xd5', '\xf0', '\xa3', '_', '\xb7', 'T', '\t', '\xde', '\xa7', '\xf1', '\xc9', '\xae', '\x8a', '\xd7', '\xd2', '\xcf', '\xb2', '.', '\x13', '\xfb', '\xac', 'j', '\xdf', '\xb1', '\x1d', ':', '?']
+                               etpm = eTPM()
+                               l2cert = etpm.getCert(eTPM.TPMD_DT_LEVEL2_CERT)
+                               if l2cert is None:
+                                       return
+                               l2key = validate_cert(l2cert, rootkey)
+                               if l2key is None:
+                                       return
+                               l3cert = etpm.getCert(eTPM.TPMD_DT_LEVEL3_CERT)
+                               if l3cert is None:
+                                       print "please run the genuine dreambox plugin"
+                                       return
+                               l3key = validate_cert(l3cert, l2key)
+                               if l3key is None:
+                                       return
+                               rnd = read_random()
+                               if rnd is None:
+                                       return
+                               val = etpm.challenge(rnd)
+                               result = decrypt_block(val, l3key)
+                       if self.hardware_info.device_name == "dm7025" or result[80:88] == rnd:
+                               if SoftwareTools.NetworkConnectionAvailable == True:
+                                       SoftwareTools.lastDownloadDate = time()
+                                       if SoftwareTools.list_updating is False and callback is None:
+                                               SoftwareTools.list_updating = True
+                                               self.ipkg.startCmd(IpkgComponent.CMD_UPDATE)
+                                       elif SoftwareTools.list_updating is False and callback is not None:
+                                               SoftwareTools.list_updating = True
+                                               self.NotifierCallback = callback
+                                               self.ipkg.startCmd(IpkgComponent.CMD_UPDATE)
+                                       elif SoftwareTools.list_updating is True and callback is not None:
+                                               self.NotifierCallback = callback
+                               else:
+                                       SoftwareTools.list_updating = False
+                                       if callback is not None:
+                                               callback(False)
+                                       elif self.NotifierCallback is not None:
+                                               self.NotifierCallback(False)
+                       else:
+                               SoftwareTools.NetworkConnectionAvailable = False
+                               SoftwareTools.list_updating = False
+                               if callback is not None:
+                                       callback(False)
+                               elif self.NotifierCallback is not None:
+                                       self.NotifierCallback(False)            
                else:
-                       SoftwareTools.list_updating = False
-                       if callback is not None:
-                               callback(False)
-                       elif self.NotifierCallback is not None:
-                               self.NotifierCallback(False)
+                       if SoftwareTools.NetworkConnectionAvailable == True:
+                               SoftwareTools.lastDownloadDate = time()
+                               if SoftwareTools.list_updating is False and callback is None:
+                                       SoftwareTools.list_updating = True
+                                       self.ipkg.startCmd(IpkgComponent.CMD_UPDATE)
+                               elif SoftwareTools.list_updating is False and callback is not None:
+                                       SoftwareTools.list_updating = True
+                                       self.NotifierCallback = callback
+                                       self.ipkg.startCmd(IpkgComponent.CMD_UPDATE)
+                               elif SoftwareTools.list_updating is True and callback is not None:
+                                       self.NotifierCallback = callback
+                       else:
+                               SoftwareTools.list_updating = False
+                               if callback is not None:
+                                       callback(False)
+                               elif self.NotifierCallback is not None:
+                                       self.NotifierCallback(False)
 
        def ipkgCallback(self, event, param):
                if event == IpkgComponent.EVENT_ERROR:
index 286636c..0cc5777 100755 (executable)
@@ -14,7 +14,8 @@ from Components.MenuList import MenuList
 from Components.Sources.List import List
 from Components.Slider import Slider
 from Components.Harddisk import harddiskmanager
-from Components.config import config,getConfigListEntry, ConfigSubsection, ConfigText, ConfigLocations
+from Components.config import config,getConfigListEntry, ConfigSubsection, ConfigText, ConfigLocations, ConfigYesNo, ConfigSelection
+from Components.ConfigList import ConfigListScreen
 from Components.Console import Console
 from Components.MultiContent import MultiContentEntryText, MultiContentEntryPixmapAlphaTest
 from Components.SelectionList import SelectionList
@@ -26,7 +27,8 @@ from Components.AVSwitch import AVSwitch
 from Components.Network import iNetwork
 from Tools.Directories import pathExists, fileExists, resolveFilename, SCOPE_PLUGINS, SCOPE_CURRENT_PLUGIN, SCOPE_CURRENT_SKIN, SCOPE_METADIR
 from Tools.LoadPixmap import LoadPixmap
-from enigma import eTimer, quitMainloop, RT_HALIGN_LEFT, RT_VALIGN_CENTER, eListboxPythonMultiContent, eListbox, gFont, getDesktop, ePicLoad
+from Tools.NumericalTextInput import NumericalTextInput
+from enigma import eTimer, quitMainloop, RT_HALIGN_LEFT, RT_VALIGN_CENTER, eListboxPythonMultiContent, eListbox, gFont, getDesktop, ePicLoad, eRCInput, getPrevAsciiCode
 from cPickle import dump, load
 from os import path as os_path, system as os_system, unlink, stat, mkdir, popen, makedirs, listdir, access, rename, remove, W_OK, R_OK, F_OK
 from time import time, gmtime, strftime, localtime
@@ -43,6 +45,14 @@ config.plugins.configurationbackup = ConfigSubsection()
 config.plugins.configurationbackup.backuplocation = ConfigText(default = '/media/hdd/', visible_width = 50, fixed_size = False)
 config.plugins.configurationbackup.backupdirs = ConfigLocations(default=['/etc/enigma2/', '/etc/network/interfaces', '/etc/wpa_supplicant.conf', '/etc/resolv.conf', '/etc/default_gw', '/etc/hostname'])
 
+config.plugins.SoftwareManager = ConfigSubsection()
+config.plugins.SoftwareManager.overwriteConfigFiles = ConfigSelection(
+                               [
+                                ("Y", _("Yes, always")),
+                                ("N", _("No, never")),                          
+                                ("ask", _("Always ask"))
+                               ], "Y")
+
 def write_cache(cache_file, cache_data):
        #Does a cPickle dump
        if not os_path.isdir( os_path.dirname(cache_file) ):
@@ -109,13 +119,16 @@ class UpdatePluginMenu(Screen):
                self.menu = args
                self.list = []
                self.oktext = _("\nPress OK on your remote control to continue.")
+               self.menutext = _("Press MENU on your remote control for additional options.")
+               self.infotext = _("Press INFO on your remote control for additional information.")
                self.text = ""
                self.backupdirs = ' '.join( config.plugins.configurationbackup.backupdirs.value )
                if self.menu == 0:
+                       print "building menu entries"
                        self.list.append(("install-extensions", _("Manage extensions"), _("\nManage extensions or plugins for your Dreambox" ) + self.oktext, None))
                        self.list.append(("software-update", _("Software update"), _("\nOnline update of your Dreambox software." ) + self.oktext, None))
                        self.list.append(("software-restore", _("Software restore"), _("\nRestore your Dreambox with a new firmware." ) + self.oktext, None))
-                       self.list.append(("system-backup", _("Backup system settings"), _("\nBackup your Dreambox settings." ) + self.oktext, None))
+                       self.list.append(("system-backup", _("Backup system settings"), _("\nBackup your Dreambox settings." ) + self.oktext + "\n\n" + self.infotext, None))
                        self.list.append(("system-restore",_("Restore system settings"), _("\nRestore your Dreambox settings." ) + self.oktext, None))
                        self.list.append(("ipkg-install", _("Install local extension"),  _("\nScan for local extensions and install them." ) + self.oktext, None))
                        for p in plugins.getPlugins(PluginDescriptor.WHERE_SOFTWAREMANAGER):
@@ -136,7 +149,7 @@ class UpdatePluginMenu(Screen):
                elif self.menu == 1:
                        self.list.append(("advancedrestore", _("Advanced restore"), _("\nRestore your backups by date." ) + self.oktext, None))
                        self.list.append(("backuplocation", _("Choose backup location"),  _("\nSelect your backup device.\nCurrent device: " ) + config.plugins.configurationbackup.backuplocation.value + self.oktext, None))
-                       self.list.append(("backupfiles", _("Choose backup files"),  _("Select files for backup. Currently selected:\n" ) + self.backupdirs + self.oktext, None))
+                       self.list.append(("backupfiles", _("Choose backup files"),  _("Select files for backup.") + self.oktext + "\n\n" + self.infotext, None))
                        if config.usage.setup_level.index >= 2: # expert+
                                self.list.append(("ipkg-manager", _("Packet management"),  _("\nView, install and remove available or installed packages." ) + self.oktext, None))
                        self.list.append(("ipkg-source",_("Choose upgrade source"), _("\nEdit the upgrade source address." ) + self.oktext, None))
@@ -156,25 +169,25 @@ class UpdatePluginMenu(Screen):
 
                self["menu"] = List(self.list)
                self["key_red"] = StaticText(_("Close"))
-               self["status"] = StaticText("")
+               self["status"] = StaticText(self.menutext)
 
-               self["shortcuts"] = ActionMap(["ShortcutActions", "WizardActions", "InfobarEPGActions"],
+               self["shortcuts"] = ActionMap(["ShortcutActions", "WizardActions", "InfobarEPGActions", "MenuActions"],
                {
                        "ok": self.go,
                        "back": self.close,
                        "red": self.close,
+                       "menu": self.handleMenu,
+                       "showEventInfo": self.handleInfo,
                }, -1)
                self.onLayoutFinish.append(self.layoutFinished)
                self.backuppath = getBackupPath()
                self.backupfile = getBackupFilename()
                self.fullbackupfilename = self.backuppath + "/" + self.backupfile
                self.onShown.append(self.setWindowTitle)
-               #self.onClose.append(self.cleanup)
 
        def layoutFinished(self):
                idx = 0
                self["menu"].index = idx
-               #self.getUpdateInfos()
 
        def setWindowTitle(self):
                self.setTitle(_("Software management"))
@@ -201,9 +214,17 @@ class UpdatePluginMenu(Screen):
                        self.text = _("No network connection available.")
                self["status"].setText(self.text)
 
+       def handleMenu(self):
+               self.session.open(SoftwareManagerSetup)
+               
+       def handleInfo(self):
+               current = self["menu"].getCurrent()
+               if current:
+                       currentEntry = current[0]
+                       if currentEntry in ("system-backup","backupfiles"):
+                               self.session.open(SoftwareManagerInfo, mode = "backupinfo")
 
        def go(self):
-               #iNetwork.stopPingConsole()
                current = self["menu"].getCurrent()
                if current:
                        currentEntry = current[0]
@@ -290,6 +311,185 @@ class UpdatePluginMenu(Screen):
                        self.exe = True
                        self.session.open(RestoreScreen, runRestore = True)
 
+class SoftwareManagerSetup(Screen, ConfigListScreen):
+
+       skin = """
+               <screen name="SoftwareManagerSetup" position="center,center" size="560,440" title="SoftwareManager setup">
+                       <ePixmap pixmap="skin_default/buttons/red.png" position="0,0" size="140,40" alphatest="on" />
+                       <ePixmap pixmap="skin_default/buttons/green.png" position="140,0" size="140,40" alphatest="on" />
+                       <ePixmap pixmap="skin_default/buttons/yellow.png" position="280,0" size="140,40" alphatest="on" />
+                       <ePixmap pixmap="skin_default/buttons/blue.png" position="420,0" size="140,40" alphatest="on" />
+                       <widget source="key_red" render="Label" position="0,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" />
+                       <widget source="key_green" render="Label" position="140,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" transparent="1" />
+                       <widget source="key_yellow" render="Label" position="280,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#a08500" transparent="1" />
+                       <widget source="key_blue" render="Label" position="420,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#18188b" transparent="1" />
+                       <widget name="config" position="5,50" size="550,350" scrollbarMode="showOnDemand" />
+                       <ePixmap pixmap="skin_default/div-h.png" position="0,400" zPosition="1" size="560,2" />
+                       <widget source="introduction" render="Label" position="5,410" size="550,30" zPosition="10" font="Regular;21" halign="center" valign="center" backgroundColor="#25062748" transparent="1" />
+               </screen>"""
+
+       def __init__(self, session, skin_path = None):
+               Screen.__init__(self, session)
+               self.session = session
+               self.skin_path = skin_path
+               if self.skin_path == None:
+                       self.skin_path = resolveFilename(SCOPE_CURRENT_PLUGIN, "SystemPlugins/SoftwareManager")
+
+               self.onChangedEntry = [ ]
+               self.setup_title = _("Software manager setup")
+               self.overwriteConfigfilesEntry = None
+
+               self.list = [ ]
+               ConfigListScreen.__init__(self, self.list, session = session, on_change = self.changedEntry)
+
+               self["actions"] = ActionMap(["SetupActions"],
+                       {
+                               "cancel": self.keyCancel,
+                               "save": self.apply,
+                       }, -2)
+
+               self["key_red"] = StaticText(_("Cancel"))
+               self["key_green"] = StaticText(_("OK"))
+               self["key_yellow"] = StaticText()
+               self["key_blue"] = StaticText()
+               self["introduction"] = StaticText()
+
+               self.createSetup()
+               self.onLayoutFinish.append(self.layoutFinished)
+
+       def layoutFinished(self):
+               self.setTitle(self.setup_title)
+
+       def createSetup(self):
+               self.list = [ ]
+               self.overwriteConfigfilesEntry = getConfigListEntry(_("Overwrite configuration files ?"), config.plugins.SoftwareManager.overwriteConfigFiles)
+               self.list.append(self.overwriteConfigfilesEntry)        
+               self["config"].list = self.list
+               self["config"].l.setSeperation(400)
+               self["config"].l.setList(self.list)
+               if not self.selectionChanged in self["config"].onSelectionChanged:
+                       self["config"].onSelectionChanged.append(self.selectionChanged)
+               self.selectionChanged()
+
+       def selectionChanged(self):
+               if self["config"].getCurrent() == self.overwriteConfigfilesEntry:
+                       self["introduction"].setText(_("Overwrite configuration files during software upgrade?"))
+               else:
+                       self["introduction"].setText("")
+
+       def newConfig(self):
+               pass
+
+       def keyLeft(self):
+               ConfigListScreen.keyLeft(self)
+
+       def keyRight(self):
+               ConfigListScreen.keyRight(self)
+
+       def confirm(self, confirmed):
+               if not confirmed:
+                       print "not confirmed"
+                       return
+               else:
+                       self.keySave()
+
+       def apply(self):
+               self.session.openWithCallback(self.confirm, MessageBox, _("Use this settings?"), MessageBox.TYPE_YESNO, timeout = 20, default = True)
+
+       def cancelConfirm(self, result):
+               if not result:
+                       return
+               for x in self["config"].list:
+                       x[1].cancel()
+               self.close()
+
+       def keyCancel(self):
+               if self["config"].isChanged():
+                       self.session.openWithCallback(self.cancelConfirm, MessageBox, _("Really close without saving settings?"), MessageBox.TYPE_YESNO, timeout = 20, default = True)
+               else:
+                       self.close()
+
+       # for summary:
+       def changedEntry(self):
+               for x in self.onChangedEntry:
+                       x()
+               self.selectionChanged()
+
+       def getCurrentEntry(self):
+               return self["config"].getCurrent()[0]
+
+       def getCurrentValue(self):
+               return str(self["config"].getCurrent()[1].value)
+
+       def createSummary(self):
+               from Screens.Setup import SetupSummary
+               return SetupSummary
+
+
+class SoftwareManagerInfo(Screen):
+       skin = """
+               <screen name="SoftwareManagerInfo" position="center,center" size="560,440" title="SoftwareManager information">
+                       <ePixmap pixmap="skin_default/buttons/red.png" position="0,0" size="140,40" alphatest="on" />
+                       <ePixmap pixmap="skin_default/buttons/green.png" position="140,0" size="140,40" alphatest="on" />
+                       <ePixmap pixmap="skin_default/buttons/yellow.png" position="280,0" size="140,40" alphatest="on" />
+                       <ePixmap pixmap="skin_default/buttons/blue.png" position="420,0" size="140,40" alphatest="on" />
+                       <widget source="key_red" render="Label" position="0,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" />
+                       <widget source="key_green" render="Label" position="140,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" transparent="1" />
+                       <widget source="key_yellow" render="Label" position="280,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#a08500" transparent="1" />
+                       <widget source="key_blue" render="Label" position="420,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#18188b" transparent="1" />
+                       <widget source="list" render="Listbox" position="5,50" size="550,340" scrollbarMode="showOnDemand" selectionDisabled="0">
+                               <convert type="TemplatedMultiContent">
+                                       {"template": [
+                                                       MultiContentEntryText(pos = (5, 0), size = (540, 26), font=0, flags = RT_HALIGN_LEFT | RT_HALIGN_CENTER, text = 0), # index 0 is the name
+                                               ],
+                                       "fonts": [gFont("Regular", 24),gFont("Regular", 22)],
+                                       "itemHeight": 26
+                                       }
+                               </convert>
+                       </widget>
+                       <ePixmap pixmap="skin_default/div-h.png" position="0,400" zPosition="1" size="560,2" />
+                       <widget source="introduction" render="Label" position="5,410" size="550,30" zPosition="10" font="Regular;21" halign="center" valign="center" backgroundColor="#25062748" transparent="1" />
+               </screen>"""
+
+       def __init__(self, session, skin_path = None, mode = None):
+               Screen.__init__(self, session)
+               self.session = session
+               self.mode = mode
+               self.skin_path = skin_path
+               if self.skin_path == None:
+                       self.skin_path = resolveFilename(SCOPE_CURRENT_PLUGIN, "SystemPlugins/SoftwareManager")
+
+               self["actions"] = ActionMap(["ShortcutActions", "WizardActions"],
+                       {
+                               "back": self.close,
+                               "red": self.close,
+                       }, -2)
+
+               self.list = []
+               self["list"] = List(self.list)
+               
+               self["key_red"] = StaticText(_("Close"))
+               self["key_green"] = StaticText()
+               self["key_yellow"] = StaticText()
+               self["key_blue"] = StaticText()
+               self["introduction"] = StaticText()
+
+               self.onLayoutFinish.append(self.layoutFinished)
+
+       def layoutFinished(self):
+               self.setTitle(_("Softwaremanager information"))
+               if self.mode is not None:
+                       self.showInfos()
+
+       def showInfos(self):
+               if self.mode == "backupinfo":
+                       self.list = []
+                       backupfiles = config.plugins.configurationbackup.backupdirs.value
+                       for entry in backupfiles:
+                               print entry
+                               self.list.append((entry,))
+                       self['list'].setList(self.list)
+                       
 
 class PluginManager(Screen, DreamInfoHandler):
 
@@ -1088,7 +1288,7 @@ class PluginDetails(Screen, DreamInfoHandler):
 
 class UpdatePlugin(Screen):
        skin = """
-               <screen name="UpdatePlugin" position="center,center" size="550,200" title="Software update" >
+               <screen name="UpdatePlugin" position="center,center" size="550,300" title="Software update" >
                        <widget name="activityslider" position="0,0" size="550,5"  />
                        <widget name="slider" position="0,150" size="550,30"  />
                        <widget source="package" render="Label" position="10,30" size="540,20" font="Regular;18" halign="center" valign="center" backgroundColor="#25062748" transparent="1" />
@@ -1108,9 +1308,11 @@ class UpdatePlugin(Screen):
                self["status"] = self.status
                self.package = StaticText()
                self["package"] = self.package
+               self.oktext = _("Press OK on your remote control to continue.")
 
                self.packages = 0
                self.error = 0
+               self.processed_packages = []
 
                self.activity = 0
                self.activityTimer = eTimer()
@@ -1144,20 +1346,34 @@ class UpdatePlugin(Screen):
                                self.slider.setValue(self.sliderPackages[param])
                        self.package.setText(param)
                        self.status.setText(_("Upgrading"))
-                       self.packages += 1
+                       if not param in self.processed_packages:
+                               self.processed_packages.append(param)
+                               self.packages += 1
                elif event == IpkgComponent.EVENT_INSTALL:
                        self.package.setText(param)
                        self.status.setText(_("Installing"))
-                       self.packages += 1
+                       if not param in self.processed_packages:
+                               self.processed_packages.append(param)
+                               self.packages += 1
+               elif event == IpkgComponent.EVENT_REMOVE:
+                       self.package.setText(param)
+                       self.status.setText(_("Removing"))
+                       if not param in self.processed_packages:
+                               self.processed_packages.append(param)
+                               self.packages += 1
                elif event == IpkgComponent.EVENT_CONFIGURING:
                        self.package.setText(param)
                        self.status.setText(_("Configuring"))
+                       
                elif event == IpkgComponent.EVENT_MODIFIED:
-                       self.session.openWithCallback(
-                               self.modificationCallback,
-                               MessageBox,
-                               _("A configuration file (%s) was modified since Installation.\nDo you want to keep your version?") % (param)
-                       )
+                       if config.plugins.SoftwareManager.overwriteConfigFiles.value in ("N", "Y"):
+                               self.ipkg.write(True and config.plugins.SoftwareManager.overwriteConfigFiles.value)
+                       else:
+                               self.session.openWithCallback(
+                                       self.modificationCallback,
+                                       MessageBox,
+                                       _("A configuration file (%s) was modified since Installation.\nDo you want to keep your version?") % (param)
+                               )
                elif event == IpkgComponent.EVENT_ERROR:
                        self.error += 1
                elif event == IpkgComponent.EVENT_DONE:
@@ -1171,7 +1387,7 @@ class UpdatePlugin(Screen):
                                self.activityslider.setValue(0)
                                
                                self.package.setText("")
-                               self.status.setText(_("Done - Installed or upgraded %d packages") % self.packages)
+                               self.status.setText(_("Done - Installed or upgraded %d packages") % self.packages + "\n\n" + self.oktext)
                        else:
                                self.activityTimer.stop()
                                self.activityslider.setValue(0)
@@ -1374,7 +1590,7 @@ class IPKGSource(Screen):
                self["text"].number(number)
 
 
-class PacketManager(Screen):
+class PacketManager(Screen, NumericalTextInput):
        skin = """
                <screen name="PacketManager" position="center,center" size="530,420" title="Packet manager" >
                        <ePixmap pixmap="skin_default/buttons/red.png" position="0,0" size="140,40" alphatest="on" />
@@ -1398,15 +1614,29 @@ class PacketManager(Screen):
                
        def __init__(self, session, plugin_path, args = None):
                Screen.__init__(self, session)
+               NumericalTextInput.__init__(self)
                self.session = session
                self.skin_path = plugin_path
 
-               self["shortcuts"] = ActionMap(["ShortcutActions", "WizardActions"], 
+               self.setUseableChars(u'1234567890abcdefghijklmnopqrstuvwxyz')
+
+               self["shortcuts"] = NumberActionMap(["ShortcutActions", "WizardActions", "NumberActions", "InputActions", "InputAsciiActions", "KeyboardInputActions" ],
                {
                        "ok": self.go,
                        "back": self.exit,
                        "red": self.exit,
                        "green": self.reload,
+                       "gotAsciiCode": self.keyGotAscii,
+                       "1": self.keyNumberGlobal,
+                       "2": self.keyNumberGlobal,
+                       "3": self.keyNumberGlobal,
+                       "4": self.keyNumberGlobal,
+                       "5": self.keyNumberGlobal,
+                       "6": self.keyNumberGlobal,
+                       "7": self.keyNumberGlobal,
+                       "8": self.keyNumberGlobal,
+                       "9": self.keyNumberGlobal,
+                       "0": self.keyNumberGlobal
                }, -1)
                
                self.list = []
@@ -1431,12 +1661,44 @@ class PacketManager(Screen):
                self.onShown.append(self.setWindowTitle)
                self.onLayoutFinish.append(self.rebuildList)
 
+               rcinput = eRCInput.getInstance()
+               rcinput.setKeyboardMode(rcinput.kmAscii)                
+
+       def keyNumberGlobal(self, val):
+               key = self.getKey(val)
+               if key is not None:
+                       keyvalue = key.encode("utf-8")
+                       if len(keyvalue) == 1:
+                               self.setNextIdx(keyvalue[0])
+               
+       def keyGotAscii(self):
+               keyvalue = unichr(getPrevAsciiCode()).encode("utf-8")
+               if len(keyvalue) == 1:
+                       self.setNextIdx(keyvalue[0])
+               
+       def setNextIdx(self,char):
+               if char in ("0", "1", "a"):
+                       self["list"].setIndex(0)
+               else:
+                       idx = self.getNextIdx(char)
+                       if idx and idx <= self["list"].count:
+                               self["list"].setIndex(idx)
+
+       def getNextIdx(self,char):
+               idx = 0
+               for i in self["list"].list:
+                       if i[0][0] == char:
+                               return idx
+                       idx += 1
+
        def exit(self):
                self.ipkg.stop()
                if self.Console is not None:
                        if len(self.Console.appContainers):
                                for name in self.Console.appContainers.keys():
                                        self.Console.kill(name)
+               rcinput = eRCInput.getInstance()
+               rcinput.setKeyboardMode(rcinput.kmNone)
                self.close()
 
        def reload(self):
index 2f36237..bdc1a88 100755 (executable)
@@ -4,8 +4,6 @@ SUBDIRS = meta
 
 install_PYTHON =       \
        __init__.py \
-       flags.py \
-       iwlibs.py \
        plugin.py \
        Wlan.py
 
index 1c1471c..baefd43 100755 (executable)
@@ -1,7 +1,3 @@
-#from enigma import eListboxPythonMultiContent, eListbox, gFont, RT_HALIGN_LEFT, RT_HALIGN_RIGHT, RT_HALIGN_CENTER
-#from Components.MultiContent import MultiContentEntryText
-#from Components.GUIComponent import GUIComponent
-#from Components.HTMLComponent import HTMLComponent
 from Components.config import config, ConfigYesNo, NoSave, ConfigSubsection, ConfigText, ConfigSelection, ConfigPassword
 from Components.Console import Console
 
@@ -10,7 +6,8 @@ from string import maketrans, strip
 import sys
 import types
 from re import compile as re_compile, search as re_search
-from iwlibs import getNICnames, Wireless, Iwfreq
+from pythonwifi.iwlibs import getNICnames, Wireless, Iwfreq, getWNICnames
+from pythonwifi import flags as wififlags
 
 list = []
 list.append("WEP")
@@ -65,38 +62,42 @@ class Wlan:
                print "self.iface im iwconfigFinished",self.iface
                callback = extra_args
                data = { 'essid': False, 'frequency': False, 'acesspoint': False, 'bitrate': False, 'encryption': False, 'quality': False, 'signal': False }
-               #print "result im iwconfigFinished",result
                
                for line in result.splitlines():
-                       #print "line",line
                        line = line.strip()
                        if "ESSID" in line:
                                if "off/any" in line:
                                        ssid = _("No Connection")
                                else:
-                                       tmpssid=(line[line.index('ESSID')+7:len(line)-1])
-                                       if tmpssid == '':
-                                               ssid = _("Hidden networkname")
-                                       elif tmpssid ==' ':
-                                               ssid = _("Hidden networkname")
+                                       if "Nickname" in line:
+                                               tmpssid=(line[line.index('ESSID')+7:line.index('"  Nickname')])
+                                               if tmpssid == '':
+                                                       ssid = _("Hidden networkname")
+                                               elif tmpssid ==' ':
+                                                       ssid = _("Hidden networkname")
+                                               else:
+                                                       ssid = tmpssid
                                        else:
-                                           ssid = tmpssid
-                               #print "SSID->",ssid
+                                               tmpssid=(line[line.index('ESSID')+7:len(line)-1])
+                                               if tmpssid == '':
+                                                       ssid = _("Hidden networkname")
+                                               elif tmpssid ==' ':
+                                                       ssid = _("Hidden networkname")
+                                               else:
+                                                       ssid = tmpssid                                          
+
                                if ssid is not None:
                                        data['essid'] = ssid
                        if 'Frequency' in line:
                                frequency = line[line.index('Frequency')+10 :line.index(' GHz')]
-                               #print "Frequency",frequency   
                                if frequency is not None:
                                        data['frequency'] = frequency
                        if "Access Point" in line:
                                ap=line[line.index('Access Point')+14:len(line)-1]
-                               #print "AP",ap
                                if ap is not None:
                                        data['acesspoint'] = ap
                        if "Bit Rate" in line:
                                br = line[line.index('Bit Rate')+9 :line.index(' Mb/s')]
-                               #print "Bitrate",br
                                if br is not None:
                                        data['bitrate'] = br
                        if 'Encryption key' in line:
@@ -104,7 +105,6 @@ class Wlan:
                                    enc = _("Disabled")
                                else:
                                    enc = line[line.index('Encryption key')+15 :line.index('   Security')]
-                               #print "Encryption key",enc 
                                if enc is not None:
                                        data['encryption'] = _("Enabled")
                        if 'Quality' in line:
@@ -112,12 +112,10 @@ class Wlan:
                                        qual = line[line.index('Quality')+8:line.index('/100')]
                                else:
                                        qual = line[line.index('Quality')+8:line.index('Sig')]
-                               #print "Quality",qual
                                if qual is not None:
                                        data['quality'] = qual
                        if 'Signal level' in line:
-                               signal = line[line.index('Signal level')+14 :line.index(' dBm')]
-                               #print "Signal level",signal            
+                               signal = line[line.index('Signal level')+13 :line.index(' dBm')]
                                if signal is not None:
                                        data['signal'] = signal
 
@@ -130,7 +128,6 @@ class Wlan:
                                callback(True,self.wlaniface)
 
        def getAdapterAttribute(self, attribute):
-               print "im getAdapterAttribute"
                if self.wlaniface.has_key(self.iface):
                        print "self.wlaniface.has_key",self.iface
                        if self.wlaniface[self.iface].has_key(attribute):
@@ -142,13 +139,17 @@ class Wlan:
 
        
        def getWirelessInterfaces(self):
-               iwifaces = None
-               try:
-                       iwifaces = getNICnames()
-               except:
-                       print "[Wlan.py] No Wireless Networkcards could be found"
-               
-               return iwifaces
+               device = re_compile('[a-z]{2,}[0-9]*:')
+               ifnames = []
+
+               fp = open('/proc/net/wireless', 'r')
+               for line in fp:
+                       try:
+                               # append matching pattern, without the trailing colon
+                               ifnames.append(device.search(line).group()[:-1])
+                       except AttributeError:
+                               pass
+               return ifnames
 
        
        def getNetworkList(self):
@@ -156,8 +157,8 @@ class Wlan:
                ifobj = Wireless(self.iface) # a Wireless NIC Object
                
                #Association mappings
-               stats, quality, discard, missed_beacon = ifobj.getStatistics()
-               snr = quality.signallevel - quality.noiselevel
+               #stats, quality, discard, missed_beacon = ifobj.getStatistics()
+               #snr = quality.signallevel - quality.noiselevel
 
                try:
                        scanresults = ifobj.scan()
@@ -167,55 +168,47 @@ class Wlan:
                
                if scanresults is not None:
                        aps = {}
+                       (num_channels, frequencies) = ifobj.getChannelInfo()
+                       index = 1
                        for result in scanresults:
-                       
                                bssid = result.bssid
-               
-                               encryption = map(lambda x: hex(ord(x)), result.encode)
-               
-                               if encryption[-1] == "0x8":
+
+                               if result.encode.flags & wififlags.IW_ENCODE_DISABLED > 0:
+                                       encryption = False
+                               elif result.encode.flags & wififlags.IW_ENCODE_NOKEY > 0:
                                        encryption = True
                                else:
-                                       encryption = False
-               
+                                       encryption = None
+                               
+                               signal = str(result.quality.siglevel-0x100) + " dBm"
+                               quality = "%s/%s" % (result.quality.quality,ifobj.getQualityMax().quality)
+                               
                                extra = []
                                for element in result.custom:
                                        element = element.encode()
                                        extra.append( strip(self.asciify(element)) )
-                               
-                               if result.quality.sl is 0 and len(extra) > 0:
-                                       begin = extra[0].find('SignalStrength=')+15
-                                                                       
-                                       done = False
-                                       end = begin+1
-                                       
-                                       while not done:
-                                               if extra[0][begin:end].isdigit():
-                                                       end += 1
-                                               else:
-                                                       done = True
-                                                       end -= 1
-                                       
-                                       signal = extra[0][begin:end]
-                                       #print "[Wlan.py] signal is:" + str(signal)
+                               for element in extra:
+                                       print element
+                                       if 'SignalStrength' in element:
+                                               signal = element[element.index('SignalStrength')+15:element.index(',L')]                                        
+                                       if 'LinkQuality' in element:
+                                               quality = element[element.index('LinkQuality')+12:len(element)]                         
 
-                               else:
-                                       signal = str(result.quality.sl)
-                               
                                aps[bssid] = {
                                        'active' : True,
                                        'bssid': result.bssid,
-                                       'channel': result.frequency.getChannel(result.frequency.getFrequency()),
+                                       'channel': frequencies.index(ifobj._formatFrequency(result.frequency.getFrequency())) + 1,
                                        'encrypted': encryption,
                                        'essid': strip(self.asciify(result.essid)),
                                        'iface': self.iface,
-                                       'maxrate' : result.rate[-1],
-                                       'noise' : result.quality.getNoiselevel(),
-                                       'quality' : str(result.quality.quality),
-                                       'signal' : signal,
+                                       'maxrate' : ifobj._formatBitrate(result.rate[-1][-1]),
+                                       'noise' : '',#result.quality.nlevel-0x100,
+                                       'quality' : str(quality),
+                                       'signal' : str(signal),
                                        'custom' : extra,
                                }
-                               print aps[bssid]
+                               #print "GOT APS ENTRY:",aps[bssid]
+                               index = index + 1
                        return aps
 
                
@@ -226,12 +219,11 @@ class Wlan:
                        self.channel = str(fq.getChannel(str(ifobj.getFrequency()[0:-3])))
                except:
                        self.channel = 0
-               #print ifobj.getStatistics()
                status = {
-                                 'BSSID': str(ifobj.getAPaddr()),
+                                 'BSSID': str(ifobj.getAPaddr()), #ifobj.getStatistics()
                                  'ESSID': str(ifobj.getEssid()),
-                                 'quality': str(ifobj.getStatistics()[1].quality),
-                                 'signal': str(ifobj.getStatistics()[1].sl),
+                                 'quality': "%s/%s" % (ifobj.getStatistics()[1].quality,ifobj.getQualityMax().quality),
+                                 'signal': str(ifobj.getStatistics()[1].siglevel-0x100) + " dBm",
                                  'bitrate': str(ifobj.getBitrate()),
                                  'channel': str(self.channel),
                                  #'channel': str(fq.getChannel(str(ifobj.getFrequency()[0:-3]))),
@@ -326,7 +318,6 @@ class wpaSupplicant:
                                        essid = split[1][1:-1]
                                        
                                elif split[0] == 'proto':
-                                       print "split[1]",split[1]
                                        config.plugins.wlan.encryption.enabled.value = True
                                        if split[1] == "WPA" :
                                                mode = 'WPA'
@@ -354,12 +345,9 @@ class wpaSupplicant:
                                        else:
                                                config.plugins.wlan.encryption.wepkeytype.value = 'HEX'
                                                config.plugins.wlan.encryption.psk.value = split[1]                                             
-                                       print "[Wlan.py] Got Encryption: WEP - keytype is: "+config.plugins.wlan.encryption.wepkeytype.value
-                                       print "[Wlan.py] Got Encryption: WEP - key0 is: "+config.plugins.wlan.encryption.psk.value
                                        
                                elif split[0] == 'psk':
                                        config.plugins.wlan.encryption.psk.value = split[1][1:-1]
-                                       print "[Wlan.py] Got PSK: "+split[1][1:-1]
                                else:
                                        pass
                                
@@ -436,24 +424,30 @@ class Status:
                                if "off/any" in line:
                                        ssid = _("No Connection")
                                else:
-                                       tmpssid=(line[line.index('ESSID')+7:len(line)-1])
-                                       if tmpssid == '':
-                                               ssid = _("Hidden networkname")
-                                       elif tmpssid ==' ':
-                                               ssid = _("Hidden networkname")
+                                       if "Nickname" in line:
+                                               tmpssid=(line[line.index('ESSID')+7:line.index('"  Nickname')])
+                                               if tmpssid == '':
+                                                       ssid = _("Hidden networkname")
+                                               elif tmpssid ==' ':
+                                                       ssid = _("Hidden networkname")
+                                               else:
+                                                       ssid = tmpssid
                                        else:
-                                           ssid = tmpssid
-                               #print "SSID->",ssid
+                                               tmpssid=(line[line.index('ESSID')+7:len(line)-1])
+                                               if tmpssid == '':
+                                                       ssid = _("Hidden networkname")
+                                               elif tmpssid ==' ':
+                                                       ssid = _("Hidden networkname")
+                                               else:
+                                                       ssid = tmpssid                                          
                                if ssid is not None:
                                        data['essid'] = ssid
                        if 'Frequency' in line:
                                frequency = line[line.index('Frequency')+10 :line.index(' GHz')]
-                               #print "Frequency",frequency   
                                if frequency is not None:
                                        data['frequency'] = frequency
                        if "Access Point" in line:
                                ap=line[line.index('Access Point')+14:len(line)]
-                               #print "AP",ap
                                if ap is not None:
                                        data['acesspoint'] = ap
                                        if ap == "Not-Associated":
@@ -467,7 +461,6 @@ class Status:
                                                br += " Mb/s"
                                else:
                                        br = line[line.index('Bit Rate')+9 :line.index(' Mb/s')] + " Mb/s"
-                               #print "Bitrate",br
                                if br is not None:
                                        data['bitrate'] = br
                        if 'Encryption key' in line:
@@ -480,28 +473,30 @@ class Status:
                                        enc = line[line.index('Encryption key')+15 :line.index('   Security')]
                                        if enc is not None:
                                                enc = _("Enabled")
-                               #print "Encryption key",enc 
                                if enc is not None:
                                        data['encryption'] = enc
                        if 'Quality' in line:
                                if "/100" in line:
-                                       qual = line[line.index('Quality')+8:line.index('/100')]
+                                       #qual = line[line.index('Quality')+8:line.index('/100')]
+                                       qual = line[line.index('Quality')+8:line.index('  Signal')]
                                else:
                                        qual = line[line.index('Quality')+8:line.index('Sig')]
-                               #print "Quality",qual
                                if qual is not None:
                                        data['quality'] = qual
                        if 'Signal level' in line:
                                if "dBm" in line:
-                                       signal = line[line.index('Signal level')+14 :line.index(' dBm')]
+                                       signal = line[line.index('Signal level')+13 :line.index(' dBm')]
                                        signal += " dBm"
                                elif "/100" in line:
-                                       signal = line[line.index('Signal level')+13:line.index('/100  Noise')]
-                                       signal += "%"
+                                       if "Noise" in line:
+                                               signal = line[line.index('Signal level')+13:line.index('  Noise')]
+                                       else:
+                                               signal = line[line.index('Signal level')+13:len(line)]
                                else:
-                                       signal = line[line.index('Signal level')+13:line.index('  Noise')]
-                                       signal += "%"
-                               #print "Signal level",signal            
+                                       if "Noise" in line:
+                                               signal = line[line.index('Signal level')+13:line.index('  Noise')]
+                                       else:
+                                               signal = line[line.index('Signal level')+13:len(line)]                                          
                                if signal is not None:
                                        data['signal'] = signal
 
@@ -515,12 +510,10 @@ class Status:
                                        callback(True,self.wlaniface)
 
        def getAdapterAttribute(self, iface, attribute):
-               print "im getAdapterAttribute"
                self.iface = iface
                if self.wlaniface.has_key(self.iface):
-                       print "self.wlaniface.has_key",self.iface
                        if self.wlaniface[self.iface].has_key(attribute):
                                return self.wlaniface[self.iface][attribute]
                return None
        
-iStatus = Status()
\ No newline at end of file
+iStatus = Status()
diff --git a/lib/python/Plugins/SystemPlugins/WirelessLan/flags.py b/lib/python/Plugins/SystemPlugins/WirelessLan/flags.py
deleted file mode 100755 (executable)
index 4435f84..0000000
+++ /dev/null
@@ -1,104 +0,0 @@
-# -*- coding: ISO-8859-1 -*-
-# python-wifi -- a wireless library to access wireless cards via python
-# Copyright (C) 2004, 2005, 2006 Róman Joost
-#
-#    This library is free software; you can redistribute it and/or
-#    modify it under the terms of the GNU Lesser General Public License
-#    as published by the Free Software Foundation; either version 2.1 of
-#    the License, or (at your option) any later version.
-#
-#    This library is distributed in the hope that it will be useful, but
-#    WITHOUT ANY WARRANTY; without even the implied warranty of
-#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-#    Lesser General Public License for more details.
-#
-#    You should have received a copy of the GNU Lesser General Public
-#    License along with this library; if not, write to the Free Software
-#    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
-#    USA 
-
-modes = ['Auto', 
-         'Ad-Hoc',
-         'Managed',
-         'Master', 
-         'Repeat',
-         'Second',
-         'Monitor']
-
-IFNAMSIZE = 16
-IW_ESSID_MAX_SIZE = 16
-
-KILO = 10**3
-MEGA = 10**6
-GIGA = 10**9
-
-# ioctl calls for the Linux/i386 kernel
-SIOCIWFIRST   = 0x8B00    # FIRST ioctl identifier
-SIOCGIFCONF   = 0x8912    # ifconf struct
-SIOCGIWNAME   = 0x8B01    # get name == wireless protocol
-SIOCGIWFREQ   = 0x8B05    # get channel/frequency
-SIOCSIWMODE   = 0x8B06    # set the operation mode
-SIOCGIWMODE   = 0x8B07    # get operation mode
-SIOCGIWSENS   = 0x8B09    # get sensitivity
-SIOCGIWAP     = 0x8B15    # get AP MAC address
-SIOCSIWSCAN   = 0x8B18    # set scanning off
-SIOCGIWSCAN   = 0x8B19    # get scanning results
-SIOCGIWRATE   = 0x8B21    # get default bit rate
-SIOCGIWRTS    = 0x8B23    # get rts/cts threshold
-SIOCGIWFRAG   = 0x8B25    # get fragmention thrh
-SIOCGIWTXPOW  = 0x8B27    # get transmit power (dBm)
-SIOCGIWRETRY  = 0x8B29    # get retry limit
-SIOCGIWRANGE  = 0x8B0B    # range
-SIOCGIWSTATS  = 0x8B0F    # get wireless statistics
-SIOCSIWESSID  = 0x8B1A    # set essid
-SIOCGIWESSID  = 0x8B1B    # get essid
-SIOCGIWPOWER  = 0x8B2D    # get power managment settings
-SIOCGIWENCODE = 0x8B2B    # get encryption information
-SIOCIWLAST    = 0x8BFF    # LAST ioctl identifier
-
-# Power management flags
-IW_POWER_ON = 0x0000        # No details ...
-IW_POWER_TYPE = 0xF000      # Type of parameter
-IW_POWER_PERIOD = 0x1000    # Value is a period/duration of
-IW_POWER_TIMEOUT = 0x2000   # Value is a timeout
-IW_POWER_MODE = 0x0F00      # Power management mode
-IW_POWER_MIN = 0x0001       # Value is a minimum
-IW_POWER_MAX = 0x0002       # Value is a maximum
-IW_POWER_RELATIVE = 0x0004  # Value is not in seconds/ms/us
-
-# Retry limits 
-IW_RETRY_TYPE = 0xF000      # Type of parameter
-
-# encoding stuff
-IW_ENCODE_DISABLED = 0x8000     # encoding is disabled
-IW_ENCODE_NOKEY = 0x0800      # key is write only, not present
-
-# constants responsible for scanning
-IW_SCAN_MAX_DATA = 4096
-
-IW_EV_LCP_LEN = 4
-IW_EV_CHAR_LEN = IW_EV_LCP_LEN + IFNAMSIZE
-IW_EV_UINT_LEN = IW_EV_LCP_LEN + 4
-IW_EV_FREQ_LEN = IW_EV_LCP_LEN + 8
-IW_EV_ADDR_LEN = IW_EV_LCP_LEN + 16
-IW_EV_POINT_LEN = IW_EV_LCP_LEN + 4
-IW_EV_PARAM_LEN = IW_EV_LCP_LEN + 8
-IW_EV_QUAL_LEN = IW_EV_LCP_LEN + 4
-
-EPERM = 1
-E2BIG = 7
-EAGAIN = 11
-
-IWHT_NULL = 0
-IWHT_CHAR = 2
-IWHT_UINT = 4
-IWHT_FREQ = 5
-IWHT_ADDR = 6
-IWHT_POINT = 8
-IWHT_PARAM = 9
-IWHT_QUAL = 10
-
-IWEVFIRST     = 0x8C00    # FIRST event identifier
-IWEVQUAL      = 0x8C01    # Quality statistics from scan
-IWEVCUSTOM    = 0x8C02    # Custom Ascii string from Driver
-IWEVLAST      = 0x8C0A    # LAST event identifier
diff --git a/lib/python/Plugins/SystemPlugins/WirelessLan/iwlibs.py b/lib/python/Plugins/SystemPlugins/WirelessLan/iwlibs.py
deleted file mode 100755 (executable)
index c5f9c6d..0000000
+++ /dev/null
@@ -1,1114 +0,0 @@
-# -*- coding: ISO-8859-1 -*-
-# python-wifi -- a wireless library to access wireless cards via python
-# Copyright (C) 2004, 2005, 2006 Róman Joost
-# 
-# Contributions from:
-#   Mike Auty <m.auty@softhome.net> (Iwscanresult, Iwscan)
-#
-#    This library is free software; you can redistribute it and/or
-#    modify it under the terms of the GNU Lesser General Public License
-#    as published by the Free Software Foundation; either version 2.1 of
-#    the License, or (at your option) any later version.
-#
-#    This library is distributed in the hope that it will be useful, but
-#    WITHOUT ANY WARRANTY; without even the implied warranty of
-#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-#    Lesser General Public License for more details.
-#
-#    You should have received a copy of the GNU Lesser General Public
-#    License along with this library; if not, write to the Free Software
-#    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
-#    USA 
-
-from struct import pack as struct_pack, \
-       unpack as struct_unpack, \
-       calcsize as struct_calcsize
-
-from array import array
-from math import ceil, log10
-from fcntl import ioctl
-from socket import AF_INET, SOCK_DGRAM, socket
-from time import sleep
-from re import compile
-
-from flags import *    
-
-def getNICnames():
-    """ extract wireless device names of /proc/net/wireless 
-        
-        returns empty list if no devices are present
-
-        >>> getNICnames()
-        ['eth1', 'wifi0']
-    """
-    device = compile('[a-z]+[0-9]+')
-    ifnames = []
-    
-    f = open('/proc/net/wireless', 'r')
-    data = f.readlines()
-    for line in data:
-        try:
-            ifnames.append(device.search(line).group())
-        except AttributeError:
-            pass 
-    # if we couldn't lookup the devices, try to ask the kernel
-    if ifnames == []:
-        ifnames = getConfiguredNICnames()
-    
-    return ifnames
-
-def getConfiguredNICnames():
-    """get the *configured* ifnames by a systemcall
-       
-       >>> getConfiguredNICnames()
-       []
-    """
-    iwstruct = Iwstruct()
-    ifnames = []
-    buff = array('c', '\0'*1024)
-    caddr_t, length = buff.buffer_info()
-    s = iwstruct.pack('iP', length, caddr_t)
-    try:
-        result = iwstruct._fcntl(SIOCGIFCONF, s)
-    except IOError, (i, e):
-        return i, e
-   
-    # get the interface names out of the buffer
-    for i in range(0, 1024, 32):
-        ifname = buff.tostring()[i:i+32]
-        ifname = struct_unpack('32s', ifname)[0]
-        ifname = ifname.split('\0', 1)[0]
-        if ifname:
-            # verify if ifnames are really wifi devices
-            wifi = Wireless(ifname)
-            result = wifi.getAPaddr()
-            if result[0] == 0:
-                ifnames.append(ifname)
-
-    return ifnames  
-
-def makedict(**kwargs):
-    return kwargs
-
-
-class Wireless(object):
-    """Access to wireless interfaces"""
-    
-    def __init__(self, ifname):
-        self.sockfd = socket(AF_INET, SOCK_DGRAM)
-        self.ifname = ifname
-        self.iwstruct = Iwstruct()
-    
-    def getAPaddr(self):
-        """ returns accesspoint mac address 
-        
-            >>> from iwlibs import Wireless, getNICnames
-            >>> ifnames = getNICnames()
-            >>> ifnames
-            ['eth1', 'wifi0']
-            >>> wifi = Wireless(ifnames[0])
-            >>> wifi.getAPaddr()
-            '00:0D:88:8E:4E:93'
-
-            Test with non-wifi card:
-            >>> wifi = Wireless('eth0')
-            >>> wifi.getAPaddr()
-            (95, 'Operation not supported')
-
-            Test with non-existant card:
-            >>> wifi = Wireless('eth2')
-            >>> wifi.getAPaddr()
-            (19, 'No such device')
-        """
-        buff, s = self.iwstruct.pack_wrq(32)
-        i, result = self.iwstruct.iw_get_ext(self.ifname, 
-                                             SIOCGIWAP,
-                                             data=s)
-        if i > 0:
-            return result
-
-        return self.iwstruct.getMAC(result)
-   
-    def getBitrate(self):
-        """returns device currently set bit rate 
-        
-            >>> from iwlibs import Wireless
-            >>> wifi = Wireless('eth1')
-            >>> wifi.getBitrate()
-            '11 Mb/s'
-        """
-        i, result = self.iwstruct.iw_get_ext(self.ifname, 
-                                            SIOCGIWRATE)
-        if i > 0:
-            return result
-        iwfreq = Iwfreq(result)
-        return iwfreq.getBitrate()
-    
-    def getBitrates(self):
-        """returns the number of available bitrates for the device
-           
-            >>> from iwlibs import Wireless
-            >>> wifi = Wireless('eth1')
-            >>> num, rates = wifi.getBitrates()
-            >>> num == len(rates)
-            True
-        """
-        range = Iwrange(self.ifname)
-        if range.errorflag:
-            return (range.errorflag, range.error)
-        return (range.num_bitrates, range.bitrates)
-
-    def getChannelInfo(self):
-        """returns the number of channels and available frequency for
-           the device
-
-            >>> from iwlibs import Wireless
-            >>> wifi = Wireless('eth1')
-            >>> num, rates = wifi.getChannelInfo()
-            >>> num == len(rates)
-            True
-            """
-        range = Iwrange(self.ifname)
-        if range.errorflag:
-            return (range.errorflag, range.error)
-        return (range.num_channels, range.frequencies)
-
-    def getEssid(self):
-        """get essid information
-            
-            >>> from iwlibs import Wireless
-            >>> wifi = Wireless('eth1')
-            >>> wifi.getEssid()
-            'romanofski'
-        """
-        essid = ""
-        buff, s = self.iwstruct.pack_wrq(32)
-        i, result = self.iwstruct.iw_get_ext(self.ifname, 
-                                             SIOCGIWESSID, 
-                                             data=s)
-        if i > 0:
-            return result
-        str = buff.tostring()
-        return str.strip('\x00')
-
-    def setEssid(self, essid):
-        """set essid """
-        raise NotImplementedError
-        if len(essid) > IW_ESSID_MAX_SIZE:
-            return "essid to big"
-        buff, s = self.iwstruct.pack_test(essid, 32)
-        i, result = self.iwstruct.iw_get_ext(self.ifname, 
-                                             SIOCSIWESSID, 
-                                             data=s)
-        if i > 0:
-            return result
-
-    def getEncryption(self):
-        """get encryption information which is probably a string of '*',
-        'open', 'private'
-            
-            as a normal user, you will get a 'Operation not permitted'
-            error:
-        
-            >>> from iwlibs import Wireless
-            >>> wifi = Wireless('eth1')
-            >>> wifi.getEncryption()
-            (1, 'Operation not permitted')
-        """
-        iwpoint = Iwpoint(self.ifname)
-        if iwpoint.errorflag:
-            return (iwpoint.errorflag, iwpoint.error)
-        return iwpoint.getEncryptionKey()
-
-    def getFragmentation(self):
-        """returns fragmentation threshold 
-           
-           It depends on what the driver says. If you have fragmentation
-           threshold turned on, you'll get an int. If it's turned of
-           you'll get a string: 'off'.
-            >>> from iwlibs import Wireless
-            >>> wifi = Wireless('eth1')
-            >>> wifi.getFragmentation()
-            'off'
-        """
-        iwparam = Iwparam(self.ifname, SIOCGIWFRAG)
-        if iwparam.errorflag:
-            return (iwparam.errorflag, iwparam.error)
-        return iwparam.getValue()
-        
-    def getFrequency(self):
-        """returns currently set frequency of the card 
-            
-            >>> from iwlibs import Wireless
-            >>> wifi = Wireless('eth1')
-            >>> wifi.getFrequency()
-            '2.417GHz' 
-        """
-        i, r = self.iwstruct.iw_get_ext(self.ifname, 
-                                        SIOCGIWFREQ)
-        if i > 0:
-            return (i, r)
-        iwfreq = Iwfreq(r)
-        return iwfreq.getFrequency()
-    
-        
-    def getMode(self):
-        """returns currently set operation mode 
-            
-            >>> from iwlibs import Wireless
-            >>> wifi = Wireless('eth1')
-            >>> wifi.getMode()
-            'Managed' 
-        """
-        i, result = self.iwstruct.iw_get_ext(self.ifname, 
-                                             SIOCGIWMODE)
-        if i > 0:
-            return result
-        mode = self.iwstruct.unpack('i', result[:4])[0]
-        return modes[mode]
-
-    def setMode(self, mode):
-        """sets the operation mode """
-        try:
-            this_modes = [x.lower() for x in modes]
-            mode = mode.lower()
-            wifimode = this_modes.index(mode)
-        except ValueError:
-            return "Invalid operation mode!"
-        
-        s = self.iwstruct.pack('I', wifimode)
-        i, result = self.iwstruct.iw_get_ext(self.ifname, 
-                                             SIOCSIWMODE, 
-                                             data=s)
-        if i > 0:
-            return result
-    
-    def getWirelessName(self):
-        """ returns wireless name 
-            
-            >>> from iwlibs import Wireless
-            >>> wifi = Wireless('eth1')
-            >>> wifi.getWirelessName()
-            'IEEE 802.11-DS'
-        """
-        i, result = self.iwstruct.iw_get_ext(self.ifname, 
-                                             SIOCGIWNAME)
-        if i > 0:
-            return result
-        return result.split('\0')[0]
-    
-    def getPowermanagement(self):
-        """returns power management settings 
-            
-            >>> from iwlibs import Wireless
-            >>> wifi = Wireless('eth1')
-            >>> wifi.getPowermanagement()
-            'off'
-        """
-        iwparam = Iwparam(self.ifname, SIOCGIWPOWER)
-        if iwparam.errorflag:
-            return (iwparam.errorflag, iwparam.error)
-        return iwparam.getValue()
-
-    
-    def getRetrylimit(self):
-        """returns limit retry/lifetime
-
-            man iwconfig:
-            Most cards have MAC retransmissions, and some  allow  to set
-            the behaviour of the retry mechanism.
-                     
-            >>> from iwlibs import Wireless
-            >>> wifi = Wireless('eth1')
-            >>> wifi.getRetrylimit()
-            16
-        """
-        iwparam = Iwparam(self.ifname, SIOCGIWRETRY)
-        if iwparam.errorflag:
-            return (iwparam.errorflag, iwparam.error)
-        return iwparam.getValue()
-    
-    def getRTS(self):
-        """returns rts threshold 
-            
-            returns int, 'auto', 'fixed', 'off'
-        
-            man iwconfig:
-            RTS/CTS adds a handshake before each packet transmission to
-            make sure that the channel is clear. This adds overhead, but
-            increases performance in case of hidden  nodes or  a large
-            number of active nodes. This parameter sets the size of the
-            smallest packet for which the node sends RTS;  a value equal
-            to the maximum packet size disable the mechanism. 
-            
-            >>> from iwlibs import Wireless
-            >>> wifi = Wireless('eth1')
-            >>> wifi.getRTS()
-            'off'
-        """
-        iwparam = Iwparam(self.ifname, SIOCGIWRTS)
-        if iwparam.errorflag:
-            return (iwparam.errorflag, iwparam.error)
-        return iwparam.getValue()
-    
-    def getSensitivity(self):
-        """returns sensitivity information 
-        
-            man iwconfig:
-            This is the lowest signal level for which the hardware
-            attempt  packet  reception, signals  weaker  than  this are
-            ignored. This is used to avoid receiving background noise,
-            so you should  set  it according  to  the  average noise
-            level. Positive values are assumed to be the raw value used
-            by the hardware  or a percentage, negative values are
-            assumed to be dBm.
-        
-            >>> from iwlibs import Wireless
-            >>> wifi = Wireless('eth1')
-            >>> wifi.getSensitivity()
-            'off'
-            
-        """
-        iwparam = Iwparam(self.ifname, SIOCGIWSENS)
-        if iwparam.errorflag:
-            return (iwparam.errorflag, iwparam.error)
-        return iwparam.getValue()
-        
-    def getTXPower(self):
-        """returns transmit power in dBm 
-        
-            >>> from iwlibs import Wireless
-            >>> wifi = Wireless('eth1')
-            >>> wifi.getTXPower()
-            '17 dBm'
-        """
-        i, r = self.iwstruct.iw_get_ext(self.ifname, 
-                                        SIOCGIWTXPOW)
-        if i > 0:
-            return (i, r)
-        iwfreq = Iwfreq(r)
-        return iwfreq.getTransmitPower()
-         
-    def getStatistics(self):
-        """returns statistics information which can also be found in
-           /proc/net/wireless 
-        """
-        iwstats = Iwstats(self.ifname)
-        if iwstats.errorflag > 0:
-            return (iwstats.errorflag, iwstats.error)
-        return [iwstats.status, iwstats.qual, iwstats.discard,
-            iwstats.missed_beacon]
-
-    def scan(self):
-        """returns Iwscanresult objects, after a successful scan"""
-        iwscan = Iwscan(self.ifname)
-        return iwscan.scan()
-
-
-class Iwstruct(object):
-    """basic class to handle iwstruct data """
-    
-    def __init__(self):
-        self.idx = 0
-        self.sockfd = socket(AF_INET, SOCK_DGRAM)
-
-    def parse_data(self, fmt, data):
-        """ unpacks raw C data """
-        size = struct_calcsize(fmt)
-        idx = self.idx
-
-        str = data[idx:idx + size]
-        self.idx = idx+size
-        value = struct_unpack(fmt, str)
-
-        # take care of a tuple like (int, )
-        if len(value) == 1:
-            return value[0]
-        else:
-            return value
-    
-    def pack(self, fmt, *args):
-        """ calls struct_pack and returns the result """
-        return struct_pack(fmt, *args)
-
-    def pack_wrq(self, buffsize):
-        """ packs wireless request data for sending it to the kernel """
-        # Prepare a buffer
-        # We need the address of our buffer and the size for it. The
-        # ioctl itself looks for the pointer to the address in our
-        # memory and the size of it.
-        # Dont change the order how the structure is packed!!!
-        buff = array('c', '\0'*buffsize)
-        caddr_t, length = buff.buffer_info()
-        s = struct_pack('Pi', caddr_t, length)
-        return buff, s
-    
-    def pack_test(self, string, buffsize):
-        """ packs wireless request data for sending it to the kernel """
-        buffsize = buffsize - len(string)
-        buff = array('c', string+'\0'*buffsize)
-        caddr_t, length = buff.buffer_info()
-        s = struct_pack('Pii', caddr_t, length, 1)
-        return buff, s
-
-    def unpack(self, fmt, packed_data):
-        """ unpacks data with given format """
-        return struct_unpack(fmt, packed_data)
-
-    def _fcntl(self, request, args):
-        return ioctl(self.sockfd.fileno(), request, args)
-    
-    def iw_get_ext(self, ifname, request, data=None):
-        """ read information from ifname """
-        # put some additional data behind the interface name
-        if data is not None:
-            buff = IFNAMSIZE-len(ifname)
-            ifreq = ifname + '\0'*buff
-            ifreq = ifreq + data
-        else:
-            ifreq = (ifname + '\0'*32)
-            
-        try:
-            result = self._fcntl(request, ifreq)
-        except IOError, (i, e):
-            return i, e
-        
-        return (0, result[16:])
-
-    def getMAC(self, packed_data):
-        """ extracts mac addr from packed data and returns it as str """
-        mac_addr = struct_unpack('xxBBBBBB', packed_data[:8])
-        return "%02X:%02X:%02X:%02X:%02X:%02X" % mac_addr
-
-class Iwparam(object):
-    """class to hold iwparam data """
-    
-    def __init__(self, ifname, ioctl):
-        # (i) value, (b) fixed, (b) disabled, (b) flags
-        self.fmt = "ibbH"
-        self.value = 0
-        self.fixed = 0
-        self.disabled = 0
-        self.flags = 0
-        self.errorflag = 0
-        self.error = ""
-        self.ioctl = ioctl 
-        self.ifname = ifname
-        self.update()
-    
-    def getValue(self):
-        """returns the value if not disabled """
-
-        if self.disabled:
-            return 'off'
-        if self.flags & IW_RETRY_TYPE == 0:
-            return self.getRLAttributes()
-        else:
-            return self.getPMAttributes()
-
-    def getRLAttributes(self):
-        """returns a string with attributes determined by self.flags
-        """
-        return self.value
-
-    def getPMAttributes(self):
-        """returns a string with attributes determined by self.flags
-           and IW_POWER*
-        """
-        result = ""
-        
-        # Modifiers
-        if self.flags & IW_POWER_MIN == 0:
-            result = " min"
-        if self.flags & IW_POWER_MAX == 0:
-            result = " max"
-            
-        # Type
-        if self.flags & IW_POWER_TIMEOUT == 0:
-            result = " period:" 
-        else:
-            result = " timeout:"
-        # Value with or without units
-        # IW_POWER_RELATIVE - value is *not* in s/ms/us
-        if self.flags & IW_POWER_RELATIVE:
-            result += "%f" %(float(self.value)/MEGA)
-        else:
-            if self.value >= MEGA:
-                result += "%fs" %(float(self.value)/MEGA)
-            elif self.value >= KILO:
-                result += "%fms" %(float(self.value)/KILO)
-            else:
-                result += "%dus" % self.value
-
-        return result
-        
-    def update(self):
-        iwstruct = Iwstruct()
-        i, r = iwstruct.iw_get_ext(self.ifname, 
-                                   self.ioctl)
-        if i > 0:
-            self.errorflag = i
-            self.error = r
-        self._parse(r)
-    
-    def _parse(self, data):
-        """ unpacks iwparam data """
-        iwstruct = Iwstruct()
-        self.value, self.fixed, self.disabled, self.flags =\
-            iwstruct.parse_data(self.fmt, data)
-        
-class Iwfreq(object):
-    """ class to hold iwfreq data
-        delegates to Iwstruct class
-    """
-    
-    def __init__(self, data=None):
-        self.fmt = "ihbb"
-        if data is not None:
-            self.frequency = self.parse(data)
-        else:
-            self.frequency = 0
-        self.iwstruct = Iwstruct()
-        
-    def __getattr__(self, attr):
-        return getattr(self.iwstruct, attr)
-
-    def parse(self, data):
-        """ unpacks iwparam"""
-        
-        size = struct_calcsize(self.fmt)
-        m, e, i, pad = struct_unpack(self.fmt, data[:size])
-        # XXX well, its not *the* frequency - we need a better name
-        if e == 0:
-            return m
-        else:
-            return float(m)*10**e
-    
-    def getFrequency(self):
-        """returns Frequency (str) 
-            
-           data - binary data returned by systemcall (iw_get_ext())
-        """
-        freq = self.frequency
-        
-        if freq >= GIGA:
-            return "%0.3fGHz" %(freq/GIGA)
-
-        if freq >= MEGA:
-            return "%0.3fMHZ" %(freq/MEGA)
-
-        if freq >= KILO:
-            return "%0.3fKHz" %(freq/KILO)
-    
-    def getBitrate(self):
-        """ returns Bitrate in Mbit 
-        
-           data - binary data returned by systemcall (iw_get_ext())
-        """
-        bitrate = self.frequency
-
-        if bitrate >= GIGA:
-            return "%i Gb/s" %(bitrate/GIGA)
-
-        if bitrate >= MEGA:
-            return "%i Mb/s" %(bitrate/MEGA)
-        
-        if bitrate >= KILO:
-            return "%i Kb/s" %(bitrate/KILO)
-
-    def getTransmitPower(self):
-        """ returns transmit power in dbm """
-        # XXX something flaky is going on with m and e
-        # eg. m = 50 and e should than be 0, because the number is stored in
-        # m and don't needs to be recalculated
-        return "%i dBm" %self.mw2dbm(self.frequency/10)
-    
-    def getChannel(self, freq):
-        """returns channel information given by frequency
-           
-           returns None if frequency can't be converted
-           freq = frequency to convert (int)
-           iwrange = Iwrange object
-        """
-        
-        try:
-            freq = float(freq)
-        except:
-            return None
-        
-        lut = {}
-        #13 Channels beginning at 2.412GHz and inreasing by 0,005 GHz steps
-        for i in range(0,12):
-            cur = float( 2.412 + ( i * 0.005 ) )
-            lut[str(cur)] = i+1
-        # Channel 14 need special actions ;)
-        lut['2.484'] = 14
-        
-        
-        if str(freq) in lut.keys():
-                return lut[str(freq)]
-        
-        return None
-    
-          
-    def mw2dbm(self, mwatt):
-        """ converts mw to dbm(float) """
-        return ceil(10.0 * log10(mwatt))
-        
-    def _setFrequency(self, list):
-        """sets self.frequency by given list 
-           
-           currently only used by Iwrange
-        """
-        assert len(list) == 4
-        m, e, i, pad = list
-        if e == 0:
-            self.frequency = m
-        else:
-            self.frequency = m #float(m)*10**e
-
-class Iwstats(object):
-    """ class to hold iwstat data """
-
-    def __init__(self, ifname):
-        # (2B) status, 4B iw_quality, 6i iw_discarded
-        self.fmt = "2B4B6i"
-        self.status = 0
-        self.qual = Iwquality()
-        self.discard = {}
-        self.missed_beacon = 0
-        self.ifname = ifname
-        self.errorflag = 0
-        self.error = ""
-        self.update()
-
-    def update(self):
-        iwstruct = Iwstruct()
-        buff, s = iwstruct.pack_wrq(32)
-        i, result = iwstruct.iw_get_ext(self.ifname, 
-                                        SIOCGIWSTATS, 
-                                        data=s)
-        if i > 0:
-            self.error = result
-            self.errorflag = i
-        self._parse(buff.tostring())
-    
-    def _parse(self, data):
-        """ unpacks iwstruct data """
-        struct = Iwstruct()
-        iwqual = Iwquality()
-        iwstats_data = struct.parse_data(self.fmt, data)
-        
-        self.status = iwstats_data[0:2]
-        self.qual.quality, self.qual.sl, self.qual.nl,\
-            self.qual.flags = iwstats_data[2:6]
-        nwid, code, frag, retries, flags = iwstats_data[6:11]
-        self.missed_beacon = iwstats_data[11:12][0]
-        self.discard = makedict(nwid=nwid, code=code,
-            fragment=frag, retries=retries, misc=flags)
-
-class Iwquality(object):
-    """ class to hold iwquality data """
-
-    def __init__(self):
-        self.quality = 0
-        self.sl = 0
-        self.nl = 0
-        self.updated = 0
-        self.fmt = "4B"
-
-    def parse(self, data):
-        """ unpacks iwquality data """
-        struct = Iwstruct()
-        qual, sl, nl, flags = struct.parse_data(self.fmt, data)
-
-        # compute signal and noise level
-        self.signal_level = sl
-        self.noise_level = nl
-
-        # asign the other values
-        self.quality = qual
-        self.updated = flags
-
-    def setValues(self, list):
-        """ assigns values given by a list to our attributes """
-        attributes = ["quality", "signallevel", "noise_level",
-            "updated"]
-        assert len(list) == 4
-        
-        for i in range(len(list)):
-            setattr(self, attributes[i], list[i])
-    
-    def getSignallevel(self):
-        """ returns signal level """
-        return self.sl-0x100
-
-    def setSignallevel(self, sl):
-        """ sets signal level """
-        self.sl = sl
-    signallevel = property(getSignallevel, setSignallevel)
-    
-    def getNoiselevel(self):
-        """ returns noise level """
-        return self.nl - 0x100
-
-    def setNoiselevel(self):
-        raise NotImplementedError
-        self.nl = nl
-    noiselevel = property(getNoiselevel, setNoiselevel)
-
-class Iwpoint(object):
-    """ class to hold iwpoint data """
-
-    def __init__(self, ifname):
-        self.key = [0,0,0,0]
-        self.fields = 0
-        self.flags = 0
-        # (4B) pointer to data, H length, H flags
-        self.fmt = "4BHH"
-        self.errorflag = 0
-        self.error = ""
-        self.ifname = ifname
-        self.update()
-
-    def __getattr__(self, attr):
-        return getattr(self.iwstruct, attr)
-    
-    def update(self):
-        iwstruct = Iwstruct()
-        buff, s = iwstruct.pack_wrq(32)
-        i, result = iwstruct.iw_get_ext(self.ifname, 
-                                        SIOCGIWENCODE, 
-                                        data=s)
-        if i > 0:
-            self.errorflag = i
-            self.error = result
-        self._parse(result)
-        
-    def getEncryptionKey(self):
-        """ returns encryption key as '**' or 'off' as str """
-        if self.flags & IW_ENCODE_DISABLED != 0:
-            return 'off'
-        elif self.flags & IW_ENCODE_NOKEY != 0:
-            # a key is set, so print it
-            return '**' * self.fields
-    
-    def _parse(self, data):
-        """ unpacks iwpoint data
-        """
-        iwstruct = Iwstruct()
-        ptr, ptr, ptr, ptr, self.fields, self.flags =\
-            iwstruct.parse_data(self.fmt, data)
-        self.key = [ptr, ptr, ptr, ptr]
-
-class Iwrange(object):
-    """holds iwrange struct """
-    IW_MAX_FREQUENCIES = 32
-
-    def __init__(self, ifname):
-        self.fmt = "iiihb6ii4B4Bi32i2i2i2i2i3h8h2b2bhi8i2b3h2i2ihB17x"\
-            + self.IW_MAX_FREQUENCIES*"ihbb"
-        
-        self.ifname = ifname
-        self.errorflag = 0
-        self.error = ""
-        
-        # informative stuff
-        self.throughput = 0
-        
-        # nwid (or domain id)
-        self.min_nwid = self.max_nwid = 0
-        
-        # frequency for backward compatibility
-        self.old_num_channels = self.old_num_frequency = self.old_freq = 0
-        
-        # signal level threshold
-        self.sensitivity = 0
-        
-        # link quality
-        self.max_qual = Iwquality()
-        self.avg_qual = Iwquality()
-
-        # rates
-        self.num_bitrates = 0
-        self.bitrates = []
-
-        # rts threshold
-        self.min_rts = self.max_rts = 0
-
-        # fragmention threshold
-        self.min_frag = self.max_frag = 0
-
-        # power managment
-        self.min_pmp = self.max_pmp = 0
-        self.min_pmt = self.max_pmt = 0
-        self.pmp_flags = self.pmt_flags = self.pm_capa = 0
-
-        # encoder stuff
-        self.encoding_size = 0
-        self.num_encoding_sizes = self.max_encoding_tokens = 0
-        self.encoding_login_index = 0
-
-        # transmit power
-        self.txpower_capa = self.num_txpower = self.txpower = 0
-
-        # wireless extension version info
-        self.we_vers_compiled = self.we_vers_src = 0
-
-        # retry limits and lifetime
-        self.retry_capa = self.retry_flags = self.r_time_flags = 0
-        self.min_retry = self.max_retry = 0
-        self.min_r_time = self.max_r_time = 0
-
-        # frequency
-        self.num_channels = self.num_frequency = 0
-        self.frequencies = []
-        self.update()
-    
-    def update(self):
-        """updates Iwrange object by a system call to the kernel 
-           and updates internal attributes
-        """
-        iwstruct = Iwstruct()
-        buff, s = iwstruct.pack_wrq(640)
-        i, result = iwstruct.iw_get_ext(self.ifname, 
-                                        SIOCGIWRANGE, 
-                                        data=s)
-        if i > 0:
-            self.errorflag = i
-            self.error = result
-        data = buff.tostring()
-        self._parse(data)
-        
-    def _parse(self, data):
-        struct = Iwstruct()
-        result = struct.parse_data(self.fmt, data)
-        
-        # XXX there is maybe a much more elegant way to do this
-        self.throughput, self.min_nwid, self.max_nwid = result[0:3]
-        self.old_num_channels, self.old_num_frequency = result[3:5]
-        self.old_freq = result[5:11]
-        self.sensitivity = result[11]
-        self.max_qual.setValues(result[12:16])
-        self.avg_qual.setValues(result[16:20])
-        self.num_bitrates = result[20] # <- XXX
-        raw_bitrates = result[21:53]
-        for rate in raw_bitrates:
-            iwfreq = Iwfreq()
-            iwfreq.frequency = rate
-            br = iwfreq.getBitrate()
-            if br is not None:
-                self.bitrates.append(br)
-            
-        self.min_rts, self.max_rts = result[53:55]
-        self.min_frag, self.max_frag = result[55:57]
-        self.min_pmp, self.max_pmp = result[57:59]
-        self.min_pmt, self.max_pmt = result[59:61]
-        self.pmp_flags, self.pmt_flags, self.pm_capa = result[61:64]
-        self.encoding_size = result[64:72]
-        self.num_encoding_sizes, self.max_encoding_tokens = result[72:74]
-        self.encoding_login_index = result[74:76]
-        self.txpower_capa, self.num_txpower = result[76:78]
-        self.txpower = result[78:86]
-        self.we_vers_compiled, self.we_vers_src = result[86:88]
-        self.retry_capa, self.retry_flags, self.r_time_flags = result[88:91]
-        self.min_retry, self.max_retry = result[91:93]
-        self.min_r_time, self.max_r_time = result[93:95]
-        self.num_channels = result[95]
-        self.num_frequency = result[96]
-        freq = result[97:]
-        
-        i = self.num_frequency
-        for x in range(0, len(freq), 4):
-            iwfreq = Iwfreq()
-            iwfreq._setFrequency(freq[x:x+4])
-            fq = iwfreq.getFrequency()
-            if fq is not None:
-                self.frequencies.append(fq)
-            i -= 1
-            if i <= 0:
-                break
-        
-class Iwscan(object):
-    """class to handle AP scanning"""
-    
-    def __init__(self, ifname):
-        self.ifname = ifname
-        self.range = Iwrange(ifname)
-        self.errorflag = 0
-        self.error = ""
-        self.stream = None
-        self.aplist = None
-                
-    def scan(self, fullscan=True):
-        """Completes a scan for available access points,
-           and returns them in Iwscanresult format
-           
-           fullscan: If False, data is read from a cache of the last scan
-                     If True, a scan is conducted, and then the data is read
-        """
-        # By default everything is fine, do not wait
-        result = 1
-        if fullscan:
-            self.setScan()
-            if self.errorflag > EPERM:
-                raise RuntimeError, 'setScan failure ' + str(self.errorflag) + " " + str(self.error)
-                return None
-            elif self.errorflag < EPERM:
-                # Permission was NOT denied, therefore we must WAIT to get results
-                result = 250
-        
-        while (result > 0):
-            sleep(result/1000)
-            result = self.getScan()
-        
-        if result < 0 or self.errorflag != 0:
-            raise RuntimeError, 'getScan failure ' + str(self.errorflag) + " " + str(self.error)
-        
-        return self.aplist
-        
-        
-    def setScan(self):
-        """Triggers the scan, if we have permission
-        """
-        iwstruct = Iwstruct()
-        s = iwstruct.pack('Pii', 0, 0, 0)
-        i, result = iwstruct.iw_get_ext(self.ifname, 
-                                        SIOCSIWSCAN,s)
-        if i > 0:
-            self.errorflag = i
-            self.error = result
-        return result
-        
-    def getScan(self):
-        """Retreives results, stored from the most recent scan
-           Returns 0 if successful, a delay if the data isn't ready yet
-           or -1 if something really nasty happened
-        """
-        iwstruct = Iwstruct()
-        i = E2BIG
-        bufflen = IW_SCAN_MAX_DATA
-        
-        # Keep resizing the buffer until it's large enough to hold the scan
-        while (i == E2BIG):
-            buff, s = iwstruct.pack_wrq(bufflen)
-            i, result = iwstruct.iw_get_ext(self.ifname, 
-                                            SIOCGIWSCAN,
-                                            data=s)
-            if i == E2BIG:
-                pbuff, newlen = iwstruct.unpack('Pi', s)
-                if bufflen < newlen:
-                    bufflen = newlen
-                else:
-                    bufflen = bufflen * 2
-        
-        if i == EAGAIN:
-            return 100
-        if i > 0:
-            self.errorflag = i
-            self.error = result
-            return -1
-        
-        pbuff, reslen = iwstruct.unpack('Pi', s)
-        if reslen > 0:
-            # Initialize the stream, and turn it into an enumerator
-            self.aplist = self._parse(buff.tostring())
-            return 0
-        
-    def _parse(self, data):
-        """Parse the event stream, and return a list of Iwscanresult objects
-        """
-        iwstruct = Iwstruct()
-        scanresult = None
-        aplist = []
-
-        # Run through the stream, until broken
-        while 1:
-            # If we're the stream doesn't have enough space left for a header, break
-            if len(data) < IW_EV_LCP_LEN:
-                break;
-        
-            # Unpack the header
-            length, cmd = iwstruct.unpack('HH', data[:4])
-            # If the header says the following data is shorter than the header, then break
-            if length < IW_EV_LCP_LEN:
-                break;
-
-            # Put the events into their respective result data
-            if cmd == SIOCGIWAP:
-                if scanresult is not None:
-                    aplist.append(scanresult)
-                scanresult = Iwscanresult(data[IW_EV_LCP_LEN:length], self.range)
-            elif scanresult is None:
-                raise RuntimeError, 'Attempting to add an event without AP data'
-            else:
-                scanresult.addEvent(cmd, data[IW_EV_LCP_LEN:length])
-            
-            # We're finished with the preveious event
-            data = data[length:]
-        
-        # Don't forgset the final result
-        if scanresult.bssid != "00:00:00:00:00:00":
-            aplist.append(scanresult)
-        else:
-            raise RuntimeError, 'Attempting to add an AP without a bssid'
-        return aplist
-
-class Iwscanresult(object):
-    """An object to contain all the events associated with a single scanned AP
-    """
-    
-    def __init__(self, data, range):
-        """Initialize the scan result with the access point data"""
-        self.iwstruct = Iwstruct()
-        self.range = range
-        self.bssid = "%02X:%02X:%02X:%02X:%02X:%02X" % struct_unpack('BBBBBB', data[2:8])
-        self.essid = None
-        self.mode = None
-        self.rate = []
-        self.quality = Iwquality() 
-        self.frequency = None
-        self.encode = None
-        self.custom = []
-        self.protocol = None
-
-    def addEvent(self, cmd, data):
-        """Attempts to add the data from an event to a scanresult
-           Only certain data is accept, in which case the result is True
-           If the event data is invalid, None is returned
-           If the data is valid but unused, False is returned
-        """
-        if cmd <= SIOCIWLAST:
-            if cmd < SIOCIWFIRST:
-                return None
-        elif cmd >= IWEVFIRST:
-            if cmd > IWEVLAST:
-                return None
-        else:
-            return None
-            
-        if cmd == SIOCGIWESSID:
-            self.essid = data[4:]
-        elif cmd == SIOCGIWMODE:
-            self.mode = modes[self.iwstruct.unpack('i', data[:4])[0]]
-        elif cmd == SIOCGIWRATE:
-            # TODO, deal with multiple rates, or at least the highest rate
-            freqsize = struct_calcsize("ihbb")
-            while len(data) >= freqsize:
-                iwfreq = Iwfreq(data)
-                self.rate.append(iwfreq.getBitrate())
-                data = data[freqsize:]
-        elif cmd == IWEVQUAL:
-            self.quality.parse(data)
-        elif cmd == SIOCGIWFREQ:
-            self.frequency = Iwfreq(data)
-        elif cmd == SIOCGIWENCODE:
-            self.encode = data
-        elif cmd == IWEVCUSTOM:
-            self.custom.append(data[1:])
-        elif cmd == SIOCGIWNAME:
-            self.protocol = data[:len(data)-2]
-        else:
-            #print "Cmd:", cmd
-            return False
-        return True
\ No newline at end of file
index a687714..28ee363 100755 (executable)
@@ -1,4 +1,4 @@
-from enigma import eTimer
+from enigma import eTimer, eTPM
 from Screens.Screen import Screen
 from Components.ActionMap import ActionMap, NumberActionMap
 from Components.Pixmap import Pixmap,MultiPixmap
@@ -14,7 +14,9 @@ from Plugins.Plugin import PluginDescriptor
 from os import system, path as os_path, listdir
 from Tools.Directories import resolveFilename, SCOPE_PLUGINS, SCOPE_SKIN_IMAGE
 from Tools.LoadPixmap import LoadPixmap
+from Tools.HardwareInfo import HardwareInfo
 from Wlan import Wlan, wpaSupplicant, iStatus
+import sha
 
 plugin_path = "/usr/lib/enigma2/python/Plugins/SystemPlugins/WirelessLan"
 
@@ -122,7 +124,7 @@ class WlanStatus(Screen):
                                if status is not None:
                                        self["BSSID"].setText(status[self.iface]["acesspoint"])
                                        self["ESSID"].setText(status[self.iface]["essid"])
-                                       self["quality"].setText(status[self.iface]["quality"]+"%")
+                                       self["quality"].setText(status[self.iface]["quality"])
                                        self["signal"].setText(status[self.iface]["signal"])
                                        self["bitrate"].setText(status[self.iface]["bitrate"])
                                        self["enc"].setText(status[self.iface]["encryption"])
@@ -373,6 +375,45 @@ class WlanScan(Screen):
                return self.WlanList
 
 
+def bin2long(s):
+       return reduce( lambda x,y:(x<<8L)+y, map(ord, s))
+
+def long2bin(l):
+       res = ""
+       for byte in range(128):
+               res += chr((l >> (1024 - (byte + 1) * 8)) & 0xff)
+       return res
+
+def rsa_pub1024(src, mod):
+       return long2bin(pow(bin2long(src), 65537, bin2long(mod)))
+       
+def decrypt_block(src, mod):
+       if len(src) != 128 and len(src) != 202:
+               return None
+       dest = rsa_pub1024(src[:128], mod)
+       hash = sha.new(dest[1:107])
+       if len(src) == 202:
+               hash.update(src[131:192])       
+       result = hash.digest()
+       if result == dest[107:127]:
+               return dest
+       return None
+
+def validate_cert(cert, key):
+       buf = decrypt_block(cert[8:], key) 
+       if buf is None:
+               return None
+       return buf[36:107] + cert[139:196]
+
+def read_random():
+       try:
+               fd = open("/dev/urandom", "r")
+               buf = fd.read(8)
+               fd.close()
+               return buf
+       except:
+               return None
+
 def WlanStatusScreenMain(session, iface):
        session.open(WlanStatus, iface)
 
@@ -387,8 +428,32 @@ def callFunction(iface):
 
 
 def configStrings(iface):
-       driver = iNetwork.detectWlanModule()
-       print "Found WLAN-Driver:",driver
+       hardware_info = HardwareInfo()
+       if  hardware_info.device_name != "dm7025":
+               rootkey = ['\x9f', '|', '\xe4', 'G', '\xc9', '\xb4', '\xf4', '#', '&', '\xce', '\xb3', '\xfe', '\xda', '\xc9', 'U', '`', '\xd8', '\x8c', 's', 'o', '\x90', '\x9b', '\\', 'b', '\xc0', '\x89', '\xd1', '\x8c', '\x9e', 'J', 'T', '\xc5', 'X', '\xa1', '\xb8', '\x13', '5', 'E', '\x02', '\xc9', '\xb2', '\xe6', 't', '\x89', '\xde', '\xcd', '\x9d', '\x11', '\xdd', '\xc7', '\xf4', '\xe4', '\xe4', '\xbc', '\xdb', '\x9c', '\xea', '}', '\xad', '\xda', 't', 'r', '\x9b', '\xdc', '\xbc', '\x18', '3', '\xe7', '\xaf', '|', '\xae', '\x0c', '\xe3', '\xb5', '\x84', '\x8d', '\r', '\x8d', '\x9d', '2', '\xd0', '\xce', '\xd5', 'q', '\t', '\x84', 'c', '\xa8', ')', '\x99', '\xdc', '<', '"', 'x', '\xe8', '\x87', '\x8f', '\x02', ';', 'S', 'm', '\xd5', '\xf0', '\xa3', '_', '\xb7', 'T', '\t', '\xde', '\xa7', '\xf1', '\xc9', '\xae', '\x8a', '\xd7', '\xd2', '\xcf', '\xb2', '.', '\x13', '\xfb', '\xac', 'j', '\xdf', '\xb1', '\x1d', ':', '?']
+               etpm = eTPM()
+               l2cert = etpm.getCert(eTPM.TPMD_DT_LEVEL2_CERT)
+               if l2cert is None:
+                       return
+               l2key = validate_cert(l2cert, rootkey)
+               if l2key is None:
+                       return
+               l3cert = etpm.getCert(eTPM.TPMD_DT_LEVEL3_CERT)
+               if l3cert is None:
+                       print "better run the genuine dreambox plugin"
+                       return
+               l3key = validate_cert(l3cert, l2key)
+               if l3key is None:
+                       return
+               rnd = read_random()
+               if rnd is None:
+                       return
+               val = etpm.challenge(rnd)
+               result = decrypt_block(val, l3key)
+       if hardware_info.device_name == "dm7025" or result[80:88] == rnd:
+               driver = iNetwork.detectWlanModule(iface)
+       else:
+               driver = 'dreambox'
        if driver  in ('ralink', 'zydas'):
                return "        pre-up /usr/sbin/wpa_supplicant -i"+iface+" -c/etc/wpa_supplicant.conf -B -D"+driver+"\n        post-down wpa_cli terminate"
        else:
@@ -399,4 +464,3 @@ def configStrings(iface):
 
 def Plugins(**kwargs):
        return PluginDescriptor(name=_("Wireless LAN"), description=_("Connect to a Wireless Network"), where = PluginDescriptor.WHERE_NETWORKSETUP, fnc={"ifaceSupported": callFunction, "configStrings": configStrings, "WlanPluginEntry": lambda x: "Wireless Network Configuartion..."})
-       
\ No newline at end of file
diff --git a/lib/python/Screens/InputDeviceSetup.py b/lib/python/Screens/InputDeviceSetup.py
new file mode 100755 (executable)
index 0000000..bd8550b
--- /dev/null
@@ -0,0 +1,280 @@
+from Screen import Screen
+from Screens.HelpMenu import HelpableScreen
+from Screens.MessageBox import MessageBox
+from Components.InputDevice import iInputDevices
+from Components.Sources.StaticText import StaticText
+from Components.Sources.Boolean import Boolean
+from Components.Sources.List import List
+from Components.config import config, ConfigSlider, ConfigSubsection, ConfigYesNo, ConfigText, getConfigListEntry, ConfigNothing
+from Components.ConfigList import ConfigListScreen
+from Components.ActionMap import ActionMap, NumberActionMap, HelpableActionMap
+from Tools.Directories import resolveFilename, SCOPE_CURRENT_SKIN
+from Tools.LoadPixmap import LoadPixmap
+
+class InputDeviceSelection(Screen,HelpableScreen):
+       skin = """
+       <screen name="InputDeviceSelection" position="center,center" size="560,400" title="Select input device">
+               <ePixmap pixmap="skin_default/buttons/red.png" position="0,0" size="140,40" alphatest="on"/>
+               <ePixmap pixmap="skin_default/buttons/green.png" position="140,0" size="140,40" alphatest="on"/>
+               <ePixmap pixmap="skin_default/buttons/yellow.png" position="280,0" size="140,40" alphatest="on"/>
+               <ePixmap pixmap="skin_default/buttons/blue.png" position="420,0" size="140,40" alphatest="on"/>
+               <widget source="key_red" render="Label" position="0,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1"/>
+               <widget source="key_green" render="Label" position="140,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" transparent="1"/>
+               <widget source="key_yellow" render="Label" position="280,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#a08500" transparent="1"/>
+               <widget source="key_blue" render="Label" position="420,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#18188b" transparent="1"/>
+               <widget source="list" render="Listbox" position="5,50" size="550,280" zPosition="10" scrollbarMode="showOnDemand">
+                       <convert type="TemplatedMultiContent">
+                       <!--  device, description, devicepng, divpng  -->
+                                                       {"template": [
+                                                                       MultiContentEntryPixmapAlphaTest(pos = (2, 8), size = (54, 54), png = 2), # index 3 is the interface pixmap
+                                                                       MultiContentEntryText(pos = (65, 6), size = (450, 54), font=0, flags = RT_HALIGN_LEFT|RT_VALIGN_CENTER|RT_WRAP, text = 1), # index 1 is the interfacename
+                                                               ],
+                                                       "fonts": [gFont("Regular", 28),gFont("Regular", 20)],
+                                                       "itemHeight": 70
+                                                       }
+                                               
+                       </convert>
+               </widget>
+               <ePixmap pixmap="skin_default/div-h.png" position="0,340" zPosition="1" size="560,2"/>
+               <widget source="introduction" render="Label" position="0,350" size="560,50" zPosition="10" font="Regular;21" halign="center" valign="center" backgroundColor="#25062748" transparent="1"/>
+       </screen>"""
+
+
+       def __init__(self, session):
+               Screen.__init__(self, session)
+               HelpableScreen.__init__(self)
+               
+               self.edittext = _("Press OK to edit the settings.")
+               
+               self["key_red"] = StaticText(_("Close"))
+               self["key_green"] = StaticText(_("Select"))
+               self["key_yellow"] = StaticText("")
+               self["key_blue"] = StaticText("")
+               self["introduction"] = StaticText(self.edittext)
+               
+               self.devices = [(iInputDevices.getDeviceName(x),x) for x in iInputDevices.getDeviceList()]
+               print "[InputDeviceSelection] found devices :->", len(self.devices),self.devices
+                       
+               self["OkCancelActions"] = HelpableActionMap(self, "OkCancelActions",
+                       {
+                       "cancel": (self.close, _("Exit input device selection.")),
+                       "ok": (self.okbuttonClick, _("Select input device.")),
+                       }, -2)
+
+               self["ColorActions"] = HelpableActionMap(self, "ColorActions",
+                       {
+                       "red": (self.close, _("Exit input device selection.")),
+                       "green": (self.okbuttonClick, _("Select input device.")),
+                       }, -2)
+               
+               self.currentIndex = 0
+               self.list = []
+               self["list"] = List(self.list)
+               self.updateList()
+               self.onLayoutFinish.append(self.layoutFinished)
+               self.onClose.append(self.cleanup)
+
+       def layoutFinished(self):
+               self.setTitle(_("Select input device"))
+
+       def cleanup(self):
+               self.currentIndex = 0
+
+       def buildInterfaceList(self,device,description,type ):
+               divpng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/div-h.png"))
+               activepng = None
+               devicepng = None
+               enabled = iInputDevices.getDeviceAttribute(device, 'enabled')
+
+               if type == 'remote':
+                       if config.misc.rcused.value == 0:
+                               if enabled:
+                                       devicepng = LoadPixmap(resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/icons/input_rcnew-configured.png"))
+                               else:
+                                       devicepng = LoadPixmap(resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/icons/input_rcnew.png"))
+                       else:
+                               if enabled:
+                                       devicepng = LoadPixmap(resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/icons/input_rcold-configured.png"))
+                               else:
+                                       devicepng = LoadPixmap(resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/icons/input_rcold.png"))
+               elif type == 'keyboard':
+                       if enabled:
+                               devicepng = LoadPixmap(resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/icons/input_keyboard-configured.png"))
+                       else:
+                               devicepng = LoadPixmap(resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/icons/input_keyboard.png"))
+               elif type == 'mouse':
+                       if enabled:
+                               devicepng = LoadPixmap(resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/icons/input_mouse-configured.png"))
+                       else:
+                               devicepng = LoadPixmap(resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/icons/input_mouse.png"))
+               else:
+                       devicepng = LoadPixmap(resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/icons/input_rcnew.png"))
+               return((device, description, devicepng, divpng))        
+
+       def updateList(self):
+               self.list = []
+               for x in self.devices:
+                       dev_type = iInputDevices.getDeviceAttribute(x[1], 'type')
+                       self.list.append(self.buildInterfaceList(x[1],_(x[0]), dev_type ))
+               self["list"].setList(self.list)
+               self["list"].setIndex(self.currentIndex)
+
+       def okbuttonClick(self):
+               selection = self["list"].getCurrent()
+               self.currentIndex = self["list"].getIndex()
+               if selection is not None:
+                       self.session.openWithCallback(self.DeviceSetupClosed, InputDeviceSetup, selection[0])
+
+       def DeviceSetupClosed(self, *ret):
+               self.updateList()
+
+
+class InputDeviceSetup(Screen, ConfigListScreen):
+
+       skin = """
+               <screen name="InputDeviceSetup" position="center,center" size="560,440" title="Input device setup">
+                       <ePixmap pixmap="skin_default/buttons/red.png" position="0,0" size="140,40" alphatest="on" />
+                       <ePixmap pixmap="skin_default/buttons/green.png" position="140,0" size="140,40" alphatest="on" />
+                       <ePixmap pixmap="skin_default/buttons/yellow.png" position="280,0" size="140,40" alphatest="on" />
+                       <ePixmap pixmap="skin_default/buttons/blue.png" position="420,0" size="140,40" alphatest="on" />
+                       <widget source="key_red" render="Label" position="0,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" />
+                       <widget source="key_green" render="Label" position="140,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" transparent="1" />
+                       <widget source="key_yellow" render="Label" position="280,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#a08500" transparent="1" />
+                       <widget source="key_blue" render="Label" position="420,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#18188b" transparent="1" />
+                       <widget name="config" position="5,50" size="550,350" scrollbarMode="showOnDemand" />
+                       <ePixmap pixmap="skin_default/div-h.png" position="0,400" zPosition="1" size="560,2" />
+                       <widget source="introduction" render="Label" position="5,410" size="550,30" zPosition="10" font="Regular;21" halign="center" valign="center" backgroundColor="#25062748" transparent="1" />
+               </screen>"""
+
+       def __init__(self, session, device):
+               Screen.__init__(self, session)
+               self.inputDevice = device
+               iInputDevices.currentDevice = self.inputDevice
+               self.onChangedEntry = [ ]
+               self.setup_title = _("Input device setup")
+               self.isStepSlider = None
+               self.enableEntry = None
+               self.repeatEntry = None
+               self.delayEntry = None
+               self.nameEntry = None
+               self.enableConfigEntry = None
+
+               self.list = [ ]
+               ConfigListScreen.__init__(self, self.list, session = session, on_change = self.changedEntry)
+
+               self["actions"] = ActionMap(["SetupActions"],
+                       {
+                               "cancel": self.keyCancel,
+                               "save": self.apply,
+                       }, -2)
+
+               self["key_red"] = StaticText(_("Cancel"))
+               self["key_green"] = StaticText(_("OK"))
+               self["key_yellow"] = StaticText()
+               self["key_blue"] = StaticText()
+               self["introduction"] = StaticText()
+
+               self.createSetup()
+               self.onLayoutFinish.append(self.layoutFinished)
+               self.onClose.append(self.cleanup)
+
+       def layoutFinished(self):
+               self.setTitle(self.setup_title)
+
+       def cleanup(self):
+               iInputDevices.currentDevice = ""
+
+       def createSetup(self):
+               self.list = [ ]
+               cmd = "self.enableEntry = getConfigListEntry(_('"'Change repeat and delay settings?'"'), config.inputDevices." + self.inputDevice + ".enabled)"
+               exec (cmd)
+               cmd = "self.repeatEntry = getConfigListEntry(_('"'Interval between keys when repeating:'"'), config.inputDevices." + self.inputDevice + ".repeat)"
+               exec (cmd)
+               cmd = "self.delayEntry = getConfigListEntry(_('"'Delay before key repeat starts:'"'), config.inputDevices." + self.inputDevice + ".delay)"
+               exec (cmd)
+               cmd = "self.nameEntry = getConfigListEntry(_('"'Devicename:'"'), config.inputDevices." + self.inputDevice + ".name)"
+               exec (cmd)
+               if self.enableEntry:
+                       if isinstance(self.enableEntry[1], ConfigYesNo):
+                               self.enableConfigEntry = self.enableEntry[1]
+
+               self.list.append(self.enableEntry)
+               if self.enableConfigEntry:
+                       if self.enableConfigEntry.value is True:
+                               self.list.append(self.repeatEntry)
+                               self.list.append(self.delayEntry)
+                       else:
+                               self.repeatEntry[1].setValue(self.repeatEntry[1].default)
+                               self["config"].invalidate(self.repeatEntry)
+                               self.delayEntry[1].setValue(self.delayEntry[1].default)
+                               self["config"].invalidate(self.delayEntry)
+                               self.nameEntry[1].setValue(self.nameEntry[1].default)
+                               self["config"].invalidate(self.nameEntry)
+                               
+               self["config"].list = self.list
+               self["config"].l.setSeperation(400)
+               self["config"].l.setList(self.list)
+               if not self.selectionChanged in self["config"].onSelectionChanged:
+                       self["config"].onSelectionChanged.append(self.selectionChanged)
+               self.selectionChanged()
+
+       def selectionChanged(self):
+               if self["config"].getCurrent() == self.enableEntry:
+                       self["introduction"].setText(_("Current device: ") + str(iInputDevices.getDeviceAttribute(self.inputDevice, 'name')) )
+               else:
+                       self["introduction"].setText(_("Current value: ") + self.getCurrentValue() + _(" ms"))
+
+       def newConfig(self):
+               current = self["config"].getCurrent()
+               if current:
+                       if current == self.enableEntry:
+                               self.createSetup()
+
+       def keyLeft(self):
+               ConfigListScreen.keyLeft(self)
+               self.newConfig()
+
+       def keyRight(self):
+               ConfigListScreen.keyRight(self)
+               self.newConfig()
+
+       def confirm(self, confirmed):
+               if not confirmed:
+                       print "not confirmed"
+                       return
+               else:
+                       self.nameEntry[1].setValue(iInputDevices.getDeviceAttribute(self.inputDevice, 'name'))
+                       cmd = "config.inputDevices." + self.inputDevice + ".name.save()"
+                       exec (cmd)
+                       self.keySave()
+
+       def apply(self):
+               self.session.openWithCallback(self.confirm, MessageBox, _("Use this input device settings?"), MessageBox.TYPE_YESNO, timeout = 20, default = True)
+
+       def cancelConfirm(self, result):
+               if not result:
+                       return
+               for x in self["config"].list:
+                       x[1].cancel()
+               self.close()
+
+       def keyCancel(self):
+               if self["config"].isChanged():
+                       self.session.openWithCallback(self.cancelConfirm, MessageBox, _("Really close without saving settings?"), MessageBox.TYPE_YESNO, timeout = 20, default = True)
+               else:
+                       self.close()
+       # for summary:
+       def changedEntry(self):
+               for x in self.onChangedEntry:
+                       x()
+               self.selectionChanged()
+
+       def getCurrentEntry(self):
+               return self["config"].getCurrent()[0]
+
+       def getCurrentValue(self):
+               return str(self["config"].getCurrent()[1].value)
+
+       def createSummary(self):
+               from Screens.Setup import SetupSummary
+               return SetupSummary
index 9687633..7f98f3d 100755 (executable)
@@ -25,6 +25,7 @@ class Ipkg(Screen):
                
                self.packages = 0
                self.error = 0
+               self.processed_packages = []
                
                self.activity = 0
                self.activityTimer = eTimer()
@@ -85,15 +86,21 @@ class Ipkg(Screen):
                                self.slider.setValue(self.sliderPackages[param])
                        self.package.setText(param)
                        self.status.setText(_("Upgrading"))
-                       self.packages += 1
+                       if not param in self.processed_packages:
+                               self.processed_packages.append(param)
+                               self.packages += 1
                elif event == IpkgComponent.EVENT_INSTALL:
                        self.package.setText(param)
                        self.status.setText(_("Installing"))
-                       self.packages += 1
+                       if not param in self.processed_packages:
+                               self.processed_packages.append(param)
+                               self.packages += 1
                elif event == IpkgComponent.EVENT_REMOVE:
                        self.package.setText(param)
                        self.status.setText(_("Removing"))
-                       self.packages += 1
+                       if not param in self.processed_packages:
+                               self.processed_packages.append(param)
+                               self.packages += 1
                elif event == IpkgComponent.EVENT_CONFIGURING:
                        self.package.setText(param)
                        self.status.setText(_("Configuring"))
@@ -103,10 +110,10 @@ class Ipkg(Screen):
                        self.runNextCmd()
                elif event == IpkgComponent.EVENT_MODIFIED:
                        self.session.openWithCallback(
-                                self.modificationCallback,
-                                MessageBox,
-                                _("A configuration file (%s) was modified since Installation.\nDo you want to keep your version?") % (param)
-                        )
+                               self.modificationCallback,
+                               MessageBox,
+                               _("A configuration file (%s) was modified since Installation.\nDo you want to keep your version?") % (param)
+                       )
 
        def modificationCallback(self, res):
                self.ipkg.write(res and "N" or "Y")
index d96b491..a4b158d 100755 (executable)
@@ -14,5 +14,6 @@ install_PYTHON = \
        SubtitleDisplay.py SubservicesQuickzap.py ParentalControlSetup.py NumericalTextInputHelpDialog.py \
        SleepTimerEdit.py Ipkg.py RdsDisplay.py Globals.py DefaultWizard.py \
        SessionGlobals.py LocationBox.py WizardLanguage.py TaskView.py Rc.py VirtualKeyBoard.py \
-       TextBox.py FactoryReset.py RecordPaths.py UnhandledKey.py ServiceStopScreen.py
+       TextBox.py FactoryReset.py RecordPaths.py UnhandledKey.py ServiceStopScreen.py \
+       InputDeviceSetup.py
 
index c0037f8..de2fa99 100755 (executable)
@@ -7,6 +7,7 @@ from Screens.HelpMenu import HelpableScreen
 from Components.Network import iNetwork
 from Components.Sources.StaticText import StaticText
 from Components.Sources.Boolean import Boolean
+from Components.Sources.List import List
 from Components.Label import Label,MultiColorLabel
 from Components.Pixmap import Pixmap,MultiPixmap
 from Components.MenuList import MenuList
@@ -23,32 +24,6 @@ from os import path as os_path, system as os_system, unlink
 from re import compile as re_compile, search as re_search
 
 
-class InterfaceList(MenuList):
-       def __init__(self, list, enableWrapAround=False):
-               MenuList.__init__(self, list, enableWrapAround, eListboxPythonMultiContent)
-               self.l.setFont(0, gFont("Regular", 20))
-               self.l.setItemHeight(30)
-
-def InterfaceEntryComponent(index,name,default,active ):
-       res = [
-               (index),
-               MultiContentEntryText(pos=(80, 5), size=(430, 25), font=0, text=name)
-       ]
-       num_configured_if = len(iNetwork.getConfiguredAdapters())
-       if num_configured_if >= 2:
-               if default is True:
-                       png = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/buttons/button_blue.png"))
-               if default is False:
-                       png = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/buttons/button_blue_off.png"))
-               res.append(MultiContentEntryPixmapAlphaTest(pos=(10, 5), size=(25, 25), png = png))
-       if active is True:
-               png2 = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/icons/lock_on.png"))
-       if active is False:
-               png2 = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/icons/lock_error.png"))
-       res.append(MultiContentEntryPixmapAlphaTest(pos=(40, 1), size=(25, 25), png = png2))
-       return res
-
-
 class NetworkAdapterSelection(Screen,HelpableScreen):
        def __init__(self, session):
                Screen.__init__(self, session)
@@ -91,13 +66,49 @@ class NetworkAdapterSelection(Screen,HelpableScreen):
                        })
 
                self.list = []
-               self["list"] = InterfaceList(self.list)
+               self["list"] = List(self.list)
                self.updateList()
 
                if len(self.adapters) == 1:
                        self.onFirstExecBegin.append(self.okbuttonClick)
                self.onClose.append(self.cleanup)
 
+       def buildInterfaceList(self,iface,name,default,active ):
+               divpng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/div-h.png"))
+               defaultpng = None
+               activepng = None
+               description = None
+               interfacepng = None
+
+               if iface in iNetwork.lan_interfaces:
+                       if active is True:
+                               interfacepng = LoadPixmap(resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/icons/network_wired-active.png"))
+                       elif active is False:
+                               interfacepng = LoadPixmap(resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/icons/network_wired-inactive.png"))
+                       else:
+                               interfacepng = LoadPixmap(resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/icons/network_wired.png"))
+               elif iface in iNetwork.wlan_interfaces:
+                       if active is True:
+                               interfacepng = LoadPixmap(resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/icons/network_wireless-active.png"))
+                       elif active is False:
+                               interfacepng = LoadPixmap(resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/icons/network_wireless-inactive.png"))
+                       else:
+                               interfacepng = LoadPixmap(resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/icons/network_wireless.png"))
+
+               num_configured_if = len(iNetwork.getConfiguredAdapters())
+               if num_configured_if >= 2:
+                       if default is True:
+                               defaultpng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/buttons/button_blue.png"))
+                       elif default is False:
+                               defaultpng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/buttons/button_blue_off.png"))
+               if active is True:
+                       activepng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/icons/lock_on.png"))
+               elif active is False:
+                       activepng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/icons/lock_error.png"))
+               
+               description = iNetwork.getFriendlyAdapterDescription(iface)
+
+               return((iface, name, description, interfacepng, defaultpng, activepng, divpng)) 
 
        def updateList(self):
                self.list = []
@@ -122,7 +133,7 @@ class NetworkAdapterSelection(Screen,HelpableScreen):
                        default_gw = result
                                        
                if len(self.adapters) == 0: # no interface available => display only eth0
-                       self.list.append(InterfaceEntryComponent("eth0",iNetwork.getFriendlyAdapterName('eth0'),True,True ))
+                       self.list.append(self.buildInterfaceList("eth0",iNetwork.getFriendlyAdapterName('eth0'),True,True ))
                else:
                        for x in self.adapters:
                                if x[1] == default_gw:
@@ -133,11 +144,11 @@ class NetworkAdapterSelection(Screen,HelpableScreen):
                                        active_int = True
                                else:
                                        active_int = False
-                               self.list.append(InterfaceEntryComponent(index = x[1],name = _(x[0]),default=default_int,active=active_int ))
+                               self.list.append(self.buildInterfaceList(x[1],_(x[0]),default_int,active_int ))
                
                if os_path.exists(resolveFilename(SCOPE_PLUGINS, "SystemPlugins/NetworkWizard/networkwizard.xml")):
                        self["key_blue"].setText(_("NetworkWizard"))
-               self["list"].l.setList(self.list)
+               self["list"].setList(self.list)
 
        def setDefaultInterface(self):
                selection = self["list"].getCurrent()
@@ -253,7 +264,7 @@ class NameserverSetup(Screen, ConfigListScreen, HelpableScreen):
                self.list = []
                ConfigListScreen.__init__(self, self.list)
                self.createSetup()
-
+               
        def createConfig(self):
                self.nameservers = iNetwork.getNameserverList()
                self.nameserverEntries = [ NoSave(ConfigIP(default=nameserver)) for nameserver in self.nameservers]
@@ -412,7 +423,7 @@ class AdapterSetup(Screen, ConfigListScreen, HelpableScreen):
                self.wsconfig = None
                self.default = None
 
-               if self.iface == "wlan0" or self.iface == "ath0" :
+               if self.iface in iNetwork.wlan_interfaces:
                        from Plugins.SystemPlugins.WirelessLan.Wlan import wpaSupplicant,Wlan
                        self.w = Wlan(self.iface)
                        self.ws = wpaSupplicant()
@@ -535,7 +546,7 @@ class AdapterSetup(Screen, ConfigListScreen, HelpableScreen):
                        self.createSetup()
                if self["config"].getCurrent() == self.gatewayEntry:
                        self.createSetup()
-               if self.iface == "wlan0" or self.iface == "ath0" :
+               if self.iface in iNetwork.wlan_interfaces:
                        if self["config"].getCurrent() == self.wlanSSID:
                                self.createSetup()
                        if self["config"].getCurrent() == self.encryptionEnabled:
@@ -731,17 +742,24 @@ class AdapterSetupConfiguration(Screen, HelpableScreen):
        def ok(self):
                self.cleanup()
                if self["menulist"].getCurrent()[1] == 'edit':
-                       if self.iface == 'wlan0' or self.iface == 'ath0':
+                       if self.iface in iNetwork.wlan_interfaces:
                                try:
                                        from Plugins.SystemPlugins.WirelessLan.plugin import WlanScan
-                                       from Plugins.SystemPlugins.WirelessLan.iwlibs import Wireless
+                                       from pythonwifi.iwlibs import Wireless
                                except ImportError:
                                        self.session.open(MessageBox, _("The wireless LAN plugin is not installed!\nPlease install it."), type = MessageBox.TYPE_INFO,timeout = 10 )
                                else:
                                        ifobj = Wireless(self.iface) # a Wireless NIC Object
-                                       self.wlanresponse = ifobj.getStatistics()
-                                       if self.wlanresponse[0] != 19: # Wlan Interface found.
-                                               self.session.openWithCallback(self.AdapterSetupClosed, AdapterSetup,self.iface)
+                                       try:
+                                               self.wlanresponse = ifobj.getAPaddr()
+                                       except IOError:
+                                               self.wlanresponse = ifobj.getStatistics()
+                                       if self.wlanresponse:
+                                               if self.wlanresponse[0] not in (19,95): # 19 = 'No such device', 95 = 'Operation not supported'
+                                                       self.session.openWithCallback(self.AdapterSetupClosed, AdapterSetup,self.iface)
+                                               else:
+                                                       # Display Wlan not available Message
+                                                       self.showErrorMessage()
                                        else:
                                                # Display Wlan not available Message
                                                self.showErrorMessage()
@@ -754,28 +772,42 @@ class AdapterSetupConfiguration(Screen, HelpableScreen):
                if self["menulist"].getCurrent()[1] == 'scanwlan':
                        try:
                                from Plugins.SystemPlugins.WirelessLan.plugin import WlanScan
-                               from Plugins.SystemPlugins.WirelessLan.iwlibs import Wireless
+                               from pythonwifi.iwlibs import Wireless
                        except ImportError:
                                self.session.open(MessageBox, _("The wireless LAN plugin is not installed!\nPlease install it."), type = MessageBox.TYPE_INFO,timeout = 10 )
                        else:
                                ifobj = Wireless(self.iface) # a Wireless NIC Object
-                               self.wlanresponse = ifobj.getStatistics()
-                               if self.wlanresponse[0] != 19:
-                                       self.session.openWithCallback(self.WlanScanClosed, WlanScan, self.iface)
+                               try:
+                                       self.wlanresponse = ifobj.getAPaddr()
+                               except IOError:
+                                       self.wlanresponse = ifobj.getStatistics()
+                               if self.wlanresponse:
+                                       if self.wlanresponse[0] not in (19,95): # 19 = 'No such device', 95 = 'Operation not supported'
+                                               self.session.openWithCallback(self.WlanScanClosed, WlanScan, self.iface)
+                                       else:
+                                               # Display Wlan not available Message
+                                               self.showErrorMessage()
                                else:
                                        # Display Wlan not available Message
                                        self.showErrorMessage()
                if self["menulist"].getCurrent()[1] == 'wlanstatus':
                        try:
                                from Plugins.SystemPlugins.WirelessLan.plugin import WlanStatus
-                               from Plugins.SystemPlugins.WirelessLan.iwlibs import Wireless
+                               from pythonwifi.iwlibs import Wireless
                        except ImportError:
                                self.session.open(MessageBox, _("The wireless LAN plugin is not installed!\nPlease install it."), type = MessageBox.TYPE_INFO,timeout = 10 )
                        else:   
                                ifobj = Wireless(self.iface) # a Wireless NIC Object
-                               self.wlanresponse = ifobj.getStatistics()
-                               if self.wlanresponse[0] != 19:
-                                       self.session.openWithCallback(self.WlanStatusClosed, WlanStatus,self.iface)
+                               try:
+                                       self.wlanresponse = ifobj.getAPaddr()
+                               except IOError:
+                                       self.wlanresponse = ifobj.getStatistics()
+                               if self.wlanresponse:
+                                       if self.wlanresponse[0] not in (19,95): # 19 = 'No such device', 95 = 'Operation not supported'
+                                               self.session.openWithCallback(self.WlanStatusClosed, WlanStatus,self.iface)
+                                       else:
+                                               # Display Wlan not available Message
+                                               self.showErrorMessage()
                                else:
                                        # Display Wlan not available Message
                                        self.showErrorMessage()
@@ -817,7 +849,7 @@ class AdapterSetupConfiguration(Screen, HelpableScreen):
                if self["menulist"].getCurrent()[1] == 'dns':
                        self["description"].setText(_("Edit the Nameserver configuration of your Dreambox.\n" ) + self.oktext )
                if self["menulist"].getCurrent()[1] == 'scanwlan':
-                       self["description"].setText(_("Scan your network for wireless Access Points and connect to them using your selected wireless device.\n" ) + self.oktext )
+                       self["description"].setText(_("Scan your network for wireless access points and connect to them using your selected wireless device.\n" ) + self.oktext )
                if self["menulist"].getCurrent()[1] == 'wlanstatus':
                        self["description"].setText(_("Shows the state of your wireless LAN connection.\n" ) + self.oktext )
                if self["menulist"].getCurrent()[1] == 'lanrestart':
@@ -834,7 +866,7 @@ class AdapterSetupConfiguration(Screen, HelpableScreen):
                self["IF"].setText(iNetwork.getFriendlyAdapterName(self.iface))
                self["Statustext"].setText(_("Link:"))
                
-               if self.iface == 'wlan0' or self.iface == 'ath0':
+               if self.iface in iNetwork.wlan_interfaces:
                        try:
                                from Plugins.SystemPlugins.WirelessLan.Wlan import iStatus
                        except:
@@ -884,17 +916,24 @@ class AdapterSetupConfiguration(Screen, HelpableScreen):
 
        def AdapterSetupClosed(self, *ret):
                if ret is not None and len(ret):
-                       if ret[0] == 'ok' and (self.iface == 'wlan0' or self.iface == 'ath0') and iNetwork.getAdapterAttribute(self.iface, "up") is True:
+                       if ret[0] == 'ok' and (self.iface in iNetwork.wlan_interfaces) and iNetwork.getAdapterAttribute(self.iface, "up") is True:
                                try:
                                        from Plugins.SystemPlugins.WirelessLan.plugin import WlanStatus
-                                       from Plugins.SystemPlugins.WirelessLan.iwlibs import Wireless
+                                       from pythonwifi.iwlibs import Wireless
                                except ImportError:
                                        self.session.open(MessageBox, _("The wireless LAN plugin is not installed!\nPlease install it."), type = MessageBox.TYPE_INFO,timeout = 10 )
                                else:   
                                        ifobj = Wireless(self.iface) # a Wireless NIC Object
-                                       self.wlanresponse = ifobj.getStatistics()
-                                       if self.wlanresponse[0] != 19:
-                                               self.session.openWithCallback(self.WlanStatusClosed, WlanStatus,self.iface)
+                                       try:
+                                               self.wlanresponse = ifobj.getAPaddr()
+                                       except IOError:
+                                               self.wlanresponse = ifobj.getStatistics()
+                                       if self.wlanresponse:
+                                               if self.wlanresponse[0] not in (19,95): # 19 = 'No such device', 95 = 'Operation not supported'
+                                                       self.session.openWithCallback(self.WlanStatusClosed, WlanStatus,self.iface)
+                                               else:
+                                                       # Display Wlan not available Message
+                                                       self.showErrorMessage()
                                        else:
                                                # Display Wlan not available Message
                                                self.showErrorMessage()
@@ -905,7 +944,7 @@ class AdapterSetupConfiguration(Screen, HelpableScreen):
 
        def WlanStatusClosed(self, *ret):
                if ret is not None and len(ret):
-                       from Plugins.SystemPlugins.WirelessLan.Wlan import iStatus,Status
+                       from Plugins.SystemPlugins.WirelessLan.Wlan import iStatus
                        iStatus.stopWlanConsole()
                        self.updateStatusbar()
 
@@ -913,7 +952,7 @@ class AdapterSetupConfiguration(Screen, HelpableScreen):
                if ret[0] is not None:
                        self.session.openWithCallback(self.AdapterSetupClosed, AdapterSetup, self.iface,ret[0],ret[1])
                else:
-                       from Plugins.SystemPlugins.WirelessLan.Wlan import iStatus,Status
+                       from Plugins.SystemPlugins.WirelessLan.Wlan import iStatus
                        iStatus.stopWlanConsole()
                        self.updateStatusbar()
                        
@@ -1263,6 +1302,7 @@ class NetworkAdapterTest(Screen):
                self.nextStepTimer.stop()
 
        def layoutFinished(self):
+               self.setTitle(_("Network test: ") + iNetwork.getFriendlyAdapterName(self.iface) )
                self["shortcutsyellow"].setEnabled(False)
                self["AdapterInfo_OK"].hide()
                self["NetworkInfo_Check"].hide()
@@ -1282,7 +1322,7 @@ class NetworkAdapterTest(Screen):
                self["AdapterInfo_Text"] = MultiColorLabel(_("Show Info"))
                self["AdapterInfo_OK"] = Pixmap()
                
-               if self.iface == 'wlan0' or self.iface == 'ath0':
+               if self.iface in iNetwork.wlan_interfaces:
                        self["Networktext"] = MultiColorLabel(_("Wireless Network"))
                else:
                        self["Networktext"] = MultiColorLabel(_("Local Network"))
@@ -1321,9 +1361,9 @@ class NetworkAdapterTest(Screen):
                self["InfoText"] = Label()
 
        def getLinkState(self,iface):
-               if iface == 'wlan0' or iface == 'ath0':
+               if iface in iNetwork.wlan_interfaces:
                        try:
-                               from Plugins.SystemPlugins.WirelessLan.Wlan import iStatus,Status
+                               from Plugins.SystemPlugins.WirelessLan.Wlan import iStatus
                        except:
                                        self["Network"].setForegroundColorNum(1)
                                        self["Network"].setText(_("disconnected"))
@@ -1405,7 +1445,7 @@ class NetworkAdapterTest(Screen):
                iNetwork.stopLinkStateConsole()
                iNetwork.stopDNSConsole()
                try:
-                       from Plugins.SystemPlugins.WirelessLan.Wlan import iStatus,Status
+                       from Plugins.SystemPlugins.WirelessLan.Wlan import iStatus
                except ImportError:
                        pass
                else:
index 147ff0a..f2db055 100755 (executable)
--- a/po/ar.po
+++ b/po/ar.po
@@ -7,14 +7,14 @@ msgid ""
 msgstr ""
 "Project-Id-Version: tuxbox-enigma 0.0.1\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-06-09 10:31+0000\n"
-"PO-Revision-Date: 2010-07-23 12:13+0200\n"
-"Last-Translator: Mladen <acid-burn@opendreambox.org>\n"
+"POT-Creation-Date: 2010-09-29 09:15+0000\n"
+"PO-Revision-Date: 2010-08-20 00:08+0200\n"
+"Last-Translator: Hazem <moustafagamal@hotmail.com>\n"
 "Language-Team: Arabic <moustafagamal@hotmail.com>\n"
-"Language: ar\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
+"Language: ar\n"
 "Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 "
 "&& n%100<=10 ? 3 : n%100>=11 ? 4 : 5;\n"
 "X-Generator: Pootle 2.0.3\n"
@@ -143,6 +143,9 @@ msgstr "النتائج"
 msgid " extensions."
 msgstr "الاضافات"
 
+msgid " ms"
+msgstr ""
+
 msgid " packages selected."
 msgstr "الحزم المختاره"
 
@@ -253,9 +256,8 @@ msgstr "1"
 msgid "1 wireless network found!"
 msgstr "تم العثور على شبكه لاسلكيه"
 
-#
 msgid "1.0"
-msgstr ""
+msgstr "1.0"
 
 msgid "1.1"
 msgstr "1.1"
@@ -289,9 +291,8 @@ msgstr "16:9"
 msgid "16:9 Letterbox"
 msgstr ""
 
-#
 msgid "16:9 always"
-msgstr ""
+msgstr "16:9 دائما"
 
 #
 msgid "18 V"
@@ -327,9 +328,8 @@ msgstr "5"
 msgid "5 minutes"
 msgstr "5 دقائق"
 
-#
 msgid "6"
-msgstr ""
+msgstr "6"
 
 msgid "60 minutes"
 msgstr "60 دقيقه"
@@ -365,6 +365,12 @@ msgstr "؟؟"
 msgid "A"
 msgstr "أ"
 
+msgid "A basic ftp client"
+msgstr ""
+
+msgid "A client for www.dyndns.org"
+msgstr ""
+
 #, python-format
 msgid ""
 "A configuration file (%s) was modified since Installation.\n"
@@ -393,6 +399,12 @@ msgstr ""
 msgid "A graphical EPG for all services of an specific bouquet"
 msgstr "دليل برامج الكترونى بيانى لكل قنوات باقه معينه"
 
+msgid "A graphical EPG interface"
+msgstr ""
+
+msgid "A graphical EPG interface."
+msgstr ""
+
 msgid ""
 "A mount entry with this name already exists!\n"
 "Update existing entry and continue?\n"
@@ -400,6 +412,15 @@ msgstr ""
 "يوجد مدخل إعتلاء بنفس الاسم ! \n"
 "هل تريد تحديث المدخل الحالى والاستمرار ؟ \n"
 
+msgid "A nice looking HD skin from Kerni"
+msgstr ""
+
+msgid "A nice looking HD skin in Brushed Alu Design from Kerni."
+msgstr ""
+
+msgid "A nice looking skin from Kerni"
+msgstr ""
+
 #, python-format
 msgid ""
 "A record has been started:\n"
@@ -443,6 +464,9 @@ msgstr ""
 "\n"
 "هل تريد تعطيل واجهه الشبكه الثانيه ؟"
 
+msgid "A simple downloading application for other plugins"
+msgstr ""
+
 #
 msgid ""
 "A sleep timer wants to set your\n"
@@ -504,6 +528,12 @@ msgstr "عن"
 msgid "About..."
 msgstr "عـن..."
 
+msgid "Access to the ARD-Mediathek"
+msgstr ""
+
+msgid "Access to the ARD-Mediathek online video database."
+msgstr ""
+
 #
 msgid "Accesspoint:"
 msgstr "نقطة وصول"
@@ -629,6 +659,12 @@ msgstr ""
 "الامكان. إذا كانت النتيجه مرضيه أضغط موافقلاغلاق النافذه ، أو استخدم مفاتيح "
 "الارقام لاختيار شاشات اختبار أخرى"
 
+msgid "Adult streaming plugin"
+msgstr ""
+
+msgid "Adult streaming plugin."
+msgstr ""
+
 #
 msgid "Advanced Options"
 msgstr "إختيارات متقدمه"
@@ -653,6 +689,11 @@ msgstr "إعدادات فيديو متقدمه"
 msgid "Advanced restore"
 msgstr "إستعاده متقدمه"
 
+msgid ""
+"After a reboot or power outage, StartupToStandby will bring your Dreambox to "
+"standby-mode."
+msgstr ""
+
 #
 msgid "After event"
 msgstr "بعد الحدث"
@@ -664,6 +705,9 @@ msgstr ""
 "إذا أردت حمايه خدمه واحده بعد انتهاء نافذه البدأأرجع الى دليل المستخدم لتعرف "
 "كيف تفعل ذلك"
 
+msgid "Ai.HD skin-style control plugin"
+msgstr ""
+
 #
 msgid "Album"
 msgstr "البوم"
@@ -686,6 +730,12 @@ msgstr "مؤقت غير متكرر"
 msgid "Allow zapping via Webinterface"
 msgstr "السماح بالتنقل من خلال واجهة الشبكه"
 
+msgid "Allows the execution of TuxboxPlugins."
+msgstr ""
+
+msgid "Allows user to download files from rapidshare in the background."
+msgstr ""
+
 #
 msgid "Alpha"
 msgstr "الفا"
@@ -697,6 +747,9 @@ msgstr "وضع راديو بديل"
 msgid "Alternative services tuner priority"
 msgstr "أولوية الموالف للقنوات البديله"
 
+msgid "Always ask"
+msgstr ""
+
 #
 msgid "Always ask before sending"
 msgstr "اسأل دائما قبل الارسال"
@@ -783,6 +836,9 @@ msgstr "أسال المستخدم"
 msgid "Aspect Ratio"
 msgstr "نسبة الجانب"
 
+msgid "Assigning providers/services/caids to a CI module"
+msgstr ""
+
 msgid "Atheros"
 msgstr "اثيروس"
 
@@ -801,6 +857,11 @@ msgstr ""
 msgid "Audio Sync Setup"
 msgstr ""
 
+msgid ""
+"AudoSync allows delaying the sound output (Bitstream/PCM) so that it is "
+"synchronous to the picture."
+msgstr ""
+
 msgid "Australia"
 msgstr "استراليا"
 
@@ -841,6 +902,11 @@ msgstr "إعدادات المؤقت الالى"
 msgid "AutoTimer overview"
 msgstr "معاينة المؤقت الالى"
 
+msgid ""
+"AutoTimer scans the EPG and creates Timers depending on user-defined search  "
+"criteria."
+msgstr ""
+
 msgid "Automatic"
 msgstr "آلى"
 
@@ -848,6 +914,32 @@ msgstr "آلى"
 msgid "Automatic Scan"
 msgstr "بحث آلـى"
 
+msgid "Automatic volume adjustment"
+msgstr ""
+
+msgid "Automatic volume adjustment for ac3/dts services."
+msgstr ""
+
+msgid "Automatically change video resolution"
+msgstr ""
+
+msgid ""
+"Automatically changes the output resolution depending on the video "
+"resolution you are watching."
+msgstr ""
+
+msgid "Automatically create timer events based on keywords"
+msgstr ""
+
+msgid "Automatically informs you on low internal memory"
+msgstr ""
+
+msgid "Automatically refresh EPG"
+msgstr ""
+
+msgid "Automatically send crashlogs to Dream Multimedia"
+msgstr ""
+
 msgid "Autos & Vehicles"
 msgstr "سيارات ومركبات"
 
@@ -865,6 +957,12 @@ msgstr "ب"
 msgid "BA"
 msgstr "ب أ"
 
+msgid "BASIC-HD Skin by Ismail Demir"
+msgstr ""
+
+msgid "BASIC-HD Skin for Dreambox Images created from Ismail Demir"
+msgstr ""
+
 #
 msgid "BB"
 msgstr "ب ب"
@@ -943,6 +1041,12 @@ msgstr "منع الحد من الضوضاء"
 msgid "Blue boost"
 msgstr "الدعم الازرق"
 
+msgid "Bonjour/Avahi control plugin"
+msgstr ""
+
+msgid "Bonjour/Avahi control plugin."
+msgstr ""
+
 msgid "Bookmarks"
 msgstr "الاشارات المرجعيه"
 
@@ -956,6 +1060,12 @@ msgstr "البرازيل"
 msgid "Brightness"
 msgstr "الإضاءه"
 
+msgid "Browse for and connect to network shares"
+msgstr ""
+
+msgid "Browse for nfs/cifs shares and connect to them."
+msgstr ""
+
 #
 msgid "Browse network neighbourhood"
 msgstr ""
@@ -972,6 +1082,9 @@ msgstr "حرق الصوره الحاليه الى دى فى دى"
 msgid "Burn to DVD"
 msgstr "حرق الى دى فى دى"
 
+msgid "Burn your recordings to DVD"
+msgstr ""
+
 #
 msgid "Bus: "
 msgstr "الناقل"
@@ -990,6 +1103,11 @@ msgstr "سي باند"
 msgid "CDInfo"
 msgstr "بيانات القرص المدمج"
 
+msgid ""
+"CDInfo enables gathering album and track details from CDDB and CD-Text when "
+"playing Audio CDs in Mediaplayer."
+msgstr ""
+
 #
 msgid "CI assignment"
 msgstr ""
@@ -1009,6 +1127,9 @@ msgstr "كابل"
 msgid "Cache Thumbnails"
 msgstr ""
 
+msgid "Callmonitor for the Fritz!Box routers"
+msgstr ""
+
 # File: tmp/enigma2_plugins/genuinedreambox/src/plugin.py, line: 108
 msgid "Can't connect to server. Please check your network!"
 msgstr "تعذر الاتصال بالخادم. رجاء فحص الشبكه !"
@@ -1085,6 +1206,9 @@ msgstr "تغيير مقاس الخطوه"
 msgid "Change the hostname of your Dreambox."
 msgstr "تغيير أسم المضيف للدريم بوكس"
 
+msgid "Changelog"
+msgstr ""
+
 #
 msgid "Channel"
 msgstr "قناه"
@@ -1143,6 +1267,9 @@ msgstr "اختار مكان النسخه الإحتياطيه "
 msgid "Choose bouquet"
 msgstr "أختار الباقه"
 
+msgid "Choose image to download"
+msgstr ""
+
 #
 msgid "Choose target folder"
 msgstr "أختار المجلد الهدف"
@@ -1175,6 +1302,12 @@ msgstr "نافذة التنظيف"
 msgid "Cleanup Wizard settings"
 msgstr "إعدادات نافذة التنظيف"
 
+msgid "Cleanup timerlist automatically"
+msgstr ""
+
+msgid "Cleanup timerlist automatically."
+msgstr ""
+
 msgid "CleanupWizard"
 msgstr "نافذة التنظيف"
 
@@ -1278,6 +1411,9 @@ msgstr "تكوين الواجهه"
 msgid "Configure nameservers"
 msgstr "تكوين اسم الخادم"
 
+msgid "Configure your WLAN network interface"
+msgstr ""
+
 msgid "Configure your internal LAN"
 msgstr "تكوين شبكتك الداخليه"
 
@@ -1320,6 +1456,30 @@ msgstr "استمرار العرض"
 msgid "Contrast"
 msgstr "تباين"
 
+msgid "Control your Dreambox with your Web browser."
+msgstr ""
+
+msgid "Control your Dreambox with your browser"
+msgstr ""
+
+msgid "Control your dreambox with only the MUTE button"
+msgstr ""
+
+msgid "Control your dreambox with only the MUTE button."
+msgstr ""
+
+msgid "Control your internal system fan."
+msgstr ""
+
+msgid "Control your kids's tv usage"
+msgstr ""
+
+msgid "Control your system fan"
+msgstr ""
+
+msgid "Copy, rename, delete, move local files on your Dreambox."
+msgstr ""
+
 #
 msgid "Could not connect to Dreambox .NFI Image Feed Server:"
 msgstr "NFIتعذر إتصال الدريم بوكس بخادم تغذية صور "
@@ -1362,6 +1522,12 @@ msgstr ""
 msgid "Create DVD-ISO"
 msgstr "تكوين دى فى دى إيزو"
 
+msgid "Create a backup of your Video DVD on your DreamBox hard drive."
+msgstr ""
+
+msgid "Create a backup of your Video-DVD"
+msgstr ""
+
 msgid "Create a new AutoTimer."
 msgstr "تكوين مؤقت آلى جديد"
 
@@ -1374,6 +1540,15 @@ msgstr "أنشأ مؤقت جديد باستخدام نافذه الاعدادا
 msgid "Create movie folder failed"
 msgstr "فشل إنشاء مجلد أفلام"
 
+msgid "Create preview pictures of your Movies"
+msgstr ""
+
+msgid "Create remote timers"
+msgstr ""
+
+msgid "Create timers on remote Dreamboxes."
+msgstr ""
+
 #, python-format
 msgid "Creating directory %s failed."
 msgstr "فشل إنشاء دليل %s"
@@ -1389,6 +1564,9 @@ msgstr "كرواتى"
 msgid "Current Transponder"
 msgstr "التردد الحالى"
 
+msgid "Current device: "
+msgstr ""
+
 msgid "Current settings:"
 msgstr "الاعدادات الحاليه:"
 
@@ -1398,6 +1576,9 @@ msgstr "القيمه الحاليه:"
 msgid "Current version:"
 msgstr "الاصدار الحالى:"
 
+msgid "Currently installed image"
+msgstr ""
+
 #
 #, python-format
 msgid "Custom (%s)"
@@ -1426,9 +1607,31 @@ msgstr ""
 msgid "Customize"
 msgstr "تخصيص"
 
+msgid "Customize Vali-XD skins"
+msgstr ""
+
+msgid "Customize Vali-XD skins by yourself."
+msgstr ""
+
 msgid "Cut"
 msgstr "قطع"
 
+msgid "Cut your movies"
+msgstr ""
+
+msgid "Cut your movies."
+msgstr ""
+
+msgid "CutListEditor allows you to edit your movies"
+msgstr ""
+
+msgid ""
+"CutListEditor allows you to edit your movies.\n"
+"Seek to the start of the stuff you want to cut away. Press OK, select 'start "
+"cut'.\n"
+"Then seek to the end, press OK, select 'end cut'. That's it."
+msgstr ""
+
 msgid "Cutlist editor..."
 msgstr "محرر قائمة القطع..."
 
@@ -1466,6 +1669,15 @@ msgstr "قائمة عناوين دى فى دى"
 msgid "DVD media toolbox"
 msgstr "صندوق أدوات وسيط دى فى دى"
 
+msgid "DVDPlayer plays your DVDs on your Dreambox"
+msgstr ""
+
+msgid ""
+"DVDPlayer plays your DVDs on your Dreambox.\n"
+"With the DVDPlayer you can play your DVDs on your Dreambox from a DVD or "
+"even from an iso file or video_ts folder on your harddisc or network."
+msgstr ""
+
 msgid "Danish"
 msgstr "دنماركى"
 
@@ -1507,6 +1719,12 @@ msgstr "قوائم القنوات الافتراضيه"
 msgid "Defaults"
 msgstr "الافتراضيات"
 
+msgid "Define a startup service"
+msgstr ""
+
+msgid "Define a startup service for your Dreambox."
+msgstr ""
+
 #
 msgid "Delay"
 msgstr "تأخير"
@@ -1552,6 +1770,9 @@ msgstr "الدليل الوجهه"
 msgid "Details for extension: "
 msgstr "تفاصيل الاضافه:"
 
+msgid "Details for plugin: "
+msgstr ""
+
 msgid "Detected HDD:"
 msgstr "يوجد قرص صلب:"
 
@@ -1591,6 +1812,9 @@ msgstr "حذف الكفاف الرقمى"
 msgid "Dir:"
 msgstr "دليل:"
 
+msgid "Direct playback of Youtube videos"
+msgstr ""
+
 msgid "Direct playback of linked titles without menu"
 msgstr "عرض مباشر لعناوين مربوطه بدون قائمه"
 
@@ -1659,6 +1883,12 @@ msgstr "عرض و واجهه مستخدم"
 msgid "Display search results by:"
 msgstr "إظهار نتائج البحث بـ :"
 
+msgid "Display your photos on the TV"
+msgstr ""
+
+msgid "Displays movie information from the InternetMovieDatabase"
+msgstr ""
+
 #, python-format
 msgid ""
 "Do you really want to REMOVE\n"
@@ -1716,6 +1946,10 @@ msgstr "هل تريد عمل بحث"
 msgid "Do you want to do another manual service scan?"
 msgstr "هل تريد عمل بحث يدوى جديد ؟"
 
+#, python-format
+msgid "Do you want to download the image to %s ?"
+msgstr ""
+
 msgid "Do you want to enable the parental control feature on your dreambox?"
 msgstr "هل تريد تفعيل خاصية التحكم الابوى فى الدريم بوكس ؟"
 
@@ -1795,6 +2029,10 @@ msgstr "تم - تثبيت ، تحديث أو حذف %d الرزم والاخطا
 msgid "Download"
 msgstr "تحميل"
 
+#, python-format
+msgid "Download %s from Server"
+msgstr ""
+
 #
 msgid "Download .NFI-Files for USB-Flasher"
 msgstr ""
@@ -1805,6 +2043,9 @@ msgstr "تحميل بلج إنز"
 msgid "Download Video"
 msgstr "تحميل فيديو"
 
+msgid "Download files from Rapidshare"
+msgstr ""
+
 msgid "Download location"
 msgstr "موقع التحميل"
 
@@ -1856,6 +2097,13 @@ msgstr "إختيار EPG"
 msgid "EPG encoding"
 msgstr ""
 
+msgid ""
+"EPGRefresh will automatically switch to user-defined channels when the box "
+"is idleing\n"
+"(in standby mode without any running recordings) to perform updates of the "
+"epg information on these channels."
+msgstr ""
+
 #
 #, python-format
 msgid "ERROR - failed to scan (%s)!"
@@ -1908,6 +2156,12 @@ msgstr "تحرير قائمة القنوات"
 msgid "Edit settings"
 msgstr "تحرير الاعدادات"
 
+msgid "Edit tags of recorded movies"
+msgstr ""
+
+msgid "Edit tags of recorded movies."
+msgstr ""
+
 #
 msgid "Edit the Nameserver configuration of your Dreambox.\n"
 msgstr "تحرير تهيئة اسم الخادم للدريم بوكس. \n"
@@ -1937,6 +2191,9 @@ msgstr "تعليم"
 msgid "Electronic Program Guide"
 msgstr "دليل البرنامج الالكترونى"
 
+msgid "Emailclient is an IMAP4 e-mail viewer for the Dreambox."
+msgstr ""
+
 #
 msgid "Enable"
 msgstr "تفعيل"
@@ -2046,6 +2303,11 @@ msgid "English"
 msgstr "إنجليزى"
 
 msgid ""
+"Enigma2 Plugin to play AVI/DIVX/WMV/etc. videos from PC on your Dreambox. "
+"Needs a running VLC from www.videolan.org on your pc."
+msgstr ""
+
+msgid ""
 "Enigma2 Skinselector\n"
 "\n"
 "If you experience any problems please contact\n"
@@ -2150,6 +2412,9 @@ msgstr "أستبعاد"
 msgid "Execute \"after event\" during timespan"
 msgstr ""
 
+msgid "Execute TuxboxPlugins"
+msgstr ""
+
 msgid "Execution Progress:"
 msgstr "درجة تطور التنفيذ:"
 
@@ -2165,6 +2430,9 @@ msgstr "خروج"
 msgid "Exit editor"
 msgstr "خروج من المحرر"
 
+msgid "Exit input device selection."
+msgstr ""
+
 msgid "Exit network wizard"
 msgstr "خروج من نافذة إعدادات الشبكه"
 
@@ -2201,6 +2469,11 @@ msgstr "التحكم فى الاضافات"
 msgid "FEC"
 msgstr "FEC"
 
+msgid ""
+"FTPBrowser allows uploading and downloading files between your Dreambox and "
+"a server using the file transfer protocol."
+msgstr ""
+
 msgid "Factory reset"
 msgstr "العوده الى إعدادات المصنع"
 
@@ -2287,6 +2560,9 @@ msgstr "تم النتهاء من إعادة تشغيل الشبكه"
 msgid "Finnish"
 msgstr "إنتهاء"
 
+msgid "First generate your skin-style with the Ai.HD-Control plugin."
+msgstr ""
+
 #
 msgid ""
 "First we need to download the latest boot environment for the USB flasher."
@@ -2354,6 +2630,12 @@ msgstr "الجمعه"
 msgid "Frisian"
 msgstr ""
 
+msgid "FritzCall shows incoming calls to your Fritz!Box on your Dreambox."
+msgstr ""
+
+msgid "Frontend for /tmp/mmi.socket"
+msgstr ""
+
 #
 #, python-format
 msgid "Frontprocessor version: %d"
@@ -2370,6 +2652,16 @@ msgstr ""
 "يجب إعادة تشغيل الاينجما2 لتطبيق الجلد \n"
 "هل تريد إعادة تشغيل الاينجما2 الان ؟"
 
+msgid "GUI that allows user to change the ftp- / telnet password."
+msgstr ""
+
+msgid ""
+"GUI that allows user to change the ftp-/telnet-password of the Dreambox."
+msgstr ""
+
+msgid "GUI to change the ftp and telnet-password"
+msgstr ""
+
 #
 msgid "Gaming"
 msgstr ""
@@ -2404,13 +2696,31 @@ msgstr "دريم بوكس أصلى"
 msgid "Genuine Dreambox validation failed!"
 msgstr ""
 
+msgid "Genuine Dreambox verification"
+msgstr ""
+
 #
 msgid "German"
 msgstr "المانـى"
 
+msgid "German storm information"
+msgstr ""
+
+msgid "German traffic information"
+msgstr ""
+
 msgid "Germany"
 msgstr "المانيا"
 
+msgid "Get AudioCD info from CDDB and CD-Text"
+msgstr ""
+
+msgid "Get latest experimental image"
+msgstr ""
+
+msgid "Get latest release image"
+msgstr ""
+
 #
 msgid "Getting plugin information. Please wait..."
 msgstr "جارى الحصول على معلومات عن البلج إن. رجاء الانتظار..."
@@ -2426,6 +2736,14 @@ msgstr "الذهاب الى 0"
 msgid "Goto position"
 msgstr "الذهل للموضع"
 
+msgid "GraphMultiEPG shows a graphical timeline EPG"
+msgstr ""
+
+msgid ""
+"GraphMultiEPG shows a graphical timeline EPG.\n"
+"Shows a nice overview of all running und upcoming tv shows."
+msgstr ""
+
 #
 msgid "Graphical Multi EPG"
 msgstr "دليل برامج بيانى متعدد"
@@ -2439,6 +2757,12 @@ msgstr "اليونان"
 msgid "Green boost"
 msgstr "دعم أخضر"
 
+msgid ""
+"Growlee allows your Dreambox to send short messages using the growl "
+"protocol\n"
+"like Recording started notifications to a PC running a growl client"
+msgstr ""
+
 msgid "Guard Interval"
 msgstr "فاصل الحرس"
 
@@ -2502,6 +2826,9 @@ msgstr "هونج كونج"
 msgid "Horizontal"
 msgstr "أفقـى"
 
+msgid "Hotplugging for removeable devices"
+msgstr ""
+
 msgid "How many minutes do you want to record?"
 msgstr "كم دقيقه تريد أن تسجل ؟"
 
@@ -2518,6 +2845,9 @@ msgstr "درجة لون"
 msgid "Hungarian"
 msgstr "مجرى"
 
+msgid "IMAP4 e-mail viewer for the Dreambox"
+msgstr ""
+
 #
 msgid "IP Address"
 msgstr "عنوان IP"
@@ -2526,6 +2856,9 @@ msgstr "عنوان IP"
 msgid "IP:"
 msgstr ""
 
+msgid "IRC Client for Enigma2"
+msgstr ""
+
 msgid "ISO file is too large for this filesystem!"
 msgstr "ملف الايزو كبير جدا على ملفات النظام !"
 
@@ -2656,6 +2989,12 @@ msgstr "تفعيل القرص الصلب"
 msgid "Input"
 msgstr "مدخل"
 
+msgid "Input device setup"
+msgstr ""
+
+msgid "Input devices"
+msgstr ""
+
 #
 msgid "Install"
 msgstr "تثبيت"
@@ -2723,6 +3062,9 @@ msgstr "الفلاش الداخلى"
 msgid "Internal LAN adapter."
 msgstr "محول شبكه محليه داخلى"
 
+msgid "Internal firmware updater"
+msgstr ""
+
 msgid "Invalid Location"
 msgstr "موقع غير صالح"
 
@@ -2778,6 +3120,12 @@ msgstr ""
 msgid "Italian"
 msgstr "إيطالى"
 
+msgid "Italian Weather forecast on Dreambox"
+msgstr ""
+
+msgid "Italian Weather forecast on Dreambox from www.google.it."
+msgstr ""
+
 msgid "Italy"
 msgstr "إيطاليا"
 
@@ -2793,6 +3141,51 @@ msgstr ""
 msgid "Just Scale"
 msgstr ""
 
+msgid "Kerni's BrushedAlu-HD skin"
+msgstr ""
+
+msgid "Kerni's DreamMM-HD skin"
+msgstr ""
+
+msgid "Kerni's Elgato-HD skin"
+msgstr ""
+
+msgid "Kerni's SWAIN skin"
+msgstr ""
+
+msgid "Kerni's SWAIN-HD skin"
+msgstr ""
+
+msgid "Kerni's UltraViolet skin"
+msgstr ""
+
+msgid "Kerni's YADS-HD skin"
+msgstr ""
+
+msgid "Kerni's dTV-HD skin"
+msgstr ""
+
+msgid "Kerni's dTV-HD-Reloaded skin"
+msgstr ""
+
+msgid "Kerni's dmm-HD skin"
+msgstr ""
+
+msgid "Kerni's dreamTV-HD skin"
+msgstr ""
+
+msgid "Kerni's simple skin"
+msgstr ""
+
+msgid "Kerni-HD1 skin"
+msgstr ""
+
+msgid "Kerni-HD1R2 skin"
+msgstr ""
+
+msgid "Kernis HD1 skin"
+msgstr ""
+
 #
 #, python-format
 msgid "Key %(Key)s successfully set to %(delay)i ms"
@@ -2818,6 +3211,9 @@ msgstr "ضبط لوحه المفاتيح"
 msgid "Keymap"
 msgstr "خريطه المفاتيح"
 
+msgid "KiddyTimer allows to control your kids's daily tv usage."
+msgstr ""
+
 #
 msgid "LAN Adapter"
 msgstr "محول شبكه محليه"
@@ -2913,6 +3309,12 @@ msgstr ""
 msgid "List of Storage Devices"
 msgstr "قائمة أجهزة التخزين"
 
+msgid "Listen and record internet radio"
+msgstr ""
+
+msgid "Listen and record shoutcast internet radio on your Dreambox."
+msgstr ""
+
 #
 msgid "Lithuanian"
 msgstr "ليتوانى"
@@ -3006,9 +3408,22 @@ msgstr "أجعل هذه العلامه مجرد علامه"
 msgid "Manage extensions"
 msgstr "التحكم فى الاضافات"
 
+msgid "Manage local files"
+msgstr ""
+
+msgid "Manage logos to display at boot time or while in radio mode."
+msgstr ""
+
+msgid "Manage logos to display at boottime"
+msgstr ""
+
 msgid "Manage network shares"
 msgstr "التحكم فى مشاركات الشبكه"
 
+msgid ""
+"Manage your music files in a database, play it with Merlin Music Player."
+msgstr ""
+
 msgid "Manage your network shares..."
 msgstr "التحكم فى مشاركات شبكتك ..."
 
@@ -3067,6 +3482,17 @@ msgstr "مشغل الوسائط"
 msgid "MediaPlayer"
 msgstr "مشغل الـوسائط"
 
+msgid ""
+"MediaScanner scans devices for playable media files and displays a menu with "
+"possible actions like viewing pictures or playing movies."
+msgstr ""
+
+msgid ""
+"Mediaplayer plays your favorite music and videos.\n"
+"Play all your favorite music and video files, organize them in playlists, "
+"view cover and album information."
+msgstr ""
+
 #
 msgid "Medium is not a writeable DVD!"
 msgstr ""
@@ -3078,6 +3504,9 @@ msgstr "الوسيط غير فارغ"
 msgid "Menu"
 msgstr "قائمه"
 
+msgid "Merlin Music Player and iDream"
+msgstr ""
+
 #
 msgid "Message"
 msgstr "رسـاله"
@@ -3240,9 +3669,24 @@ msgstr "حرك الشاشه لأعلى"
 msgid "Move west"
 msgstr "تحرك للغرب"
 
+msgid "Movie information from the Online Film Datenbank (German)."
+msgstr ""
+
+msgid "Movie informations from the Online Film Datenbank"
+msgstr ""
+
 msgid "Movie location"
 msgstr "مكان الفيلم"
 
+msgid ""
+"MovieTagger adds tags to recorded movies to sort a large list of movies."
+msgstr ""
+
+msgid ""
+"Movielist Preview creates screenshots of recordings and shows them inside "
+"the movielist."
+msgstr ""
+
 msgid "Movielist menu"
 msgstr "قائمة سجل الافلام"
 
@@ -3343,6 +3787,102 @@ msgstr "ضبط أسم الخادم"
 msgid "Nameserver settings"
 msgstr "إعدادات اسم الخادم"
 
+msgid "Nemesis BlackBox Skin"
+msgstr ""
+
+msgid "Nemesis BlackBox Skin for the Dreambox"
+msgstr ""
+
+msgid "Nemesis Blueline Single Skin"
+msgstr ""
+
+msgid "Nemesis Blueline Single Skin for the Dreambox"
+msgstr ""
+
+msgid "Nemesis Blueline Skin"
+msgstr ""
+
+msgid "Nemesis Blueline Skin for the Dreambox"
+msgstr ""
+
+msgid "Nemesis Blueline.Extended Skin"
+msgstr ""
+
+msgid "Nemesis Blueline.Extended Skin for the Dreambox"
+msgstr ""
+
+msgid "Nemesis ChromeLine Cobolt Skin"
+msgstr ""
+
+msgid "Nemesis ChromeLine Cobolt Skin for the Dreambox"
+msgstr ""
+
+msgid "Nemesis ChromeLine Skin"
+msgstr ""
+
+msgid "Nemesis ChromeLine Skin for the Dreambox"
+msgstr ""
+
+msgid "Nemesis Flatline Blue Skin"
+msgstr ""
+
+msgid "Nemesis Flatline Blue Skin for the Dreambox"
+msgstr ""
+
+msgid "Nemesis Flatline Skin"
+msgstr ""
+
+msgid "Nemesis Flatline Skin for the Dreambox"
+msgstr ""
+
+msgid "Nemesis GlassLine Skin"
+msgstr ""
+
+msgid "Nemesis GlassLine Skin for the Dreambox"
+msgstr ""
+
+msgid "Nemesis Greenline Extended Skin"
+msgstr ""
+
+msgid "Nemesis Greenline Extended Skin for the Dreambox"
+msgstr ""
+
+msgid "Nemesis Greenline Single Skin"
+msgstr ""
+
+msgid "Nemesis Greenline Single Skin for the Dreambox"
+msgstr ""
+
+msgid "Nemesis Greenline Skin"
+msgstr ""
+
+msgid "Nemesis Greenline Skin for the Dreambox"
+msgstr ""
+
+msgid "Nemesis Greyline Extended Skin"
+msgstr ""
+
+msgid "Nemesis Greyline Extended Skin for the Dreambox"
+msgstr ""
+
+msgid "Nemesis Greyline Single Skin"
+msgstr ""
+
+msgid "Nemesis Greyline Single Skin for the Dreambox"
+msgstr ""
+
+msgid "Nemesis Greyline Skin"
+msgstr ""
+
+msgid "Nemesis Greyline Skin for the Dreambox"
+msgstr ""
+
+msgid "Nemesis ShadowLine Skin"
+msgstr ""
+
+msgid "Nemesis ShadowLine Skin for the Dreambox"
+msgstr ""
+
 msgid "Netmask"
 msgstr "قناع الشبكه"
 
@@ -3594,6 +4134,9 @@ msgstr "لا ، لا تفعل شيئ"
 msgid "No, just start my dreambox"
 msgstr "لا ، فقط قم بتشغيل الدريم بوكس"
 
+msgid "No, never"
+msgstr ""
+
 msgid "No, not now"
 msgstr "لا ، ليس الان"
 
@@ -3748,10 +4291,19 @@ msgstr "الوضع المدارى"
 msgid "Outer Bound (+/-)"
 msgstr ""
 
+msgid "Overlay for scrolling bars"
+msgstr ""
+
 #
 msgid "Override found with alternative service"
 msgstr ""
 
+msgid "Overwrite configuration files ?"
+msgstr ""
+
+msgid "Overwrite configuration files during software upgrade?"
+msgstr ""
+
 #
 msgid "PAL"
 msgstr "بال"
@@ -3803,6 +4355,11 @@ msgstr "اعداد التحكم الابوى"
 msgid "Parental control type"
 msgstr "نوع التحكم الابوى"
 
+msgid ""
+"Partnerbox allows editing a remote Dreambox's record timers and stream its "
+"TV  program."
+msgstr ""
+
 #
 msgid "Password"
 msgstr "كلمة المرور"
@@ -3814,6 +4371,9 @@ msgstr "إيقاف الفيلم عند النهايه"
 msgid "People & Blogs"
 msgstr ""
 
+msgid "PermanentClock shows the clock permanently on the screen."
+msgstr ""
+
 #
 msgid "Pets & Animals"
 msgstr ""
@@ -3859,6 +4419,12 @@ msgstr "تشغيل موسيقى"
 msgid "Play YouTube movies"
 msgstr "تشغيل افلام يوتيوب"
 
+msgid "Play music from Last.fm"
+msgstr ""
+
+msgid "Play music from Last.fm."
+msgstr ""
+
 #
 msgid "Play next video"
 msgstr "تشغيل الفيديو التالى"
@@ -3871,6 +4437,21 @@ msgstr "عرض الافلام المسجله"
 msgid "Play video again"
 msgstr "تشغيل الفيديو مره ثانيه"
 
+msgid "Play videos from PC on your Dreambox"
+msgstr ""
+
+msgid "Playback of Youtube through a PC"
+msgstr ""
+
+msgid "Player for Network and Internet Streams"
+msgstr ""
+
+msgid "Player for Network and Internet Streams."
+msgstr ""
+
+msgid "Plays your favorite music and videos"
+msgstr ""
+
 msgid "Please Reboot"
 msgstr "من فضلك أعد التشغيل"
 
@@ -3993,6 +4574,9 @@ msgstr "من فضلك أختار الخدمه الفرعيه المطلوب تس
 msgid "Please select a subservice..."
 msgstr "من فضلك أختار الخدمه الفرعيه"
 
+msgid "Please select an NFI file and press green key to flash!"
+msgstr ""
+
 msgid "Please select an extension to remove."
 msgstr "من فضلك أختار الاضافه المطلوب حذفها"
 
@@ -4123,6 +4707,9 @@ msgstr ""
 msgid "Plugins"
 msgstr "بلج إنز"
 
+msgid "PodCast streams podcasts to your Dreambox."
+msgstr ""
+
 msgid "Poland"
 msgstr "بولندا"
 
@@ -4183,6 +4770,9 @@ msgstr "ضبط الموتور"
 msgid "Positioner storage"
 msgstr ""
 
+msgid "PositionerSetup helps you installing a motorized dish"
+msgstr ""
+
 msgid ""
 "Power state to change to after recordings. Select \"standard\" to not change "
 "the default behavior of enigma2 or values changed by yourself."
@@ -4198,10 +4788,19 @@ msgstr ""
 msgid "Predefined transponder"
 msgstr ""
 
+msgid "Prepare another USB stick for image flashing"
+msgstr ""
+
 #
 msgid "Preparing... Please wait"
 msgstr "جارى التجهيز ... رجاء الانتظار"
 
+msgid "Press INFO on your remote control for additional information."
+msgstr ""
+
+msgid "Press MENU on your remote control for additional options."
+msgstr ""
+
 #
 msgid "Press OK on your remote control to continue."
 msgstr "أضغط موافق من الريموت للمتابعه"
@@ -4279,6 +4878,12 @@ msgstr "معاينة المؤقت الالى"
 msgid "Preview menu"
 msgstr "معاينة القائمه"
 
+msgid "Preview screenshots of running tv shows"
+msgstr ""
+
+msgid "Preview screenshots of running tv shows."
+msgstr ""
+
 msgid "Primary DNS"
 msgstr "دى إن اس أبتدائى"
 
@@ -4314,6 +4919,9 @@ msgstr "تم النشر"
 msgid "Python frontend for /tmp/mmi.socket"
 msgstr ""
 
+msgid "Python frontend for /tmp/mmi.socket."
+msgstr ""
+
 msgid "Quick"
 msgstr "سريع"
 
@@ -4330,6 +4938,9 @@ msgstr "مخرج RF"
 msgid "RGB"
 msgstr "RGB"
 
+msgid "RSS viewer"
+msgstr ""
+
 msgid "Radio"
 msgstr "راديو"
 
@@ -4382,6 +4993,12 @@ msgstr "تم تميزها حديثا"
 msgid "Reception Settings"
 msgstr "إعدادات الاستقبال"
 
+msgid "Reconstruct .ap and .sc files"
+msgstr ""
+
+msgid "Reconstruct missing or corrupt .ap and .sc files of recorded movies."
+msgstr ""
+
 #
 msgid "Record"
 msgstr "تسجيل"
@@ -4448,6 +5065,9 @@ msgstr "تذكر الرقم السرى للخدمه"
 msgid "Remember service pin cancel"
 msgstr "إلغاء تذكر الرقم السرى للخدمه"
 
+msgid "Remote timer and remote TV player"
+msgstr ""
+
 msgid "Remove"
 msgstr "حذف"
 
@@ -4504,6 +5124,9 @@ msgstr "إعادة التسميه"
 msgid "Rename crashlogs"
 msgstr "إعادة تسمية سجلات العطب"
 
+msgid "Rename your movies"
+msgstr ""
+
 #
 msgid "Repeat"
 msgstr "إعاده"
@@ -4518,6 +5141,12 @@ msgstr ""
 msgid "Repeats"
 msgstr "إعادات"
 
+msgid "Replace the minute input for the seek functions with a seekbar."
+msgstr ""
+
+msgid "Replace the rewind  input with a seekbar"
+msgstr ""
+
 msgid "Require description to be unique"
 msgstr "يحتاج وصف ليكون فريدا"
 
@@ -4591,6 +5220,9 @@ msgstr "إستعادة التنفيذ"
 msgid "Restore system settings"
 msgstr "إستعادة إعدادات النظام"
 
+msgid "Restore your Dreambox with a USB stick"
+msgstr ""
+
 #
 msgid "Restrict \"after event\" to a certain timespan?"
 msgstr ""
@@ -4686,6 +5318,9 @@ msgstr "ضبط معدات القمر"
 msgid "Satellite equipment"
 msgstr "معدات القمر"
 
+msgid "SatelliteEquipmentControl allows you to fine-tune DiSEqC-settings"
+msgstr ""
+
 #
 msgid "Satellites"
 msgstr "اقمار صناعيه"
@@ -4693,6 +5328,9 @@ msgstr "اقمار صناعيه"
 msgid "Satfinder"
 msgstr "الباحث عن الأقمار"
 
+msgid "Satfinder helps you to align your dish"
+msgstr ""
+
 #
 msgid "Sats"
 msgstr "أقمار"
@@ -4816,6 +5454,9 @@ msgstr ""
 msgid "Scan band US SUPER"
 msgstr ""
 
+msgid "Scan devices for playable media files"
+msgstr ""
+
 msgid "Scan range"
 msgstr "نطاق البحث"
 
@@ -4833,6 +5474,9 @@ msgstr ""
 "أبحث فى الشبكه عن نقاط دخول لاسلكيه وأتصل بهم باستخدامجهزك اللاسلكى "
 "المختار.\n"
 
+msgid "Scans default lamedbs sorted by satellite"
+msgstr ""
+
 #
 msgid ""
 "Scans default lamedbs sorted by satellite with a connected dish positioner"
@@ -4865,6 +5509,9 @@ msgstr "بحث محتويات محدوده:"
 msgid "Search strictness"
 msgstr "دقة البحث"
 
+msgid "Search through the EPG"
+msgstr ""
+
 msgid "Search type"
 msgstr "نوع البحث"
 
@@ -4887,6 +5534,9 @@ msgstr "DNS ثانوى"
 msgid "Security service not running."
 msgstr "خدمة الامن لا تعمل"
 
+msgid "See service-epg (and PiP) from other channels in an infobar."
+msgstr ""
+
 #
 msgid "Seek"
 msgstr "بحـث"
@@ -4934,6 +5584,12 @@ msgstr "اختار القناه التى تريد ان تسجل منها"
 msgid "Select channel to record on"
 msgstr "أختار القناه التى تريد التسجيل عليها"
 
+msgid "Select desired image from feed list"
+msgstr ""
+
+msgid "Select files for backup."
+msgstr ""
+
 msgid "Select files for backup. Currently selected:\n"
 msgstr "أختار ملفات النسخه الاحتياطيه . المختار حاليا:\n"
 
@@ -4943,6 +5599,12 @@ msgstr "أختار ملفات/مجلدات النسخه الاحتياطيه"
 msgid "Select image"
 msgstr "أختار صوره:"
 
+msgid "Select input device"
+msgstr ""
+
+msgid "Select input device."
+msgstr ""
+
 msgid "Select interface"
 msgstr "أختار واجهه"
 
@@ -5070,6 +5732,9 @@ msgstr "معلومات القناه"
 msgid "Services"
 msgstr "القنوات/الخدمات"
 
+msgid "Set Bitstream/PCM audio delays"
+msgstr ""
+
 #
 msgid "Set End Time"
 msgstr "أضبط وقت النتهاء"
@@ -5101,6 +5766,9 @@ msgstr "حدد أقصى مده"
 msgid "Set this NO to disable this AutoTimer."
 msgstr ""
 
+msgid "Sets your Dreambox into Deep-Standby"
+msgstr ""
+
 #
 msgid "Setting key canceled"
 msgstr "تم الغاء مفاتيح الاعداد"
@@ -5193,6 +5861,23 @@ msgstr "إظهار مشغل الراديو..."
 msgid "Show the tv player..."
 msgstr "إظهار مشغل التليفزيون"
 
+msgid "Show webcam pictures on your TV Screen"
+msgstr ""
+
+msgid ""
+"Shows a list containing the zapping-history and allows user to zap to the "
+"entries or to modify them."
+msgstr ""
+
+msgid "Shows a list of recent zap entries"
+msgstr ""
+
+msgid "Shows statistics of watched services"
+msgstr ""
+
+msgid "Shows the clock permanently on the screen"
+msgstr ""
+
 #
 msgid "Shows the state of your wireless LAN connection.\n"
 msgstr "تشاهد حالة إتصال الشبكه المحليه اللاسلكيه \n"
@@ -5224,10 +5909,16 @@ msgstr "إذاعات مماثله :"
 msgid "Simple"
 msgstr "بسيطه"
 
+msgid "Simple IRC GroupChat client for e2 #dm8000-vip channel"
+msgstr ""
+
 #
 msgid "Simple titleset (compatibility for legacy players)"
 msgstr ""
 
+msgid "SimpleRSS allows reading RSS newsfeeds on your Dreambox."
+msgstr ""
+
 #
 msgid "Single"
 msgstr "مفرد"
@@ -5251,6 +5942,9 @@ msgstr ""
 msgid "Skin"
 msgstr "الجلد"
 
+msgid "SkinSelector shows a menu with selectable skins"
+msgstr ""
+
 #
 msgid "Skins"
 msgstr "الجلود"
@@ -5289,12 +5983,21 @@ msgstr "برنامج تشغيلى"
 msgid "Software management"
 msgstr "التحكم فى البرنامج التشغيلى"
 
+msgid "Software manager setup"
+msgstr ""
+
 msgid "Software restore"
 msgstr "إستعادة البرنامج التشغيلى"
 
 msgid "Software update"
 msgstr "ترقية البرنامج التشغيلى"
 
+msgid "SoftwareManager manages your Dreambox software"
+msgstr ""
+
+msgid "Softwaremanager information"
+msgstr ""
+
 msgid "Some plugins are not available:\n"
 msgstr "بعض البلج إنز غير متوفر : \n"
 
@@ -5421,6 +6124,9 @@ msgstr "يبدأ فى"
 msgid "Std. Feeds"
 msgstr ""
 
+msgid "Step by step network configuration"
+msgstr ""
+
 #
 msgid "Step east"
 msgstr "خطوه ناحية الشرق"
@@ -5484,6 +6190,12 @@ msgstr "تخزين الموقع"
 msgid "Stored position"
 msgstr "الوضع المخزن"
 
+msgid "Stream podcasts"
+msgstr ""
+
+msgid "Streaming modules for the orf.at iptv web page."
+msgstr ""
+
 #
 msgid "Subservice list..."
 msgstr "قائمة الخدمات الفرعيه..."
@@ -5608,6 +6320,9 @@ msgstr "وضع الاختبار"
 msgid "Test the network configuration of your Dreambox.\n"
 msgstr "اختبر تكوين الشبكه الخاصه بالدريم بوكس. \n"
 
+msgid "Test your DiSEqC equipment"
+msgstr ""
+
 msgid "Test-Messagebox?"
 msgstr "أختبر صندوق الرسائل ؟"
 
@@ -5634,6 +6349,12 @@ msgstr ""
 "من فضلك أضغط موافق للاستمرار ."
 
 msgid ""
+"The CleanupWizard informs you when the internal free memory of your dreambox "
+"has dropped below a definable threshold.You can use this wizard to remove "
+"some plugins."
+msgstr ""
+
+msgid ""
 "The DVD standard doesn't support H.264 (HDTV) video streams. Do you want to "
 "create a Dreambox format data DVD (which will not play in stand-alone DVD "
 "players) instead?"
@@ -5642,6 +6363,19 @@ msgstr ""
 "دى فى دى للدريم بوكس بدلا من ذلك (هذا لن يعمل فى مشغلات دى فى دى المستقله ) ؟"
 
 msgid ""
+"The Elektro Power Save plugin puts the box from standby to sleep mode (Deep "
+"Standby) at certain times.\n"
+"This only happens if the box is in standby and no recording is running or "
+"sheduled in the next 20 minutes.\n"
+"The box automatically wakes up for recordings or at the end of the sleep "
+"time. You therefore don't have to wait until it is on again."
+msgstr ""
+
+msgid ""
+"The Hotplug plugin notifies your system of newly added or removed devices."
+msgstr ""
+
+msgid ""
 "The NetworkWizard extension is not installed!\n"
 "Please install it."
 msgstr ""
@@ -5649,6 +6383,27 @@ msgstr ""
 "من فضلك قم بتثبيتها ."
 
 msgid ""
+"The PicturePlayer displays your photos on the TV.\n"
+"You can view them as thumbnails or slideshow."
+msgstr ""
+
+msgid ""
+"The Satfinder plugin helps you to align your dish.\n"
+"It shows you informations about signal rate and errors."
+msgstr ""
+
+msgid ""
+"The SkinSelector shows a menu with selectable skins.\n"
+"It's now easy to change the look and feel of your Dreambox."
+msgstr ""
+
+msgid ""
+"The SoftwareManager manages your Dreambox software.\n"
+"It's easy to update your receiver's software, install or remove plugins or "
+"even backup and restore your system settings."
+msgstr ""
+
+msgid ""
 "The Softwaremanagement extension is not installed!\n"
 "Please install it."
 msgstr ""
@@ -5677,6 +6432,27 @@ msgstr ""
 "الـ USB غير قابل للإقلاع . هل تريد أحدث صوره من خادم التغذيه وحفظها فى "
 "الـUSB ؟"
 
+msgid ""
+"The USB stick was prepared to be bootable.\n"
+"Now you can download an NFI image file!"
+msgstr ""
+
+msgid ""
+"The VideoEnhancement plugin provides advanced video enhancement settings."
+msgstr ""
+
+msgid ""
+"The VideoTune helps fine-tuning your tv display.\n"
+"You can control brightness and contrast of your tv."
+msgstr ""
+
+msgid "The Videomode plugin provides advanced video mode settings."
+msgstr ""
+
+msgid ""
+"The WirelessLan plugin helps you configuring your WLAN network interface."
+msgstr ""
+
 msgid "The backup failed. Please choose a different backup location."
 msgstr "فشل عمل نسخه إحتياطيه  ، من فضلك أختار مان آخر للنسخه الإحتياطيه  ."
 
@@ -5739,6 +6515,9 @@ msgstr ""
 msgid "The match attribute is mandatory."
 msgstr "نعت التطابق إجبارى ."
 
+msgid "The md5sum validation failed, the file may be corrupted!"
+msgstr ""
+
 msgid ""
 "The md5sum validation failed, the file may be corrupted! Are you sure that "
 "you want to burn this image to flash memory? You are doing this at your own "
@@ -5779,6 +6558,9 @@ msgstr "الرقمان اللذان اخلتهما غير متطابقين"
 msgid "The results have been written to %s."
 msgstr ""
 
+msgid "The skin is in KingSize-definition 1024x576"
+msgstr ""
+
 #
 msgid "The sleep timer has been activated."
 msgstr "تم تنشيط مؤقت النوم"
@@ -5810,6 +6592,12 @@ msgstr ""
 "من خلال هذه النافذه يمكنك عمل نسخه إحتياطيه  للإعدادات الحاليه . هل تريد عمل "
 "نسخه إحتياطيه  الان ؟"
 
+#, python-format
+msgid ""
+"The wizard found a configuration backup. Do you want to restore your old "
+"settings from %s?"
+msgstr ""
+
 msgid "The wizard is finished now."
 msgstr "إنتهاء نافذة الاعدادات الان ."
 
@@ -5922,6 +6710,16 @@ msgid ""
 "uses."
 msgstr ""
 
+msgid ""
+"This plugin creates a USB stick which can be used to update the firmware of "
+"your Dreambox without the need for a network or WLAN connection.\n"
+"First, a USB stick needs to be prepared so that it becomes bootable.\n"
+"In the next step, an NFI image file can be downloaded from the update server "
+"and saved on the USB stick.\n"
+"If you already have a prepared bootable USB stick, please insert it now. "
+"Otherwise plug in a USB stick with a minimum size of 64 MB!"
+msgstr ""
+
 msgid "This plugin is installed."
 msgstr "هذا البلج إن مثبت ."
 
@@ -5939,6 +6737,11 @@ msgid "This setting controls the behavior when a timer matches a found event."
 msgstr "هذا الاعداد سيتحكم فى التصرف عندمايطابق المؤقت حدث تم العثور عليه"
 
 msgid ""
+"This system tool is internally used to program the hardware with firmware "
+"updates."
+msgstr ""
+
+msgid ""
 "This test checks for configured Nameservers.\n"
 "If you get a \"unconfirmed\" message:\n"
 "- please check your DHCP, cabling and Adapter setup\n"
@@ -6108,6 +6911,18 @@ msgstr "خصائص العنوان"
 msgid "Titleset mode"
 msgstr ""
 
+msgid "To be used as simple downloading application by other Plugins."
+msgstr ""
+
+msgid ""
+"To update your Dreambox firmware, please follow these steps:\n"
+"1) Turn off your box with the rear power switch and make sure the bootable "
+"USB stick is plugged in.\n"
+"2) Turn mains back on and hold the DOWN button on the front panel pressed "
+"for 10 seconds.\n"
+"3) Wait for bootup and follow instructions of the wizard."
+msgstr ""
+
 msgid ""
 "To update your Dreambox firmware, please follow these steps:\n"
 "1) Turn off your box with the rear power switch and plug in the bootable USB "
@@ -6154,6 +6969,9 @@ msgstr "الاعلى تصنيفا"
 msgid "Track"
 msgstr "مسار"
 
+msgid "TrafficInfo shows german traffic information."
+msgstr ""
+
 #
 msgid "Translation"
 msgstr "ترجمه"
@@ -6344,6 +7162,9 @@ msgstr ""
 msgid "Unsupported"
 msgstr "غير مدعم"
 
+msgid "UnwetterInfo shows german storm information."
+msgstr ""
+
 #
 msgid "Update"
 msgstr "تحديث"
@@ -6426,6 +7247,9 @@ msgstr ""
 msgid "Use a gateway"
 msgstr ""
 
+msgid "Use and control multiple Dreamboxes with different RCs."
+msgstr ""
+
 #
 msgid "Use non-smooth winding at speeds above"
 msgstr ""
@@ -6453,6 +7277,12 @@ msgid ""
 "press OK."
 msgstr "اضغط المفتاح العلوى أو السفلى من الريموت وحدد إختيارك ثم أضغط موافق"
 
+msgid "Use this input device settings?"
+msgstr ""
+
+msgid "Use this settings?"
+msgstr ""
+
 msgid "Use this video enhancement settings?"
 msgstr "استخدام إعدادات تعزيز الفيديو هذه ؟"
 
@@ -6495,6 +7325,9 @@ msgstr "وصله فيديو كاسيت"
 msgid "VMGM (intro trailer)"
 msgstr ""
 
+msgid "Vali-XD skin"
+msgstr ""
+
 msgid ""
 "Verify your Dreambox authenticity by running the genuine dreambox plugin!"
 msgstr ""
@@ -6543,6 +7376,15 @@ msgstr ""
 msgid "Video mode selection."
 msgstr "إختيار وضعية الفيديو."
 
+msgid "Video streaming from the orf.at web page"
+msgstr ""
+
+msgid "VideoEnhancement provides advanced video enhancement settings"
+msgstr ""
+
+msgid "VideoTune helps fine-tuning your tv display"
+msgstr ""
+
 #
 msgid "Videobrowser exit behavior:"
 msgstr ""
@@ -6550,6 +7392,9 @@ msgstr ""
 msgid "Videoenhancement Setup"
 msgstr "ضبط تعزيز الفيديو"
 
+msgid "Videomode provides advanced video mode settings"
+msgstr ""
+
 msgid "Videoplayer stop/exit behavior:"
 msgstr "التصرف عند إيقاف/خروج مشغل الفيديو:"
 
@@ -6557,6 +7402,12 @@ msgstr "التصرف عند إيقاف/خروج مشغل الفيديو:"
 msgid "View Count"
 msgstr ""
 
+msgid "View Google maps"
+msgstr ""
+
+msgid "View Google maps with your Dreambox."
+msgstr ""
+
 #
 msgid "View Movies..."
 msgstr "مشاهدة أفلام..."
@@ -6700,6 +7551,15 @@ msgstr "جارى الانتظار"
 msgid "Warn if free space drops below (kB):"
 msgstr "حذرنى إذا قلت المساحه عن (kB) :"
 
+msgid "Watch streams from ZDF Mediathek"
+msgstr ""
+
+msgid "WeatherPlugin shows weatherforecasts on your Dreambox."
+msgstr ""
+
+msgid "Weatherforecast on your Dreambox"
+msgstr ""
+
 #
 msgid "Webinterface"
 msgstr "واجهة الشبكه"
@@ -6893,6 +7753,93 @@ msgstr "شبكه لا سلكيه"
 msgid "Wireless Network State"
 msgstr "حالة الشبكه اللاسلكيه"
 
+msgid ""
+"With AntiScrollbar you can cover up annoying ticker lines (e.g. in news "
+"channels)."
+msgstr ""
+
+msgid ""
+"With DVDBurn you can make compilations of records from your Dreambox hard "
+"drive.\n"
+"Optionally you can add customizable menus. You can record the compilation to "
+"a standard-compliant DVD that can be played on conventinal DVD players.\n"
+"HDTV recordings can only be burned in proprietary dreambox format."
+msgstr ""
+
+msgid "With EPGSearch you can search through the EPG and create timers."
+msgstr ""
+
+msgid "With Genuine Dreambox you can verify the authenticity of your Dreambox."
+msgstr ""
+
+msgid ""
+"With IMDb you can download and displays movie information (rating, poster, "
+"cast, synopsis etc.) about the selected event."
+msgstr ""
+
+msgid "With MovieRetitle you can rename your movies."
+msgstr ""
+
+msgid ""
+"With MyTube you can play YouTube videos directly on your TV without a PC."
+msgstr ""
+
+msgid "With WebcamViewer you can watch webcams on your TV Screen."
+msgstr ""
+
+msgid ""
+"With Werbezapper you can bridge commercials by creating short timers\n"
+"(between 1 and 9 minutes long) which will automatically zap back to the "
+"original channel after execution."
+msgstr ""
+
+msgid ""
+"With YouTubePlayer you can watch YouTube-Videos on the Dreambox.\n"
+"This plugin requires a PC with the VLC program running."
+msgstr ""
+
+msgid ""
+"With the CommonInterfaceAssignment plugin it is possible to use differentCI "
+"modules in your Dreambox and assign dedicated providers/services or caids to "
+"each of them.\n"
+"This allows watching a scrambled service while recording another one."
+msgstr ""
+
+msgid ""
+"With the CrashlogAutoSubmit plugin it is possible to automaticallymail "
+"crashlogs found on your hard drive to Dream Multimedia."
+msgstr ""
+
+msgid ""
+"With the DefaultServicesScanner plugin you can scan default lamedbs sorted "
+"by satellite with a connected dish positioner."
+msgstr ""
+
+msgid ""
+"With the DiseqcTester plugin you can test your satellite equipment for "
+"DiSEqC compatibility and errors."
+msgstr ""
+
+msgid ""
+"With the NFIFlash plugin it is possible to prepare a USB stick with an "
+"Dreambox image.\n"
+"It is then possible to flash your Dreambox with the image on that stick."
+msgstr ""
+
+msgid ""
+"With the NetworkWizard you can easily configure your network step by step."
+msgstr ""
+
+msgid ""
+"With the PositionerSetup plugin it is easy to install and configure a "
+"motorized dish."
+msgstr ""
+
+msgid ""
+"With the SatelliteEquipmentControl plugin it is possible to fine-tune DiSEqC-"
+"settings."
+msgstr ""
+
 #
 msgid ""
 "With this option enabled the channel to record on can be changed to a "
@@ -6933,6 +7880,9 @@ msgstr "نعم"
 msgid "Yes to all"
 msgstr "نعم للجميع"
 
+msgid "Yes, always"
+msgstr ""
+
 msgid "Yes, and delete this movie"
 msgstr "نعم، وامسح هذا الفيلم"
 
@@ -7031,6 +7981,9 @@ msgid ""
 "As this is a mandatory Attribute you cannot continue without doing so."
 msgstr ""
 
+msgid "You didn't select a channel to record from."
+msgstr ""
+
 #, python-format
 msgid ""
 "You entered \"%s\" as Text to match.\n"
@@ -7198,6 +8151,9 @@ msgid ""
 "Please choose what you want to do next."
 msgstr ""
 
+msgid "ZDFMediathek allows you to watch streams from ZDF Mediathek."
+msgstr ""
+
 #
 msgid "Zap back to previously tuned service?"
 msgstr "هل تريد التنقل الى أخر قناه مولفه ؟"
@@ -7214,6 +8170,18 @@ msgstr "هل تريد التنقل الى القناه الاخيره قبل ب
 msgid "Zap back to service before tuner setup?"
 msgstr "هل تريد التنقل الىالقناه الخيره قبل ضبط الموالف ؟"
 
+msgid "Zap between commercials"
+msgstr ""
+
+msgid "ZapStatistic shows the watched services with some statistics."
+msgstr ""
+
+msgid "Zoom into letterboxed/anamorph movies"
+msgstr ""
+
+msgid "Zoom into letterboxed/anamorph movies."
+msgstr ""
+
 msgid "Zydas"
 msgstr ""
 
@@ -7230,6 +8198,9 @@ msgstr "[تحرير المفضله]"
 msgid "[move mode]"
 msgstr "وضع التحريك"
 
+msgid "a HD skin from Kerni"
+msgstr ""
+
 #
 msgid "a gui to assign services/providers to common interface modules"
 msgstr ""
@@ -7325,6 +8296,9 @@ msgstr "إضافه القناه الى المفضله"
 msgid "add services"
 msgstr "إضافة قنوات"
 
+msgid "add tags to recorded movies"
+msgstr ""
+
 msgid "add to parental protection"
 msgstr "أضف حمايه أبويه"
 
@@ -7334,6 +8308,19 @@ msgstr "متقدم"
 msgid "alphabetic sort"
 msgstr "ترنيب أبجدى"
 
+msgid "assign color buttons (red/green/yellow/blue) to plugins from MOVIELIST."
+msgstr ""
+
+msgid "assign color buttons to plugins from MOVIELIST"
+msgstr ""
+
+msgid ""
+"assign long key-press (red/green/yellow/blue) to plugins or E2 functions."
+msgstr ""
+
+msgid "assign long key-press on color buttons to plugins or E2 functions"
+msgstr ""
+
 #
 msgid "assigned CAIds:"
 msgstr ""
@@ -7439,6 +8426,9 @@ msgstr "تم الاتصال"
 msgid "continue"
 msgstr "استمرار"
 
+msgid "control multiple Dreamboxes with different RCs"
+msgstr ""
+
 msgid "copy to bouquets"
 msgstr "نسخ الى الباقات"
 
@@ -7448,6 +8438,10 @@ msgstr "لا يمكن حذفها"
 msgid "create directory"
 msgstr "إنشاء دليل"
 
+#, python-format
+msgid "currently installed image: %s"
+msgstr ""
+
 #
 msgid "daily"
 msgstr "يومى"
@@ -7476,6 +8470,9 @@ msgstr "مسح قائمة العرض المحفوظه"
 msgid "delete..."
 msgstr "مسح ..."
 
+msgid "description"
+msgstr ""
+
 msgid "disable"
 msgstr "تعطيل"
 
@@ -7900,6 +8897,12 @@ msgstr "جارى التسجيل....."
 msgid "red"
 msgstr "أحمر"
 
+msgid "redesigned Kerni-HD1 skin"
+msgstr ""
+
+msgid "redirect notifications to Growl"
+msgstr ""
+
 #
 msgid "remove a nameserver entry"
 msgstr "حذف مدخلأسم الخادم"
@@ -7986,6 +8989,9 @@ msgstr ""
 msgid "seconds"
 msgstr "ثوانى"
 
+msgid "see service-epg (and PiP) from channels in an infobar"
+msgstr ""
+
 msgid "select"
 msgstr "أختار"
 
@@ -8019,6 +9025,9 @@ msgstr "أختار مسار الفيلم"
 msgid "service pin"
 msgstr "الرقم السرى للقناه"
 
+msgid "set enigma2 to standby-mode after startup"
+msgstr ""
+
 #
 msgid "sets the Audio Delay (LipSync)"
 msgstr ""
@@ -8200,6 +9209,12 @@ msgstr "حتى وضع الانتظار/إعادة التشغيل"
 msgid "use as HDD replacement"
 msgstr ""
 
+msgid "use your Dreambox as Web proxy"
+msgstr ""
+
+msgid "use your Dreambox as Web proxy."
+msgstr ""
+
 #
 msgid "user defined"
 msgstr "محدده من قبل المستخدم"
index f48ffed..4205722 100755 (executable)
--- a/po/ca.po
+++ b/po/ca.po
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: ca\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-06-09 10:31+0000\n"
+"POT-Creation-Date: 2010-09-29 09:15+0000\n"
 "PO-Revision-Date: 2007-08-14 10:23+0200\n"
 "Last-Translator: Oriol Pellicer <oriol@elsud.org>\n"
 "Language-Team: \n"
@@ -118,6 +118,9 @@ msgstr ""
 msgid " extensions."
 msgstr ""
 
+msgid " ms"
+msgstr ""
+
 #
 msgid " packages selected."
 msgstr ""
@@ -381,6 +384,12 @@ msgstr "?"
 msgid "A"
 msgstr "Un"
 
+msgid "A basic ftp client"
+msgstr ""
+
+msgid "A client for www.dyndns.org"
+msgstr ""
+
 #
 #, python-format
 msgid ""
@@ -411,12 +420,27 @@ msgstr ""
 msgid "A graphical EPG for all services of an specific bouquet"
 msgstr ""
 
+msgid "A graphical EPG interface"
+msgstr ""
+
+msgid "A graphical EPG interface."
+msgstr ""
+
 #
 msgid ""
 "A mount entry with this name already exists!\n"
 "Update existing entry and continue?\n"
 msgstr ""
 
+msgid "A nice looking HD skin from Kerni"
+msgstr ""
+
+msgid "A nice looking HD skin in Brushed Alu Design from Kerni."
+msgstr ""
+
+msgid "A nice looking skin from Kerni"
+msgstr ""
+
 #
 #, python-format
 msgid ""
@@ -466,6 +490,9 @@ msgid ""
 "Do you want to disable the second network interface?"
 msgstr ""
 
+msgid "A simple downloading application for other plugins"
+msgstr ""
+
 #
 msgid ""
 "A sleep timer wants to set your\n"
@@ -530,6 +557,12 @@ msgstr "Quant a"
 msgid "About..."
 msgstr "Quant a..."
 
+msgid "Access to the ARD-Mediathek"
+msgstr ""
+
+msgid "Access to the ARD-Mediathek online video database."
+msgstr ""
+
 #
 msgid "Accesspoint:"
 msgstr ""
@@ -654,6 +687,12 @@ msgid ""
 "test screens."
 msgstr ""
 
+msgid "Adult streaming plugin"
+msgstr ""
+
+msgid "Adult streaming plugin."
+msgstr ""
+
 #
 msgid "Advanced Options"
 msgstr ""
@@ -678,6 +717,11 @@ msgstr ""
 msgid "Advanced restore"
 msgstr ""
 
+msgid ""
+"After a reboot or power outage, StartupToStandby will bring your Dreambox to "
+"standby-mode."
+msgstr ""
+
 #
 msgid "After event"
 msgstr "Després del programa"
@@ -690,6 +734,9 @@ msgstr ""
 "Quan acabi aquest assistent caldrà protegir els canals desitjats. Mira el "
 "manual de la Dreambox per saber com fer-ho."
 
+msgid "Ai.HD skin-style control plugin"
+msgstr ""
+
 #
 msgid "Album"
 msgstr "Àlbum"
@@ -714,6 +761,12 @@ msgstr ""
 msgid "Allow zapping via Webinterface"
 msgstr ""
 
+msgid "Allows the execution of TuxboxPlugins."
+msgstr ""
+
+msgid "Allows user to download files from rapidshare in the background."
+msgstr ""
+
 #
 msgid "Alpha"
 msgstr "Alpha"
@@ -726,6 +779,9 @@ msgstr "Mode de ràdio alternatiu"
 msgid "Alternative services tuner priority"
 msgstr ""
 
+msgid "Always ask"
+msgstr ""
+
 #
 msgid "Always ask before sending"
 msgstr ""
@@ -814,6 +870,9 @@ msgstr ""
 msgid "Aspect Ratio"
 msgstr "Relació d'aspecte"
 
+msgid "Assigning providers/services/caids to a CI module"
+msgstr ""
+
 msgid "Atheros"
 msgstr ""
 
@@ -833,6 +892,11 @@ msgstr ""
 msgid "Audio Sync Setup"
 msgstr ""
 
+msgid ""
+"AudoSync allows delaying the sound output (Bitstream/PCM) so that it is "
+"synchronous to the picture."
+msgstr ""
+
 #
 msgid "Australia"
 msgstr ""
@@ -881,6 +945,11 @@ msgstr ""
 msgid "AutoTimer overview"
 msgstr ""
 
+msgid ""
+"AutoTimer scans the EPG and creates Timers depending on user-defined search  "
+"criteria."
+msgstr ""
+
 #
 msgid "Automatic"
 msgstr ""
@@ -889,6 +958,32 @@ msgstr ""
 msgid "Automatic Scan"
 msgstr "Recerca automàtica"
 
+msgid "Automatic volume adjustment"
+msgstr ""
+
+msgid "Automatic volume adjustment for ac3/dts services."
+msgstr ""
+
+msgid "Automatically change video resolution"
+msgstr ""
+
+msgid ""
+"Automatically changes the output resolution depending on the video "
+"resolution you are watching."
+msgstr ""
+
+msgid "Automatically create timer events based on keywords"
+msgstr ""
+
+msgid "Automatically informs you on low internal memory"
+msgstr ""
+
+msgid "Automatically refresh EPG"
+msgstr ""
+
+msgid "Automatically send crashlogs to Dream Multimedia"
+msgstr ""
+
 #
 msgid "Autos & Vehicles"
 msgstr ""
@@ -909,6 +1004,12 @@ msgstr "B"
 msgid "BA"
 msgstr "BA"
 
+msgid "BASIC-HD Skin by Ismail Demir"
+msgstr ""
+
+msgid "BASIC-HD Skin for Dreambox Images created from Ismail Demir"
+msgstr ""
+
 #
 msgid "BB"
 msgstr "BB"
@@ -997,6 +1098,12 @@ msgstr ""
 msgid "Blue boost"
 msgstr ""
 
+msgid "Bonjour/Avahi control plugin"
+msgstr ""
+
+msgid "Bonjour/Avahi control plugin."
+msgstr ""
+
 #
 msgid "Bookmarks"
 msgstr ""
@@ -1013,6 +1120,12 @@ msgstr ""
 msgid "Brightness"
 msgstr "Brillantor"
 
+msgid "Browse for and connect to network shares"
+msgstr ""
+
+msgid "Browse for nfs/cifs shares and connect to them."
+msgstr ""
+
 #
 msgid "Browse network neighbourhood"
 msgstr ""
@@ -1029,6 +1142,9 @@ msgstr ""
 msgid "Burn to DVD"
 msgstr "Gravar DVD"
 
+msgid "Burn your recordings to DVD"
+msgstr ""
+
 #
 msgid "Bus: "
 msgstr "Bus: "
@@ -1052,6 +1168,11 @@ msgstr "Banda-C"
 msgid "CDInfo"
 msgstr "Barra d'informació"
 
+msgid ""
+"CDInfo enables gathering album and track details from CDDB and CD-Text when "
+"playing Audio CDs in Mediaplayer."
+msgstr ""
+
 #
 msgid "CI assignment"
 msgstr ""
@@ -1072,6 +1193,9 @@ msgstr "Cable"
 msgid "Cache Thumbnails"
 msgstr "Cache de les miniatures"
 
+msgid "Callmonitor for the Fritz!Box routers"
+msgstr ""
+
 # File: tmp/enigma2_plugins/genuinedreambox/src/plugin.py, line: 108
 msgid "Can't connect to server. Please check your network!"
 msgstr ""
@@ -1152,6 +1276,9 @@ msgstr ""
 msgid "Change the hostname of your Dreambox."
 msgstr ""
 
+msgid "Changelog"
+msgstr ""
+
 #
 msgid "Channel"
 msgstr "Canal"
@@ -1220,6 +1347,9 @@ msgstr ""
 msgid "Choose bouquet"
 msgstr "Escollir llista"
 
+msgid "Choose image to download"
+msgstr ""
+
 #
 msgid "Choose target folder"
 msgstr ""
@@ -1256,6 +1386,12 @@ msgstr ""
 msgid "Cleanup Wizard settings"
 msgstr ""
 
+msgid "Cleanup timerlist automatically"
+msgstr ""
+
+msgid "Cleanup timerlist automatically."
+msgstr ""
+
 #
 msgid "CleanupWizard"
 msgstr ""
@@ -1383,6 +1519,9 @@ msgstr ""
 msgid "Configure nameservers"
 msgstr ""
 
+msgid "Configure your WLAN network interface"
+msgstr ""
+
 #
 msgid "Configure your internal LAN"
 msgstr ""
@@ -1439,6 +1578,30 @@ msgstr ""
 msgid "Contrast"
 msgstr "Contrast"
 
+msgid "Control your Dreambox with your Web browser."
+msgstr ""
+
+msgid "Control your Dreambox with your browser"
+msgstr ""
+
+msgid "Control your dreambox with only the MUTE button"
+msgstr ""
+
+msgid "Control your dreambox with only the MUTE button."
+msgstr ""
+
+msgid "Control your internal system fan."
+msgstr ""
+
+msgid "Control your kids's tv usage"
+msgstr ""
+
+msgid "Control your system fan"
+msgstr ""
+
+msgid "Copy, rename, delete, move local files on your Dreambox."
+msgstr ""
+
 #
 msgid "Could not connect to Dreambox .NFI Image Feed Server:"
 msgstr ""
@@ -1482,6 +1645,12 @@ msgstr ""
 msgid "Create DVD-ISO"
 msgstr ""
 
+msgid "Create a backup of your Video DVD on your DreamBox hard drive."
+msgstr ""
+
+msgid "Create a backup of your Video-DVD"
+msgstr ""
+
 #
 msgid "Create a new AutoTimer."
 msgstr ""
@@ -1498,6 +1667,15 @@ msgstr ""
 msgid "Create movie folder failed"
 msgstr "No s'ha pogut crear el directori de la pel·lícula"
 
+msgid "Create preview pictures of your Movies"
+msgstr ""
+
+msgid "Create remote timers"
+msgstr ""
+
+msgid "Create timers on remote Dreamboxes."
+msgstr ""
+
 #
 #, python-format
 msgid "Creating directory %s failed."
@@ -1515,6 +1693,9 @@ msgstr "Croat"
 msgid "Current Transponder"
 msgstr ""
 
+msgid "Current device: "
+msgstr ""
+
 #
 msgid "Current settings:"
 msgstr ""
@@ -1527,6 +1708,9 @@ msgstr ""
 msgid "Current version:"
 msgstr "Versió actual:"
 
+msgid "Currently installed image"
+msgstr ""
+
 #
 #, python-format
 msgid "Custom (%s)"
@@ -1556,10 +1740,32 @@ msgstr ""
 msgid "Customize"
 msgstr "Personalitzar"
 
+msgid "Customize Vali-XD skins"
+msgstr ""
+
+msgid "Customize Vali-XD skins by yourself."
+msgstr ""
+
 #
 msgid "Cut"
 msgstr "Tallar"
 
+msgid "Cut your movies"
+msgstr ""
+
+msgid "Cut your movies."
+msgstr ""
+
+msgid "CutListEditor allows you to edit your movies"
+msgstr ""
+
+msgid ""
+"CutListEditor allows you to edit your movies.\n"
+"Seek to the start of the stuff you want to cut away. Press OK, select 'start "
+"cut'.\n"
+"Then seek to the end, press OK, select 'end cut'. That's it."
+msgstr ""
+
 #
 msgid "Cutlist editor..."
 msgstr "Editor..."
@@ -1608,6 +1814,15 @@ msgstr ""
 msgid "DVD media toolbox"
 msgstr ""
 
+msgid "DVDPlayer plays your DVDs on your Dreambox"
+msgstr ""
+
+msgid ""
+"DVDPlayer plays your DVDs on your Dreambox.\n"
+"With the DVDPlayer you can play your DVDs on your Dreambox from a DVD or "
+"even from an iso file or video_ts folder on your harddisc or network."
+msgstr ""
+
 #
 msgid "Danish"
 msgstr "Danès"
@@ -1662,6 +1877,12 @@ msgstr ""
 msgid "Defaults"
 msgstr "AC3 per defecte"
 
+msgid "Define a startup service"
+msgstr ""
+
+msgid "Define a startup service for your Dreambox."
+msgstr ""
+
 #
 msgid "Delay"
 msgstr "Retard"
@@ -1713,6 +1934,9 @@ msgstr ""
 msgid "Details for extension: "
 msgstr ""
 
+msgid "Details for plugin: "
+msgstr ""
+
 #
 msgid "Detected HDD:"
 msgstr "Disc dur detectat:"
@@ -1757,6 +1981,9 @@ msgstr ""
 msgid "Dir:"
 msgstr ""
 
+msgid "Direct playback of Youtube videos"
+msgstr ""
+
 #
 msgid "Direct playback of linked titles without menu"
 msgstr ""
@@ -1834,6 +2061,12 @@ msgstr ""
 msgid "Display search results by:"
 msgstr ""
 
+msgid "Display your photos on the TV"
+msgstr ""
+
+msgid "Displays movie information from the InternetMovieDatabase"
+msgstr ""
+
 #
 #, python-format
 msgid ""
@@ -1893,6 +2126,10 @@ msgstr "Vols fer una recerca de canals?"
 msgid "Do you want to do another manual service scan?"
 msgstr "Vols fer una altra recerca manual?"
 
+#, python-format
+msgid "Do you want to download the image to %s ?"
+msgstr ""
+
 #
 msgid "Do you want to enable the parental control feature on your dreambox?"
 msgstr "Vols habilitar el control parental?"
@@ -1985,6 +2222,10 @@ msgstr ""
 msgid "Download"
 msgstr ""
 
+#, python-format
+msgid "Download %s from Server"
+msgstr ""
+
 #
 msgid "Download .NFI-Files for USB-Flasher"
 msgstr ""
@@ -1997,6 +2238,9 @@ msgstr "Descarregar plugins"
 msgid "Download Video"
 msgstr ""
 
+msgid "Download files from Rapidshare"
+msgstr ""
+
 #
 msgid "Download location"
 msgstr ""
@@ -2057,6 +2301,13 @@ msgstr "Selecció EPG"
 msgid "EPG encoding"
 msgstr ""
 
+msgid ""
+"EPGRefresh will automatically switch to user-defined channels when the box "
+"is idleing\n"
+"(in standby mode without any running recordings) to perform updates of the "
+"epg information on these channels."
+msgstr ""
+
 #
 #, python-format
 msgid "ERROR - failed to scan (%s)!"
@@ -2118,6 +2369,12 @@ msgstr "Editar llista de canals"
 msgid "Edit settings"
 msgstr ""
 
+msgid "Edit tags of recorded movies"
+msgstr ""
+
+msgid "Edit tags of recorded movies."
+msgstr ""
+
 #
 msgid "Edit the Nameserver configuration of your Dreambox.\n"
 msgstr ""
@@ -2150,6 +2407,9 @@ msgstr ""
 msgid "Electronic Program Guide"
 msgstr ""
 
+msgid "Emailclient is an IMAP4 e-mail viewer for the Dreambox."
+msgstr ""
+
 #
 msgid "Enable"
 msgstr "Activar"
@@ -2266,6 +2526,11 @@ msgstr "HoraFi"
 msgid "English"
 msgstr "Anglès"
 
+msgid ""
+"Enigma2 Plugin to play AVI/DIVX/WMV/etc. videos from PC on your Dreambox. "
+"Needs a running VLC from www.videolan.org on your pc."
+msgstr ""
+
 #
 msgid ""
 "Enigma2 Skinselector\n"
@@ -2383,6 +2648,9 @@ msgstr ""
 msgid "Execute \"after event\" during timespan"
 msgstr ""
 
+msgid "Execute TuxboxPlugins"
+msgstr ""
+
 #
 msgid "Execution Progress:"
 msgstr "Progrés d'execució:"
@@ -2403,6 +2671,9 @@ msgstr ""
 msgid "Exit editor"
 msgstr "Sortir de l'editor"
 
+msgid "Exit input device selection."
+msgstr ""
+
 #
 msgid "Exit network wizard"
 msgstr ""
@@ -2451,6 +2722,11 @@ msgstr ""
 msgid "FEC"
 msgstr "FEC"
 
+msgid ""
+"FTPBrowser allows uploading and downloading files between your Dreambox and "
+"a server using the file transfer protocol."
+msgstr ""
+
 #
 msgid "Factory reset"
 msgstr ""
@@ -2547,6 +2823,9 @@ msgstr ""
 msgid "Finnish"
 msgstr "Finlandès"
 
+msgid "First generate your skin-style with the Ai.HD-Control plugin."
+msgstr ""
+
 #
 msgid ""
 "First we need to download the latest boot environment for the USB flasher."
@@ -2620,6 +2899,12 @@ msgstr "Divendres"
 msgid "Frisian"
 msgstr ""
 
+msgid "FritzCall shows incoming calls to your Fritz!Box on your Dreambox."
+msgstr ""
+
+msgid "Frontend for /tmp/mmi.socket"
+msgstr ""
+
 #
 #, python-format
 msgid "Frontprocessor version: %d"
@@ -2637,6 +2922,16 @@ msgstr ""
 "Cal reengegar la IGU per activar la nova aparença\n"
 "Vols fer-ho ara?"
 
+msgid "GUI that allows user to change the ftp- / telnet password."
+msgstr ""
+
+msgid ""
+"GUI that allows user to change the ftp-/telnet-password of the Dreambox."
+msgstr ""
+
+msgid "GUI to change the ftp and telnet-password"
+msgstr ""
+
 #
 msgid "Gaming"
 msgstr ""
@@ -2672,14 +2967,32 @@ msgstr ""
 msgid "Genuine Dreambox validation failed!"
 msgstr ""
 
+msgid "Genuine Dreambox verification"
+msgstr ""
+
 #
 msgid "German"
 msgstr "Alemany"
 
+msgid "German storm information"
+msgstr ""
+
+msgid "German traffic information"
+msgstr ""
+
 #
 msgid "Germany"
 msgstr ""
 
+msgid "Get AudioCD info from CDDB and CD-Text"
+msgstr ""
+
+msgid "Get latest experimental image"
+msgstr ""
+
+msgid "Get latest release image"
+msgstr ""
+
 #
 msgid "Getting plugin information. Please wait..."
 msgstr "Llegint la informació del plugin. Espera..."
@@ -2696,6 +3009,14 @@ msgstr "Anar a 0"
 msgid "Goto position"
 msgstr "Anar a la posició"
 
+msgid "GraphMultiEPG shows a graphical timeline EPG"
+msgstr ""
+
+msgid ""
+"GraphMultiEPG shows a graphical timeline EPG.\n"
+"Shows a nice overview of all running und upcoming tv shows."
+msgstr ""
+
 #
 msgid "Graphical Multi EPG"
 msgstr ""
@@ -2712,6 +3033,12 @@ msgstr "Grec"
 msgid "Green boost"
 msgstr ""
 
+msgid ""
+"Growlee allows your Dreambox to send short messages using the growl "
+"protocol\n"
+"like Recording started notifications to a PC running a growl client"
+msgstr ""
+
 #
 msgid "Guard Interval"
 msgstr "Interval de guarda"
@@ -2788,6 +3115,9 @@ msgstr ""
 msgid "Horizontal"
 msgstr ""
 
+msgid "Hotplugging for removeable devices"
+msgstr ""
+
 #
 msgid "How many minutes do you want to record?"
 msgstr "Quants minuts vols gravar?"
@@ -2808,6 +3138,9 @@ msgstr ""
 msgid "Hungarian"
 msgstr "Hongarès"
 
+msgid "IMAP4 e-mail viewer for the Dreambox"
+msgstr ""
+
 #
 msgid "IP Address"
 msgstr "Adreça IP"
@@ -2816,6 +3149,9 @@ msgstr "Adreça IP"
 msgid "IP:"
 msgstr ""
 
+msgid "IRC Client for Enigma2"
+msgstr ""
+
 #
 msgid "ISO file is too large for this filesystem!"
 msgstr ""
@@ -2951,6 +3287,12 @@ msgstr "Inicialitzant disc dur..."
 msgid "Input"
 msgstr "Entrada"
 
+msgid "Input device setup"
+msgstr ""
+
+msgid "Input devices"
+msgstr ""
+
 #
 msgid "Install"
 msgstr ""
@@ -3034,6 +3376,9 @@ msgstr "Flash interna"
 msgid "Internal LAN adapter."
 msgstr ""
 
+msgid "Internal firmware updater"
+msgstr ""
+
 #
 msgid "Invalid Location"
 msgstr ""
@@ -3096,6 +3441,12 @@ msgstr ""
 msgid "Italian"
 msgstr "Italià"
 
+msgid "Italian Weather forecast on Dreambox"
+msgstr ""
+
+msgid "Italian Weather forecast on Dreambox from www.google.it."
+msgstr ""
+
 #
 msgid "Italy"
 msgstr ""
@@ -3113,6 +3464,51 @@ msgstr ""
 msgid "Just Scale"
 msgstr ""
 
+msgid "Kerni's BrushedAlu-HD skin"
+msgstr ""
+
+msgid "Kerni's DreamMM-HD skin"
+msgstr ""
+
+msgid "Kerni's Elgato-HD skin"
+msgstr ""
+
+msgid "Kerni's SWAIN skin"
+msgstr ""
+
+msgid "Kerni's SWAIN-HD skin"
+msgstr ""
+
+msgid "Kerni's UltraViolet skin"
+msgstr ""
+
+msgid "Kerni's YADS-HD skin"
+msgstr ""
+
+msgid "Kerni's dTV-HD skin"
+msgstr ""
+
+msgid "Kerni's dTV-HD-Reloaded skin"
+msgstr ""
+
+msgid "Kerni's dmm-HD skin"
+msgstr ""
+
+msgid "Kerni's dreamTV-HD skin"
+msgstr ""
+
+msgid "Kerni's simple skin"
+msgstr ""
+
+msgid "Kerni-HD1 skin"
+msgstr ""
+
+msgid "Kerni-HD1R2 skin"
+msgstr ""
+
+msgid "Kernis HD1 skin"
+msgstr ""
+
 #
 #, python-format
 msgid "Key %(Key)s successfully set to %(delay)i ms"
@@ -3139,6 +3535,9 @@ msgstr "Configuració teclat"
 msgid "Keymap"
 msgstr "Mapa de teclat"
 
+msgid "KiddyTimer allows to control your kids's daily tv usage."
+msgstr ""
+
 #
 msgid "LAN Adapter"
 msgstr ""
@@ -3235,6 +3634,12 @@ msgstr ""
 msgid "List of Storage Devices"
 msgstr "Dispositius d'emmagatzematge"
 
+msgid "Listen and record internet radio"
+msgstr ""
+
+msgid "Listen and record shoutcast internet radio on your Dreambox."
+msgstr ""
+
 #
 msgid "Lithuanian"
 msgstr "Lituà"
@@ -3333,10 +3738,23 @@ msgstr "Fer que aquesta marca sigui només una marca"
 msgid "Manage extensions"
 msgstr ""
 
+msgid "Manage local files"
+msgstr ""
+
+msgid "Manage logos to display at boot time or while in radio mode."
+msgstr ""
+
+msgid "Manage logos to display at boottime"
+msgstr ""
+
 #
 msgid "Manage network shares"
 msgstr ""
 
+msgid ""
+"Manage your music files in a database, play it with Merlin Music Player."
+msgstr ""
+
 #
 msgid "Manage your network shares..."
 msgstr ""
@@ -3401,6 +3819,17 @@ msgstr "Reproductor"
 msgid "MediaPlayer"
 msgstr "Reproductor"
 
+msgid ""
+"MediaScanner scans devices for playable media files and displays a menu with "
+"possible actions like viewing pictures or playing movies."
+msgstr ""
+
+msgid ""
+"Mediaplayer plays your favorite music and videos.\n"
+"Play all your favorite music and video files, organize them in playlists, "
+"view cover and album information."
+msgstr ""
+
 #
 msgid "Medium is not a writeable DVD!"
 msgstr ""
@@ -3413,6 +3842,9 @@ msgstr ""
 msgid "Menu"
 msgstr "Menú"
 
+msgid "Merlin Music Player and iDream"
+msgstr ""
+
 #
 msgid "Message"
 msgstr "Missatge"
@@ -3595,10 +4027,25 @@ msgstr ""
 msgid "Move west"
 msgstr "Moure a l'oest"
 
+msgid "Movie information from the Online Film Datenbank (German)."
+msgstr ""
+
+msgid "Movie informations from the Online Film Datenbank"
+msgstr ""
+
 #
 msgid "Movie location"
 msgstr ""
 
+msgid ""
+"MovieTagger adds tags to recorded movies to sort a large list of movies."
+msgstr ""
+
+msgid ""
+"Movielist Preview creates screenshots of recordings and shows them inside "
+"the movielist."
+msgstr ""
+
 #
 msgid "Movielist menu"
 msgstr ""
@@ -3708,6 +4155,102 @@ msgstr "Configuració dels DNS"
 msgid "Nameserver settings"
 msgstr ""
 
+msgid "Nemesis BlackBox Skin"
+msgstr ""
+
+msgid "Nemesis BlackBox Skin for the Dreambox"
+msgstr ""
+
+msgid "Nemesis Blueline Single Skin"
+msgstr ""
+
+msgid "Nemesis Blueline Single Skin for the Dreambox"
+msgstr ""
+
+msgid "Nemesis Blueline Skin"
+msgstr ""
+
+msgid "Nemesis Blueline Skin for the Dreambox"
+msgstr ""
+
+msgid "Nemesis Blueline.Extended Skin"
+msgstr ""
+
+msgid "Nemesis Blueline.Extended Skin for the Dreambox"
+msgstr ""
+
+msgid "Nemesis ChromeLine Cobolt Skin"
+msgstr ""
+
+msgid "Nemesis ChromeLine Cobolt Skin for the Dreambox"
+msgstr ""
+
+msgid "Nemesis ChromeLine Skin"
+msgstr ""
+
+msgid "Nemesis ChromeLine Skin for the Dreambox"
+msgstr ""
+
+msgid "Nemesis Flatline Blue Skin"
+msgstr ""
+
+msgid "Nemesis Flatline Blue Skin for the Dreambox"
+msgstr ""
+
+msgid "Nemesis Flatline Skin"
+msgstr ""
+
+msgid "Nemesis Flatline Skin for the Dreambox"
+msgstr ""
+
+msgid "Nemesis GlassLine Skin"
+msgstr ""
+
+msgid "Nemesis GlassLine Skin for the Dreambox"
+msgstr ""
+
+msgid "Nemesis Greenline Extended Skin"
+msgstr ""
+
+msgid "Nemesis Greenline Extended Skin for the Dreambox"
+msgstr ""
+
+msgid "Nemesis Greenline Single Skin"
+msgstr ""
+
+msgid "Nemesis Greenline Single Skin for the Dreambox"
+msgstr ""
+
+msgid "Nemesis Greenline Skin"
+msgstr ""
+
+msgid "Nemesis Greenline Skin for the Dreambox"
+msgstr ""
+
+msgid "Nemesis Greyline Extended Skin"
+msgstr ""
+
+msgid "Nemesis Greyline Extended Skin for the Dreambox"
+msgstr ""
+
+msgid "Nemesis Greyline Single Skin"
+msgstr ""
+
+msgid "Nemesis Greyline Single Skin for the Dreambox"
+msgstr ""
+
+msgid "Nemesis Greyline Skin"
+msgstr ""
+
+msgid "Nemesis Greyline Skin for the Dreambox"
+msgstr ""
+
+msgid "Nemesis ShadowLine Skin"
+msgstr ""
+
+msgid "Nemesis ShadowLine Skin for the Dreambox"
+msgstr ""
+
 #
 msgid "Netmask"
 msgstr "Màscara"
@@ -3985,6 +4528,9 @@ msgstr "No, no cal."
 msgid "No, just start my dreambox"
 msgstr "No, només arrenca la Dreambox"
 
+msgid "No, never"
+msgstr ""
+
 #
 msgid "No, not now"
 msgstr ""
@@ -4149,10 +4695,19 @@ msgstr "Posició orbital"
 msgid "Outer Bound (+/-)"
 msgstr ""
 
+msgid "Overlay for scrolling bars"
+msgstr ""
+
 #
 msgid "Override found with alternative service"
 msgstr ""
 
+msgid "Overwrite configuration files ?"
+msgstr ""
+
+msgid "Overwrite configuration files during software upgrade?"
+msgstr ""
+
 #
 msgid "PAL"
 msgstr "PAL"
@@ -4211,6 +4766,11 @@ msgstr "Configuració control parental"
 msgid "Parental control type"
 msgstr "Tipus de control parental"
 
+msgid ""
+"Partnerbox allows editing a remote Dreambox's record timers and stream its "
+"TV  program."
+msgstr ""
+
 #
 msgid "Password"
 msgstr ""
@@ -4223,6 +4783,9 @@ msgstr ""
 msgid "People & Blogs"
 msgstr ""
 
+msgid "PermanentClock shows the clock permanently on the screen."
+msgstr ""
+
 #
 msgid "Pets & Animals"
 msgstr ""
@@ -4272,6 +4835,12 @@ msgstr ""
 msgid "Play YouTube movies"
 msgstr ""
 
+msgid "Play music from Last.fm"
+msgstr ""
+
+msgid "Play music from Last.fm."
+msgstr ""
+
 #
 msgid "Play next video"
 msgstr ""
@@ -4284,6 +4853,21 @@ msgstr "Reproduir pel·lícules gravades..."
 msgid "Play video again"
 msgstr ""
 
+msgid "Play videos from PC on your Dreambox"
+msgstr ""
+
+msgid "Playback of Youtube through a PC"
+msgstr ""
+
+msgid "Player for Network and Internet Streams"
+msgstr ""
+
+msgid "Player for Network and Internet Streams."
+msgstr ""
+
+msgid "Plays your favorite music and videos"
+msgstr ""
+
 #
 msgid "Please Reboot"
 msgstr ""
@@ -4430,6 +5014,9 @@ msgstr "Sisplau selecciona un subservei a gravar..."
 msgid "Please select a subservice..."
 msgstr "Sisplau selecciona un subservei..."
 
+msgid "Please select an NFI file and press green key to flash!"
+msgstr ""
+
 #
 msgid "Please select an extension to remove."
 msgstr ""
@@ -4575,6 +5162,9 @@ msgstr ""
 msgid "Plugins"
 msgstr ""
 
+msgid "PodCast streams podcasts to your Dreambox."
+msgstr ""
+
 #
 msgid "Poland"
 msgstr ""
@@ -4639,6 +5229,9 @@ msgstr "Configuració del motor"
 msgid "Positioner storage"
 msgstr "Emmagatzemar posició del motor"
 
+msgid "PositionerSetup helps you installing a motorized dish"
+msgstr ""
+
 #
 msgid ""
 "Power state to change to after recordings. Select \"standard\" to not change "
@@ -4653,10 +5246,19 @@ msgstr "Llindar de corrent en mA"
 msgid "Predefined transponder"
 msgstr "Transponedor predefinit"
 
+msgid "Prepare another USB stick for image flashing"
+msgstr ""
+
 #
 msgid "Preparing... Please wait"
 msgstr "Preparant... Sisplau espera"
 
+msgid "Press INFO on your remote control for additional information."
+msgstr ""
+
+msgid "Press MENU on your remote control for additional options."
+msgstr ""
+
 #
 msgid "Press OK on your remote control to continue."
 msgstr ""
@@ -4750,6 +5352,12 @@ msgstr ""
 msgid "Preview menu"
 msgstr ""
 
+msgid "Preview screenshots of running tv shows"
+msgstr ""
+
+msgid "Preview screenshots of running tv shows."
+msgstr ""
+
 #
 msgid "Primary DNS"
 msgstr ""
@@ -4794,6 +5402,9 @@ msgstr ""
 msgid "Python frontend for /tmp/mmi.socket"
 msgstr ""
 
+msgid "Python frontend for /tmp/mmi.socket."
+msgstr ""
+
 #
 msgid "Quick"
 msgstr ""
@@ -4814,6 +5425,9 @@ msgstr "Sortida RF"
 msgid "RGB"
 msgstr "RGB"
 
+msgid "RSS viewer"
+msgstr ""
+
 #
 msgid "Radio"
 msgstr ""
@@ -4877,6 +5491,12 @@ msgstr ""
 msgid "Reception Settings"
 msgstr "Configuració de recepció"
 
+msgid "Reconstruct .ap and .sc files"
+msgstr ""
+
+msgid "Reconstruct missing or corrupt .ap and .sc files of recorded movies."
+msgstr ""
+
 #
 msgid "Record"
 msgstr "Gravar"
@@ -4954,6 +5574,9 @@ msgstr ""
 msgid "Remember service pin cancel"
 msgstr ""
 
+msgid "Remote timer and remote TV player"
+msgstr ""
+
 #
 msgid "Remove"
 msgstr ""
@@ -5027,6 +5650,9 @@ msgstr ""
 msgid "Rename crashlogs"
 msgstr ""
 
+msgid "Rename your movies"
+msgstr ""
+
 #
 msgid "Repeat"
 msgstr "Repetir"
@@ -5043,6 +5669,12 @@ msgstr "S'està gravant un canal programat repetidament... Què vols fer?"
 msgid "Repeats"
 msgstr ""
 
+msgid "Replace the minute input for the seek functions with a seekbar."
+msgstr ""
+
+msgid "Replace the rewind  input with a seekbar"
+msgstr ""
+
 #
 msgid "Require description to be unique"
 msgstr ""
@@ -5131,6 +5763,9 @@ msgstr ""
 msgid "Restore system settings"
 msgstr ""
 
+msgid "Restore your Dreambox with a USB stick"
+msgstr ""
+
 #
 msgid "Restrict \"after event\" to a certain timespan?"
 msgstr ""
@@ -5236,6 +5871,9 @@ msgstr "Configuració de l'equip de satèl·lit"
 msgid "Satellite equipment"
 msgstr ""
 
+msgid "SatelliteEquipmentControl allows you to fine-tune DiSEqC-settings"
+msgstr ""
+
 #
 msgid "Satellites"
 msgstr "Satèl·lits"
@@ -5244,6 +5882,9 @@ msgstr "Satèl·lits"
 msgid "Satfinder"
 msgstr "Localitzador de satèl·lits"
 
+msgid "Satfinder helps you to align your dish"
+msgstr ""
+
 #
 msgid "Sats"
 msgstr ""
@@ -5384,6 +6025,9 @@ msgstr "Escanejar banda US MID"
 msgid "Scan band US SUPER"
 msgstr "Escanejar banda US SUPER"
 
+msgid "Scan devices for playable media files"
+msgstr ""
+
 #
 msgid "Scan range"
 msgstr ""
@@ -5399,6 +6043,9 @@ msgid ""
 "selected wireless device.\n"
 msgstr ""
 
+msgid "Scans default lamedbs sorted by satellite"
+msgstr ""
+
 #
 msgid ""
 "Scans default lamedbs sorted by satellite with a connected dish positioner"
@@ -5440,6 +6087,9 @@ msgstr ""
 msgid "Search strictness"
 msgstr ""
 
+msgid "Search through the EPG"
+msgstr ""
+
 #
 msgid "Search type"
 msgstr ""
@@ -5469,6 +6119,9 @@ msgstr ""
 msgid "Security service not running."
 msgstr ""
 
+msgid "See service-epg (and PiP) from other channels in an infobar."
+msgstr ""
+
 #
 msgid "Seek"
 msgstr "Posicionar"