add virtual keyboard as easy input help
authorAcid-Burn <acid-burn@spacenet.(none)>
Tue, 4 Nov 2008 11:13:37 +0000 (12:13 +0100)
committerAndreas Oberritter <obi@saftware.de>
Thu, 6 Nov 2008 00:47:05 +0000 (01:47 +0100)
add icons for virtual keyboard
network fixes
wlan fixeS

19 files changed:
data/skin_default.xml [changed mode: 0644->0755]
data/skin_default/vkey_backspace.png [new file with mode: 0755]
data/skin_default/vkey_bg.png [new file with mode: 0755]
data/skin_default/vkey_clr.png [new file with mode: 0755]
data/skin_default/vkey_esc.png [new file with mode: 0755]
data/skin_default/vkey_icon.png [new file with mode: 0755]
data/skin_default/vkey_left.png [new file with mode: 0755]
data/skin_default/vkey_ok.png [new file with mode: 0755]
data/skin_default/vkey_right.png [new file with mode: 0755]
data/skin_default/vkey_sel.png [new file with mode: 0755]
data/skin_default/vkey_shift.png [new file with mode: 0755]
data/skin_default/vkey_shift_sel.png [new file with mode: 0755]
data/skin_default/vkey_space.png [new file with mode: 0755]
data/skin_default/vkey_text.png [new file with mode: 0755]
lib/python/Components/HelpMenuList.py [changed mode: 0644->0755]
lib/python/Components/Network.py [changed mode: 0644->0755]
lib/python/Screens/Makefile.am [changed mode: 0644->0755]
lib/python/Screens/NetworkSetup.py [changed mode: 0644->0755]
lib/python/Screens/VirtualKeyBoard.py [new file with mode: 0755]

old mode 100644 (file)
new mode 100755 (executable)
index 88cf8b4..41a7e4c
@@ -42,6 +42,9 @@
                <widget name="ButtonRed" pixmap="skin_default/buttons/button_red.png" position="390,325" zPosition="10" size="15,16" transparent="1" alphatest="on" />
                <widget name="ButtonBluetext" position="410,360" size="140,21" zPosition="10" font="Regular;21" transparent="1" />
                <widget name="ButtonBlue" pixmap="skin_default/buttons/button_blue.png" position="390,360" zPosition="10" size="15,16" transparent="1" alphatest="on" />
                <widget name="ButtonRed" pixmap="skin_default/buttons/button_red.png" position="390,325" zPosition="10" size="15,16" transparent="1" alphatest="on" />
                <widget name="ButtonBluetext" position="410,360" size="140,21" zPosition="10" font="Regular;21" transparent="1" />
                <widget name="ButtonBlue" pixmap="skin_default/buttons/button_blue.png" position="390,360" zPosition="10" size="15,16" transparent="1" alphatest="on" />
+               <widget name="ButtonGreen" pixmap="skin_default/buttons/button_green.png" position="20,360" zPosition="10" size="15,16" transparent="1" alphatest="on" />
+               <widget name="VKeyIcon" pixmap="skin_default/vkey_icon.png" position="40,340" zPosition="10" size="60,48" transparent="1" alphatest="on" />
+               <widget name="HelpWindow" pixmap="skin_default/vkey_icon.png" position="120,245" zPosition="1" size="1,1" transparent="1" alphatest="on" />     
        </screen>
        <screen name="AdapterSetupConfiguration" position="90,100" size="550,400" title="Network Configuration..." >
                <ePixmap pixmap="skin_default/border_menu.png" position="10,10" zPosition="1" size="250,300" transparent="1" alphatest="on" />
        </screen>
        <screen name="AdapterSetupConfiguration" position="90,100" size="550,400" title="Network Configuration..." >
                <ePixmap pixmap="skin_default/border_menu.png" position="10,10" zPosition="1" size="250,300" transparent="1" alphatest="on" />
@@ -568,7 +571,7 @@ self.instance.move(ePoint(orgpos.x() + (orgwidth - newwidth)/2, orgpos.y()))
                <widget name="ButtonRedtext" position="430,325" size="120,21" zPosition="10" font="Regular;21" transparent="1" />
                <ePixmap pixmap="skin_default/buttons/button_red.png" position="410,325" zPosition="10" size="15,16" transparent="1" alphatest="on" />
                <widget name="ButtonBluetext" position="60,325" size="300,21" zPosition="10" font="Regular;21" transparent="1" />
                <widget name="ButtonRedtext" position="430,325" size="120,21" zPosition="10" font="Regular;21" transparent="1" />
                <ePixmap pixmap="skin_default/buttons/button_red.png" position="410,325" zPosition="10" size="15,16" transparent="1" alphatest="on" />
                <widget name="ButtonBluetext" position="60,325" size="300,21" zPosition="10" font="Regular;21" transparent="1" />
-               <ePixmap pixmap="skin_default/buttons/button_blue.png" position="30,325" zPosition="10" size="15,16" transparent="1" alphatest="on" />
+               <widget name="ButtonBlue" pixmap="skin_default/buttons/button_blue.png" position="30,325" zPosition="10" size="15,16" transparent="1" alphatest="on" />
                <widget name="introduction" position="140,360" size="300,21" zPosition="10" font="Regular;21" halign="center" transparent="1" />
        </screen>
        <!-- Network adapter test Black = "#000000" Grey = "#8c8c93" Green = "#1cff1c" Red = #f23d21-->
                <widget name="introduction" position="140,360" size="300,21" zPosition="10" font="Regular;21" halign="center" transparent="1" />
        </screen>
        <!-- Network adapter test Black = "#000000" Grey = "#8c8c93" Green = "#1cff1c" Red = #f23d21-->
@@ -1157,4 +1160,10 @@ self.instance.move(ePoint(orgpos.x() + (orgwidth - newwidth)/2, orgpos.y()))
                        <convert type="ProgressToText" />
                </widget>
        </screen>
                        <convert type="ProgressToText" />
                </widget>
        </screen>
+       <screen name="VirtualKeyBoard" position="80,150" size="560,350" zPosition="99" title="Virtual KeyBoard">
+               <ePixmap pixmap="skin_default/vkey_text.png" position="9,35" zPosition="-4" size="542,52" alphatest="on" />
+               <widget name="header" position="10,10" size="500,20" font="Regular;20" transparent="1" noWrap="1" />
+               <widget name="text" position="12,35" size="536,46" font="Regular;46" transparent="1" noWrap="1" halign="right" />
+               <widget name="list" position="10,100" size="540,225" selectionDisabled="1" transparent="1" />
+       </screen>
 </skin>
 </skin>
diff --git a/data/skin_default/vkey_backspace.png b/data/skin_default/vkey_backspace.png
new file mode 100755 (executable)
index 0000000..ed49159
Binary files /dev/null and b/data/skin_default/vkey_backspace.png differ
diff --git a/data/skin_default/vkey_bg.png b/data/skin_default/vkey_bg.png
new file mode 100755 (executable)
index 0000000..5151da4
Binary files /dev/null and b/data/skin_default/vkey_bg.png differ
diff --git a/data/skin_default/vkey_clr.png b/data/skin_default/vkey_clr.png
new file mode 100755 (executable)
index 0000000..0c7734b
Binary files /dev/null and b/data/skin_default/vkey_clr.png differ
diff --git a/data/skin_default/vkey_esc.png b/data/skin_default/vkey_esc.png
new file mode 100755 (executable)
index 0000000..56c52d3
Binary files /dev/null and b/data/skin_default/vkey_esc.png differ
diff --git a/data/skin_default/vkey_icon.png b/data/skin_default/vkey_icon.png
new file mode 100755 (executable)
index 0000000..f27b7f8
Binary files /dev/null and b/data/skin_default/vkey_icon.png differ
diff --git a/data/skin_default/vkey_left.png b/data/skin_default/vkey_left.png
new file mode 100755 (executable)
index 0000000..2e77e71
Binary files /dev/null and b/data/skin_default/vkey_left.png differ
diff --git a/data/skin_default/vkey_ok.png b/data/skin_default/vkey_ok.png
new file mode 100755 (executable)
index 0000000..2c0c7e8
Binary files /dev/null and b/data/skin_default/vkey_ok.png differ
diff --git a/data/skin_default/vkey_right.png b/data/skin_default/vkey_right.png
new file mode 100755 (executable)
index 0000000..fefb17c
Binary files /dev/null and b/data/skin_default/vkey_right.png differ
diff --git a/data/skin_default/vkey_sel.png b/data/skin_default/vkey_sel.png
new file mode 100755 (executable)
index 0000000..b612b94
Binary files /dev/null and b/data/skin_default/vkey_sel.png differ
diff --git a/data/skin_default/vkey_shift.png b/data/skin_default/vkey_shift.png
new file mode 100755 (executable)
index 0000000..477f8db
Binary files /dev/null and b/data/skin_default/vkey_shift.png differ
diff --git a/data/skin_default/vkey_shift_sel.png b/data/skin_default/vkey_shift_sel.png
new file mode 100755 (executable)
index 0000000..339ddb4
Binary files /dev/null and b/data/skin_default/vkey_shift_sel.png differ
diff --git a/data/skin_default/vkey_space.png b/data/skin_default/vkey_space.png
new file mode 100755 (executable)
index 0000000..5151da4
Binary files /dev/null and b/data/skin_default/vkey_space.png differ
diff --git a/data/skin_default/vkey_text.png b/data/skin_default/vkey_text.png
new file mode 100755 (executable)
index 0000000..6bdb8c8
Binary files /dev/null and b/data/skin_default/vkey_text.png differ
old mode 100644 (file)
new mode 100755 (executable)
index 25c9b8b..04815c8
@@ -1,7 +1,6 @@
 from GUIComponent import GUIComponent
 
 from enigma import eListboxPythonMultiContent, eListbox, gFont
 from GUIComponent import GUIComponent
 
 from enigma import eListboxPythonMultiContent, eListbox, gFont
-
 from Tools.KeyBindings import queryKeyBinding, getKeyDescription
 #getKeyPositions
 
 from Tools.KeyBindings import queryKeyBinding, getKeyDescription
 #getKeyPositions
 
@@ -13,6 +12,7 @@ class HelpMenuList(GUIComponent):
                self.onSelChanged = [ ]
                self.l = eListboxPythonMultiContent()
                self.callback = callback
                self.onSelChanged = [ ]
                self.l = eListboxPythonMultiContent()
                self.callback = callback
+               self.extendedHelp = False
 
                l = [ ]
                for (actionmap, context, actions) in list:
 
                l = [ ]
                for (actionmap, context, actions) in list:
@@ -36,17 +36,26 @@ class HelpMenuList(GUIComponent):
                                if flags & 8: # for long keypresses, prepend l_ into the key name.
                                        name = (name[0], "long")
                                        
                                if flags & 8: # for long keypresses, prepend l_ into the key name.
                                        name = (name[0], "long")
                                        
-                               print "name:", name
-
                                entry.append( (actionmap, context, action, name ) )
                                entry.append( (actionmap, context, action, name ) )
-                               entry.append( (eListboxPythonMultiContent.TYPE_TEXT, 0, 0, 400, 28, 0, 0, help) )
-
+                                       
+                               if type(help).__name__== 'list':
+                                       self.extendedHelp = True
+                                       print "extendedHelpEntry found"
+                                       entry.append( (eListboxPythonMultiContent.TYPE_TEXT, 0, 0, 400, 26, 0, 0, help[0]) )
+                                       entry.append( (eListboxPythonMultiContent.TYPE_TEXT, 0, 28, 400, 20, 1, 0, help[1]) )
+                               else:
+                                       entry.append( (eListboxPythonMultiContent.TYPE_TEXT, 0, 0, 400, 28, 0, 0, help) )
+                                       
                                l.append(entry)
 
                self.l.setList(l)
                                l.append(entry)
 
                self.l.setList(l)
-
-               self.l.setFont(0, gFont("Regular", 24))
-               self.l.setItemHeight(38)
+               if self.extendedHelp is True:
+                       self.l.setFont(0, gFont("Regular", 24))
+                       self.l.setFont(1, gFont("Regular", 18))
+                       self.l.setItemHeight(50)
+               else:
+                       self.l.setFont(0, gFont("Regular", 24))
+                       self.l.setItemHeight(38)
 
        def ok(self):
                # a list entry has a "private" tuple as first entry...
 
        def ok(self):
                # a list entry has a "private" tuple as first entry...
old mode 100644 (file)
new mode 100755 (executable)
index bed9d95..e10c6a0
@@ -7,11 +7,19 @@ from Components.Console import Console
 class Network:
        def __init__(self):
                self.ifaces = {}
 class Network:
        def __init__(self):
                self.ifaces = {}
-               self.configuredInterfaces = []          
+               self.configuredInterfaces = []
+               self.configuredNetworkAdapters = []
+               self.NetworkState = 0
+               self.DnsState = 0
                self.nameservers = []
                self.ethtool_bin = "/usr/sbin/ethtool"
                self.container = eConsoleAppContainer()
                self.Console = Console()
                self.nameservers = []
                self.ethtool_bin = "/usr/sbin/ethtool"
                self.container = eConsoleAppContainer()
                self.Console = Console()
+               self.LinkConsole = Console()
+               self.restartConsole = Console()
+               self.deactivateConsole = Console()
+               self.activateConsole = Console()
+               self.resetNetworkConsole = Console()
                self.getInterfaces()
 
        def getInterfaces(self, callback = None):
                self.getInterfaces()
 
        def getInterfaces(self, callback = None):
@@ -28,6 +36,11 @@ class Network:
                                self.getDataForInterface(device, callback)
                        except AttributeError:
                                pass
                                self.getDataForInterface(device, callback)
                        except AttributeError:
                                pass
+               #print "self.ifaces:", self.ifaces
+               #self.writeNetworkConfig()
+               #print ord(' ')
+               #for line in result:
+               #       print ord(line[0])
 
        # helper function
        def regExpMatch(self, pattern, string):
 
        # helper function
        def regExpMatch(self, pattern, string):
