Merge branch 'bug_262_no_more_ask_50hz' into experimental
authorghost <andreas.monzner@multimedia-labs.de>
Wed, 30 Dec 2009 10:13:52 +0000 (11:13 +0100)
committerghost <andreas.monzner@multimedia-labs.de>
Wed, 30 Dec 2009 10:13:52 +0000 (11:13 +0100)
65 files changed:
configure.ac
data/skin_default.xml
data/skin_default/Makefile.am [changed mode: 0644->0755]
data/skin_default/border_menu_350.png [new file with mode: 0755]
data/skin_default/div-h.png [changed mode: 0644->0755]
lib/dvb/dvb.cpp
lib/python/Components/ChoiceList.py
lib/python/Components/Converter/Makefile.am
lib/python/Components/Converter/SensorToText.py [new file with mode: 0644]
lib/python/Components/FanControl.py [new file with mode: 0644]
lib/python/Components/Makefile.am
lib/python/Components/NimManager.py
lib/python/Components/Sensors.py [new file with mode: 0644]
lib/python/Components/Sources/Makefile.am
lib/python/Components/Sources/Sensor.py [new file with mode: 0644]
lib/python/Plugins/Extensions/DVDBurn/TitleList.py
lib/python/Plugins/Extensions/DVDBurn/TitleProperties.py
lib/python/Plugins/Extensions/DVDPlayer/src/servicedvd.cpp
lib/python/Plugins/Extensions/MediaPlayer/plugin.py
lib/python/Plugins/SystemPlugins/Makefile.am
lib/python/Plugins/SystemPlugins/NetworkWizard/NetworkWizard.py
lib/python/Plugins/SystemPlugins/SoftwareManager/Makefile.am [changed mode: 0644->0755]
lib/python/Plugins/SystemPlugins/SoftwareManager/SoftwareTools.py [new file with mode: 0755]
lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py
lib/python/Plugins/SystemPlugins/TempFanControl/Makefile.am [new file with mode: 0644]
lib/python/Plugins/SystemPlugins/TempFanControl/__init__.py [new file with mode: 0644]
lib/python/Plugins/SystemPlugins/TempFanControl/plugin.py [new file with mode: 0644]
lib/python/Plugins/SystemPlugins/WirelessLan/plugin.py
lib/python/Screens/ChannelSelection.py
lib/python/Screens/InfoBarGenerics.py
lib/python/Screens/PluginBrowser.py
lib/service/servicedvb.cpp
lib/service/servicemp3.cpp
lib/service/servicexine.cpp
po/ar.po
po/ca.po
po/cs.po
po/da.po
po/de.po [changed mode: 0644->0755]
po/el.po
po/en.po
po/enigma2.pot [changed mode: 0644->0755]
po/es.po [changed mode: 0644->0755]
po/et.po
po/fi.po [changed mode: 0644->0755]
po/fr.po [changed mode: 0644->0755]
po/fy.po
po/hr.po
po/hu.po
po/is.po
po/it.po [changed mode: 0644->0755]
po/lt.po
po/lv.po
po/nl.po [changed mode: 0644->0755]
po/no.po
po/pl.po [changed mode: 0644->0755]
po/pt.po
po/ru.po [changed mode: 0644->0755]
po/sk.po
po/sl.po
po/sr.po
po/sv.po [changed mode: 0644->0755]
po/tr.po
po/uk.po
tools/genmetaindex.py

index 1bda10e..aa2fa3e 100755 (executable)
@@ -155,6 +155,7 @@ lib/python/Plugins/SystemPlugins/FrontprocessorUpgrade/meta/Makefile
 lib/python/Plugins/SystemPlugins/Hotplug/Makefile
 lib/python/Plugins/SystemPlugins/Hotplug/meta/Makefile
 lib/python/Plugins/SystemPlugins/Makefile
+lib/python/Plugins/SystemPlugins/TempFanControl/Makefile
 lib/python/Plugins/SystemPlugins/NetworkWizard/Makefile
 lib/python/Plugins/SystemPlugins/NetworkWizard/meta/Makefile
 lib/python/Plugins/SystemPlugins/NFIFlash/Makefile
index 71f579c..7aaff38 100755 (executable)
@@ -70,8 +70,8 @@
                <widget name="menu" position="10,10" size="290,225" scrollbarMode="showOnDemand" />
        </screen>
        <!-- Channel context menu -->
-       <screen name="ChannelContextMenu" position="center,center" size="300,255" title="Channellist menu">
-               <widget name="menu" position="10,10" size="290,230" scrollbarMode="showOnDemand" />
+       <screen name="ChannelContextMenu" position="center,center" size="350,255" title="Channellist menu">
+               <widget name="menu" position="10,10" size="340,230" scrollbarMode="showOnDemand" />
        </screen>
        <!-- Channel selection - TV -->
        <screen name="ChannelSelection" position="center,center" size="560,430" title="Channel Selection">
old mode 100644 (file)
new mode 100755 (executable)
index e2d2abc..15f4a54
@@ -15,6 +15,7 @@ dist_install_DATA = \
        border_eventinfo.png \
        border_info.png \
        border_menu_300.png \
+       border_menu_350.png \
        border_menu.png \
        border_multiepg.png \
        bottombar.png \
diff --git a/data/skin_default/border_menu_350.png b/data/skin_default/border_menu_350.png
new file mode 100755 (executable)
index 0000000..4f6f49c
Binary files /dev/null and b/data/skin_default/border_menu_350.png differ
old mode 100644 (file)
new mode 100755 (executable)
index d6fcc7f..9ab4ff4
Binary files a/data/skin_default/div-h.png and b/data/skin_default/div-h.png differ
index 6eaadb0..17712dd 100644 (file)
@@ -1324,16 +1324,6 @@ void eDVBChannel::getNextSourceSpan(off_t current_offset, size_t bytes_read, off
                return;
        }
 
-       m_cue->m_lock.RdLock();
-       if (!m_cue->m_decoding_demux)
-       {
-               start = current_offset;
-               size = max;
-               eDebug("getNextSourceSpan, no decoding demux. forcing normal play");
-               m_cue->m_lock.Unlock();
-               return;
-       }
-
        if (m_skipmode_n)
        {
                eDebug("skipmode %d:%d (x%d)", m_skipmode_m, m_skipmode_n, m_skipmode_frames);
@@ -1341,7 +1331,6 @@ void eDVBChannel::getNextSourceSpan(off_t current_offset, size_t bytes_read, off
        }
 
        eDebug("getNextSourceSpan, current offset is %08llx, m_skipmode_m = %d!", current_offset, m_skipmode_m);
-       
        int frame_skip_success = 0;
 
        if (m_skipmode_m)
@@ -1386,6 +1375,8 @@ void eDVBChannel::getNextSourceSpan(off_t current_offset, size_t bytes_read, off
                }
        }
 
