Merge remote branch 'remotes/origin/fantempplugin'
authorghost <andreas.monzner@multimedia-labs.de>
Tue, 5 Jan 2010 18:01:59 +0000 (19:01 +0100)
committerghost <andreas.monzner@multimedia-labs.de>
Tue, 5 Jan 2010 18:01:59 +0000 (19:01 +0100)
178 files changed:
Navigation.py
RecordTimer.py
configure.ac
data/defaults/Dream/userbouquet.favourites.tv
data/keymap.xml
data/menu.xml
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]
data/skin_default/icons/dish.png
data/skin_default/unhandled-key.png [new file with mode: 0644]
lib/actions/action.cpp
lib/base/elock.h
lib/base/filepush.cpp
lib/driver/rc.cpp
lib/driver/rc.h
lib/driver/rcconsole.cpp
lib/driver/rcinput.cpp
lib/driver/rcinput.h
lib/dvb/decoder.cpp
lib/dvb/decoder.h
lib/dvb/dvb.cpp
lib/dvb/epgcache.cpp
lib/dvb/epgcache.h
lib/dvb/idvb.h
lib/dvb/lowlevel/mhw.h
lib/dvb/pmt.cpp
lib/dvb/pmt.h
lib/dvb/pvrparse.cpp
lib/dvb/tstools.cpp
lib/dvb/tstools.h
lib/python/Components/ChoiceList.py [changed mode: 0644->0755]
lib/python/Components/ConfigList.py [changed mode: 0644->0755]
lib/python/Components/EpgList.py [changed mode: 0644->0755]
lib/python/Components/FileList.py
lib/python/Components/Harddisk.py
lib/python/Components/Lcd.py
lib/python/Components/MediaPlayer.py [changed mode: 0644->0755]
lib/python/Components/Network.py
lib/python/Components/NimManager.py
lib/python/Components/ParentalControl.py [changed mode: 0644->0755]
lib/python/Components/SelectionList.py [changed mode: 0644->0755]
lib/python/Components/ServiceList.py [changed mode: 0644->0755]
lib/python/Components/SystemInfo.py
lib/python/Components/TimerList.py [changed mode: 0644->0755]
lib/python/Components/UsageConfig.py
lib/python/Components/config.py
lib/python/Plugins/Extensions/CutListEditor/meta/plugin_cutlisteditor.xml [changed mode: 0644->0755]
lib/python/Plugins/Extensions/CutListEditor/plugin.py
lib/python/Plugins/Extensions/DVDBurn/Process.py
lib/python/Plugins/Extensions/DVDBurn/ProjectSettings.py
lib/python/Plugins/Extensions/DVDBurn/TitleList.py
lib/python/Plugins/Extensions/DVDBurn/TitleProperties.py
lib/python/Plugins/Extensions/DVDBurn/meta/Makefile.am
lib/python/Plugins/Extensions/DVDBurn/meta/dvdburn_de.jpg [new file with mode: 0755]
lib/python/Plugins/Extensions/DVDBurn/meta/dvdburn_en.jpg [new file with mode: 0755]
lib/python/Plugins/Extensions/DVDBurn/meta/plugin_dvdburn.xml [changed mode: 0644->0755]
lib/python/Plugins/Extensions/DVDPlayer/meta/plugin_dvdplayer.xml [changed mode: 0644->0755]
lib/python/Plugins/Extensions/DVDPlayer/src/servicedvd.cpp
lib/python/Plugins/Extensions/GraphMultiEPG/GraphMultiEpg.py [changed mode: 0644->0755]
lib/python/Plugins/Extensions/GraphMultiEPG/meta/graphmultiepg_de.jpg [changed mode: 0644->0755]
lib/python/Plugins/Extensions/GraphMultiEPG/meta/graphmultiepg_en.jpg [changed mode: 0644->0755]
lib/python/Plugins/Extensions/GraphMultiEPG/meta/plugin_graphmultiepg.xml [changed mode: 0644->0755]
lib/python/Plugins/Extensions/MediaPlayer/meta/mediaplayer_de.jpg [changed mode: 0644->0755]
lib/python/Plugins/Extensions/MediaPlayer/meta/mediaplayer_en.jpg [changed mode: 0644->0755]
lib/python/Plugins/Extensions/MediaPlayer/meta/plugin_mediaplayer.xml [changed mode: 0644->0755]
lib/python/Plugins/Extensions/MediaPlayer/plugin.py [changed mode: 0644->0755]
lib/python/Plugins/Extensions/MediaScanner/meta/Makefile.am
lib/python/Plugins/Extensions/MediaScanner/meta/mediascanner_de.jpg [new file with mode: 0755]
lib/python/Plugins/Extensions/MediaScanner/meta/mediascanner_en.jpg [new file with mode: 0755]
lib/python/Plugins/Extensions/MediaScanner/meta/plugin_mediascanner.xml [changed mode: 0644->0755]
lib/python/Plugins/Extensions/PicturePlayer/meta/plugin_pictureplayer.xml [changed mode: 0644->0755]
lib/python/Plugins/Plugin.py
lib/python/Plugins/SystemPlugins/CleanupWizard/meta/Makefile.am
lib/python/Plugins/SystemPlugins/CleanupWizard/meta/cleanupwizard_de.jpg [new file with mode: 0755]
lib/python/Plugins/SystemPlugins/CleanupWizard/meta/cleanupwizard_en.jpg [new file with mode: 0755]
lib/python/Plugins/SystemPlugins/CleanupWizard/meta/plugin_cleanupwizard.xml
lib/python/Plugins/SystemPlugins/CommonInterfaceAssignment/meta/ciassignment.jpg [changed mode: 0644->0755]
lib/python/Plugins/SystemPlugins/CommonInterfaceAssignment/meta/plugin_commoninterfaceassignment.xml [changed mode: 0644->0755]
lib/python/Plugins/SystemPlugins/CrashlogAutoSubmit/meta/Makefile.am
lib/python/Plugins/SystemPlugins/CrashlogAutoSubmit/meta/crashlogautosubmit_de.jpg [new file with mode: 0755]
lib/python/Plugins/SystemPlugins/CrashlogAutoSubmit/meta/crashlogautosubmit_en.jpg [new file with mode: 0755]
lib/python/Plugins/SystemPlugins/CrashlogAutoSubmit/meta/plugin_crashlogautosubmit.xml [changed mode: 0644->0755]
lib/python/Plugins/SystemPlugins/DefaultServicesScanner/meta/defaultservicescanner.jpg [changed mode: 0644->0755]
lib/python/Plugins/SystemPlugins/DefaultServicesScanner/meta/plugin_defaultservicesscanner.xml [changed mode: 0644->0755]
lib/python/Plugins/SystemPlugins/DiseqcTester/meta/Makefile.am
lib/python/Plugins/SystemPlugins/DiseqcTester/meta/diseqctester.jpg [deleted file]
lib/python/Plugins/SystemPlugins/DiseqcTester/meta/diseqctester_de.jpg [new file with mode: 0755]
lib/python/Plugins/SystemPlugins/DiseqcTester/meta/diseqctester_en.jpg [new file with mode: 0755]
lib/python/Plugins/SystemPlugins/DiseqcTester/meta/plugin_diseqctester.xml [changed mode: 0644->0755]
lib/python/Plugins/SystemPlugins/NFIFlash/meta/Makefile.am
lib/python/Plugins/SystemPlugins/NFIFlash/meta/nfiflash.jpg [deleted file]
lib/python/Plugins/SystemPlugins/NFIFlash/meta/nfiflash_de.jpg [new file with mode: 0755]
lib/python/Plugins/SystemPlugins/NFIFlash/meta/nfiflash_en.jpg [new file with mode: 0755]
lib/python/Plugins/SystemPlugins/NFIFlash/meta/plugin_nfiflash.xml [changed mode: 0644->0755]
lib/python/Plugins/SystemPlugins/NFIFlash/plugin.py [changed mode: 0644->0755]
lib/python/Plugins/SystemPlugins/NetworkWizard/NetworkWizard.py
lib/python/Plugins/SystemPlugins/NetworkWizard/meta/Makefile.am
lib/python/Plugins/SystemPlugins/NetworkWizard/meta/networkwizard_de.jpg [new file with mode: 0755]
lib/python/Plugins/SystemPlugins/NetworkWizard/meta/networkwizard_en.jpg [new file with mode: 0755]
lib/python/Plugins/SystemPlugins/NetworkWizard/meta/plugin_networkwizard.xml
lib/python/Plugins/SystemPlugins/NetworkWizard/networkwizard.xml
lib/python/Plugins/SystemPlugins/PositionerSetup/meta/plugin_positionersetup.xml [changed mode: 0644->0755]
lib/python/Plugins/SystemPlugins/PositionerSetup/meta/positionersetup.jpg [changed mode: 0644->0755]
lib/python/Plugins/SystemPlugins/SatelliteEquipmentControl/meta/plugin_satelliteequipmentcontrol.xml [changed mode: 0644->0755]
lib/python/Plugins/SystemPlugins/SatelliteEquipmentControl/meta/satcontrol.jpg [changed mode: 0644->0755]
lib/python/Plugins/SystemPlugins/Satfinder/meta/plugin_satfinder.xml [changed mode: 0644->0755]
lib/python/Plugins/SystemPlugins/Satfinder/meta/satfinder.jpg [changed mode: 0644->0755]
lib/python/Plugins/SystemPlugins/SkinSelector/meta/Makefile.am
lib/python/Plugins/SystemPlugins/SkinSelector/meta/plugin_skinselector.xml [changed mode: 0644->0755]
lib/python/Plugins/SystemPlugins/SkinSelector/meta/skinselector.jpg [deleted file]
lib/python/Plugins/SystemPlugins/SkinSelector/meta/skinselector_de.jpg [new file with mode: 0755]
lib/python/Plugins/SystemPlugins/SkinSelector/meta/skinselector_en.jpg [new file with mode: 0755]
lib/python/Plugins/SystemPlugins/SoftwareManager/BackupRestore.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/meta/Makefile.am
lib/python/Plugins/SystemPlugins/SoftwareManager/meta/plugin_softwaremanager.xml [changed mode: 0644->0755]
lib/python/Plugins/SystemPlugins/SoftwareManager/meta/softmanager.jpg [deleted file]
lib/python/Plugins/SystemPlugins/SoftwareManager/meta/softwaremanager_de.jpg [new file with mode: 0755]
lib/python/Plugins/SystemPlugins/SoftwareManager/meta/softwaremanager_en.jpg [new file with mode: 0755]
lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py
lib/python/Plugins/SystemPlugins/VideoEnhancement/meta/Makefile.am
lib/python/Plugins/SystemPlugins/VideoEnhancement/meta/plugin_videoenhancement.xml
lib/python/Plugins/SystemPlugins/VideoEnhancement/meta/videoenhancement.jpg [deleted file]
lib/python/Plugins/SystemPlugins/VideoEnhancement/meta/videoenhancement_de.jpg [new file with mode: 0755]
lib/python/Plugins/SystemPlugins/VideoEnhancement/meta/videoenhancement_en.jpg [new file with mode: 0755]
lib/python/Plugins/SystemPlugins/VideoTune/meta/plugin_videotune.xml [changed mode: 0644->0755]
lib/python/Plugins/SystemPlugins/Videomode/VideoWizard.py
lib/python/Plugins/SystemPlugins/Videomode/meta/Makefile.am
lib/python/Plugins/SystemPlugins/Videomode/meta/plugin_videomode.xml [changed mode: 0644->0755]
lib/python/Plugins/SystemPlugins/Videomode/meta/videomode.jpg [deleted file]
lib/python/Plugins/SystemPlugins/Videomode/meta/videomode_de.jpg [new file with mode: 0755]
lib/python/Plugins/SystemPlugins/Videomode/meta/videomode_en.jpg [new file with mode: 0755]
lib/python/Plugins/SystemPlugins/Videomode/videowizard.xml
lib/python/Plugins/SystemPlugins/WirelessLan/Makefile.am
lib/python/Plugins/SystemPlugins/WirelessLan/Wlan.py
lib/python/Plugins/SystemPlugins/WirelessLan/meta/Makefile.am [new file with mode: 0755]
lib/python/Plugins/SystemPlugins/WirelessLan/meta/plugin_wirelesslan.xml [new file with mode: 0755]
lib/python/Plugins/SystemPlugins/WirelessLan/meta/wirelesslan_de.jpg [new file with mode: 0755]
lib/python/Plugins/SystemPlugins/WirelessLan/meta/wirelesslan_en.jpg [new file with mode: 0755]
lib/python/Plugins/SystemPlugins/WirelessLan/plugin.py
lib/python/Plugins/newplugin.py
lib/python/Screens/ChannelSelection.py
lib/python/Screens/EpgSelection.py
lib/python/Screens/EventView.py
lib/python/Screens/InfoBar.py
lib/python/Screens/InfoBarGenerics.py
lib/python/Screens/LanguageSelection.py [changed mode: 0644->0755]
lib/python/Screens/LocationBox.py
lib/python/Screens/Makefile.am
lib/python/Screens/Menu.py
lib/python/Screens/MessageBox.py
lib/python/Screens/MovieSelection.py
lib/python/Screens/NetworkSetup.py
lib/python/Screens/PluginBrowser.py
lib/python/Screens/RdsDisplay.py [changed mode: 0644->0755]
lib/python/Screens/RecordPaths.py [new file with mode: 0644]
lib/python/Screens/Satconfig.py
lib/python/Screens/ScanSetup.py
lib/python/Screens/Scart.py
lib/python/Screens/SleepTimerEdit.py
lib/python/Screens/TaskView.py
lib/python/Screens/TimerEdit.py
lib/python/Screens/TimerEntry.py
lib/python/Screens/UnhandledKey.py [new file with mode: 0644]
lib/python/Screens/VirtualKeyBoard.py
lib/python/Screens/Wizard.py
lib/python/Tools/Directories.py
lib/service/servicedvb.cpp
lib/service/servicedvb.h
lib/service/servicemp3.cpp
lib/service/servicemp3.h
lib/service/servicexine.cpp
mytest.py
skin.py [changed mode: 0644->0755]
tools/genmetaindex.py

index 2ca87f6..2437bbf 100644 (file)
@@ -50,9 +50,9 @@ class Navigation:
                for x in self.record_event:
                        x(rec_service, event)
 
-       def playService(self, ref, checkParentalControl = True):
+       def playService(self, ref, checkParentalControl = True, forceRestart = False):
                oldref = self.currentlyPlayingServiceReference
-               if ref and oldref and ref == oldref:
+               if ref and oldref and ref == oldref and not forceRestart:
                        print "ignore request to play already running service"
                        return 0
                print "playing", ref and ref.toString()
index 4907f64..f670417 100644 (file)
@@ -2,6 +2,7 @@ from enigma import eEPGCache, getBestPlayableServiceReference, \
        eServiceReference, iRecordableService, quitMainloop
 
 from Components.config import config
+from Components.UsageConfig import defaultMoviePath
 from Components.TimerSanityCheck import TimerSanityCheck
 
 from Screens.MessageBox import MessageBox
@@ -141,11 +142,13 @@ class RecordTimerEntry(timer.TimerEntry, object):
                if config.recording.ascii_filenames.value:
                        filename = ASCIItranslit.legacyEncode(filename)
 
-               if self.dirname and not Directories.fileExists(self.dirname, 'w'):
-                       self.dirnameHadToFallback = True
-                       self.Filename = Directories.getRecordingFilename(filename, None)
+               if not self.dirname or not Directories.fileExists(self.dirname, 'w'):
+                       if self.dirname:
+                               self.dirnameHadToFallback = True
+                       dirname = defaultMoviePath()
                else:
-                       self.Filename = Directories.getRecordingFilename(filename, self.dirname)
+                       dirname = self.dirname
+               self.Filename = Directories.getRecordingFilename(filename, dirname)
                self.log(0, "Filename calculated as: '%s'" % self.Filename)
                #begin_date + " - " + service_name + description)
 
index 1880100..aa2fa3e 100755 (executable)
@@ -177,6 +177,7 @@ lib/python/Plugins/SystemPlugins/VideoTune/meta/Makefile
 lib/python/Plugins/SystemPlugins/Videomode/Makefile
 lib/python/Plugins/SystemPlugins/Videomode/meta/Makefile
 lib/python/Plugins/SystemPlugins/WirelessLan/Makefile
+lib/python/Plugins/SystemPlugins/WirelessLan/meta/Makefile
 lib/python/Tools/Makefile
 lib/service/Makefile
 lib/components/Makefile
index f1adaf9..cc5e9fe 100644 (file)
@@ -10,7 +10,7 @@
 #SERVICE 1:0:1:33:21:85:C00000:0:0:0:\r
 #SERVICE 1:0:1:701:5:85:C00000:0:0:0:\r
 #SERVICE 1:0:1:2F1C:441:1:C00000:0:0:0:\r
-#SERVICE 1:0:1:7005:436:1:C00000:0:0:0:\r
+#SERVICE 1:0:1:6D6E:437:1:C00000:0:0:0:\r
 #SERVICE 1:0:1:2FC:5:85:C00000:0:0:0:\r
 #SERVICE 1:0:1:F98:454:1:C00000:0:0:0:\r
 #SERVICE 1:0:1:7034:41B:1:C00000:0:0:0:\r
@@ -26,7 +26,6 @@
 #SERVICE 1:64:B:0:0:0:0:0:0:0::Doku/Wissen/Themen\r
 #DESCRIPTION Doku/Wissen/Themen\r
 #SERVICE 1:0:1:6DD0:44D:1:C00000:0:0:0:\r
-#SERVICE 1:0:1:6D6E:437:1:C00000:0:0:0:\r
 #SERVICE 1:0:1:6D6B:437:1:C00000:0:0:0:\r
 #SERVICE 1:0:1:2775:444:1:C00000:0:0:0:\r
 #SERVICE 1:0:1:293:5:85:C00000:0:0:0:\r
@@ -77,8 +76,6 @@
 #SERVICE 1:64:5:0:0:0:0:0:0:0::Reisen\r
 #DESCRIPTION Reisen\r
 #SERVICE 1:0:1:20:21:85:C00000:0:0:0:\r
-#SERVICE 1:0:1:3339:45B:1:C00000:0:0:0:\r
-#SERVICE 1:0:1:27B9:444:1:C00000:0:0:0:\r
 #SERVICE 1:64:9:0:0:0:0:0:0:0::Beratung\r
 #DESCRIPTION Beratung\r
 #SERVICE 1:0:1:295:21:85:C00000:0:0:0:\r
@@ -92,7 +89,6 @@
 #SERVICE 1:0:1:36:7:85:C00000:0:0:0:\r
 #SERVICE 1:0:1:307:7:85:C00000:0:0:0:\r
 #SERVICE 1:0:1:296:5:85:C00000:0:0:0:\r
-#SERVICE 1:0:1:2791:444:1:C00000:0:0:0:\r
 #SERVICE 1:0:1:383:21:85:C00000:0:0:0:\r
 #SERVICE 1:0:1:313C:459:1:C00000:0:0:0:\r
 #SERVICE 1:0:1:3159:459:1:C00000:0:0:0:\r
 #SERVICE 1:0:19:2B66:3F3:1:C00000:0:0:0:\r
 #SERVICE 1:0:19:2B70:3F3:1:C00000:0:0:0:\r
 #SERVICE 1:0:19:6EEC:4B1:1:C00000:0:0:0:\r
-#SERVICE 1:0:19:1324:3EF:1:C00000:0:0:0:\r
-#SERVICE 1:0:19:1325:3EF:1:C00000:0:0:0:\r
+#SERVICE 1:0:19:EF12:421:1:C00000:0:0:0:\r
 #SERVICE 1:0:19:2B84:3F3:1:C00000:0:0:0:\r
+#SERVICE 1:0:19:EF13:421:1:C00000:0:0:0:\r
 #SERVICE 1:64:0:0:0:0:0:0:0:0::Alternativen\r
 #DESCRIPTION Alternativen\r
 #SERVICE 1:0:1:6DCB:44D:1:C00000:0:0:0:\r
index 25538f8..9461d50 100755 (executable)
                <key id="KEY_BLUE" mapto="extensions" flags="b" />
        </map>
        
+       <map context="SatlistShortcutAction">
+               <key id="KEY_BLUE" mapto="nothingconnected" flags="b" />
+       </map>
+       
        <map context="InfobarChannelSelection">
                <key id="KEY_LEFT" mapto="zapUp" flags="mr" />
                <key id="KEY_RIGHT" mapto="zapDown" flags="mr" />
index c7fb889..59195f1 100644 (file)
@@ -70,7 +70,7 @@
                                        <item level="1" text="Device Setup..." entryID="device_setup"><screen module="NetworkSetup" screen="NetworkAdapterSelection"/></item>
                                        <item level="1" text="Nameserver Setup..." entryID="dns_setup"><screen module="NetworkSetup" screen="NameserverSetup"/></item>
                                </menu>-->
-                               <item level="2" text="Timeshift path..." entryId="timeshift_path"><screen module="LocationBox" screen="TimeshiftLocationBox" /></item>
+                               <item level="2" text="Recording paths..." entryId="RecordPaths"><screen module="RecordPaths" screen="RecordPathsSettings" /></item>
                        </menu>
                        <item weight="10" level="1" text="Common Interface" entryID="ci_setup" requires="CommonInterface"><screen module="Ci" screen="CiSelection" /></item>
                        <item weight="15" level="0" text="Parental control" entryID="parental_setup"><screen module="ParentalControlSetup" screen="ParentalControlSetup" /></item>
@@ -104,6 +104,7 @@ self.session.openWithCallback(msgClosed, FactoryReset)
                        <item text="Standby" entryID="standby"><screen module="Standby" screen="Standby"/></item>
                        <item text="Restart" entryID="restart"><screen module="Standby" screen="TryQuitMainloop">2</screen></item>
                        <item level="2" text="Restart GUI" entryID="restart_enigma"><screen module="Standby" screen="TryQuitMainloop">3</screen></item>
-                       <item text="Deep Standby" entryID="deep_standby"><screen module="Standby" screen="TryQuitMainloop">1</screen></item>
+                       <item text="Deep Standby" requires="DeepstandbySupport" entryID="deep_standby"><screen module="Standby" screen="TryQuitMainloop">1</screen></item>
+                       <item text="Shutdown" requires="!DeepstandbySupport" entryID="deep_standby"><screen module="Standby" screen="TryQuitMainloop">1</screen></item>
                </menu>
 </menu>
index 16504ab..85c4016 100755 (executable)
@@ -43,7 +43,9 @@
                <widget source="Adaptertext" render="Label" position="10,355" size="120,21" zPosition="10" font="Regular;20" halign="left" backgroundColor="#25062748" transparent="1" />
                <widget source="Adapter" render="Label" position="120,355" size="400,21" zPosition="10" font="Regular;20" halign="left" backgroundColor="#25062748" transparent="1" />
                <widget source="introduction2" render="Label" position="10,380" size="540,21" zPosition="10" font="Regular;21" halign="center" valign="center" backgroundColor="#25062748" transparent="1"/>