@@ -46,66 +59,58 @@ class Network:
                        ip.append(int(x))
                return ip
 
                        ip.append(int(x))
                return ip
 
+       def getDataForInterface(self, iface,callback):
+               #get ip out of ip addr, as avahi sometimes overrides it in ifconfig.
+               cmd = "ip -o addr"
+               self.Console.ePopen(cmd, self.IPaddrFinished, [iface,callback])
+
        def IPaddrFinished(self, result, retval, extra_args):
                (iface, callback ) = extra_args
                data = { 'up': False, 'dhcp': False, 'preup' : False, 'postdown' : False }
                globalIPpattern = re_compile("scope global")
                ipRegexp = '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}'
        def IPaddrFinished(self, result, retval, extra_args):
                (iface, callback ) = extra_args
                data = { 'up': False, 'dhcp': False, 'preup' : False, 'postdown' : False }
                globalIPpattern = re_compile("scope global")
                ipRegexp = '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}'
-               ipLinePattern = re_compile('inet ' + ipRegexp +'/')
+               netRegexp = '[0-9]{1,2}'
+               macRegexp = '[0-9]{2}\:[0-9]{2}\:[0-9]{2}\:[a-z0-9]{2}\:[a-z0-9]{2}\:[a-z0-9]{2}'
+               ipLinePattern = re_compile('inet ' + ipRegexp + '/')
                ipPattern = re_compile(ipRegexp)
                ipPattern = re_compile(ipRegexp)
-
+               netmaskLinePattern = re_compile('/' + netRegexp + ' brd ')
+               netmaskPattern = re_compile(netRegexp)
+               bcastLinePattern = re_compile(' brd ' + ipRegexp)
+               upPattern = re_compile('UP')
+               macPattern = re_compile('[0-9]{2}\:[0-9]{2}\:[0-9]{2}\:[a-z0-9]{2}\:[a-z0-9]{2}\:[a-z0-9]{2}')
+               macLinePattern = re_compile('link/ether ' + macRegexp)
+               
                for line in result.splitlines():
                        split = line.strip().split(' ',2)
                for line in result.splitlines():
                        split = line.strip().split(' ',2)
+                       if (split[1][:-1] == iface):
+                               up = self.regExpMatch(upPattern, split[2])
+                               mac = self.regExpMatch(macPattern, self.regExpMatch(macLinePattern, split[2]))
+                               if up is not None:
+                                       data['up'] = True
+                                       if iface is not 'lo':
+                                               self.configuredInterfaces.append(iface)
+                               if mac is not None:
+                                       data['mac'] = mac
                        if (split[1] == iface):
                                if re_search(globalIPpattern, split[2]):
                                        ip = self.regExpMatch(ipPattern, self.regExpMatch(ipLinePattern, split[2]))
                        if (split[1] == iface):
                                if re_search(globalIPpattern, split[2]):
                                        ip = self.regExpMatch(ipPattern, self.regExpMatch(ipLinePattern, split[2]))
+                                       netmask = self.calc_netmask(self.regExpMatch(netmaskPattern, self.regExpMatch(netmaskLinePattern, split[2])))
+                                       bcast = self.regExpMatch(ipPattern, self.regExpMatch(bcastLinePattern, split[2]))
                                        if ip is not None:
                                                data['ip'] = self.convertIP(ip)
                                        if ip is not None:
                                                data['ip'] = self.convertIP(ip)
+                                       if netmask is not None:
+                                               data['netmask'] = self.convertIP(netmask)
+                                       if bcast is not None:
+                                               data['bcast'] = self.convertIP(bcast)
+                                               
                if not data.has_key('ip'):
                        data['dhcp'] = True
                        data['ip'] = [0, 0, 0, 0]
                        data['netmask'] = [0, 0, 0, 0]
                        data['gateway'] = [0, 0, 0, 0]
 
                if not data.has_key('ip'):
                        data['dhcp'] = True
                        data['ip'] = [0, 0, 0, 0]
                        data['netmask'] = [0, 0, 0, 0]
                        data['gateway'] = [0, 0, 0, 0]
 
-               cmd = "ifconfig " + iface
-               self.Console.ePopen(cmd, self.ifconfigFinished, [iface, data, callback])
-
-       def getDataForInterface(self, iface,callback):
-               #get ip out of ip addr, as avahi sometimes overrides it in ifconfig.
-               cmd = "ip -o addr"
-               self.Console.ePopen(cmd, self.IPaddrFinished, [iface,callback])
-
-       def ifconfigFinished(self, result, retval, extra_args ):
-               (iface, data, callback ) = extra_args
-               ipRegexp = '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}'
-               ipLinePattern = re_compile('inet addr:' + ipRegexp)
-               netmaskLinePattern = re_compile('Mask:' + ipRegexp)
-               bcastLinePattern = re_compile('Bcast:' + ipRegexp)
-               ipPattern = re_compile(ipRegexp)
-               upPattern = re_compile('UP ')
-               macPattern = re_compile('[0-9]{2}\:[0-9]{2}\:[0-9]{2}\:[0-9]{2}\:[0-9]{2}\:[0-9]{2}')
-
-               for line in result.splitlines():
-                       #ip = self.regExpMatch(ipPattern, self.regExpMatch(ipLinePattern, line))
-                       netmask = self.regExpMatch(ipPattern, self.regExpMatch(netmaskLinePattern, line))
-                       bcast = self.regExpMatch(ipPattern, self.regExpMatch(bcastLinePattern, line))
-                       up = self.regExpMatch(upPattern, line)
-                       mac = self.regExpMatch(macPattern, line)
-                       #if ip is not None:
-                       #       data['ip'] = self.convertIP(ip)
-                       if netmask is not None:
-                               data['netmask'] = self.convertIP(netmask)
-                       if bcast is not None:
-                               data['bcast'] = self.convertIP(bcast)
-                       if up is not None:
-                               data['up'] = True
-                               if iface is not 'lo':
-                                       self.configuredInterfaces.append(iface)
-                       if mac is not None:
-                               data['mac'] = mac
-
                cmd = "route -n | grep  " + iface
                cmd = "route -n | grep  " + iface
-               self.Console.ePopen(cmd,self.routeFinished,[iface,data,callback])
+               self.Console.ePopen(cmd,self.routeFinished, [iface, data, callback])
 
        def routeFinished(self, result, retval, extra_args):
                (iface, data, callback) = extra_args
 
        def routeFinished(self, result, retval, extra_args):
                (iface, data, callback) = extra_args
@@ -119,16 +124,7 @@ class Network:
                                gateway = self.regExpMatch(ipPattern, line[16:31])
                                if gateway is not None:
                                        data['gateway'] = self.convertIP(gateway)
                                gateway = self.regExpMatch(ipPattern, line[16:31])
                                if gateway is not None:
                                        data['gateway'] = self.convertIP(gateway)
-
-               for line in result.splitlines(): #get real netmask in case avahi has overridden ifconfig netmask
-                       split = line.strip().split('   ')
-                       if re_search(ipPattern, split[0]):
-                               foundip = self.convertIP(split[0])
-                               if (foundip[0] == data['ip'][0] and foundip[1] == data['ip'][1]):
-                                       if re_search(ipPattern, split[4]):
-                                               mask = self.regExpMatch(ipPattern, self.regExpMatch(ipLinePattern, split[4]))
-                                               if mask is not None:
-                                                       data['netmask'] = self.convertIP(mask)
+                                       
                self.ifaces[iface] = data
                self.loadNetworkConfig(iface,callback)
 
                self.ifaces[iface] = data
                self.loadNetworkConfig(iface,callback)
 
@@ -203,7 +199,7 @@ class Network:
                                        ifaces[currif]["gateway"] = map(int, split[1].split('.'))
                                        if self.ifaces[currif].has_key("gateway"):
                                                if self.ifaces[currif]["gateway"] != ifaces[currif]["gateway"] and ifaces[currif]["dhcp"] == False:
                                        ifaces[currif]["gateway"] = map(int, split[1].split('.'))
                                        if self.ifaces[currif].has_key("gateway"):
                                                if self.ifaces[currif]["gateway"] != ifaces[currif]["gateway"] and ifaces[currif]["dhcp"] == False:
-                                                       self.ifaces[currif]["gateway"] = map(int, split[1].split('.'))
+                                                       self.ifaces[currif]["gateway"] = map(int, split[1].split('.'))                                  
                                if (split[0] == "pre-up"):
                                        if self.ifaces[currif].has_key("preup"):
                                                self.ifaces[currif]["preup"] = i
                                if (split[0] == "pre-up"):
                                        if self.ifaces[currif].has_key("preup"):
                                                self.ifaces[currif]["preup"] = i
@@ -215,7 +211,9 @@ class Network:
                        if self.ifaces.has_key(ifacename):
                                self.ifaces[ifacename]["dhcp"] = iface["dhcp"]
                if len(self.Console.appContainers) == 0:
                        if self.ifaces.has_key(ifacename):
                                self.ifaces[ifacename]["dhcp"] = iface["dhcp"]
                if len(self.Console.appContainers) == 0:
-                       # load ns only once
+                       # save configured interfacelist
+                       self.configuredNetworkAdapters = self.configuredInterfaces
+                       # load ns only once     
                        self.loadNameserverConfig()
                        print "read configured interfac:", ifaces
                        print "self.ifaces after loading:", self.ifaces
                        self.loadNameserverConfig()
                        print "read configured interfac:", ifaces
                        print "self.ifaces after loading:", self.ifaces
@@ -244,16 +242,39 @@ class Network:
 
                print "nameservers:", self.nameservers
 
 
                print "nameservers:", self.nameservers
 
-       def deactivateNetworkConfig(self):
+       def deactivateNetworkConfig(self, callback = None):
+               self.deactivateConsole = Console()
+               self.commands = []
+               self.commands.append("/etc/init.d/avahi-daemon stop")
                for iface in self.ifaces.keys():
                for iface in self.ifaces.keys():
-                       system("ip addr flush " + iface)
-               system("/etc/init.d/networking stop")
-               system("killall -9 udhcpc")
-               system("rm /var/run/udhcpc*")
+                       cmd = "ip addr flush " + iface
+                       self.commands.append(cmd)               
+               self.commands.append("/etc/init.d/networking stop")
+               self.commands.append("killall -9 udhcpc")
+               self.commands.append("rm /var/run/udhcpc*")
+               self.deactivateConsole.eBatch(self.commands, self.deactivateNetworkFinished, callback, debug=True)
+               
+       def deactivateNetworkFinished(self,extra_args):
+               callback = extra_args
+               if len(self.deactivateConsole.appContainers) == 0:
+                       if callback is not None:
+                               callback(True)
 
 
-       def activateNetworkConfig(self):
-               system("/etc/init.d/networking start")
-               self.getInterfaces()
+       def activateNetworkConfig(self, callback = None):
+               self.activateConsole = Console()
+               self.commands = []
+               self.commands.append("/etc/init.d/networking start")
+               self.commands.append("/etc/init.d/avahi-daemon start")
+               self.activateConsole.eBatch(self.commands, self.activateNetworkFinished, callback, debug=True)
+               
+       def activateNetworkFinished(self,extra_args):
+               callback = extra_args
+               if len(self.activateConsole.appContainers) == 0:
+                       if callback is not None:
+                               callback(True)
+
+       def getConfiguredAdapters(self):
+               return self.configuredNetworkAdapters
 
        def getNumberOfAdapters(self):
                return len(self.ifaces)
 
        def getNumberOfAdapters(self):
                return len(self.ifaces)
@@ -312,7 +333,24 @@ class Network:
                                if self.nameservers[i] == oldnameserver:
                                        self.nameservers[i] = newnameserver
 
                                if self.nameservers[i] == oldnameserver:
                                        self.nameservers[i] = newnameserver
 
-       def writeDefaultNetworkConfig(self,mode='lan'):
+       def resetNetworkConfig(self, mode='lan', callback = None):
+               self.resetNetworkConsole = Console()
+               self.commands = []
+               self.commands.append("/etc/init.d/avahi-daemon stop")
+               for iface in self.ifaces.keys():
+                       cmd = "ip addr flush " + iface
+                       self.commands.append(cmd)               
+               self.commands.append("/etc/init.d/networking stop")
+               self.commands.append("killall -9 udhcpc")
+               self.commands.append("rm /var/run/udhcpc*")
+               self.resetNetworkConsole.eBatch(self.commands, self.resetNetworkFinishedCB, [mode, callback], debug=True)
+
+       def resetNetworkFinishedCB(self, extra_args):
+               (mode, callback) = extra_args
+               if len(self.resetNetworkConsole.appContainers) == 0:
+                       self.writeDefaultNetworkConfig(mode, callback)
+
+       def writeDefaultNetworkConfig(self,mode='lan', callback = None):
                fp = file('/etc/network/interfaces', 'w')
                fp.write("# automatically generated by enigma 2\n# do NOT change manually!\n\n")
                fp.write("auto lo\n")
                fp = file('/etc/network/interfaces', 'w')
                fp.write("# automatically generated by enigma 2\n# do NOT change manually!\n\n")
                fp.write("auto lo\n")
@@ -329,50 +367,95 @@ class Network:
                fp.write("\n")
                fp.close()
 
                fp.write("\n")
                fp.close()
 
-       def resetNetworkConfig(self,mode='lan'):
-               self.deactivateNetworkConfig()
-               self.writeDefaultNetworkConfig(mode)
+               self.resetNetworkConsole = Console()
+               self.commands = []
                if mode == 'wlan':
                if mode == 'wlan':
-                       system("ifconfig eth0 down")
-                       system("ifconfig ath0 down")
-                       system("ifconfig wlan0 up")
+                       self.commands.append("ifconfig eth0 down")
+                       self.commands.append("ifconfig ath0 down")
+                       self.commands.append("ifconfig wlan0 up")
                if mode == 'wlan-mpci':
                if mode == 'wlan-mpci':
-                       system("ifconfig eth0 down")
-                       system("ifconfig wlan0 down")
-                       system("ifconfig ath0 up")              
+                       self.commands.append("ifconfig eth0 down")
+                       self.commands.append("ifconfig wlan0 down")
+                       self.commands.append("ifconfig ath0 up")                
                if mode == 'lan':                       
                if mode == 'lan':                       