+       m_cue->m_lock.RdLock();
+
        while (!m_cue->m_seek_requests.empty())
        {
                std::pair<int, pts_t> seek = m_cue->m_seek_requests.front();
@@ -1410,6 +1401,13 @@ void eDVBChannel::getNextSourceSpan(off_t current_offset, size_t bytes_read, off
                                eDebug("decoder getPTS failed, can't seek relative");
                                continue;
                        }
+                       if (!m_cue->m_decoding_demux)
+                       {
+                               eDebug("getNextSourceSpan, no decoding demux. couldn't seek to %llx... ignore request!", pts);
+                               start = current_offset;
+                               size = max;
+                               continue;
+                       }
                        if (getCurrentPosition(m_cue->m_decoding_demux, now, 1))
                        {
                                eDebug("seekTo: getCurrentPosition failed!");
index 4700e9e..33868d6 100755 (executable)
@@ -3,7 +3,7 @@ from Tools.Directories import SCOPE_CURRENT_SKIN, resolveFilename
 from enigma import RT_HALIGN_LEFT, eListboxPythonMultiContent, gFont
 from Tools.LoadPixmap import LoadPixmap
 
-def ChoiceEntryComponent(key, text):
+def ChoiceEntryComponent(key = "", text = ["--"]):
        res = [ text ]
        if text[0] == "--":
                res.append((eListboxPythonMultiContent.TYPE_TEXT, 0, 00, 800, 25, 0, RT_HALIGN_LEFT, "-"*200))
index 75c8a08..3b6fd3e 100644 (file)
@@ -6,4 +6,4 @@ install_PYTHON = \
        ConditionalShowHide.py ServicePosition.py ValueRange.py RdsInfo.py Streaming.py \
        StaticMultiList.py ServiceTime.py MovieInfo.py MenuEntryCompare.py StringListSelection.py \
        ValueBitTest.py TunerInfo.py ConfigEntryTest.py TemplatedMultiContent.py ProgressToText.py \
-       Combine.py
+       Combine.py SensorToText.py
diff --git a/lib/python/Components/Converter/SensorToText.py b/lib/python/Components/Converter/SensorToText.py
new file mode 100644 (file)
index 0000000..fb156fa
--- /dev/null
@@ -0,0 +1,14 @@
+from Components.Converter.Converter import Converter
+
+class SensorToText(Converter, object):
+       def __init__(self, arguments):
+               Converter.__init__(self, arguments)
+        
+       def getText(self):
+               if self.source.getValue() is None:
+                       return ""
+               return "%d %s" % (self.source.getValue(), self.source.getUnit())
+       
+       text = property(getText)
+        
+        
\ No newline at end of file
diff --git a/lib/python/Components/FanControl.py b/lib/python/Components/FanControl.py
new file mode 100644 (file)
index 0000000..cc133ac
--- /dev/null
@@ -0,0 +1,74 @@
+import os
+
+from Components.config import config, ConfigSubList, ConfigSubsection, ConfigSlider
+from Tools.BoundFunction import boundFunction
+
+class FanControl:
+       # ATM there's only support for one fan
+       def __init__(self):
+               if os.path.exists("/proc/stb/fp/fan_vlt") or os.path.exists("/proc/stb/fp/fan_pwm") or os.path.exists("/proc/stb/fp/fan_speed"):
+                       self.fancount = 1
+               else:
+                       self.fancount = 0
+               self.createConfig()
+
+       def createConfig(self):
+               def setVlt(fancontrol, fanid, configElement):
+                       fancontrol.setVoltage(fanid, configElement.value)
+               def setPWM(fancontrol, fanid, configElement):
+                       fancontrol.setPWM(fanid, configElement.value)
+               
+               config.fans = ConfigSubList()
+               for fanid in range(self.getFanCount()):
+                       fan = ConfigSubsection()
+                       fan.vlt = ConfigSlider(default = 16, increment = 5, limits = (0, 255))
+                       fan.pwm = ConfigSlider(default = 0, increment = 5, limits = (0, 255))
+                       fan.vlt.addNotifier(boundFunction(setVlt, self, fanid))
+                       fan.pwm.addNotifier(boundFunction(setPWM, self, fanid))
+                       config.fans.append(fan)
+                       
+       def getConfig(self, fanid):
+               return config.fans[fanid]
+       
+       def getFanCount(self):
+               return self.fancount
+       
+       def hasRPMSensor(self, fanid):
+               return os.path.exists("/proc/stb/fp/fan_speed")
+       
+       def hasFanControl(self, fanid):
+               return os.path.exists("/proc/stb/fp/fan_vlt") or os.path.exists("/proc/stb/fp/fan_pwm")
+       
+       def getFanSpeed(self, fanid):
+               f = open("/proc/stb/fp/fan_speed", "r")
+               value = int(f.readline().strip()[:-4])
+               f.close()
+               return value
+       
+       def getVoltage(self, fanid):
+               f = open("/proc/stb/fp/fan_vlt", "r")
+               value = int(f.readline().strip(), 16)
+               f.close()
+               return value
+       
+       def setVoltage(self, fanid, value):
+               if value > 255:
+                       return
+               f = open("/proc/stb/fp/fan_vlt", "w")
+               f.write("%x" % value)
+               f.close()
+               
+       def getPWM(self, fanid):
+               f = open("/proc/stb/fp/fan_pwm", "r")
+               value = int(f.readline().strip(), 16)
+               f.close()
+               return value
+       
+       def setPWM(self, fanid, value):
+               if value > 255:
+                       return
+               f = open("/proc/stb/fp/fan_pwm", "w")
+               f.write("%x" % value)
+               f.close()
+       
+fancontrol = FanControl()
\ No newline at end of file
index 34710fa..b5ef068 100755 (executable)
@@ -19,4 +19,4 @@ install_PYTHON = \
        Element.py Playlist.py ParentalControl.py ParentalControlList.py \
        Ipkg.py SelectionList.py Scanner.py SystemInfo.py DreamInfoHandler.py \
        Task.py language_cache.py Console.py ResourceManager.py TuneTest.py \
-       Keyboard.py
+       Keyboard.py Sensors.py FanControl.py
index 00d0609..613305d 100644 (file)
@@ -947,7 +947,7 @@ def InitNimManager(nimmgr):
 
        lnb_choices = {
                "universal_lnb": _("Universal LNB"),
-#              "unicable": _("Unicable"),
+               "unicable": _("Unicable"),
                "c_band": _("C-Band"),
                "user_defined": _("User defined")}
 
diff --git a/lib/python/Components/Sensors.py b/lib/python/Components/Sensors.py
new file mode 100644 (file)
index 0000000..8898a03
--- /dev/null
@@ -0,0 +1,72 @@
+from Components.FanControl import fancontrol
+
+class Sensors:
+       # (type, name, unit, directory)
+       TYPE_TEMPERATURE = 0
+       # (type, name, unit, fanid)
+       TYPE_FAN_RPM = 1
+       
+       def __init__(self):
+               # (type, name, unit, sensor_specific_dict/list)
+               self.sensors_list = []
+               self.addSensors()
+               
+       def getSensorsCount(self, type = None):
+               if type is None:
+                       return len(self.sensors_list)
+               count = 0
+               for sensor in self.sensors_list:
+                       if sensor[0] == type:
+                               count += 1
+               return count
+       
+       # returns a list of sensorids of type "type"
+       def getSensorsList(self, type = None):
+               if type is None:
+                       return range(len(self.sensors_list))
+               list = []
+               for sensorid in range(len(self.sensors_list)):
+                       if self.sensors_list[sensorid][0] == type:
+                               list.append(sensorid)
+               return list
+       
+       
+       def getSensorType(self, sensorid):
+               return self.sensors_list[sensorid][0]
+       
+       def getSensorName(self, sensorid):
+               return self.sensors_list[sensorid][1]
+       
+       def getSensorValue(self, sensorid):
+               value = -1
+               sensor = self.sensors_list[sensorid]
+               if sensor[0] == self.TYPE_TEMPERATURE:
+                       f = open("%s/value" % sensor[3], "r")
+                       value = int(f.readline().strip())
+                       f.close()
+               elif sensor[0] == self.TYPE_FAN_RPM:
+                       value = fancontrol.getFanSpeed(sensor[3])
+               return value
+       
+       def getSensorUnit(self, sensorid):
+               return self.sensors_list[sensorid][2]
+
+       def addSensors(self):
+               import os
+               if os.path.exists("/proc/stb/sensors"):
+                       for dirname in os.listdir("/proc/stb/sensors"):
+                               if dirname.find("temp", 0, 4) == 0:
+                                       f = open("/proc/stb/sensors/%s/name" % dirname, "r")
+                                       name = f.readline().strip()
+                                       f.close()
+                                       
+                                       f = open("/proc/stb/sensors/%s/unit" % dirname, "r")
+                                       unit = f.readline().strip()
+                                       f.close()
+                                       
+                                       self.sensors_list.append((self.TYPE_TEMPERATURE, name, unit, "/proc/stb/sensors/%s" % dirname))
+               for fanid in range(fancontrol.getFanCount()):
+                       if fancontrol.hasRPMSensor(fanid):
+                               self.sensors_list.append((self.TYPE_FAN_RPM, _("Fan %d") % (fanid + 1), "rpm", fanid))
+       
+sensors = Sensors()
\ No newline at end of file
index 6ef8cac..436d31b 100644 (file)
@@ -4,4 +4,4 @@ install_PYTHON = \
        __init__.py Clock.py EventInfo.py Source.py List.py CurrentService.py \
        FrontendStatus.py Boolean.py Config.py ServiceList.py RdsDecoder.py StreamService.py \
        StaticText.py CanvasSource.py ServiceEvent.py Event.py FrontendInfo.py TunerInfo.py \
-       RecordState.py Progress.py
+       RecordState.py Progress.py Sensor.py
diff --git a/lib/python/Components/Sources/Sensor.py b/lib/python/Components/Sources/Sensor.py
new file mode 100644 (file)
index 0000000..e927bbf
--- /dev/null
@@ -0,0 +1,31 @@
+from Components.Sensors import sensors
+
+from enigma import eTimer
+
+from Source import Source
+
+class SensorSource(Source):
+       def __init__(self, update_interval = 500, sensorid = None):
+               self.update_interval = update_interval
+               self.sensorid = sensorid
+               Source.__init__(self)
+
+               if sensorid is not None:
+                       self.update_timer = eTimer()
+                       self.update_timer.callback.append(self.updateValue)
+                       self.update_timer.start(self.update_interval)
+
+       def getValue(self):
+               if self.sensorid is not None:
+                       return sensors.getSensorValue(self.sensorid)
+               return None
+       
+       def getUnit(self):
+               return sensors.getSensorUnit(self.sensorid)
+
+       def updateValue(self):
+               self.changed((self.CHANGED_POLL,))
+
+       def destroy(self):
+               if self.sensorid is not None:
+                       self.update_timer.callback.remove(self.updateValue)
index 928a8b8..dbc988b 100755 (executable)
@@ -10,7 +10,8 @@ from Components.ActionMap import HelpableActionMap, ActionMap
 from Components.Sources.List import List
 from Components.Sources.StaticText import StaticText
 from Components.Sources.Progress import Progress
-from enigma import eListboxPythonMultiContent, gFont, RT_HALIGN_LEFT
+from Components.MultiContent import MultiContentEntryText
+from enigma import gFont, RT_HALIGN_LEFT, RT_HALIGN_RIGHT
 from Tools.Directories import resolveFilename, SCOPE_PLUGINS
 
 class TitleList(Screen, HelpableScreen):
@@ -27,7 +28,18 @@ class TitleList(Screen, HelpableScreen):
                        <widget source="title_label" render="Label" position="10,48" size="540,38" font="Regular;18" transparent="1" />
                        <widget source="error_label" render="Label" position="10,48" size="540,395" zPosition="3" font="Regular;20" transparent="1" />
                        <widget source="titles" render="Listbox" scrollbarMode="showOnDemand" position="10,86" size="540,312" zPosition="3" transparent="1" >
-                               <convert type="StaticMultiList" />
+                               <convert type="TemplatedMultiContent">
+                                       {"template": [
+                                                       MultiContentEntryText(pos = (0, 0), size = (420, 20), font = 0, flags = RT_HALIGN_LEFT, text = 1), # index 1 Title,
+                                                       MultiContentEntryText(pos = (0, 20), size = (328, 17), font = 1, flags = RT_HALIGN_LEFT, text = 2), # index 2 description,
+                                                       MultiContentEntryText(pos = (420, 6), size = (120, 20), font = 1, flags = RT_HALIGN_RIGHT, text = 3), # index 3 begin time,
+                                                       MultiContentEntryText(pos = (328, 20), size = (154, 17), font = 1, flags = RT_HALIGN_RIGHT, text = 4), # index 4 channel,
+                                                       MultiContentEntryText(pos = (482, 20), size = (58, 20), font = 1, flags = RT_HALIGN_RIGHT, text = 5), # index 4 channel,
+                                               ],
+                                       "fonts": [gFont("Regular", 20), gFont("Regular", 14)],
+                                       "itemHeight": 37
+                                       }
+                               </convert>
                        </widget>
                        <widget source="space_bar" render="Progress" position="10,410" size="540,26" borderWidth="1" backgroundColor="#254f7497" />
                        <widget source="space_label" render="Label" position="40,414" size="480,22" zPosition="2" font="Regular;18" halign="center" transparent="1" foregroundColor="#000000" />
@@ -71,7 +83,7 @@ class TitleList(Screen, HelpableScreen):
                else:
                        self.newProject()
 
-               self["titles"] = List(list = [ ], enableWrapAround = True, item_height=30, fonts = [gFont("Regular", 20)])
+               self["titles"] = List([])
                self.updateTitleList()
                self.previous_size = 0
                self.onLayoutFinish.append(self.layoutFinished)
@@ -188,6 +200,9 @@ class TitleList(Screen, HelpableScreen):
        def selectedSource(self, source):
                if source is None:
                        return None
+               if not source.getPath().endswith(".ts"):
+                       self.session.open(MessageBox,text = _("You can only burn Dreambox recordings!"), type = MessageBox.TYPE_ERROR)
+                       return None
                t = self.project.addService(source)
                try:
                        editor = source.edit
@@ -256,15 +271,14 @@ class TitleList(Screen, HelpableScreen):
                job = Process.DVDJob(self.project, menupreview=True)
                job_manager.in_background = False
                job_manager.AddJob(job)
-               
+
        def updateTitleList(self):
-               res = [ ]
+               list = [ ]
                for title in self.project.titles:
-                       a = [ title, (eListboxPythonMultiContent.TYPE_TEXT, 0, 5, 500, 25, 0, RT_HALIGN_LEFT, title.properties.menutitle.getValue())  ]
-                       res.append(a)
-               self["titles"].list = res
+                       list.append((title, title.properties.menutitle.getValue(), title.properties.menusubtitle.getValue(), title.DVBchannel, title.formatDVDmenuText("$D.$M.$Y, $T", 0), title.formatDVDmenuText("$l", 0)))
+               self["titles"].list = list
                self.updateSize()
-               if len(res):
+               if len(list):
                        self["key_red"].text = _("Remove title")
                        self["key_yellow"].text = _("Title properties")
                else:
index 11601cc..c3f78d4 100755 (executable)
@@ -164,7 +164,8 @@ class LanguageChoices():
                self.choices.sort()
                self.choices.insert(0,("nolang", ("unspecified")))
                self.choices.insert(1,(syslang, self.langdict[syslang]))
-               self.choices.insert(2,("en", self.langdict["en"]))
+               if syslang != "en":
+                       self.choices.insert(2,("en", self.langdict["en"]))
 
        def getLanguage(self, DVB_lang):
                DVB_lang = DVB_lang.lower()
index 94f2ee3..0372c49 100644 (file)
@@ -696,7 +696,7 @@ RESULT eServiceDVD::setTrickmode(int /*trick*/)
 
 RESULT eServiceDVD::isCurrentlySeekable()
 {
-       return m_state == stRunning;
+       return m_state == stRunning ? 3 : 0;
 }
 
 RESULT eServiceDVD::keyPressed(int key)
index a2422be..0fc78fb 100755 (executable)
@@ -110,7 +110,7 @@ class MediaPlayer(Screen, InfoBarBase, InfoBarSeek, InfoBarAudioSelection, InfoB
 
                # 'None' is magic to start at the list of mountpoints
                defaultDir = config.mediaplayer.defaultDir.getValue()
-               self.filelist = FileList(defaultDir, matchingPattern = "(?i)^.*\.(mp2|mp3|ogg|ts|m2ts|wav|wave|m3u|pls|e2pls|mpg|vob|avi|divx|mkv|mp4|m4a|dat|flac|mov)", useServiceRef = True, additionalExtensions = "4098:m3u 4098:e2pls 4098:pls")
+               self.filelist = FileList(defaultDir, matchingPattern = "(?i)^.*\.(mp2|mp3|ogg|ts|m2ts|wav|wave|m3u|pls|e2pls|mpg|vob|avi|divx|m4v|mkv|mp4|m4a|dat|flac|mov)", useServiceRef = True, additionalExtensions = "4098:m3u 4098:e2pls 4098:pls")
                self["filelist"] = self.filelist
 
                self.playlist = MyPlayList()
index a8b187d..9cc538f 100755 (executable)
@@ -3,7 +3,8 @@ installdir = $(pkglibdir)/python/Plugins/SystemPlugins
 SUBDIRS = SoftwareManager FrontprocessorUpgrade PositionerSetup Satfinder \
        SkinSelector SatelliteEquipmentControl Videomode VideoTune Hotplug \
        DefaultServicesScanner NFIFlash DiseqcTester CommonInterfaceAssignment \
-       CrashlogAutoSubmit CleanupWizard VideoEnhancement WirelessLan NetworkWizard
+       CrashlogAutoSubmit CleanupWizard VideoEnhancement WirelessLan NetworkWizard \
+       TempFanControl
 
 install_PYTHON =       \
        __init__.py
index 75ca390..13e7fdd 100755 (executable)
@@ -9,7 +9,6 @@ from Components.Network import iNetwork
 from Tools.Directories import resolveFilename, SCOPE_PLUGINS, SCOPE_SKIN_IMAGE
 from enigma import eTimer
 
-
 config.misc.firstrun = ConfigBoolean(default = True)
 list = []
 list.append("WEP")
@@ -355,5 +354,3 @@ class NetworkWizard(WizardLanguage, Rc):
                else:
                        self.WlanPluginInstalled = True
 
-
-
old mode 100644 (file)
new mode 100755 (executable)
index ee1e56d..2d5e338
@@ -6,7 +6,8 @@ install_PYTHON =        \
        __init__.py \
        plugin.py \
        BackupRestore.py \
-       ImageWizard.py
+       ImageWizard.py \
+       SoftwareTools.py
 
 dist_install_DATA = \
        imagewizard.xml \
diff --git a/lib/python/Plugins/SystemPlugins/SoftwareManager/SoftwareTools.py b/lib/python/Plugins/SystemPlugins/SoftwareManager/SoftwareTools.py
new file mode 100755 (executable)
index 0000000..4e7591e
--- /dev/null
@@ -0,0 +1,226 @@
+from enigma import eConsoleAppContainer
+from Components.Console import Console
+from Components.About import about
+from Components.DreamInfoHandler import DreamInfoHandler
+from Components.Language import language
+from Components.Sources.List import List
+from Components.Ipkg import IpkgComponent
+from Components.Network import iNetwork
+from Tools.Directories import pathExists, fileExists, resolveFilename, SCOPE_METADIR
+
+from time import time
+
+class SoftwareTools(DreamInfoHandler):
+       lastDownloadDate = None
+       NetworkConnectionAvailable = None
+       list_updating = False
+       available_updates = 0
+       available_updatelist  = []
+       available_packetlist  = []
+       installed_packetlist = {}
+
+       
+       def __init__(self):
+               aboutInfo = about.getImageVersionString()
+               if aboutInfo.startswith("dev-"):
+                       self.ImageVersion = 'Experimental'
+               else:
+                       self.ImageVersion = 'Stable'
+               self.language = language.getLanguage()[:2] # getLanguage returns e.g. "fi_FI" for "language_country"
+               DreamInfoHandler.__init__(self, self.statusCallback, blocking = False, neededTag = 'ALL_TAGS', neededFlag = self.ImageVersion, language = self.language)
+               self.directory = resolveFilename(SCOPE_METADIR)
+               self.list = List([])
+               self.NotifierCallback = None
+               self.Console = Console()
+               self.UpdateConsole = Console()
+               self.cmdList = []
+               self.unwanted_extensions = ('-dbg', '-dev', '-doc')
+               self.ipkg = IpkgComponent()
+               self.ipkg.addCallback(self.ipkgCallback)                
+
+       def statusCallback(self, status, progress):
+               pass            
+
+       def startSoftwareTools(self, callback = None):
+               if callback is not None:
+                       self.NotifierCallback = callback
+               iNetwork.checkNetworkState(self.checkNetworkCB)
+               
+       def checkNetworkCB(self,data):
+               if data is not None:
+                       if data <= 2:
+                               SoftwareTools.NetworkConnectionAvailable = True
+                               self.getUpdates()
+                       else:
+                               SoftwareTools.NetworkConnectionAvailable = False
+                               self.getUpdates()
+
+       def getUpdates(self, callback = None):
+               if SoftwareTools.NetworkConnectionAvailable == True:
+                       SoftwareTools.lastDownloadDate = time()
+                       if SoftwareTools.list_updating is False and callback is None:
+                               SoftwareTools.list_updating = True
+                               self.ipkg.startCmd(IpkgComponent.CMD_UPDATE)
+                       elif SoftwareTools.list_updating is False and callback is not None:
+                               SoftwareTools.list_updating = True
+                               self.NotifierCallback = callback
+                               self.ipkg.startCmd(IpkgComponent.CMD_UPDATE)
+                       elif SoftwareTools.list_updating is True and callback is not None:
+                               #update info collecting already in progress
+                               self.NotifierCallback = callback
+               else:
+                       SoftwareTools.list_updating = False
+                       if callback is not None:
+                               callback(False)
+                       elif self.NotifierCallback is not None:
+                               self.NotifierCallback(False)
+
+       def ipkgCallback(self, event, param):
+               if event == IpkgComponent.EVENT_ERROR:
+                       SoftwareTools.list_updating = False
+               elif event == IpkgComponent.EVENT_DONE:
+                       if SoftwareTools.list_updating:
+                               self.startIpkgListAvailable()
+               pass
+
+       def startIpkgListAvailable(self, callback = None):
+               if callback is not None:
+                       SoftwareTools.list_updating = True
+               if SoftwareTools.list_updating:
+                       if not self.UpdateConsole:
+                               self.UpdateConsole = Console()
+                       cmd = "ipkg list"
+                       self.UpdateConsole.ePopen(cmd, self.IpkgListAvailableCB, callback)
+
+       def IpkgListAvailableCB(self, result, retval, extra_args = None):
+               (callback) = extra_args
+               if len(result):
+                       if SoftwareTools.list_updating:
+                               SoftwareTools.available_packetlist = []
+                               for x in result.splitlines():
+                                       split = x.split(' - ')
+                                       name = split[0].strip()
+                                       if not any(name.endswith(x) for x in self.unwanted_extensions):
+                                               SoftwareTools.available_packetlist.append([name, split[1].strip(), split[2].strip()])
+                               if callback is None:
+                                       self.startInstallMetaPackage()
+                               else:
+                                       if self.UpdateConsole:
+                                               if len(self.UpdateConsole.appContainers) == 0:
+                                                               callback(True)
+               else:
+                       SoftwareTools.list_updating = False
+                       if self.UpdateConsole:
+                               if len(self.UpdateConsole.appContainers) == 0:
+                                       if callback is not None:
+                                               callback(False)
+
+       def startInstallMetaPackage(self, callback = None):
+               if callback is not None:
+                       SoftwareTools.list_updating = True
+               if SoftwareTools.list_updating:
+                       if not self.UpdateConsole:
+                               self.UpdateConsole = Console()
+                       cmd = "ipkg install enigma2-meta enigma2-plugins-meta enigma2-skins-meta"
+                       self.UpdateConsole.ePopen(cmd, self.InstallMetaPackageCB, callback)
+
+       def InstallMetaPackageCB(self, result, retval, extra_args = None):
+               (callback) = extra_args
+               if len(result):
+                       self.fillPackagesIndexList()
+                       if callback is None:
+                               self.startIpkgListInstalled()
+                       else:
+                               if self.UpdateConsole:
+                                       if len(self.UpdateConsole.appContainers) == 0:
+                                                       callback(True)
+               else:
+                       SoftwareTools.list_updating = False
+                       if self.UpdateConsole:
+                               if len(self.UpdateConsole.appContainers) == 0:
+                                       if callback is not None:
+                                               callback(False)
+
+       def startIpkgListInstalled(self, callback = None):
+               if callback is not None:
+                       SoftwareTools.list_updating = True
+               if SoftwareTools.list_updating:
+                       if not self.UpdateConsole:
+                               self.UpdateConsole = Console()
+                       cmd = "ipkg list_installed"
+                       self.UpdateConsole.ePopen(cmd, self.IpkgListInstalledCB, callback)
+
+       def IpkgListInstalledCB(self, result, retval, extra_args = None):
+               (callback) = extra_args
+               if len(result):
+                       SoftwareTools.installed_packetlist = {}
+                       for x in result.splitlines():
+                               split = x.split(' - ')
+                               name = split[0].strip()
+                               if not any(name.endswith(x) for x in self.unwanted_extensions):
+                                       SoftwareTools.installed_packetlist[name] = split[1].strip()
+                       if callback is None:
+                               self.countUpdates()
+                       else:
+                               if self.UpdateConsole:
+                                       if len(self.UpdateConsole.appContainers) == 0:
+                                                       callback(True)
+               else:
+                       SoftwareTools.list_updating = False
+                       if self.UpdateConsole:
+                               if len(self.UpdateConsole.appContainers) == 0:
+                                       if callback is not None:
+                                               callback(False)
+
+       def countUpdates(self, callback = None):
+               SoftwareTools.available_updates = 0
+               SoftwareTools.available_updatelist  = []
+               for package in self.packagesIndexlist[:]:
+                       attributes = package[0]["attributes"]
+                       packagename = attributes["packagename"]
+                       for x in SoftwareTools.available_packetlist:
+                               if x[0] == packagename:
+                                       if SoftwareTools.installed_packetlist.has_key(packagename):
+                                               if SoftwareTools.installed_packetlist[packagename] != x[1]:
+                                                       SoftwareTools.available_updates +=1
+                                                       SoftwareTools.available_updatelist.append([packagename])
+
+               SoftwareTools.list_updating = False
+               if self.UpdateConsole:
+                       if len(self.UpdateConsole.appContainers) == 0:
+                               if callback is not None:
+                                       callback(True)
+                                       callback = None
+                               elif self.NotifierCallback is not None:
+                                       self.NotifierCallback(True)
+                                       self.NotifierCallback = None
+
+       def startIpkgUpdate(self, callback = None):
+               if not self.Console:
+                       self.Console = Console()
+               cmd = "ipkg update"
+               self.Console.ePopen(cmd, self.IpkgUpdateCB, callback)
+
+       def IpkgUpdateCB(self, result, retval, extra_args = None):
+               (callback) = extra_args
+               if len(result):
+                       if self.Console:
+                               if len(self.Console.appContainers) == 0:
+                                       if callback is not None:
+                                               callback(True)
+                                               callback = None
+
+       def cleanupSoftwareTools(self):
+               if self.NotifierCallback is not None:
+                       self.NotifierCallback = None
+               self.ipkg.stop()
+               if self.Console is not None:
+                       if len(self.Console.appContainers):
+                               for name in self.Console.appContainers.keys():
+                                       self.Console.kill(name)
+               if self.UpdateConsole is not None:
+                       if len(self.UpdateConsole.appContainers):
+                               for name in self.UpdateConsole.appContainers.keys():
+                                       self.UpdateConsole.kill(name)
+
+iSoftwareTools = SoftwareTools()
\ No newline at end of file
index c70201b..6162d8a 100755 (executable)
@@ -23,6 +23,7 @@ from Components.About import about
 from Components.DreamInfoHandler import DreamInfoHandler
 from Components.Language import language
 from Components.AVSwitch import AVSwitch
+from Components.Network import iNetwork
 from Tools.Directories import pathExists, fileExists, resolveFilename, SCOPE_PLUGINS, SCOPE_CURRENT_PLUGIN, SCOPE_CURRENT_SKIN, SCOPE_METADIR
 from Tools.LoadPixmap import LoadPixmap
 from enigma import eTimer, quitMainloop, RT_HALIGN_LEFT, RT_VALIGN_CENTER, eListboxPythonMultiContent, eListbox, gFont, getDesktop, ePicLoad
@@ -36,6 +37,7 @@ from twisted.internet import reactor
 
 from ImageWizard import ImageWizard
 from BackupRestore import BackupSelection, RestoreMenu, BackupScreen, RestoreScreen, getBackupPath, getBackupFilename
+from SoftwareTools import iSoftwareTools
 
 config.plugins.configurationbackup = ConfigSubsection()
 config.plugins.configurationbackup.backuplocation = ConfigText(default = '/media/hdd/', visible_width = 50, fixed_size = False)
@@ -74,30 +76,31 @@ def load_cache(cache_file):
 
 class UpdatePluginMenu(Screen):
        skin = """
-               <screen name="UpdatePluginMenu" position="center,center" size="560,400" title="Software manager" >
+               <screen name="UpdatePluginMenu" position="center,center" size="610,410" title="Software management" >
                        <ePixmap pixmap="skin_default/buttons/red.png" position="0,0" size="140,40" alphatest="on" />
                        <widget source="key_red" render="Label" position="0,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" />
-                       <ePixmap pixmap="skin_default/border_menu_300.png" position="5,50" zPosition="1" size="300,300" transparent="1" alphatest="on" />
-                       <widget source="menu" render="Listbox" position="10,60" size="290,260" scrollbarMode="showOnDemand">
+                       <ePixmap pixmap="skin_default/border_menu_350.png" position="5,50" zPosition="1" size="350,300" transparent="1" alphatest="on" />
+                       <widget source="menu" render="Listbox" position="15,60" size="330,290" scrollbarMode="showOnDemand">
                                <convert type="TemplatedMultiContent">
                                        {"template": [
-                                                       MultiContentEntryText(pos = (2, 2), size = (290, 22), flags = RT_HALIGN_LEFT, text = 1), # index 0 is the MenuText,
+                                                       MultiContentEntryText(pos = (2, 2), size = (330, 24), flags = RT_HALIGN_LEFT, text = 1), # index 0 is the MenuText,
                                                ],
-                                       "fonts": [gFont("Regular", 20)],
+                                       "fonts": [gFont("Regular", 22)],
                                        "itemHeight": 25
                                        }
                                </convert>
                        </widget>
-                       <widget source="menu" render="Listbox" position="310,50" size="240,300" scrollbarMode="showNever" selectionDisabled="1">
+                       <widget source="menu" render="Listbox" position="360,50" size="240,300" scrollbarMode="showNever" selectionDisabled="1">
                                <convert type="TemplatedMultiContent">
                                        {"template": [
                                                        MultiContentEntryText(pos = (2, 2), size = (240, 300), flags = RT_HALIGN_CENTER|RT_VALIGN_CENTER|RT_WRAP, text = 2), # index 2 is the Description,
                                                ],
-                                       "fonts": [gFont("Regular", 20)],
+                                       "fonts": [gFont("Regular", 22)],
                                        "itemHeight": 300
                                        }
                                </convert>
                        </widget>
+                       <widget source="status" render="Label" position="5,360" zPosition="10" size="600,50" halign="center" valign="center" font="Regular;22" transparent="1" shadowColor="black" shadowOffset="-1,-1" />
                </screen>"""
                
        def __init__(self, session, args = 0):
@@ -106,14 +109,15 @@ class UpdatePluginMenu(Screen):
                self.menu = args
                self.list = []
                self.oktext = _("\nPress OK on your remote control to continue.")
+               self.text = ""
                self.backupdirs = ' '.join( config.plugins.configurationbackup.backupdirs.value )
                if self.menu == 0:
+                       self.list.append(("install-extensions", _("Manage extensions"), _("\nManage extensions or plugins for your Dreambox" ) + self.oktext, None))
                        self.list.append(("software-update", _("Software update"), _("\nOnline update of your Dreambox software." ) + self.oktext, None))
-                       #self.list.append(("install-plugins", _("Install extensions"), _("\nInstall new Extensions or Plugins to your dreambox" ) + self.oktext, None))
                        self.list.append(("software-restore", _("Software restore"), _("\nRestore your Dreambox with a new firmware." ) + self.oktext, None))
                        self.list.append(("system-backup", _("Backup system settings"), _("\nBackup your Dreambox settings." ) + self.oktext, None))
                        self.list.append(("system-restore",_("Restore system settings"), _("\nRestore your Dreambox settings." ) + self.oktext, None))
-                       self.list.append(("ipkg-install", _("Install local extension"),  _("\nScan for local packages and install them." ) + self.oktext, None))
+                       self.list.append(("ipkg-install", _("Install local extension"),  _("\nScan for local extensions and install them." ) + self.oktext, None))
                        for p in plugins.getPlugins(PluginDescriptor.WHERE_SOFTWAREMANAGER):
                                if p.__call__.has_key("SoftwareSupported"):
                                        callFnc = p.__call__["SoftwareSupported"](None)
@@ -133,8 +137,8 @@ class UpdatePluginMenu(Screen):
                        self.list.append(("advancedrestore", _("Advanced restore"), _("\nRestore your backups by date." ) + self.oktext, None))
                        self.list.append(("backuplocation", _("Choose backup location"),  _("\nSelect your backup device.\nCurrent device: " ) + config.plugins.configurationbackup.backuplocation.value + self.oktext, None))
                        self.list.append(("backupfiles", _("Choose backup files"),  _("Select files for backup. Currently selected:\n" ) + self.backupdirs + self.oktext, None))
-                       if config.usage.setup_level.index >= 2: # expert+
-                               self.list.append(("ipkg-manager", _("Packet management"),  _("\nView, install and remove available or installed packages." ) + self.oktext, None))
+                       #if config.usage.setup_level.index >= 2: # expert+
+                       #       self.list.append(("ipkg-manager", _("Packet management"),  _("\nView, install and remove available or installed packages." ) + self.oktext, None))
                        self.list.append(("ipkg-source",_("Choose upgrade source"), _("\nEdit the upgrade source address." ) + self.oktext, None))
                        for p in plugins.getPlugins(PluginDescriptor.WHERE_SOFTWAREMANAGER):
                                if p.__call__.has_key("AdvancedSoftwareSupported"):
@@ -152,28 +156,54 @@ class UpdatePluginMenu(Screen):
 
                self["menu"] = List(self.list)
                self["key_red"] = StaticText(_("Close"))
+               self["status"] = StaticText("")
 
-               self["shortcuts"] = ActionMap(["ShortcutActions", "WizardActions"],
+               self["shortcuts"] = ActionMap(["ShortcutActions", "WizardActions", "InfobarEPGActions"],
                {
                        "ok": self.go,
                        "back": self.close,
                        "red": self.close,
                }, -1)
-
                self.onLayoutFinish.append(self.layoutFinished)
                self.backuppath = getBackupPath()
                self.backupfile = getBackupFilename()
                self.fullbackupfilename = self.backuppath + "/" + self.backupfile
                self.onShown.append(self.setWindowTitle)
+               #self.onClose.append(self.cleanup)
 
        def layoutFinished(self):
                idx = 0
                self["menu"].index = idx
+               #self.getUpdateInfos()
 
        def setWindowTitle(self):
-               self.setTitle(_("Software manager"))
+               self.setTitle(_("Software management"))
+
+       def cleanup(self):
+               iNetwork.stopPingConsole()
+               iSoftwareTools.cleanupSoftwareTools()
+
+       def getUpdateInfos(self):
+               self.text = ""
+               if iSoftwareTools.NetworkConnectionAvailable == True:
+                       if iSoftwareTools.list_updating is False:
+                               if iSoftwareTools.available_updates is not 0:
+                                       self.text = _("There are at least ") + str(iSoftwareTools.available_updates) + _(" updates available.")
+                               else:
+                                       self.text = "" #_("There are no updates available.")
+                       else:
+                               if iSoftwareTools.available_updates is not 0:
+                                       self.text = _("There are at least ") + str(iSoftwareTools.available_updates) + _(" updates available.")
+                               else:
+                                       self.text = ""  #_("There are no updates available.")
+                               self.text += "\n" + _("A search for available updates is currently in progress.")
+               else:
+                       self.text = _("No network connection available.")
+               self["status"].setText(self.text)
+
 
        def go(self):
+               #iNetwork.stopPingConsole()
                current = self["menu"].getCurrent()
                if current:
                        currentEntry = current[0]
@@ -182,7 +212,7 @@ class UpdatePluginMenu(Screen):
                                        self.session.openWithCallback(self.runUpgrade, MessageBox, _("Do you want to update your Dreambox?")+"\n"+_("\nAfter pressing OK, please wait!"))
                                elif (currentEntry == "software-restore"):
                                        self.session.open(ImageWizard)
-                               elif (currentEntry == "install-plugins"):
+                               elif (currentEntry == "install-extensions"):
                                        self.session.open(PluginManager, self.skin_path)
                                elif (currentEntry == "system-backup"):
                                        self.session.openWithCallback(self.backupDone,BackupScreen, runBackup = True)
@@ -260,1262 +290,1214 @@ class UpdatePluginMenu(Screen):
                        self.exe = True
                        self.session.open(RestoreScreen, runRestore = True)
 
-class IPKGMenu(Screen):
-       skin = """
-               <screen name="IPKGMenu" position="center,center" size="560,400" title="Select upgrade source to edit." >
-                       <ePixmap pixmap="skin_default/buttons/red.png" position="0,0" size="140,40" alphatest="on" />
-                       <ePixmap pixmap="skin_default/buttons/green.png" position="140,0" size="140,40" alphatest="on" />
-                       <widget source="key_red" render="Label" position="0,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" />
-                       <widget source="key_green" render="Label" position="140,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" transparent="1" />
-                       <widget name="filelist" position="5,50" size="550,340" scrollbarMode="showOnDemand" />
-               </screen>"""
-
-       def __init__(self, session, plugin_path):
-               Screen.__init__(self, session)
-               self.skin_path = plugin_path
-               
-               self["key_red"] = StaticText(_("Close"))
-               self["key_green"] = StaticText(_("Edit"))
-
-               self.sel = []
-               self.val = []
-               self.entry = False
-               self.exe = False
-               
-               self.path = ""
-
-               self["actions"] = NumberActionMap(["SetupActions"],
-               {
-                       "ok": self.KeyOk,
-                       "cancel": self.keyCancel
-               }, -1)
-
-               self["shortcuts"] = ActionMap(["ShortcutActions"],
-               {
-                       "red": self.keyCancel,
-                       "green": self.KeyOk,
-               })
-               self.flist = []
-               self["filelist"] = MenuList(self.flist)
-               self.fill_list()
-               self.onLayoutFinish.append(self.layoutFinished)
-
-       def layoutFinished(self):
-               self.setWindowTitle()
-
-       def setWindowTitle(self):
-               self.setTitle(_("Select upgrade source to edit."))
-
-       def fill_list(self):
-               self.flist = []
-               self.path = '/etc/ipkg/'
-               if (os_path.exists(self.path) == False):
-                       self.entry = False
-                       return
-               for file in listdir(self.path):
-                       if (file.endswith(".conf")):
-                               if file != 'arch.conf':
-                                       self.flist.append((file))
-                                       self.entry = True
-                                       self["filelist"].l.setList(self.flist)
-
-       def KeyOk(self):
-               if (self.exe == False) and (self.entry == True):
-                       self.sel = self["filelist"].getCurrent()
-                       self.val = self.path + self.sel
-                       self.session.open(IPKGSource, self.val)
-
-       def keyCancel(self):
-               self.close()
-
-       def Exit(self):
-               self.close()
-
-
-class IPKGSource(Screen):
-       skin = """
-               <screen name="IPKGSource" position="center,center" size="560,80" title="Edit upgrade source url." >
-                       <ePixmap pixmap="skin_default/buttons/red.png" position="0,0" size="140,40" alphatest="on" />
-                       <ePixmap pixmap="skin_default/buttons/green.png" position="140,0" size="140,40" alphatest="on" />
-                       <widget source="key_red" render="Label" position="0,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" />
-                       <widget source="key_green" render="Label" position="140,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" transparent="1" />
-                       <widget name="text" position="5,50" size="550,25" font="Regular;20" backgroundColor="background" foregroundColor="#cccccc" />
-               </screen>"""
-
-       def __init__(self, session, configfile = None):
-               Screen.__init__(self, session)
-               self.session = session
-               self.configfile = configfile
-               text = ""
-               if self.configfile:
-                       try:
-                               fp = file(configfile, 'r')
-                               sources = fp.readlines()
-                               if sources:
-                                       text = sources[0]
-                               fp.close()
-                       except IOError:
-                               pass
-
-               desk = getDesktop(0)
-               x= int(desk.size().width())
-               y= int(desk.size().height())
-
-               self["key_red"] = StaticText(_("Cancel"))
-               self["key_green"] = StaticText(_("Save"))
-
-               if (y>=720):
-                       self["text"] = Input(text, maxSize=False, type=Input.TEXT)
-               else:
-                       self["text"] = Input(text, maxSize=False, visible_width = 55, type=Input.TEXT)
-
-               self["actions"] = NumberActionMap(["WizardActions", "InputActions", "TextEntryActions", "KeyboardInputActions","ShortcutActions"], 
-               {
-                       "ok": self.go,
-                       "back": self.close,
-                       "red": self.close,
-                       "green": self.go,
-                       "left": self.keyLeft,
-                       "right": self.keyRight,
-                       "home": self.keyHome,
-                       "end": self.keyEnd,
-                       "deleteForward": self.keyDeleteForward,
-                       "deleteBackward": self.keyDeleteBackward,
-                       "1": self.keyNumberGlobal,
-                       "2": self.keyNumberGlobal,
-                       "3": self.keyNumberGlobal,
-                       "4": self.keyNumberGlobal,
-                       "5": self.keyNumberGlobal,
-                       "6": self.keyNumberGlobal,
-                       "7": self.keyNumberGlobal,
-                       "8": self.keyNumberGlobal,
-                       "9": self.keyNumberGlobal,
-                       "0": self.keyNumberGlobal
-               }, -1)
-
-               self.onLayoutFinish.append(self.layoutFinished)
-
-       def layoutFinished(self):
-               self.setWindowTitle()
-               self["text"].right()
-
-       def setWindowTitle(self):
-               self.setTitle(_("Edit upgrade source url."))
-
-       def go(self):
-               text = self["text"].getText()
-               if text:
-                       fp = file(self.configfile, 'w')
-                       fp.write(text)
-                       fp.write("\n")
-                       fp.close()
-               self.close()
-
-       def keyLeft(self):
-               self["text"].left()
-       
-       def keyRight(self):
-               self["text"].right()
-       
-       def keyHome(self):
-               self["text"].home()
-       
-       def keyEnd(self):
-               self["text"].end()
-       
-       def keyDeleteForward(self):
-               self["text"].delete()
-       
-       def keyDeleteBackward(self):
-               self["text"].deleteBackward()
-       
-       def keyNumberGlobal(self, number):
-               self["text"].number(number)
 
+class PluginManager(Screen, DreamInfoHandler):
 
-class PacketManager(Screen):
        skin = """
-               <screen name="PacketManager" position="center,center" size="530,420" title="Packet manager" >
+               <screen name="PluginManager" position="center,center" size="560,440" title="Extensions management" >
                        <ePixmap pixmap="skin_default/buttons/red.png" position="0,0" size="140,40" alphatest="on" />
                        <ePixmap pixmap="skin_default/buttons/green.png" position="140,0" size="140,40" alphatest="on" />
+                       <ePixmap pixmap="skin_default/buttons/yellow.png" position="280,0" size="140,40" alphatest="on" />
+                       <ePixmap pixmap="skin_default/buttons/blue.png" position="420,0" size="140,40" alphatest="on" />
                        <widget source="key_red" render="Label" position="0,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" />
                        <widget source="key_green" render="Label" position="140,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" transparent="1" />
-                       <widget source="list" render="Listbox" position="5,50" size="520,365" scrollbarMode="showOnDemand">
+                       <widget source="key_yellow" render="Label" position="280,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#a08500" transparent="1" />
+                       <widget source="key_blue" render="Label" position="420,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#18188b" transparent="1" />
+                       <widget source="list" render="Listbox" position="5,50" size="550,360" scrollbarMode="showOnDemand">
                                <convert type="TemplatedMultiContent">
-                                       {"template": [
-                                                       MultiContentEntryText(pos = (5, 1), size = (440, 28), font=0, flags = RT_HALIGN_LEFT, text = 0), # index 0 is the name
-                                                       MultiContentEntryText(pos = (5, 26), size = (440, 20), font=1, flags = RT_HALIGN_LEFT, text = 2), # index 2 is the description
-                                                       MultiContentEntryPixmapAlphaTest(pos = (445, 2), size = (48, 48), png = 4), # index 4 is the status pixmap
-                                                       MultiContentEntryPixmapAlphaTest(pos = (5, 50), size = (510, 2), png = 5), # index 4 is the div pixmap
-                                               ],
-                                       "fonts": [gFont("Regular", 22),gFont("Regular", 14)],
+                               {"templates":
+                                       {"default": (51,[
+                                                       MultiContentEntryText(pos = (30, 1), size = (470, 24), font=0, flags = RT_HALIGN_LEFT, text = 0), # index 0 is the name
+                                                       MultiContentEntryText(pos = (30, 25), size = (470, 24), font=1, flags = RT_HALIGN_LEFT, text = 2), # index 2 is the description
+                                                       MultiContentEntryPixmapAlphaTest(pos = (475, 0), size = (48, 48), png = 5), # index 5 is the status pixmap
+                                                       MultiContentEntryPixmapAlphaTest(pos = (0, 49), size = (550, 2), png = 6), # index 6 is the div pixmap
+                                               ]),
+                                       "category": (40,[
+                                                       MultiContentEntryText(pos = (30, 0), size = (500, 22), font=0, flags = RT_HALIGN_LEFT, text = 0), # index 0 is the name
+                                                       MultiContentEntryText(pos = (30, 22), size = (500, 16), font=2, flags = RT_HALIGN_LEFT, text = 1), # index 1 is the description
+                                                       MultiContentEntryPixmapAlphaTest(pos = (0, 38), size = (550, 2), png = 3), # index 3 is the div pixmap
+                                               ])
+                                       },
+                                       "fonts": [gFont("Regular", 22),gFont("Regular", 20),gFont("Regular", 16)],
                                        "itemHeight": 52
-                                       }
+                               }
                                </convert>
                        </widget>
+                       <widget source="status" render="Label" position="5,410" zPosition="10" size="540,30" halign="center" valign="center" font="Regular;22" transparent="1" shadowColor="black" shadowOffset="-1,-1" />
                </screen>"""
-               
+
        def __init__(self, session, plugin_path, args = None):
                Screen.__init__(self, session)
                self.session = session
                self.skin_path = plugin_path
 
-               self["shortcuts"] = ActionMap(["ShortcutActions", "WizardActions"], 
+               self["shortcuts"] = ActionMap(["ShortcutActions", "WizardActions", "InfobarEPGActions", "HelpActions" ],
                {
-                       "ok": self.go,
+                       "ok": self.handleCurrent,
                        "back": self.exit,
                        "red": self.exit,
-                       "green": self.reload,
+                       "green": self.handleCurrent,
+                       "yellow": self.handleSelected,
+                       "showEventInfo": self.handleSelected,
+                       "displayHelp": self.handleHelp,
                }, -1)
-               
+
                self.list = []
                self.statuslist = []
+               self.selectedFiles = []
+               self.categoryList = []
+               self.packetlist = []
                self["list"] = List(self.list)
                self["key_red"] = StaticText(_("Close"))
-               self["key_green"] = StaticText(_("Reload"))
+               self["key_green"] = StaticText("")
+               self["key_yellow"] = StaticText("")
+               self["key_blue"] = StaticText("")
+               self["status"] = StaticText("")
 
-               self.list_updating = True
-               self.packetlist = []
-               self.installed_packetlist = {}
-               self.Console = Console()
                self.cmdList = []
-               self.cachelist = []
-               self.cache_ttl = 86400  #600 is default, 0 disables, Seconds cache is considered valid (24h should be ok for caching ipkgs)
-               self.cache_file = '/usr/lib/enigma2/python/Plugins/SystemPlugins/SoftwareManager/packetmanager.cache' #Path to cache directory   
                self.oktext = _("\nAfter pressing OK, please wait!")
-               self.unwanted_extensions = ('-dbg', '-dev', '-doc', 'busybox')
+               if not self.selectionChanged in self["list"].onSelectionChanged:
+                       self["list"].onSelectionChanged.append(self.selectionChanged)
 
-               self.ipkg = IpkgComponent()
-               self.ipkg.addCallback(self.ipkgCallback)
+               self.currList = ""
+               self.currentSelectedTag = None
+               self.currentSelectedIndex = None
+               self.currentSelectedPackage = None
+               self.saved_currentSelectedPackage = None
+               
                self.onShown.append(self.setWindowTitle)
-               self.onLayoutFinish.append(self.rebuildList)
+               self.onLayoutFinish.append(self.getUpdateInfos)
 
-       def exit(self):
-               self.ipkg.stop()
-               if self.Console is not None:
-                       if len(self.Console.appContainers):
-                               for name in self.Console.appContainers.keys():
-                                       self.Console.kill(name)
-               self.close()
+       def setWindowTitle(self):
+               self.setTitle(_("Extensions management"))
 
-       def reload(self):
-               if (os_path.exists(self.cache_file) == True):
-                       remove(self.cache_file)
-                       self.list_updating = True
-                       self.rebuildList()
-                       
-       def setWindowTitle(self):
-               self.setTitle(_("Packet manager"))
+       def exit(self):
+               if self.currList == "packages":
+                       self.currList = "category"
+                       self.currentSelectedTag = None
+                       self["list"].style = "category"
+                       self['list'].setList(self.categoryList)
+                       self["list"].setIndex(self.currentSelectedIndex)
+                       self["list"].updateList(self.categoryList)
+                       self.selectionChanged()
+               else:
+                       iSoftwareTools.cleanupSoftwareTools()
+                       self.prepareInstall()
+                       if len(self.cmdList):
+                               self.session.openWithCallback(self.runExecute, PluginManagerInfo, self.skin_path, self.cmdList)
+                       else:
+                               self.close()
 
-       def setStatus(self,status = None):
+       def handleHelp(self):
+               if self.currList != "status":
+                       self.session.open(PluginManagerHelp, self.skin_path)
+
+       def setState(self,status = None):
                if status:
+                       self.currList = "status"
                        self.statuslist = []
+                       self["key_green"].setText("")
+                       self["key_blue"].setText("")
+                       self["key_yellow"].setText("")
                        divpng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/div-h.png"))
                        if status == 'update':
                                statuspng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_PLUGIN, "SystemPlugins/SoftwareManager/upgrade.png"))
-                               self.statuslist.append(( _("Package list update"), '', _("Trying to download a new packetlist. Please wait..." ),'',statuspng, divpng ))
-                               self['list'].setList(self.statuslist)   
+                               self.statuslist.append(( _("Updating software catalog"), '', _("Searching for available updates. Please wait..." ),'', '', statuspng, divpng, None, '' ))
+                               self["list"].style = "default"
+                               self['list'].setList(self.statuslist)
+                       elif status == 'sync':
+                               statuspng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_PLUGIN, "SystemPlugins/SoftwareManager/upgrade.png"))
+                               self.statuslist.append(( _("Package list update"), '', _("Searching for new installed or removed packages. Please wait..." ),'', '', statuspng, divpng, None, '' ))
+                               self["list"].style = "default"
+                               self['list'].setList(self.statuslist)
                        elif status == 'error':
                                statuspng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_PLUGIN, "SystemPlugins/SoftwareManager/remove.png"))