-               <widget name="VKeyIcon" pixmap="skin_default/buttons/key_text.png" position="10,380" zPosition="10" size="35,25" transparent="1" alphatest="on" />
+               <widget source="VKeyIcon" render="Pixmap" pixmap="skin_default/buttons/key_text.png" position="10,380" zPosition="10" size="35,25" transparent="1" alphatest="on" >
+                       <convert type="ConditionalShowHide" />
+               </widget>
                <widget name="HelpWindow" pixmap="skin_default/vkey_icon.png" position="160,315" zPosition="1" size="1,1" transparent="1" alphatest="on" />
        </screen>
 
@@ -68,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">
@@ -248,9 +250,13 @@ self.instance.move(ePoint((720-wsizex)/2, (576-wsizey)/(count &gt; 7 and 2 or 3)
                        <widget name="arrowup2" pixmap="skin_default/arrowup.png" position="-100,-100" zPosition="11" size="37,70" transparent="1" alphatest="on"/>
        </screen>
        <!-- Dish -->
-       <screen name="Dish" flags="wfNoBorder" position="300,100" size="130,160" title="Dish" zPosition="-1" backgroundColor="transparent">
+       <screen name="Dish" flags="wfNoBorder" position="300,100" size="130,160" title="Dish" zPosition="100" backgroundColor="transparent">
                <widget name="Dishpixmap" pixmap="skin_default/icons/dish.png" position="0,0" size="130,160" alphatest="off" />
        </screen>
+       <!-- unhandled key pressed -->
+       <screen name="UnhandledKey" flags="wfNoBorder" position="620,50" size="34,45" title="UnhandledKey" zPosition="100" backgroundColor="transparent">
+               <widget name="UnhandledKeyPixmap" pixmap="skin_default/unhandled-key.png" position="0,0" size="34,45" alphatest="off" />
+       </screen>
        <!-- EPG Selection - Single -->
        <screen name="EPGSelection" position="center,center" size="560,430" title="EPG Selection">
                <ePixmap pixmap="skin_default/buttons/red.png" position="0,0" size="140,40" alphatest="on" />
old mode 100644 (file)
new mode 100755 (executable)
index e2d2abc..9e9b7cd
@@ -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 \
@@ -50,6 +51,7 @@ dist_install_DATA = \
        sleeptimer.png \
        timeline-now.png \
        timeline.png \
+       unhandled-key.png \
        verticalline-plugins.png \
        vkey_backspace.png \
        vkey_bg.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 f3c6548..6148e07 100644 (file)
Binary files a/data/skin_default/icons/dish.png and b/data/skin_default/icons/dish.png differ
diff --git a/data/skin_default/unhandled-key.png b/data/skin_default/unhandled-key.png
new file mode 100644 (file)
index 0000000..8e54349
Binary files /dev/null and b/data/skin_default/unhandled-key.png differ
index 0eb4cdb..a2d85ff 100644 (file)
@@ -208,7 +208,7 @@ void eActionMap::keyPressed(const std::string &device, int key, int flags)
                                }
                        } else
                        {
-                               eDebug("wildcard.");
+//                             eDebug("wildcard.");
                                ePyObject pArgs = PyTuple_New(2);
                                PyTuple_SET_ITEM(pArgs, 0, PyInt_FromLong(key));
                                PyTuple_SET_ITEM(pArgs, 1, PyInt_FromLong(flags));
index 51582e6..0175718 100644 (file)
@@ -83,9 +83,18 @@ class eSingleLock
        pthread_mutex_t m_lock;
        eSingleLock(eSingleLock &);
 public:
-       eSingleLock()
+       eSingleLock(bool recursive=false)
        {
-               pthread_mutex_init(&m_lock, 0);
+               if (recursive)
+               {
+                       pthread_mutexattr_t attr;
+                       pthread_mutexattr_init(&attr);
+                       pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);
+                       pthread_mutex_init(&m_lock, &attr);
+                       pthread_mutexattr_destroy(&attr);
+               }
+               else
+                       pthread_mutex_init(&m_lock, 0);
        }
        ~eSingleLock()
        {
index 3412c84..91f24ba 100644 (file)
@@ -37,7 +37,6 @@ void eFilePushThread::thread()
        
        size_t written_since_last_sync = 0;
 
-       int already_empty = 0;
        eDebug("FILEPUSH THREAD START");
        
                /* we set the signal to not restart syscalls, so we can detect our signal. */
@@ -186,21 +185,23 @@ void eFilePushThread::thread()
                if (m_buf_end == 0)
                {
                                /* on EOF, try COMMITting once. */
-                       if (m_send_pvr_commit && !already_empty)
+                       if (m_send_pvr_commit)
                        {
-                               eDebug("sending PVR commit");
-                               
                                struct pollfd pfd;
                                pfd.fd = m_fd_dest;
                                pfd.events = POLLIN;
-                               poll(&pfd, 1, 10000);
-                               sleep(5); /* HACK to allow ES buffer to drain */
-                               already_empty = 1;
-//                             if (::ioctl(m_fd_dest, PVR_COMMIT) < 0 && errno == EINTR)
-//                                     continue;
-                               eDebug("commit done");
-                                               /* well check again */
-                               continue;
+                               switch (poll(&pfd, 1, 250)) // wait for 250ms
+                               {
+                                       case 0:
+                                               eDebug("wait for driver eof timeout");
+                                               continue;
+                                       case 1:
+                                               eDebug("wait for driver eof ok");
+                                               break;
+                                       default:
+                                               eDebug("wait for driver eof aborted by signal");
+                                               continue;
+                               }
                        }
                        
                                /* in stream_mode, we are sending EOF events 
@@ -230,7 +231,6 @@ void eFilePushThread::thread()
                        bytes_read += m_buf_end;
                        if (m_sg)
                                current_span_remaining -= m_buf_end;
-                       already_empty = 0;
                }
 //             printf("FILEPUSH: read %d bytes\n", m_buf_end);
        }
index c7acd11..c56fde4 100644 (file)
@@ -81,7 +81,6 @@ eRCShortDriver::eRCShortDriver(const char *filename): eRCDriver(eRCInput::getIns
        {
                sn=eSocketNotifier::create(eApp, handle, eSocketNotifier::Read);
                CONNECT(sn->activated, eRCShortDriver::keyPressed);
-               eRCInput::getInstance()->setFile(handle);
        }
 }
 
@@ -115,7 +114,6 @@ eRCInputEventDriver::eRCInputEventDriver(const char *filename): eRCDriver(eRCInp
        {
                sn=eSocketNotifier::create(eApp, handle, eSocketNotifier::Read);
                CONNECT(sn->activated, eRCInputEventDriver::keyPressed);
-               eRCInput::getInstance()->setFile(handle);
        }
 }
 
@@ -127,6 +125,16 @@ std::string eRCInputEventDriver::getDeviceName()
        return name;
 }
 
+void eRCInputEventDriver::setExclusive(bool b)
+{
+       if (handle >= 0)
+       {
+               int grab = b;
+               if (::ioctl(handle, EVIOCGRAB, grab) < 0)
+                       perror("EVIOCGRAB");
+       }
+}
+
 eRCInputEventDriver::~eRCInputEventDriver()
 {
        if (handle>=0)
@@ -165,7 +173,6 @@ eRCInput::eRCInput()
 {
        ASSERT( !instance);
        instance=this;
-       handle = -1;
        locked = 0;
        keyboardMode = kmNone;
 }
@@ -183,21 +190,18 @@ bool eRCInput::open()
        return false;
 }
 
-int eRCInput::lock()
+void eRCInput::lock()
 {
        locked=1;
-       return handle;
+       for (std::map<std::string,eRCDevice*>::iterator i=devices.begin(); i != devices.end(); ++i)
+               i->second->setExclusive(false);
 }
 
 void eRCInput::unlock()
 {
-       if (locked)
-               locked=0;
-}
-
-void eRCInput::setFile(int newh)
-{
-       handle=newh;
+       locked=0;
+       for (std::map<std::string,eRCDevice*>::iterator i=devices.begin(); i != devices.end(); ++i)
+               i->second->setExclusive(true);
 }
 
 void eRCInput::addDevice(const std::string &id, eRCDevice *dev)
@@ -216,7 +220,7 @@ eRCDevice *eRCInput::getDevice(const std::string &id)
        if (i == devices.end())
        {
                eDebug("failed, possible choices are:");
-               for (std::map<std::string,eRCDevice*>::iterator i=devices.begin(); i != devices.end(); ++i)     
+               for (std::map<std::string,eRCDevice*>::iterator i=devices.begin(); i != devices.end(); ++i)
                        eDebug("%s", i->first.c_str());
                return 0;
        }
index 9708ea7..5290946 100644 (file)
@@ -53,6 +53,7 @@ public:
         * \param key The key to get the description for.
         * \result User readable description of given key.
         */
+       virtual void setExclusive(bool b) { };
 };
 
 /**
@@ -89,6 +90,7 @@ public:
        ~eRCDriver();
        
        void enable(int en) { enabled=en; }
+       virtual void setExclusive(bool) { }
 };
 
 class eRCShortDriver: public eRCDriver
@@ -112,6 +114,7 @@ public:
        std::string getDeviceName();
        eRCInputEventDriver(const char *filename);
        ~eRCInputEventDriver();
+       void setExclusive(bool b); // in exclusive mode data is not carried to console device
 };
 
 class eRCKey
@@ -173,7 +176,6 @@ public:
 class eRCInput: public Object
 {
        int locked;     
-       int handle;
        static eRCInput *instance;
        int keyboardMode;
 #ifdef SWIG
@@ -199,8 +201,6 @@ public:
        void close();
        bool open();
 
-       void setFile(int handle);
-
        /* This is only relevant for "keyboard"-styled input devices,
           i.e. not plain remote controls. It's up to the input device
           driver to decide wheter an input device is a keyboard or
@@ -237,7 +237,7 @@ public:
        void setKeyboardMode(int mode) { keyboardMode = mode; }
        int  getKeyboardMode() { return keyboardMode; }
        static eRCInput *getInstance() { return instance; }
-       int lock();
+       void lock();
        void unlock();
        int islocked() { return locked; }
 };
index bcce560..eb5aee3 100644 (file)
@@ -16,7 +16,6 @@ eRCConsoleDriver::eRCConsoleDriver(const char *filename): eRCDriver(eRCInput::ge
        {
                sn=eSocketNotifier::create(eApp, handle, eSocketNotifier::Read);
                CONNECT(sn->activated, eRCConsoleDriver::keyPressed);
-               eRCInput::getInstance()->setFile(handle);
        }
        
                /* set console mode */
index d10d94f..e593087 100644 (file)
@@ -83,8 +83,13 @@ eRCDeviceInputDev::eRCDeviceInputDev(eRCInputEventDriver *driver)
                        break;
                }
        }
+       setExclusive(true);
        eDebug("Input device \"%s\" is %sa keyboard.", id.c_str(), iskeyboard ? "" : "not ");
+}
 
+void eRCDeviceInputDev::setExclusive(bool b)
+{
+       driver->setExclusive(!iskeyboard && b);
 }
 
 const char *eRCDeviceInputDev::getDescription() const
index c7f5697..3b4579c 100644 (file)
@@ -10,6 +10,7 @@ public:
        void handleCode(long code);
        eRCDeviceInputDev(eRCInputEventDriver *driver);
        const char *getDescription() const;
+       void setExclusive(bool);
 };
 
 #endif
index 710cc42..ef8dadc 100644 (file)
@@ -1045,9 +1045,9 @@ int eTSMPEGDecoder::setState()
 int eTSMPEGDecoder::m_pcm_delay=-1,
        eTSMPEGDecoder::m_ac3_delay=-1;
 
-RESULT eTSMPEGDecoder::setPCMDelay(int delay)
+RESULT eTSMPEGDecoder::setHwPCMDelay(int delay)
 {
-       if (m_decoder == 0 && delay != m_pcm_delay )
+       if (delay != m_pcm_delay )
        {
                FILE *fp = fopen("/proc/stb/audio/audio_delay_pcm", "w");
                if (fp)
@@ -1061,9 +1061,9 @@ RESULT eTSMPEGDecoder::setPCMDelay(int delay)
        return -1;
 }
 
-RESULT eTSMPEGDecoder::setAC3Delay(int delay)
+RESULT eTSMPEGDecoder::setHwAC3Delay(int delay)
 {
-       if ( m_decoder == 0 && delay != m_ac3_delay )
+       if ( delay != m_ac3_delay )
        {
                FILE *fp = fopen("/proc/stb/audio/audio_delay_bitstream", "w");
                if (fp)
@@ -1077,6 +1077,17 @@ RESULT eTSMPEGDecoder::setAC3Delay(int delay)
        return -1;
 }
 
+
+RESULT eTSMPEGDecoder::setPCMDelay(int delay)
+{
+       return m_decoder == 0 ? setHwPCMDelay(delay) : -1;
+}
+
+RESULT eTSMPEGDecoder::setAC3Delay(int delay)
+{
+       return m_decoder == 0 ? setHwAC3Delay(delay) : -1;
+}
+
 eTSMPEGDecoder::eTSMPEGDecoder(eDVBDemux *demux, int decoder)
        : m_demux(demux), 
                m_vpid(-1), m_vtype(-1), m_apid(-1), m_atype(-1), m_pcrpid(-1), m_textpid(-1),
index b53638b..3a0fbac 100644 (file)
@@ -193,6 +193,8 @@ public:
        int getVideoProgressive();
        int getVideoFrameRate();
        int getVideoAspect();
+       static RESULT setHwPCMDelay(int delay);
+       static RESULT setHwAC3Delay(int delay);
 };
 
 #endif
index 894287e..6eaadb0 100644 (file)
@@ -1462,12 +1462,7 @@ void eDVBChannel::getNextSourceSpan(off_t current_offset, size_t bytes_read, off
                        continue;
                }
                
-               size_t iframe_len;
-                       /* try to align to iframe */
-               int direction = pts < 0 ? -1 : 1;
-               m_tstools.findFrame(offset, iframe_len, direction);
-
-               eDebug("ok, resolved skip (rel: %d, diff %lld), now at %08llx (skipped additional %d frames due to iframe re-align)", relative, pts, offset, direction);
+               eDebug("ok, resolved skip (rel: %d, diff %lld), now at %08llx", relative, pts, offset);
                current_offset = align(offset, blocksize); /* in case tstools return non-aligned offset */
        }
 
@@ -1771,6 +1766,8 @@ RESULT eDVBChannel::playFile(const char *file)
        m_pvr_thread->setStreamMode(1);
        m_pvr_thread->setScatterGather(this);
 
+       m_event(this, evtPreStart);
+
        if (m_pvr_thread->start(file, m_pvr_fd_dst))
        {
                delete m_pvr_thread;
index 2dc3641..48cbfbf 100644 (file)
@@ -255,6 +255,11 @@ void eEPGCache::DVBChannelAdded(eDVBChannel *chan)
 #ifdef ENABLE_PRIVATE_EPG
                data->m_PrivatePid = -1;
 #endif
+#ifdef ENABLE_MHW_EPG
+               data->m_mhw2_channel_pid = 0x231; // defaults for astra 19.2 D+
+               data->m_mhw2_title_pid = 0x234; // defaults for astra 19.2 D+
+               data->m_mhw2_summary_pid = 0x236; // defaults for astra 19.2 D+
+#endif
                singleLock s(channel_map_lock);
                m_knownChannels.insert( std::pair<iDVBChannel*, channel_data* >(chan, data) );
                chan->connectStateChange(slot(*this, &eEPGCache::DVBChannelStateChanged), data->m_stateChangedConn);
@@ -880,6 +885,62 @@ void eEPGCache::gotMessage( const Message &msg )
                        break;
                }
 #endif
+#ifdef ENABLE_MHW_EPG
+               case Message::got_mhw2_channel_pid:
+               {
+                       singleLock s(channel_map_lock);
+                       for (channelMapIterator it(m_knownChannels.begin()); it != m_knownChannels.end(); ++it)
+                       {
+                               eDVBChannel *channel = (eDVBChannel*) it->first;
+                               channel_data *data = it->second;
+                               eDVBChannelID chid = channel->getChannelID();
+                               if ( chid.transport_stream_id.get() == msg.service.tsid &&
+                                       chid.original_network_id.get() == msg.service.onid )
+                               {
+                                       data->m_mhw2_channel_pid = msg.pid;
+                                       eDebug("[EPGC] got mhw2 channel pid %04x", msg.pid);
+                                       break;
+                               }
+                       }
+                       break;
+               }
+               case Message::got_mhw2_title_pid:
+               {
+                       singleLock s(channel_map_lock);
+                       for (channelMapIterator it(m_knownChannels.begin()); it != m_knownChannels.end(); ++it)
+                       {
+                               eDVBChannel *channel = (eDVBChannel*) it->first;
+                               channel_data *data = it->second;
+                               eDVBChannelID chid = channel->getChannelID();
+                               if ( chid.transport_stream_id.get() == msg.service.tsid &&
+                                       chid.original_network_id.get() == msg.service.onid )
+                               {
+                                       data->m_mhw2_title_pid = msg.pid;
+                                       eDebug("[EPGC] got mhw2 title pid %04x", msg.pid);
+                                       break;
+                               }
+                       }
+                       break;
+               }
+               case Message::got_mhw2_summary_pid:
+               {
+                       singleLock s(channel_map_lock);
+                       for (channelMapIterator it(m_knownChannels.begin()); it != m_knownChannels.end(); ++it)
+                       {
+                               eDVBChannel *channel = (eDVBChannel*) it->first;
+                               channel_data *data = it->second;
+                               eDVBChannelID chid = channel->getChannelID();
+                               if ( chid.transport_stream_id.get() == msg.service.tsid &&
+                                       chid.original_network_id.get() == msg.service.onid )
+                               {
+                                       data->m_mhw2_summary_pid = msg.pid;
+                                       eDebug("[EPGC] got mhw2 summary pid %04x", msg.pid);
+                                       break;
+                               }
+                       }
+                       break;
+               }
+#endif
                case Message::timeChanged:
                        cleanLoop();
                        break;
@@ -1175,7 +1236,7 @@ void eEPGCache::channel_data::startEPG()
        isRunning |= MHW;
        memcpy(&m_MHWFilterMask, &mask, sizeof(eDVBSectionFilterMask));
 
-       mask.pid = 0x231;
+       mask.pid = m_mhw2_channel_pid;
        mask.data[0] = 0xC8;
        mask.mask[0] = 0xFF;
        mask.data[1] = 0;
@@ -1186,6 +1247,7 @@ void eEPGCache::channel_data::startEPG()
        memcpy(&m_MHWFilterMask2, &mask, sizeof(eDVBSectionFilterMask));
        mask.data[1] = 0;
        mask.mask[1] = 0;
+       m_MHWTimeoutet=false;
 #endif
 
        mask.pid = 0x12;