-                       system("ifconfig eth0 up")
-                       system("ifconfig wlan0 down")
-                       system("ifconfig ath0 down")
-               self.getInterfaces()    
-
-       def checkNetworkState(self):
-                # www.dream-multimedia-tv.de, www.heise.de, www.google.de
-               return system("ping -c 1 82.149.226.170") == 0 or \
-                       system("ping -c 1 193.99.144.85") == 0 or \
-                       system("ping -c 1 209.85.135.103") == 0
-
-       def restartNetwork(self):
-               iNetwork.deactivateNetworkConfig()
-               iNetwork.activateNetworkConfig()
+                       self.commands.append("ifconfig eth0 up")
+                       self.commands.append("ifconfig wlan0 down")
+                       self.commands.append("ifconfig ath0 down")
+               self.commands.append("/etc/init.d/avahi-daemon start")  
+               self.resetNetworkConsole.eBatch(self.commands, self.resetNetworkFinished, [mode,callback], debug=True)  
+
+       def resetNetworkFinished(self,extra_args):
+               (mode, callback) = extra_args
+               if len(self.resetNetworkConsole.appContainers) == 0:
+                       if callback is not None:
+                               callback(True,mode)
+
+       def checkNetworkState(self,statecallback):
+               # www.dream-multimedia-tv.de, www.heise.de, www.google.de
+               cmd1 = "ping -c 1 82.149.226.170"
+               cmd2 = "ping -c 1 193.99.144.85"
+               cmd3 = "ping -c 1 209.85.135.103"
+               self.PingConsole = Console()
+               self.PingConsole.ePopen(cmd1, self.checkNetworkStateFinished,statecallback)
+               self.PingConsole.ePopen(cmd2, self.checkNetworkStateFinished,statecallback)
+               self.PingConsole.ePopen(cmd3, self.checkNetworkStateFinished,statecallback)
+               
+       def checkNetworkStateFinished(self, result, retval,extra_args):
+               (statecallback) = extra_args
+               if self.PingConsole is not None:
+                       if retval == 0:
+                               self.PingConsole = None
+                               statecallback(self.NetworkState)
+                       else:
+                               self.NetworkState += 1
+                               if len(self.PingConsole.appContainers) == 0:
+                                       statecallback(self.NetworkState)
+               
+       def restartNetwork(self,callback):
+               self.restartConsole = Console()
+               self.commands = []
+               self.commands.append("/etc/init.d/avahi-daemon stop")
+               for iface in self.ifaces.keys():
+                       cmd = "ip addr flush " + iface
+                       self.commands.append(cmd)               
+               self.commands.append("/etc/init.d/networking stop")
+               self.commands.append("killall -9 udhcpc")
+               self.commands.append("rm /var/run/udhcpc*")
+               self.commands.append("/etc/init.d/networking start")
+               self.commands.append("/etc/init.d/avahi-daemon start")
+               self.restartConsole.eBatch(self.commands, self.restartNetworkFinished, callback, debug=True)
+       
+       def restartNetworkFinished(self,extra_args):
+               callback = extra_args
+               if len(self.restartConsole.appContainers) == 0:
+                       callback(True)
 
        def getLinkState(self,iface,callback):
 
        def getLinkState(self,iface,callback):
-               self.dataAvail = callback
                cmd = self.ethtool_bin + " " + iface
                cmd = self.ethtool_bin + " " + iface
-               self.container.appClosed.append(self.cmdFinished)
-               self.container.dataAvail.append(callback)
-               self.container.execute(cmd)
-
-       def cmdFinished(self,retval):
-               self.container.appClosed.remove(self.cmdFinished)
-               self.container.dataAvail.remove(self.dataAvail)
-
-       def stopContainer(self):
-               self.container.kill()
-               
-       def ContainerRunning(self):
-               return self.container.running()
-
+               self.LinkConsole = Console()
+               self.LinkConsole.ePopen(cmd, self.getLinkStateFinished,callback)
+
+       def getLinkStateFinished(self, result, retval,extra_args):
+               (callback) = extra_args
+               if self.LinkConsole is not None:
+                       if len(self.LinkConsole.appContainers) == 0:
+                               callback(result)
+                       
+       def stopLinkStateConsole(self):
+               if self.LinkConsole is not None:
+                       self.LinkConsole = None
+
+       def stopRestartConsole(self):
+               if self.restartConsole is not None:
+                       self.restartConsole = None
+                       
+       def RestartConsoleRunning(self):
+               if self.restartConsole is not None:
+                       if len(self.restartConsole.appContainers) == 0:
+                               return False
+                       else:
+                               return True
+                       
        def checkforInterface(self,iface):
                if self.getAdapterAttribute(iface, 'up') is True:
                        return True
        def checkforInterface(self,iface):
                if self.getAdapterAttribute(iface, 'up') is True:
                        return True
@@ -384,13 +467,37 @@ class Network:
                        else:
                                return False
 
                        else:
                                return False
 
-       def checkDNSLookup(self):
-               return system("nslookup www.dream-multimedia-tv.de") == 0 or \
-                       system("nslookup www.heise.de") == 0 or \
-                       system("nslookup www.google.de")
+       def checkDNSLookup(self,statecallback):
+               cmd1 = "nslookup www.dream-multimedia-tv.de"
+               cmd2 = "nslookup www.heise.de"
+               cmd3 = "nslookup www.google.de"
+               self.DnsConsole = Console()
+               self.DnsConsole.ePopen(cmd1, self.checkDNSLookupFinished,statecallback)
+               self.DnsConsole.ePopen(cmd2, self.checkDNSLookupFinished,statecallback)
+               self.DnsConsole.ePopen(cmd3, self.checkDNSLookupFinished,statecallback)
+               
+       def checkDNSLookupFinished(self, result, retval,extra_args):
+               (statecallback) = extra_args
+               if self.DnsConsole is not None:
+                       if retval == 0:
+                               self.DnsConsole = None
+                               statecallback(self.DnsState)
+                       else:
+                               self.DnsState += 1
+                               if len(self.DnsConsole.appContainers) == 0:
+                                       statecallback(self.DnsState)
 
        def deactivateInterface(self,iface):
 
        def deactivateInterface(self,iface):
-               system("ifconfig " + iface + " down")
+               self.deactivateInterfaceConsole = Console()
+               self.commands = []
+               cmd1 = "ip addr flush " + iface
+               cmd2 = "ifconfig " + iface + " down"
+               self.commands.append(cmd1)
+               self.commands.append(cmd2)
+               self.deactivateInterfaceConsole.eBatch(self.commands, self.deactivateInterfaceFinished, extra_args = None, debug=True)
+
+       def deactivateInterfaceFinished(self,extra_args):
+               pass
 
        def detectWlanModule(self):
                self.wlanmodule = None
 
        def detectWlanModule(self):
                self.wlanmodule = None
@@ -411,6 +518,20 @@ class Network:
                                self.wlanmodule = 'zydas'
                return self.wlanmodule
        
                                self.wlanmodule = 'zydas'
                return self.wlanmodule
        
+       def calc_netmask(self,nmask):
+               from struct import pack, unpack
+               from socket import inet_ntoa, inet_aton
+               mask = 1L<<31
+               xnet = (1L<<32)-1
+               cidr_range = range(0, 32)
+               cidr = long(nmask)
+               if cidr not in cidr_range:
+                       print 'cidr invalid: %d' % cidr
+                       return None
+               else:
+                       nm = ((1L<<cidr)-1)<<(32-cidr)
+                       netmask = str(inet_ntoa(pack('>L', nm)))
+                       return netmask
        
 iNetwork = Network()
 
        
 iNetwork = Network()
 
old mode 100644 (file)
new mode 100755 (executable)
index 186c6f3..a3cf70b
@@ -13,5 +13,5 @@ install_PYTHON = \
        TimerSelection.py PictureInPicture.py TimeDateInput.py \
        SubtitleDisplay.py SubservicesQuickzap.py ParentalControlSetup.py NumericalTextInputHelpDialog.py \
        SleepTimerEdit.py Ipkg.py RdsDisplay.py Globals.py DefaultWizard.py \
        TimerSelection.py PictureInPicture.py TimeDateInput.py \
        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
+       SessionGlobals.py LocationBox.py WizardLanguage.py TaskView.py Rc.py VirtualKeyBoard.py
 
 
old mode 100644 (file)
new mode 100755 (executable)
index 862bce4..c26302f
@@ -1,25 +1,25 @@
 from Screen import Screen
 from Screen import Screen
-from Components.ActionMap import ActionMap,NumberActionMap
 from Screens.MessageBox import MessageBox
 from Screens.InputBox import InputBox
 from Screens.Standby import *
 from Screens.MessageBox import MessageBox
 from Screens.InputBox import InputBox
 from Screens.Standby import *
+from Screens.VirtualKeyBoard import VirtualKeyBoard
+from Screens.HelpMenu import HelpableScreen
 from Components.Network import iNetwork
 from Components.Label import Label,MultiColorLabel
 from Components.Pixmap import Pixmap,MultiPixmap
 from Components.MenuList import MenuList
 from Components.Network import iNetwork
 from Components.Label import Label,MultiColorLabel
 from Components.Pixmap import Pixmap,MultiPixmap
 from Components.MenuList import MenuList
-from Components.config import config, ConfigYesNo, ConfigIP, NoSave, ConfigText, ConfigSelection, getConfigListEntry, ConfigNothing
+from Components.config import config, ConfigYesNo, ConfigIP, NoSave, ConfigText, ConfigPassword, ConfigSelection, getConfigListEntry, ConfigNothing
 from Components.ConfigList import ConfigListScreen
 from Components.PluginComponent import plugins
 from Components.MultiContent import MultiContentEntryText, MultiContentEntryPixmapAlphaTest
 from Components.ConfigList import ConfigListScreen
 from Components.PluginComponent import plugins
 from Components.MultiContent import MultiContentEntryText, MultiContentEntryPixmapAlphaTest
+from Components.ActionMap import ActionMap, NumberActionMap, HelpableActionMap
+from Tools.Directories import resolveFilename, SCOPE_PLUGINS, SCOPE_SKIN_IMAGE
+from Tools.LoadPixmap import LoadPixmap
 from Plugins.Plugin import PluginDescriptor
 from Plugins.Plugin import PluginDescriptor
-from enigma import eTimer
+from enigma import eTimer, ePoint, eSize, RT_HALIGN_LEFT, eListboxPythonMultiContent, gFont
 from os import path as os_path, system as os_system, unlink
 from re import compile as re_compile, search as re_search
 from os import path as os_path, system as os_system, unlink
 from re import compile as re_compile, search as re_search
-from Tools.Directories import resolveFilename, SCOPE_PLUGINS
 
 
-from Tools.Directories import SCOPE_SKIN_IMAGE,SCOPE_PLUGINS, resolveFilename
-from Tools.LoadPixmap import LoadPixmap
-from enigma import RT_HALIGN_LEFT, eListboxPythonMultiContent, gFont
 
 class InterfaceList(MenuList):
        def __init__(self, list, enableWrapAround=False):
 
 class InterfaceList(MenuList):
        def __init__(self, list, enableWrapAround=False):
@@ -30,11 +30,13 @@ class InterfaceList(MenuList):
 def InterfaceEntryComponent(index,name,default,active ):
        res = [ (index) ]
        res.append(MultiContentEntryText(pos=(80, 5), size=(430, 25), font=0, text=name))
 def InterfaceEntryComponent(index,name,default,active ):
        res = [ (index) ]
        res.append(MultiContentEntryText(pos=(80, 5), size=(430, 25), font=0, text=name))
-       if default is True:
-               png = LoadPixmap(resolveFilename(SCOPE_SKIN_IMAGE, "skin_default/buttons/button_blue.png"))
-       if default is False:
-               png = LoadPixmap(resolveFilename(SCOPE_SKIN_IMAGE, "skin_default/buttons/button_blue_off.png"))
-       res.append(MultiContentEntryPixmapAlphaTest(pos=(10, 5), size=(25, 25), png = png))
+       num_configured_if = len(iNetwork.getConfiguredAdapters())
+       if num_configured_if >= 2:
+               if default is True:
+                       png = LoadPixmap(resolveFilename(SCOPE_SKIN_IMAGE, "skin_default/buttons/button_blue.png"))
+               if default is False:
+                       png = LoadPixmap(resolveFilename(SCOPE_SKIN_IMAGE, "skin_default/buttons/button_blue_off.png"))
+               res.append(MultiContentEntryPixmapAlphaTest(pos=(10, 5), size=(25, 25), png = png))
        if active is True:
                png2 = LoadPixmap(resolveFilename(SCOPE_SKIN_IMAGE, "skin_default/icons/lock_on.png"))
        if active is False:
        if active is True:
                png2 = LoadPixmap(resolveFilename(SCOPE_SKIN_IMAGE, "skin_default/icons/lock_on.png"))
        if active is False:
@@ -43,41 +45,64 @@ def InterfaceEntryComponent(index,name,default,active ):
        return res
 
 
        return res
 
 
-class NetworkAdapterSelection(Screen):
+class NetworkAdapterSelection(Screen,HelpableScreen):
        def __init__(self, session):
                Screen.__init__(self, session)
        def __init__(self, session):
                Screen.__init__(self, session)
-
+               HelpableScreen.__init__(self)
+               
                self.wlan_errortext = _("No working wireless networkadapter found.\nPlease verify that you have attached a compatible WLAN USB Stick and your Network is configured correctly.")
                self.lan_errortext = _("No working local networkadapter found.\nPlease verify that you have attached a network cable and your Network is configured correctly.")
                self.wlan_errortext = _("No working wireless networkadapter found.\nPlease verify that you have attached a compatible WLAN USB Stick and your Network is configured correctly.")
                self.lan_errortext = _("No working local networkadapter found.\nPlease verify that you have attached a network cable and your Network is configured correctly.")