-                               self.statuslist.append(( _("Error"), '', _("There was an error downloading the packetlist. Please try again." ),'',statuspng, divpng ))
-                               self['list'].setList(self.statuslist)                           
-
-       def rebuildList(self):
-               self.setStatus('update')
-               self.inv_cache = 0
-               self.vc = valid_cache(self.cache_file, self.cache_ttl)
-               if self.cache_ttl > 0 and self.vc != 0:
-                       try:
-                               self.buildPacketList()
-                       except:
-                               self.inv_cache = 1
-               if self.cache_ttl == 0 or self.inv_cache == 1 or self.vc == 0:
-                       self.run = 0
-                       self.ipkg.startCmd(IpkgComponent.CMD_UPDATE)
-
-       def go(self, returnValue = None):
-               cur = self["list"].getCurrent()
-               if cur:
-                       status = cur[3]
-                       package = cur[0]
-                       self.cmdList = []
-                       if status == 'installed':
-                               self.cmdList.append((IpkgComponent.CMD_REMOVE, { "package": package }))
-                               if len(self.cmdList):
-                                       self.session.openWithCallback(self.runRemove, MessageBox, _("Do you want to remove the package:\n") + package + "\n" + self.oktext)
-                       elif status == 'upgradeable':
-                               self.cmdList.append((IpkgComponent.CMD_INSTALL, { "package": package }))
-                               if len(self.cmdList):
-                                       self.session.openWithCallback(self.runUpgrade, MessageBox, _("Do you want to upgrade the package:\n") + package + "\n" + self.oktext)
-                       elif status == "installable":
-                               self.cmdList.append((IpkgComponent.CMD_INSTALL, { "package": package }))
-                               if len(self.cmdList):
-                                       self.session.openWithCallback(self.runUpgrade, MessageBox, _("Do you want to install the package:\n") + package + "\n" + self.oktext)
+                               self.statuslist.append(( _("Error"), '', _("There was an error downloading the packetlist. Please try again." ),'', '', statuspng, divpng, None, '' ))
+                               self["list"].style = "default"
+                               self['list'].setList(self.statuslist)
 
-       def runRemove(self, result):
-               if result:
-                       self.session.openWithCallback(self.runRemoveFinished, Ipkg, cmdList = self.cmdList)
+       def getUpdateInfos(self):
+               self.setState('update')
+               iSoftwareTools.getUpdates(self.getUpdateInfosCB)
 
-       def runRemoveFinished(self):
-               self.session.openWithCallback(self.RemoveReboot, MessageBox, _("Remove finished.") +" "+_("Do you want to reboot your Dreambox?"), MessageBox.TYPE_YESNO)
+       def getUpdateInfosCB(self, retval = None):
+               if retval is not None:
+                       if retval is True:
+                               if iSoftwareTools.available_updates is not 0:
+                                       self["status"].setText(_("There are at least ") + str(iSoftwareTools.available_updates) + _(" updates available."))
+                               else:
+                                       self["status"].setText(_("There are no updates available."))
+                       elif retval is False:
+                               self["status"].setText(_("No network connection available."))
+                       self.rebuildList()
 
-       def RemoveReboot(self, result):
-               if result is None:
-                       return
-               if result is False:
-                       cur = self["list"].getCurrent()
-                       if cur:
-                               item = self['list'].getIndex()
-                               self.list[item] = self.buildEntryComponent(cur[0], cur[1], cur[2], 'installable')
-                               self.cachelist[item] = [cur[0], cur[1], cur[2], 'installable']
-                               self['list'].setList(self.list)
-                               write_cache(self.cache_file, self.cachelist)
-                               self.reloadPluginlist()
-               if result:
-                       quitMainloop(3)
+       def rebuildList(self, retval = None):
+               if self.currentSelectedTag is None:
+                       self.buildCategoryList()
+               else:
+                       self.buildPacketList(self.currentSelectedTag)
 
-       def runUpgrade(self, result):
-               if result:
-                       self.session.openWithCallback(self.runUpgradeFinished, Ipkg, cmdList = self.cmdList)
+       def selectionChanged(self):
+               current = self["list"].getCurrent()
+               self["status"].setText("")
+               if current:
+                       if self.currList == "packages":
+                               self["key_red"].setText(_("Back"))
+                               if current[4] == 'installed':
+                                       self["key_green"].setText(_("Uninstall"))
+                               elif current[4] == 'installable':
+                                       self["key_green"].setText(_("Install"))
+                               elif current[4] == 'remove':
+                                       self["key_green"].setText(_("Undo uninstall"))
+                               elif current[4] == 'install':
+                                       self["key_green"].setText(_("Undo install"))
+                               self["key_yellow"].setText(_("View details"))
+                               self["key_blue"].setText("")
+                               if len(self.selectedFiles) == 0 and iSoftwareTools.available_updates is not 0:
+                                       self["status"].setText(_("There are at least ") + str(iSoftwareTools.available_updates) + _(" updates available."))
+                               elif len(self.selectedFiles) is not 0:
+                                       self["status"].setText(str(len(self.selectedFiles)) + _(" packages selected."))
+                               else:
+                                       self["status"].setText(_("There are currently no outstanding actions."))
+                       elif self.currList == "category":
+                               self["key_red"].setText(_("Close"))
+                               self["key_green"].setText("")
+                               self["key_yellow"].setText("")
+                               self["key_blue"].setText("")
+                               if len(self.selectedFiles) == 0 and iSoftwareTools.available_updates is not 0:
+                                       self["status"].setText(_("There are at least ") + str(iSoftwareTools.available_updates) + _(" updates available."))
+                                       self["key_yellow"].setText(_("Update"))
+                               elif len(self.selectedFiles) is not 0:
+                                       self["status"].setText(str(len(self.selectedFiles)) + _(" packages selected."))
+                                       self["key_yellow"].setText(_("Process"))
+                               else:
+                                       self["status"].setText(_("There are currently no outstanding actions."))
 
-       def runUpgradeFinished(self):
-               self.session.openWithCallback(self.UpgradeReboot, MessageBox, _("Upgrade finished.") +" "+_("Do you want to reboot your Dreambox?"), MessageBox.TYPE_YESNO)
-               
-       def UpgradeReboot(self, result):
-               if result is None:
-                       return
-               if result is False:
-                       cur = self["list"].getCurrent()
-                       if cur:
-                               item = self['list'].getIndex()
-                               self.list[item] = self.buildEntryComponent(cur[0], cur[1], cur[2], 'installed')
-                               self.cachelist[item] = [cur[0], cur[1], cur[2], 'installed']
-                               self['list'].setList(self.list)
-                               write_cache(self.cache_file, self.cachelist)
-                               self.reloadPluginlist()
-               if result:
-                       quitMainloop(3)
+       def getSelectionState(self, detailsFile):
+               for entry in self.selectedFiles:
+                       if entry[0] == detailsFile:
+                               return True
+               return False
 
-       def ipkgCallback(self, event, param):
-               if event == IpkgComponent.EVENT_ERROR:
-                       self.list_updating = False
-                       self.setStatus('error')
-               elif event == IpkgComponent.EVENT_DONE:
-                       if self.list_updating:
-                               self.list_updating = False
-                               if not self.Console:
-                                       self.Console = Console()
-                               cmd = "ipkg list"
-                               self.Console.ePopen(cmd, self.IpkgList_Finished)
-               #print event, "-", param
-               pass
+       def handleCurrent(self):
+               current = self["list"].getCurrent()
+               if current:
+                       if self.currList == "category":
+                               self.currentSelectedIndex = self["list"].index
+                               selectedTag = current[2]
+                               self.buildPacketList(selectedTag)
+                       elif self.currList == "packages":
+                               if current[7] is not '':
+                                       idx = self["list"].getIndex()
+                                       detailsFile = self.list[idx][1]
+                                       if self.list[idx][7] == True:
+                                               for entry in self.selectedFiles:
+                                                       if entry[0] == detailsFile:
+                                                               self.selectedFiles.remove(entry)
+                                       else:
+                                               alreadyinList = False
+                                               for entry in self.selectedFiles:
+                                                       if entry[0] == detailsFile:
+                                                               alreadyinList = True
+                                               if not alreadyinList:
+                                                       self.selectedFiles.append((detailsFile,current[4],current[3]))
+                                                       self.currentSelectedPackage = ((detailsFile,current[4],current[3]))
+                                       if current[4] == 'installed':
+                                               self.list[idx] = self.buildEntryComponent(current[0], current[1], current[2], current[3], 'remove', True)
+                                       elif current[4] == 'installable':
+                                               self.list[idx] = self.buildEntryComponent(current[0], current[1], current[2], current[3], 'install', True)
+                                       elif current[4] == 'remove':
+                                               self.list[idx] = self.buildEntryComponent(current[0], current[1], current[2], current[3], 'installed', False)
+                                       elif current[4] == 'install':
+                                               self.list[idx] = self.buildEntryComponent(current[0], current[1], current[2], current[3], 'installable',False)
+                                       self["list"].setList(self.list)
+                                       self["list"].setIndex(idx)
+                                       self["list"].updateList(self.list)
+                                       self.selectionChanged()
 
-       def IpkgList_Finished(self, result, retval, extra_args = None):
-               if len(result):
-                       self.packetlist = []
-                       for x in result.splitlines():
-                               split = x.split(' - ')   #self.blacklisted_packages
-                               if not any(split[0].strip().endswith(x) for x in self.unwanted_extensions):
-                                       self.packetlist.append([split[0].strip(), split[1].strip(),split[2].strip()])
-               if not self.Console:
-                       self.Console = Console()
-               cmd = "ipkg list_installed"
-               self.Console.ePopen(cmd, self.IpkgListInstalled_Finished)
+       def handleSelected(self):
+               current = self["list"].getCurrent()
+               if current:
+                       if self.currList == "packages":
+                               if current[7] is not '':
+                                       detailsfile = iSoftwareTools.directory[0] + "/" + current[1]
+                                       if (os_path.exists(detailsfile) == True):
+                                               self.saved_currentSelectedPackage = self.currentSelectedPackage
+                                               self.session.openWithCallback(self.detailsClosed, PluginDetails, self.skin_path, current)
+                                       else:
+                                               self.session.open(MessageBox, _("Sorry, no Details available!"), MessageBox.TYPE_INFO, timeout = 10)
+                       elif self.currList == "category":
+                               self.prepareInstall()
+                               if len(self.cmdList):
+                                       self.session.openWithCallback(self.runExecute, PluginManagerInfo, self.skin_path, self.cmdList)
 
-       def IpkgListInstalled_Finished(self, result, retval, extra_args = None):
-               if len(result):
-                       self.installed_packetlist = {}
-                       for x in result.splitlines():
-                               split = x.split(' - ')
-                               if not any(split[0].strip().endswith(x) for x in self.unwanted_extensions):
-                                       self.installed_packetlist[split[0].strip()] = split[1].strip()
-               self.buildPacketList()
+       def detailsClosed(self, result = None):
+               if result is not None:
+                       if result is not False:
+                               self.setState('sync')
+                               iSoftwareTools.lastDownloadDate = time()
+                               for entry in self.selectedFiles:
+                                       if entry == self.saved_currentSelectedPackage:
+                                               self.selectedFiles.remove(entry)
+                               iSoftwareTools.startIpkgListInstalled(self.rebuildList)
 
-       def buildEntryComponent(self, name, version, description, state):
+       def buildEntryComponent(self, name, details, description, packagename, state, selected = False):
                divpng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/div-h.png"))
+               installedpng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_PLUGIN, "SystemPlugins/SoftwareManager/installed.png"))
+               installablepng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_PLUGIN, "SystemPlugins/SoftwareManager/installable.png"))
+               removepng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_PLUGIN, "SystemPlugins/SoftwareManager/remove.png"))
+               installpng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_PLUGIN, "SystemPlugins/SoftwareManager/install.png"))
                if state == 'installed':
-                       installedpng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_PLUGIN, "SystemPlugins/SoftwareManager/installed.png"))
-                       return((name, version, description, state, installedpng, divpng))       
-               elif state == 'upgradeable':
-                       upgradeablepng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_PLUGIN, "SystemPlugins/SoftwareManager/upgradeable.png"))
-                       return((name, version, description, state, upgradeablepng, divpng))     
-               else:
-                       installablepng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_PLUGIN, "SystemPlugins/SoftwareManager/installable.png"))
-                       return((name, version, description, state, installablepng, divpng))
+                       return((name, details, description, packagename, state, installedpng, divpng, selected))
+               elif state == 'installable':
+                       return((name, details, description, packagename, state, installablepng, divpng, selected))
+               elif state == 'remove':
+                       return((name, details, description, packagename, state, removepng, divpng, selected))
+               elif state == 'install':
+                       return((name, details, description, packagename, state, installpng, divpng, selected))
 
-       def buildPacketList(self):
-               self.list = []
-               self.cachelist = []
-
-               if self.cache_ttl > 0 and self.vc != 0:
-                       print 'Loading packagelist cache from ',self.cache_file
-                       try:
-                               self.cachelist = load_cache(self.cache_file)
-                               if len(self.cachelist) > 0:
-                                       for x in self.cachelist:
-                                               self.list.append(self.buildEntryComponent(x[0], x[1], x[2], x[3]))
-                                       self['list'].setList(self.list)
-                       except:
-                               self.inv_cache = 1
-
-               if self.cache_ttl == 0 or self.inv_cache == 1 or self.vc == 0:
-                       print 'rebuilding fresh package list'
+       def buildPacketList(self, categorytag = None):
+               if categorytag is not None:
+                       self.currList = "packages"
+                       self.currentSelectedTag = categorytag
+                       self.packetlist = []
+                       for package in iSoftwareTools.packagesIndexlist[:]:
+                               prerequisites = package[0]["prerequisites"]
+                               if prerequisites.has_key("tag"):
+                                       for foundtag in prerequisites["tag"]:
+                                               if categorytag == foundtag:
+                                                       attributes = package[0]["attributes"]
+                                                       print "ATTRIBUTES",attributes
+                                                       if attributes.has_key("packagetype"):
+                                                               print "PACKAGETYPE",attributes["packagetype"]
+                                                               if attributes["packagetype"] == "internal":
+                                                                       continue
+                                                               self.packetlist.append([attributes["name"], attributes["details"], attributes["shortdescription"], attributes["packagename"]])
+                                                       else:
+                                                               self.packetlist.append([attributes["name"], attributes["details"], attributes["shortdescription"], attributes["packagename"]])
+                       self.list = []
                        for x in self.packetlist:
                                status = ""
-                               if self.installed_packetlist.has_key(x[0].strip()):
-                                       if self.installed_packetlist[x[0].strip()] == x[1].strip():
-                                               status = "installed"
-                                               self.list.append(self.buildEntryComponent(x[0].strip(), x[1].strip(), x[2].strip(), status))
+                               name = x[0].strip()
+                               details = x[1].strip()
+                               description = x[2].strip()
+                               packagename = x[3].strip()
+                               selectState = self.getSelectionState(details)
+                               if iSoftwareTools.installed_packetlist.has_key(packagename):
+                                       if selectState == True:
+                                               status = "remove"
                                        else:
-                                               status = "upgradeable"
-                                               self.list.append(self.buildEntryComponent(x[0].strip(), x[1].strip(), x[2].strip(), status))
+                                               status = "installed"
+                                       self.list.append(self.buildEntryComponent(name, details, description, packagename, status, selected = selectState))
                                else:
-                                       status = "installable"
-                                       self.list.append(self.buildEntryComponent(x[0].strip(), x[1].strip(), x[2].strip(), status))
-                               if not any(x[0].strip().endswith(x) for x in self.unwanted_extensions):
-                                       self.cachelist.append([x[0].strip(), x[1].strip(), x[2].strip(), status])
-                       write_cache(self.cache_file, self.cachelist)
+                                       if selectState == True:
+                                               status = "install"
+                                       else:
+                                               status = "installable"
+                                       self.list.append(self.buildEntryComponent(name, details, description, packagename, status, selected = selectState))
+                       if len(self.list):
+                               self.list.sort(key=lambda x: x[0])
+                       self["list"].style = "default"
                        self['list'].setList(self.list)
+                       self["list"].updateList(self.list)
+                       self.selectionChanged()
 
-       def reloadPluginlist(self):
-               plugins.readPluginList(resolveFilename(SCOPE_PLUGINS))
+       def buildCategoryList(self):
+               self.currList = "category"
+               self.categories = []
+               self.categoryList = []
+               for package in iSoftwareTools.packagesIndexlist[:]:
+                       prerequisites = package[0]["prerequisites"]
+                       if prerequisites.has_key("tag"):
+                               for foundtag in prerequisites["tag"]:
+                                       attributes = package[0]["attributes"]
+                                       if foundtag not in self.categories:
+                                               self.categories.append(foundtag)
+                                               self.categoryList.append(self.buildCategoryComponent(foundtag))
+               self.categoryList.sort(key=lambda x: x[0])
+               self["list"].style = "category"
+               self['list'].setList(self.categoryList)
+               self["list"].updateList(self.categoryList)
+               self.selectionChanged()
 
+       def buildCategoryComponent(self, tag = None):
+               divpng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/div-h.png"))
+               if tag is not None:
+                       if tag == 'System':
+                               return(( _("System"), _("View list of available system extensions" ), tag, divpng ))
+                       elif tag == 'Skin':
+                               return(( _("Skins"), _("View list of available skins" ), tag, divpng ))
+                       elif tag == 'Recording':
+                               return(( _("Recordings"), _("View list of available recording extensions" ), tag, divpng ))
+                       elif tag == 'Network':
+                               return(( _("Network"), _("View list of available networking extensions" ), tag, divpng ))
+                       elif tag == 'CI':
+                               return(( _("CommonInterface"), _("View list of available CommonInterface extensions" ), tag, divpng ))
+                       elif tag == 'Default':
+                               return(( _("Default Settings"), _("View list of available default settings" ), tag, divpng ))
+                       elif tag == 'SAT':
+                               return(( _("Satteliteequipment"), _("View list of available Satteliteequipment extensions." ), tag, divpng ))
+                       elif tag == 'Software':
+                               return(( _("Software"), _("View list of available software extensions" ), tag, divpng ))
+                       elif tag == 'Multimedia':
+                               return(( _("Multimedia"), _("View list of available multimedia extensions." ), tag, divpng ))
+                       elif tag == 'Display':
+                               return(( _("Display and Userinterface"), _("View list of available Display and Userinterface extensions." ), tag, divpng ))
+                       elif tag == 'EPG':
+                               return(( _("Electronic Program Guide"), _("View list of available EPG extensions." ), tag, divpng ))
+                       elif tag == 'Communication':
+                               return(( _("Communication"), _("View list of available communication extensions." ), tag, divpng ))
+                       else: # dynamically generate non existent tags
+                               return(( str(tag), _("View list of available ") + str(tag) + _(" extensions." ), tag, divpng ))
 
-class PluginManager(Screen, DreamInfoHandler):
+       def prepareInstall(self):
+               self.cmdList = []
+               if iSoftwareTools.available_updates > 0:
+                       self.cmdList.append((IpkgComponent.CMD_UPGRADE, { "test_only": False }))
+               if self.selectedFiles and len(self.selectedFiles):
+                       for plugin in self.selectedFiles:
+                               detailsfile = iSoftwareTools.directory[0] + "/" + plugin[0]
+                               if (os_path.exists(detailsfile) == True):
+                                       iSoftwareTools.fillPackageDetails(plugin[0])
+                                       self.package = iSoftwareTools.packageDetails[0]
+                                       if self.package[0].has_key("attributes"):
+                                               self.attributes = self.package[0]["attributes"]
+                                       if self.attributes.has_key("package"):
+                                               self.packagefiles = self.attributes["package"]
+                                       if plugin[1] == 'installed':
+                                               if self.packagefiles:
+                                                       for package in self.packagefiles[:]:
+                                                               self.cmdList.append((IpkgComponent.CMD_REMOVE, { "package": package["name"] }))
+                                               else:
+                                                       self.cmdList.append((IpkgComponent.CMD_REMOVE, { "package": plugin[2] }))
+                                       else:
+                                               if self.packagefiles:
+                                                       for package in self.packagefiles[:]:
+                                                               self.cmdList.append((IpkgComponent.CMD_INSTALL, { "package": package["name"] }))
+                                               else:
+                                                       self.cmdList.append((IpkgComponent.CMD_INSTALL, { "package": plugin[2] }))
+                               else:
+                                       if plugin[1] == 'installed':
+                                               self.cmdList.append((IpkgComponent.CMD_REMOVE, { "package": plugin[2] }))
+                                       else:
+                                               self.cmdList.append((IpkgComponent.CMD_INSTALL, { "package": plugin[2] }))
+
+       def runExecute(self, result = None):
+               if result is not None:
+                       if result[0] is True:
+                               self.session.openWithCallback(self.runExecuteFinished, Ipkg, cmdList = self.cmdList)
+                       elif result[0] is False:
+                               self.cmdList = result[1]
+                               self.session.openWithCallback(self.runExecuteFinished, Ipkg, cmdList = self.cmdList)
+               else:
+                       self.close()
+
+       def runExecuteFinished(self):
+               self.session.openWithCallback(self.ExecuteReboot, MessageBox, _("Install or remove finished.") +" "+_("Do you want to reboot your Dreambox?"), MessageBox.TYPE_YESNO)
+
+       def ExecuteReboot(self, result):
+               if result is None:
+                       return
+               if result is False:
+                       self.reloadPluginlist()
+                       self.selectedFiles = None
+                       self.detailsClosed(True)
+               if result:
+                       quitMainloop(3)
+
+       def reloadPluginlist(self):
+               plugins.readPluginList(resolveFilename(SCOPE_PLUGINS))
 
-       lastDownloadDate = None
 
+class PluginManagerInfo(Screen):
        skin = """
-               <screen name="PluginManager" position="center,center" size="560,440" title="Plugin manager" >
+               <screen name="PluginManagerInfo" position="center,center" size="560,450" title="Plugin manager activity information" >
                        <ePixmap pixmap="skin_default/buttons/red.png" position="0,0" size="140,40" alphatest="on" />
                        <ePixmap pixmap="skin_default/buttons/green.png" position="140,0" size="140,40" alphatest="on" />
-                       <ePixmap pixmap="skin_default/buttons/yellow.png" position="280,0" size="140,40" alphatest="on" />
-                       <ePixmap pixmap="skin_default/buttons/blue.png" position="420,0" size="140,40" alphatest="on" />
                        <widget source="key_red" render="Label" position="0,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" />
                        <widget source="key_green" render="Label" position="140,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" transparent="1" />
-                       <widget source="key_yellow" render="Label" position="280,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#a08500" transparent="1" />
-                       <widget source="key_blue" render="Label" position="420,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#18188b" transparent="1" />
-                       <widget source="list" render="Listbox" position="5,50" size="550,360" scrollbarMode="showOnDemand">
+                       <widget source="list" render="Listbox" position="5,50" size="550,350" scrollbarMode="showOnDemand" selectionDisabled="1">
                                <convert type="TemplatedMultiContent">
-                               {"templates":
-                                       {"default": (51,[
-                                                       MultiContentEntryText(pos = (30, 1), size = (470, 24), font=0, flags = RT_HALIGN_LEFT, text = 0), # index 0 is the name
-                                                       MultiContentEntryText(pos = (30, 25), size = (470, 20), font=1, flags = RT_HALIGN_LEFT, text = 2), # index 2 is the description
-                                                       MultiContentEntryPixmapAlphaTest(pos = (475, 0), size = (48, 48), png = 5), # index 5 is the status pixmap
-                                                       MultiContentEntryPixmapAlphaTest(pos = (0, 49), size = (550, 2), png = 6), # index 6 is the div pixmap
-                                               ]),
-                                       "category": (40,[
-                                                       MultiContentEntryText(pos = (30, 0), size = (500, 22), font=0, flags = RT_HALIGN_LEFT, text = 0), # index 0 is the name
-                                                       MultiContentEntryText(pos = (30, 22), size = (500, 16), font=1, flags = RT_HALIGN_LEFT, text = 1), # index 1 is the description
-                                                       MultiContentEntryPixmapAlphaTest(pos = (0, 38), size = (550, 2), png = 3), # index 3 is the div pixmap
-                                               ])
-                                       },
-                                       "fonts": [gFont("Regular", 22),gFont("Regular", 16)],
-                                       "itemHeight": 52
-                               }
+                                       {"template": [
+                                                       MultiContentEntryText(pos = (50, 0), size = (150, 26), font=0, flags = RT_HALIGN_LEFT, text = 0), # index 0 is the name
+                                                       MultiContentEntryText(pos = (50, 27), size = (540, 23), font=1, flags = RT_HALIGN_LEFT, text = 1), # index 1 is the state
+                                                       MultiContentEntryPixmapAlphaTest(pos = (0, 1), size = (48, 48), png = 2), # index 2 is the status pixmap
+                                                       MultiContentEntryPixmapAlphaTest(pos = (0, 48), size = (550, 2), png = 3), # index 3 is the div pixmap
+                                               ],
+                                       "fonts": [gFont("Regular", 24),gFont("Regular", 22)],
+                                       "itemHeight": 50
+                                       }
                                </convert>
                        </widget>
-                       <widget source="status" render="Label" position="5,410" zPosition="10" size="540,30" halign="center" valign="center" font="Regular;22" transparent="1" shadowColor="black" shadowOffset="-1,-1" />
+                       <ePixmap pixmap="skin_default/div-h.png" position="0,404" zPosition="10" size="560,2" transparent="1" alphatest="on" />
+                       <widget source="status" render="Label" position="5,408" zPosition="10" size="550,44" halign="center" valign="center" font="Regular;22" transparent="1" shadowColor="black" shadowOffset="-1,-1" />
                </screen>"""
 
-       def __init__(self, session, plugin_path, args = None):
+       def __init__(self, session, plugin_path, cmdlist = None):
                Screen.__init__(self, session)
                self.session = session
                self.skin_path = plugin_path
-               aboutInfo = about.getImageVersionString()
-               if aboutInfo.startswith("dev-"):
-                       self.ImageVersion = 'Experimental'
-               else:
-                       self.ImageVersion = 'Stable'
-               self.language = language.getLanguage()[:2] # getLanguage returns e.g. "fi_FI" for "language_country"
-
-               DreamInfoHandler.__init__(self, self.statusCallback, blocking = False, neededTag = 'ALL_TAGS', neededFlag = self.ImageVersion, language = self.language)
-               self.directory = resolveFilename(SCOPE_METADIR)
+               self.cmdlist = cmdlist
 