@@ -2489,6 +2551,50 @@ void eEPGCache::PMTready(eDVBServicePMTHandler *pmthandler)
                                int tmp=0;
                                switch ((*es)->getType())
                                {
+                               case 0xC1: // user private
+                                       for (DescriptorConstIterator desc = (*es)->getDescriptors()->begin();
+                                               desc != (*es)->getDescriptors()->end(); ++desc)
+                                       {
+                                               switch ((*desc)->getTag())
+                                               {
+                                                       case 0xC2: // user defined
+                                                               if ((*desc)->getLength() == 8) 
+                                                               {
+                                                                       __u8 buffer[10];
+                                                                       (*desc)->writeToBuffer(buffer);
+                                                                       if (!strncmp((unsigned char*)buffer+2, "EPGDATA", 7))
+                                                                       {
+                                                                               eServiceReferenceDVB ref;
+                                                                               if (!pmthandler->getServiceReference(ref))
+                                                                               {
+                                                                                       int pid = (*es)->getPid();
+                                                                                       messages.send(Message(Message::got_mhw2_channel_pid, ref, pid));
+                                                                               }
+                                                                       }
+                                                                       else if(!strncmp((unsigned char*)buffer+2, "FICHAS", 6))
+                                                                       {
+                                                                               eServiceReferenceDVB ref;
+                                                                               if (!pmthandler->getServiceReference(ref))
+                                                                               {
+                                                                                       int pid = (*es)->getPid();
+                                                                                       messages.send(Message(Message::got_mhw2_summary_pid, ref, pid));
+                                                                               }
+                                                                       }
+                                                                       else if(!strncmp((unsigned char*)buffer+2, "GENEROS", 7))
+                                                                       {
+                                                                               eServiceReferenceDVB ref;
+                                                                               if (!pmthandler->getServiceReference(ref))
+                                                                               {
+                                                                                       int pid = (*es)->getPid();
+                                                                                       messages.send(Message(Message::got_mhw2_title_pid, ref, pid));
+                                                                               }
+                                                                       }
+                                                               }
+                                                               break;
+                                                       default:
+                                                               break;
+                                               }
+                                       }
                                case 0x05: // private
                                        for (DescriptorConstIterator desc = (*es)->getDescriptors()->begin();
                                                desc != (*es)->getDescriptors()->end(); ++desc)
@@ -2893,7 +2999,7 @@ void eEPGCache::channel_data::storeTitle(std::map<__u32, mhw_title_t>::iterator
        packet->segment_last_table_id = 0x50;
 
        __u8 *title = isMHW2 ? ((__u8*)(itTitle->second.title))-4 : (__u8*)itTitle->second.title;
-       std::string prog_title = (char *) delimitName( title, name, isMHW2 ? 33 : 23 );
+       std::string prog_title = (char *) delimitName( title, name, isMHW2 ? 35 : 23 );
        int prog_title_length = prog_title.length();
 
        int packet_length = EIT_SIZE + EIT_LOOP_SIZE + EIT_SHORT_EVENT_DESCRIPTOR_SIZE +
@@ -3222,14 +3328,14 @@ void eEPGCache::channel_data::readMHWData2(const __u8 *data)
        {
                eDebug("[EPGC] mhw2 aborted %d", state);
        }
-       else if (m_MHWFilterMask2.pid == 0x231 && m_MHWFilterMask2.data[0] == 0xC8 && m_MHWFilterMask2.data[1] == 0)
+       else if (m_MHWFilterMask2.pid == m_mhw2_channel_pid && m_MHWFilterMask2.data[0] == 0xC8 && m_MHWFilterMask2.data[1] == 0)
        // Channels table
        {
-               int num_channels = data[119];
+               int num_channels = data[120];
                m_channels.resize(num_channels);
-               if(dataLen > 119)
+               if(dataLen > 120)
                {
-                       int ptr = 120 + 8 * num_channels;
+                       int ptr = 121 + 8 * num_channels;
                        if( dataLen > ptr )
                        {
                                for( int chid = 0; chid < num_channels; ++chid )
@@ -3245,7 +3351,7 @@ void eEPGCache::channel_data::readMHWData2(const __u8 *data)
                else
                        goto abort;
                // data seems consistent...
-               const __u8 *tmp = data+120;
+               const __u8 *tmp = data+121;
                for (int i=0; i < num_channels; ++i)
                {
                        mhw_channel_name_t channel;
@@ -3256,6 +3362,7 @@ void eEPGCache::channel_data::readMHWData2(const __u8 *data)
                        channel.channel_id_hi = *(tmp++);
                        channel.channel_id_lo = *(tmp++);
                        m_channels[i]=channel;
+//                     eDebug("%d(%02x) %04x: %02x %02x", i, i, (channel.channel_id_hi << 8) | channel.channel_id_lo, *tmp, *(tmp+1));
                        tmp+=2;
                }
                for (int i=0; i < num_channels; ++i)
@@ -3266,83 +3373,86 @@ void eEPGCache::channel_data::readMHWData2(const __u8 *data)
                        for (; x < channel_name_len; ++x)
                                channel.name[x]=*(tmp++);
                        channel.name[x+1]=0;
+//                     eDebug("%d(%02x) %s", i, i, channel.name);
                }
                haveData |= MHW;
                eDebug("[EPGC] mhw2 %d channels found", m_channels.size());
        }
-       else if (m_MHWFilterMask2.pid == 0x231 && m_MHWFilterMask2.data[0] == 0xC8 && m_MHWFilterMask2.data[1] == 1)
+       else if (m_MHWFilterMask2.pid == m_mhw2_channel_pid && m_MHWFilterMask2.data[0] == 0xC8 && m_MHWFilterMask2.data[1] == 1)
        {
                // Themes table
                eDebug("[EPGC] mhw2 themes nyi");
        }
-       else if (m_MHWFilterMask2.pid == 0x234 && m_MHWFilterMask2.data[0] == 0xe6)
+       else if (m_MHWFilterMask2.pid == m_mhw2_title_pid && m_MHWFilterMask2.data[0] == 0xe6)
        // Titles table
        {
                int pos=18;
-               bool valid=true;
-               int len = ((data[1]&0xf)<<8) + data[2] - 16;
+               bool valid=false;
                bool finish=false;
-               if(data[dataLen-1] != 0xff)
-                       return;
-               while( pos < dataLen )
+
+//             eDebug("%02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x",
+//                     data[3], data[4], data[5], data[6], data[7], data[8], data[9], data[10],
+//                     data[11], data[12], data[13], data[14], data[15], data[16], data[17] );
+
+               while( pos < dataLen && !valid)
                {
-                       valid = false;
-                       pos += 7;
-                       if( pos < dataLen )
-                       {
-                               pos += 3;
-                               if( pos < dataLen )
-                               {
-                                       if( data[pos] > 0xc0 )
-                                       {
-                                               pos += ( data[pos] - 0xc0 );
-                                               pos += 4;
-                                               if( pos < dataLen )
-                                               {
-                                                       if( data[pos] == 0xff )
-                                                       {
-                                                               ++pos;
-                                                               valid = true;
-                                                       }
-                                               }
-                                       }
-                               }
-                       }
-                       if( !valid )
-                       {
-                               if (checkTimeout())
-                                       goto start_summary;
-                               return;
-                       }
+                       pos += 18;
+                       pos += (data[pos] & 0x3F) + 4;
+                       if( pos == dataLen )
+                               valid = true;
                }
+
+               if (!valid)
+               {
+                       if (dataLen > 18)
+                               eDebug("mhw2 title table invalid!!");
+                       if (checkTimeout())
+                               goto abort;
+                       if (!m_MHWTimeoutTimer->isActive())
+                               startTimeout(5000);
+                       return; // continue reading
+               }
+
                // data seems consistent...
                mhw_title_t title;
                pos = 18;
-               while (pos < len)
+               while (pos < dataLen)
                {
+//                     eDebugNoNewLine("    [%02x] %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x [%02x %02x %02x %02x %02x %02x %02x] LL - DESCR - ",
+//                             data[pos], data[pos+1], data[pos+2], data[pos+3], data[pos+4], data[pos+5], data[pos+6], data[pos+7], 
+//                             data[pos+8], data[pos+9], data[pos+10], data[pos+11], data[pos+12], data[pos+13], data[pos+14], data[pos+15], data[pos+16], data[pos+17]);
                        title.channel_id = data[pos]+1;
-                       title.program_id_ml = data[pos+1];
-                       title.program_id_lo = data[pos+2];
-                       title.mhw2_mjd_hi = data[pos+3];
-                       title.mhw2_mjd_lo = data[pos+4];
-                       title.mhw2_hours = data[pos+5];
-                       title.mhw2_minutes = data[pos+6];
-                       title.mhw2_seconds = data[pos+7];
-                       int duration = ((data[pos+8] << 8)|data[pos+9]) >> 4;
+                       title.mhw2_mjd_hi = data[pos+11];
+                       title.mhw2_mjd_lo = data[pos+12];
+                       title.mhw2_hours = data[pos+13];
+                       title.mhw2_minutes = data[pos+14];
+                       title.mhw2_seconds = data[pos+15];
+                       int duration = ((data[pos+16] << 8)|data[pos+17]) >> 4;
                        title.mhw2_duration_hi = (duration&0xFF00) >> 8;
                        title.mhw2_duration_lo = duration&0xFF;
-                       __u8 slen = data[pos+10] & 0x3f;
+
+                       // Create unique key per title
+                       __u32 title_id = (data[pos+7] << 24) | (data[pos+8] << 16) | (data[pos+9] << 8) | data[pos+10];
+
+                       __u8 slen = data[pos+18] & 0x3f;
                        __u8 *dest = ((__u8*)title.title)-4;
-                       memcpy(dest, &data[pos+11], slen>33 ? 33 : slen);
-                       memset(dest+slen, 0, 33-slen);
-                       pos += 11 + slen;
+                       memcpy(dest, &data[pos+19], slen>35 ? 35 : slen);
+                       memset(dest+slen, 0, 35-slen);
+                       pos += 19 + slen;
+//                     eDebug("%02x [%02x %02x]: %s", data[pos], data[pos+1], data[pos+2], dest);
+
 //                     not used theme id (data[7] & 0x3f) + (data[pos] & 0x3f);
                        __u32 summary_id = (data[pos+1] << 8) | data[pos+2];
 
-                       // Create unique key per title
-                       __u32 title_id = (title.channel_id<<16) | (title.program_id_ml<<8) | title.program_id_lo;
+//                     if (title.channel_id > m_channels.size())
+//                             eDebug("channel_id(%d %02x) to big!!", title.channel_id);
+
+//                     eDebug("pos %d prog_id %02x %02x chid %02x summary_id %04x dest %p len %d\n",
+//                             pos, title.program_id_ml, title.program_id_lo, title.channel_id, summary_id, dest, slen);
 
-                       pos += 4;
+//                     eDebug("title_id %08x -> summary_id %04x\n", title_id, summary_id);
+
+                       pos += 3;
 
                        std::map<__u32, mhw_title_t>::iterator it = m_titles.find( title_id );
                        if ( it == m_titles.end() )
@@ -3381,7 +3491,7 @@ start_summary:
                        {
                                // Titles table has been read, there are summaries to read.
                                // Start reading summaries, store corresponding titles on the fly.
-                               startMHWReader2(0x236, 0x96);
+                               startMHWReader2(m_mhw2_summary_pid, 0x96);
                                startTimeout(15000);
                                return;
                        }
@@ -3389,7 +3499,7 @@ start_summary:
                else
                        return;
        }
-       else if (m_MHWFilterMask2.pid == 0x236 && m_MHWFilterMask2.data[0] == 0x96)
+       else if (m_MHWFilterMask2.pid == m_mhw2_summary_pid && m_MHWFilterMask2.data[0] == 0x96)
        // Summaries table
        {
                if (!checkTimeout())
@@ -3423,10 +3533,13 @@ start_summary:
                        }
                        else
                                return;  // continue reading
+
                        if (valid)
                        {
                                // data seems consistent...
                                __u32 summary_id = (data[3]<<8)|data[4];
+//                             eDebug ("summary id %04x\n", summary_id);
+//                             eDebug("[%02x %02x] %02x %02x %02x %02x %02x %02x %02x %02x XX\n", data[3], data[4], data[5], data[6], data[7], data[8], data[9], data[10], data[11], data[12], data[13] );
 
                                // ugly workaround to convert const __u8* to char*
                                char *tmp=0;
@@ -3444,7 +3557,7 @@ start_summary:
                                        len += lenline + 1;
                                }
                                if( len > 0 )
-                                   tmp[pos+len] = 0;
+                                       tmp[pos+len] = 0;
                                else
                                        tmp[pos+1] = 0;
 
@@ -3460,8 +3573,11 @@ start_summary:
                                        startTimeout(15000);
                                        std::string the_text = (char *) (data + pos + 1);
 
+//                                     eDebug ("summary id %04x : %s\n", summary_id, data+pos+1);
+
                                        while( itProgId != m_program_ids.end() && itProgId->first == summary_id )
                                        {
+//                                             eDebug(".");
                                                // Find corresponding title, store title and summary in epgcache.
                                                std::map<__u32, mhw_title_t>::iterator itTitle( m_titles.find( itProgId->second ) );
                                                if ( itTitle != m_titles.end() )
@@ -3481,16 +3597,16 @@ start_summary:
        }
        if (isRunning & eEPGCache::MHW)
        {
-               if ( m_MHWFilterMask2.pid == 0x231 && m_MHWFilterMask2.data[0] == 0xC8 && m_MHWFilterMask2.data[1] == 0)
+               if ( m_MHWFilterMask2.pid == m_mhw2_channel_pid && m_MHWFilterMask2.data[0] == 0xC8 && m_MHWFilterMask2.data[1] == 0)
                {
                        // Channels table has been read, start reading the themes table.
-                       startMHWReader2(0x231, 0xC8, 1);
+                       startMHWReader2(m_mhw2_channel_pid, 0xC8, 1);
                        return;
                }
-               else if ( m_MHWFilterMask2.pid == 0x231 && m_MHWFilterMask2.data[0] == 0xC8 && m_MHWFilterMask2.data[1] == 1)
+               else if ( m_MHWFilterMask2.pid == m_mhw2_channel_pid && m_MHWFilterMask2.data[0] == 0xC8 && m_MHWFilterMask2.data[1] == 1)
                {
                        // Themes table has been read, start reading the titles table.
-                       startMHWReader2(0x234, 0xe6);
+                       startMHWReader2(m_mhw2_title_pid, 0xe6);
                        return;
                }
                else
index 7d1b163..4d45d87 100644 (file)
@@ -202,6 +202,7 @@ class eEPGCache: public eMainloop, private eThread, public Object
                ePtr<iDVBSectionReader> m_MHWReader, m_MHWReader2;
                eDVBSectionFilterMask m_MHWFilterMask, m_MHWFilterMask2;
                ePtr<eTimer> m_MHWTimeoutTimer;
+               __u16 m_mhw2_channel_pid, m_mhw2_title_pid, m_mhw2_summary_pid;
                bool m_MHWTimeoutet;
                void MHWTimeout() { m_MHWTimeoutet=true; }
                void readMHWData(const __u8 *data);
@@ -242,6 +243,9 @@ public:
                        leaveChannel,
                        quit,
                        got_private_pid,
+                       got_mhw2_channel_pid,
+                       got_mhw2_title_pid,
+                       got_mhw2_summary_pid,
                        timeChanged
                };
                int type;
index cff4dbb..4ef7efa 100644 (file)
@@ -522,7 +522,7 @@ public:
        virtual RESULT getCurrentFrontendParameters(ePtr<iDVBFrontendParameters> &)=0;
        enum 
        {
-               evtEOF, evtSOF, evtFailed
+               evtPreStart, evtEOF, evtSOF, evtFailed
        };
        virtual RESULT connectStateChange(const Slot1<void,iDVBChannel*> &stateChange, ePtr<eConnection> &connection)=0;
        virtual RESULT connectEvent(const Slot2<void,iDVBChannel*,int> &eventChange, ePtr<eConnection> &connection)=0;
index 0b4904f..f06c86e 100644 (file)
@@ -78,9 +78,9 @@ typedef struct {
    u_char ppv_id_ml                              :8;
    u_char ppv_id_lo                              :8;
    u_char program_id_hi                          :8;
-   u_char program_id_mh                          :8; // mhw2_title end (33chars max)
+   u_char program_id_mh                          :8;
    u_char program_id_ml                          :8;
-   u_char program_id_lo                          :8;
+   u_char program_id_lo                          :8; // mhw2_title end (35chars max)
    u_char mhw2_mjd_hi                            :8;
    u_char mhw2_mjd_lo                            :8;
    u_char mhw2_duration_hi                       :8;
index 9bd065b..ee89a3a 100644 (file)
@@ -75,6 +75,9 @@ void eDVBServicePMTHandler::channelEvent(iDVBChannel *channel, int event)
 {
        switch (event)
        {
+       case iDVBChannel::evtPreStart:
+               serviceEvent(eventPreStart);
+               break;
        case iDVBChannel::evtEOF:
                serviceEvent(eventEOF);
                break;
index a9ca23f..483c06b 100644 (file)
@@ -123,6 +123,7 @@ public:
                eventNewProgramInfo, // we just received a PMT
                eventTuned,        // a channel was sucessfully (re-)tuned in, you may start additional filters now
                
+               eventPreStart,     // before start filepush thread
                eventSOF,          // seek pre start
                eventEOF,          // a file playback did end
                
index 1393bf7..5cdecbd 100644 (file)
@@ -244,6 +244,7 @@ off_t eMPEGStreamInformation::getAccessPoint(pts_t ts, int marg)
        off_t last = 0;
        off_t last2 = 0;
        pts_t lastc = 0;
+       ts += 1; // Add rounding error margin
        for (std::map<off_t, pts_t>::const_iterator i(m_access_points.begin()); i != m_access_points.end(); ++i)
        {
                pts_t delta = getDelta(i->first);
index a9eef40..d5ad249 100644 (file)
@@ -7,6 +7,7 @@
 #include <stdio.h>
 
 eDVBTSTools::eDVBTSTools()
+       :m_file_lock(true)
 {
        m_pid = -1;
        m_maxrange = 256*1024;
@@ -47,6 +48,7 @@ int eDVBTSTools::openFile(const char *filename, int nostreaminfo)
        
        m_samples_taken = 0;
 
+       eSingleLocker l(m_file_lock);
        if (m_file.open(filename, 1) < 0)
                return -1;
        return 0;
@@ -54,6 +56,7 @@ int eDVBTSTools::openFile(const char *filename, int nostreaminfo)
 
 void eDVBTSTools::closeFile()
 {
+       eSingleLocker l(m_file_lock);
        m_file.close();
 }
 
@@ -78,7 +81,8 @@ int eDVBTSTools::getPTS(off_t &offset, pts_t &pts, int fixed)
                return -1;
 
        offset -= offset % 188;
-       
+
+       eSingleLocker l(m_file_lock);
        if (m_file.lseek(offset, SEEK_SET) < 0)
        {
                eDebug("lseek failed");
@@ -134,7 +138,7 @@ int eDVBTSTools::getPTS(off_t &offset, pts_t &pts, int fixed)
                                        pts |= ((unsigned long long)(packet[ 9]&0xFF)) << 1;
                                        pts |= ((unsigned long long)(packet[10]&0x80)) >> 7;
                                        offset -= 188;
-                                       eDebug("PCR  found at %llx: %16llx", offset, pts);
+                                       eDebug("PCR %16llx found at %lld pid %02x (%02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x)", pts, offset, pid, packet[0], packet[1], packet[2], packet[3], packet[4], packet[5], packet[6], packet[7], packet[8], packet[9], packet[10]);
                                        if (fixed && fixupPTS(offset, pts))
                                                return -1;
                                        return 0;
@@ -144,24 +148,83 @@ int eDVBTSTools::getPTS(off_t &offset, pts_t &pts, int fixed)
                } else
                        payload = packet + 4;
 
-               
 /*             if (m_pid >= 0)
                        if (pid != m_pid)
                                continue; */
                if (!pusi)
                        continue;
-               
-               
+
                        /* somehow not a startcode. (this is invalid, since pusi was set.) ignore it. */
                if (payload[0] || payload[1] || (payload[2] != 1))
                        continue;
-               
+
+               if (payload[3] == 0xFD)
+               { // stream use extension mechanism defined in ISO 13818-1 Amendment 2
+                       if (payload[7] & 1) // PES extension flag
+                       {
+                               int offs = 0;
+                               if (payload[7] & 0x80) // pts avail
+                                       offs += 5;
+                               if (payload[7] & 0x40) // dts avail
+                                       offs += 5;
+                               if (payload[7] & 0x20) // escr avail
+                                       offs += 6;
+                               if (payload[7] & 0x10) // es rate
+                                       offs += 3;
+                               if (payload[7] & 0x8) // dsm trickmode
+                                       offs += 1;
+                               if (payload[7] & 0x4) // additional copy info
+                                       offs += 1;
+                               if (payload[7] & 0x2) // crc
+                                       offs += 2;
+                               if (payload[8] < offs)
+                                       continue;
+                               uint8_t pef = payload[9+offs++]; // pes extension field
+                               if (pef & 1) // pes extension flag 2
+                               {
+                                       if (pef & 0x80) // private data flag
+                                               offs += 16;
+                                       if (pef & 0x40) // pack header field flag
+                                               offs += 1;
+                                       if (pef & 0x20) // program packet sequence counter flag
+                                               offs += 2;
+                                       if (pef & 0x10) // P-STD buffer flag
+                                               offs += 2;
+                                       if (payload[8] < offs)
+                                               continue;
+                                       uint8_t stream_id_extension_len = payload[9+offs++] & 0x7F;
+                                       if (stream_id_extension_len >= 1)
+                                       {
+                                               if (payload[8] < (offs + stream_id_extension_len) )
+                                                       continue;
+                                               if (payload[9+offs] & 0x80) // stream_id_extension_bit (should not set)
+                                                       continue;
+                                               switch (payload[9+offs])
+                                               {
+                                               case 0x55 ... 0x5f: // VC-1
+                                                       break;
+                                               case 0x71: // AC3 / DTS
+                                                       break;
+                                               default:
+                                                       eDebug("skip unknwn stream_id_extension %02x\n", payload[9+offs]);
+                                                       continue;
+                                               }
+                                       }
+                                       else
+                                               continue;
+                               }
+                               else
+                                       continue;
+                       }
+                       else
+                               continue;
+               }
                        /* drop non-audio, non-video packets because other streams
                           can be non-compliant.*/
-               if (((payload[3] & 0xE0) != 0xC0) &&  // audio
-                   ((payload[3] & 0xF0) != 0xE0))    // video
+               else if (((payload[3] & 0xE0) != 0xC0) &&  // audio
+                       ((payload[3] & 0xF0) != 0xE0)) // video
                        continue;
-               
+
                if (payload[7] & 0x80) /* PTS */
                {
                        pts  = ((unsigned long long)(payload[ 9]&0xE))  << 29;
@@ -171,11 +234,11 @@ int eDVBTSTools::getPTS(off_t &offset, pts_t &pts, int fixed)
                        pts |= ((unsigned long long)(payload[13]&0xFE)) >> 1;
                        offset -= 188;
 
-//                     eDebug("found pts %08llx at %08llx pid %02x stream: %02x", pts, offset, pid, payload[3]);
-                       
+                       eDebug("PTS %16llx found at %lld pid %02x stream: %02x", pts, offset, pid, payload[3]);
+
                                /* convert to zero-based */
                        if (fixed && fixupPTS(offset, pts))
-                                       return -1;
+                               return -1;
                        return 0;
                }
        }
@@ -212,10 +275,13 @@ int eDVBTSTools::fixupPTS(const off_t &offset, pts_t &now)
                        now -= pos;
                return 0;
        }
+       eDebug("eDVBTSTools::fixupPTS failed!");
+       return -1;
 }
 
 int eDVBTSTools::getOffset(off_t &offset, pts_t &pts, int marg)
 {
+       eDebug("getOffset for pts 0x%llx", pts);
        if (m_use_streaminfo)
        {
                if (pts >= m_pts_end && marg > 0 && m_end_valid)
@@ -355,7 +421,8 @@ void eDVBTSTools::calcEnd()
 {
        if (!m_file.valid())
                return;
-       
+
+       eSingleLocker l(m_file_lock);
        off_t end = m_file.lseek(0, SEEK_END);
        
        if (llabs(end - m_last_filelength) > 1*1024*1024)
@@ -440,6 +507,8 @@ void eDVBTSTools::takeSamples()
        m_samples_taken = 1;
        m_samples.clear();
        pts_t dummy;
+       int retries=2;
+
        if (calcLen(dummy) == -1)
                return;
        
@@ -449,21 +518,27 @@ void eDVBTSTools::takeSamples()
                bytes_per_sample = 40*1024*1024;
 
        bytes_per_sample -= bytes_per_sample % 188;
-       
-       for (off_t offset = m_offset_begin; offset < m_offset_end; offset += bytes_per_sample)
+
+       eDebug("samples step %lld, pts begin %llx, pts end %llx, offs begin %lld, offs end %lld:",
+               bytes_per_sample, m_pts_begin, m_pts_end, m_offset_begin, m_offset_end);
+
+       for (off_t offset = m_offset_begin; offset < m_offset_end;)
        {
                pts_t p;
-               takeSample(offset, p);
+               if (takeSample(offset, p) && retries--)
+                       continue;
+               retries = 2;
+               offset += bytes_per_sample;
        }
        m_samples[0] = m_offset_begin;
        m_samples[m_pts_end - m_pts_begin] = m_offset_end;
-       
-//     eDebug("begin, end: %llx %llx", m_offset_begin, m_offset_end); 
 }
 
        /* returns 0 when a sample was taken. */
 int eDVBTSTools::takeSample(off_t off, pts_t &p)
 {
+       off_t offset_org = off;
+
        if (!eDVBTSTools::getPTS(off, p, 1))
        {
                        /* as we are happily mixing PTS and PCR values (no comment, please), we might
@@ -481,18 +556,18 @@ int eDVBTSTools::takeSample(off_t off, pts_t &p)
                        {
                                if ((l->second > off) || (u->second < off))
                                {
-                                       eDebug("ignoring sample %llx %llx %llx (%lld %lld %lld)",
+                                       eDebug("ignoring sample %lld %lld %lld (%llx %llx %llx)",
                                                l->second, off, u->second, l->first, p, u->first);
                                        return 1;
                                }
                        }
                }
 
-               
+               eDebug("adding sample %lld: pts 0x%llx -> pos %lld (diff %lld bytes)", offset_org, p, off, off-offset_org);
                m_samples[p] = off;
                return 0;
        }
-       return 1;
+       return -1;
 }
 
 int eDVBTSTools::findPMT(int &pmt_pid, int &service_id)
@@ -504,6 +579,7 @@ int eDVBTSTools::findPMT(int &pmt_pid, int &service_id)
                return -1;
        }
 
+       eSingleLocker l(m_file_lock);
        if (m_file.lseek(0, SEEK_SET) < 0)
        {
                eDebug("seek failed");
@@ -652,18 +728,23 @@ int eDVBTSTools::findFrame(off_t &_offset, size_t &len, int &direction, int fram
 
 int eDVBTSTools::findNextPicture(off_t &offset, size_t &len, int &distance, int frame_types)
 {
-       int nr_frames = 0;
+       int nr_frames, direction;
 //     eDebug("trying to move %d frames at %llx", distance, offset);
        
        frame_types = frametypeI; /* TODO: intelligent "allow IP frames when not crossing an I-Frame */
 
-       int direction = distance > 0 ? 0 : -1;
-       distance = abs(distance);
-       
        off_t new_offset = offset;
        size_t new_len = len;
        int first = 1;
 
+       if (distance > 0) {
+               direction = 0;
+                nr_frames = 0;
+        } else {
+               direction = -1;
+                nr_frames = -1;
+               distance = -distance+1;
+        }      
        while (distance > 0)
        {
                int dir = direction;
@@ -677,12 +758,18 @@ int eDVBTSTools::findNextPicture(off_t &offset, size_t &len, int &distance, int
                
 //             eDebug("we moved %d, %d to go frames (now at %llx)", dir, distance, new_offset);
 
-               if (distance >= 0 || first)
+               if (distance >= 0 || direction == 0)
                {
                        first = 0;
                        offset = new_offset;
                        len = new_len;
                        nr_frames += abs(dir);
+               } 
+               else if (first) {
+                       first = 0;
+                       offset = new_offset;
+                       len = new_len;
+                       nr_frames += abs(dir) + distance; // never jump forward during rewind
                }
        }
 
index c230a34..ed8b924 100644 (file)
@@ -4,6 +4,7 @@
 #include <sys/types.h>
 #include <lib/dvb/pvrparse.h>
 #include <lib/base/rawfile.h>
+#include <lib/base/elock.h>
 
 /*
  * Note: we're interested in PTS values, not STC values.
@@ -75,9 +76,10 @@ public:
 private:
        int m_pid;
        int m_maxrange;
-       
+
+       eSingleLock m_file_lock;
        eRawFile m_file;
-       
+
        int m_begin_valid, m_end_valid;
        pts_t m_pts_begin, m_pts_end;
        off_t m_offset_begin, m_offset_end;
old mode 100644 (file)
new mode 100755 (executable)
index fe505c2..33868d6
@@ -1,16 +1,16 @@
 from MenuList import MenuList
-from Tools.Directories import SCOPE_SKIN_IMAGE, resolveFilename
+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))
        else:
                res.append((eListboxPythonMultiContent.TYPE_TEXT, 45, 00, 800, 25, 0, RT_HALIGN_LEFT, text[0]))
        
-               png = LoadPixmap(resolveFilename(SCOPE_SKIN_IMAGE, "skin_default/buttons/key_" + key + ".png"))
+               png = LoadPixmap(resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/buttons/key_" + key + ".png"))
                if png is not None:
                        res.append((eListboxPythonMultiContent.TYPE_PIXMAP_ALPHATEST, 5, 0, 35, 25, png))
        
old mode 100644 (file)
new mode 100755 (executable)
index 00949e2..418a1b6
@@ -1,7 +1,7 @@
 from HTMLComponent import HTMLComponent
 from GUIComponent import GUIComponent
-from config import KEY_LEFT, KEY_RIGHT, KEY_HOME, KEY_END, KEY_0, KEY_DELETE, KEY_BACKSPACE, KEY_OK, KEY_TOGGLEOW, KEY_ASCII, KEY_TIMEOUT, KEY_NUMBERS, ConfigElement
-from Components.ActionMap import NumberActionMap
+from config import KEY_LEFT, KEY_RIGHT, KEY_HOME, KEY_END, KEY_0, KEY_DELETE, KEY_BACKSPACE, KEY_OK, KEY_TOGGLEOW, KEY_ASCII, KEY_TIMEOUT, KEY_NUMBERS, ConfigElement, ConfigText, ConfigPassword
+from Components.ActionMap import NumberActionMap, ActionMap
 from enigma import eListbox, eListboxPythonConfigContent, eRCInput, eTimer
 from Screens.MessageBox import MessageBox
 
@@ -66,6 +66,7 @@ class ConfigList(HTMLComponent, GUIComponent, object):
                self.current = self.getCurrent()
                if self.current:
                        self.current[1].onSelect(self.session)
+
                for x in self.onSelectionChanged:
                        x()
 
@@ -127,13 +128,52 @@ class ConfigListScreen:
                        "9": self.keyNumberGlobal,
                        "0": self.keyNumberGlobal
                }, -1) # to prevent left/right overriding the listbox
+
+               self["VirtualKB"] = ActionMap(["VirtualKeyboardActions"],
+               {
+                       "showVirtualKeyboard": self.KeyText,
+               }, -2)
+               self["VirtualKB"].setEnabled(False)
                
                self["config"] = ConfigList(list, session = session)
+               
                if on_change is not None:
                        self.__changed = on_change
                else:
                        self.__changed = lambda: None
-
+               
+               if not self.handleInputHelpers in self["config"].onSelectionChanged:
+                       self["config"].onSelectionChanged.append(self.handleInputHelpers)
+
+       def handleInputHelpers(self):
+               if self["config"].getCurrent() is not None:
+                       if isinstance(self["config"].getCurrent()[1], ConfigText) or isinstance(self["config"].getCurrent()[1], ConfigPassword):
+                               if self.has_key("VKeyIcon"):
+                                       self["VirtualKB"].setEnabled(True)
+                                       self["VKeyIcon"].boolean = True
+                               if self.has_key("HelpWindow"):
+                                       if self["config"].getCurrent()[1].help_window.instance is not None:
+                                               helpwindowpos = self["HelpWindow"].getPosition()
+                                               from enigma import ePoint
+                                               self["config"].getCurrent()[1].help_window.instance.move(ePoint(helpwindowpos[0],helpwindowpos[1]))
+                       else:
+                               if self.has_key("VKeyIcon"):
+                                       self["VirtualKB"].setEnabled(False)
+                                       self["VKeyIcon"].boolean = False
+               else:
+                       if self.has_key("VKeyIcon"):
+                               self["VirtualKB"].setEnabled(False)
+                               self["VKeyIcon"].boolean = False
+
+       def KeyText(self):
+               from Screens.VirtualKeyBoard import VirtualKeyBoard
+               self.session.openWithCallback(self.VirtualKeyBoardCallback, VirtualKeyBoard, title = self["config"].getCurrent()[0], text = self["config"].getCurrent()[1].getValue())
+
+       def VirtualKeyBoardCallback(self, callback = None):
+               if callback is not None and len(callback):
+                       self["config"].getCurrent()[1].setValue(callback)
+                       self["config"].invalidate(self["config"].getCurrent())
+                       
        def keyOK(self):
                self["config"].handleKey(KEY_OK)
 
old mode 100644 (file)
new mode 100755 (executable)
index 59f9262..41cd1b2
@@ -8,7 +8,7 @@ from Tools.LoadPixmap import LoadPixmap
 
 from time import localtime, time
 from ServiceReference import ServiceReference
-from Tools.Directories import resolveFilename, SCOPE_SKIN_IMAGE
+from Tools.Directories import resolveFilename, SCOPE_CURRENT_SKIN
 
 EPG_TYPE_SINGLE = 0
 EPG_TYPE_MULTI = 1
@@ -53,11 +53,11 @@ class EPGList(HTMLComponent, GUIComponent):
                        assert(type == EPG_TYPE_SIMILAR)
                        self.l.setBuildFunc(self.buildSimilarEntry)
                self.epgcache = eEPGCache.getInstance()
-               self.clock_pixmap = LoadPixmap(resolveFilename(SCOPE_SKIN_IMAGE, 'skin_default/icons/epgclock.png'))
-               self.clock_add_pixmap = LoadPixmap(resolveFilename(SCOPE_SKIN_IMAGE, 'skin_default/icons/epgclock_add.png'))
-               self.clock_pre_pixmap = LoadPixmap(resolveFilename(SCOPE_SKIN_IMAGE, 'skin_default/icons/epgclock_pre.png'))
-               self.clock_post_pixmap = LoadPixmap(resolveFilename(SCOPE_SKIN_IMAGE, 'skin_default/icons/epgclock_post.png'))
-               self.clock_prepost_pixmap = LoadPixmap(resolveFilename(SCOPE_SKIN_IMAGE, 'skin_default/icons/epgclock_prepost.png'))
+               self.clock_pixmap = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_SKIN, 'skin_default/icons/epgclock.png'))
+               self.clock_add_pixmap = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_SKIN, 'skin_default/icons/epgclock_add.png'))
+               self.clock_pre_pixmap = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_SKIN, 'skin_default/icons/epgclock_pre.png'))
+               self.clock_post_pixmap = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_SKIN, 'skin_default/icons/epgclock_post.png'))
+               self.clock_prepost_pixmap = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_SKIN, 'skin_default/icons/epgclock_prepost.png'))
 
        def getEventFromId(self, service, eventid):
                event = None
index 38b0854..841a2fe 100755 (executable)
@@ -3,7 +3,7 @@ from os import path as os_path, listdir
 from MenuList import MenuList
 from Components.Harddisk import harddiskmanager
 
-from Tools.Directories import SCOPE_SKIN_IMAGE, resolveFilename
+from Tools.Directories import SCOPE_CURRENT_SKIN, resolveFilename, fileExists
 
 from enigma import RT_HALIGN_LEFT, eListboxPythonMultiContent, \
        eServiceReference, eServiceCenter, gFont
@@ -35,12 +35,12 @@ def FileEntryComponent(name, absolute = None, isDir = False):
        res = [ (absolute, isDir) ]
        res.append((eListboxPythonMultiContent.TYPE_TEXT, 35, 1, 470, 20, 0, RT_HALIGN_LEFT, name))
        if isDir:
-               png = LoadPixmap(resolveFilename(SCOPE_SKIN_IMAGE, "extensions/directory.png"))
+               png = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_SKIN, "extensions/directory.png"))
        else:
                extension = name.split('.')
                extension = extension[-1].lower()
                if EXTENSIONS.has_key(extension):
-                       png = LoadPixmap(resolveFilename(SCOPE_SKIN_IMAGE, "extensions/" + EXTENSIONS[extension] + ".png"))
+                       png = LoadPixmap(resolveFilename(SCOPE_CURRENT_SKIN, "extensions/" + EXTENSIONS[extension] + ".png"))
                else:
                        png = None
        if png is not None:
@@ -160,8 +160,11 @@ class FileList(MenuList):
                        directories.sort()
                        files.sort()
                else:
-                       if os_path.exists(directory):
-                               files = listdir(directory)
+                       if fileExists(directory):
+                               try:
+                                       files = listdir(directory)
+                               except:
+                                       files = []
                                files.sort()
                                tmpfiles = files[:]
                                for x in tmpfiles:
@@ -256,12 +259,12 @@ def MultiFileSelectEntryComponent(name, absolute = None, isDir = False, selected
        res = [ (absolute, isDir, selected, name) ]
        res.append((eListboxPythonMultiContent.TYPE_TEXT, 55, 1, 470, 20, 0, RT_HALIGN_LEFT, name))
        if isDir:
-               png = LoadPixmap(resolveFilename(SCOPE_SKIN_IMAGE, "extensions/directory.png"))
+               png = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_SKIN, "extensions/directory.png"))
        else:
                extension = name.split('.')
                extension = extension[-1].lower()
                if EXTENSIONS.has_key(extension):
-                       png = LoadPixmap(resolveFilename(SCOPE_SKIN_IMAGE, "extensions/" + EXTENSIONS[extension] + ".png"))
+                       png = LoadPixmap(resolveFilename(SCOPE_CURRENT_SKIN, "extensions/" + EXTENSIONS[extension] + ".png"))
                else:
                        png = None
        if png is not None:
@@ -269,10 +272,10 @@ def MultiFileSelectEntryComponent(name, absolute = None, isDir = False, selected
 
        if not name.startswith('<'):
                if selected is False:
-                       icon = LoadPixmap(resolveFilename(SCOPE_SKIN_IMAGE, "skin_default/icons/lock_off.png"))
+                       icon = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/icons/lock_off.png"))
                        res.append((eListboxPythonMultiContent.TYPE_PIXMAP_ALPHATEST, 2, 0, 25, 25, icon))
                else:
-                       icon = LoadPixmap(resolveFilename(SCOPE_SKIN_IMAGE, "skin_default/icons/lock_on.png"))
+                       icon = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/icons/lock_on.png"))
                        res.append((eListboxPythonMultiContent.TYPE_PIXMAP_ALPHATEST, 2, 0, 25, 25, icon))
        
        return res
@@ -374,8 +377,11 @@ class MultiFileSelectList(FileList):
                        directories.sort()
                        files.sort()
                else:
-                       if os_path.exists(directory):
-                               files = listdir(directory)
+                       if fileExists(directory):
+                               try:
+                                       files = listdir(directory)
+                               except:
+                                       files = []
                                files.sort()
                                tmpfiles = files[:]
                                for x in tmpfiles:
index 2efdb68..03f574f 100755 (executable)
@@ -290,7 +290,10 @@ class Harddisk:
        # any access has been made to the disc. If there has been no access over a specifed time,
        # we set the hdd into standby.
        def readStats(self):
-               l = readFile("/sys/block/%s/stat" % self.device)
+               try:
+                       l = open("/sys/block/%s/stat" % self.device).read()
+               except IOError:
+                       return -1,-1
                (nr_read, _, _, _, nr_write) = l.split()[:5]
                return int(nr_read), int(nr_write)
 
@@ -319,7 +322,7 @@ class Harddisk:
                l = sum(stats)
                print "sum", l, "prev_sum", self.last_stat
 
-               if l != self.last_stat: # access
+               if l != self.last_stat and l >= 0: # access
                        print "hdd was accessed since previous check!"
                        self.last_stat = l
                        self.last_access = t
index 0e50123..7d27c09 100644 (file)
@@ -42,9 +42,18 @@ def InitLcd():
                def setLCDinverted(configElement):
                        ilcd.setInverted(configElement.value);
 
+               standby_default = 0
+
                ilcd = LCD()
 
-               config.lcd.standby = ConfigSlider(default=0, limits=(0, 10))
+               if not ilcd.isOled():
+                       config.lcd.contrast = ConfigSlider(default=5, limits=(0, 20))
+                       config.lcd.contrast.addNotifier(setLCDcontrast);
+               else:
+                       config.lcd.contrast = ConfigNothing()
+                       standby_default = 1
+
+               config.lcd.standby = ConfigSlider(default=standby_default, limits=(0, 10))
                config.lcd.standby.addNotifier(setLCDbright);
                config.lcd.standby.apply = lambda : setLCDbright(config.lcd.standby)
 
@@ -53,12 +62,6 @@ def InitLcd():
                config.lcd.bright.apply = lambda : setLCDbright(config.lcd.bright)
                config.lcd.bright.callNotifiersOnSaveAndCancel = True
 
-               if not ilcd.isOled():
-                       config.lcd.contrast = ConfigSlider(default=5, limits=(0, 20))
-                       config.lcd.contrast.addNotifier(setLCDcontrast);
-               else:
-                       config.lcd.contrast = ConfigNothing()
-
                config.lcd.invert = ConfigYesNo(default=False)
                config.lcd.invert.addNotifier(setLCDinverted);
        else:
old mode 100644 (file)
new mode 100755 (executable)
index 12f2727..5583b22
@@ -1,6 +1,6 @@
 from MenuList import MenuList
 
-from Tools.Directories import SCOPE_SKIN_IMAGE, resolveFilename
+from Tools.Directories import SCOPE_CURRENT_SKIN, resolveFilename
 from os import path
 
 from enigma import eListboxPythonMultiContent, RT_VALIGN_CENTER, gFont, eServiceCenter
@@ -14,11 +14,11 @@ STATE_REWIND = 3
 STATE_FORWARD = 4
 STATE_NONE = 5
 
-PlayIcon = LoadPixmap(resolveFilename(SCOPE_SKIN_IMAGE, "skin_default/icons/ico_mp_play.png"))
-PauseIcon = LoadPixmap(resolveFilename(SCOPE_SKIN_IMAGE, "skin_default/icons/ico_mp_pause.png"))
-StopIcon = LoadPixmap(resolveFilename(SCOPE_SKIN_IMAGE, "skin_default/icons/ico_mp_stop.png"))
-RewindIcon = LoadPixmap(resolveFilename(SCOPE_SKIN_IMAGE, "skin_default/icons/ico_mp_rewind.png"))
-ForwardIcon = LoadPixmap(resolveFilename(SCOPE_SKIN_IMAGE, "skin_default/icons/ico_mp_forward.png"))
+PlayIcon = LoadPixmap(resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/icons/ico_mp_play.png"))
+PauseIcon = LoadPixmap(resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/icons/ico_mp_pause.png"))
+StopIcon = LoadPixmap(resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/icons/ico_mp_stop.png"))
+RewindIcon = LoadPixmap(resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/icons/ico_mp_rewind.png"))
+ForwardIcon = LoadPixmap(path=resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/icons/ico_mp_forward.png"))
 
 def PlaylistEntryComponent(serviceref, state):
        res = [ serviceref ]
index f65d609..bd10d9c 100755 (executable)
@@ -24,6 +24,7 @@ class Network:
                self.activateConsole = Console()
                self.resetNetworkConsole = Console()
                self.DnsConsole = Console()
+               self.PingConsole = Console()
                self.config_ready = None
                self.getInterfaces()
 
@@ -475,10 +476,17 @@ class Network:
 
        def getLinkStateFinished(self, result, retval,extra_args):
                (callback) = extra_args
+
                if self.LinkConsole is not None:
                        if len(self.LinkConsole.appContainers) == 0:
                                callback(result)
                        
+       def stopPingConsole(self):
+               if self.PingConsole is not None:
+                       if len(self.PingConsole.appContainers):
+                               for name in self.PingConsole.appContainers.keys():
+                                       self.PingConsole.kill(name)
+
        def stopLinkStateConsole(self):
                if self.LinkConsole is not None:
                        if len(self.LinkConsole.appContainers):
index 05204a7..00d0609 100644 (file)
@@ -899,7 +899,7 @@ def InitSecParams():
        x.addNotifier(lambda configElement: secClass.setParam(secClass.DELAY_AFTER_VOLTAGE_CHANGE_BEFORE_MEASURE_IDLE_INPUTPOWER, configElement.value))
        config.sec.delay_after_voltage_change_before_measure_idle_inputpower = x
 
-       x = ConfigInteger(default=750, limits = (0, 9999))
+       x = ConfigInteger(default=900, limits = (0, 9999))
        x.addNotifier(lambda configElement: secClass.setParam(secClass.DELAY_AFTER_ENABLE_VOLTAGE_BEFORE_MOTOR_CMD, configElement.value))
        config.sec.delay_after_enable_voltage_before_motor_command = x
 
@@ -1213,10 +1213,21 @@ def InitNimManager(nimmgr):
                                tmp.lnb = lnb
                                nim.advanced.sat[x] = tmp
 
+       def toneAmplitudeChanged(configElement):
+               fe_id = configElement.fe_id
+               slot_id = configElement.slot_id
+               if nimmgr.nim_slots[slot_id].description == 'Alps BSBE2':
+                       open("/proc/stb/frontend/%d/tone_amplitude" %(fe_id), "w").write(configElement.value)
+
+       empty_slots = 0
        for slot in nimmgr.nim_slots:
                x = slot.slot
                nim = config.Nims[x]
                if slot.isCompatible("DVB-S"):
+                       nim.toneAmplitude = ConfigSelection([("9", "600mV"), ("8", "700mV"), ("7", "800mV"), ("6", "900mV"), ("5", "1100mV")], "7")
+                       nim.toneAmplitude.fe_id = x - empty_slots
+                       nim.toneAmplitude.slot_id = x
+                       nim.toneAmplitude.addNotifier(toneAmplitudeChanged)
                        nim.diseqc13V = ConfigYesNo(False)
                        nim.diseqcMode = ConfigSelection(diseqc_mode_choices, "diseqc_a_b")
                        nim.connectedTo = ConfigSelection([(str(id), nimmgr.getNimDescription(id)) for id in nimmgr.getNimListOfType("DVB-S") if id != x])
@@ -1306,6 +1317,7 @@ def InitNimManager(nimmgr):
                        nim.terrestrial = ConfigSelection(choices = list)
                        nim.terrestrial_5V = ConfigOnOff()
                else:
+                       empty_slots += 1
                        nim.configMode = ConfigSelection(choices = { "nothing": _("disabled") }, default="nothing");
                        if slot.type is not None:
                                print "pls add support for this frontend type!", slot.type
old mode 100644 (file)
new mode 100755 (executable)
old mode 100644 (file)
new mode 100755 (executable)
index 08af7d0..1c5423f
@@ -1,9 +1,9 @@
 from MenuList import MenuList
-from Tools.Directories import resolveFilename, SCOPE_SKIN_IMAGE
+from Tools.Directories import resolveFilename, SCOPE_CURRENT_SKIN
 from enigma import eListboxPythonMultiContent, eListbox, gFont, RT_HALIGN_LEFT
 from Tools.LoadPixmap import LoadPixmap
 
-selectionpng = LoadPixmap(resolveFilename(SCOPE_SKIN_IMAGE, "skin_default/icons/selectioncross.png"))
+selectionpng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/icons/selectioncross.png"))
 
 def SelectionEntryComponent(description, value, index, selected):
        res = [
old mode 100644 (file)
new mode 100755 (executable)
index b0283c1..6095812
@@ -5,7 +5,7 @@ from skin import parseColor, parseFont
 from enigma import eListboxServiceContent, eListbox, eServiceCenter, eServiceReference, gFont, eRect
 from Tools.LoadPixmap import LoadPixmap
 
-from Tools.Directories import resolveFilename, SCOPE_SKIN_IMAGE
+from Tools.Directories import resolveFilename, SCOPE_CURRENT_SKIN
 
 class ServiceList(HTMLComponent, GUIComponent):
        MODE_NORMAL = 0
@@ -15,27 +15,27 @@ class ServiceList(HTMLComponent, GUIComponent):
                GUIComponent.__init__(self)
                self.l = eListboxServiceContent()
 
-               pic = LoadPixmap(resolveFilename(SCOPE_SKIN_IMAGE, "skin_default/icons/folder.png"))
+               pic = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/icons/folder.png"))
                if pic:
                        self.l.setPixmap(self.l.picFolder, pic)
 
-               pic = LoadPixmap(resolveFilename(SCOPE_SKIN_IMAGE, "skin_default/icons/marker.png"))
+               pic = LoadPixmap(resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/icons/marker.png"))
                if pic:
                        self.l.setPixmap(self.l.picMarker, pic)
 
-               pic = LoadPixmap(resolveFilename(SCOPE_SKIN_IMAGE, "ico_dvb_s-fs8.png"))
+               pic = LoadPixmap(resolveFilename(SCOPE_CURRENT_SKIN, "ico_dvb_s-fs8.png"))
                if pic:
                        self.l.setPixmap(self.l.picDVB_S, pic)
 
-               pic = LoadPixmap(resolveFilename(SCOPE_SKIN_IMAGE, "ico_dvb_c-fs8.png"))
+               pic = LoadPixmap(resolveFilename(SCOPE_CURRENT_SKIN, "ico_dvb_c-fs8.png"))
                if pic:
                        self.l.setPixmap(self.l.picDVB_C, pic)
 
-               pic = LoadPixmap(resolveFilename(SCOPE_SKIN_IMAGE, "ico_dvb_t-fs8.png"))
+               pic = LoadPixmap(resolveFilename(SCOPE_CURRENT_SKIN, "ico_dvb_t-fs8.png"))
                if pic:
                        self.l.setPixmap(self.l.picDVB_T, pic)
 
-               pic = LoadPixmap(resolveFilename(SCOPE_SKIN_IMAGE, "ico_service_group-fs8.png"))
+               pic = LoadPixmap(resolveFilename(SCOPE_CURRENT_SKIN, "ico_service_group-fs8.png"))
                if pic:
                        self.l.setPixmap(self.l.picServiceGroup, pic)
 
index d2b405a..f9c4065 100644 (file)
@@ -1,5 +1,6 @@
 from enigma import eDVBResourceManager
 from Tools.Directories import fileExists
+from Tools.HardwareInfo import HardwareInfo
 
 SystemInfo = { }
 
@@ -27,3 +28,4 @@ def countFrontpanelLEDs():
 SystemInfo["NumFrontpanelLEDs"] = countFrontpanelLEDs()
 SystemInfo["FrontpanelDisplay"] = fileExists("/dev/dbox/oled0") or fileExists("/dev/dbox/lcd0")
 SystemInfo["FrontpanelDisplayGrayscale"] = fileExists("/dev/dbox/oled0")
+SystemInfo["DeepstandbySupport"] = HardwareInfo().get_device_name() != "dm800"
old mode 100644 (file)
new mode 100755 (executable)
index 44a7eb4..2a7405d
@@ -7,7 +7,7 @@ from enigma import eListboxPythonMultiContent, eListbox, gFont, \
        RT_HALIGN_LEFT, RT_HALIGN_RIGHT, RT_VALIGN_CENTER
 from Tools.LoadPixmap import LoadPixmap
 from timer import TimerEntry
-from Tools.Directories import resolveFilename, SCOPE_SKIN_IMAGE
+from Tools.Directories import resolveFilename, SCOPE_CURRENT_SKIN
 
 class TimerList(HTMLComponent, GUIComponent, object):
 #
@@ -65,7 +65,7 @@ class TimerList(HTMLComponent, GUIComponent, object):
                res.append((eListboxPythonMultiContent.TYPE_TEXT, width-150, 50, 150, 20, 1, RT_HALIGN_RIGHT|RT_VALIGN_CENTER, state))
 
                if timer.disabled:
-                       png = LoadPixmap(resolveFilename(SCOPE_SKIN_IMAGE, "skin_default/icons/redx.png"))
+                       png = LoadPixmap(resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/icons/redx.png"))
                        res.append((eListboxPythonMultiContent.TYPE_PIXMAP_ALPHATEST, 490, 5, 40, 40, png))
                return res
 
index 6fcab8b..6082710 100644 (file)
@@ -1,12 +1,13 @@
 from Components.Harddisk import harddiskmanager
 from config import ConfigSubsection, ConfigYesNo, config, ConfigSelection, ConfigText, ConfigNumber, ConfigSet, ConfigLocations
+from Tools.Directories import resolveFilename, SCOPE_HDD
 from enigma import Misc_Options, setTunerTypePriorityOrder;
 from SystemInfo import SystemInfo
 import os
 
 def InitUsageConfig():
        config.usage = ConfigSubsection();
-       config.usage.showdish = ConfigYesNo(default = False)
+       config.usage.showdish = ConfigYesNo(default = True)
        config.usage.multibouquet = ConfigYesNo(default = False)
        config.usage.quickzap_bouquet_change = ConfigYesNo(default = False)
        config.usage.e1like_radio_mode = ConfigYesNo(default = False)
@@ -30,8 +31,11 @@ def InitUsageConfig():
                ("standard", _("standard")), ("swap", _("swap PiP and main picture")),
                ("swapstop", _("move PiP to main picture")), ("stop", _("stop PiP")) ])
 
+       config.usage.default_path = ConfigText(default = resolveFilename(SCOPE_HDD))
+       config.usage.timer_path = ConfigText(default = "<default>")
+       config.usage.instantrec_path = ConfigText(default = "<default>")
+       config.usage.timeshift_path = ConfigText(default = "/media/hdd/")
        config.usage.allowed_timeshift_paths = ConfigLocations(default = ["/media/hdd/"])
-       config.usage.timeshift_path = ConfigText(default = "/media/hdd")
 
        config.usage.on_movie_start = ConfigSelection(default = "ask", choices = [
                ("ask", _("Ask user")), ("resume", _("Resume from last position")), ("beginning", _("Start from the beginning")) ])
@@ -65,19 +69,19 @@ def InitUsageConfig():
        
        def TunerTypePriorityOrderChanged(configElement):
                setTunerTypePriorityOrder(int(configElement.value))
-       config.usage.alternatives_priority.addNotifier(TunerTypePriorityOrderChanged)
+       config.usage.alternatives_priority.addNotifier(TunerTypePriorityOrderChanged, immediate_feedback=False)
 
        def setHDDStandby(configElement):
                for hdd in harddiskmanager.HDDList():
                        hdd[1].setIdleTime(int(configElement.value))
-       config.usage.hdd_standby.addNotifier(setHDDStandby)
+       config.usage.hdd_standby.addNotifier(setHDDStandby, immediate_feedback=False)
 
        def set12VOutput(configElement):
                if configElement.value == "on":
                        Misc_Options.getInstance().set_12V_output(1)
                elif configElement.value == "off":
                        Misc_Options.getInstance().set_12V_output(0)
-       config.usage.output_12V.addNotifier(set12VOutput)
+       config.usage.output_12V.addNotifier(set12VOutput, immediate_feedback=False)
 
        SystemInfo["12V_Output"] = Misc_Options.getInstance().detected_12V_output()
 
@@ -128,3 +132,23 @@ def updateChoices(sel, choices):
                                        defval = str(x)
                                        break
                sel.setChoices(map(str, choices), defval)
+
+def preferredPath(path):
+       if config.usage.setup_level.index < 2 or path == "<default>":
+               return None  # config.usage.default_path.value, but delay lookup until usage
+       elif path == "<current>":
+               return config.movielist.last_videodir.value
+       elif path == "<timer>":
+               return config.movielist.last_timer_videodir.value
+       else:
+               return path
+
+def preferredTimerPath():
+       return preferredPath(config.usage.timer_path.value)
+
+def preferredInstantRecordPath():
+       return preferredPath(config.usage.instantrec_path.value)
+
+def defaultMoviePath():
+       return config.usage.default_path.value
+
index 1f8709b..471b59e 100755 (executable)
@@ -1,6 +1,6 @@
 from enigma import getPrevAsciiCode
 from Tools.NumericalTextInput import NumericalTextInput
-from Tools.Directories import resolveFilename, SCOPE_CONFIG
+from Tools.Directories import resolveFilename, SCOPE_CONFIG, fileExists
 from Components.Harddisk import harddiskmanager
 from copy import copy as copy_copy
 from os import path as os_path
@@ -1138,6 +1138,9 @@ class ConfigDirectory(ConfigText):
                else:
                        return ConfigText.getMulti(self, selected)
 
+       def onSelect(self, session):
+               self.allmarked = (self.value != "")
+
 # a slider.
 class ConfigSlider(ConfigElement):
        def __init__(self, default = 0, increment = 1, limits = (0, 100)):
@@ -1283,7 +1286,6 @@ class ConfigLocations(ConfigElement):
                self.default = default
                self.locations = []
                self.mountpoints = []
-               harddiskmanager.on_partition_list_change.append(self.mountpointsChanged)
                self.value = default[:]
 
        def setValue(self, value):
@@ -1320,7 +1322,7 @@ class ConfigLocations(ConfigElement):
                locations = [[x, None, False, False] for x in tmp]
                self.refreshMountpoints()
                for x in locations:
-                       if os_path.exists(x[0]):
+                       if fileExists(x[0]):
                                x[1] = self.getMountpoint(x[0])
                                x[2] = True
                self.locations = locations
@@ -1339,20 +1341,11 @@ class ConfigLocations(ConfigElement):
                        return False
                return self.tostring([x[0] for x in locations]) != sv
 
-       def mountpointsChanged(self, action, dev):
-               print "Mounts changed: ", action, dev
-               mp = dev.mountpoint+"/"
-               if action == "add":
-                       self.addedMount(mp)
-               elif action == "remove":
-                       self.removedMount(mp)
-               self.refreshMountpoints()
-
        def addedMount(self, mp):
                for x in self.locations:
                        if x[1] == mp:
                                x[2] = True
-                       elif x[1] == None and os_path.exists(x[0]):
+                       elif x[1] == None and fileExists(x[0]):
                                x[1] = self.getMountpoint(x[0])
                                x[2] = True
 
@@ -1362,7 +1355,7 @@ class ConfigLocations(ConfigElement):
                                x[2] = False
 
        def refreshMountpoints(self):
-               self.mountpoints = [p.mountpoint + "/" for p in harddiskmanager.getMountedPartitions() if p.mountpoint != "/"]
+               self.mountpoints = [p.mountpoint for p in harddiskmanager.getMountedPartitions() if p.mountpoint != "/"]
                self.mountpoints.sort(key = lambda x: -len(x))
 
        def checkChangedMountpoints(self):
old mode 100644 (file)
new mode 100755 (executable)
index 23edc8e..1431caf
@@ -8,7 +8,7 @@
                     <packagename>enigma2-plugin-extensions-cutlisteditor</packagename>
                     <shortdescription>CutListEditor allows you to edit your movies.</shortdescription>
                     <description>CutListEditor allows you to edit your movies.\nSeek to the start of the stuff you want to cut away. Press OK, select 'start cut'.\nThen seek to the end, press OK, select 'end cut'. That's it.</description>
-                    <screenshot src="http://www.dreamboxupdate.com/preview/cutlisteditor.jpg" />
+                    <screenshot src="http://www.dreamboxupdate.com/preview/plugin_cutlisteditor.jpg" />
           </info>
           <info language="de">
                     <author>Dream Multimedia</author>
@@ -17,7 +17,7 @@
                     <shortdescription>Mit dem Schnitteditor können Sie Ihre Aufnahmen schneiden.</shortdescription>
                     <description>Mit dem Schnitteditor können Sie Ihre Aufnahmen schneiden.\nSpulen Sie zum Anfang des zu schneidenden Teils der Aufnahme. Drücken Sie dann OK und wählen Sie: 'start cut'.\nDann spulen Sie zum Ende, drücken OK und wählen 'end cut'. Das ist alles.
                     </description>
-                    <screenshot src="http://www.dreamboxupdate.com/preview/cutlisteditor.jpg" />
+                    <screenshot src="http://www.dreamboxupdate.com/preview/plugin_cutlisteditor.jpg" />
           </info>
          <files type="package"> <!-- without version, without .ipk -->
                <file type="package" name="enigma2-plugin-extensions-cutlisteditor" />
index 7566346..abd606d 100644 (file)
@@ -7,6 +7,7 @@ from Components.ActionMap import HelpableActionMap
 from Components.MultiContent import MultiContentEntryText
 from Components.ServiceEventTracker import ServiceEventTracker, InfoBarBase
 from Components.VideoWindow import VideoWindow
+from Components.Label import Label
 from Screens.InfoBarGenerics import InfoBarSeek, InfoBarCueSheetSupport
 from Components.GUIComponent import GUIComponent
 from enigma import eListboxPythonMultiContent, eListbox, gFont, iPlayableService, RT_HALIGN_RIGHT
@@ -119,12 +120,13 @@ class CutListEditor(Screen, InfoBarBase, InfoBarSeek, InfoBarCueSheetSupport, He
                <widget source="session.CurrentService" render="Label" position="135,405" size="450,50" font="Regular;22" halign="center" valign="center">
                        <convert type="ServiceName">Name</convert>
                </widget>
-               <widget source="session.CurrentService" render="Label" position="50,450" zPosition="1" size="620,25" font="Regular;20" halign="center" valign="center">
+               <widget source="session.CurrentService" render="Label" position="320,450" zPosition="1" size="420,25" font="Regular;20" halign="left" valign="center">
                        <convert type="ServicePosition">Position,Detailed</convert>
                </widget>
-               <eLabel position="62,98" size="179,274" backgroundColor="#505555" />
-               <eLabel position="64,100" size="175,270" backgroundColor="#000000" />
-               <widget source="cutlist" position="64,100" zPosition="1" size="175,270" scrollbarMode="showOnDemand" transparent="1" render="Listbox" >
+               <widget name="SeekState" position="210,450" zPosition="1" size="100,25" halign="right" font="Regular;20" valign="center" />
+               <eLabel position="48,98" size="204,274" backgroundColor="#505555" />
+               <eLabel position="50,100" size="200,270" backgroundColor="#000000" />
+               <widget source="cutlist" position="50,100" zPosition="1" size="200,270" scrollbarMode="showOnDemand" transparent="1" render="Listbox" >
                        <convert type="TemplatedMultiContent">
                                {"template": [
                                                MultiContentEntryText(size=(125, 20), text = 1, backcolor = MultiContentTemplateColor(3)),
@@ -161,6 +163,9 @@ class CutListEditor(Screen, InfoBarBase, InfoBarSeek, InfoBarCueSheetSupport, He
                self["Timeline"] = ServicePositionGauge(self.session.nav)
                self["cutlist"] = List(self.getCutlist())
                self["cutlist"].onSelectionChanged.append(self.selectionChanged)
+               self["SeekState"] = Label()
+               self.onPlayStateChanged.append(self.updateStateLabel)
+               self.updateStateLabel(self.seekstate)
 
                self["Video"] = VideoWindow(decoder = 0)
 
@@ -184,12 +189,16 @@ class CutListEditor(Screen, InfoBarBase, InfoBarSeek, InfoBarCueSheetSupport, He
                        })
 
                # to track new entries we save the last version of the cutlist
-               self.last_cuts = [ ]
+               self.last_cuts = self.getCutlist()
                self.cut_start = None
+               self.inhibit_seek = False
                self.onClose.append(self.__onClose)
 
        def __onClose(self):
-               self.session.nav.playService(self.old_service)
+               self.session.nav.playService(self.old_service, forceRestart=True)
+
+       def updateStateLabel(self, state):
+               self["SeekState"].setText(state[3].strip())
 
        def showTutorial(self):
                if not self.tutorial_seen:
@@ -238,44 +247,46 @@ class CutListEditor(Screen, InfoBarBase, InfoBarSeek, InfoBarCueSheetSupport, He
                return r
 
        def selectionChanged(self):
-               where = self["cutlist"].getCurrent()
-               if where is None:
-                       print "no selection"
-                       return
-               pts = where[0][0]
-               seek = self.getSeek()
-               if seek is None:
-                       print "no seek"
-                       return
-               seek.seekTo(pts)
+               if not self.inhibit_seek:
+                       where = self["cutlist"].getCurrent()
+                       if where is None:
+                               print "no selection"
+                               return
+                       pts = where[0][0]
+                       seek = self.getSeek()
+                       if seek is None:
+                               print "no seek"
+                               return
+                       seek.seekTo(pts)
 
        def refillList(self):
                print "cue sheet changed, refilling"
                self.downloadCuesheet()
 
-               # get the first changed entry, and select it
+               # get the first changed entry, counted from the end, and select it
                new_list = self.getCutlist()
                self["cutlist"].list = new_list
 
-               for i in range(min(len(new_list), len(self.last_cuts))):
-                       if new_list[i] != self.last_cuts[i]:
-                               self["cutlist"].setIndex(i)
+               l1 = len(new_list)
+               l2 = len(self.last_cuts)
+               for i in range(min(l1, l2)):
+                       if new_list[l1-i-1] != self.last_cuts[l2-i-1]:
+                               self["cutlist"].setIndex(l1-i-1)
                                break
                self.last_cuts = new_list
 
        def getStateForPosition(self, pos):
-               state = 0 # in
-
-               # when first point is "in", the beginning is "out"
-               if len(self.cut_list) and self.cut_list[0][1] == 0:
-                       state = 1
-
+               state = -1
                for (where, what) in self.cut_list:
-                       if where < pos:
-                               if what == 0: # in
-                                       state = 0
-                               elif what == 1: # out
+                       if what in [0, 1]:
+                               if where < pos:
+                                       state = what
+                               elif where == pos:
                                        state = 1
+                               elif state == -1:
+                                       state = 1 - what
+               if state == -1:
+                       state = 0
                return state
 
        def showMenu(self):
@@ -329,11 +340,11 @@ class CutListEditor(Screen, InfoBarBase, InfoBarSeek, InfoBarCueSheetSupport, He
                        in_after = None
 
                        for (where, what) in self.cut_list:
-                               if what == 1 and where < self.context_position: # out
+                               if what == 1 and where <= self.context_position: # out
                                        out_before = (where, what)
                                elif what == 0 and where < self.context_position: # in, before out
                                        out_before = None
-                               elif what == 0 and where > self.context_position and in_after is None:
+                               elif what == 0 and where >= self.context_position and in_after is None:
                                        in_after = (where, what)
 
                        if out_before is not None:
@@ -341,12 +352,16 @@ class CutListEditor(Screen, InfoBarBase, InfoBarSeek, InfoBarCueSheetSupport, He
 
                        if in_after is not None:
                                self.cut_list.remove(in_after)
+                       self.inhibit_seek = True
                        self.uploadCuesheet()
+                       self.inhibit_seek = False
                elif result == CutListContextMenu.RET_MARK:
                        self.__addMark()
                elif result == CutListContextMenu.RET_DELETEMARK:
                        self.cut_list.remove(self.context_nearest_mark)
+                       self.inhibit_seek = True
                        self.uploadCuesheet()
+                       self.inhibit_seek = False
                elif result == CutListContextMenu.RET_REMOVEBEFORE:
                        # remove in/out marks before current position
                        for (where, what) in self.cut_list[:]:
@@ -354,7 +369,9 @@ class CutListEditor(Screen, InfoBarBase, InfoBarSeek, InfoBarCueSheetSupport, He
                                        self.cut_list.remove((where, what))
                        # add 'in' point
                        bisect.insort(self.cut_list, (self.context_position, 0))
+                       self.inhibit_seek = True
                        self.uploadCuesheet()
+                       self.inhibit_seek = False
                elif result == CutListContextMenu.RET_REMOVEAFTER:
                        # remove in/out marks after current position
                        for (where, what) in self.cut_list[:]:
@@ -362,7 +379,9 @@ class CutListEditor(Screen, InfoBarBase, InfoBarSeek, InfoBarCueSheetSupport, He
                                        self.cut_list.remove((where, what))
                        # add 'out' point
                        bisect.insort(self.cut_list, (self.context_position, 1))
+                       self.inhibit_seek = True
                        self.uploadCuesheet()
+                       self.inhibit_seek = False
                elif result == CutListContextMenu.RET_GRABFRAME:
                        self.grabFrame()
 
index 44075d6..642a898 100644 (file)
@@ -264,6 +264,7 @@ class WaitForResidentTasks(Task):
                
        def run(self, callback):
                print "waiting for %d resident task(s) %s to finish..." % (len(self.job.resident_tasks),str(self.job.resident_tasks))
+               self.callback = callback
                if self.job.resident_tasks == 0:
                        callback(self, [])
 
index c4289cb..a1c3884 100755 (executable)
@@ -8,7 +8,6 @@ from Components.Sources.List import List
 from Components.Sources.StaticText import StaticText
 from Components.Sources.Progress import Progress
 from Components.FileList import FileList
-from enigma import eListboxPythonMultiContent, gFont, RT_HALIGN_LEFT
 from Tools.Directories import fileExists, resolveFilename, SCOPE_PLUGINS, SCOPE_FONTS, SCOPE_HDD
 from Components.config import config, getConfigListEntry
 from Components.ConfigList import ConfigListScreen
@@ -235,7 +234,6 @@ class ProjectSettings(Screen,ConfigListScreen):
                                self.session.open(MessageBox,self.project.error,MessageBox.TYPE_ERROR)
                elif scope == "project":
                        if self.project.loadProject(path):
-                               configRef.setValue(path)
                                self.initConfigList()
                        else:
                                self.session.open(MessageBox,self.project.error,MessageBox.TYPE_ERROR)
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..0a664eb 100755 (executable)
@@ -9,7 +9,7 @@ from Components.Sources.StaticText import StaticText
 from Components.Sources.Progress import Progress
 from Components.FileList import FileList
 from Components.Pixmap import Pixmap
-from enigma import eListboxPythonMultiContent, gFont, RT_HALIGN_LEFT, ePicLoad
+from enigma import ePicLoad
 from Tools.Directories import fileExists, resolveFilename, SCOPE_PLUGINS, SCOPE_FONTS, SCOPE_HDD
 from Components.config import config, getConfigListEntry, ConfigInteger, ConfigSubsection, ConfigSelection
 from Components.ConfigList import ConfigListScreen
@@ -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 1899cb7..0b3be7d 100755 (executable)
@@ -1,3 +1,5 @@
 installdir = $(datadir)/meta/
 
 dist_install_DATA = plugin_dvdburn.xml
+
+EXTRA_DIST = dvdburn_de.jpg dvdburn_en.jpg
diff --git a/lib/python/Plugins/Extensions/DVDBurn/meta/dvdburn_de.jpg b/lib/python/Plugins/Extensions/DVDBurn/meta/dvdburn_de.jpg
new file mode 100755 (executable)
index 0000000..4472971
Binary files /dev/null and b/lib/python/Plugins/Extensions/DVDBurn/meta/dvdburn_de.jpg differ
diff --git a/lib/python/Plugins/Extensions/DVDBurn/meta/dvdburn_en.jpg b/lib/python/Plugins/Extensions/DVDBurn/meta/dvdburn_en.jpg
new file mode 100755 (executable)
index 0000000..509816d
Binary files /dev/null and b/lib/python/Plugins/Extensions/DVDBurn/meta/dvdburn_en.jpg differ
old mode 100644 (file)
new mode 100755 (executable)
index 7971539..647d1cf
@@ -9,6 +9,7 @@
                     <packagename>enigma2-plugin-extensions-dvdburn</packagename>
                     <shortdescription>With DVDBurn you can burn your recordings to a dvd.</shortdescription>
                     <description>With DVDBurn you can burn your recordings to a dvd.\nArchive all your favorite movies to recordable dvds with menus if wanted.</description>
+                    <screenshot src="http://www.dreamboxupdate.com/preview/plugin_dvdburn_en.jpg" />
           </info>
           <info language="de">
                     <author>Dream Multimedia</author>
@@ -16,6 +17,7 @@
                     <packagename>enigma2-plugin-extensions-dvdburn</packagename>
                     <shortdescription>Mit DVDBurn brennen Sie ihre Aufnahmen auf DVD.</shortdescription>
                     <description>Mit DVDBurn brennen Sie ihre Aufnahmen auf DVD.\nArchivieren Sie Ihre Liblingsfilme auf DVD mit Menus wenn Sie es wünschen.</description>
+                    <screenshot src="http://www.dreamboxupdate.com/preview/plugin_dvdburn_de.jpg" />
           </info>
          <files type="package"> <!-- without version, without .ipk -->
                <file type="package" name="enigma2-plugin-extensions-dvdburn" />
old mode 100644 (file)
new mode 100755 (executable)
index 2658138..1353f7d
@@ -8,7 +8,7 @@
                     <packagename>enigma2-plugin-extensions-dvdplayer</packagename>
                     <shortdescription>DVDPlayer plays your DVDs on your Dreambox.</shortdescription>
                     <description>DVDPlayer plays your DVDs on your Dreambox.\nWith the DVDPlayer you can play your DVDs on your Dreambox from a DVD or even from an iso file or video_ts folder on your harddisc or network.</description>
-                    <screenshot src="http://www.dreamboxupdate.com/preview/dvdplayer.jpg" />
+                    <screenshot src="http://www.dreamboxupdate.com/preview/plugin_dvdplayer.jpg" />
           </info>
           <info language="de">
                     <author>Dream Multimedia</author>
@@ -17,7 +17,7 @@
                     <shortdescription>Spielen Sie Ihre DVDs mit dem DVDPlayer auf Ihrer Dreambox ab.</shortdescription>
                     <description>Spielen Sie Ihre DVDs mit dem DVDPlayer auf Ihrer Dreambox ab.\nMit dem DVDPlayer können Sie Ihre DVDs auf Ihrer Dreambox abspielen. Dabei ist es egal ob Sie von DVD, iso-Datei oder sogar direkt von einer video_ts Ordnerstruktur von Ihrer Festplatte oder dem Netzwerk abspielen.
                     </description>
-                    <screenshot src="http://www.dreamboxupdate.com/preview/dvdplayer.jpg" />
+                    <screenshot src="http://www.dreamboxupdate.com/preview/plugin_dvdplayer.jpg" />
           </info>
          <files type="package"> <!-- without version, without .ipk -->
                <file type="package" name="enigma2-plugin-extensions-dvdplayer" />
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)
old mode 100644 (file)
new mode 100755 (executable)
index b22c4b8..1d621f4
@@ -16,7 +16,7 @@ from Screens.TimerEntry import TimerEntry
 from Screens.EpgSelection import EPGSelection
 from Screens.TimerEdit import TimerSanityConflict
 from Screens.MessageBox import MessageBox
-from Tools.Directories import resolveFilename, SCOPE_SKIN_IMAGE
+from Tools.Directories import resolveFilename, SCOPE_CURRENT_SKIN
 from RecordTimer import RecordTimerEntry, parseEvent, AFTEREVENT
 from ServiceReference import ServiceReference
 from Tools.LoadPixmap import LoadPixmap
@@ -41,11 +41,11 @@ class EPGList(HTMLComponent, GUIComponent):
                if overjump_empty:
                        self.l.setSelectableFunc(self.isSelectable)
                self.epgcache = eEPGCache.getInstance()
-               self.clock_pixmap = LoadPixmap(resolveFilename(SCOPE_SKIN_IMAGE, 'skin_default/icons/epgclock.png'))
-               self.clock_add_pixmap = LoadPixmap(resolveFilename(SCOPE_SKIN_IMAGE, 'skin_default/icons/epgclock_add.png'))
-               self.clock_pre_pixmap = LoadPixmap(resolveFilename(SCOPE_SKIN_IMAGE, 'skin_default/icons/epgclock_pre.png'))
-               self.clock_post_pixmap = LoadPixmap(resolveFilename(SCOPE_SKIN_IMAGE, 'skin_default/icons/epgclock_post.png'))
-               self.clock_prepost_pixmap = LoadPixmap(resolveFilename(SCOPE_SKIN_IMAGE, 'skin_default/icons/epgclock_prepost.png'))
+               self.clock_pixmap = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_SKIN, 'skin_default/icons/epgclock.png'))
+               self.clock_add_pixmap = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_SKIN, 'skin_default/icons/epgclock_add.png'))
+               self.clock_pre_pixmap = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_SKIN, 'skin_default/icons/epgclock_pre.png'))
+               self.clock_post_pixmap = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_SKIN, 'skin_default/icons/epgclock_post.png'))
+               self.clock_prepost_pixmap = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_SKIN, 'skin_default/icons/epgclock_prepost.png'))
                self.time_base = None
                self.time_epoch = time_epoch
                self.list = None
old mode 100644 (file)
new mode 100755 (executable)
index 8dfdbbf..b68d095
Binary files a/lib/python/Plugins/Extensions/GraphMultiEPG/meta/graphmultiepg_de.jpg and b/lib/python/Plugins/Extensions/GraphMultiEPG/meta/graphmultiepg_de.jpg differ
old mode 100644 (file)
new mode 100755 (executable)
index 95b6665..6953f27
Binary files a/lib/python/Plugins/Extensions/GraphMultiEPG/meta/graphmultiepg_en.jpg and b/lib/python/Plugins/Extensions/GraphMultiEPG/meta/graphmultiepg_en.jpg differ
old mode 100644 (file)
new mode 100755 (executable)
index 7b0b134..a10840d
@@ -9,7 +9,7 @@
                     <packagename>eenigma2-plugin-extensions-graphmultiepg</packagename>
                     <shortdescription>GraphMultiEPG shows a graphical timeline EPG.</shortdescription>
                     <description>GraphMultiEPG shows a graphical timeline EPG.\nShows a nice overview of all running und upcoming tv shows.</description>
-                    <screenshot src="http://www.dreamboxupdate.com/preview/graphmultiepg_en.jpg" />
+                    <screenshot src="http://www.dreamboxupdate.com/preview/plugin_graphmultiepg_en.jpg" />
           </info>
           <info language="de">
                     <author>Dream Multimedia</author>
@@ -18,7 +18,7 @@
                     <shortdescription>Zeigt ein grafisches Zeitlinien-EPG.</shortdescription>
                     <description>Zeigt ein grafisches Zeitlinien-EPG.\nZeigt eine grafische Übersicht aller laufenden und kommenden Sendungen.
                     </description>
-                    <screenshot src="http://www.dreamboxupdate.com/preview/graphmultiepg_de.jpg" />
+                    <screenshot src="http://www.dreamboxupdate.com/preview/plugin_graphmultiepg_de.jpg" />
           </info>
          <files type="package"> <!-- without version, without .ipk -->
                <file type="package" name="enigma2-plugin-extensions-graphmultiepg" />
old mode 100644 (file)
new mode 100755 (executable)
index 4396161..41a67c2
Binary files a/lib/python/Plugins/Extensions/MediaPlayer/meta/mediaplayer_de.jpg and b/lib/python/Plugins/Extensions/MediaPlayer/meta/mediaplayer_de.jpg differ
old mode 100644 (file)
new mode 100755 (executable)
index e1d3575..6bfbbc5
Binary files a/lib/python/Plugins/Extensions/MediaPlayer/meta/mediaplayer_en.jpg and b/lib/python/Plugins/Extensions/MediaPlayer/meta/mediaplayer_en.jpg differ
old mode 100644 (file)
new mode 100755 (executable)
index 825793f..2f9f22b
@@ -8,7 +8,7 @@
                     <packagename>enigma2-plugin-extensions-mediaplayer</packagename>
                     <shortdescription>Mediaplayer plays your favorite music and videos.</shortdescription>
                     <description>Mediaplayer plays your favorite music and videos.\nPlay all your favorite music and video files, organize them in playlists, view cover and album information.</description>
-                    <screenshot src="http://www.dreamboxupdate.com/preview/mediaplayer_en.jpg" />
+                    <screenshot src="http://www.dreamboxupdate.com/preview/plugin_mediaplayer_en.jpg" />
           </info>
           <info language="de">
                     <author>Dream Multimedia</author>
@@ -17,7 +17,7 @@
                     <shortdescription>Mediaplayer spielt Ihre Musik und Videos.</shortdescription>
                     <description>Mediaplayer spielt Ihre Musik und Videos.\nSie können all Ihre Musik- und Videodateien abspielen, in Playlisten organisieren, Cover und Albuminformationen abrufen.
                     </description>
-                    <screenshot src="http://www.dreamboxupdate.com/preview/mediaplayer_de.jpg" />
+                    <screenshot src="http://www.dreamboxupdate.com/preview/plugin_mediaplayer_de.jpg" />
           </info>
          <files type="package"> <!-- without version, without .ipk -->
                <file type="package" name="enigma2-plugin-extensions-mediaplayer" />
old mode 100644 (file)
new mode 100755 (executable)
index 98bc060..036bbbb
@@ -19,7 +19,7 @@ from Components.Playlist import PlaylistIOInternal, PlaylistIOM3U, PlaylistIOPLS
 from Components.AVSwitch import AVSwitch
 from Components.Harddisk import harddiskmanager
 from Components.config import config
-from Tools.Directories import fileExists, pathExists, resolveFilename, SCOPE_CONFIG, SCOPE_PLAYLIST, SCOPE_SKIN_IMAGE
+from Tools.Directories import fileExists, pathExists, resolveFilename, SCOPE_CONFIG, SCOPE_PLAYLIST, SCOPE_CURRENT_SKIN
 from settings import MediaPlayerSettings
 import random
 
@@ -50,7 +50,7 @@ class MediaPixmap(Pixmap):
                                        noCoverFile = value
                                        break
                if noCoverFile is None:
-                       noCoverFile = resolveFilename(SCOPE_SKIN_IMAGE, "skin_default/no_coverArt.png")
+                       noCoverFile = resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/no_coverArt.png")
                self.noCoverPixmap = LoadPixmap(noCoverFile)
                return Pixmap.applySkin(self, desktop, screen)
 
index e2aa0e3..d80b8c2 100755 (executable)
@@ -1,3 +1,5 @@
 installdir = $(datadir)/meta/
 
 dist_install_DATA = plugin_mediascanner.xml
+
+EXTRA_DIST = mediascanner_de.jpg mediascanner_en.jpg
diff --git a/lib/python/Plugins/Extensions/MediaScanner/meta/mediascanner_de.jpg b/lib/python/Plugins/Extensions/MediaScanner/meta/mediascanner_de.jpg
new file mode 100755 (executable)
index 0000000..e6a191c
Binary files /dev/null and b/lib/python/Plugins/Extensions/MediaScanner/meta/mediascanner_de.jpg differ
diff --git a/lib/python/Plugins/Extensions/MediaScanner/meta/mediascanner_en.jpg b/lib/python/Plugins/Extensions/MediaScanner/meta/mediascanner_en.jpg
new file mode 100755 (executable)
index 0000000..b9561c2
Binary files /dev/null and b/lib/python/Plugins/Extensions/MediaScanner/meta/mediascanner_en.jpg differ
old mode 100644 (file)
new mode 100755 (executable)
index d899fdb..eced924
@@ -9,6 +9,7 @@
                     <packagename>enigma2-plugin-extensions-mediascanner</packagename>
                     <shortdescription>MediaScanner scans devices for playable media files.</shortdescription>
                     <description>MediaScanner scans devices for playable media files and displays a menu with possible actions like viewing pictures or playing movies.</description>
+                    <screenshot src="http://www.dreamboxupdate.com/preview/plugin_mediascanner_en.jpg" />
           </info>
           <info language="de">
                     <author>Dream Multimedia</author>
@@ -17,6 +18,7 @@
                     <shortdescription>MediaScanner durchsucht Geräte nach Mediendateien.</shortdescription>
                     <description>MediaScanner durchsucht Geräte nach Mediendateien  und bietet Ihnen die dazu passenden Aktionen an wie z.B. Bilder betrachten oder Videos abspielen.
                     </description>
+                    <screenshot src="http://www.dreamboxupdate.com/preview/plugin_mediascanner_en.jpg" />
           </info>
          <files type="package"> <!-- without version, without .ipk -->
                <file type="package" name="enigma2-plugin-extensions-mediascanner" />
old mode 100644 (file)
new mode 100755 (executable)
index 40e59b6..faff978
@@ -8,7 +8,7 @@
                     <packagename>enigma2-plugin-extensions-pictureplayer</packagename>
                     <shortdescription>PicturePlayer displays your photos on the TV.</shortdescription>
                     <description>The PicturePlayer displays your photos on the TV.\nYou can view them as thumbnails or slideshow.</description>
-                    <screenshot src="http://www.dreamboxupdate.com/preview/pictureplayer.jpg" />
+                    <screenshot src="http://www.dreamboxupdate.com/preview/plugin_pictureplayer.jpg" />
           </info>
           <info language="de">
                     <author>Dream Multimedia</author>
@@ -17,7 +17,7 @@
                     <shortdescription>Der Bildbetrachter zeigt Ihre Bilder auf dem Fernseher an.</shortdescription>
                     <description>Der Bildbetrachter zeigt Ihre Bilder auf dem Fernseher an.\nSie können sich Ihre Bilder als Thumbnails, einzeln oder als Slideshow anzeigen lassen.
                     </description>
-                    <screenshot src="http://www.dreamboxupdate.com/preview/pictureplayer.jpg" />
+                    <screenshot src="http://www.dreamboxupdate.com/preview/plugin_pictureplayer.jpg" />
           </info>
          <files type="package"> <!-- without version, without .ipk -->
                <file type="package" name="enigma2-plugin-extensions-pictureplayer" />
index d7fc689..5a676cd 100755 (executable)
@@ -52,6 +52,15 @@ class PluginDescriptor:
        # reason (True: Networkconfig read finished, False: Networkconfig reload initiated )
        WHERE_NETWORKCONFIG_READ = 12
 
+       WHERE_AUDIOMENU = 13
+
+       # fnc 'SoftwareSupported' or  'AdvancedSoftwareSupported' must take a parameter and return None
+       # if the plugin should not be displayed inside Softwaremanger or return a function which is called with session
+       # and 'None' as parameter to call the plugin from the Softwaremanager menus. "menuEntryName" and "menuEntryDescription"
+       # should be provided to name and describe the new menu entry.
+       WHERE_SOFTWAREMANAGER = 14
+
+
        def __init__(self, name = "Plugin", where = [ ], description = "", icon = None, fnc = None, wakeupfnc = None, internal = False):
                self.name = name
                self.internal = internal
index 94be474..d9d96bc 100755 (executable)
@@ -1,3 +1,5 @@
 installdir = $(datadir)/meta/
 
 dist_install_DATA = plugin_cleanupwizard.xml
+
+EXTRA_DIST = cleanupwizard_de.jpg cleanupwizard_en.jpg
diff --git a/lib/python/Plugins/SystemPlugins/CleanupWizard/meta/cleanupwizard_de.jpg b/lib/python/Plugins/SystemPlugins/CleanupWizard/meta/cleanupwizard_de.jpg
new file mode 100755 (executable)
index 0000000..2f086fb
Binary files /dev/null and b/lib/python/Plugins/SystemPlugins/CleanupWizard/meta/cleanupwizard_de.jpg differ
diff --git a/lib/python/Plugins/SystemPlugins/CleanupWizard/meta/cleanupwizard_en.jpg b/lib/python/Plugins/SystemPlugins/CleanupWizard/meta/cleanupwizard_en.jpg
new file mode 100755 (executable)
index 0000000..d014cb5
Binary files /dev/null and b/lib/python/Plugins/SystemPlugins/CleanupWizard/meta/cleanupwizard_en.jpg differ
index 10ccc73..99add3d 100755 (executable)
@@ -10,6 +10,7 @@
                     <description>The CleanupWizard informs you when your internal free memory of your dreambox has droppen under 2MB.
                    You can use this wizard to remove some extensions.
                     </description>
+                    <screenshot src="http://www.dreamboxupdate.com/preview/plugin_cleanupwizard_en.jpg" />
           </info>
           <info language="de">
                     <author>Dream Multimedia</author>
@@ -19,6 +20,7 @@
                     <description>Der CleanupWizard informiert Sie, wenn der interne freie Speicher Ihrer Dreambox unter 2MB fällt.
                    Sie können dann einige Erweiterungen deinstallieren um wieder Platz zu schaffen.
                     </description>
+                    <screenshot src="http://www.dreamboxupdate.com/preview/plugin_cleanupwizard_de.jpg" />
           </info>
          <files type="package"> <!-- without version, without .ipk -->
                <file type="package" name="enigma2-plugin-systemplugins-cleanupwizard" />
old mode 100644 (file)
new mode 100755 (executable)
index 120ac82..75771f9
Binary files a/lib/python/Plugins/SystemPlugins/CommonInterfaceAssignment/meta/ciassignment.jpg and b/lib/python/Plugins/SystemPlugins/CommonInterfaceAssignment/meta/ciassignment.jpg differ
old mode 100644 (file)
new mode 100755 (executable)
index bb2bf59..9abc598
@@ -13,7 +13,7 @@
                     in your Dreambox and assign to each of them dedicated providers/services or caids.\n
                     So it is then possible to watch a scrambled service while recording another one.
                     </description>
-                    <screenshot src="http://www.dreamboxupdate.com/preview/ciassignment.jpg" />
+                    <screenshot src="http://www.dreamboxupdate.com/preview/plugin_ciassignment.jpg" />
           </info>
           <info language="de">
                     <author>Dream Multimedia</author>
@@ -24,7 +24,7 @@
                     So ist es möglich mit einem CI einen Sender aufzunehmen\n
                     und mit einem anderen einen Sender zu schauen.
                     </description>
-                    <screenshot src="http://www.dreamboxupdate.com/preview/ciassignment.jpg" />
+                    <screenshot src="http://www.dreamboxupdate.com/preview/plugin_ciassignment.jpg" />
           </info>
          <files type="package"> <!-- without version, without .ipk -->
                <file type="package" name="enigma2-plugin-systemplugins-commoninterfaceassignment" />
index b619c8c..aed728d 100755 (executable)
@@ -1,3 +1,5 @@
 installdir = $(datadir)/meta/
 
 dist_install_DATA = plugin_crashlogautosubmit.xml
+
+EXTRA_DIST = crashlogautosubmit_de.jpg crashlogautosubmit_en.jpg
diff --git a/lib/python/Plugins/SystemPlugins/CrashlogAutoSubmit/meta/crashlogautosubmit_de.jpg b/lib/python/Plugins/SystemPlugins/CrashlogAutoSubmit/meta/crashlogautosubmit_de.jpg
new file mode 100755 (executable)
index 0000000..0489416
Binary files /dev/null and b/lib/python/Plugins/SystemPlugins/CrashlogAutoSubmit/meta/crashlogautosubmit_de.jpg differ
diff --git a/lib/python/Plugins/SystemPlugins/CrashlogAutoSubmit/meta/crashlogautosubmit_en.jpg b/lib/python/Plugins/SystemPlugins/CrashlogAutoSubmit/meta/crashlogautosubmit_en.jpg
new file mode 100755 (executable)
index 0000000..5e5c728
Binary files /dev/null and b/lib/python/Plugins/SystemPlugins/CrashlogAutoSubmit/meta/crashlogautosubmit_en.jpg differ
old mode 100644 (file)
new mode 100755 (executable)
index 261eb49..a118ed7
@@ -10,6 +10,7 @@
                     <description>With the CrashlogAutoSubmit extension it is possible to automatically send crashlogs
                    found on your Harddrive to Dream Multimedia
                     </description>
+                    <screenshot src="http://www.dreamboxupdate.com/preview/plugin_crashlogautosubmit_en.jpg" />
           </info>
           <info language="de">
                     <author>Dream Multimedia</author>
@@ -17,8 +18,9 @@
                     <packagename>enigma2-plugin-systemplugins-crashlogautosubmit</packagename>
                     <shortdescription>Automatisches versenden von Crashlogs an Dream Multimedia</shortdescription>
                     <description>Mit dem CrashlogAutoSubmit Plugin ist es möglich auf Ihrer Festplatte
-                   gefundene Crashlogs automatisch  an Dream Multimedia zu versenden.
+                   gefundene Crashlogs automatisch an Dream Multimedia zu versenden.
                     </description>
+                    <screenshot src="http://www.dreamboxupdate.com/preview/plugin_crashlogautosubmit_de.jpg" />
           </info>
          <files type="package"> <!-- without version, without .ipk -->
                <file type="package" name="enigma2-plugin-systemplugins-crashlogautosubmit" />
old mode 100644 (file)
new mode 100755 (executable)
index a0fd3b1..f4d0a1e
Binary files a/lib/python/Plugins/SystemPlugins/DefaultServicesScanner/meta/defaultservicescanner.jpg and b/lib/python/Plugins/SystemPlugins/DefaultServicesScanner/meta/defaultservicescanner.jpg differ
old mode 100644 (file)
new mode 100755 (executable)
index bf0ce25..41d41ed
@@ -10,7 +10,7 @@
                     <shortdescription>Scans default lamedbs sorted by satellite with a connected dish positioner.</shortdescription>
                     <description>With the DefaultServicesScanner extension you can scan default lamedbs sorted by satellite with a connected dish positioner.
                     </description>
-                    <screenshot src="http://www.dreamboxupdate.com/preview/defaultservicescanner.jpg" />
+                    <screenshot src="http://www.dreamboxupdate.com/preview/plugin_defaultservicescanner.jpg" />
           </info>
           <info language="de">
                     <author>Dream Multimedia</author>
@@ -19,7 +19,7 @@
                     <shortdescription>Standard Sendersuche nach Satellit mit einem Rotor.</shortdescription>
                     <description>Mit der DefaultServicesScanner Erweiterung können Sie eine standard Sendersuche nach Satellit mit einem angeschlossenen Rotor durchführen.
                     </description>
-                    <screenshot src="http://www.dreamboxupdate.com/preview/defaultservicescanner.jpg" />
+                    <screenshot src="http://www.dreamboxupdate.com/preview/plugin_defaultservicescanner.jpg" />
           </info>
          <files type="package"> <!-- without version, without .ipk -->
                <file type="package" name="enigma2-plugin-systemplugins-defaultservicesscanner" />
index 8405ed7..9b0a2ed 100755 (executable)
@@ -2,4 +2,4 @@ installdir = $(datadir)/meta/
 
 dist_install_DATA = plugin_diseqctester.xml
 
-EXTRA_DIST = diseqctester.jpg
+EXTRA_DIST = diseqctester_de.jpg diseqctester_en.jpg
diff --git a/lib/python/Plugins/SystemPlugins/DiseqcTester/meta/diseqctester.jpg b/lib/python/Plugins/SystemPlugins/DiseqcTester/meta/diseqctester.jpg
deleted file mode 100644 (file)
index c872334..0000000
Binary files a/lib/python/Plugins/SystemPlugins/DiseqcTester/meta/diseqctester.jpg and /dev/null differ
diff --git a/lib/python/Plugins/SystemPlugins/DiseqcTester/meta/diseqctester_de.jpg b/lib/python/Plugins/SystemPlugins/DiseqcTester/meta/diseqctester_de.jpg
new file mode 100755 (executable)
index 0000000..5a6e153
Binary files /dev/null and b/lib/python/Plugins/SystemPlugins/DiseqcTester/meta/diseqctester_de.jpg differ
diff --git a/lib/python/Plugins/SystemPlugins/DiseqcTester/meta/diseqctester_en.jpg b/lib/python/Plugins/SystemPlugins/DiseqcTester/meta/diseqctester_en.jpg
new file mode 100755 (executable)
index 0000000..43dad76
Binary files /dev/null and b/lib/python/Plugins/SystemPlugins/DiseqcTester/meta/diseqctester_en.jpg differ
old mode 100644 (file)
new mode 100755 (executable)
index 5415db0..33808b3
@@ -10,7 +10,7 @@
                     <shortdescription>Test your Diseqc equipment.</shortdescription>
                     <description>With the DiseqcTester extension you can test your satellite equipment for Diseqc compatibility and errors.
                     </description>
-                    <screenshot src="http://www.dreamboxupdate.com/preview/diseqctester.jpg" />
+                    <screenshot src="http://www.dreamboxupdate.com/preview/plugin_diseqctester_en.jpg" />
           </info>
           <info language="de">
                     <author>Dream Multimedia</author>
@@ -19,7 +19,7 @@
                     <shortdescription>Testet Ihr Diseqc Equipment.</shortdescription>
                     <description>Mit der DiseqcTester Erweiterung können Sie Ihr Satelliten-Equipment nach Diseqc-Kompatibilität und Fehlern überprüfen.
                     </description>
-                    <screenshot src="http://www.dreamboxupdate.com/preview/diseqctester.jpg" />
+                    <screenshot src="http://www.dreamboxupdate.com/preview/plugin_diseqctester_de.jpg" />
           </info>
          <files type="package"> <!-- without version, without .ipk -->
                <file type="package" name="enigma2-plugin-systemplugins-diseqctester" />
index 686bded..0633e7c 100755 (executable)
@@ -2,4 +2,4 @@ installdir = $(datadir)/meta/
 
 dist_install_DATA = plugin_nfiflash.xml
 
-EXTRA_DIST = nfiflash.jpg
+EXTRA_DIST = nfiflash_de.jpg nfiflash_en.jpg
diff --git a/lib/python/Plugins/SystemPlugins/NFIFlash/meta/nfiflash.jpg b/lib/python/Plugins/SystemPlugins/NFIFlash/meta/nfiflash.jpg
deleted file mode 100644 (file)
index 0a5fa46..0000000
Binary files a/lib/python/Plugins/SystemPlugins/NFIFlash/meta/nfiflash.jpg and /dev/null differ
diff --git a/lib/python/Plugins/SystemPlugins/NFIFlash/meta/nfiflash_de.jpg b/lib/python/Plugins/SystemPlugins/NFIFlash/meta/nfiflash_de.jpg
new file mode 100755 (executable)
index 0000000..fec93f4
Binary files /dev/null and b/lib/python/Plugins/SystemPlugins/NFIFlash/meta/nfiflash_de.jpg differ
diff --git a/lib/python/Plugins/SystemPlugins/NFIFlash/meta/nfiflash_en.jpg b/lib/python/Plugins/SystemPlugins/NFIFlash/meta/nfiflash_en.jpg
new file mode 100755 (executable)
index 0000000..32a9967
Binary files /dev/null and b/lib/python/Plugins/SystemPlugins/NFIFlash/meta/nfiflash_en.jpg differ
old mode 100644 (file)
new mode 100755 (executable)
index 2de88f0..c81f4ca
@@ -12,7 +12,7 @@
                     <description>With the NFIFlash extension it is possible to prepare a USB stick with an Dreambox image.\n
                     It is then possible to flash your Dreambox with the image on that stick.
                     </description>
-                    <screenshot src="http://www.dreamboxupdate.com/preview/nfiflash.jpg" />
+                    <screenshot src="http://www.dreamboxupdate.com/preview/plugin_nfiflash_en.jpg" />
           </info>
           <info language="de">
                     <author>Dream Multimedia</author>
@@ -22,7 +22,7 @@
                     <description>Mit der NFIFlash Erweiterung können Sie ein Dreambox Image auf einen USB-Stick laden.\
                     Mit diesem USB-Stick ist es dann möglich Ihre Dreambox zu flashen.
                     </description>
-                    <screenshot src="http://www.dreamboxupdate.com/preview/nfiflash.jpg" />
+                    <screenshot src="http://www.dreamboxupdate.com/preview/plugin_nfiflash_de.jpg" />
           </info>
          <files type="package"> <!-- without version, without .ipk -->
                <file type="package" name="enigma2-plugin-systemplugins-nfiflash" />
old mode 100644 (file)
new mode 100755 (executable)
index 40914e1..28b3330
@@ -1,20 +1,28 @@
+from Plugins.Plugin import PluginDescriptor
+from Tools.HardwareInfo import HardwareInfo
+from Tools.Directories import fileExists
+from downloader import NFIDownload, filescan
+
+def NFIFlasherMain(session, tmp = None, **kwargs):
+       session.open(NFIDownload, "/home/root" )
+
+def NFICallFnc(tmp = None):
+       return NFIFlasherMain
+
 def Plugins(**kwargs):
-       from Plugins.Plugin import PluginDescriptor
-       from Tools.HardwareInfo import HardwareInfo
        # currently only available for DM8000
        if HardwareInfo().get_device_name() != "dm8000":
                return [PluginDescriptor()]
-       from Tools.Directories import fileExists
        if fileExists("/usr/share/bootlogo-flasher.mvi"):
                import flasher
                # started from usb stick # don't try to be intelligent and trick this - it's not possible to rewrite the flash memory with a system currently booted from it
                return [PluginDescriptor(where = PluginDescriptor.WHERE_WIZARD, fnc = (9,flasher.NFIFlash))]
        else:
                # started on real enigma2
-               import downloader
-               return [PluginDescriptor(name="NFI Image Flashing",
-                       description = _("Download .NFI-Files for USB-Flasher"),
+               return [PluginDescriptor(name=_("NFI Image Flashing"),
+                       description=_("Download .NFI-Files for USB-Flasher"),
                        icon = "flash.png",
-                       where = [PluginDescriptor.WHERE_PLUGINMENU],
-                       fnc = downloader.main), PluginDescriptor(name="nfi", where = PluginDescriptor.WHERE_FILESCAN, fnc = downloader.filescan)
-                       ]
+                       where = PluginDescriptor.WHERE_SOFTWAREMANAGER,
+                       fnc={"SoftwareSupported": NFICallFnc, "menuEntryName": lambda x: _("NFI Image Flashing"),
+                            "menuEntryDescription": lambda x: _("Download .NFI-Files for USB-Flasher")}),
+                       PluginDescriptor(name="nfi", where = PluginDescriptor.WHERE_FILESCAN, fnc = filescan)]
index 4d36115..75ca390 100755 (executable)
@@ -2,17 +2,12 @@ from Screens.Wizard import wizardManager, WizardSummary
 from Screens.WizardLanguage import WizardLanguage
 from Screens.Rc import Rc
 from Screens.MessageBox import MessageBox
-
 from Components.Pixmap import Pixmap, MovingPixmap, MultiPixmap
+from Components.Sources.Boolean import Boolean
 from Components.config import config, ConfigBoolean, configfile, ConfigYesNo, NoSave, ConfigSubsection, ConfigText, getConfigListEntry, ConfigSelection, ConfigPassword
 from Components.Network import iNetwork
-
-#from Components.Label import Label
-#from Components.MenuList import MenuList
-#from Components.PluginComponent import plugins
-#from Plugins.Plugin import PluginDescriptor
 from Tools.Directories import resolveFilename, SCOPE_PLUGINS, SCOPE_SKIN_IMAGE
-#import time, os, re
+from enigma import eTimer
 
 
 config.misc.firstrun = ConfigBoolean(default = True)
@@ -39,7 +34,7 @@ config.plugins.wlan.encryption.psk = NoSave(ConfigPassword(default = "mysecurewl
 class NetworkWizard(WizardLanguage, Rc):
        skin = """
                <screen position="0,0" size="720,576" title="Welcome..." flags="wfNoBorder" >
-                       <widget name="text" position="153,40" size="340,330" font="Regular;22" />
+                       <widget name="text" position="153,40" size="340,300" font="Regular;22" />
                        <widget source="list" render="Listbox" position="53,340" size="440,180" scrollbarMode="showOnDemand" >
                                <convert type="StringList" />
                        </widget>
@@ -52,6 +47,10 @@ class NetworkWizard(WizardLanguage, Rc):
                        <widget name="arrowdown2" pixmap="skin_default/arrowdown.png" position="-100,-100" zPosition="11" size="37,70" alphatest="on" />
                        <widget name="arrowup" pixmap="skin_default/arrowup.png" position="-100,-100" zPosition="11" size="37,70" alphatest="on" />
                        <widget name="arrowup2" pixmap="skin_default/arrowup.png" position="-100,-100" zPosition="11" size="37,70" alphatest="on" />
+                       <widget source="VKeyIcon" render="Pixmap" pixmap="skin_default/buttons/key_text.png" position="40,260" zPosition="0" size="35,25" transparent="1" alphatest="on" >
+                               <convert type="ConditionalShowHide" />
+                       </widget>
+                       <widget name="HelpWindow" pixmap="skin_default/buttons/key_text.png" position="125,170" zPosition="1" size="1,1" transparent="1" alphatest="on" />      
                </screen>"""
        def __init__(self, session):
                self.xmlfile = resolveFilename(SCOPE_PLUGINS, "SystemPlugins/NetworkWizard/networkwizard.xml")
@@ -59,20 +58,68 @@ class NetworkWizard(WizardLanguage, Rc):
                Rc.__init__(self)
                self.session = session
                self["wizard"] = Pixmap()
-               
+               self["HelpWindow"] = Pixmap()
+               self["HelpWindow"].hide()
+               self["VKeyIcon"] = Boolean(False)
+
+               self.InstalledInterfaceCount = None
+               self.Adapterlist = None
                self.InterfaceState = None
                self.isInterfaceUp = None
                self.WlanPluginInstalled = None
                self.ap = None
                self.selectedInterface = None
                self.NextStep = None
-               self.myref = None
+               self.resetRef = None
                self.checkRef = None
                self.AdapterRef = None
+               self.APList = None
+               self.newAPlist = None
                self.WlanList = None
+               self.oldlist = None
+               self.originalAth0State = None
+               self.originalEth0State = None
+               self.originalWlan0State = None
+               self.originalInterfaceStateChanged = False
+               self.Text = None
+               self.rescanTimer = eTimer()
+               self.rescanTimer.callback.append(self.rescanTimerFired)
+               self.getInstalledInterfaceCount()
                self.isWlanPluginInstalled()
+               
+       def exitWizardQuestion(self, ret = False):
+               if (ret):
+                       self.markDone()
+                       self.close()
+               
+       def markDone(self):
+               self.rescanTimer.stop()
+               del self.rescanTimer
+               pass
+
+       def getInstalledInterfaceCount(self):
+               self.rescanTimer.stop()
+               self.Adapterlist = iNetwork.getAdapterList()
+               self.InstalledInterfaceCount = len(self.Adapterlist)
+               self.originalAth0State = iNetwork.getAdapterAttribute('ath0', 'up')
+               self.originalEth0State = iNetwork.getAdapterAttribute('eth0', 'up')
+               self.originalWlan0State = iNetwork.getAdapterAttribute('wlan0', 'up')
+
+       def checkOldInterfaceState(self):
+               # disable up interface if it was originally down and config is unchanged.
+               if self.originalAth0State is False and self.originalInterfaceStateChanged is False:
+                       if iNetwork.checkforInterface('ath0') is True:
+                               iNetwork.deactivateInterface('ath0')            
+               if self.originalEth0State is False and self.originalInterfaceStateChanged is False:
+                       if iNetwork.checkforInterface('eth0') is True:
+                               iNetwork.deactivateInterface('eth0')
+               if self.originalWlan0State is False and self.originalInterfaceStateChanged is False:
+                       if iNetwork.checkforInterface('wlan0') is True:
+                               iNetwork.deactivateInterface('wlan0')
 
        def listInterfaces(self):
+               self.rescanTimer.stop()
+               self.checkOldInterfaceState()
                list = [(iNetwork.getFriendlyAdapterName(x),x) for x in iNetwork.getAdapterList()]
                list.append((_("Exit network wizard"), "end"))
                return list
@@ -93,46 +140,30 @@ class NetworkWizard(WizardLanguage, Rc):
                self.InterfaceSelect(self.selection)
                
        def checkInterface(self,iface):
-               self.Adapterlist = iNetwork.getAdapterList()
+               self.rescanTimer.stop()
+               if self.Adapterlist is None:
+                       self.Adapterlist = iNetwork.getAdapterList()
                if self.NextStep is not 'end':
                        if len(self.Adapterlist) == 0:
                                #Reset Network to defaults if network broken
-                               iNetwork.resetNetworkConfig('lan', self.checkInterfaceCB)
-                               self.myref = self.session.openWithCallback(self.resetfinishedCB, MessageBox, _("Please wait while we prepare your network interfaces..."), type = MessageBox.TYPE_INFO, enable_input = False)
-                       if iface == 'eth0':
+                               iNetwork.resetNetworkConfig('lan', self.resetNetworkConfigCB)
+                               self.resetRef = self.session.openWithCallback(self.resetNetworkConfigFinished, MessageBox, _("Please wait while we prepare your network interfaces..."), type = MessageBox.TYPE_INFO, enable_input = False)
+                       if iface in ('eth0', 'wlan0', 'ath0'):
                                if iface in iNetwork.configuredNetworkAdapters and len(iNetwork.configuredNetworkAdapters) == 1:
                                        if iNetwork.getAdapterAttribute(iface, 'up') is True:
                                                self.isInterfaceUp = True
                                        else:
                                                self.isInterfaceUp = False
-                                       self.resetfinishedCB(False)
+                                       self.currStep = self.getStepWithID(self.NextStep)
+                                       self.afterAsyncCode()
                                else:
-                                       iNetwork.resetNetworkConfig('lan',self.checkInterfaceCB)
-                                       self.myref = self.session.openWithCallback(self.resetfinishedCB, MessageBox, _("Please wait while we prepare your network interfaces..."), type = MessageBox.TYPE_INFO, enable_input = False)
-                       elif iface == 'wlan0':
-                               if iface in iNetwork.configuredNetworkAdapters and len(iNetwork.configuredNetworkAdapters) == 1:
-                                       if iNetwork.getAdapterAttribute(iface, 'up') is True:
-                                               self.isInterfaceUp = True
-                                       else:
-                                               self.isInterfaceUp = False
-                                       self.resetfinishedCB(False)
-                               else:
-                                       iNetwork.resetNetworkConfig('wlan',self.checkInterfaceCB)
-                                       self.myref = self.session.openWithCallback(self.resetfinishedCB, MessageBox, _("Please wait while we prepare your network interfaces..."), type = MessageBox.TYPE_INFO, enable_input = False)
-                       elif iface == 'ath0':
-                               if iface in iNetwork.configuredNetworkAdapters and len(iNetwork.configuredNetworkAdapters) == 1:
-                                       if iNetwork.getAdapterAttribute(iface, 'up') is True:
-                                               self.isInterfaceUp = True
-                                       else:
-                                               self.isInterfaceUp = False
-                                       self.resetfinishedCB(False)
-                               else:
-                                       iNetwork.resetNetworkConfig('wlan-mpci',self.checkInterfaceCB)
-                                       self.myref = self.session.openWithCallback(self.resetfinishedCB, MessageBox, _("Please wait while we prepare your network interfaces..."), type = MessageBox.TYPE_INFO, enable_input = False)
+                                       self.isInterfaceUp = iNetwork.checkforInterface(iface)
+                                       self.currStep = self.getStepWithID(self.NextStep)
+                                       self.afterAsyncCode()
                else:
-                       self.resetfinishedCB(False)
+                       self.resetNetworkConfigFinished(False)
                        
-       def resetfinishedCB(self,data):
+       def resetNetworkConfigFinished(self,data):
                if data is True:
                        self.currStep = self.getStepWithID(self.NextStep)
                        self.afterAsyncCode()
@@ -140,33 +171,42 @@ class NetworkWizard(WizardLanguage, Rc):
                        self.currStep = self.getStepWithID(self.NextStep)
                        self.afterAsyncCode()
 
-       def checkInterfaceCB(self,callback,iface):
+       def resetNetworkConfigCB(self,callback,iface):
                if callback is not None:
                        if callback is True:
-                               iNetwork.getInterfaces(self.getInterfacesDataAvail)
+                               iNetwork.getInterfaces(self.getInterfacesFinished)
                                
-
-       def getInterfacesDataAvail(self, data):
+       def getInterfacesFinished(self, data):
                if data is True:
                        if iNetwork.getAdapterAttribute(self.selectedInterface, 'up') is True:
                                self.isInterfaceUp = True
                        else:
                                self.isInterfaceUp = False
-                       self.myref.close(True)
+                       self.resetRef.close(True)
+               else:
+                       print "we should never come here!"
 
        def AdapterSetupEnd(self, iface):
+               self.originalInterfaceStateChanged = True
                if iNetwork.getAdapterAttribute(iface, "dhcp") is True:
                        iNetwork.checkNetworkState(self.AdapterSetupEndFinished)
                        self.AdapterRef = self.session.openWithCallback(self.AdapterSetupEndCB, MessageBox, _("Please wait while we test your network..."), type = MessageBox.TYPE_INFO, enable_input = False)
-
                else:
                        self.currStep = self.getStepWithID("confdns")
                        self.afterAsyncCode()
 
        def AdapterSetupEndCB(self,data):
                if data is True:
-                       self.currStep = self.getStepWithID("checklanstatusend")
-                       self.afterAsyncCode()
+                       if self.selectedInterface in ('wlan0', 'ath0'):
+                               if self.WlanPluginInstalled == True:
+                                       from Plugins.SystemPlugins.WirelessLan.Wlan import iStatus
+                                       iStatus.getDataForInterface(self.selectedInterface,self.checkWlanStateCB)
+                               else:
+                                       self.currStep = self.getStepWithID("checklanstatusend")
+                                       self.afterAsyncCode()                                   
+                       else:
+                               self.currStep = self.getStepWithID("checklanstatusend")
+                               self.afterAsyncCode()
 
        def AdapterSetupEndFinished(self,data):
                if data <= 2:
@@ -175,66 +215,139 @@ class NetworkWizard(WizardLanguage, Rc):
                        self.InterfaceState = False
                self.AdapterRef.close(True)
                        
+       def checkWlanStateCB(self,data,status):
+               if data is not None:
+                       if data is True:
+                               if status is not None:
+                                       text1 = _("Your Dreambox is now ready to use.\n\nYour internet connection is working now.\n\n")
+                                       text2 = _('Accesspoint:') + "\t" + status[self.selectedInterface]["acesspoint"] + "\n"
+                                       text3 = _('SSID:') + "\t" + status[self.selectedInterface]["essid"] + "\n"
+                                       text4 = _('Link Quality:') + "\t" + status[self.selectedInterface]["quality"]+"%" + "\n"
+                                       text5 = _('Signal Strength:') + "\t" + status[self.selectedInterface]["signal"] + "\n"
+                                       text6 = _('Bitrate:') + "\t" + status[self.selectedInterface]["bitrate"] + "\n"
+                                       text7 = _('Encryption:') + " " + status[self.selectedInterface]["encryption"] + "\n"
+                                       text8 = _("Please press OK to continue.")
+                                       infotext = text1 + text2 + text3 + text4 + text5 + text7 +"\n" + text8
+                                       self.currStep = self.getStepWithID("checkWlanstatusend")
+                                       self.Text = infotext
+                                       self.afterAsyncCode()
+
        def checkNetwork(self):
-               iNetwork.checkNetworkState(self.checkNetworkStateFinished)
+               iNetwork.checkNetworkState(self.checkNetworkStateCB)
                self.checkRef = self.session.openWithCallback(self.checkNetworkCB, MessageBox, _("Please wait while we test your network..."), type = MessageBox.TYPE_INFO, enable_input = False)
 
        def checkNetworkCB(self,data):
                if data is True:
-                       self.currStep = self.getStepWithID("checklanstatusend")
-                       self.afterAsyncCode()
+                       if self.selectedInterface in ('wlan0', 'ath0'):
+                               if self.WlanPluginInstalled == True:
+                                       from Plugins.SystemPlugins.WirelessLan.Wlan import iStatus
+                                       iStatus.getDataForInterface(self.selectedInterface,self.checkWlanStateCB)
+                               else:
+                                       self.currStep = self.getStepWithID("checklanstatusend")
+                                       self.afterAsyncCode()                                   
+                       else:
+                               self.currStep = self.getStepWithID("checklanstatusend")
+                               self.afterAsyncCode()
 
-       def checkNetworkStateFinished(self,data):
+       def checkNetworkStateCB(self,data):
                if data <= 2:
                        self.InterfaceState = True
                else:
                        self.InterfaceState = False
                self.checkRef.close(True)
        
-       def markDone(self):
-               pass
+       def rescanTimerFired(self):
+               self.rescanTimer.stop()
+               self.updateAPList()
 
-       def listModes(self):
-               list = []
-               self.WlanList = []
+       def updateAPList(self):
+               self.oldlist = self.APList
+               self.newAPlist = []
+               newList = []
+               newListIndex = None
+               currentListEntry = None
+               newList = self.listAccessPoints()
+
+               for oldentry in self.oldlist:
+                       if oldentry not in newList:
+                               newList.append(oldentry)
+                               
+               for newentry in newList:
+                       if newentry[1] == "hidden...":
+                               continue
+                       self.newAPlist.append(newentry)
+               
+               if len(self.newAPlist):
+                       if "hidden..." not in self.newAPlist:
+                               self.newAPlist.append(( _("enter hidden network SSID"), "hidden..." ))
+
+                       if (self.wizard[self.currStep].has_key("dynamiclist")):
+                               currentListEntry = self["list"].getCurrent()
+                               idx = 0
+                               for entry in self.newAPlist:
+                                       if entry == currentListEntry:
+                                               newListIndex = idx
+                                       idx +=1
+                               self.wizard[self.currStep]["evaluatedlist"] = self.newAPlist
+                               self['list'].setList(self.newAPlist)
+                               self["list"].setIndex(newListIndex)
+                               self["list"].updateList(self.newAPlist)
+
+       def listAccessPoints(self):
+               self.APList = []
                try:
                        from Plugins.SystemPlugins.WirelessLan.Wlan import Wlan
                except ImportError:
-                       list.append( ( _("No networks found"),_("unavailable") ) )
-                       self.WlanList.append(_("No networks found"))
-                       return list
+                       self.APList.append( ( _("No networks found"),_("unavailable") ) )
+                       return self.APList
                else:   
                        self.w = Wlan(self.selectedInterface)
                        aps = self.w.getNetworkList()
                        if aps is not None:
                                print "[NetworkWizard.py] got Accespoints!"
+                               tmplist = []
+                               complist = []
                                for ap in aps:
                                        a = aps[ap]
                                        if a['active']:
-                                               if a['essid'] != "":
-                                                       #a['essid'] = a['bssid']
-                                                       list.append( (a['essid'], a['essid']) )
-                                                       self.WlanList.append(a['essid'])        
-                       if "hidden..." not in list:
-                               list.append( ( _("enter hidden network SSID"),_("hidden...") ) )
-                               self.WlanList.append(_("hidden..."))    
-                       return list
-
-       def modeSelectionMade(self, index):
-               self.modeSelect(index)
-               
-       def modeSelectionMoved(self):
-               self.modeSelect(self.selection)
+                                               tmplist.append( (a['bssid'], a['essid']) )
+                                               complist.append( (a['bssid'], a['essid']) )
+                               
+                               for entry in tmplist:
+                                       if entry[1] == "":
+                                               for compentry in complist:
+                                                       if compentry[0] == entry[0]:
+                                                               complist.remove(compentry)
+                               for entry in complist:
+                                       self.APList.append( (entry[1], entry[1]) )
+
+                       if "hidden..." not in self.APList:
+                               self.APList.append(( _("enter hidden network SSID"), "hidden..." ))
                
-       def modeSelect(self, mode):
-               self.ap = mode
-               print "ModeSelected:", mode
+                       self.rescanTimer.start(3000)
+                       return self.APList
 
-       def restartNetwork(self):
-               iNetwork.restartNetwork()
-               self.checkNetwork()
-       
-       def isWlanPluginInstalled(self):                
+       def AccessPointsSelectionMade(self, index):
+               self.ap = index
+               self.WlanList = []
+               currList = []
+               if (self.wizard[self.currStep].has_key("dynamiclist")):
+                       currList = self['list'].list
+                       for entry in currList:
+                               self.WlanList.append( (entry[1], entry[0]) )
+               self.AccessPointsSelect(index)
+
+       def AccessPointsSelect(self, index):
+               self.NextStep = 'wlanconfig'
+
+       def AccessPointsSelectionMoved(self):
+               self.AccessPointsSelect(self.selection)
+
+       def checkWlanSelection(self):
+               self.rescanTimer.stop()
+               self.currStep = self.getStepWithID(self.NextStep)
+
+       def isWlanPluginInstalled(self):
                try:
                        from Plugins.SystemPlugins.WirelessLan.Wlan import Wlan
                except ImportError:
@@ -242,3 +355,5 @@ class NetworkWizard(WizardLanguage, Rc):
                else:
                        self.WlanPluginInstalled = True
 
+
+
index 98dbe80..e8f738c 100755 (executable)
@@ -1,3 +1,5 @@
 installdir = $(datadir)/meta/
 
 dist_install_DATA = plugin_networkwizard.xml
+
+EXTRA_DIST = networkwizard_en.jpg networkwizard_de.jpg
diff --git a/lib/python/Plugins/SystemPlugins/NetworkWizard/meta/networkwizard_de.jpg b/lib/python/Plugins/SystemPlugins/NetworkWizard/meta/networkwizard_de.jpg
new file mode 100755 (executable)
index 0000000..3999a41
Binary files /dev/null and b/lib/python/Plugins/SystemPlugins/NetworkWizard/meta/networkwizard_de.jpg differ
diff --git a/lib/python/Plugins/SystemPlugins/NetworkWizard/meta/networkwizard_en.jpg b/lib/python/Plugins/SystemPlugins/NetworkWizard/meta/networkwizard_en.jpg
new file mode 100755 (executable)
index 0000000..0a0434a
Binary files /dev/null and b/lib/python/Plugins/SystemPlugins/NetworkWizard/meta/networkwizard_en.jpg differ
index 660bbcd..4d3adcb 100755 (executable)
@@ -9,6 +9,7 @@
                     <shortdescription>Step by step network configuration</shortdescription>
                     <description>With the NetworkWizard you can easy configure your network step by step.
                     </description>
+                    <screenshot src="http://www.dreamboxupdate.com/preview/plugin_networkwizard_en.jpg" />
           </info>
           <info language="de">
                     <author>Dream Multimedia</author>
@@ -18,6 +19,7 @@
                     <description>Mit dem NetzwerkWizard können Sie Ihr Netzwerk konfigurieren. Sie werden Schritt
                        für Schritt durch die Konfiguration geleitet.
                     </description>
+                    <screenshot src="http://www.dreamboxupdate.com/preview/plugin_networkwizard_de.jpg" />
           </info>
          <files type="package"> <!-- without version, without .ipk -->
                <file type="package" name="enigma2-plugin-systemplugins-networkwizard" />
index 134797a..dcd9d93 100755 (executable)
 <wizard>
-               <step id="welcome" nextstep="selectinterface">
-                       <text value="Welcome.\n\nIf you want to connect your Dreambox to the Internet, this wizard will guide you through the basic network setup of your Dreambox.\n\nPress OK to start configuring your network" />
-                       <displaytext value="Network Wizard" />
-                       <code>
+        <step id="welcome" nextstep="selectinterface">
+                <text value="Welcome.\n\nIf you want to connect your Dreambox to the Internet, this wizard will guide you through the basic network setup of your Dreambox.\n\nPress OK to start configuring your network" />
+                <displaytext value="Network Wizard" />
+               <code>
 self.clearSelectedKeys()
 self.selectKey("OK")
-                       </code>
-               </step>
+                </code>
+        </step>
 
-               <step id="selectinterface">
-                       <text value="Please select the network interface that you want to use for your internet connection.\n\nPlease press OK to continue." />
-                       <displaytext value="Select interface" />
-                       <list type="dynamic" source="listInterfaces" evaluation="InterfaceSelectionMade" onselect="InterfaceSelectionMoved" />
-                       <code>
+        <step id="selectinterface">
+                <text value="Please select the network interface that you want to use for your internet connection.\n\nPlease press OK to continue." />
+                <displaytext value="Select interface" />
+                <list type="dynamic" source="listInterfaces" evaluation="InterfaceSelectionMade" onselect="InterfaceSelectionMoved" />
+                <code>
 self.clearSelectedKeys()
 self.selectKey("OK")
 self.selectKey("UP")
 self.selectKey("DOWN")
-                       </code>
-                       <code pos="after" async="yes">
+                </code>
+                <code pos="after" async="yes">
 self.checkInterface(self.selectedInterface)
-                       </code> 
-               </step>
-
-               <step id="nwconfig">
-                       <text value="Please configure your internet connection by filling out the required values.\nWhen you are ready press OK to continue." />
-                       <displaytext value="Configure interface" />
-                       <config screen="AdapterSetup" module="NetworkSetup" args="self.selectedInterface" type="ConfigList" />
-                       <code>
+                </code> 
+        </step>
+        <step id="nwconfig">
+                <text value="Please configure your internet connection by filling out the required values.\nWhen you are ready press OK to continue." />
+                <displaytext value="Configure interface" />
+                <config screen="AdapterSetup" module="NetworkSetup" args="self.selectedInterface" type="ConfigList" />
+                <code>
 self.clearSelectedKeys()
 self.selectKey("OK")
 self.selectKey("UP")
 self.selectKey("DOWN")
 self.selectKey("LEFT")
 self.selectKey("RIGHT")
-                       </code>
-                       <code pos="after" async="yes">
+                </code>
+                <code pos="after" async="yes">
 self.AdapterSetupEnd(self.selectedInterface)
-                       </code>                 
-               </step>
-
-               <step id="confdns" nextstep="checklanstatusend">
-                       <text value="Please configure or verify your Nameservers by filling out the required values.\nWhen you are ready press OK to continue." />
-                       <displaytext value="Configure nameservers" />
-                       <config screen="NameserverSetup" module="NetworkSetup" type="ConfigList" />
-                       <code>
+                </code>                 
+        </step>
+        <step id="confdns" nextstep="checklanstatusend">
+                <text value="Please configure or verify your Nameservers by filling out the required values.\nWhen you are ready press OK to continue." />
+                <displaytext value="Configure nameservers" />
+                <config screen="NameserverSetup" module="NetworkSetup" type="ConfigList" />
+                <code>
 self.clearSelectedKeys()
 self.selectKey("OK")
-                       </code>
-                       <code pos="after" async="yes">
+                </code>
+                <code pos="after" async="yes">
 self.checkNetwork()
-                       </code> 
-               </step>
-
-               <step id="checklanstatusend" nextstep="end">
+                </code> 
+        </step>
+        <step id="checklanstatusend" nextstep="end">
                <condition>
 self.condition = (self.InterfaceState == True )
                </condition>
-                       <text value="Your Dreambox is now ready to use.\n\nYour internet connection is working now.\n\nPlease press OK to continue." />
-                       <displaytext value="Please follow the instructions on the TV" />
-                       <code>
+                <text value="Your Dreambox is now ready to use.\n\nYour internet connection is working now.\n\nPlease press OK to continue." />
+                <displaytext value="Please follow the instructions on the TV" />
+                <code>
 self.clearSelectedKeys()
 self.selectKey("OK")
-                       </code>
-                       <code pos="after">
-currStep = self.numSteps                               
+                </code>
+                <code pos="after">
+currStep = self.numSteps                                
 self.wizard[currStep]["nextstep"] = None
 self.markDone()
 self.close()
-                       </code> 
-               </step>
-
-               <step id="checklanstatusend">
+                </code> 
+        </step>
+        <step id="checklanstatusend">
                <condition>
 self.condition = (self.InterfaceState == False )
                </condition>
-                       <text value="Your internet connection is not working!\nPlease choose what you want to do next." />
-                       <displaytext value="Please follow the instructions on the TV" />
-                       <code>
+                <text value="Your internet connection is not working!\nPlease choose what you want to do next." />
+                <displaytext value="Please follow the instructions on the TV" />
+                <code>
 self.clearSelectedKeys()
 self.selectKey("OK")
 self.selectKey("UP")
 self.selectKey("DOWN")
-                       </code>
-                       <list>
-                               <listentry caption="Configure your network again" step="selectinterface" />
-                               <listentry caption="Exit network wizard" step="end" />
-                       </list>
-               </step>
-
-               <step id="scanwlan" nextstep="wlanconfig">
+                </code>
+                <list>
+                        <listentry caption="Configure your network again" step="selectinterface" />
+                        <listentry caption="Exit network wizard" step="end" />
+                </list>
+        </step>
+        <step id="scanwlan">
                <condition>
 self.condition = (self.isInterfaceUp == True and self.WlanPluginInstalled == True)
-               </condition>
-                       <text value="Please select the wireless network that you want to connect to.\n\nPlease press OK to continue." />
-                       <displaytext value="Select wireless network" />
-                       <list type="dynamic" source="listModes" evaluation="modeSelectionMade" onselect="modeSelectionMoved" />
-                       <code>
+                </condition>
+                <text value="Please select the wireless network that you want to connect to.\n\nPlease press OK to continue." />
+                <displaytext value="Select wireless network" />
+                <list type="dynamic" source="listAccessPoints" evaluation="AccessPointsSelectionMade" onselect="AccessPointsSelectionMoved" />
+                <code>
 self.clearSelectedKeys()
 self.selectKey("OK")
 self.selectKey("UP")
 self.selectKey("DOWN")
 self.selectKey("LEFT")
 self.selectKey("RIGHT")
-                       </code>
-               </step>
-
-               <step id="scanwlan">
-               <condition>
+                </code>
+                <code pos="after">
+self.checkWlanSelection()
+                </code> 
+        </step>
+        <step id="scanwlan">
+                <condition>
 self.condition = (self.isInterfaceUp == False and self.WlanPluginInstalled == True)
-               </condition>
-                       <text value="Your wireless LAN internet connection could not be started!\nHave you attached your USB WLAN Stick?\n\nPlease choose what you want to do next." />
-                       <displaytext value="Please follow the instructions on the TV" />
-                       <list>
-                               <listentry caption="Configure your wireless LAN again" step="scanwlan" />
-                               <listentry caption="Configure your internal LAN" step="selectinterface" />
-                               <listentry caption="Exit network wizard" step="end" />
-                       </list>
-                       <code>
+                </condition>
+                <text value="Your wireless LAN internet connection could not be started!\nHave you attached your USB WLAN Stick?\n\nPlease choose what you want to do next." />
+                <displaytext value="Please follow the instructions on the TV" />
+                <list>
+                        <listentry caption="Configure your wireless LAN again" step="scanwlan" />
+                        <listentry caption="Configure your internal LAN" step="selectinterface" />
+                        <listentry caption="Exit network wizard" step="end" />
+                </list>
+                <code>
 self.clearSelectedKeys()
 self.selectKey("OK")
 self.selectKey("UP")
 self.selectKey("DOWN")
-                       </code>
-               </step>
-
-               <step id="scanwlan">
-               <condition>
+                </code>
+        </step>
+        <step id="scanwlan">
+                <condition>
 self.condition = (self.isInterfaceUp == True and self.WlanPluginInstalled == False)
-               </condition>
-                       <text value="The wireless LAN plugin is not installed!\nPlease install it and choose what you want to do next." />
-                       <displaytext value="Please follow the instructions on the TV" />
-                       <list>
-                               <listentry caption="Configure your internal LAN" step="selectinterface" />
-                               <listentry caption="Exit network wizard" step="end" />
-                       </list>
-                       <code>
+                </condition>
+                <text value="The wireless LAN plugin is not installed!\nPlease install it and choose what you want to do next." />
+                <displaytext value="Please follow the instructions on the TV" />
+                <list>
+                        <listentry caption="Configure your internal LAN" step="selectinterface" />
+                        <listentry caption="Exit network wizard" step="end" />
+                </list>
+                <code>
 self.clearSelectedKeys()
 self.selectKey("OK")
 self.selectKey("UP")
 self.selectKey("DOWN")
-                       </code>
-               </step>
-
-               <step id="wlanconfig">
-                       <text value="Please configure your internet connection by filling out the required values.\nWhen you are ready press OK to continue." />
-                       <displaytext value="Configure interface" />
-                       <config screen="AdapterSetup" module="NetworkSetup" args="(self.selectedInterface,self.ap,self.WlanList)" type="ConfigList" />
-                       <code>
+                </code>
+        </step>
+        <step id="wlanconfig">
+                <text value="Please configure your internet connection by filling out the required values.\nWhen you are ready press OK to continue." />
+                <displaytext value="Configure interface" />
+                <config screen="AdapterSetup" module="NetworkSetup" args="(self.selectedInterface,self.ap,self.WlanList)" type="ConfigList" />
+                <code>
 self.clearSelectedKeys()
 self.selectKey("OK")
 self.selectKey("UP")
 self.selectKey("DOWN")
 self.selectKey("LEFT")
 self.selectKey("RIGHT")
-                       </code>
-                       <code pos="after" async="yes">
+                </code>
+                <code pos="after" async="yes">
 self.AdapterSetupEnd(self.selectedInterface)
-                       </code>                 
-               </step>
+                </code>                 
+        </step>
+        <step id="checkWlanstatusend" nextstep="end">
+               <condition>
+self.condition = (self.InterfaceState == True )
+               </condition>
+                <text value="Your Dreambox is now ready to use.\n\nYour internet connection is working now.\n\nPlease press OK to continue." />
+                <displaytext value="Please follow the instructions on the TV" />
+                <code>
+self.clearSelectedKeys()
+self.selectKey("OK")
+self["text"].setText(self.Text)
+                </code>
+                <code pos="after">
+currStep = self.numSteps                                
+self.wizard[currStep]["nextstep"] = None
+self.markDone()
+self.close()
+                </code> 
+        </step>
+        <step id="checkWlanstatusend">
+               <condition>
+self.condition = (self.InterfaceState == False )
+               </condition>
+                <text value="Your internet connection is not working!\nPlease choose what you want to do next." />
+                <displaytext value="Please follow the instructions on the TV" />
+                <code>
+self.clearSelectedKeys()
+self.selectKey("OK")
+self.selectKey("UP")
+self.selectKey("DOWN")
+                </code>
+                <list>
+                        <listentry caption="Configure your network again" step="selectinterface" />
+                        <listentry caption="Exit network wizard" step="end" />
+                </list>
+        </step>
 
-               <step id="end">
-                       <text value="Thank you for using the wizard.\nPlease press OK to continue." />
-                       <code>
+        <step id="end">
+                <text value="Thank you for using the wizard.\nPlease press OK to continue." />
+                <code>
 self.clearSelectedKeys()
 self.selectKey("OK")
-                       </code>
-               </step>
+                </code>
+        </step>
 </wizard>
 
 
old mode 100644 (file)
new mode 100755 (executable)
index d20b2e6..2cb47c0
@@ -10,7 +10,7 @@
                     <shortdescription>PositionerSetup helps you installing a motorized dish.</shortdescription>
                     <description>With the PositionerSetup extension it is easy to install and configure a motorized dish.
                     </description>
-                    <screenshot src="http://www.dreamboxupdate.com/preview/positionersetup.jpg" />
+                    <screenshot src="http://www.dreamboxupdate.com/preview/plugin_positionersetup.jpg" />
           </info>
           <info language="de">
                     <author>Dream Multimedia</author>
@@ -20,7 +20,7 @@
                     <description>Die PositionerSetup Erweiterung unterstützt Sie beim einrichten
                     und konfigurieren einer motorgesteuerten Satellitenantenne.
                     </description>
-                    <screenshot src="http://www.dreamboxupdate.com/preview/positionersetup.jpg" />
+                    <screenshot src="http://www.dreamboxupdate.com/preview/plugin_positionersetup.jpg" />
           </info>
          <files type="package"> <!-- without version, without .ipk -->
                <file type="package" name="enigma2-plugin-systemplugins-positionersetup" />
old mode 100644 (file)
new mode 100755 (executable)
index 6307213..7f8d8d2
Binary files a/lib/python/Plugins/SystemPlugins/PositionerSetup/meta/positionersetup.jpg and b/lib/python/Plugins/SystemPlugins/PositionerSetup/meta/positionersetup.jpg differ
old mode 100644 (file)
new mode 100755 (executable)
index 8fa36e5..4c0c7af
@@ -11,7 +11,7 @@
                     <shortdescription>SatelliteEquipmentControl allows you to fine-tune DiSEqC-settings.</shortdescription>
                     <description>With the SatelliteEquipmentControl extension it is possible to fine-tune DiSEqC-settings.
                     </description>
-                    <screenshot src="http://www.dreamboxupdate.com/preview/satcontrol.jpg" />
+                    <screenshot src="http://www.dreamboxupdate.com/preview/plugin_satcontrol.jpg" />
           </info>
           <info language="de">
                     <author>Dream Multimedia</author>
@@ -20,7 +20,7 @@
                     <shortdescription>Fein-Einstellungen für DiSEqC</shortdescription>
                     <description>Die SatelliteEquipmentControl-Erweiterung unterstützt Sie beim Feintuning der DiSEqC Einstellungen.
                     </description>
-                    <screenshot src="http://www.dreamboxupdate.com/preview/satcontrol.jpg" />
+                    <screenshot src="http://www.dreamboxupdate.com/preview/plugin_satcontrol.jpg" />
           </info>
          <files type="package"> <!-- without version, without .ipk -->
                <file type="package" name="enigma2-plugin-systemplugins-satelliteequipmentcontrol" />
old mode 100644 (file)
new mode 100755 (executable)
index b9596a6..703650e
Binary files a/lib/python/Plugins/SystemPlugins/SatelliteEquipmentControl/meta/satcontrol.jpg and b/lib/python/Plugins/SystemPlugins/SatelliteEquipmentControl/meta/satcontrol.jpg differ
old mode 100644 (file)
new mode 100755 (executable)
index aaab7e4..e9453de
@@ -8,10 +8,10 @@
                     <name>Satfinder</name>
                     <packagename>enigma2-plugin-systemplugins-satfinder</packagename>
                     <shortdescription>Satfinder helps you to align your dish.</shortdescription>
-                    <description>The Satfinder extension helps you to align your dish.\
+                    <description>The Satfinder extension helps you to align your dish.\n
                     It shows you informations about signal rate and errors.
                     </description>
-                    <screenshot src="http://www.dreamboxupdate.com/preview/satfinder.jpg" />
+                    <screenshot src="http://www.dreamboxupdate.com/preview/plugin_satfinder.jpg" />
           </info>
           <info language="de">
                     <author>Dream Multimedia</author>
@@ -21,7 +21,7 @@
                     <description>Die Satfinder-Erweiterung unterstützt Sie beim Ausrichten ihrer Satellitenanlage.\n
                     Es zeigt Ihnen Daten wie Signalstärke und Fehlerrate an.
                     </description>
-                    <screenshot src="http://www.dreamboxupdate.com/preview/satfinder.jpg" />
+                    <screenshot src="http://www.dreamboxupdate.com/preview/plugin_satfinder.jpg" />
           </info>
          <files type="package"> <!-- without version, without .ipk -->
                <file type="package" name="enigma2-plugin-systemplugins-satfinder" />
old mode 100644 (file)
new mode 100755 (executable)
index c0bba0c..44f0981
Binary files a/lib/python/Plugins/SystemPlugins/Satfinder/meta/satfinder.jpg and b/lib/python/Plugins/SystemPlugins/Satfinder/meta/satfinder.jpg differ
index 689d97e..d29fb00 100755 (executable)
@@ -2,4 +2,4 @@ installdir = $(datadir)/meta/
 
 dist_install_DATA = plugin_skinselector.xml
 
-EXTRA_DIST = skinselector.jpg
+EXTRA_DIST = skinselector_de.jpg skinselector_en.jpg
old mode 100644 (file)
new mode 100755 (executable)
index 4ce7f1b..717f732
@@ -11,7 +11,7 @@
                     <description>The SkinSelector shows a menu with selectable skins.\n
                     It's now easy to change the look and feel of your Dreambox.
                     </description>
-                    <screenshot src="http://www.dreamboxupdate.com/preview/skinselector.jpg" />
+                    <screenshot src="http://www.dreamboxupdate.com/preview/plugin_skinselector_en.jpg" />
           </info>
           <info language="de">
                     <author>Dream Multimedia</author>
@@ -21,7 +21,7 @@
                     <description>Die SkinSelector Erweiterung zeigt Ihnen ein Menu mit auswählbaren Skins.\n
                     Sie können nun einfach das Aussehen der grafischen Oberfläche Ihrer Dreambox verändern.
                     </description>
-                    <screenshot src="http://www.dreamboxupdate.com/preview/skinselector.jpg" />
+                    <screenshot src="http://www.dreamboxupdate.com/preview/plugin_skinselector_de.jpg" />
           </info>
          <files type="package"> <!-- without version, without .ipk -->
                <file type="package" name="enigma2-plugin-systemplugins-skinselector" />
diff --git a/lib/python/Plugins/SystemPlugins/SkinSelector/meta/skinselector.jpg b/lib/python/Plugins/SystemPlugins/SkinSelector/meta/skinselector.jpg
deleted file mode 100644 (file)
index 74395ea..0000000
Binary files a/lib/python/Plugins/SystemPlugins/SkinSelector/meta/skinselector.jpg and /dev/null differ
diff --git a/lib/python/Plugins/SystemPlugins/SkinSelector/meta/skinselector_de.jpg b/lib/python/Plugins/SystemPlugins/SkinSelector/meta/skinselector_de.jpg
new file mode 100755 (executable)
index 0000000..3b40708
Binary files /dev/null and b/lib/python/Plugins/SystemPlugins/SkinSelector/meta/skinselector_de.jpg differ
diff --git a/lib/python/Plugins/SystemPlugins/SkinSelector/meta/skinselector_en.jpg b/lib/python/Plugins/SystemPlugins/SkinSelector/meta/skinselector_en.jpg
new file mode 100755 (executable)
index 0000000..b9f0bd3
Binary files /dev/null and b/lib/python/Plugins/SystemPlugins/SkinSelector/meta/skinselector_en.jpg differ
index 871f0a3..d9ccab5 100755 (executable)
@@ -66,6 +66,7 @@ class BackupScreen(Screen, ConfigListScreen):
                self.setTitle(_("Backup is running..."))
 
        def doBackup(self):
+               configfile.save()
                try:
                        if (path.exists(self.backuppath) == False):
                                makedirs(self.backuppath)
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:
+                      &nb