+               self.oktext = _("Press OK on your remote control to continue.")
+               self.restartLanRef = None
                
                self["ButtonBluetext"] = Label(_("Set as default Interface"))
                
                self["ButtonBluetext"] = Label(_("Set as default Interface"))
+               self["ButtonBlue"] = Pixmap()
                self["ButtonRedtext"] = Label(_("Close"))
                self["introduction"] = Label(_("Press OK to edit the settings."))
                
                self.adapters = [(iNetwork.getFriendlyAdapterName(x),x) for x in iNetwork.getAdapterList()]
                self["ButtonRedtext"] = Label(_("Close"))
                self["introduction"] = Label(_("Press OK to edit the settings."))
                
                self.adapters = [(iNetwork.getFriendlyAdapterName(x),x) for x in iNetwork.getAdapterList()]
-
+               
                if len(self.adapters) == 0:
                        self.onFirstExecBegin.append(self.NetworkFallback)
                if len(self.adapters) == 0:
                        self.onFirstExecBegin.append(self.NetworkFallback)
-
+                       
+               self["OkCancelActions"] = HelpableActionMap(self, "OkCancelActions",
+                       {
+                       "cancel": (self.close, _("exit networkinterface list")),
+                       "ok": (self.okbuttonClick, _("select interface")),
+                       })
+
+               self["ColorActions"] = HelpableActionMap(self, "ColorActions",
+                       {
+                       "red": (self.close, _("exit networkinterface list")),   
+                       })
+               
+               self["DefaultInterfaceAction"] = HelpableActionMap(self, "ColorActions",
+                       {
+                       "blue": (self.setDefaultInterface, [_("Set interface as default Interface"),_("* Only available if more then one interface is active.")] ),     
+                       })
+               
                self.list = []
                self["list"] = InterfaceList(self.list)
                self.updateList()
                self.list = []
                self["list"] = InterfaceList(self.list)
                self.updateList()
-               self["actions"] = ActionMap(["OkCancelActions", "ColorActions"],
-               {
-                       "ok": self.okbuttonClick,
-                       "cancel": self.close,
-                       "blue": self.setDefaultInterface,                       
-                       "red": self.close
-               }, -2)
-
+               
                if len(self.adapters) == 1:
                        self.onFirstExecBegin.append(self.okbuttonClick)
                if len(self.adapters) == 1:
                        self.onFirstExecBegin.append(self.okbuttonClick)
-
+               self.onClose.append(self.cleanup)
+               
        def updateList(self):
                iNetwork.getInterfaces()
                self.list = []
                default_gw = None
        def updateList(self):
                iNetwork.getInterfaces()
                self.list = []
                default_gw = None
-               num_configured_if = len(iNetwork.configuredInterfaces)
+               num_configured_if = len(iNetwork.getConfiguredAdapters())
+               if num_configured_if >= 2:
+                       self["ButtonBlue"].show()
+                       self["ButtonBluetext"].show()
+                       self["DefaultInterfaceAction"].setEnabled(True)
+               else:
+                       self["ButtonBlue"].hide()
+                       self["ButtonBluetext"].hide()
+                       self["DefaultInterfaceAction"].setEnabled(False)
+
                if num_configured_if < 2 and os_path.exists("/etc/default_gw"):
                        unlink("/etc/default_gw")
                        
                if num_configured_if < 2 and os_path.exists("/etc/default_gw"):
                        unlink("/etc/default_gw")
                        
@@ -86,7 +111,7 @@ class NetworkAdapterSelection(Screen):
                        result = fp.read()
                        fp.close()
                        default_gw = result
                        result = fp.read()
                        fp.close()
                        default_gw = result
-
+                                       
                if len(self.adapters) == 0: # no interface available => display only eth0
                        self.list.append(InterfaceEntryComponent("eth0",iNetwork.getFriendlyAdapterName('eth0'),True,True ))
                else:
                if len(self.adapters) == 0: # no interface available => display only eth0
                        self.list.append(InterfaceEntryComponent("eth0",iNetwork.getFriendlyAdapterName('eth0'),True,True ))
                else:
@@ -106,24 +131,22 @@ class NetworkAdapterSelection(Screen):
                selection = self["list"].getCurrent()
                num_if = len(self.list)
                old_default_gw = None
                selection = self["list"].getCurrent()
                num_if = len(self.list)
                old_default_gw = None
+               num_configured_if = len(iNetwork.getConfiguredAdapters())
                if os_path.exists("/etc/default_gw"):
                        fp = open('/etc/default_gw', 'r')
                        old_default_gw = fp.read()
                        fp.close()
                if os_path.exists("/etc/default_gw"):
                        fp = open('/etc/default_gw', 'r')
                        old_default_gw = fp.read()
                        fp.close()
-               if num_if > 1 and (not old_default_gw or old_default_gw != selection[0]):
+               if num_configured_if > 1 and (not old_default_gw or old_default_gw != selection[0]):
                        fp = open('/etc/default_gw', 'w+')
                        fp.write(selection[0])
                        fp.close()
                        fp = open('/etc/default_gw', 'w+')
                        fp.write(selection[0])
                        fp.close()
-                       iNetwork.restartNetwork()
-                       self.updateList()
-               elif old_default_gw and num_if < 2:
+                       self.restartLan()
+               elif old_default_gw and num_configured_if < 2:
                        unlink("/etc/default_gw")
                        unlink("/etc/default_gw")
-                       iNetwork.restartNetwork()
-                       self.updateList()
+                       self.restartLan()
 
        def okbuttonClick(self):
                selection = self["list"].getCurrent()
 
        def okbuttonClick(self):
                selection = self["list"].getCurrent()
-               print "selection",selection
                if selection is not None:
                        self.session.openWithCallback(self.AdapterSetupClosed, AdapterSetupConfiguration, selection[0])
 
                if selection is not None:
                        self.session.openWithCallback(self.AdapterSetupClosed, AdapterSetupConfiguration, selection[0])
 
@@ -134,25 +157,47 @@ class NetworkAdapterSelection(Screen):
                        self.updateList()
 
        def NetworkFallback(self):
                        self.updateList()
 
        def NetworkFallback(self):
-               if iNetwork.configuredInterfaces.has_key('wlan0') is True:
+               if iNetwork.configuredNetworkAdapters.has_key('wlan0') is True:
                        self.session.openWithCallback(self.ErrorMessageClosed, MessageBox, self.wlan_errortext, type = MessageBox.TYPE_INFO,timeout = 10)
                        self.session.openWithCallback(self.ErrorMessageClosed, MessageBox, self.wlan_errortext, type = MessageBox.TYPE_INFO,timeout = 10)
-               if iNetwork.configuredInterfaces.has_key('ath0') is True:
+               if iNetwork.configuredNetworkAdapters.has_key('ath0') is True:
                        self.session.openWithCallback(self.ErrorMessageClosed, MessageBox, self.wlan_errortext, type = MessageBox.TYPE_INFO,timeout = 10)
                else:
                        self.session.openWithCallback(self.ErrorMessageClosed, MessageBox, self.lan_errortext, type = MessageBox.TYPE_INFO,timeout = 10)
 
        def ErrorMessageClosed(self, *ret):
                        self.session.openWithCallback(self.ErrorMessageClosed, MessageBox, self.wlan_errortext, type = MessageBox.TYPE_INFO,timeout = 10)
                else:
                        self.session.openWithCallback(self.ErrorMessageClosed, MessageBox, self.lan_errortext, type = MessageBox.TYPE_INFO,timeout = 10)
 
        def ErrorMessageClosed(self, *ret):
-               if iNetwork.configuredInterfaces.has_key('wlan0') is True:
+               if iNetwork.configuredNetworkAdapters.has_key('wlan0') is True:
                        self.session.openWithCallback(self.AdapterSetupClosed, AdapterSetupConfiguration, 'wlan0')
                        self.session.openWithCallback(self.AdapterSetupClosed, AdapterSetupConfiguration, 'wlan0')
-               elif iNetwork.configuredInterfaces.has_key('ath0') is True:
+               elif iNetwork.configuredNetworkAdapters.has_key('ath0') is True:
                        self.session.openWithCallback(self.AdapterSetupClosed, AdapterSetupConfiguration, 'ath0')
                else:
                        self.session.openWithCallback(self.AdapterSetupClosed, AdapterSetupConfiguration, 'eth0')
 
                        self.session.openWithCallback(self.AdapterSetupClosed, AdapterSetupConfiguration, 'ath0')
                else:
                        self.session.openWithCallback(self.AdapterSetupClosed, AdapterSetupConfiguration, 'eth0')
 
-class NameserverSetup(Screen, ConfigListScreen):
+       def cleanup(self):
+               iNetwork.stopLinkStateConsole()
+               iNetwork.stopRestartConsole()
+
+       def restartLan(self):
+               iNetwork.restartNetwork(self.restartLanDataAvail)
+               self.restartLanRef = self.session.openWithCallback(self.restartfinishedCB, MessageBox, _("Please wait while we configure your network..."), type = MessageBox.TYPE_INFO, enable_input = False)
+                       
+       def restartLanDataAvail(self, data):
+               if data is True:
+                       iNetwork.getInterfaces(self.getInterfacesDataAvail)
+
+       def getInterfacesDataAvail(self, data):
+               if data is True:
+                       self.restartLanRef.close(True)
+
+       def restartfinishedCB(self,data):
+               if data is True:
+                       self.updateList()
+                       self.session.open(MessageBox, _("Finished configuring your network"), type = MessageBox.TYPE_INFO, timeout = 10, default = False)
+
+
+class NameserverSetup(Screen, ConfigListScreen, HelpableScreen):
        def __init__(self, session):
                Screen.__init__(self, session)
        def __init__(self, session):
                Screen.__init__(self, session)
-               iNetwork.getInterfaces()
+               HelpableScreen.__init__(self)
                self.backupNameserverList = iNetwork.getNameserverList()[:]
                print "backup-list:", self.backupNameserverList
                
                self.backupNameserverList = iNetwork.getNameserverList()[:]
                print "backup-list:", self.backupNameserverList
                
@@ -162,14 +207,19 @@ class NameserverSetup(Screen, ConfigListScreen):
                self["introduction"] = Label(_("Press OK to activate the settings."))
                self.createConfig()
                
                self["introduction"] = Label(_("Press OK to activate the settings."))
                self.createConfig()
                
-               self["actions"] = ActionMap(["OkCancelActions", "ColorActions"],
-               {
-                       "ok": self.ok,
-                       "cancel": self.cancel,
-                       "red": self.cancel,
-                       "green": self.add,
-                       "yellow": self.remove
-               }, -2)
+               self["OkCancelActions"] = HelpableActionMap(self, "OkCancelActions",
+                       {
+                       "cancel": (self.cancel, _("exit nameserver configuration")),
+                       "ok": (self.ok, _("activate current configuration")),
+                       })
+               
+               self["ColorActions"] = HelpableActionMap(self, "ColorActions",
+                       {
+                       "red": (self.cancel, _("exit nameserver configuration")),
+                       "green": (self.add, _("add a nameserver entry")),
+                       "yellow": (self.remove, _("remove a nameserver entry")),
+                       })
+               
                
                self.list = []
                ConfigListScreen.__init__(self, self.list)
                
                self.list = []
                ConfigListScreen.__init__(self, self.list)
@@ -222,31 +272,51 @@ class NameserverSetup(Screen, ConfigListScreen):
                        self.createConfig()
                        self.createSetup()
        
                        self.createConfig()
                        self.createSetup()
        
-class AdapterSetup(Screen, ConfigListScreen):
+class AdapterSetup(Screen, ConfigListScreen, HelpableScreen):
        def __init__(self, session, iface,essid=None, aplist=None):
                Screen.__init__(self, session)
        def __init__(self, session, iface,essid=None, aplist=None):
                Screen.__init__(self, session)
+               HelpableScreen.__init__(self)
                self.session = session
                self.iface = iface
                self.essid = essid
                self.aplist = aplist
                self.extended = None
                self.session = session
                self.iface = iface
                self.essid = essid
                self.aplist = aplist
                self.extended = None
+               self.applyConfigRef = None
+               self.finished_cb = None
+               self.oktext = _("Press OK on your remote control to continue.")
                self.oldInterfaceState = iNetwork.getAdapterAttribute(self.iface, "up")
                self.oldInterfaceState = iNetwork.getAdapterAttribute(self.iface, "up")
-               iNetwork.getInterfaces()
-
-               self.createConfig()
+               #iNetwork.getInterfaces()
                
                
-               self["actions"] = NumberActionMap(["SetupActions", "ColorActions"],
+               self.createConfig()
+
+               self["OkCancelActions"] = HelpableActionMap(self, "OkCancelActions",
+                       {
+                       "cancel": (self.close, _("exit networkadapter setup menu")),
+                       "ok": (self.ok, _("select menu entry")),
+                       })
+
+               self["ColorActions"] = HelpableActionMap(self, "ColorActions",
+                       {
+                       "red": (self.cancel, _("exit networkadapter configuration")),
+                       "blue": (self.KeyBlue, _("open nameserver configuration")),
+                       })
+
+               self["VirtualKB"] = HelpableActionMap(self, "ColorActions",
+                       {
+                       "green": (self.KeyGreen, [_("open virtual keyboard input help"),_("* Only available when entering hidden ssid or network key")] ),                                      
+                       })
+
+               self["actions"] = NumberActionMap(["SetupActions"],
                {
                        "ok": self.ok,
                {
                        "ok": self.ok,
-                       "cancel": self.cancel,
-                       "red": self.cancel,
-                       "blue": self.KeyBlue,
                }, -2)
                
                }, -2)
                
+               
                self.list = []
                ConfigListScreen.__init__(self, self.list,session = self.session)
                self.createSetup()
                self.onLayoutFinish.append(self.layoutFinished)
                self.list = []
                ConfigListScreen.__init__(self, self.list,session = self.session)
                self.createSetup()
                self.onLayoutFinish.append(self.layoutFinished)