-               self["shortcuts"] = ActionMap(["ShortcutActions", "WizardActions", "InfobarEPGActions", "HelpActions" ],
+               self["shortcuts"] = ActionMap(["ShortcutActions", "WizardActions"],
                {
-                       "ok": self.handleCurrent,
+                       "ok": self.process_all,
                        "back": self.exit,
                        "red": self.exit,
-                       "green": self.handleCurrent,
-                       "yellow": self.handleSelected,
-                       "showEventInfo": self.handleSelected,
-                       "displayHelp": self.handleHelp,
+                       "green": self.process_extensions,
                }, -1)
 
                self.list = []
-               self.statuslist = []
-               self.selectedFiles = []
-               self.categoryList = []
                self["list"] = List(self.list)
-               self["key_red"] = StaticText(_("Close"))
-               self["key_green"] = StaticText("")
-               self["key_yellow"] = StaticText("")
-               self["key_blue"] = StaticText("")
-               self["status"] = StaticText("")
-
-               self.list_updating = True
-               self.packetlist = []
-               self.installed_packetlist = {}
-               self.available_packetlist = []
-               self.available_updates = 0
-               self.Console = Console()
-               self.cmdList = []
-               self.oktext = _("\nAfter pressing OK, please wait!")
-               self.unwanted_extensions = ('-dbg', '-dev', '-doc')
-
-               self.ipkg = IpkgComponent()
-               self.ipkg.addCallback(self.ipkgCallback)
-               if not self.selectionChanged in self["list"].onSelectionChanged:
-                       self["list"].onSelectionChanged.append(self.selectionChanged)
-
-               self.currList = ""
-               self.currentSelectedTag = None
-               self.currentSelectedIndex = None
+               self["key_red"] = StaticText(_("Cancel"))
+               self["key_green"] = StaticText(_("Only extensions."))
+               self["status"] = StaticText(_("Following tasks will be done after you press OK!"))
 
                self.onShown.append(self.setWindowTitle)
                self.onLayoutFinish.append(self.rebuildList)
 
        def setWindowTitle(self):
-               self.setTitle(_("Plugin manager"))
+               self.setTitle(_("Plugin manager activity information"))
 
-       def exit(self):
-               if self.currList == "packages":
-                       self.currList = "category"
-                       self.currentSelectedTag = None
-                       self["list"].style = "category"
-                       self['list'].setList(self.categoryList)
-                       self["list"].setIndex(self.currentSelectedIndex)
-                       self["list"].updateList(self.categoryList)
-                       self.selectionChanged()
-               else:
-                       self.ipkg.stop()
-                       if self.Console is not None:
-                               if len(self.Console.appContainers):
-                                       for name in self.Console.appContainers.keys():
-                                               self.Console.kill(name)
-                       self.prepareInstall()
-                       if len(self.cmdList):
-                               self.session.openWithCallback(self.runExecute, PluginManagerInfo, self.skin_path, self.cmdList)
-                       else:
-                               self.close()
+       def rebuildList(self):
+               self.list = []
+               if self.cmdlist is not None:
+                       for entry in self.cmdlist:
+                               action = ""
+                               info = ""
+                               cmd = entry[0]
+                               if cmd == 0:
+                                       action = 'install'
+                               elif cmd == 2:
+                                       action = 'remove'
+                               else:
+                                       action = 'upgrade'
+                               args = entry[1]
+                               if cmd == 0:
+                                       info = args['package']
+                               elif cmd == 2:
+                                       info = args['package']
+                               else:
+                                       info = _("Dreambox software because updates are available.")
 
-       def handleHelp(self):
-               if self.currList != "status":
-                       self.session.open(PluginManagerHelp, self.skin_path)
+                               self.list.append(self.buildEntryComponent(action,info))
+                       self['list'].setList(self.list)
+                       self['list'].updateList(self.list)
 
-       def setState(self,status = None):
-               if status:
-                       self.currList = "status"
-                       self.statuslist = []
-                       self["key_green"].setText("")
-                       self["key_blue"].setText("")
-                       self["key_yellow"].setText("")
-                       divpng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/div-h.png"))
-                       if status == 'update':
-                               statuspng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_PLUGIN, "SystemPlugins/SoftwareManager/upgrade.png"))
-                               self.statuslist.append(( _("Package list update"), '', _("Trying to download a new packetlist. Please wait..." ),'', '', statuspng, divpng, None, '' ))
-                               self["list"].style = "default"
-                               self['list'].setList(self.statuslist)
-                       elif status == 'sync':
-                               statuspng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_PLUGIN, "SystemPlugins/SoftwareManager/upgrade.png"))
-                               self.statuslist.append(( _("Package list update"), '', _("Searching for new installed or removed packages. Please wait..." ),'', '', statuspng, divpng, None, '' ))
-                               self["list"].style = "default"
-                               self['list'].setList(self.statuslist)
-                       elif status == 'error':
-                               statuspng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_PLUGIN, "SystemPlugins/SoftwareManager/remove.png"))
-                               self.statuslist.append(( _("Error"), '', _("There was an error downloading the packetlist. Please try again." ),'', '', statuspng, divpng, None, '' ))
-                               self["list"].style = "default"
-                               self['list'].setList(self.statuslist)
-
-       def statusCallback(self, status, progress):
-               pass
-
-       def selectionChanged(self):
-               current = self["list"].getCurrent()
-               self["status"].setText("")
-               if current:
-                       if self.currList == "packages":
-                               self["key_red"].setText(_("Back"))
-                               if current[4] == 'installed':
-                                       self["key_green"].setText(_("Remove"))
-                               elif current[4] == 'installable':
-                                       self["key_green"].setText(_("Install"))
-                               elif current[4] == 'remove':
-                                       self["key_green"].setText(_("Undo\nRemove"))
-                               elif current[4] == 'install':
-                                       self["key_green"].setText(_("Undo\nInstall"))
-                               self["key_yellow"].setText(_("View details"))
-                               self["key_blue"].setText("")
-                               if len(self.selectedFiles) == 0 and self.available_updates is not 0:
-                                       self["status"].setText(_("There are at least ") + str(self.available_updates) + _(" updates available."))
-                               elif len(self.selectedFiles) is not 0:
-                                       self["status"].setText(str(len(self.selectedFiles)) + _(" packages selected."))
-                               else:
-                                       self["status"].setText(_("There is nothing to be done."))
-                       elif self.currList == "category":
-                               self["key_red"].setText(_("Close"))
-                               self["key_green"].setText("")
-                               self["key_yellow"].setText("")
-                               self["key_blue"].setText("")
-                               if len(self.selectedFiles) == 0 and self.available_updates is not 0:
-                                       self["status"].setText(_("There are at least ") + str(self.available_updates) + _(" updates available."))
-                                       self["key_yellow"].setText(_("Update"))
-                               elif len(self.selectedFiles) is not 0:
-                                       self["status"].setText(str(len(self.selectedFiles)) + _(" packages selected."))
-                                       self["key_yellow"].setText(_("Process"))
-                               else:
-                                       self["status"].setText(_("There is nothing to be done."))
-
-       def getSelectionState(self, detailsFile):
-               for entry in self.selectedFiles:
-                       if entry[0] == detailsFile:
-                               return True
-               return False
-
-       def rebuildList(self):
-               self.setState('update')
-               if not PluginManager.lastDownloadDate or (time() - PluginManager.lastDownloadDate) > 3600:
-                       # Only update from internet once per hour
-                       PluginManager.lastDownloadDate = time()
-                       print "last update time > 1h"
-                       self.ipkg.startCmd(IpkgComponent.CMD_UPDATE)
+       def buildEntryComponent(self, action,info):
+               divpng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/div-h.png"))
+               upgradepng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_PLUGIN, "SystemPlugins/SoftwareManager/upgrade.png"))
+               installpng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_PLUGIN, "SystemPlugins/SoftwareManager/install.png"))
+               removepng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_PLUGIN, "SystemPlugins/SoftwareManager/remove.png"))
+               if action == 'install':
+                       return(( _('Installing'), info, installpng, divpng))
+               elif action == 'remove':
+                       return(( _('Removing'), info, removepng, divpng))
                else:
-                       print "last update time < 1h"
-                       self.startIpkgList()
+                       return(( _('Upgrading'), info, upgradepng, divpng))
 
-       def ipkgCallback(self, event, param):
-               if event == IpkgComponent.EVENT_ERROR:
-                       self.list_updating = False
-                       self.setState('error')
-               elif event == IpkgComponent.EVENT_DONE:
-                       self.startIpkgList()
-               pass
+       def exit(self):
+               self.close()
 
-       def startIpkgList(self):
-               if self.list_updating:
-                       if not self.Console:
-                               self.Console = Console()
-                       cmd = "ipkg list"
-                       self.Console.ePopen(cmd, self.IpkgList_Finished)
+       def process_all(self):
+               self.close((True,None))
 
-       def IpkgList_Finished(self, result, retval, extra_args = None):
-               if len(result):
-                       self.available_packetlist = []
-                       for x in result.splitlines():
-                               split = x.split(' - ')
-                               if not any(split[0].strip().endswith(x) for x in self.unwanted_extensions):
-                                       self.available_packetlist.append([split[0].strip(), split[1].strip(), split[2].strip()])
-               self.startInstallMetaPackage()
+       def process_extensions(self):
+               self.list = []
+               if self.cmdlist is not None:
+                       for entry in self.cmdlist:
+                               cmd = entry[0]
+                               if entry[0] in (0,2):
+                                       self.list.append((entry))
+               self.close((False,self.list))
 
-       def startInstallMetaPackage(self):
-               if self.list_updating:
-                       self.list_updating = False
-                       if not self.Console:
-                               self.Console = Console()
-                       cmd = "ipkg install enigma2-meta" #dummy,will change probably"
-                       self.Console.ePopen(cmd, self.InstallMetaPackage_Finished)
 
-       def InstallMetaPackage_Finished(self, result, retval, extra_args = None):
-               if len(result):
-                       self.fillPackagesIndexList()
-               if not self.Console:
-                       self.Console = Console()
-               self.setState('sync')
-               cmd = "ipkg list_installed"
-               self.Console.ePopen(cmd, self.IpkgListInstalled_Finished)
+class PluginManagerHelp(Screen):
+       skin = """
+               <screen name="PluginManagerHelp" position="center,center" size="560,450" title="Plugin manager help" >
+                       <ePixmap pixmap="skin_default/buttons/red.png" position="0,0" size="140,40" alphatest="on" />
+                       <widget source="key_red" render="Label" position="0,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" />
+                       <widget source="list" render="Listbox" position="5,50" size="550,350" scrollbarMode="showOnDemand" selectionDisabled="1">
+                               <convert type="TemplatedMultiContent">
+                                       {"template": [
+                                                       MultiContentEntryText(pos = (50, 0), size = (150, 26), font=0, flags = RT_HALIGN_LEFT, text = 0), # index 0 is the name
+                                                       MultiContentEntryText(pos = (50, 27), size = (540, 23), font=1, flags = RT_HALIGN_LEFT, text = 1), # index 1 is the state
+                                                       MultiContentEntryPixmapAlphaTest(pos = (0, 1), size = (48, 48), png = 2), # index 2 is the status pixmap
+                                                       MultiContentEntryPixmapAlphaTest(pos = (0, 48), size = (550, 2), png = 3), # index 3 is the div pixmap
+                                               ],
+                                       "fonts": [gFont("Regular", 24),gFont("Regular", 22)],
+                                       "itemHeight": 50
+                                       }
+                               </convert>
+                       </widget>
+                       <ePixmap pixmap="skin_default/div-h.png" position="0,404" zPosition="10" size="560,2" transparent="1" alphatest="on" />
+                       <widget source="status" render="Label" position="5,408" zPosition="10" size="550,44" halign="center" valign="center" font="Regular;22" transparent="1" shadowColor="black" shadowOffset="-1,-1" />
+               </screen>"""
 
-       def IpkgListInstalled_Finished(self, result, retval, extra_args = None):
-               if len(result):
-                       self.installed_packetlist = {}
-                       for x in result.splitlines():
-                               split = x.split(' - ')
-                               if not any(split[0].strip().endswith(x) for x in self.unwanted_extensions):
-                                       self.installed_packetlist[split[0].strip()] = split[1].strip()
-               self.countUpdates()
-               if self.currentSelectedTag is None:
-                       self.buildCategoryList()
-               else:
-                       self.buildPacketList(self.currentSelectedTag)
+       def __init__(self, session, plugin_path):
+               Screen.__init__(self, session)
+               self.session = session
+               self.skin_path = plugin_path
 
-       def countUpdates(self):
-               self.available_updates = 0
-               for package in self.packagesIndexlist[:]:
-                       attributes = package[0]["attributes"]
-                       packagename = attributes["packagename"]
-                       for x in self.available_packetlist:
-                               if x[0].strip() == packagename:
-                                       if self.installed_packetlist.has_key(packagename):
-                                               if self.installed_packetlist[packagename] != x[1].strip():
-                                                       self.available_updates +=1
+               self["shortcuts"] = ActionMap(["ShortcutActions", "WizardActions"],
+               {
+                       "back": self.exit,
+                       "red": self.exit,
+               }, -1)
 
-       def handleCurrent(self):
-               current = self["list"].getCurrent()
-               if current:
-                       if self.currList == "category":
-                               self.currentSelectedIndex = self["list"].index
-                               selectedTag = current[2]
-                               self.buildPacketList(selectedTag)
-                       elif self.currList == "packages":
-                               if current[7] is not '':
-                                       idx = self["list"].getIndex()
-                                       detailsFile = self.list[idx][1]
-                                       if self.list[idx][7] == True:
-                                               for entry in self.selectedFiles:
-                                                       if entry[0] == detailsFile:
-                                                               self.selectedFiles.remove(entry)
-                                       else:
-                                               alreadyinList = False
-                                               for entry in self.selectedFiles:
-                                                       if entry[0] == detailsFile:
-                                                               alreadyinList = True
-                                               if not alreadyinList:
-                                                       self.selectedFiles.append((detailsFile,current[4],current[3]))
-                                       if current[4] == 'installed':
-                                               self.list[idx] = self.buildEntryComponent(current[0], current[1], current[2], current[3], 'remove', True)
-                                       elif current[4] == 'installable':
-                                               self.list[idx] = self.buildEntryComponent(current[0], current[1], current[2], current[3], 'install', True)
-                                       elif current[4] == 'remove':
-                                               self.list[idx] = self.buildEntryComponent(current[0], current[1], current[2], current[3], 'installed', False)
-                                       elif current[4] == 'install':
-                                               self.list[idx] = self.buildEntryComponent(current[0], current[1], current[2], current[3], 'installable',False)
-                                       self["list"].setList(self.list)
-                                       self["list"].setIndex(idx)
-                                       self["list"].updateList(self.list)
-                                       self.selectionChanged()
+               self.list = []
+               self["list"] = List(self.list)
+               self["key_red"] = StaticText(_("Close"))
+               self["status"] = StaticText(_("A small overview of the available icon states and actions."))
 
-       def handleSelected(self):
-               current = self["list"].getCurrent()
-               if current:
-                       if self.currList == "packages":
-                               if current[7] is not '':
-                                       detailsfile = self.directory[0] + "/" + current[1]
-                                       if (os_path.exists(detailsfile) == True):
-                                               self.session.openWithCallback(self.detailsClosed, PluginDetails, self.skin_path, current)
-                                       else:
-                                               self.session.open(MessageBox, _("Sorry, no Details available!"), MessageBox.TYPE_INFO, timeout = 10)
-                       elif self.currList == "category":
-                               self.prepareInstall()
-                               if len(self.cmdList):
-                                       self.session.openWithCallback(self.runExecute, PluginManagerInfo, self.skin_path, self.cmdList)
+               self.onShown.append(self.setWindowTitle)
+               self.onLayoutFinish.append(self.rebuildList)
 
-       def detailsClosed(self, result):
-               if result:
-                       if not self.Console:
-                               self.Console = Console()
-                       self.setState('sync')
-                       PluginManager.lastDownloadDate = time()
-                       self.selectedFiles = []
-                       cmd = "ipkg update"
-                       self.Console.ePopen(cmd, self.InstallMetaPackage_Finished)
+       def setWindowTitle(self):
+               self.setTitle(_("Plugin manager help"))
 
-       def buildEntryComponent(self, name, details, description, packagename, state, selected = False):
+       def rebuildList(self):
+               self.list = []
+               self.list.append(self.buildEntryComponent('install'))
+               self.list.append(self.buildEntryComponent('installable'))
+               self.list.append(self.buildEntryComponent('installed'))
+               self.list.append(self.buildEntryComponent('remove'))
+               self['list'].setList(self.list)
+               self['list'].updateList(self.list)
+
+       def buildEntryComponent(self, state):
                divpng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/div-h.png"))
+               installedpng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_PLUGIN, "SystemPlugins/SoftwareManager/installed.png"))
+               installablepng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_PLUGIN, "SystemPlugins/SoftwareManager/installable.png"))
+               removepng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_PLUGIN, "SystemPlugins/SoftwareManager/remove.png"))
+               installpng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_PLUGIN, "SystemPlugins/SoftwareManager/install.png"))
+
                if state == 'installed':
-                       installedpng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_PLUGIN, "SystemPlugins/SoftwareManager/installed.png"))
-                       return((name, details, description, packagename, state, installedpng, divpng, selected))
+                       return(( _('This plugin is installed.'), _('You can remove this plugin.'), installedpng, divpng))
                elif state == 'installable':
-                       installablepng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_PLUGIN, "SystemPlugins/SoftwareManager/installable.png"))
-                       return((name, details, description, packagename, state, installablepng, divpng, selected))
-               elif state == 'remove':
-                       removepng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_PLUGIN, "SystemPlugins/SoftwareManager/remove.png"))
-                       return((name, details, description, packagename, state, removepng, divpng, selected))
+                       return(( _('This plugin is not installed.'), _('You can install this plugin.'), installablepng, divpng))
                elif state == 'install':
-                       installpng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_PLUGIN, "SystemPlugins/SoftwareManager/install.png"))
-                       return((name, details, description, packagename, state, installpng, divpng, selected))
+                       return(( _('This plugin will be installed.'), _('You can cancel the installation.'), installpng, divpng))
+               elif state == 'remove':
+                       return(( _('This plugin will be removed.'), _('You can cancel the removal.'), removepng, divpng))
 
-       def buildPacketList(self, categorytag = None):
-               if categorytag is not None:
-                       self.currList = "packages"
-                       self.currentSelectedTag = categorytag
-                       self.packetlist = []
-                       for package in self.packagesIndexlist[:]:
-                               prerequisites = package[0]["prerequisites"]
-                               if prerequisites.has_key("tag"):
-                                       for foundtag in prerequisites["tag"]:
-                                               if categorytag == foundtag:
-                                                       attributes = package[0]["attributes"]
-                                                       if attributes.has_key("packagetype"):
-                                                               if attributes["packagetype"] == "internal":
-                                                                       continue
-                                                               self.packetlist.append([attributes["name"], attributes["details"], attributes["shortdescription"], attributes["packagename"]])
-                                                       else:
-                                                               self.packetlist.append([attributes["name"], attributes["details"], attributes["shortdescription"], attributes["packagename"]])
-                       self.list = []
-                       for x in self.packetlist:
-                               status = ""
-                               selectState = self.getSelectionState(x[1].strip())
-                               if self.installed_packetlist.has_key(x[3].strip()):
-                                       if selectState == True:
-                                               status = "remove"
-                                       else:
-                                               status = "installed"
-                                       self.list.append(self.buildEntryComponent(x[0].strip(), x[1].strip(), x[2].strip(), x[3].strip(), status, selected = selectState))
-                               else:
-                                       if selectState == True:
-                                               status = "install"
-                                       else:
-                                               status = "installable"
-                                       self.list.append(self.buildEntryComponent(x[0].strip(), x[1].strip(), x[2].strip(), x[3].strip(), status, selected = selectState))
-                       if len(self.list):
-                               self.list.sort(key=lambda x: x[0])
-                       self["list"].style = "default"
-                       self['list'].setList(self.list)
-                       self["list"].updateList(self.list)
-                       self.selectionChanged()
+       def exit(self):
+               self.close()
 
-       def buildCategoryList(self):
-               self.currList = "category"
-               self.categories = []
-               self.categoryList = []
-               for package in self.packagesIndexlist[:]:
-                       prerequisites = package[0]["prerequisites"]
-                       if prerequisites.has_key("tag"):
-                               for foundtag in prerequisites["tag"]:
-                                       attributes = package[0]["attributes"]
-                                       if foundtag not in self.categories:
-                                               self.categories.append(foundtag)
-                                               self.categoryList.append(self.buildCategoryComponent(foundtag))
-               self.categoryList.sort(key=lambda x: x[0])
-               self["list"].style = "category"
-               self['list'].setList(self.categoryList)
-               self["list"].updateList(self.categoryList)
-               self.selectionChanged()
 
-       def buildCategoryComponent(self, tag = None):
-               divpng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/div-h.png"))
-               if tag is not None:
-                       if tag == 'System':
-                               return(( _("System"), _("View list of available system extensions" ), tag, divpng ))
-                       elif tag == 'Skin':
-                               return(( _("Skins"), _("View list of available skins" ), tag, divpng ))
-                       elif tag == 'Recording':
-                               return(( _("Recordings"), _("View list of available recording extensions" ), tag, divpng ))
-                       elif tag == 'Network':
-                               return(( _("Network"), _("View list of available networking extensions" ), tag, divpng ))
-                       elif tag == 'CI':
-                               return(( _("CommonInterface"), _("View list of available CommonInterface extensions" ), tag, divpng ))
-                       elif tag == 'Default':
-                               return(( _("Default Settings"), _("View list of available default settings" ), tag, divpng ))
-                       elif tag == 'SAT':
-                               return(( _("Satteliteequipment"), _("View list of available Satteliteequipment extensions." ), tag, divpng ))
-                       elif tag == 'Software':
-                               return(( _("Software"), _("View list of available software extensions" ), tag, divpng ))
-                       elif tag == 'Multimedia':
-                               return(( _("Multimedia"), _("View list of available multimedia extensions." ), tag, divpng ))
-                       elif tag == 'Display':
-                               return(( _("Display and Userinterface"), _("View list of available Display and Userinterface extensions." ), tag, divpng ))
-                       elif tag == 'EPG':
-                               return(( _("Electronic Program Guide"), _("View list of available EPG extensions." ), tag, divpng ))
-                       elif tag == 'Communication':
-                               return(( _("Communication"), _("View list of available communication extensions." ), tag, divpng ))
-                       else: # dynamically generate non existent tags
-                               return(( str(tag), _("View list of available ") + str(tag) + _(" extensions." ), tag, divpng ))
+class PluginDetails(Screen, DreamInfoHandler):
+       skin = """
+               <screen name="PluginDetails" position="center,center" size="600,440" title="Plugin details" >
+                       <ePixmap pixmap="skin_default/buttons/red.png" position="0,0" size="140,40" alphatest="on" />
+                       <ePixmap pixmap="skin_default/buttons/green.png" position="140,0" size="140,40" alphatest="on" />
+                       <widget source="key_red" render="Label" position="0,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" />
+                       <widget source="key_green" render="Label" position="140,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" transparent="1" />
+                       <widget source="author" render="Label" position="10,50" size="500,25" zPosition="10" font="Regular;21" transparent="1" />
+                       <widget name="statuspic" position="550,40" size="48,48" alphatest="on"/>
+                       <widget name="divpic" position="0,80" size="600,2" alphatest="on"/>
+                       <widget name="detailtext" position="10,90" size="270,330" zPosition="10" font="Regular;21" transparent="1" halign="left" valign="top"/>
+                       <widget name="screenshot" position="290,90" size="300,330" alphatest="on"/>
+               </screen>"""
+       def __init__(self, session, plugin_path, packagedata = None):
+               Screen.__init__(self, session)
+               self.skin_path = plugin_path
+               self.language = language.getLanguage()[:2] # getLanguage returns e.g. "fi_FI" for "language_country"
+               self.attributes = None
+               self.translatedAttributes = None
+               DreamInfoHandler.__init__(self, self.statusCallback, blocking = False, language = self.language)
+               self.directory = resolveFilename(SCOPE_METADIR)
+               if packagedata:
+                       self.pluginname = packagedata[0]
+                       self.details = packagedata[1]
+                       self.pluginstate = packagedata[4]
+                       self.statuspicinstance = packagedata[5]
+                       self.divpicinstance = packagedata[6]
+                       self.fillPackageDetails(self.details)
+
+               self.thumbnail = ""
+
+               self["shortcuts"] = ActionMap(["ShortcutActions", "WizardActions"],
+               {
+                       "back": self.exit,
+                       "red": self.exit,
+                       "green": self.go,
+                       "up": self.pageUp,
+                       "down": self.pageDown,
+                       "left": self.pageUp,
+                       "right": self.pageDown,
+               }, -1)
+
+               self["key_red"] = StaticText(_("Close"))
+               self["key_green"] = StaticText("")
+               self["author"] = StaticText()
+               self["statuspic"] = Pixmap()
+               self["divpic"] = Pixmap()
+               self["screenshot"] = Pixmap()
+               self["detailtext"] = ScrollLabel()
+
+               self["statuspic"].hide()
+               self["screenshot"].hide()
+               self["divpic"].hide()
+
+               self.package = self.packageDetails[0]
+               if self.package[0].has_key("attributes"):
+                       self.attributes = self.package[0]["attributes"]
+               if self.package[0].has_key("translation"):
+                       self.translatedAttributes = self.package[0]["translation"]
 
-       def prepareInstall(self):
                self.cmdList = []