+               self.onClose.append(self.cleanup)
                
                self["DNS1text"] = Label(_("Primary DNS"))
                self["DNS2text"] = Label(_("Secondary DNS"))
                
                self["DNS1text"] = Label(_("Primary DNS"))
                self["DNS2text"] = Label(_("Secondary DNS"))
@@ -271,56 +341,81 @@ class AdapterSetup(Screen, ConfigListScreen):
                self["ButtonRedtext"] = Label(_("Close"))
                self["ButtonBlue"] = Pixmap()
                self["ButtonBluetext"] = Label(_("Edit DNS"))
                self["ButtonRedtext"] = Label(_("Close"))
                self["ButtonBlue"] = Pixmap()
                self["ButtonBluetext"] = Label(_("Edit DNS"))
+               self["ButtonGreen"] = Pixmap()
+               self["VKeyIcon"] = Pixmap()
+               self["HelpWindow"] = Pixmap()
 
        def layoutFinished(self):
                self["DNS1"].setText(self.primaryDNS.getText())
                self["DNS2"].setText(self.secondaryDNS.getText())
                if self.ipConfigEntry.getText() is not None:
 
        def layoutFinished(self):
                self["DNS1"].setText(self.primaryDNS.getText())
                self["DNS2"].setText(self.secondaryDNS.getText())
                if self.ipConfigEntry.getText() is not None:
-                       self["IP"].setText(self.ipConfigEntry.getText())
+                       if self.ipConfigEntry.getText() == "0.0.0.0":
+                               self["IP"].setText(_("N/A"))
+                       else:   
+                               self["IP"].setText(self.ipConfigEntry.getText())
                else:
                else:
-                       self["IP"].setText([0,0,0,0])
-               self["Mask"].setText(self.netmaskConfigEntry.getText())
+                       self["IP"].setText(_("N/A"))
+               if self.netmaskConfigEntry.getText() is not None:
+                       if self.netmaskConfigEntry.getText() == "0.0.0.0":
+                                       self["Mask"].setText(_("N/A"))
+                       else:   
+                               self["Mask"].setText(self.netmaskConfigEntry.getText())
+               else:
+                       self["IP"].setText(_("N/A"))                    
                if iNetwork.getAdapterAttribute(self.iface, "gateway"):
                if iNetwork.getAdapterAttribute(self.iface, "gateway"):
-                       self["Gateway"].setText(self.gatewayConfigEntry.getText())
+                       if self.gatewayConfigEntry.getText() == "0.0.0.0":
+                               self["Gateway"].setText(_("N/A"))
+                       else:
+                               self["Gateway"].setText(self.gatewayConfigEntry.getText())
                else:
                        self["Gateway"].hide()
                        self["Gatewaytext"].hide()
                self["Adapter"].setText(iNetwork.getFriendlyAdapterName(self.iface))
                else:
                        self["Gateway"].hide()
                        self["Gatewaytext"].hide()
                self["Adapter"].setText(iNetwork.getFriendlyAdapterName(self.iface))
+               self["ButtonGreen"].hide()
+               self["VKeyIcon"].hide()
+               self["VirtualKB"].setEnabled(False)
+               self["HelpWindow"].hide()
 
        def createConfig(self):
                self.InterfaceEntry = None
                self.dhcpEntry = None
                self.gatewayEntry = None
 
        def createConfig(self):
                self.InterfaceEntry = None
                self.dhcpEntry = None
                self.gatewayEntry = None
-               self.SSIDscan = None
+               self.hiddenSSID = None
                self.wlanSSID = None
                self.wlanSSID = None
-               self.manualwlanSSID = None
                self.encryptionEnabled = None
                self.encryptionKey = None
                self.encryptionEnabled = None
                self.encryptionKey = None
+               self.encryptionType = None
                self.nwlist = None
                self.nwlist = None
+               self.encryptionlist = None
+               self.weplist = None
                self.wsconfig = None
                self.default = None
                
                if self.iface == "wlan0" or self.iface == "ath0" :
                        from Plugins.SystemPlugins.WirelessLan.Wlan import wpaSupplicant,Wlan
                self.wsconfig = None
                self.default = None
                
                if self.iface == "wlan0" or self.iface == "ath0" :
                        from Plugins.SystemPlugins.WirelessLan.Wlan import wpaSupplicant,Wlan
+                       self.w = Wlan(self.iface)
                        self.ws = wpaSupplicant()
                        self.ws = wpaSupplicant()
-                       list = []
-                       list.append(_("WEP"))
-                       list.append(_("WPA"))
-                       list.append(_("WPA2"))
+                       self.encryptionlist = []
+                       self.encryptionlist.append(("WEP", _("WEP")))
+                       self.encryptionlist.append(("WPA", _("WPA")))
+                       self.encryptionlist.append(("WPA2", _("WPA2")))
+                       self.encryptionlist.append(("WPA/WPA2", _("WPA or WPA2")))
+                       self.weplist = []
+                       self.weplist.append("ASCII")
+                       self.weplist.append("HEX")
                        if self.aplist is not None:
                                self.nwlist = self.aplist
                                self.nwlist.sort(key = lambda x: x[0])
                        else:
                                self.nwlist = []
                        if self.aplist is not None:
                                self.nwlist = self.aplist
                                self.nwlist.sort(key = lambda x: x[0])
                        else:
                                self.nwlist = []
-                               self.w = None
                                self.aps = None
                                try:
                                self.aps = None
                                try:
-                                       self.w = Wlan(self.iface)
                                        self.aps = self.w.getNetworkList()
                                        if self.aps is not None:
                                                print "[NetworkSetup.py] got Accespoints!"
                                        self.aps = self.w.getNetworkList()
                                        if self.aps is not None:
                                                print "[NetworkSetup.py] got Accespoints!"
-                                               for ap in aps:
-                                                       a = aps[ap]
+                                               print self.aps
+                                               for ap in self.aps:
+                                                       a = self.aps[ap]
                                                        if a['active']:
                                                                if a['essid'] == "":
                                                                        a['essid'] = a['bssid']
                                                        if a['active']:
                                                                if a['essid'] == "":
                                                                        a['essid'] = a['bssid']
@@ -330,17 +425,23 @@ class AdapterSetup(Screen, ConfigListScreen):
                                        self.nwlist.append("No Networks found")
 
                        self.wsconfig = self.ws.loadConfig()
                                        self.nwlist.append("No Networks found")
 
                        self.wsconfig = self.ws.loadConfig()
-                       self.default = self.essid or self.wsconfig['ssid']
+                       if self.essid is not None: # ssid from wlan scan
+                               self.default = self.essid
+                       else:
+                               self.default = self.wsconfig['ssid']
+                               
+                       if "hidden..." not in self.nwlist:
+                               self.nwlist.append("hidden...")
                        if self.default not in self.nwlist:
                                self.nwlist.append(self.default)
                        if self.default not in self.nwlist:
                                self.nwlist.append(self.default)
-                       config.plugins.wlan.essidscan = NoSave(ConfigYesNo(default = self.wsconfig['ssidscan']))
-                       if self.wsconfig['ssidscan'] is True:
-                               config.plugins.wlan.essid = NoSave(ConfigSelection(self.nwlist, default = self.default ))
-                       else:
-                               config.plugins.wlan.essid = NoSave(ConfigText(default = self.default, visible_width = 50, fixed_size = False))
+
+                       config.plugins.wlan.essid = NoSave(ConfigSelection(self.nwlist, default = self.default ))
+                       config.plugins.wlan.hiddenessid = NoSave(ConfigText(default = self.wsconfig['hiddenessid'], visible_width = 50, fixed_size = False))
+
                        config.plugins.wlan.encryption.enabled = NoSave(ConfigYesNo(default = self.wsconfig['encryption'] ))
                        config.plugins.wlan.encryption.enabled = NoSave(ConfigYesNo(default = self.wsconfig['encryption'] ))
-                       config.plugins.wlan.encryption.type = NoSave(ConfigSelection(list, default = self.wsconfig['encryption_type'] ))
-                       config.plugins.wlan.encryption.psk = NoSave(ConfigText(default = self.wsconfig['key'], visible_width = 50, fixed_size = False))
+                       config.plugins.wlan.encryption.type = NoSave(ConfigSelection(self.encryptionlist, default = self.wsconfig['encryption_type'] ))
+                       config.plugins.wlan.encryption.wepkeytype = NoSave(ConfigSelection(self.weplist, default = self.wsconfig['encryption_wepkeytype'] ))
+                       config.plugins.wlan.encryption.psk = NoSave(ConfigPassword(default = self.wsconfig['key'], visible_width = 50, fixed_size = False))
                
                self.activateInterfaceEntry = NoSave(ConfigYesNo(default=iNetwork.getAdapterAttribute(self.iface, "up") or False))
                self.dhcpConfigEntry = NoSave(ConfigYesNo(default=iNetwork.getAdapterAttribute(self.iface, "dhcp") or False))
                
                self.activateInterfaceEntry = NoSave(ConfigYesNo(default=iNetwork.getAdapterAttribute(self.iface, "up") or False))
                self.dhcpConfigEntry = NoSave(ConfigYesNo(default=iNetwork.getAdapterAttribute(self.iface, "dhcp") or False))
@@ -382,26 +483,56 @@ class AdapterSetup(Screen, ConfigListScreen):
                                                        self.configStrings = p.__call__["configStrings"]
                                                else:
                                                        self.configStrings = None
                                                        self.configStrings = p.__call__["configStrings"]
                                                else:
                                                        self.configStrings = None
-                                               self.SSIDscan = getConfigListEntry(_("Automatic SSID lookup"), config.plugins.wlan.essidscan)
-                                               self.list.append(self.SSIDscan)
-                                               self.wlanSSID = getConfigListEntry(_("Network SSID"), config.plugins.wlan.essid)
-                                               self.list.append(self.wlanSSID)
+                                               if config.plugins.wlan.essid.value == 'hidden...':
+                                                       self.wlanSSID = getConfigListEntry(_("Network SSID"), config.plugins.wlan.essid)
+                                                       self.list.append(self.wlanSSID)
+                                                       self.hiddenSSID = getConfigListEntry(_("Hidden network SSID"), config.plugins.wlan.hiddenessid)
+                                                       self.list.append(self.hiddenSSID)
+                                               else:
+                                                       self.wlanSSID = getConfigListEntry(_("Network SSID"), config.plugins.wlan.essid)
+                                                       self.list.append(self.wlanSSID)
                                                self.encryptionEnabled = getConfigListEntry(_("Encryption"), config.plugins.wlan.encryption.enabled)
                                                self.list.append(self.encryptionEnabled)
                                                
                                                if config.plugins.wlan.encryption.enabled.value:
                                                self.encryptionEnabled = getConfigListEntry(_("Encryption"), config.plugins.wlan.encryption.enabled)
                                                self.list.append(self.encryptionEnabled)
                                                
                                                if config.plugins.wlan.encryption.enabled.value:
-                                                       self.list.append(getConfigListEntry(_("Encryption Type"), config.plugins.wlan.encryption.type))
-                                                       self.encryptionKey = getConfigListEntry(_("Encryption Key"), config.plugins.wlan.encryption.psk)                                                
-                                                       self.list.append(self.encryptionKey)
+                                                       self.encryptionType = getConfigListEntry(_("Encryption Type"), config.plugins.wlan.encryption.type)
+                                                       self.list.append(self.encryptionType)
+                                                       if config.plugins.wlan.encryption.type.value == 'WEP':
+                                                               self.list.append(getConfigListEntry(_("Encryption Keytype"), config.plugins.wlan.encryption.wepkeytype))
+                                                               self.encryptionKey = getConfigListEntry(_("Encryption Key"), config.plugins.wlan.encryption.psk)                                                
+                                                               self.list.append(self.encryptionKey)                                                    
+                                                       else:                                                           
+                                                               self.encryptionKey = getConfigListEntry(_("Encryption Key"), config.plugins.wlan.encryption.psk)                                                
+                                                               self.list.append(self.encryptionKey)
+       
                
                self["config"].list = self.list
                self["config"].l.setList(self.list)
                
                self["config"].list = self.list
                self["config"].l.setList(self.list)
+               if not self.selectionChanged in self["config"].onSelectionChanged:
+                       self["config"].onSelectionChanged.append(self.selectionChanged)
 
        def KeyBlue(self):
                self.session.openWithCallback(self.NameserverSetupClosed, NameserverSetup)
 
 
        def KeyBlue(self):
                self.session.openWithCallback(self.NameserverSetupClosed, NameserverSetup)
 
+       def KeyGreen(self):
+               if self.iface == "wlan0" or self.iface == "ath0" :      
+                       if self["config"].getCurrent() == self.hiddenSSID:
+                               if config.plugins.wlan.essid.value == 'hidden...':
+                                       self.session.openWithCallback(self.VirtualKeyBoardSSIDCallback, VirtualKeyBoard, title = (_("Enter WLAN networkname/SSID:")), text = config.plugins.wlan.essid.value)
+                       if self["config"].getCurrent() == self.encryptionKey:
+                               self.session.openWithCallback(self.VirtualKeyBoardKeyCallback, VirtualKeyBoard, title = (_("Enter WLAN passphrase/key:")), text = config.plugins.wlan.encryption.psk.value)
+       
+       def VirtualKeyBoardSSIDCallback(self, callback = None):
+               if callback is not None and len(callback):
+                       config.plugins.wlan.hiddenessid = NoSave(ConfigText(default = callback, visible_width = 50, fixed_size = False))
+                       self.createSetup()
+                       
+       def VirtualKeyBoardKeyCallback(self, callback = None):
+               if callback is not None and len(callback):
+                       config.plugins.wlan.encryption.psk = NoSave(ConfigPassword(default = callback, visible_width = 50, fixed_size = False))
+                       self.createSetup()
+                       
        def newConfig(self):
        def newConfig(self):
-               print self["config"].getCurrent()
                if self["config"].getCurrent() == self.InterfaceEntry:
                        self.createSetup()
                if self["config"].getCurrent() == self.dhcpEntry:
                if self["config"].getCurrent() == self.InterfaceEntry:
                        self.createSetup()
                if self["config"].getCurrent() == self.dhcpEntry:
@@ -409,15 +540,12 @@ class AdapterSetup(Screen, ConfigListScreen):
                if self["config"].getCurrent() == self.gatewayEntry:
                        self.createSetup()
                if self.iface == "wlan0" or self.iface == "ath0" :      
                if self["config"].getCurrent() == self.gatewayEntry:
                        self.createSetup()
                if self.iface == "wlan0" or self.iface == "ath0" :      
-                       if self["config"].getCurrent() == self.SSIDscan:
-                               if config.plugins.wlan.essidscan.value is True:
-                                       config.plugins.wlan.essid = NoSave(ConfigSelection(self.nwlist, default = self.default ))
-                               else:
-                                       config.plugins.wlan.essid = NoSave(ConfigText(default = self.default, visible_width = 50, fixed_size = False))
+                       if self["config"].getCurrent() == self.wlanSSID:
                                self.createSetup()
                        if self["config"].getCurrent() == self.encryptionEnabled:
                                self.createSetup()
                                self.createSetup()
                        if self["config"].getCurrent() == self.encryptionEnabled:
                                self.createSetup()
-               
+                       if self["config"].getCurrent() == self.encryptionType:
+                               self.createSetup()      
        def keyLeft(self):
                ConfigListScreen.keyLeft(self)
                self.newConfig()
        def keyLeft(self):
                ConfigListScreen.keyLeft(self)
                self.newConfig()
@@ -426,24 +554,92 @@ class AdapterSetup(Screen, ConfigListScreen):
                ConfigListScreen.keyRight(self)
                self.newConfig()
 
                ConfigListScreen.keyRight(self)
                self.newConfig()
 
+       def selectionChanged(self):
+               current = self["config"].getCurrent()
+               if current == self.hiddenSSID and config.plugins.wlan.essid.value == 'hidden...':
+                       helpwindowpos = self["HelpWindow"].getPosition()
+                       if current[1].help_window.instance is not None:
+                               current[1].help_window.instance.move(ePoint(helpwindowpos[0],helpwindowpos[1]))
+                               self["ButtonGreen"].show()
+                               self["VKeyIcon"].show()
+                               self["VirtualKB"].setEnabled(True)                      
+               elif current == self.encryptionKey and config.plugins.wlan.encryption.enabled.value:
+                       helpwindowpos = self["HelpWindow"].getPosition()
+                       if current[1].help_window.instance is not None:
+                               current[1].help_window.instance.move(ePoint(helpwindowpos[0],helpwindowpos[1]))
+                               self["ButtonGreen"].show()
+                               self["VKeyIcon"].show()
+                               self["VirtualKB"].setEnabled(True)                      
+               else:   
+                       self["ButtonGreen"].hide()
+                       self["VKeyIcon"].hide()
+                       self["VirtualKB"].setEnabled(False)
+
        def ok(self):
        def ok(self):
-               iNetwork.setAdapterAttribute(self.iface, "up", self.activateInterfaceEntry.value)
-               iNetwork.setAdapterAttribute(self.iface, "dhcp", self.dhcpConfigEntry.value)
-               iNetwork.setAdapterAttribute(self.iface, "ip", self.ipConfigEntry.value)
-               iNetwork.setAdapterAttribute(self.iface, "netmask", self.netmaskConfigEntry.value)
-               if self.hasGatewayConfigEntry.value:
-                       iNetwork.setAdapterAttribute(self.iface, "gateway", self.gatewayConfigEntry.value)
+               current = self["config"].getCurrent()
+               if current == self.hiddenSSID and config.plugins.wlan.essid.value == 'hidden...':
+                       if current[1].help_window.instance is not None:
+                               current[1].help_window.instance.hide()
+               elif current == self.encryptionKey and config.plugins.wlan.encryption.enabled.value:
+                       if current[1].help_window.instance is not None:
+                               current[1].help_window.instance.hide()
+               self.session.openWithCallback(self.applyConfig, MessageBox, (_("Are you sure you want to activate this network configuration?\n\n") + self.oktext ) )
+
+       def applyConfig(self, ret = False):
+               if (ret == True):
+                       iNetwork.setAdapterAttribute(self.iface, "up", self.activateInterfaceEntry.value)
+                       iNetwork.setAdapterAttribute(self.iface, "dhcp", self.dhcpConfigEntry.value)
+                       iNetwork.setAdapterAttribute(self.iface, "ip", self.ipConfigEntry.value)
+                       iNetwork.setAdapterAttribute(self.iface, "netmask", self.netmaskConfigEntry.value)
+                       if self.hasGatewayConfigEntry.value:
+                               iNetwork.setAdapterAttribute(self.iface, "gateway", self.gatewayConfigEntry.value)
+                       else:
+                               iNetwork.removeAdapterAttribute(self.iface, "gateway")
+                       if self.extended is not None and self.configStrings is not None:
+                               iNetwork.setAdapterAttribute(self.iface, "configStrings", self.configStrings(self.iface))
+                               self.ws.writeConfig()
+                       if self.activateInterfaceEntry.value is False:
+                               iNetwork.deactivateInterface(self.iface)
+                       iNetwork.writeNetworkConfig()                   
+                       iNetwork.restartNetwork(self.applyConfigDataAvail)
+                       self.applyConfigRef = self.session.openWithCallback(self.applyConfigfinishedCB, MessageBox, _("Please wait while activating your network configuration..."), type = MessageBox.TYPE_INFO, enable_input = False)
                else:
                else:
-                       iNetwork.removeAdapterAttribute(self.iface, "gateway")
-               if self.extended is not None and self.configStrings is not None:
-                       iNetwork.setAdapterAttribute(self.iface, "configStrings", self.configStrings(self.iface))
-                       self.ws.writeConfig()
-               if self.activateInterfaceEntry.value is False:
-                       iNetwork.deactivateInterface(self.iface)
-               iNetwork.writeNetworkConfig()
-               iNetwork.deactivateNetworkConfig()
-               iNetwork.activateNetworkConfig()
-               self.close()
+                       self.cancel()
+                       
+       def applyConfigDataAvail(self, data):
+               if data is True:
+                       iNetwork.getInterfaces(self.getInterfacesDataAvail)
+
+       def getInterfacesDataAvail(self, data):
+               if data is True:
+                       self.applyConfigRef.close(True)
+
+       def applyConfigfinishedCB(self,data):
+               if data is True:
+                       num_configured_if = len(iNetwork.getConfiguredAdapters())
+                       if num_configured_if >= 2:
+                               self.session.openWithCallback(self.secondIfaceFoundCB, MessageBox, _("Your network configuration has been activated.\nA second configured interface has been found.\n\nDo you want to disable the second networkinterface?"), default = True)
+                       else:
+                               if self.finished_cb:
+                                       self.session.openWithCallback(self.finished_cb, MessageBox, _("Your network configuration has been activated."), type = MessageBox.TYPE_INFO, timeout = 10)
+                               else:
+                                       self.session.openWithCallback(self.ConfigfinishedCB, MessageBox, _("Your network configuration has been activated."), type = MessageBox.TYPE_INFO, timeout = 10)
+       
+       def secondIfaceFoundCB(self,data):
+               if data is False:
+                       self.close('ok')
+               else:
+                       configuredInterfaces = configuredNetworkAdapters
+                       for interface in configuredInterfaces:
+                               if interface == self.iface:
+                                       continue
+                               iNetwork.setAdapterAttribute(interface, "up", False)
+                               iNetwork.deactivateInterface(interface)
+                               self.applyConfig(True)
+                       
+       def ConfigfinishedCB(self,data):
+               if data is True:
+                       self.close('ok')
 
        def cancel(self):
                iNetwork.setAdapterAttribute(self.iface, "up", self.oldInterfaceState)
 
        def cancel(self):
                iNetwork.setAdapterAttribute(self.iface, "up", self.oldInterfaceState)
@@ -451,11 +647,12 @@ class AdapterSetup(Screen, ConfigListScreen):
                if self.activateInterfaceEntry.value is False:
                        iNetwork.deactivateInterface(self.iface)
                iNetwork.getInterfaces()
                if self.activateInterfaceEntry.value is False:
                        iNetwork.deactivateInterface(self.iface)
                iNetwork.getInterfaces()
-               self.close()
+               self.close('cancel')
 
 
-       def run(self):
+       def runAsync(self, finished_cb):
+               self.finished_cb = finished_cb
                self.ok()
                self.ok()
-
+               
        def NameserverSetupClosed(self, *ret):
                iNetwork.loadNameserverConfig()
                nameserver = (iNetwork.getNameserverList() + [[0,0,0,0]] * 2)[0:2]
        def NameserverSetupClosed(self, *ret):
                iNetwork.loadNameserverConfig()
                nameserver = (iNetwork.getNameserverList() + [[0,0,0,0]] * 2)[0:2]
@@ -463,13 +660,18 @@ class AdapterSetup(Screen, ConfigListScreen):
                self.secondaryDNS = NoSave(ConfigIP(default=nameserver[1]))
                self.createSetup()
                self.layoutFinished()
                self.secondaryDNS = NoSave(ConfigIP(default=nameserver[1]))
                self.createSetup()
                self.layoutFinished()
-       
+               
+       def cleanup(self):
+               iNetwork.stopLinkStateConsole()
+               iNetwork.stopRestartConsole()   
 
 
-class AdapterSetupConfiguration(Screen):
+class AdapterSetupConfiguration(Screen, HelpableScreen):
        def __init__(self, session,iface):
                Screen.__init__(self, session)
        def __init__(self, session,iface):
                Screen.__init__(self, session)
+               HelpableScreen.__init__(self)
                self.session = session
                self.iface = iface
                self.session = session
                self.iface = iface
+               self.restartLanRef = None
                self.mainmenu = self.genMainMenu()
                self["menulist"] = MenuList(self.mainmenu)
                self["description"] = Label()
                self.mainmenu = self.genMainMenu()
                self["menulist"] = MenuList(self.mainmenu)
                self["description"] = Label()
@@ -485,8 +687,27 @@ class AdapterSetupConfiguration(Screen):
                
                self.oktext = _("Press OK on your remote control to continue.")
                self.reboottext = _("Your Dreambox will restart after pressing OK on your remote control.")
                
                self.oktext = _("Press OK on your remote control to continue.")
                self.reboottext = _("Your Dreambox will restart after pressing OK on your remote control.")
-               self.errortext = _("No working wireless interface found.\n Please verify that you have attached a compatible WLAN device or enable your local network interface.")      
+               self.errortext = _("No working wireless interface found.\n Please verify that you have attached a compatible WLAN device or enable you local network interface.")       
+               
+               self["WizardActions"] = HelpableActionMap(self, "WizardActions",
+                       {
+                       "up": (self.up, _("move up to previous entry")),
+                       "down": (self.down, _("move down to next entry")),
+                       "left": (self.left, _("move up to first entry")),
+                       "right": (self.right, _("move down to last entry")),
+                       })
                
                
+               self["OkCancelActions"] = HelpableActionMap(self, "OkCancelActions",
+                       {
+                       "cancel": (self.close, _("exit networkadapter setup menu")),
+                       "ok": (self.ok, _("select menu entry")),
+                       })
+
+               self["ColorActions"] = HelpableActionMap(self, "ColorActions",
+                       {
+                       "red": (self.close, _("exit networkadapter setup menu")),       
+                       })
+
                self["actions"] = NumberActionMap(["WizardActions","ShortcutActions"],
                {
                        "ok": self.ok,
                self["actions"] = NumberActionMap(["WizardActions","ShortcutActions"],
                {
                        "ok": self.ok,
@@ -498,9 +719,10 @@ class AdapterSetupConfiguration(Screen):
                        "right": self.right,
                }, -2)
                
                        "right": self.right,
                }, -2)
                
-               iNetwork.getInterfaces()
+               iNetwork.getInterfaces(self.updateStatusbar)
                self.onLayoutFinish.append(self.layoutFinished)
                self.onLayoutFinish.append(self.layoutFinished)
-               self.updateStatusbar()
+               self.onClose.append(self.cleanup)
+               self.onHide.append(self.cleanup)
 
        def ok(self):
                if self["menulist"].getCurrent()[1] == 'edit':
 
        def ok(self):
                if self["menulist"].getCurrent()[1] == 'edit':
@@ -549,7 +771,6 @@ class AdapterSetupConfiguration(Screen):
                                self.wlanresponse = ifobj.getStatistics()
                                if self.wlanresponse[0] != 19:
                                        self.session.openWithCallback(self.AdapterSetupClosed, WlanStatus,self.iface)
                                self.wlanresponse = ifobj.getStatistics()
                                if self.wlanresponse[0] != 19:
                                        self.session.openWithCallback(self.AdapterSetupClosed, WlanStatus,self.iface)
-                                       #self.session.open(WlanStatus,self.iface)
                                else:
                                        # Display Wlan not available Message
                                        self.showErrorMessage()
                                else:
                                        # Display Wlan not available Message
                                        self.showErrorMessage()
@@ -584,6 +805,7 @@ class AdapterSetupConfiguration(Screen):
                self.loadDescription()
 
        def loadDescription(self):
                self.loadDescription()
 
        def loadDescription(self):
+               print self["menulist"].getCurrent()[1]
                if self["menulist"].getCurrent()[1] == 'edit':
                        self["description"].setText(_("Edit the network configuration of your Dreambox.\n" ) + self.oktext )
                if self["menulist"].getCurrent()[1] == 'test':
                if self["menulist"].getCurrent()[1] == 'edit':
                        self["description"].setText(_("Edit the network configuration of your Dreambox.\n" ) + self.oktext )
                if self["menulist"].getCurrent()[1] == 'test':
@@ -601,7 +823,7 @@ class AdapterSetupConfiguration(Screen):
                if self["menulist"].getCurrent()[1][0] == 'extendedSetup':
                        self["description"].setText(_(self["menulist"].getCurrent()[1][1]) + self.oktext )
                
                if self["menulist"].getCurrent()[1][0] == 'extendedSetup':
                        self["description"].setText(_(self["menulist"].getCurrent()[1][1]) + self.oktext )
                
-       def updateStatusbar(self):
+       def updateStatusbar(self, data = None):
                self["IFtext"].setText(_("Network:"))
                self["IF"].setText(iNetwork.getFriendlyAdapterName(self.iface))
                self["Statustext"].setText(_("Link:"))
                self["IFtext"].setText(_("Network:"))
                self["IF"].setText(iNetwork.getFriendlyAdapterName(self.iface))
                self["Statustext"].setText(_("Link:"))
@@ -661,21 +883,52 @@ class AdapterSetupConfiguration(Screen):
                return menu
 
        def AdapterSetupClosed(self, *ret):
                return menu
 
        def AdapterSetupClosed(self, *ret):
-               self.mainmenu = self.genMainMenu()
-               self["menulist"].l.setList(self.mainmenu)
-               iNetwork.getInterfaces()
-               self.updateStatusbar()
+               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:
+                               try:
+                                       from Plugins.SystemPlugins.WirelessLan.plugin import WlanStatus
+                                       from Plugins.SystemPlugins.WirelessLan.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.AdapterSetupClosed, WlanStatus,self.iface)
+                                       else:
+                                               # Display Wlan not available Message
+                                               self.showErrorMessage()
+                       else:
+                               self.mainmenu = self.genMainMenu()
+                               self["menulist"].l.setList(self.mainmenu)
+                               iNetwork.getInterfaces(self.updateStatusbar)
+               else:
+                       self.mainmenu = self.genMainMenu()
+                       self["menulist"].l.setList(self.mainmenu)
+                       iNetwork.getInterfaces(self.updateStatusbar)
 
        def WlanScanClosed(self,*ret):
                if ret[0] is not None:
                        self.session.openWithCallback(self.AdapterSetupClosed, AdapterSetup, self.iface,ret[0],ret[1])
                else:
 
        def WlanScanClosed(self,*ret):
                if ret[0] is not None:
                        self.session.openWithCallback(self.AdapterSetupClosed, AdapterSetup, self.iface,ret[0],ret[1])
                else:
-                       self.session.openWithCallback(self.AdapterSetupClosed, AdapterSetup, self.iface,None,ret[0])
-
+                       self.session.openWithCallback(self.AdapterSetupClosed, AdapterSetup, self.iface,None,None)
 
        def restartLan(self, ret = False):
                if (ret == True):
 
        def restartLan(self, ret = False):
                if (ret == True):
-                       iNetwork.restartNetwork()
+                       iNetwork.restartNetwork(self.restartLanDataAvail)
+                       self.restartLanRef = self.session.openWithCallback(self.restartfinishedCB, MessageBox, _("Please wait while your network is restarting..."), type = MessageBox.TYPE_INFO, enable_input = False)
+                       
+       def restartLanDataAvail(self, data):
+               if data is True:
+                       iNetwork.getInterfaces(self.getInterfacesDataAvail)
+
+       def getInterfacesDataAvail(self, data):
+               if data is True:
+                       self.restartLanRef.close(True)
+
+       def restartfinishedCB(self,data):
+               if data is True:
+                       self.session.open(MessageBox, _("Finished restarting your network"), type = MessageBox.TYPE_INFO, timeout = 10, default = False)
 
        def getLinkState(self,iface):
                iNetwork.getLinkState(iface,self.dataAvail)
 
        def getLinkState(self,iface):
                iNetwork.getLinkState(iface,self.dataAvail)
@@ -693,12 +946,16 @@ class AdapterSetupConfiguration(Screen):
 
        def showErrorMessage(self):
                self.session.open(MessageBox, self.errortext, type = MessageBox.TYPE_INFO,timeout = 10 )
 
        def showErrorMessage(self):
                self.session.open(MessageBox, self.errortext, type = MessageBox.TYPE_INFO,timeout = 10 )
+               
+       def cleanup(self):
+               iNetwork.stopLinkStateConsole()
 
 
 class NetworkAdapterTest(Screen):      
        def __init__(self, session,iface):
                Screen.__init__(self, session)
                self.iface = iface
 
 
 class NetworkAdapterTest(Screen):      
        def __init__(self, session,iface):
                Screen.__init__(self, session)
                self.iface = iface
+               self.oldInterfaceState = iNetwork.getAdapterAttribute(self.iface, "up")
                iNetwork.getInterfaces()
                self.setLabels()
                
                iNetwork.getInterfaces()
                self.setLabels()
                