-               if self.available_updates > 0:
-                       self.cmdList.append((IpkgComponent.CMD_UPGRADE, { "test_only": False }))
-               if self.selectedFiles and len(self.selectedFiles):
-                       for plugin in self.selectedFiles:
-                               detailsfile = self.directory[0] + "/" + plugin[0]
-                               if (os_path.exists(detailsfile) == True):
-                                       self.fillPackageDetails(plugin[0])
-                                       self.package = self.packageDetails[0]
-                                       if self.package[0].has_key("attributes"):
-                                               self.attributes = self.package[0]["attributes"]
-                                       if self.attributes.has_key("package"):
-                                               self.packagefiles = self.attributes["package"]
-                                       if plugin[1] == 'installed':
-                                               if self.packagefiles:
-                                                       for package in self.packagefiles[:]:
-                                                               self.cmdList.append((IpkgComponent.CMD_REMOVE, { "package": package["name"] }))
-                                               else:
-                                                       self.cmdList.append((IpkgComponent.CMD_REMOVE, { "package": plugin[2] }))
-                                       else:
-                                               if self.packagefiles:
-                                                       for package in self.packagefiles[:]:
-                                                               self.cmdList.append((IpkgComponent.CMD_INSTALL, { "package": package["name"] }))
-                                               else:
-                                                       self.cmdList.append((IpkgComponent.CMD_INSTALL, { "package": plugin[2] }))
-                               else:
-                                       if plugin[1] == 'installed':
-                                               self.cmdList.append((IpkgComponent.CMD_REMOVE, { "package": plugin[2] }))
-                                       else:
-                                               self.cmdList.append((IpkgComponent.CMD_INSTALL, { "package": plugin[2] }))
+               self.oktext = _("\nAfter pressing OK, please wait!")
+               self.picload = ePicLoad()
+               self.picload.PictureData.get().append(self.paintScreenshotPixmapCB)
+               self.onShown.append(self.setWindowTitle)
+               self.onLayoutFinish.append(self.setInfos)
+
+       def setWindowTitle(self):
+               self.setTitle(_("Details for extension: " + self.pluginname))
+
+       def exit(self):
+               self.close(False)
+
+       def pageUp(self):
+               self["detailtext"].pageUp()
+
+       def pageDown(self):
+               self["detailtext"].pageDown()
+
+       def statusCallback(self, status, progress):
+               pass
+
+       def setInfos(self):
+               if self.translatedAttributes.has_key("name"):
+                       self.pluginname = self.translatedAttributes["name"]
+               elif self.attributes.has_key("name"):
+                       self.pluginname = self.attributes["name"]
+               else:
+                       self.pluginname = _("unknown")
+
+               if self.translatedAttributes.has_key("author"):
+                       self.author = self.translatedAttributes["author"]
+               elif self.attributes.has_key("author"):
+                       self.author = self.attributes["author"]
+               else:
+                       self.author = _("unknown")
+
+               if self.translatedAttributes.has_key("description"):
+                       self.description = self.translatedAttributes["description"]
+               elif self.attributes.has_key("description"):
+                       self.description = self.attributes["description"]
+               else:
+                       self.description = _("No description available.")
+
+               if self.translatedAttributes.has_key("screenshot"):
+                       self.loadThumbnail(self.translatedAttributes)
+               else:
+                       self.loadThumbnail(self.attributes)
+
+               self["author"].setText(_("Author: ") + self.author)
+               self["detailtext"].setText(self.description.strip())
+               if self.pluginstate in ('installable', 'install'):
+                       self["key_green"].setText(_("Install"))
+               else:
+                       self["key_green"].setText(_("Remove"))
+
+       def loadThumbnail(self, entry):
+               thumbnailUrl = None
+               if entry.has_key("screenshot"):
+                       thumbnailUrl = entry["screenshot"]
+               if thumbnailUrl is not None:
+                       self.thumbnail = "/tmp/" + thumbnailUrl.split('/')[-1]
+                       print "[PluginDetails] downloading screenshot " + thumbnailUrl + " to " + self.thumbnail
+                       client.downloadPage(thumbnailUrl,self.thumbnail).addCallback(self.setThumbnail).addErrback(self.fetchFailed)
+               else:
+                       self.setThumbnail(noScreenshot = True)
+
+       def setThumbnail(self, noScreenshot = False):
+               if not noScreenshot:
+                       filename = self.thumbnail
+               else:
+                       filename = resolveFilename(SCOPE_CURRENT_PLUGIN, "SystemPlugins/SoftwareManager/noprev.png")
+
+               sc = AVSwitch().getFramebufferScale()
+               self.picload.setPara((self["screenshot"].instance.size().width(), self["screenshot"].instance.size().height(), sc[0], sc[1], False, 1, "#00000000"))
+               self.picload.startDecode(filename)
+
+               if self.statuspicinstance != None:
+                       self["statuspic"].instance.setPixmap(self.statuspicinstance.__deref__())
+                       self["statuspic"].show()
+               if self.divpicinstance != None:
+                       self["divpic"].instance.setPixmap(self.divpicinstance.__deref__())
+                       self["divpic"].show()
+
+       def paintScreenshotPixmapCB(self, picInfo=None):
+               ptr = self.picload.getData()
+               if ptr != None:
+                       self["screenshot"].instance.setPixmap(ptr.__deref__())
+                       self["screenshot"].show()
+               else:
+                       self.setThumbnail(noScreenshot = True)
+
+       def go(self):
+               if self.attributes.has_key("package"):
+                       self.packagefiles = self.attributes["package"]
+               self.cmdList = []
+               if self.pluginstate in ('installed', 'remove'):
+                       if self.packagefiles:
+                               for package in self.packagefiles[:]:
+                                       self.cmdList.append((IpkgComponent.CMD_REMOVE, { "package": package["name"] }))
+                                       if len(self.cmdList):
+                                               self.session.openWithCallback(self.runRemove, MessageBox, _("Do you want to remove the package:\n") + self.pluginname + "\n" + self.oktext)
+               else:
+                       if self.packagefiles:
+                               for package in self.packagefiles[:]:
+                                       self.cmdList.append((IpkgComponent.CMD_INSTALL, { "package": package["name"] }))
+                                       if len(self.cmdList):
+                                               self.session.openWithCallback(self.runUpgrade, MessageBox, _("Do you want to install the package:\n") + self.pluginname + "\n" + self.oktext)
+
+       def runUpgrade(self, result):
+               if result:
+                       self.session.openWithCallback(self.runUpgradeFinished, Ipkg, cmdList = self.cmdList)
+
+       def runUpgradeFinished(self):
+               self.session.openWithCallback(self.UpgradeReboot, MessageBox, _("Installation finished.") +" "+_("Do you want to reboot your Dreambox?"), MessageBox.TYPE_YESNO)
+
+       def UpgradeReboot(self, result):
+               if result is None:
+                       return
+               if result is False:
+                       self.close(True)
+               if result:
+                       quitMainloop(3)
+
+       def runRemove(self, result):
+               if result:
+                       self.session.openWithCallback(self.runRemoveFinished, Ipkg, cmdList = self.cmdList)
+
+       def runRemoveFinished(self):
+               self.session.openWithCallback(self.RemoveReboot, MessageBox, _("Remove finished.") +" "+_("Do you want to reboot your Dreambox?"), MessageBox.TYPE_YESNO)
+
+       def RemoveReboot(self, result):
+               if result is None:
+                       return
+               if result is False:
+                       self.close(True)
+               if result:
+                       quitMainloop(3)
+
+       def reloadPluginlist(self):
+               plugins.readPluginList(resolveFilename(SCOPE_PLUGINS))
+
+       def fetchFailed(self,string):
+               self.setThumbnail(noScreenshot = True)
+               print "[PluginDetails] fetch failed " + string.getErrorMessage()
+
+
+class UpdatePlugin(Screen):
+       skin = """
+               <screen name="UpdatePlugin" position="center,center" size="550,200" title="Software update" >
+                       <widget name="activityslider" position="0,0" size="550,5"  />
+                       <widget name="slider" position="0,150" size="550,30"  />
+                       <widget source="package" render="Label" position="10,30" size="540,20" font="Regular;18" halign="center" valign="center" backgroundColor="#25062748" transparent="1" />
+                       <widget source="status" render="Label" position="10,60" size="540,45" font="Regular;20" halign="center" valign="center" backgroundColor="#25062748" transparent="1" />
+               </screen>"""
+
+       def __init__(self, session, args = None):
+               Screen.__init__(self, session)
+
+               self.sliderPackages = { "dreambox-dvb-modules": 1, "enigma2": 2, "tuxbox-image-info": 3 }
+
+               self.slider = Slider(0, 4)
+               self["slider"] = self.slider
+               self.activityslider = Slider(0, 100)
+               self["activityslider"] = self.activityslider
+               self.status = StaticText(_("Upgrading Dreambox... Please wait"))
+               self["status"] = self.status
+               self.package = StaticText()
+               self["package"] = self.package
+
+               self.packages = 0
+               self.error = 0
+
+               self.activity = 0
+               self.activityTimer = eTimer()
+               self.activityTimer.callback.append(self.doActivityTimer)
+               self.activityTimer.start(100, False)
+
+               self.ipkg = IpkgComponent()
+               self.ipkg.addCallback(self.ipkgCallback)
+
+               self.updating = True
+               self.package.setText(_("Package list update"))
+               self.ipkg.startCmd(IpkgComponent.CMD_UPDATE)
+
+               self["actions"] = ActionMap(["WizardActions"], 
+               {
+                       "ok": self.exit,
+                       "back": self.exit
+               }, -1)
+
+       def doActivityTimer(self):
+               self.activity += 1
+               if self.activity == 100:
+                       self.activity = 0
+               self.activityslider.setValue(self.activity)
+
+       def ipkgCallback(self, event, param):
+               if event == IpkgComponent.EVENT_DOWNLOAD:
+                       self.status.setText(_("Downloading"))
+               elif event == IpkgComponent.EVENT_UPGRADE:
+                       if self.sliderPackages.has_key(param):
+                               self.slider.setValue(self.sliderPackages[param])
+                       self.package.setText(param)
+                       self.status.setText(_("Upgrading"))
+                       self.packages += 1
+               elif event == IpkgComponent.EVENT_INSTALL:
+                       self.package.setText(param)
+                       self.status.setText(_("Installing"))
+                       self.packages += 1
+               elif event == IpkgComponent.EVENT_CONFIGURING:
+                       self.package.setText(param)
+                       self.status.setText(_("Configuring"))
+               elif event == IpkgComponent.EVENT_MODIFIED:
+                       self.session.openWithCallback(
+                               self.modificationCallback,
+                               MessageBox,
+                               _("A configuration file (%s) was modified since Installation.\nDo you want to keep your version?") % (param)
+                       )
+               elif event == IpkgComponent.EVENT_ERROR:
+                       self.error += 1
+               elif event == IpkgComponent.EVENT_DONE:
+                       if self.updating:
+                               self.updating = False
+                               self.ipkg.startCmd(IpkgComponent.CMD_UPGRADE, args = {'test_only': False})
+                       elif self.error == 0:
+                               self.slider.setValue(4)
+                               
+                               self.activityTimer.stop()
+                               self.activityslider.setValue(0)
+                               
+                               self.package.setText("")
+                               self.status.setText(_("Done - Installed or upgraded %d packages") % self.packages)
+                       else:
+                               self.activityTimer.stop()
+                               self.activityslider.setValue(0)
+                               error = _("your dreambox might be unusable now. Please consult the manual for further assistance before rebooting your dreambox.")
+                               if self.packages == 0:
+                                       error = _("No packages were upgraded yet. So you can check your network and try again.")
+                               if self.updating:
+                                       error = _("Your dreambox isn't connected to the internet properly. Please check it and try again.")
+                               self.status.setText(_("Error") +  " - " + error)
+               #print event, "-", param
+               pass
 
-       def runExecute(self, result):
-               if result:
-                       self.session.openWithCallback(self.runExecuteFinished, Ipkg, cmdList = self.cmdList)
-               else:
-                       self.close()
+       def modificationCallback(self, res):
+               self.ipkg.write(res and "N" or "Y")
 
-       def runExecuteFinished(self):
-               self.session.openWithCallback(self.ExecuteReboot, MessageBox, _("Install or remove finished.") +" "+_("Do you want to reboot your Dreambox?"), MessageBox.TYPE_YESNO)
+       def exit(self):
+               if not self.ipkg.isRunning():
+                       if self.packages != 0 and self.error == 0:
+                               self.session.openWithCallback(self.exitAnswer, MessageBox, _("Upgrade finished.") +" "+_("Do you want to reboot your Dreambox?"))
+                       else:
+                               self.close()
 
-       def ExecuteReboot(self, result):
-               if result is None:
-                       return
-               if result is False:
-                       self.reloadPluginlist()
-                       self.detailsClosed(True)
-               if result:
-                       quitMainloop(3)
+       def exitAnswer(self, result):
+               if result is not None and result:
+                       quitMainloop(2)
+               self.close()
 
-       def reloadPluginlist(self):
-               plugins.readPluginList(resolveFilename(SCOPE_PLUGINS))
 
 
-class PluginManagerInfo(Screen):
+class IPKGMenu(Screen):
        skin = """
-               <screen name="PluginManagerInfo" position="center,center" size="560,440" title="Plugin manager activity information" >
+               <screen name="IPKGMenu" position="center,center" size="560,400" title="Select upgrade source to edit." >
                        <ePixmap pixmap="skin_default/buttons/red.png" position="0,0" size="140,40" alphatest="on" />
                        <ePixmap pixmap="skin_default/buttons/green.png" position="140,0" size="140,40" alphatest="on" />
                        <widget source="key_red" render="Label" position="0,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" />
                        <widget source="key_green" render="Label" position="140,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" transparent="1" />
-                       <widget source="list" render="Listbox" position="5,50" size="550,350" scrollbarMode="showOnDemand" selectionDisabled="1">
-                               <convert type="TemplatedMultiContent">
-                                       {"template": [
-                                                       MultiContentEntryText(pos = (50, 1), size = (150, 24), font=0, flags = RT_HALIGN_LEFT, text = 0), # index 0 is the name
-                                                       MultiContentEntryText(pos = (50, 25), size = (540, 24), font=1, flags = RT_HALIGN_LEFT, text = 1), # index 1 is the state
-                                                       MultiContentEntryPixmapAlphaTest(pos = (0, 1), size = (48, 48), png = 2), # index 2 is the status pixmap
-                                                       MultiContentEntryPixmapAlphaTest(pos = (0, 49), size = (550, 2), png = 3), # index 3 is the div pixmap
-                                               ],
-                                       "fonts": [gFont("Regular", 22),gFont("Regular", 18)],
-                                       "itemHeight": 52
-                                       }
-                               </convert>
-                       </widget>
-                       <ePixmap pixmap="skin_default/div-h.png" position="0,410" zPosition="10" size="560,2" transparent="1" alphatest="on" />
-                       <widget source="status" render="Label" position="5,420" zPosition="10" size="550,30" halign="center" valign="center" font="Regular;22" transparent="1" shadowColor="black" shadowOffset="-1,-1" />
+                       <widget name="filelist" position="5,50" size="550,340" scrollbarMode="showOnDemand" />
                </screen>"""
 
-       def __init__(self, session, plugin_path, cmdlist = None):
+       def __init__(self, session, plugin_path):
                Screen.__init__(self, session)
-               self.session = session
                self.skin_path = plugin_path
-               self.cmdlist = cmdlist
+               
+               self["key_red"] = StaticText(_("Close"))
+               self["key_green"] = StaticText(_("Edit"))
 
-               self["shortcuts"] = ActionMap(["ShortcutActions", "WizardActions"],
+               self.sel = []
+               self.val = []
+               self.entry = False
+               self.exe = False
+               
+               self.path = ""
+
+               self["actions"] = NumberActionMap(["SetupActions"],
                {
-                       "ok": self.process,
-                       "back": self.exit,
-                       "red": self.exit,
-                       "green": self.process,
+                       "ok": self.KeyOk,
+                       "cancel": self.keyCancel
                }, -1)
 
-               self.list = []
-               self["list"] = List(self.list)
-               self["key_red"] = StaticText(_("Cancel"))
-               self["key_green"] = StaticText(_("Continue"))
-               self["status"] = StaticText(_("Following tasks will be done after you press continue!"))
+               self["shortcuts"] = ActionMap(["ShortcutActions"],
+               {
+                       "red": self.keyCancel,
+                       "green": self.KeyOk,
+               })
+               self.flist = []
+               self["filelist"] = MenuList(self.flist)
+               self.fill_list()
+               self.onLayoutFinish.append(self.layoutFinished)
 
-               self.onShown.append(self.setWindowTitle)
-               self.onLayoutFinish.append(self.rebuildList)
+       def layoutFinished(self):
+               self.setWindowTitle()
 
        def setWindowTitle(self):
-               self.setTitle(_("Plugin manager activity information"))
+               self.setTitle(_("Select upgrade source to edit."))
 
-       def rebuildList(self):
-               self.list = []
-               if self.cmdlist is not None:
-                       for entry in self.cmdlist:
-                               action = ""
-                               info = ""
-                               cmd = entry[0]
-                               if cmd == 0:
-                                       action = 'install'
-                               elif cmd == 2:
-                                       action = 'remove'
-                               else:
-                                       action = 'upgrade'
-                               args = entry[1]
-                               if cmd == 0:
-                                       info = args['package']
-                               elif cmd == 2:
-                                       info = args['package']
-                               else:
-                                       info = _("Dreambox software because updates are available.")
+       def fill_list(self):
+               self.flist = []
+               self.path = '/etc/ipkg/'
+               if (os_path.exists(self.path) == False):
+                       self.entry = False
+                       return
+               for file in listdir(self.path):
+                       if (file.endswith(".conf")):
+                               if file != 'arch.conf':
+                                       self.flist.append((file))
+                                       self.entry = True
+                                       self["filelist"].l.setList(self.flist)
 
-                               self.list.append(self.buildEntryComponent(action,info))
-                       self['list'].setList(self.list)
-                       self['list'].updateList(self.list)
+       def KeyOk(self):
+               if (self.exe == False) and (self.entry == True):
+                       self.sel = self["filelist"].getCurrent()
+                       self.val = self.path + self.sel
+                       self.session.open(IPKGSource, self.val)
 
-       def buildEntryComponent(self, action,info):
-               divpng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/div-h.png"))
-               upgradepng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_PLUGIN, "SystemPlugins/SoftwareManager/upgrade.png"))
-               installpng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_PLUGIN, "SystemPlugins/SoftwareManager/install.png"))
-               removepng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_PLUGIN, "SystemPlugins/SoftwareManager/remove.png"))
-               if action == 'install':
-                       return(( _('Installing'), info, installpng, divpng))
-               elif action == 'remove':
-                       return(( _('Removing'), info, removepng, divpng))
+       def keyCancel(self):
+               self.close()
+
+       def Exit(self):
+               self.close()
+
+
+class IPKGSource(Screen):
+       skin = """
+               <screen name="IPKGSource" position="center,center" size="560,80" title="Edit upgrade source url." >
+                       <ePixmap pixmap="skin_default/buttons/red.png" position="0,0" size="140,40" alphatest="on" />
+                       <ePixmap pixmap="skin_default/buttons/green.png" position="140,0" size="140,40" alphatest="on" />
+                       <widget source="key_red" render="Label" position="0,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" />
+                       <widget source="key_green" render="Label" position="140,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" transparent="1" />
+                       <widget name="text" position="5,50" size="550,25" font="Regular;20" backgroundColor="background" foregroundColor="#cccccc" />
+               </screen>"""
+
+       def __init__(self, session, configfile = None):
+               Screen.__init__(self, session)
+               self.session = session
+               self.configfile = configfile
+               text = ""
+               if self.configfile:
+                       try:
+                               fp = file(configfile, 'r')
+                               sources = fp.readlines()
+                               if sources:
+                                       text = sources[0]
+                               fp.close()
+                       except IOError:
+                               pass
+
+               desk = getDesktop(0)
+               x= int(desk.size().width())
+               y= int(desk.size().height())
+
+               self["key_red"] = StaticText(_("Cancel"))
+               self["key_green"] = StaticText(_("Save"))
+
+               if (y>=720):
+                       self["text"] = Input(text, maxSize=False, type=Input.TEXT)
                else:
-                       return(( _('Upgrading'), info, upgradepng, divpng))
+                       self["text"] = Input(text, maxSize=False, visible_width = 55, type=Input.TEXT)
 
-       def exit(self):
-               self.close(False)
+               self["actions"] = NumberActionMap(["WizardActions", "InputActions", "TextEntryActions", "KeyboardInputActions","ShortcutActions"], 
+               {
+                       "ok": self.go,
+                       "back": self.close,
+                       "red": self.close,
+                       "green": self.go,
+                       "left": self.keyLeft,
+                       "right": self.keyRight,
+                       "home": self.keyHome,
+                       "end": self.keyEnd,
+                       "deleteForward": self.keyDeleteForward,
+                       "deleteBackward": self.keyDeleteBackward,
+                       "1": self.keyNumberGlobal,
+                       "2": self.keyNumberGlobal,
+                       "3": self.keyNumberGlobal,
+                       "4": self.keyNumberGlobal,
+                       "5": self.keyNumberGlobal,
+                       "6": self.keyNumberGlobal,
+                       "7": self.keyNumberGlobal,
+                       "8": self.keyNumberGlobal,
+                       "9": self.keyNumberGlobal,
+                       "0": self.keyNumberGlobal
+               }, -1)
 
-       def process(self):
-               self.close(True)
+               self.onLayoutFinish.append(self.layoutFinished)
+
+       def layoutFinished(self):
+               self.setWindowTitle()
+               self["text"].right()
 
+       def setWindowTitle(self):
+               self.setTitle(_("Edit upgrade source url."))
 
-class PluginManagerHelp(Screen):
+       def go(self):
+               text = self["text"].getText()
+               if text:
+                       fp = file(self.configfile, 'w')
+                       fp.write(text)
+                       fp.write("\n")
+                       fp.close()
+               self.close()
+
+       def keyLeft(self):
+               self["text"].left()
+       
+       def keyRight(self):
+               self["text"].right()
+       
+       def keyHome(self):
+               self["text"].home()
+       
+       def keyEnd(self):
+               self["text"].end()
+       
+       def keyDeleteForward(self):
+               self["text"].delete()
+       
+       def keyDeleteBackward(self):
+               self["text"].deleteBackward()
+       
+       def keyNumberGlobal(self, number):
+               self["text"].number(number)
+
+
+class PacketManager(Screen):
        skin = """
-               <screen name="PluginManagerHelp" position="center,center" size="560,440" title="Plugin manager help" >
+               <screen name="PacketManager" position="center,center" size="530,420" title="Packet manager" >
                        <ePixmap pixmap="skin_default/buttons/red.png" position="0,0" size="140,40" alphatest="on" />
+                       <ePixmap pixmap="skin_default/buttons/green.png" position="140,0" size="140,40" alphatest="on" />
                        <widget source="key_red" render="Label" position="0,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" />
-                       <widget source="list" render="Listbox" position="5,50" size="550,350" scrollbarMode="showOnDemand" selectionDisabled="1">
+                       <widget source="key_green" render="Label" position="140,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" transparent="1" />
+                       <widget source="list" render="Listbox" position="5,50" size="520,365" scrollbarMode="showOnDemand">
                                <convert type="TemplatedMultiContent">
                                        {"template": [
-                                                       MultiContentEntryText(pos = (50, 1), size = (540, 24), font=0, flags = RT_HALIGN_LEFT, text = 0), # index 0 is the name
-                                                       MultiContentEntryText(pos = (50, 25), size = (540, 24), font=1, flags = RT_HALIGN_LEFT, text = 1), # index 1 is the state
-                                                       MultiContentEntryPixmapAlphaTest(pos = (0, 1), size = (48, 48), png = 2), # index 2 is the status pixmap
-                                                       MultiContentEntryPixmapAlphaTest(pos = (0, 49), size = (550, 2), png = 3), # index 3 is the div pixmap
+                                                       MultiContentEntryText(pos = (5, 1), size = (440, 28), font=0, flags = RT_HALIGN_LEFT, text = 0), # index 0 is the name
+                                                       MultiContentEntryText(pos = (5, 26), size = (440, 20), font=1, flags = RT_HALIGN_LEFT, text = 2), # index 2 is the description
+                                                       MultiContentEntryPixmapAlphaTest(pos = (445, 2), size = (48, 48), png = 4), # index 4 is the status pixmap
+                                                       MultiContentEntryPixmapAlphaTest(pos = (5, 50), size = (510, 2), png = 5), # index 4 is the div pixmap
                                                ],
-                                       "fonts": [gFont("Regular", 22),gFont("Regular", 18)],
+                                       "fonts": [gFont("Regular", 22),gFont("Regular", 14)],
                                        "itemHeight": 52
                                        }
                                </convert>
                        </widget>
-                       <ePixmap pixmap="skin_default/div-h.png" position="0,410" zPosition="10" size="550,2" transparent="1" alphatest="on" />
-                       <widget source="status" render="Label" position="5,420" zPosition="10" size="550,30" halign="center" valign="center" font="Regular;22" transparent="1" shadowColor="black" shadowOffset="-1,-1" />
                </screen>"""
-
-       def __init__(self, session, plugin_path):
+               
+       def __init__(self, session, plugin_path, args = None):
                Screen.__init__(self, session)
                self.session = session
                self.skin_path = plugin_path
 
-               self["shortcuts"] = ActionMap(["ShortcutActions", "WizardActions"],
+               self["shortcuts"] = ActionMap(["ShortcutActions", "WizardActions"], 
                {
+                       "ok": self.go,
                        "back": self.exit,
                        "red": self.exit,
+                       "green": self.reload,
                }, -1)
-
+               
                self.list = []
+               self.statuslist = []
                self["list"] = List(self.list)
                self["key_red"] = StaticText(_("Close"))
-               self["status"] = StaticText(_("A small overview of the available icon states and actions."))
+               self["key_green"] = StaticText(_("Reload"))
+
+               self.list_updating = True
+               self.packetlist = []
+               self.installed_packetlist = {}
+               self.Console = Console()
+               self.cmdList = []
+               self.cachelist = []
+               self.cache_ttl = 86400  #600 is default, 0 disables, Seconds cache is considered valid (24h should be ok for caching ipkgs)
+               self.cache_file = '/usr/lib/enigma2/python/Plugins/SystemPlugins/SoftwareManager/packetmanager.cache' #Path to cache directory   
+               self.oktext = _("\nAfter pressing OK, please wait!")
+               self.unwanted_extensions = ('-dbg', '-dev', '-doc', 'busybox')
 
+               self.ipkg = IpkgComponent()
+               self.ipkg.addCallback(self.ipkgCallback)
                self.onShown.append(self.setWindowTitle)
                self.onLayoutFinish.append(self.rebuildList)
 
-       def setWindowTitle(self):
-               self.setTitle(_("Plugin manager help"))
-
-       def rebuildList(self):
-               self.list = []
-               self.list.append(self.buildEntryComponent('install'))
-               self.list.append(self.buildEntryComponent('installable'))
-               self.list.append(self.buildEntryComponent('installed'))
-               self.list.append(self.buildEntryComponent('remove'))
-               self['list'].setList(self.list)
-               self['list'].updateList(self.list)
-
-       def buildEntryComponent(self, state):
-               divpng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/div-h.png"))
-               installedpng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_PLUGIN, "SystemPlugins/SoftwareManager/installed.png"))
-               installablepng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_PLUGIN, "SystemPlugins/SoftwareManager/installable.png"))
-               removepng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_PLUGIN, "SystemPlugins/SoftwareManager/remove.png"))
-               installpng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_PLUGIN, "SystemPlugins/SoftwareManager/install.png"))
-
-               if state == 'installed':
-                       return(( _('This plugin is installed.'), _('You can remove this plugin.'), installedpng, divpng))
-               elif state == 'installable':
-                       return(( _('This plugin is not installed.'), _('You can install this plugin.'), installablepng, divpng))
-               elif state == 'install':
-                       return(( _('This plugin will be installed.'), _('You can cancel the installation.'), installpng, divpng))
-               elif state == 'remove':
-                       return(( _('This plugin will be removed.'), _('You can cancel the removal.'), removepng, divpng))
-
        def exit(self):
+               self.ipkg.stop()
+               if self.Console is not None:
+                       if len(self.Console.appContainers):
+                               for name in self.Console.appContainers.keys():
+                                       self.Console.kill(name)
                self.close()
 
-
-class PluginDetails(Screen, DreamInfoHandler):
-       skin = """
-               <screen name="PluginDetails" position="center,center" size="600,440" title="Plugin details" >
-                       <ePixmap pixmap="skin_default/buttons/red.png" position="0,0" size="140,40" alphatest="on" />
-                       <ePixmap pixmap="skin_default/buttons/green.png" position="140,0" size="140,40" alphatest="on" />
-                       <widget source="key_red" render="Label" position="0,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" />
-                       <widget source="key_green" render="Label" position="140,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" transparent="1" />
-                       <widget source="author" render="Label" position="10,50" size="500,25" zPosition="10" font="Regular;21" transparent="1" />
-                       <widget name="statuspic" position="550,40" size="48,48" alphatest="on"/>
-                       <widget name="divpic" position="0,80" size="600,2" alphatest="on"/>
-                       <widget name="detailtext" position="10,90" size="270,330" zPosition="10" font="Regular;21" transparent="1" halign="left" valign="top"/>
-                       <widget name="screenshot" position="290,90" size="300,330" alphatest="on"/>
-               </screen>"""
-       def __init__(self, session, plugin_path, packagedata = None):
-               Screen.__init__(self, session)
-               self.skin_path = plugin_path
-               self.language = language.getLanguage()[:2] # getLanguage returns e.g. "fi_FI" for "language_country"
-               self.attributes = None
-               self.translatedAttributes = None
-               DreamInfoHandler.__init__(self, self.statusCallback, blocking = False, language = self.language)
-               self.directory = resolveFilename(SCOPE_METADIR)
-               if packagedata:
-                       self.pluginname = packagedata[0]
-                       self.details = packagedata[1]
-                       self.pluginstate = packagedata[4]
-                       self.statuspicinstance = packagedata[5]
-                       self.divpicinstance = packagedata[6]
-                       self.fillPackageDetails(self.details)
-
-               self.thumbnail = ""
-
-               self["shortcuts"] = ActionMap(["ShortcutActions", "WizardActions"],
-               {
-                       "back": self.exit,
-                       "red": self.exit,
-                       "green": self.go,
-                       "up": self.pageUp,
-                       "down": self.pageDown,
-                       "left": self.pageUp,
-                       "right": self.pageDown,
-               }, -1)
-
-               self["key_red"] = StaticText(_("Close"))
-               self["key_green"] = StaticText("")
-               self["author"] = StaticText()
-               self["statuspic"] = Pixmap()
-               self["divpic"] = Pixmap()
-               self["screenshot"] = Pixmap()
-               self["detailtext"] = ScrollLabel()
-
-               self["statuspic"].hide()
-               self["screenshot"].hide()
-               self["divpic"].hide()
-
-               self.package = self.packageDetails[0]
-               if self.package[0].has_key("attributes"):
-                       self.attributes = self.package[0]["attributes"]
-               if self.package[0].has_key("translation"):
-                       self.translatedAttributes = self.package[0]["translation"]
-
-               self.cmdList = []
-               self.oktext = _("\nAfter pressing OK, please wait!")
-               self.picload = ePicLoad()
-               self.picload.PictureData.get().append(self.paintScreenshotPixmapCB)
-               self.onShown.append(self.setWindowTitle)
-               self.onLayoutFinish.append(self.setInfos)
-
+       def reload(self):
+               if (os_path.exists(self.cache_file) == True):
+                       remove(self.cache_file)
+                       self.list_updating = True
+                       self.rebuildList()
+                       
        def setWindowTitle(self):
-               self.setTitle(_("Package details for: " + self.pluginname))
-
-       def exit(self):
-               self.close(False)
-
-       def pageUp(self):
-               self["detailtext"].pageUp()
-
-       def pageDown(self):
-               self["detailtext"].pageDown()
-
-       def statusCallback(self, status, progress):
-               pass
-
-       def setInfos(self):
-               if self.translatedAttributes.has_key("name"):
-                       self.pluginname = self.translatedAttributes["name"]
-               elif self.attributes.has_key("name"):
-                       self.pluginname = self.attributes["name"]
-               else:
-                       self.pluginname = _("unknown")
-
-               if self.translatedAttributes.has_key("author"):
-                       self.author = self.translatedAttributes["author"]
-               elif self.attributes.has_key("author"):
-                       self.author = self.attributes["author"]
-               else:
-                       self.author = _("unknown")
-
-               if self.translatedAttributes.has_key("description"):
-                       self.description = self.translatedAttributes["description"]
-               elif self.attributes.has_key("description"):
-                       self.description = self.attributes["description"]
-               else:
-                       self.description = _("No description available.")
-
-               if self.translatedAttributes.has_key("screenshot"):
-                       self.loadThumbnail(self.translatedAttributes)
-               else:
-                       self.loadThumbnail(self.attributes)
-
-               self["author"].setText(_("Author: ") + self.author)
-               self["detailtext"].setText(self.description.strip())
-               if self.pluginstate == 'installable':
-                       self["key_green"].setText(_("Install"))
-               else:
-                       self["key_green"].setText(_("Remove"))
-
-       def loadThumbnail(self, entry):
-               thumbnailUrl = None
-               if entry.has_key("screenshot"):
-                       thumbnailUrl = entry["screenshot"]
-               if thumbnailUrl is not None:
-                       self.thumbnail = "/tmp/" + thumbnailUrl.split('/')[-1]
-                       print "[PluginDetails] downloading screenshot " + thumbnailUrl + " to " + self.thumbnail
-                       client.downloadPage(thumbnailUrl,self.thumbnail).addCallback(self.setThumbnail).addErrback(self.fetchFailed)
-               else:
-                       self.setThumbnail(noScreenshot = True)
-
-       def setThumbnail(self, noScreenshot = False):
-               if not noScreenshot:
-                       filename = self.thumbnail
-               else:
-                       filename = resolveFilename(SCOPE_CURRENT_PLUGIN, "SystemPlugins/SoftwareManager/noprev.png")
-
-               sc = AVSwitch().getFramebufferScale()
-               self.picload.setPara((self["screenshot"].instance.size().width(), self["screenshot"].instance.size().height(), sc[0], sc[1], False, 1, "#00000000"))
-               self.picload.startDecode(filename)
-
-               if self.statuspicinstance != None:
-                       self["statuspic"].instance.setPixmap(self.statuspicinstance.__deref__())
-                       self["statuspic"].show()
-               if self.divpicinstance != None:
-                       self["divpic"].instance.setPixmap(self.divpicinstance.__deref__())
-                       self["divpic"].show()
-
-       def paintScreenshotPixmapCB(self, picInfo=None):
-               ptr = self.picload.getData()
-               if ptr != None:
-                       self["screenshot"].instance.setPixmap(ptr.__deref__())
-                       self["screenshot"].show()
-               else:
-                       self.setThumbnail(noScreenshot = True)
-
-       def go(self):
-               if self.attributes.has_key("package"):
-                       self.packagefiles = self.attributes["package"]
-               self.cmdList = []
-               if self.pluginstate == 'installed':
-                       if self.packagefiles:
-                               for package in self.packagefiles[:]:
-                                       self.cmdList.append((IpkgComponent.CMD_REMOVE, { "package": package["name"] }))
-                                       if len(self.cmdList):
-                                               self.session.openWithCallback(self.runRemove, MessageBox, _("Do you want to remove the package:\n") + self.pluginname + "\n" + self.oktext)
-               else:
-                       if self.packagefiles:
-                               for package in self.packagefiles[:]:
-                                       self.cmdList.append((IpkgComponent.CMD_INSTALL, { "package": package["name"] }))
-                                       if len(self.cmdList):
-                                               self.session.openWithCallback(self.runUpgrade, MessageBox, _("Do you want to install the package:\n") + self.pluginname + "\n" + self.oktext)
+               self.setTitle(_("Packet manager"))
 