@@ -713,8 +970,8 @@ class NetworkAdapterTest(Screen):
                
                self["shortcuts"] = ActionMap(["ShortcutActions","WizardActions"],
                {
                
                self["shortcuts"] = ActionMap(["ShortcutActions","WizardActions"],
                {
-                       "red": self.close,
-                       "back": self.close,
+                       "red": self.cancel,
+                       "back": self.cancel,
                }, -2)
                self["infoshortcuts"] = ActionMap(["ShortcutActions","WizardActions"],
                {
                }, -2)
                self["infoshortcuts"] = ActionMap(["ShortcutActions","WizardActions"],
                {
@@ -745,6 +1002,12 @@ class NetworkAdapterTest(Screen):
                self.nextStepTimer = eTimer()
                self.nextStepTimer.callback.append(self.nextStepTimerFire)
 
                self.nextStepTimer = eTimer()
                self.nextStepTimer.callback.append(self.nextStepTimerFire)
 
+       def cancel(self):
+               if self.oldInterfaceState is False:
+                       iNetwork.setAdapterAttribute(self.iface, "up", self.oldInterfaceState)
+                       iNetwork.deactivateInterface(self.iface)
+               self.close()
+
        def closeInfo(self):
                self["shortcuts"].setEnabled(True)              
                self["infoshortcuts"].setEnabled(False)
        def closeInfo(self):
                self["shortcuts"].setEnabled(True)              
                self["infoshortcuts"].setEnabled(False)
@@ -874,48 +1137,15 @@ class NetworkAdapterTest(Screen):
 
        def doStep5(self):
                self["IPtext"].setForegroundColorNum(1)
 
        def doStep5(self):
                self["IPtext"].setForegroundColorNum(1)
-               ret = iNetwork.checkNetworkState()
-               if ret == True:
-                       self["IP"].setForegroundColorNum(2)
-                       self["IP"].setText(_("confirmed"))
-                       self["IPInfo_Check"].setPixmapNum(0)
-               else:
-                       self["IP"].setForegroundColorNum(1)
-                       self["IP"].setText(_("unconfirmed"))
-                       self["IPInfo_Check"].setPixmapNum(1)
-               self["IPInfo_Check"].show()
-               self["IPInfo_Text"].setForegroundColorNum(1)
-               self.steptimer = True
-               self.nextStepTimer.start(3000)
+               self["IP"].setText(_("Please wait..."))
+               iNetwork.checkNetworkState(self.NetworkStatedataAvail)
 
        def doStep6(self):
                self.steptimer = False
                self.nextStepTimer.stop()
                self["DNStext"].setForegroundColorNum(1)
 
        def doStep6(self):
                self.steptimer = False
                self.nextStepTimer.stop()
                self["DNStext"].setForegroundColorNum(1)
-               ret = iNetwork.checkDNSLookup()
-               if ret == True:
-                       self["DNS"].setForegroundColorNum(2)
-                       self["DNS"].setText(_("confirmed"))
-                       self["DNSInfo_Check"].setPixmapNum(0)
-               else:
-                       self["DNS"].setForegroundColorNum(1)
-                       self["DNS"].setText(_("unconfirmed"))
-                       self["DNSInfo_Check"].setPixmapNum(1)
-               self["DNSInfo_Check"].show()
-               self["DNSInfo_Text"].setForegroundColorNum(1)
-               
-               self["EditSettings_Text"].show()
-               self["EditSettingsButton"].setPixmapNum(1)
-               self["EditSettings_Text"].setForegroundColorNum(2) # active
-               self["EditSettingsButton"].show()
-               self["ButtonYellow_Check"].setPixmapNum(1)
-               self["ButtonGreentext"].setText(_("Restart test"))
-               self["ButtonGreen_Check"].setPixmapNum(0)
-               self["shortcutsgreen"].setEnabled(False)
-               self["shortcutsgreen_restart"].setEnabled(True)
-               self["shortcutsyellow"].setEnabled(False)
-               self["updown_actions"].setEnabled(True)
-               self.activebutton = 6
+               self["DNS"].setText(_("Please wait..."))
+               iNetwork.checkDNSLookup(self.DNSLookupdataAvail)
 
        def KeyGreen(self):
                self["shortcutsgreen"].setEnabled(False)
 
        def KeyGreen(self):
                self["shortcutsgreen"].setEnabled(False)
@@ -1076,9 +1306,9 @@ class NetworkAdapterTest(Screen):
                                        self["NetworkInfo_Check"].setPixmapNum(1)
                                        self["NetworkInfo_Check"].show()
                else:
                                        self["NetworkInfo_Check"].setPixmapNum(1)
                                        self["NetworkInfo_Check"].show()
                else:
-                       iNetwork.getLinkState(iface,self.dataAvail)
+                       iNetwork.getLinkState(iface,self.LinkStatedataAvail)
 
 
-       def dataAvail(self,data):
+       def LinkStatedataAvail(self,data):
                self.output = data.strip()
                result = self.output.split('\n')
                pattern = re_compile("Link detected: yes")
                self.output = data.strip()
                result = self.output.split('\n')
                pattern = re_compile("Link detected: yes")
@@ -1093,4 +1323,44 @@ class NetworkAdapterTest(Screen):
                                self["NetworkInfo_Check"].setPixmapNum(1)
                self["NetworkInfo_Check"].show()
 
                                self["NetworkInfo_Check"].setPixmapNum(1)
                self["NetworkInfo_Check"].show()
 
-
+       def NetworkStatedataAvail(self,data):
+               print "DATA",data
+               if data <= 2:
+                       self["IP"].setForegroundColorNum(2)
+                       self["IP"].setText(_("confirmed"))
+                       self["IPInfo_Check"].setPixmapNum(0)
+               else:
+                       self["IP"].setForegroundColorNum(1)
+                       self["IP"].setText(_("unconfirmed"))
+                       self["IPInfo_Check"].setPixmapNum(1)
+               self["IPInfo_Check"].show()
+               self["IPInfo_Text"].setForegroundColorNum(1)            
+               self.steptimer = True
+               self.nextStepTimer.start(3000)          
+               
+       def DNSLookupdataAvail(self,data):
+               print "DATA",data
+               if data <= 2:
+                       self["DNS"].setForegroundColorNum(2)
+                       self["DNS"].setText(_("confirmed"))
+                       self["DNSInfo_Check"].setPixmapNum(0)
+               else:
+                       self["DNS"].setForegroundColorNum(1)
+                       self["DNS"].setText(_("unconfirmed"))
+                       self["DNSInfo_Check"].setPixmapNum(1)
+               self["DNSInfo_Check"].show()
+               self["DNSInfo_Text"].setForegroundColorNum(1)
+               self["EditSettings_Text"].show()
+               self["EditSettingsButton"].setPixmapNum(1)
+               self["EditSettings_Text"].setForegroundColorNum(2) # active
+               self["EditSettingsButton"].show()
+               self["ButtonYellow_Check"].setPixmapNum(1)
+               self["ButtonGreentext"].setText(_("Restart test"))
+               self["ButtonGreen_Check"].setPixmapNum(0)
+               self["shortcutsgreen"].setEnabled(False)
+               self["shortcutsgreen_restart"].setEnabled(True)
+               self["shortcutsyellow"].setEnabled(False)
+               self["updown_actions"].setEnabled(True)
+               self.activebutton = 6
+               
+               
\ No newline at end of file
diff --git a/lib/python/Screens/VirtualKeyBoard.py b/lib/python/Screens/VirtualKeyBoard.py
new file mode 100755 (executable)
index 0000000..53970ab
--- /dev/null
@@ -0,0 +1,287 @@
+# -*- coding: iso-8859-1 -*-\r
+from Components.Language import language\r
+from Components.ActionMap import ActionMap\r
+from Components.Label import Label\r
+from Components.Pixmap import Pixmap\r
+from Components.MenuList import MenuList\r
+from Components.MultiContent import MultiContentEntryText, MultiContentEntryPixmapAlphaTest\r
+from enigma import eListboxPythonMultiContent, gFont, loadPNG, RT_HALIGN_CENTER, RT_VALIGN_CENTER\r
+from Screen import Screen\r
+from Tools.Directories import resolveFilename, SCOPE_SKIN_IMAGE\r
+\r
+key_backspace = loadPNG(resolveFilename(SCOPE_SKIN_IMAGE, "skin_default/vkey_backspace.png"))\r
+key_bg = loadPNG(resolveFilename(SCOPE_SKIN_IMAGE, "skin_default/vkey_bg.png"))\r
+key_clr = loadPNG(resolveFilename(SCOPE_SKIN_IMAGE, "skin_default/vkey_clr.png"))\r
+key_esc = loadPNG(resolveFilename(SCOPE_SKIN_IMAGE, "skin_default/vkey_esc.png"))\r
+key_ok = loadPNG(resolveFilename(SCOPE_SKIN_IMAGE, "skin_default/vkey_ok.png"))\r
+key_sel = loadPNG(resolveFilename(SCOPE_SKIN_IMAGE, "skin_default/vkey_sel.png"))\r
+key_shift = loadPNG(resolveFilename(SCOPE_SKIN_IMAGE, "skin_default/vkey_shift.png"))\r
+key_shift_sel = loadPNG(resolveFilename(SCOPE_SKIN_IMAGE, "skin_default/vkey_shift_sel.png"))\r
+key_space = loadPNG(resolveFilename(SCOPE_SKIN_IMAGE, "skin_default/vkey_space.png"))\r
+\r
+class VirtualKeyBoardList(MenuList):\r
+       def __init__(self, list, enableWrapAround=False):\r
+               MenuList.__init__(self, list, enableWrapAround, eListboxPythonMultiContent)\r
+               self.l.setFont(0, gFont("Regular", 22))\r
+               self.l.setItemHeight(45)\r
+\r
+def VirtualKeyBoardEntryComponent(keys, selectedKey,shiftMode=False):\r
+       res = [ (keys) ]\r
+       \r
+       x = 0\r
+       count = 0\r
+       if shiftMode:\r
+               shiftkey_png = key_shift_sel\r
+       else:\r
+               shiftkey_png = key_shift\r
+       for key in keys:\r
+               if key == "EXIT":\r
+                       res.append(MultiContentEntryPixmapAlphaTest(pos=(x, 0), size=(45, 45), png=key_esc))\r
+               elif key == "BACKSPACE":\r
+                       res.append(MultiContentEntryPixmapAlphaTest(pos=(x, 0), size=(45, 45), png=key_backspace))\r
+               elif key == "CLEAR":\r
+                       res.append(MultiContentEntryPixmapAlphaTest(pos=(x, 0), size=(45, 45), png=key_clr))\r
+               elif key == "SHIFT":\r
+                       res.append(MultiContentEntryPixmapAlphaTest(pos=(x, 0), size=(45, 45), png=shiftkey_png))\r
+               elif key == "SPACE":\r
+                       res.append(MultiContentEntryPixmapAlphaTest(pos=(x, 0), size=(45, 45), png=key_space))\r
+               elif key == "OK":\r
+                       res.append(MultiContentEntryPixmapAlphaTest(pos=(x, 0), size=(45, 45), png=key_ok))\r
+               #elif key == "<-":\r
+               #       res.append(MultiContentEntryPixmapAlphaTest(pos=(x, 0), size=(45, 45), png=key_left))\r
+               #elif key == "->":\r
+               #       res.append(MultiContentEntryPixmapAlphaTest(pos=(x, 0), size=(45, 45), png=key_right))\r
+               \r
+               else:\r
+                       res.append(MultiContentEntryPixmapAlphaTest(pos=(x, 0), size=(45, 45), png=key_bg))\r
+                       res.append(MultiContentEntryText(pos=(x, 0), size=(45, 45), font=0, text=key.encode("utf-8"), flags=RT_HALIGN_CENTER | RT_VALIGN_CENTER))\r
+               \r
+               if selectedKey == count:\r
+                       res.append(MultiContentEntryPixmapAlphaTest(pos=(x, 0), size=(45, 45), png=key_sel))\r
+               \r
+               x += 45\r
+               count += 1\r
+       \r
+       return res\r
+\r
+\r
+class VirtualKeyBoard(Screen):\r
+\r
+       def __init__(self, session, title="", text=""):\r
+               Screen.__init__(self, session)\r
+               self.keys_list = []\r
+               self.shiftkeys_list = []\r
+               self.lang = language.getLanguage()\r
+               if self.lang == 'de_DE':\r
+                       self.keys_list = [\r
+                               [u"EXIT", u"1", u"2", u"3", u"4", u"5", u"6", u"7", u"8", u"9", u"0", u"BACKSPACE"],\r
+                               [u"q", u"w", u"e", u"r", u"t", u"z", u"u", u"i", u"o", u"p", u"ü", u"+"],\r
+                               [u"a", u"s", u"d", u"f", u"g", u"h", u"j", u"k", u"l", u"ö", u"ä", u"#"],\r
+                               [u"<", u"y", u"x", u"c", u"v", u"b", u"n", u"m", u",", ".", u"-", u"CLEAR"],\r
+                               [u"SHIFT", u"SPACE", u"@", u"ß", u"OK"]]\r
+                       \r
+                       self.shiftkeys_list = [\r
+                               [u"EXIT", u"!", u'"', u"§", u"$", u"%", u"&", u"/", u"(", u")", u"=", u"BACKSPACE"],\r
+                               [u"Q", u"W", u"E", u"R", u"T", u"Z", u"U", u"I", u"O", u"P", u"Ü", u"*"],\r
+                               [u"A", u"S", u"D", u"F", u"G", u"H", u"J", u"K", u"L", u"Ö", u"Ä", u"'"],\r
+                               [u">", u"Y", u"X", u"C", u"V", u"B", u"N", u"M", u";", u":", u"_", u"CLEAR"],\r
+                               [u"SHIFT", u"SPACE", u"?", u"\\", u"OK"]]\r
+                       \r
+               elif self.lang == 'es_ES':\r
+                       #still missing keys (u"ùÙ")\r
+                       self.keys_list = [\r
+                               [u"EXIT", u"1", u"2", u"3", u"4", u"5", u"6", u"7", u"8", u"9", u"0", u"BACKSPACE"],\r
+                               [u"q", u"w", u"e", u"r", u"t", u"z", u"u", u"i", u"o", u"p", u"ú", u"+"],\r
+                               [u"a", u"s", u"d", u"f", u"g", u"h", u"j", u"k", u"l", u"ó", u"á", u"#"],\r
+                               [u"<", u"y", u"x", u"c", u"v", u"b", u"n", u"m", u",", ".", u"-", u"CLEAR"],\r
+                               [u"SHIFT", u"SPACE", u"@", u"£", u"à", u"é", u"è", u"í", u"ì", u"ñ", u"ò", u"OK"]]\r
+                       \r
+                       self.shiftkeys_list = [\r
+                               [u"EXIT", u"!", u'"', u"§", u"$", u"%", u"&", u"/", u"(", u")", u"=", u"BACKSPACE"],\r
+                               [u"Q", u"W", u"E", u"R", u"T", u"Z", u"U", u"I", u"O", u"P", u"Ú", u"*"],\r
+                               [u"A", u"S", u"D", u"F", u"G", u"H", u"J", u"K", u"L", u"Ó", u"Á", u"'"],\r
+                               [u">", u"Y", u"X", u"C", u"V", u"B", u"N", u"M", u";", u":", u"_", u"CLEAR"],\r
+                               [u"SHIFT", u"SPACE", u"?", u"\\", u"À", u"É", u"È",  u"Í", u"Ì", u"Ñ", u"Ò", u"OK"]]\r
+                               \r
+               elif self.lang in ['sv_SE', 'fi_FI']:\r
+                       self.keys_list = [\r
+                               [u"EXIT", u"1", u"2", u"3", u"4", u"5", u"6", u"7", u"8", u"9", u"0", u"BACKSPACE"],\r
+                               [u"q", u"w", u"e", u"r", u"t", u"z", u"u", u"i", u"o", u"p", u"é", u"+"],\r
+                               [u"a", u"s", u"d", u"f", u"g", u"h", u"j", u"k", u"l", u"ö", u"ä", u"#"],\r
+                               [u"<", u"y", u"x", u"c", u"v", u"b", u"n", u"m", u",", ".", u"-", u"CLEAR"],\r
+                               [u"SHIFT", u"SPACE", u"@", u"ß", u"å", u"OK"]]\r
+                               \r
+                       self.shiftkeys_list = [\r
+                               [u"EXIT", u"!", u'"', u"§", u"$", u"%", u"&", u"/", u"(", u")", u"=", u"BACKSPACE"],\r
+                               [u"Q", u"W", u"E", u"R", u"T", u"Z", u"U", u"I", u"O", u"P", u"É", u"*"],\r
+                               [u"A", u"S", u"D", u"F", u"G", u"H", u"J", u"K", u"L", u"Ö", u"Ä", u"'"],\r
+                               [u">", u"Y", u"X", u"C", u"V", u"B", u"N", u"M", u";", u":", u"_", u"CLEAR"],\r
+                               [u"SHIFT", u"SPACE", u"?", u"\\", u"Å", u"OK"]]\r
+               else:\r
+                       self.keys_list = [\r
+                               [u"EXIT", u"1", u"2", u"3", u"4", u"5", u"6", u"7", u"8", u"9", u"0", u"BACKSPACE"],\r
+                               [u"q", u"w", u"e", u"r", u"t", u"z", u"u", u"i", u"o", u"p", u"+", u"@"],\r
+                               [u"a", u"s", u"d", u"f", u"g", u"h", u"j", u"k", u"l", u"#", u"\\"],\r
+                               [u"<", u"y", u"x", u"c", u"v", u"b", u"n", u"m", u",", ".", u"-", u"CLEAR"],\r
+                               [u"SHIFT", u"SPACE", u"OK"]]\r
+                       \r
+                       self.shiftkeys_list = [\r
+                               [u"EXIT", u"!", u'"', u"§", u"$", u"%", u"&", u"/", u"(", u")", u"=", u"BACKSPACE"],\r
+                               [u"Q", u"W", u"E", u"R", u"T", u"Z", u"U", u"I", u"O", u"P", u"*"],\r
+                               [u"A", u"S", u"D", u"F", u"G", u"H", u"J", u"K", u"L", u"'", u"?"],\r
+                               [u">", u"Y", u"X", u"C", u"V", u"B", u"N", u"M", u";", u":", u"_", u"CLEAR"],\r
+                               [u"SHIFT", u"SPACE", u"OK"]]\r
+               \r
+               self.shiftMode = False\r
+               self.text = text\r
+               self.selectedKey = 0\r
+               \r
+               self["header"] = Label(title)\r
+               self["text"] = Label(self.text)\r
+               self["list"] = VirtualKeyBoardList([])\r
+               \r
+               self["actions"] = ActionMap(["OkCancelActions", "WizardActions", "ColorActions"],\r
+                       {\r
+                               "ok": self.okClicked,\r
+                               "cancel": self.exit,\r
+                               "left": self.left,\r
+                               "right": self.right,\r
+                               "up": self.up,\r
+                               "down": self.down,\r
+                               "red": self.backClicked,\r
+                               "green": self.ok\r
+                       }, -2)\r
+               \r
+               self.onLayoutFinish.append(self.buildVirtualKeyBoard)\r
+\r
+       def buildVirtualKeyBoard(self, selectedKey=0):\r
+               list = []\r
+               \r
+               if self.shiftMode:\r
+                       self.k_list = self.shiftkeys_list\r
+                       for keys in self.k_list:\r
+                               if selectedKey < 12 and selectedKey > -1:\r
+                                       list.append(VirtualKeyBoardEntryComponent(keys, selectedKey,True))\r
+                               else:\r
+                                       list.append(VirtualKeyBoardEntryComponent(keys, -1,True))\r
+                               selectedKey -= 12\r
+               else:\r
+                       self.k_list = self.keys_list\r
+                       for keys in self.k_list:\r
+                               if selectedKey < 12 and selectedKey > -1:\r
+                                       list.append(VirtualKeyBoardEntryComponent(keys, selectedKey))\r
+                               else:\r
+                                       list.append(VirtualKeyBoardEntryComponent(keys, -1))\r
+                               selectedKey -= 12\r
+               \r
+               self["list"].setList(list)\r
+\r
+       \r
+       def backClicked(self):\r
+               self.text = self["text"].getText()[:-1]\r
+               self["text"].setText(self.text)\r
+                       \r
+       def okClicked(self):\r
+               if self.shiftMode:\r
+                       list = self.shiftkeys_list\r
+               else:\r
+                       list = self.keys_list\r
+               \r
+               selectedKey = self.selectedKey\r
+\r
+               for x in list:\r
+                       if selectedKey < 12:\r
+                               text = x[selectedKey]\r
+                               break\r
+                       else:\r
+                               selectedKey -= 12\r
+\r
+               text = text.encode("utf-8")\r
+\r
+               if text == "EXIT":\r
+                       self.close(None)\r
+               \r
+               elif text == "BACKSPACE":\r
+                       self.text = self["text"].getText()[:-1]\r
+                       self["text"].setText(self.text)\r
+               \r
+               elif text == "CLEAR":\r
+                       self.text = ""\r
+                       self["text"].setText(self.text)\r
+               \r
+               elif text == "SHIFT":\r
+                       if self.shiftMode:\r
+                               self.shiftMode = False\r
+                       else:\r
+                               self.shiftMode = True\r
+                       \r
+                       self.buildVirtualKeyBoard(self.selectedKey)\r
+               \r
+               elif text == "SPACE":\r
+                       self.text += " "\r
+                       self["text"].setText(self.text)\r
+               \r
+               elif text == "OK":\r
+                       self.close(self["text"].getText())\r
+               \r
+               else:\r
+                       self.text = self["text"].getText()\r
+                       self.text += text\r
+                       self["text"].setText(self.text)\r
+\r
+       def ok(self):\r
+               self.close(self["text"].getText())\r
+\r
+       def exit(self):\r
+               self.close(None)\r
+\r
+       def left(self):\r
+               self.selectedKey -= 1\r
+               \r
+               if self.selectedKey == -1:\r
+                       self.selectedKey = 11\r
+               elif self.selectedKey == 11:\r
+                       self.selectedKey = 23\r
+               elif self.selectedKey == 23:\r
+                       self.selectedKey = 35\r
+               elif self.selectedKey == 35:\r
+                       self.selectedKey = 47\r
+               elif self.selectedKey == 47:\r
+                       self.selectedKey = 59\r
+               \r
+               self.showActiveKey()\r
+\r
+       def right(self):\r
+               self.selectedKey += 1\r
+               \r
+               if self.selectedKey == 12:\r
+                       self.selectedKey = 0\r
+               elif self.selectedKey == 24:\r
+                       self.selectedKey = 12\r
+               elif self.selectedKey == 36:\r
+                       self.selectedKey = 24\r
+               elif self.selectedKey == 48:\r
+                       self.selectedKey = 36\r
+               elif self.selectedKey == 60:\r
+                       self.selectedKey = 48\r
+               \r
+               self.showActiveKey()\r
+\r
+       def up(self):\r
+               self.selectedKey -= 12\r
+               \r
+               if self.selectedKey < 0:\r
+                       self.selectedKey += 60\r
+               \r
+               self.showActiveKey()\r
+\r
+       def down(self):\r
+               self.selectedKey += 12\r
+               \r
+               if self.selectedKey > 59:\r
+                       self.selectedKey -= 60\r
+               \r
+               self.showActiveKey()\r
+\r
+       def showActiveKey(self):\r
+               self.buildVirtualKeyBoard(self.selectedKey)\r