-       def runUpgrade(self, result):
-               if result:
-                       self.session.openWithCallback(self.runUpgradeFinished, Ipkg, cmdList = self.cmdList)
+       def setStatus(self,status = None):
+               if status:
+                       self.statuslist = []
+                       divpng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/div-h.png"))
+                       if status == 'update':
+                               statuspng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_PLUGIN, "SystemPlugins/SoftwareManager/upgrade.png"))
+                               self.statuslist.append(( _("Package list update"), '', _("Trying to download a new packetlist. Please wait..." ),'',statuspng, divpng ))
+                               self['list'].setList(self.statuslist)   
+                       elif status == 'error':
+                               statuspng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_PLUGIN, "SystemPlugins/SoftwareManager/remove.png"))
+                               self.statuslist.append(( _("Error"), '', _("There was an error downloading the packetlist. Please try again." ),'',statuspng, divpng ))
+                               self['list'].setList(self.statuslist)                           
 
-       def runUpgradeFinished(self):
-               self.session.openWithCallback(self.UpgradeReboot, MessageBox, _("Installation finished.") +" "+_("Do you want to reboot your Dreambox?"), MessageBox.TYPE_YESNO)
+       def rebuildList(self):
+               self.setStatus('update')
+               self.inv_cache = 0
+               self.vc = valid_cache(self.cache_file, self.cache_ttl)
+               if self.cache_ttl > 0 and self.vc != 0:
+                       try:
+                               self.buildPacketList()
+                       except:
+                               self.inv_cache = 1
+               if self.cache_ttl == 0 or self.inv_cache == 1 or self.vc == 0:
+                       self.run = 0
+                       self.ipkg.startCmd(IpkgComponent.CMD_UPDATE)
 
-       def UpgradeReboot(self, result):
-               if result is None:
-                       return
-               if result is False:
-                       self.close(True)
-               if result:
-                       quitMainloop(3)
+       def go(self, returnValue = None):
+               cur = self["list"].getCurrent()
+               if cur:
+                       status = cur[3]
+                       package = cur[0]
+                       self.cmdList = []
+                       if status == 'installed':
+                               self.cmdList.append((IpkgComponent.CMD_REMOVE, { "package": package }))
+                               if len(self.cmdList):
+                                       self.session.openWithCallback(self.runRemove, MessageBox, _("Do you want to remove the package:\n") + package + "\n" + self.oktext)
+                       elif status == 'upgradeable':
+                               self.cmdList.append((IpkgComponent.CMD_INSTALL, { "package": package }))
+                               if len(self.cmdList):
+                                       self.session.openWithCallback(self.runUpgrade, MessageBox, _("Do you want to upgrade the package:\n") + package + "\n" + self.oktext)
+                       elif status == "installable":
+                               self.cmdList.append((IpkgComponent.CMD_INSTALL, { "package": package }))
+                               if len(self.cmdList):
+                                       self.session.openWithCallback(self.runUpgrade, MessageBox, _("Do you want to install the package:\n") + package + "\n" + self.oktext)
 
        def runRemove(self, result):
                if result:
@@ -1528,131 +1510,122 @@ class PluginDetails(Screen, DreamInfoHandler):
                if result is None:
                        return
                if result is False:
-                       self.close(True)
+                       cur = self["list"].getCurrent()
+                       if cur:
+                               item = self['list'].getIndex()
+                               self.list[item] = self.buildEntryComponent(cur[0], cur[1], cur[2], 'installable')
+                               self.cachelist[item] = [cur[0], cur[1], cur[2], 'installable']
+                               self['list'].setList(self.list)
+                               write_cache(self.cache_file, self.cachelist)
+                               self.reloadPluginlist()
                if result:
                        quitMainloop(3)
 
-       def reloadPluginlist(self):
-               plugins.readPluginList(resolveFilename(SCOPE_PLUGINS))
-
-       def fetchFailed(self,string):
-               self.setThumbnail(noScreenshot = True)
-               print "[PluginDetails] fetch failed " + string.getErrorMessage()
-
-
-class UpdatePlugin(Screen):
-       skin = """
-               <screen name="UpdatePlugin" position="center,center" size="550,200" title="Software update" >
-                       <widget name="activityslider" position="0,0" size="550,5"  />
-                       <widget name="slider" position="0,150" size="550,30"  />
-                       <widget source="package" render="Label" position="10,30" size="540,20" font="Regular;18" halign="center" valign="center" backgroundColor="#25062748" transparent="1" />
-                       <widget source="status" render="Label" position="10,60" size="540,45" font="Regular;20" halign="center" valign="center" backgroundColor="#25062748" transparent="1" />
-               </screen>"""
-
-       def __init__(self, session, args = None):
-               Screen.__init__(self, session)
-
-               self.sliderPackages = { "dreambox-dvb-modules": 1, "enigma2": 2, "tuxbox-image-info": 3 }
-
-               self.slider = Slider(0, 4)
-               self["slider"] = self.slider
-               self.activityslider = Slider(0, 100)
-               self["activityslider"] = self.activityslider
-               self.status = StaticText(_("Upgrading Dreambox... Please wait"))
-               self["status"] = self.status
-               self.package = StaticText()
-               self["package"] = self.package
-
-               self.packages = 0
-               self.error = 0
-
-               self.activity = 0
-               self.activityTimer = eTimer()
-               self.activityTimer.callback.append(self.doActivityTimer)
-               self.activityTimer.start(100, False)
-
-               self.ipkg = IpkgComponent()
-               self.ipkg.addCallback(self.ipkgCallback)
-
-               self.updating = True
-               self.package.setText(_("Package list update"))
-               self.ipkg.startCmd(IpkgComponent.CMD_UPDATE)
-
-               self["actions"] = ActionMap(["WizardActions"], 
-               {
-                       "ok": self.exit,
-                       "back": self.exit
-               }, -1)
+       def runUpgrade(self, result):
+               if result:
+                       self.session.openWithCallback(self.runUpgradeFinished, Ipkg, cmdList = self.cmdList)
 
-       def doActivityTimer(self):
-               self.activity += 1
-               if self.activity == 100:
-                       self.activity = 0
-               self.activityslider.setValue(self.activity)
+       def runUpgradeFinished(self):
+               self.session.openWithCallback(self.UpgradeReboot, MessageBox, _("Upgrade finished.") +" "+_("Do you want to reboot your Dreambox?"), MessageBox.TYPE_YESNO)
+               
+       def UpgradeReboot(self, result):
+               if result is None:
+                       return
+               if result is False:
+                       cur = self["list"].getCurrent()
+                       if cur:
+                               item = self['list'].getIndex()
+                               self.list[item] = self.buildEntryComponent(cur[0], cur[1], cur[2], 'installed')
+                               self.cachelist[item] = [cur[0], cur[1], cur[2], 'installed']
+                               self['list'].setList(self.list)
+                               write_cache(self.cache_file, self.cachelist)
+                               self.reloadPluginlist()
+               if result:
+                       quitMainloop(3)
 
        def ipkgCallback(self, event, param):
-               if event == IpkgComponent.EVENT_DOWNLOAD:
-                       self.status.setText(_("Downloading"))
-               elif event == IpkgComponent.EVENT_UPGRADE:
-                       if self.sliderPackages.has_key(param):
-                               self.slider.setValue(self.sliderPackages[param])
-                       self.package.setText(param)
-                       self.status.setText(_("Upgrading"))
-                       self.packages += 1
-               elif event == IpkgComponent.EVENT_INSTALL:
-                       self.package.setText(param)
-                       self.status.setText(_("Installing"))
-                       self.packages += 1
-               elif event == IpkgComponent.EVENT_CONFIGURING:
-                       self.package.setText(param)
-                       self.status.setText(_("Configuring"))
-               elif event == IpkgComponent.EVENT_MODIFIED:
-                       self.session.openWithCallback(
-                               self.modificationCallback,
-                               MessageBox,
-                               _("A configuration file (%s) was modified since Installation.\nDo you want to keep your version?") % (param)
-                       )
-               elif event == IpkgComponent.EVENT_ERROR:
-                       self.error += 1
+               if event == IpkgComponent.EVENT_ERROR:
+                       self.list_updating = False
+                       self.setStatus('error')
                elif event == IpkgComponent.EVENT_DONE:
-                       if self.updating:
-                               self.updating = False
-                               self.ipkg.startCmd(IpkgComponent.CMD_UPGRADE, args = {'test_only': False})
-                       elif self.error == 0:
-                               self.slider.setValue(4)
-                               
-                               self.activityTimer.stop()
-                               self.activityslider.setValue(0)
-                               
-                               self.package.setText("")
-                               self.status.setText(_("Done - Installed or upgraded %d packages") % self.packages)
-                       else:
-                               self.activityTimer.stop()
-                               self.activityslider.setValue(0)
-                               error = _("your dreambox might be unusable now. Please consult the manual for further assistance before rebooting your dreambox.")
-                               if self.packages == 0:
-                                       error = _("No packages were upgraded yet. So you can check your network and try again.")
-                               if self.updating:
-                                       error = _("Your dreambox isn't connected to the internet properly. Please check it and try again.")
-                               self.status.setText(_("Error") +  " - " + error)
+                       if self.list_updating:
+                               self.list_updating = False
+                               if not self.Console:
+                                       self.Console = Console()
+                               cmd = "ipkg list"
+                               self.Console.ePopen(cmd, self.IpkgList_Finished)
                #print event, "-", param
                pass
 
-       def modificationCallback(self, res):
-               self.ipkg.write(res and "N" or "Y")
+       def IpkgList_Finished(self, result, retval, extra_args = None):
+               if len(result):
+                       self.packetlist = []
+                       for x in result.splitlines():
+                               split = x.split(' - ')   #self.blacklisted_packages
+                               if not any(split[0].strip().endswith(x) for x in self.unwanted_extensions):
+                                       self.packetlist.append([split[0].strip(), split[1].strip(),split[2].strip()])
+               if not self.Console:
+                       self.Console = Console()
+               cmd = "ipkg list_installed"
+               self.Console.ePopen(cmd, self.IpkgListInstalled_Finished)
 
-       def exit(self):
-               if not self.ipkg.isRunning():
-                       if self.packages != 0 and self.error == 0:
-                               self.session.openWithCallback(self.exitAnswer, MessageBox, _("Upgrade finished.") +" "+_("Do you want to reboot your Dreambox?"))
-                       else:
-                               self.close()
+       def IpkgListInstalled_Finished(self, result, retval, extra_args = None):
+               if len(result):
+                       self.installed_packetlist = {}
+                       for x in result.splitlines():
+                               split = x.split(' - ')
+                               if not any(split[0].strip().endswith(x) for x in self.unwanted_extensions):
+                                       self.installed_packetlist[split[0].strip()] = split[1].strip()
+               self.buildPacketList()
 
-       def exitAnswer(self, result):
-               if result is not None and result:
-                       quitMainloop(2)
-               self.close()
+       def buildEntryComponent(self, name, version, description, state):
+               divpng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/div-h.png"))
+               if state == 'installed':
+                       installedpng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_PLUGIN, "SystemPlugins/SoftwareManager/installed.png"))
+                       return((name, version, description, state, installedpng, divpng))       
+               elif state == 'upgradeable':
+                       upgradeablepng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_PLUGIN, "SystemPlugins/SoftwareManager/upgradeable.png"))
+                       return((name, version, description, state, upgradeablepng, divpng))     
+               else:
+                       installablepng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_PLUGIN, "SystemPlugins/SoftwareManager/installable.png"))
+                       return((name, version, description, state, installablepng, divpng))
+
+       def buildPacketList(self):
+               self.list = []
+               self.cachelist = []
+
+               if self.cache_ttl > 0 and self.vc != 0:
+                       print 'Loading packagelist cache from ',self.cache_file
+                       try:
+                               self.cachelist = load_cache(self.cache_file)
+                               if len(self.cachelist) > 0:
+                                       for x in self.cachelist:
+                                               self.list.append(self.buildEntryComponent(x[0], x[1], x[2], x[3]))
+                                       self['list'].setList(self.list)
+                       except:
+                               self.inv_cache = 1
+
+               if self.cache_ttl == 0 or self.inv_cache == 1 or self.vc == 0:
+                       print 'rebuilding fresh package list'
+                       for x in self.packetlist:
+                               status = ""
+                               if self.installed_packetlist.has_key(x[0].strip()):
+                                       if self.installed_packetlist[x[0].strip()] == x[1].strip():
+                                               status = "installed"
+                                               self.list.append(self.buildEntryComponent(x[0].strip(), x[1].strip(), x[2].strip(), status))
+                                       else:
+                                               status = "upgradeable"
+                                               self.list.append(self.buildEntryComponent(x[0].strip(), x[1].strip(), x[2].strip(), status))
+                               else:
+                                       status = "installable"
+                                       self.list.append(self.buildEntryComponent(x[0].strip(), x[1].strip(), x[2].strip(), status))
+                               if not any(x[0].strip().endswith(x) for x in self.unwanted_extensions):
+                                       self.cachelist.append([x[0].strip(), x[1].strip(), x[2].strip(), status])
+                       write_cache(self.cache_file, self.cachelist)
+                       self['list'].setList(self.list)
 
+       def reloadPluginlist(self):
+               plugins.readPluginList(resolveFilename(SCOPE_PLUGINS))
 
 class IpkgInstaller(Screen):
        skin = """
@@ -1719,15 +1692,20 @@ def UpgradeMain(session, **kwargs):
 def startSetup(menuid):
        if menuid != "setup": 
                return [ ]
-       return [(_("Software manager"), UpgradeMain, "software_manager", 50)]
+       return [(_("Software management"), UpgradeMain, "software_manager", 50)]
+
+def autostart(reason, **kwargs):
+       if reason is True:
+               iSoftwareTools.startSoftwareTools()
 
 def Plugins(path, **kwargs):
        global plugin_path
        plugin_path = path
        list = [
-               PluginDescriptor(name=_("Software manager"), description=_("Manage your receiver's software"), where = PluginDescriptor.WHERE_MENU, fnc=startSetup), 
+               PluginDescriptor(where = [PluginDescriptor.WHERE_NETWORKCONFIG_READ], fnc = autostart),
+               PluginDescriptor(name=_("Software management"), description=_("Manage your receiver's software"), where = PluginDescriptor.WHERE_MENU, fnc=startSetup), 
                PluginDescriptor(name=_("Ipkg"), where = PluginDescriptor.WHERE_FILESCAN, fnc = filescan)
        ]
        if config.usage.setup_level.index >= 2: # expert+
-               list.append(PluginDescriptor(name=_("Software manager"), description=_("Manage your receiver's software"), where = PluginDescriptor.WHERE_EXTENSIONSMENU, fnc=UpgradeMain))
+               list.append(PluginDescriptor(name=_("Software management"), description=_("Manage your receiver's software"), where = PluginDescriptor.WHERE_EXTENSIONSMENU, fnc=UpgradeMain))
        return list
diff --git a/lib/python/Plugins/SystemPlugins/TempFanControl/Makefile.am b/lib/python/Plugins/SystemPlugins/TempFanControl/Makefile.am
new file mode 100644 (file)
index 0000000..78ff11c
--- /dev/null
@@ -0,0 +1,5 @@
+installdir = $(LIBDIR)/enigma2/python/Plugins/SystemPlugins/TempFanControl
+
+install_PYTHON = \
+       __init__.py \
+       plugin.py
diff --git a/lib/python/Plugins/SystemPlugins/TempFanControl/__init__.py b/lib/python/Plugins/SystemPlugins/TempFanControl/__init__.py
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/lib/python/Plugins/SystemPlugins/TempFanControl/plugin.py b/lib/python/Plugins/SystemPlugins/TempFanControl/plugin.py
new file mode 100644 (file)
index 0000000..38e343f
--- /dev/null
@@ -0,0 +1,163 @@
+from Components.ActionMap import ActionMap
+from Components.Sensors import sensors
+from Components.Sources.Sensor import SensorSource
+from Components.Sources.StaticText import StaticText
+from Components.ConfigList import ConfigListScreen
+from Components.config import getConfigListEntry
+
+from Screens.Screen import Screen
+
+from Plugins.Plugin import PluginDescriptor
+from Components.FanControl import fancontrol
+
+class TempFanControl(Screen, ConfigListScreen):
+       skin = """
+               <screen position="90,100" size="570,420" title="Fan Control" >
+                       <ePixmap pixmap="skin_default/buttons/red.png" position="0,0" size="140,40" alphatest="on" />
+                       <ePixmap pixmap="skin_default/buttons/green.png" position="140,0" size="140,40" alphatest="on" />
+                       <ePixmap pixmap="skin_default/buttons/yellow.png" position="280,0" size="140,40" alphatest="on" />
+                       <ePixmap pixmap="skin_default/buttons/blue.png" position="420,0" size="140,40" alphatest="on" />
+                       <widget source="red" render="Label" position="0,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" />
+                       <widget source="green" render="Label" position="140,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" transparent="1" />
+                       <widget source="yellow" render="Label" position="280,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#a08500" transparent="1" />
+                       <widget source="blue" render="Label" position="420,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#18188b" transparent="1" />
+                       
+                       <widget name="config" position="10,50" size="550,90" scrollbarMode="showOnDemand" />
+                       
+                       <widget source="SensorTempText0" render="Label" position="10,150" zPosition="1" size="90,40" font="Regular;20" halign="left" valign="top" backgroundColor="#9f1313" transparent="1" />
+                       <widget source="SensorTemp0" render="Label" position="100,150" zPosition="1" size="100,20" font="Regular;19" halign="right">
+                               <convert type="SensorToText"></convert>
+                       </widget>
+                       <widget source="SensorTempText1" render="Label" position="10,170" zPosition="1" size="90,40" font="Regular;20" halign="left" valign="top" backgroundColor="#9f1313" transparent="1" />
+                       <widget source="SensorTemp1" render="Label" position="100,170" zPosition="1" size="100,20" font="Regular;19" halign="right">
+                               <convert type="SensorToText"></convert>
+                       </widget>
+                       <widget source="SensorTempText2" render="Label" position="10,190" zPosition="1" size="90,40" font="Regular;20" halign="left" valign="top" backgroundColor="#9f1313" transparent="1" />
+                       <widget source="SensorTemp2" render="Label" position="100,190" zPosition="1" size="100,20" font="Regular;19" halign="right">
+                               <convert type="SensorToText"></convert>
+                       </widget>
+                       <widget source="SensorTempText3" render="Label" position="10,210" zPosition="1" size="90,40" font="Regular;20" halign="left" valign="top" backgroundColor="#9f1313" transparent="1" />
+                       <widget source="SensorTemp3" render="Label" position="100,210" zPosition="1" size="100,20" font="Regular;19" halign="right">
+                               <convert type="SensorToText"></convert>
+                       </widget>
+                       <widget source="SensorTempText4" render="Label" position="10,230" zPosition="1" size="90,40" font="Regular;20" halign="left" valign="top" backgroundColor="#9f1313" transparent="1" />
+                       <widget source="SensorTemp4" render="Label" position="100,230" zPosition="1" size="100,20" font="Regular;19" halign="right">
+                               <convert type="SensorToText"></convert>
+                       </widget>
+                       <widget source="SensorTempText5" render="Label" position="10,250" zPosition="1" size="90,40" font="Regular;20" halign="left" valign="top" backgroundColor="#9f1313" transparent="1" />
+                       <widget source="SensorTemp5" render="Label" position="100,250" zPosition="1" size="100,20" font="Regular;19" halign="right">
+                               <convert type="SensorToText"></convert>
+                       </widget>
+                       <widget source="SensorTempText6" render="Label" position="10,270" zPosition="1" size="90,40" font="Regular;20" halign="left" valign="top" backgroundColor="#9f1313" transparent="1" />
+                       <widget source="SensorTemp6" render="Label" position="100,270" zPosition="1" size="100,20" font="Regular;19" halign="right">
+                               <convert type="SensorToText"></convert>
+                       </widget>
+                       <widget source="SensorTempText7" render="Label" position="10,290" zPosition="1" size="90,40" font="Regular;20" halign="left" valign="top" backgroundColor="#9f1313" transparent="1" />
+                       <widget source="SensorTemp7" render="Label" position="100,290" zPosition="1" size="100,20" font="Regular;19" halign="right">
+                               <convert type="SensorToText"></convert>
+                       </widget>
+                       
+                       <widget source="SensorFanText0" render="Label" position="290,150" zPosition="1" size="90,40" font="Regular;20" halign="left" valign="top" backgroundColor="#9f1313" transparent="1" />
+                       <widget source="SensorFan0" render="Label" position="380,150" zPosition="1" size="150,20" font="Regular;19" halign="right">
+                               <convert type="SensorToText"></convert>
+                       </widget>
+                       <widget source="SensorFanText1" render="Label" position="290,170" zPosition="1" size="90,40" font="Regular;20" halign="left" valign="top" backgroundColor="#9f1313" transparent="1" />
+                       <widget source="SensorFan1" render="Label" position="380,170" zPosition="1" size="150,20" font="Regular;19" halign="right">
+                               <convert type="SensorToText"></convert>
+                       </widget>
+                       <widget source="SensorFanText2" render="Label" position="290,190" zPosition="1" size="90,40" font="Regular;20" halign="left" valign="top" backgroundColor="#9f1313" transparent="1" />
+                       <widget source="SensorFan2" render="Label" position="380,190" zPosition="1" size="150,20" font="Regular;19" halign="right">
+                               <convert type="SensorToText"></convert>
+                       </widget>
+                       <widget source="SensorFanText3" render="Label" position="290,210" zPosition="1" size="90,40" font="Regular;20" halign="left" valign="top" backgroundColor="#9f1313" transparent="1" />
+                       <widget source="SensorFan3" render="Label" position="380,210" zPosition="1" size="150,20" font="Regular;19" halign="right">
+                               <convert type="SensorToText"></convert>
+                       </widget>
+                       <widget source="SensorFanText4" render="Label" position="290,230" zPosition="1" size="90,40" font="Regular;20" halign="left" valign="top" backgroundColor="#9f1313" transparent="1" />
+                       <widget source="SensorFan4" render="Label" position="380,230" zPosition="1" size="150,20" font="Regular;19" halign="right">
+                               <convert type="SensorToText"></convert>
+                       </widget>
+                       <widget source="SensorFanText5" render="Label" position="290,250" zPosition="1" size="90,40" font="Regular;20" halign="left" valign="top" backgroundColor="#9f1313" transparent="1" />
+                       <widget source="SensorFan5" render="Label" position="380,250" zPosition="1" size="150,20" font="Regular;19" halign="right">
+                               <convert type="SensorToText"></convert>
+                       </widget>
+                       <widget source="SensorFanText6" render="Label" position="290,270" zPosition="1" size="90,40" font="Regular;20" halign="left" valign="top" backgroundColor="#9f1313" transparent="1" />
+                       <widget source="SensorFan6" render="Label" position="380,270" zPosition="1" size="150,20" font="Regular;19" halign="right">
+                               <convert type="SensorToText"></convert>
+                       </widget>
+                       <widget source="SensorFanText7" render="Label" position="290,290" zPosition="1" size="90,40" font="Regular;20" halign="left" valign="top" backgroundColor="#9f1313" transparent="1" />
+                       <widget source="SensorFan7" render="Label" position="380,290" zPosition="1" size="150,20" font="Regular;19" halign="right">
+                               <convert type="SensorToText"></convert>
+                       </widget>
+               </screen>"""
+       
+       def __init__(self, session, args = None):
+               Screen.__init__(self, session)
+               
+               templist = sensors.getSensorsList(sensors.TYPE_TEMPERATURE)
+               tempcount = len(templist)
+               fanlist = sensors.getSensorsList(sensors.TYPE_FAN_RPM)
+               fancount = len(fanlist)
+               
+               self["red"] = StaticText(_("Cancel"))
+               self["green"] = StaticText(_("OK"))
+               self["yellow"] = StaticText("")
+               self["blue"] = StaticText("")   
+               
+               for count in range(8):
+                       if count < tempcount:
+                               id = templist[count]
+                               self["SensorTempText%d" % count] = StaticText(sensors.getSensorName(id))                
+                               self["SensorTemp%d" % count] = SensorSource(sensorid = id)
+                       else:
+                               self["SensorTempText%d" % count] = StaticText("")
+                               self["SensorTemp%d" % count] = SensorSource()
+                               
+                       if count < fancount:
+                               id = fanlist[count]
+                               self["SensorFanText%d" % count] = StaticText(sensors.getSensorName(id))         
+                               self["SensorFan%d" % count] = SensorSource(sensorid = id)
+                       else:
+                               self["SensorFanText%d" % count] = StaticText("")
+                               self["SensorFan%d" % count] = SensorSource()
+               
+               self.list = []
+               for count in range(fancontrol.getFanCount()):
+                       self.list.append(getConfigListEntry(_("Fan %d Voltage") % (count + 1), fancontrol.getConfig(count).vlt))
+                       self.list.append(getConfigListEntry(_("Fan %d PWM") % (count + 1), fancontrol.getConfig(count).pwm))
+               ConfigListScreen.__init__(self, self.list, session = self.session)
+               #self["config"].list = self.list
+               #self["config"].setList(self.list)
+               
+               self["actions"] = ActionMap(["OkCancelActions", "ColorActions"], 
+               {
+                       "ok": self.save,
+                       "cancel": self.revert,
+                       "red": self.revert,
+                       "green": self.save
+               }, -1)
+               
+       def save(self):
+               for count in range(fancontrol.getFanCount()):
+                       fancontrol.getConfig(count).vlt.save()
+                       fancontrol.getConfig(count).pwm.save()
+               self.close()
+               
+       def revert(self):
+               for count in range(fancontrol.getFanCount()):
+                       fancontrol.getConfig(count).vlt.load()
+                       fancontrol.getConfig(count).pwm.load()
+               self.close()
+               
+def main(session, **kwargs):
+       session.open(TempFanControl)
+
+def startMenu(menuid):
+       if menuid != "system":
+               return []
+       
+       return [(_("Temperature and Fan control"), main, "tempfancontrol", 80)]
+
+def Plugins(**kwargs):
+       return PluginDescriptor(name = "Temperature and Fan control", description = _("Temperature and Fan control"), where = PluginDescriptor.WHERE_MENU, fnc = startMenu)
+       
\ No newline at end of file
index c8568b9..6873ffa 100755 (executable)
@@ -394,4 +394,3 @@ def configStrings(iface):
 
 def Plugins(**kwargs):
        return PluginDescriptor(name=_("Wireless LAN"), description=_("Connect to a Wireless Network"), where = PluginDescriptor.WHERE_NETWORKSETUP, fnc={"ifaceSupported": callFunction, "configStrings": configStrings, "WlanPluginEntry": lambda x: "Wireless Network Configuartion..."})
-       
\ No newline at end of file
index 0432823..e8bbce1 100644 (file)
@@ -21,10 +21,12 @@ profile("ChannelSelection.py 2.3")
 from Components.Input import Input
 profile("ChannelSelection.py 3")
 from Components.ParentalControl import parentalControl
+from Components.ChoiceList import ChoiceList, ChoiceEntryComponent
 from Screens.InputBox import InputBox, PinInput
 from Screens.MessageBox import MessageBox
 from Screens.ServiceInfo import ServiceInfo
 profile("ChannelSelection.py 4")
+from Screens.PictureInPicture import PictureInPicture
 from Screens.RdsDisplay import RassInteractive
 from ServiceReference import ServiceReference
 from Tools.BoundFunction import boundFunction
@@ -69,9 +71,9 @@ OFF = 0
 EDIT_BOUQUET = 1
 EDIT_ALTERNATIVES = 2
 
-def append_when_current_valid(current, menu, args, level = 0):
+def append_when_current_valid(current, menu, args, level = 0, key = ""):
        if current and current.valid() and level <= config.usage.setup_level.index:
-               menu.append(args)
+               menu.append(ChoiceEntryComponent(key, args))
 
 class ChannelContextMenu(Screen):
        def __init__(self, session, csel):
@@ -80,13 +82,15 @@ class ChannelContextMenu(Screen):
                self.csel = csel
                self.bsel = None
 
-               self["actions"] = ActionMap(["OkCancelActions"],
+               self["actions"] = ActionMap(["OkCancelActions", "ColorActions", "NumberActions"],
                        {
                                "ok": self.okbuttonClick,
-                               "cancel": self.cancelClick
+                               "cancel": self.cancelClick,
+                               "blue": self.showServiceInPiP
                        })
                menu = [ ]
 
+               self.pipAvailable = False
                current = csel.getCurrentSelection()
                current_root = csel.getRoot()
                current_sel_path = current.getPath()
@@ -122,8 +126,11 @@ class ChannelContextMenu(Screen):
                                        append_when_current_valid(current, menu, (_("remove entry"), self.removeCurrentService), level = 0)
                                if current_root and current_root.getPath().find("flags == %d" %(FLAG_SERVICE_NEW_FOUND)) != -1:
                                        append_when_current_valid(current, menu, (_("remove new found flag"), self.removeNewFoundFlag), level = 0)
+                               if isPlayable:
+                                       append_when_current_valid(current, menu, (_("Activate Picture in Picture"), self.showServiceInPiP), level = 0, key = "blue")
+                                       self.pipAvailable = True
                        else:
-                                       menu.append((_("add bouquet"), self.showBouquetInputBox))
+                                       menu.append(ChoiceEntryComponent(text = (_("add bouquet"), self.showBouquetInputBox)))
                                        append_when_current_valid(current, menu, (_("remove entry"), self.removeBouquet), level = 0)
 
                if inBouquet: # current list is editable?
@@ -131,7 +138,7 @@ class ChannelContextMenu(Screen):
                                if not csel.movemode:
                                        append_when_current_valid(current, menu, (_("enable move mode"), self.toggleMoveMode), level = 1)
                                        if not inBouquetRootList and current_root and not (current_root.flags & eServiceReference.isGroup):
-                                               menu.append((_("add marker"), self.showMarkerInputBox))
+                                               menu.append(ChoiceEntryComponent(text = (_("add marker"), self.showMarkerInputBox)))
                                                if haveBouquets:
                                                        append_when_current_valid(current, menu, (_("enable bouquet edit"), self.bouquetMarkStart), level = 0)
                                                else:
@@ -156,11 +163,11 @@ class ChannelContextMenu(Screen):
                                                append_when_current_valid(current, menu, (_("end alternatives edit"), self.bouquetMarkEnd), level = 0)
                                                append_when_current_valid(current, menu, (_("abort alternatives edit"), self.bouquetMarkAbort), level = 0)
 
-               menu.append((_("back"), self.cancelClick))
-               self["menu"] = MenuList(menu)
+               menu.append(ChoiceEntryComponent(text = (_("back"), self.cancelClick)))
+               self["menu"] = ChoiceList(menu)
 
        def okbuttonClick(self):
-               self["menu"].getCurrent()[1]()
+               self["menu"].getCurrent()[0][1]()
 
        def cancelClick(self):
                self.close(False)
@@ -189,6 +196,23 @@ class ChannelContextMenu(Screen):
                        self.close()
                else:
                        self.session.openWithCallback(self.close, MessageBox, _("The pin code you entered is wrong."), MessageBox.TYPE_ERROR)
+                       
+       def showServiceInPiP(self):
+               if not self.pipAvailable:
+                       return
+               if self.session.pipshown:
+                       del self.session.pip
+               self.session.pip = self.session.instantiateDialog(PictureInPicture)
+               self.session.pip.show()
+               newservice = self.csel.servicelist.getCurrent()
+               if self.session.pip.playService(newservice):
+                       self.session.pipshown = True
+                       self.session.pip.servicePath = self.csel.getCurrentServicePath()
+                       self.close()
+               else:
+                       self.session.pipshown = False
+                       del self.session.pip
+                       self.session.openWithCallback(self.close, MessageBox, _("Could not open Picture in Picture"), MessageBox.TYPE_ERROR)
 
        def addServiceToBouquetSelected(self):
                bouquets = self.csel.getBouquetList()
index a3e56a4..58cee9f 100644 (file)
@@ -691,6 +691,7 @@ class InfoBarSeek:
                                iPlayableService.evEOF: self.__evEOF,
                                iPlayableService.evSOF: self.__evSOF,
                        })
+               self.fast_winding_hint_message_showed = False
 
                class InfoBarSeekActionMap(HelpableActionMap):
                        def __init__(self, screen, *args, **kwargs):
@@ -817,6 +818,7 @@ class InfoBarSeek:
 #                      print "seekable"
 
        def __serviceStarted(self):
+               self.fast_winding_hint_message_showed = False
                self.seekstate = self.SEEK_STATE_PLAY
                self.__seekableStatusChanged()
 
@@ -907,6 +909,12 @@ class InfoBarSeek:
                        self.showAfterSeek()
 
        def seekFwd(self):
+               seek = self.getSeek()
+               if seek and not (seek.isCurrentlySeekable() & 2):
+                       if not self.fast_winding_hint_message_showed and (seek.isCurrentlySeekable() & 1):
+                               self.session.open(MessageBox, _("No fast winding possible yet.. but you can use the number buttons to skip forward/backward!"), MessageBox.TYPE_INFO, timeout=10)
+                               self.fast_winding_hint_message_showed = True
+                       return
                if self.seekstate == self.SEEK_STATE_PLAY:
                        self.setSeekState(self.makeStateForward(int(config.seek.enter_forward.value)))
                elif self.seekstate == self.SEEK_STATE_PAUSE:
@@ -936,6 +944,12 @@ class InfoBarSeek:
                        self.setSeekState(self.makeStateSlowMotion(speed))
 
        def seekBack(self):
+               seek = self.getSeek()
+               if seek and not (seek.isCurrentlySeekable() & 2):
+                       if not self.fast_winding_hint_message_showed and (seek.isCurrentlySeekable() & 1):
+                               self.session.open(MessageBox, _("No fast winding possible yet.. but you can use the number buttons to skip forward/backward!"), MessageBox.TYPE_INFO, timeout=10)
+                               self.fast_winding_hint_message_showed = True
+                       return
                seekstate = self.seekstate
                if seekstate == self.SEEK_STATE_PLAY:
                        self.setSeekState(self.makeStateBackward(int(config.seek.enter_backward.value)))
index 61bb7d0..cce08ae 100755 (executable)
@@ -9,7 +9,7 @@ from Components.Label import Label
 from Screens.MessageBox import MessageBox
 from Screens.Console import Console
 from Plugins.Plugin import PluginDescriptor
-from Tools.Directories import resolveFilename, SCOPE_PLUGINS, SCOPE_SKIN_IMAGE
+from Tools.Directories import resolveFilename, fileExists, SCOPE_PLUGINS, SCOPE_SKIN_IMAGE
 from Tools.LoadPixmap import LoadPixmap
 
 from time import time
@@ -22,19 +22,23 @@ class PluginBrowser(Screen):
        def __init__(self, session):
                Screen.__init__(self, session)
                
-               self["red"] = Label(_("Remove Plugins"))
-               self["green"] = Label(_("Download Plugins"))
+               self["red"] = Label()
+               self["green"] = Label()
                
                self.list = []
                self["list"] = PluginList(self.list)
                
-               self["actions"] = ActionMap(["WizardActions", "ColorActions"],
+               self["actions"] = ActionMap(["WizardActions"],
                {
                        "ok": self.save,
                        "back": self.close,
+               })
+               self["PluginDownloadActions"] = ActionMap(["ColorActions"],
+               {
                        "red": self.delete,
                        "green": self.download
                })
+               self["PluginDownloadActions"].setEnabled(False)
                self.onFirstExecBegin.append(self.checkWarnings)
                self.onShown.append(self.updateList)
        
@@ -47,7 +51,6 @@ class PluginBrowser(Screen):
                        self.session.open(MessageBox, text = text, type = MessageBox.TYPE_WARNING)
 
        def save(self):
-               #self.close()
                self.run()
        
        def run(self):
@@ -58,7 +61,15 @@ class PluginBrowser(Screen):
                self.pluginlist = plugins.getPlugins(PluginDescriptor.WHERE_PLUGINMENU)
                self.list = [PluginEntryComponent(plugin) for plugin in self.pluginlist]
                self["list"].l.setList(self.list)
-
+               if fileExists(resolveFilename(SCOPE_PLUGINS, "SystemPlugins/SoftwareManager/plugin.py")):
+                       self["red"].setText("")
+                       self["green"].setText("")
+                       self["PluginDownloadActions"].setEnabled(False)
+               else:
+                       self["red"].setText(_("Remove Plugins"))
+                       self["green"].setText(_("Download Plugins"))
+                       self["PluginDownloadActions"].setEnabled(True)
+                       
        def delete(self):
                self.session.openWithCallback(self.PluginDownloadBrowserClosed, PluginDownloadBrowser, PluginDownloadBrowser.REMOVE)
        
index b5e2651..e6af1e6 100644 (file)
@@ -1387,7 +1387,7 @@ RESULT eDVBServicePlay::setTrickmode(int trick)
 
 RESULT eDVBServicePlay::isCurrentlySeekable()
 {
-       return m_is_pvr || m_timeshift_active;
+       return m_is_pvr || m_timeshift_active ? 3 : 0; // fast forward/backward possible and seeking possible
 }
 
 RESULT eDVBServicePlay::frontendInfo(ePtr<iFrontendInformation> &ptr)
@@ -2300,6 +2300,7 @@ void eDVBServicePlay::switchToTimeshift()
 void eDVBServicePlay::updateDecoder()
 {
        int vpid = -1, vpidtype = -1, pcrpid = -1, tpid = -1, achannel = -1, ac3_delay=-1, pcm_delay=-1;
+       bool mustPlay = false;
 
        eDVBServicePMTHandler &h = m_timeshift_active ? m_service_handler_timeshift : m_service_handler;
 
@@ -2380,11 +2381,10 @@ void eDVBServicePlay::updateDecoder()
                                        Py_DECREF(subs);
                                }
                        }
-                       m_decoder->play(); /* pids will be set later */
                }
                if (m_cue)
                        m_cue->setDecodingDemux(m_decode_demux, m_decoder);
-               m_decoder->play(); /* pids will be set later. */
+               mustPlay = true;
        }
 
        m_timeshift_changed = 0;
@@ -2449,7 +2449,11 @@ void eDVBServicePlay::updateDecoder()
                                m_decoder->setRadioPic(radio_pic);
                }
 
-               m_decoder->set();
+               if (mustPlay)
+                       m_decoder->play();
+               else
+                       m_decoder->set();
+
                m_decoder->setAudioChannel(achannel);
 
                /* don't worry about non-existing services, nor pvr services */
index d3eaa26..c0ae42f 100644 (file)
@@ -46,6 +46,7 @@ eServiceFactoryMP3::eServiceFactoryMP3()
                extensions.push_back("mp4");
                extensions.push_back("mov");
                extensions.push_back("m4a");
+               extensions.push_back("m2ts");
                sc->addServiceFactory(eServiceFactoryMP3::id, this, extensions);
        }
 
@@ -640,7 +641,31 @@ RESULT eServiceMP3::setTrickmode(int trick)
 
 RESULT eServiceMP3::isCurrentlySeekable()
 {
-       return 1;
+       int ret = 3; // seeking and fast/slow winding possible
+       GstElement *sink;
+
+       if (!m_gst_playbin)
+               return 0;
+       if (m_state != stRunning)
+               return 0;
+
+       g_object_get (G_OBJECT (m_gst_playbin), "video-sink", &sink, NULL);
+
+       // disable fast winding yet when a dvbvideosink or dvbaudiosink is used
+       // for this we must do some changes on different places.. (gstreamer.. our sinks.. enigma2)
+       if (sink) {
+               ret &= ~2; // only seeking possible
+               gst_object_unref(sink);
+       }
+       else {
+               g_object_get (G_OBJECT (m_gst_playbin), "audio-sink", &sink, NULL);
+               if (sink) {
+                       ret &= ~2; // only seeking possible
+                       gst_object_unref(sink);
+               }
+       }
+
+       return ret;
 }
 
 RESULT eServiceMP3::info(ePtr<iServiceInformation>&i)
index 44e6a6e..6b9adfb 100644 (file)
@@ -315,7 +315,7 @@ RESULT eServiceXine::setTrickmode(int trick)
 
 RESULT eServiceXine::isCurrentlySeekable()
 {
-       return 1;
+       return 3;
 }
 
 RESULT eServiceXine::info(ePtr<iServiceInformation>&i)
index 077d4bf..af31414 100755 (executable)
--- a/po/ar.po
+++ b/po/ar.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: tuxbox-enigma 0.0.1\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2009-11-05 18:09+0100\n"
+"POT-Creation-Date: 2009-12-28 20:46+0100\n"
 "PO-Revision-Date: 2006-01-10 01:17+0300\n"
 "Last-Translator: hazem <moustafagamal@hotmail.com>\n"
 "Language-Team: Arabic <moustafagamal@hotmail.com>\n"
@@ -41,6 +41,11 @@ msgstr ""
 
 msgid ""
 "\n"
+"Manage extensions or plugins for your Dreambox"
+msgstr ""
+
+msgid ""
+"\n"
 "Online update of your Dreambox software."
 msgstr ""
 
@@ -66,7 +71,7 @@ msgstr ""
 
 msgid ""
 "\n"
-"Scan for local packages and install them."
+"Scan for local extensions and install them."
 msgstr ""
 
 msgid ""
@@ -80,11 +85,6 @@ msgid ""
 "System will restart after the restore!"
 msgstr ""
 
-msgid ""
-"\n"
-"View, install and remove available or installed packages."
-msgstr ""
-
 msgid " "
 msgstr ""
 
@@ -276,6 +276,15 @@ msgstr ""
 msgid "9"
 msgstr ""
 
+msgid "<Current movielist location>"
+msgstr ""
+
+msgid "<Default movie location>"
+msgstr ""
+
+msgid "<Last timer location>"
+msgstr ""
+
 msgid "<unknown>"
 msgstr ""
 
@@ -329,6 +338,15 @@ msgstr ""
 msgid "A required tool (%s) was not found."
 msgstr ""
 
+msgid "A search for available updates is currently in progress."
+msgstr ""
+
+msgid ""
+"A second configured interface has been found.\n"
+"\n"
+"Do you want to disable the second network interface?"
+msgstr ""
+
 msgid ""
 "A sleep timer wants to set your\n"
 "Dreambox to standby. Do that now?"
@@ -445,6 +463,12 @@ msgstr "متقدم"
 msgid "Advanced Options"
 msgstr ""
 
+msgid "Advanced Software"
+msgstr ""
+
+msgid "Advanced Software Plugin"
+msgstr ""
+
 msgid "Advanced Video Enhancement Setup"
 msgstr ""
 
@@ -928,9 +952,6 @@ msgstr ""
 msgid "Content does not fit on DVD!"
 msgstr ""
 
-msgid "Continue"
-msgstr ""
-
 msgid "Continue in background"
 msgstr ""
 
@@ -946,6 +967,9 @@ msgstr ""
 msgid "Could not load Medium! No disc inserted?"
 msgstr ""
 
+msgid "Could not open Picture in Picture"
+msgstr ""
+
 #, python-format
 msgid "Couldn't record due to conflicting timer %s"
 msgstr ""
@@ -1069,6 +1093,9 @@ msgstr "المعتاد"
 msgid "Default Settings"
 msgstr ""
 
+msgid "Default movie location"
+msgstr ""
+
 msgid "Default services lists"
 msgstr ""
 
@@ -1105,6 +1132,9 @@ msgstr ""
 msgid "Destination directory"
 msgstr ""
 
+msgid "Details for extension: "
+msgstr ""
+
 msgid "Detected HDD:"
 msgstr "موجود قرص صلب:"
 
@@ -1408,8 +1438,7 @@ msgstr ""
 msgid "Enabled"
 msgstr ""
 
-#, python-format
-msgid "Encrypted: %s"
+msgid "Encrypted: "
 msgstr ""
 
 msgid "Encryption"
@@ -1532,9 +1561,18 @@ msgstr ""
 msgid "Extended Setup..."
 msgstr ""
 
+msgid "Extended Software"
+msgstr ""
+
+msgid "Extended Software Plugin"
+msgstr ""
+
 msgid "Extensions"
 msgstr ""
 
+msgid "Extensions management"
+msgstr ""
+
 msgid "FEC"
 msgstr ""
 
@@ -1544,6 +1582,18 @@ msgstr ""
 msgid "Failed"
 msgstr ""
 
+#, python-format
+msgid "Fan %d"
+msgstr ""
+
+#, python-format
+msgid "Fan %d PWM"
+msgstr ""
+
+#, python-format
+msgid "Fan %d Voltage"
+msgstr ""
+
 msgid "Fast"
 msgstr ""
 
@@ -1590,7 +1640,7 @@ msgstr ""
 msgid "Flashing failed"
 msgstr ""
 
-msgid "Following tasks will be done after you press continue!"
+msgid "Following tasks will be done after you press OK!"
 msgstr ""
 
 msgid "Format"
@@ -1650,13 +1700,13 @@ msgstr ""
 msgid "General AC3 Delay"
 msgstr ""
 
-msgid "General AC3 delay"
+msgid "General AC3 delay (ms)"
 msgstr ""
 
 msgid "General PCM Delay"
 msgstr ""
 
-msgid "General PCM delay"
+msgid "General PCM delay (ms)"
 msgstr ""
 
 msgid "Genre"
@@ -1797,6 +1847,9 @@ msgstr "معلومات"
 msgid "Init"
 msgstr ""
 
+msgid "Initial location in new timers"
+msgstr ""
+
 msgid "Initialization..."
 msgstr ""
 
@@ -1851,14 +1904,16 @@ msgstr ""
 msgid "Instant Record..."
 msgstr ""
 
+msgid "Instant record location"
+msgstr ""
+
 msgid "Integrated Ethernet"
 msgstr ""
 
 msgid "Integrated Wireless"
 msgstr ""
 
-#, python-format
-msgid "Interface: %s"
+msgid "Interface: "
 msgstr ""
 
 msgid "Intermediate"
@@ -1993,6 +2048,9 @@ msgstr ""
 msgid "Location"
 msgstr ""
 
+msgid "Location for instant recordings"
+msgstr ""
+
 msgid "Lock:"
 msgstr ""
 
@@ -2026,6 +2084,9 @@ msgstr ""
 msgid "Make this mark just a mark"
 msgstr ""
 
+msgid "Manage extensions"
+msgstr ""
+
 msgid "Manage your receiver's software"
 msgstr ""
 
@@ -2044,8 +2105,7 @@ msgstr ""
 msgid "Margin before record (minutes)"
 msgstr ""
 
-#, python-format
-msgid "Max. Bitrate: %s"
+msgid "Max. Bitrate: "
 msgstr ""
 
 msgid "Media player"
@@ -2108,6 +2168,9 @@ msgstr ""
 msgid "Move west"
 msgstr ""
 
+msgid "Movie location"
+msgstr ""
+
 msgid "Movielist menu"
 msgstr ""
 
@@ -2132,6 +2195,9 @@ msgstr "غير موجود"
 msgid "NEXT"
 msgstr ""
 
+msgid "NFI Image Flashing"
+msgstr ""
+
 msgid "NFI image flashing completed. Press Yellow to Reboot!"
 msgstr ""
 
@@ -2251,9 +2317,17 @@ msgstr ""
 msgid "No event info found, recording indefinitely."
 msgstr ""
 
+msgid ""
+"No fast winding possible yet.. but you can use the number buttons to skip "
+"forward/backward!"
+msgstr ""
+
 msgid "No free tuner!"
 msgstr ""
 
+msgid "No network connection available."
+msgstr ""
+
 msgid "No networks found"
 msgstr ""
 
@@ -2273,6 +2347,9 @@ msgstr ""
 msgid "No tags are set on these movies."
 msgstr ""
 
+msgid "No to all"
+msgstr ""
+
 msgid "No tuner is configured for use with a diseqc positioner!"
 msgstr ""
 
@@ -2401,6 +2478,9 @@ msgstr ""
 msgid "Only Free scan"
 msgstr ""
 
+msgid "Only extensions."
+msgstr ""
+
 msgid "Optionally enter your name if you want to."
 msgstr ""
 
@@ -2413,9 +2493,6 @@ msgstr ""
 msgid "PIDs"
 msgstr ""
 
-msgid "Package details for: "
-msgstr ""
-
 msgid "Package list update"
 msgstr ""
 
@@ -2677,9 +2754,6 @@ msgstr "انتظر من فضلك ...يتم تحميل القائمه..."
 msgid "Plugin browser"
 msgstr "متصفح البلج إنز"
 
-msgid "Plugin manager"
-msgstr ""
-
 msgid "Plugin manager activity information"
 msgstr ""
 
@@ -2874,6 +2948,9 @@ msgstr ""
 msgid "Recording"
 msgstr "تسجيل"
 
+msgid "Recording paths..."
+msgstr ""
+
 msgid "Recording(s) are in progress or coming up in few seconds!"
 msgstr ""
 
@@ -2886,9 +2963,6 @@ msgstr ""
 msgid "Reenter new pin"
 msgstr ""
 
-msgid "Refresh"
-msgstr ""
-
 msgid "Refresh Rate"
 msgstr ""
 
@@ -3198,6 +3272,9 @@ msgstr ""
 msgid "Search west"
 msgstr ""
 
+msgid "Searching for available updates. Please wait..."
+msgstr ""
+
 msgid "Searching for new installed or removed packages. Please wait..."
 msgstr ""
 
@@ -3390,6 +3467,9 @@ msgstr ""
 msgid "Shows the state of your wireless LAN connection.\n"
 msgstr ""
 
+msgid "Shutdown"
+msgstr ""
+
 msgid "Shutdown Dreambox after"
 msgstr ""
 
@@ -3463,7 +3543,7 @@ msgstr ""
 msgid "Software"
 msgstr ""
 
-msgid "Software manager"
+msgid "Software management"
 msgstr ""
 
 msgid "Software restore"
@@ -3648,6 +3728,9 @@ msgstr ""
 msgid "Tags"
 msgstr ""
 
+msgid "Temperature and Fan control"
+msgstr ""
+
 msgid "Terrestrial"
 msgstr ""
 
@@ -3695,6 +3778,12 @@ msgstr ""
 
 #, python-format
 msgid ""
+"The directory %s is not writable.\n"
+"Make sure you select a writable directory instead."
+msgstr ""
+
+#, python-format
+msgid ""
 "The following device was found:\n"
 "\n"
 "%s\n"
@@ -3782,16 +3871,19 @@ msgstr ""
 msgid "There are at least "
 msgstr ""
 
+msgid "There are currently no outstanding actions."
+msgstr ""
+
 msgid "There are no default services lists in your image."
 msgstr ""
 
 msgid "There are no default settings in your image."
 msgstr ""
 
-msgid "There are no"
+msgid "There are no updates available."
 msgstr ""
 
-msgid "There is nothing to be done."
+msgid "There are now "
 msgstr ""
 
 msgid ""
@@ -3930,6 +4022,9 @@ msgid ""
 "Please recheck it!"
 msgstr ""
 
+msgid "Timer record location"
+msgstr ""
+
 msgid "Timer sanity error"
 msgstr ""
 
@@ -3942,6 +4037,9 @@ msgstr ""
 msgid "Timeshift"
 msgstr ""
 
+msgid "Timeshift location"
+msgstr ""
+
 msgid "Timeshift not possible!"
 msgstr ""
 
@@ -3972,6 +4070,9 @@ msgstr ""
 msgid "Today"
 msgstr ""
 
+msgid "Tone Amplitude"
+msgstr ""
+
 msgid "Tone mode"
 msgstr ""
 
@@ -4081,14 +4182,13 @@ msgstr ""
 msgid "Uncommitted DiSEqC command"
 msgstr ""
 
-msgid ""
-"Undo\n"
-"Install"
+msgid "Undo install"
 msgstr ""
 
-msgid ""
-"Undo\n"
-"Remove"
+msgid "Undo uninstall"
+msgstr ""
+
+msgid "Unicable"
 msgstr ""
 
 msgid "Unicable LNB"
@@ -4097,6 +4197,9 @@ msgstr ""
 msgid "Unicable Martix"
 msgstr ""
 
+msgid "Uninstall"
+msgstr ""
+
 msgid "Universal LNB"
 msgstr ""
 
@@ -4115,6 +4218,9 @@ msgstr ""
 msgid "Updating finished. Here is the result:"
 msgstr "إنتهاء التحديث، وهذه هى النتيجه"
 
+msgid "Updating software catalog"
+msgstr ""
+
 msgid "Updating... Please wait... This can take some minutes..."
 msgstr "جارى التحديث ..انتظر..قد يستغرق بعض الوقت"
 
@@ -4449,6 +4555,9 @@ msgstr ""
 msgid "Yes"
 msgstr "نعم"
 
+msgid "Yes to all"
+msgstr ""
+
 msgid "Yes, and delete this movie"
 msgstr ""
 
@@ -4496,6 +4605,9 @@ msgstr ""
 msgid "You can install this plugin."
 msgstr ""
 
+msgid "You can only burn Dreambox recordings!"
+msgstr ""
+
 msgid "You can remove this plugin."
 msgstr ""
 
@@ -4574,6 +4686,13 @@ msgid ""
 "\n"
 "Your internet connection is working now.\n"
 "\n"
+msgstr ""
+
+msgid ""
+"Your Dreambox is now ready to use.\n"
+"\n"
+"Your internet connection is working now.\n"
+"\n"
 "Please press OK to continue."
 msgstr ""
 
@@ -4673,6 +4792,9 @@ msgstr ""
 msgid "activate current configuration"
 msgstr ""
 
+msgid "activate network adapter configuration"
+msgstr ""
+
 msgid "add Provider"
 msgstr ""
 
@@ -4993,9 +5115,6 @@ msgstr "مساعده"
 msgid "hidden network"
 msgstr ""
 
-msgid "hidden..."
-msgstr ""
-
 msgid "hide extended description"
 msgstr ""
 
@@ -5384,6 +5503,9 @@ msgstr ""
 msgid "shuffle playlist"
 msgstr ""
 
+msgid "shut down"
+msgstr ""
+
 msgid "shutdown"
 msgstr ""
 
index 13b6031..9c864b1 100755 (executable)
--- a/po/ca.po
+++ b/po/ca.po
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: ca\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2009-11-05 18:09+0100\n"
+"POT-Creation-Date: 2009-12-28 20:46+0100\n"
 "PO-Revision-Date: 2007-08-14 10:23+0200\n"
 "Last-Translator: Oriol Pellicer <oriol@elsud.org>\n"
 "Language-Team: \n"
@@ -43,6 +43,11 @@ msgstr ""
 
 msgid ""
 "\n"
+"Manage extensions or plugins for your Dreambox"
+msgstr ""
+
+msgid ""
+"\n"
 "Online update of your Dreambox software."
 msgstr ""
 
@@ -68,7 +73,7 @@ msgstr ""
 
 msgid ""
 "\n"
-"Scan for local packages and install them."
+"Scan for local extensions and install them."
 msgstr ""
 
 msgid ""
@@ -82,11 +87,6 @@ msgid ""
 "System will restart after the restore!"
 msgstr ""
 
-msgid ""
-"\n"
-"View, install and remove available or installed packages."
-msgstr ""
-
 msgid " "
 msgstr ""
 
@@ -285,6 +285,15 @@ msgstr "8"
 msgid "9"
 msgstr "9"
 
+msgid "<Current movielist location>"
+msgstr ""
+
+msgid "<Default movie location>"
+msgstr ""
+
+msgid "<Last timer location>"
+msgstr ""
+
 msgid "<unknown>"
 msgstr "<desconegut>"
 
@@ -350,6 +359,15 @@ msgstr ""
 msgid "A required tool (%s) was not found."
 msgstr ""
 
+msgid "A search for available updates is currently in progress."
+msgstr ""
+
+msgid ""
+"A second configured interface has been found.\n"
+"\n"
+"Do you want to disable the second network interface?"
+msgstr ""
+
 msgid ""
 "A sleep timer wants to set your\n"
 "Dreambox to standby. Do that now?"
@@ -470,6 +488,12 @@ msgstr "Avançat"
 msgid "Advanced Options"
 msgstr ""
 
+msgid "Advanced Software"
+msgstr ""
+
+msgid "Advanced Software Plugin"
+msgstr ""
+
 msgid "Advanced Video Enhancement Setup"
 msgstr ""
 
@@ -959,9 +983,6 @@ msgstr "Constel·lació"
 msgid "Content does not fit on DVD!"
 msgstr ""
 
-msgid "Continue"
-msgstr ""
-
 msgid "Continue in background"
 msgstr ""
 
@@ -977,6 +998,9 @@ msgstr ""
 msgid "Could not load Medium! No disc inserted?"
 msgstr ""
 
+msgid "Could not open Picture in Picture"
+msgstr ""
+
 #, python-format
 msgid "Couldn't record due to conflicting timer %s"
 msgstr ""
@@ -1100,6 +1124,9 @@ msgstr ""
 msgid "Default Settings"
 msgstr ""
 
+msgid "Default movie location"
+msgstr ""
+
 msgid "Default services lists"
 msgstr ""
 
@@ -1136,6 +1163,9 @@ msgstr ""
 msgid "Destination directory"
 msgstr ""
 
+msgid "Details for extension: "
+msgstr ""
+
 msgid "Detected HDD:"
 msgstr "Disc dur detectat:"
 
@@ -1446,8 +1476,7 @@ msgstr ""
 msgid "Enabled"
 msgstr "Activat"
 
-#, python-format
-msgid "Encrypted: %s"
+msgid "Encrypted: "
 msgstr ""
 
 msgid "Encryption"
@@ -1576,9 +1605,18 @@ msgstr ""
 msgid "Extended Setup..."
 msgstr "Configuració avançada..."
 
+msgid "Extended Software"
+msgstr ""
+
+msgid "Extended Software Plugin"
+msgstr ""
+
 msgid "Extensions"
 msgstr "Extensions"
 
+msgid "Extensions management"
+msgstr ""
+
 msgid "FEC"
 msgstr "FEC"
 
@@ -1588,6 +1626,18 @@ msgstr ""
 msgid "Failed"
 msgstr ""
 
+#, python-format
+msgid "Fan %d"
+msgstr ""
+
+#, python-format
+msgid "Fan %d PWM"
+msgstr ""
+
+#, python-format
+msgid "Fan %d Voltage"
+msgstr ""
+
 msgid "Fast"
 msgstr "Ràpid"
 
@@ -1635,7 +1685,7 @@ msgstr ""
 msgid "Flashing failed"
 msgstr ""
 
-msgid "Following tasks will be done after you press continue!"
+msgid "Following tasks will be done after you press OK!"
 msgstr ""
 
 msgid "Format"
@@ -1698,13 +1748,13 @@ msgstr "Enrutador"
 msgid "General AC3 Delay"
 msgstr ""
 
-msgid "General AC3 delay"
+msgid "General AC3 delay (ms)"
 msgstr ""
 
 msgid "General PCM Delay"
 msgstr ""
 
-msgid "General PCM delay"
+msgid "General PCM delay (ms)"
 msgstr ""
 
 msgid "Genre"
@@ -1848,6 +1898,9 @@ msgstr "Informació"
 msgid "Init"
 msgstr "Iniciar"
 
+msgid "Initial location in new timers"
+msgstr ""
+
 msgid "Initialization..."
 msgstr "Inicialització..."
 
@@ -1902,14 +1955,16 @@ msgstr ""
 msgid "Instant Record..."
 msgstr "Gravació instantània..."
 
+msgid "Instant record location"
+msgstr ""
+
 msgid "Integrated Ethernet"
 msgstr ""
 
 msgid "Integrated Wireless"
 msgstr ""
 
-#, python-format
-msgid "Interface: %s"
+msgid "Interface: "
 msgstr ""
 
 msgid "Intermediate"
@@ -2044,6 +2099,9 @@ msgstr ""
 msgid "Location"
 msgstr ""
 
+msgid "Location for instant recordings"
+msgstr ""
+
 msgid "Lock:"
 msgstr ""
 
@@ -2078,6 +2136,9 @@ msgstr "Fer que aquesta marca sigui un punt 'out'"
 msgid "Make this mark just a mark"
 msgstr "Fer que aquesta marca sigui només una marca"
 
+msgid "Manage extensions"
+msgstr ""
+
 msgid "Manage your receiver's software"
 msgstr ""
 
@@ -2096,8 +2157,7 @@ msgstr "Marge després de gravar"
 msgid "Margin before record (minutes)"
 msgstr "Marge abans de gravar (minuts)"
 
-#, python-format
-msgid "Max. Bitrate: %s"
+msgid "Max. Bitrate: "
 msgstr ""
 
 msgid "Media player"
@@ -2160,6 +2220,9 @@ msgstr "Moure a l'est"
 msgid "Move west"
 msgstr "Moure a l'oest"
 
+msgid "Movie location"
+msgstr ""
+
 msgid "Movielist menu"
 msgstr ""
 
@@ -2184,6 +2247,9 @@ msgstr "N/D"
 msgid "NEXT"
 msgstr "SEGÜENT"
 
+msgid "NFI Image Flashing"
+msgstr ""
+
 msgid "NFI image flashing completed. Press Yellow to Reboot!"
 msgstr ""
 
@@ -2304,9 +2370,17 @@ msgstr ""
 msgid "No event info found, recording indefinitely."
 msgstr "No hi ha info del programa, gravant indefinidament."
 
+msgid ""
+"No fast winding possible yet.. but you can use the number buttons to skip "
+"forward/backward!"
+msgstr ""
+
 msgid "No free tuner!"
 msgstr "No hi ha cap sintonitzador lliure!"
 
+msgid "No network connection available."
+msgstr ""
+
 msgid "No networks found"
 msgstr ""
 
@@ -2326,6 +2400,9 @@ msgstr "No s'ha trobat cap sintonitzador de satèŀlit!!"
 msgid "No tags are set on these movies."
 msgstr ""
 
+msgid "No to all"
+msgstr ""
+
 msgid "No tuner is configured for use with a diseqc positioner!"
 msgstr ""
 "No hi ha cap sintonitzador configurat per a utilitzar amb un motor diseqc!"
@@ -2465,6 +2542,9 @@ msgstr "Actualització online"
 msgid "Only Free scan"
 msgstr ""
 
+msgid "Only extensions."
+msgstr ""
+
 msgid "Optionally enter your name if you want to."
 msgstr ""
 
@@ -2478,9 +2558,6 @@ msgstr "PAL"
 msgid "PIDs"
 msgstr "PIDs"
 
-msgid "Package details for: "
-msgstr ""
-
 msgid "Package list update"
 msgstr "Actualització de la llista de paquets"
 
@@ -2745,9 +2822,6 @@ msgstr "Carregant la llista... espera..."
 msgid "Plugin browser"
 msgstr "Plugin navegador"
 
-msgid "Plugin manager"
-msgstr ""
-
 msgid "Plugin manager activity information"
 msgstr ""
 
@@ -2942,6 +3016,9 @@ msgstr "Arxius gravats..."
 msgid "Recording"
 msgstr "Gravant"
 
+msgid "Recording paths..."
+msgstr ""
+
 msgid "Recording(s) are in progress or coming up in few seconds!"
 msgstr ""
 
@@ -2954,9 +3031,6 @@ msgstr "Les gravacions tenen prioritat"
 msgid "Reenter new pin"
 msgstr "Torna a entrar el nou pin"
 
-msgid "Refresh"
-msgstr ""
-
 msgid "Refresh Rate"
 msgstr ""
 
@@ -3267,6 +3341,9 @@ msgstr "Buscar a l'est"
 msgid "Search west"
 msgstr "Buscar a l'oest"
 
+msgid "Searching for available updates. Please wait..."
+msgstr ""
+
 msgid "Searching for new installed or removed packages. Please wait..."
 msgstr ""
 
@@ -3465,6 +3542,9 @@ msgstr "Mostrar el reproductor de tv..."
 msgid "Shows the state of your wireless LAN connection.\n"
 msgstr ""
 
+msgid "Shutdown"
+msgstr ""
+
 msgid "Shutdown Dreambox after"
 msgstr "Apagar la Dreambox després de"
 
@@ -3538,7 +3618,7 @@ msgstr ""
 msgid "Software"
 msgstr ""
 
-msgid "Software manager"
+msgid "Software management"
 msgstr ""
 
 msgid "Software restore"
@@ -3727,6 +3807,9 @@ msgstr ""
 msgid "Tags"
 msgstr ""
 
+msgid "Temperature and Fan control"
+msgstr ""
+
 msgid "Terrestrial"
 msgstr "Terrestre"
 
@@ -3777,6 +3860,12 @@ msgstr "El backup ha fallat. Escull un altre destí."
 
 #, python-format
 msgid ""
+"The directory %s is not writable.\n"
+"Make sure you select a writable directory instead."
+msgstr ""
+
+#, python-format
+msgid ""
 "The following device was found:\n"
 "\n"
 "%s\n"
@@ -3866,16 +3955,19 @@ msgstr "L'assistent ha finalitzat."
 msgid "There are at least "
 msgstr ""
 
+msgid "There are currently no outstanding actions."
+msgstr ""
+
 msgid "There are no default services lists in your image."
 msgstr ""
 
 msgid "There are no default settings in your image."
 msgstr ""
 
-msgid "There are no"
+msgid "There are no updates available."
 msgstr ""
 
-msgid "There is nothing to be done."
+msgid "There are now "
 msgstr ""
 
 msgid ""
@@ -4014,6 +4106,9 @@ msgid ""
 "Please recheck it!"
 msgstr ""
 
+msgid "Timer record location"
+msgstr ""
+
 msgid "Timer sanity error"
 msgstr "Error de programació"
 
@@ -4026,6 +4121,9 @@ msgstr "Estat de la programació:"
 msgid "Timeshift"
 msgstr "Pausa"
 
+msgid "Timeshift location"
+msgstr ""
+
 msgid "Timeshift not possible!"
 msgstr "No és possible la pausa!"
 
@@ -4056,6 +4154,9 @@ msgstr ""
 msgid "Today"
 msgstr "Avui"
 
+msgid "Tone Amplitude"
+msgstr ""
+
 msgid "Tone mode"
 msgstr "Mode del to"
 
@@ -4170,14 +4271,13 @@ msgstr ""
 msgid "Uncommitted DiSEqC command"
 msgstr "Comanda DiSEqC no enviada"
 
-msgid ""
-"Undo\n"
-"Install"
+msgid "Undo install"
 msgstr ""
 
-msgid ""
-"Undo\n"
-"Remove"
+msgid "Undo uninstall"
+msgstr ""
+
+msgid "Unicable"
 msgstr ""
 
 msgid "Unicable LNB"
@@ -4186,6 +4286,9 @@ msgstr ""
 msgid "Unicable Martix"
 msgstr ""
 
+msgid "Uninstall"
+msgstr ""
+
 msgid "Universal LNB"
 msgstr "LNB universal"
 
@@ -4204,6 +4307,9 @@ msgstr "Actualitza el programari del receptor"
 msgid "Updating finished. Here is the result:"
 msgstr "Actualització acabada. Resultat:"
 
+msgid "Updating software catalog"
+msgstr ""
+
 msgid "Updating... Please wait... This can take some minutes..."
 msgstr "Actualitzant... espera... Pot trigar uns quants minuts..."
 
@@ -4546,6 +4652,9 @@ msgstr "Any"
 msgid "Yes"
 msgstr "Si"
 
+msgid "Yes to all"
+msgstr ""
+
 msgid "Yes, and delete this movie"
 msgstr ""
 
@@ -4593,6 +4702,9 @@ msgstr ""
 msgid "You can install this plugin."
 msgstr ""
 
+msgid "You can only burn Dreambox recordings!"
+msgstr ""
+
 msgid "You can remove this plugin."
 msgstr ""
 
@@ -4689,6 +4801,13 @@ msgid ""
 "\n"
 "Your internet connection is working now.\n"
 "\n"
+msgstr ""
+
+msgid ""
+"Your Dreambox is now ready to use.\n"
+"\n"
+"Your internet connection is working now.\n"
+"\n"
 "Please press OK to continue."
 msgstr ""
 
@@ -4793,6 +4912,9 @@ msgstr "per a començar"
 msgid "activate current configuration"
 msgstr ""
 
+msgid "activate network adapter configuration"
+msgstr ""
+
 msgid "add Provider"
 msgstr ""
 
@@ -5115,9 +5237,6 @@ msgstr "ajuda..."
 msgid "hidden network"
 msgstr ""
 
-msgid "hidden..."
-msgstr ""
-
 msgid "hide extended description"
 msgstr ""
 
@@ -5511,6 +5630,9 @@ msgstr "mostrar info del transponedor"
 msgid "shuffle playlist"
 msgstr "llista aleatòria"
 
+msgid "shut down"
+msgstr ""
+
 msgid "shutdown"
 msgstr "apagar"
 
index a7bbd8d..52a5e67 100755 (executable)
--- a/po/cs.po
+++ b/po/cs.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: \n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2009-11-05 18:09+0100\n"
+"POT-Creation-Date: 2009-12-28 20:46+0100\n"
 "PO-Revision-Date: 2008-09-28 18:09+0100\n"
 "Last-Translator: ws79 <ws79@centrum.cz>\n"
 "Language-Team: \n"
@@ -37,6 +37,11 @@ msgstr ""
 
 msgid ""
 "\n"
+"Manage extensions or plugins for your Dreambox"
+msgstr ""
+
+msgid ""
+"\n"
 "Online update of your Dreambox software."
 msgstr ""
 
@@ -62,7 +67,7 @@ msgstr ""
 
 msgid ""
 "\n"
-"Scan for local packages and install them."
+"Scan for local extensions and install them."
 msgstr ""
 
 msgid ""
@@ -76,11 +81,6 @@ msgid ""
 "System will restart after the restore!"
 msgstr ""
 
-msgid ""
-"\n"
-"View, install and remove available or installed packages."
-msgstr ""
-
 msgid " "
 msgstr " "
 
@@ -274,6 +274,15 @@ msgstr "8"
 msgid "9"
 msgstr "9"
 
+msgid "<Current movielist location>"
+msgstr ""
+
+msgid "<Default movie location>"
+msgstr ""
+
+msgid "<Last timer location>"
+msgstr ""
+
 msgid "<unknown>"
 msgstr "<neznámý>"
 
@@ -336,6 +345,15 @@ msgstr ""
 msgid "A required tool (%s) was not found."
 msgstr ""
 
+msgid "A search for available updates is currently in progress."
+msgstr ""
+
+msgid ""
+"A second configured interface has been found.\n"
+"\n"
+"Do you want to disable the second network interface?"
+msgstr ""
+
 msgid ""
 "A sleep timer wants to set your\n"
 "Dreambox to standby. Do that now?"
@@ -456,6 +474,12 @@ msgstr "Rozšířené"
 msgid "Advanced Options"
 msgstr ""
 
+msgid "Advanced Software"
+msgstr ""
+
+msgid "Advanced Software Plugin"
+msgstr ""
+
 msgid "Advanced Video Enhancement Setup"
 msgstr ""
 
@@ -946,9 +970,6 @@ msgstr "Sestava"
 msgid "Content does not fit on DVD!"
 msgstr ""
 
-msgid "Continue"
-msgstr ""
-
 msgid "Continue in background"
 msgstr ""
 
@@ -964,6 +985,9 @@ msgstr ""
 msgid "Could not load Medium! No disc inserted?"
 msgstr ""
 
+msgid "Could not open Picture in Picture"
+msgstr ""
+
 #, python-format
 msgid "Couldn't record due to conflicting timer %s"
 msgstr ""
@@ -1087,6 +1111,9 @@ msgstr ""
 msgid "Default Settings"
 msgstr ""
 
+msgid "Default movie location"
+msgstr ""
+
 msgid "Default services lists"
 msgstr "Standardní seznam programů"
 
@@ -1125,6 +1152,9 @@ msgstr ""
 msgid "Destination directory"
 msgstr ""
 
+msgid "Details for extension: "
+msgstr ""
+
 msgid "Detected HDD:"
 msgstr "Detekován HDD:"
 
@@ -1437,8 +1467,7 @@ msgstr ""
 msgid "Enabled"
 msgstr "Povoleno"
 
-#, python-format
-msgid "Encrypted: %s"
+msgid "Encrypted: "
 msgstr ""
 
 msgid "Encryption"
@@ -1567,9 +1596,18 @@ msgstr ""
 msgid "Extended Setup..."
 msgstr "Rozšířené nastavení..."
 
+msgid "Extended Software"
+msgstr ""
+
+msgid "Extended Software Plugin"
+msgstr ""
+
 msgid "Extensions"
 msgstr "Rozšíření"
 
+msgid "Extensions management"
+msgstr ""
+
 msgid "FEC"
 msgstr "FEC"
 
@@ -1579,6 +1617,18 @@ msgstr "Tovární nastavení"
 msgid "Failed"
 msgstr "Selhalo"
 
+#, python-format
+msgid "Fan %d"
+msgstr ""
+
+#, python-format
+msgid "Fan %d PWM"
+msgstr ""
+
+#, python-format
+msgid "Fan %d Voltage"
+msgstr ""
+
 msgid "Fast"
 msgstr "Rychlý"
 
@@ -1625,7 +1675,7 @@ msgstr ""
 msgid "Flashing failed"
 msgstr ""
 
-msgid "Following tasks will be done after you press continue!"
+msgid "Following tasks will be done after you press OK!"
 msgstr ""
 
 msgid "Format"
@@ -1687,13 +1737,13 @@ msgstr "Brána"
 msgid "General AC3 Delay"
 msgstr ""
 
-msgid "General AC3 delay"
+msgid "General AC3 delay (ms)"
 msgstr ""
 
 msgid "General PCM Delay"
 msgstr ""
 
-msgid "General PCM delay"
+msgid "General PCM delay (ms)"
 msgstr ""
 
 msgid "Genre"
@@ -1845,6 +1895,9 @@ msgstr "Informace"
 msgid "Init"
 msgstr "Init"
 
+msgid "Initial location in new timers"
+msgstr ""
+
 msgid "Initialization..."
 msgstr "Inicializace..."
 
@@ -1899,14 +1952,16 @@ msgstr "Instaluji balíčky. Prosím počkejte..."
 msgid "Instant Record..."
 msgstr "Okamžité nahrávání..."
 
+msgid "Instant record location"
+msgstr ""
+
 msgid "Integrated Ethernet"
 msgstr "Integrovaný ethernet"
 
 msgid "Integrated Wireless"
 msgstr ""
 
-#, python-format
-msgid "Interface: %s"
+msgid "Interface: "
 msgstr ""
 
 msgid "Intermediate"
@@ -2041,6 +2096,9 @@ msgstr "Lokální síť"
 msgid "Location"
 msgstr "Umístění"
 
+msgid "Location for instant recordings"
+msgstr ""
+
 msgid "Lock:"
 msgstr "Zámek:"
 
@@ -2074,6 +2132,9 @@ msgstr "Udělat z této značky 'out' point"
 msgid "Make this mark just a mark"
 msgstr "Udat z toho jen značku"
 
+msgid "Manage extensions"
+msgstr ""
+
 msgid "Manage your receiver's software"
 msgstr ""
 
@@ -2092,8 +2153,7 @@ msgstr "Rezerva po skončení pořadu"
 msgid "Margin before record (minutes)"
 msgstr "Rezerva před nahráváním (minuty)"
 
-#, python-format
-msgid "Max. Bitrate: %s"
+msgid "Max. Bitrate: "
 msgstr ""
 
 msgid "Media player"
@@ -2156,6 +2216,9 @@ msgstr "Posun východně"
 msgid "Move west"
 msgstr "Posun západně"
 
+msgid "Movie location"
+msgstr ""
+
 msgid "Movielist menu"
 msgstr "Filmové menu"
 
@@ -2180,6 +2243,9 @@ msgstr "Není k dispozici"
 msgid "NEXT"
 msgstr "DALŠÍ"
 
+msgid "NFI Image Flashing"
+msgstr ""
+
 msgid "NFI image flashing completed. Press Yellow to Reboot!"
 msgstr ""
 
@@ -2299,9 +2365,17 @@ msgstr ""
 msgid "No event info found, recording indefinitely."
 msgstr "Žádná informace o programu. Nahrávání do nekonečna."
 
+msgid ""
+"No fast winding possible yet.. but you can use the number buttons to skip "
+"forward/backward!"
+msgstr ""
+
 msgid "No free tuner!"
 msgstr "Žádný volný tuner!"
 
+msgid "No network connection available."
+msgstr ""
+
 msgid "No networks found"
 msgstr ""
 
@@ -2323,6 +2397,9 @@ msgstr "Žádný satelitní frontend nenalezen!"
 msgid "No tags are set on these movies."
 msgstr ""
 
+msgid "No to all"
+msgstr ""
+
 msgid "No tuner is configured for use with a diseqc positioner!"
 msgstr "Žádný tuner není nakofigurovat pro použití s diseqc positionerem!"
 
@@ -2464,6 +2541,9 @@ msgstr "Online-Upgrade"
 msgid "Only Free scan"
 msgstr ""
 
+msgid "Only extensions."
+msgstr ""
+
 msgid "Optionally enter your name if you want to."
 msgstr ""
 
@@ -2476,9 +2556,6 @@ msgstr "PAL"
 msgid "PIDs"
 msgstr "PIDy"
 
-msgid "Package details for: "
-msgstr ""
-
 msgid "Package list update"
 msgstr "Aktualizován seznam balíčků"
 
@@ -2743,9 +2820,6 @@ msgstr "Prosím čekejte... Načítá se seznam..."
 msgid "Plugin browser"
 msgstr "Prohlížeč pluginů"
 
-msgid "Plugin manager"
-msgstr ""
-
 msgid "Plugin manager activity information"
 msgstr ""
 
@@ -2940,6 +3014,9 @@ msgstr "Nahrané pořady..."
 msgid "Recording"
 msgstr "Nahrávání"
 
+msgid "Recording paths..."
+msgstr ""
+
 msgid "Recording(s) are in progress or coming up in few seconds!"
 msgstr ""
 
@@ -2952,9 +3029,6 @@ msgstr "Nahrávání má vždy prioritu"
 msgid "Reenter new pin"
 msgstr "Zadejte znova PIN"
 
-msgid "Refresh"
-msgstr ""
-
 msgid "Refresh Rate"
 msgstr "Obnovovací frekvence"
 
@@ -3268,6 +3342,9 @@ msgstr "Hledej východ"
 msgid "Search west"
 msgstr "Hledej západ"
 
+msgid "Searching for available updates. Please wait..."
+msgstr ""
+
 msgid "Searching for new installed or removed packages. Please wait..."
 msgstr ""
 
@@ -3466,6 +3543,9 @@ msgstr "Zobrazit TV..."
 msgid "Shows the state of your wireless LAN connection.\n"
 msgstr "Zobrazit stav vaší bezdrátové sítě.\n"
 
+msgid "Shutdown"
+msgstr ""
+
 msgid "Shutdown Dreambox after"
 msgstr "Vypnout Dreambox po"
 
@@ -3539,7 +3619,7 @@ msgstr "Rychlosti zpomaleného filmu"
 msgid "Software"
 msgstr ""
 
-msgid "Software manager"
+msgid "Software management"
 msgstr ""
 
 msgid "Software restore"
@@ -3733,6 +3813,9 @@ msgstr ""
 msgid "Tags"
 msgstr ""
 
+msgid "Temperature and Fan control"
+msgstr ""
+
 msgid "Terrestrial"
 msgstr "Pozemní"
 
@@ -3782,6 +3865,12 @@ msgstr "Zálohování selhalo. Prosím vyberte jiné umístění zálohy."
 
 #, python-format
 msgid ""
+"The directory %s is not writable.\n"
+"Make sure you select a writable directory instead."
+msgstr ""
+
+#, python-format
+msgid ""
 "The following device was found:\n"
 "\n"
 "%s\n"
@@ -3875,16 +3964,19 @@ msgstr "Průvodce skončil."
 msgid "There are at least "
 msgstr ""
 
+msgid "There are currently no outstanding actions."
+msgstr ""
+
 msgid "There are no default services lists in your image."
 msgstr "Nejsou na výběr žádné settingy. "
 
 msgid "There are no default settings in your image."
 msgstr "Nejsou žádné standardní nastavení ve vaší image."
 
-msgid "There are no"
+msgid "There are no updates available."
 msgstr ""
 
-msgid "There is nothing to be done."
+msgid "There are now "
 msgstr ""
 
 msgid ""
@@ -4045,6 +4137,9 @@ msgid ""
 "Please recheck it!"
 msgstr ""
 
+msgid "Timer record location"
+msgstr ""
+
 msgid "Timer sanity error"
 msgstr "Nelogické časování"
 
@@ -4057,6 +4152,9 @@ msgstr "Stav časovače:"
 msgid "Timeshift"
 msgstr "Timeshift"
 
+msgid "Timeshift location"
+msgstr ""
+
 msgid "Timeshift not possible!"
 msgstr "Časový posun není možný!"
 
@@ -4087,6 +4185,9 @@ msgstr ""
 msgid "Today"
 msgstr "Dnes"
 
+msgid "Tone Amplitude"
+msgstr ""
+
 msgid "Tone mode"
 msgstr "Mód tónu"
 
@@ -4202,14 +4303,13 @@ msgstr ""
 msgid "Uncommitted DiSEqC command"
 msgstr "Nepotvrzený DiSEqC příkaz"
 
-msgid ""
-"Undo\n"
-"Install"
+msgid "Undo install"
 msgstr ""
 
-msgid ""
-"Undo\n"
-"Remove"
+msgid "Undo uninstall"
+msgstr ""
+
+msgid "Unicable"
 msgstr ""
 
 msgid "Unicable LNB"
@@ -4218,6 +4318,9 @@ msgstr ""
 msgid "Unicable Martix"
 msgstr ""
 
+msgid "Uninstall"
+msgstr ""
+
 msgid "Universal LNB"
 msgstr "Univerzální LNB"
 
@@ -4236,6 +4339,9 @@ msgstr "Aktualizujte software vašeho přijmače"
 msgid "Updating finished. Here is the result:"
 msgstr "Aktualizace hotova. Tady je výsledek:"
 
+msgid "Updating software catalog"
+msgstr ""
+
 msgid "Updating... Please wait... This can take some minutes..."
 msgstr "Aktualizují... Prosím čekejte... Toto může trvat několik minut..."
 
@@ -4584,6 +4690,9 @@ msgstr "Rok"
 msgid "Yes"
 msgstr "Ano"
 
+msgid "Yes to all"
+msgstr ""
+
 msgid "Yes, and delete this movie"
 msgstr ""
 
@@ -4633,6 +4742,9 @@ msgstr "Můžete si vybrat, co chcete nainstalovat..."
 msgid "You can install this plugin."
 msgstr ""
 
+msgid "You can only burn Dreambox recordings!"
+msgstr ""
+
 msgid "You can remove this plugin."
 msgstr ""
 
@@ -4731,6 +4843,13 @@ msgid ""
 "\n"
 "Your internet connection is working now.\n"
 "\n"
+msgstr ""
+
+msgid ""
+"Your Dreambox is now ready to use.\n"
+"\n"
+"Your internet connection is working now.\n"
+"\n"
 "Please press OK to continue."
 msgstr ""
 
@@ -4836,6 +4955,9 @@ msgstr "právě začne"
 msgid "activate current configuration"
 msgstr ""
 
+msgid "activate network adapter configuration"
+msgstr ""
+
 msgid "add Provider"
 msgstr ""
 
@@ -5158,9 +5280,6 @@ msgstr "Pomoc..."
 msgid "hidden network"
 msgstr ""
 
-msgid "hidden..."
-msgstr ""
-
 msgid "hide extended description"
 msgstr "skrýt rozšířený popis"
 
@@ -5551,6 +5670,9 @@ msgstr "Zobraz info o transpondéru"
 msgid "shuffle playlist"
 msgstr "promíchat playlist"
 
+msgid "shut down"
+msgstr ""
+
 msgid "shutdown"
 msgstr "vypnout"
 
index f3c1fa4..5b58a94 100755 (executable)
--- a/po/da.po
+++ b/po/da.po
@@ -1,8 +1,9 @@
+# 
 msgid ""
 msgstr ""
 "Project-Id-Version: Enigma2\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2009-11-05 18:09+0100\n"
+"POT-Creation-Date: 2009-12-28 20:46+0100\n"
 "PO-Revision-Date: 2009-09-04 07:50+0100\n"
 "Last-Translator: Ingmar Jørgensen <dreambox@ingmar.dk>\n"
 "Language-Team: jazzydane <dreambox@ingmar.dk>\n"
@@ -11,8 +12,8 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 "X-Poedit-Language: Danish\n"
-"X-Poedit-Country: DENMARK\n"
 "X-Poedit-SourceCharset: iso-8859-15\n"
+"X-Poedit-Country: DENMARK\n"
 
 msgid ""
 "\n"
@@ -44,6 +45,11 @@ msgstr ""
 
 msgid ""
 "\n"
+"Manage extensions or plugins for your Dreambox"
+msgstr ""
+
+msgid ""
+"\n"
 "Online update of your Dreambox software."
 msgstr ""
 "\n"
@@ -79,10 +85,8 @@ msgstr ""
 
 msgid ""
 "\n"
-"Scan for local packages and install them."
+"Scan for local extensions and install them."
 msgstr ""
-"\n"
-"Scan efter lokale pakker og installer dem."
 
 msgid ""
 "\n"
@@ -100,13 +104,6 @@ msgstr ""
 "\n"
 "Systemet vil genstarte efter gendannelsen!"
 
-msgid ""
-"\n"
-"View, install and remove available or installed packages."
-msgstr ""
-"\n"
-"Se, installer og fjern nuværende eller installerede pakker."
-
 msgid " "
 msgstr " "
 
@@ -120,7 +117,7 @@ msgid &q