aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Navigation.py4
-rw-r--r--RecordTimer.py11
-rwxr-xr-xconfigure.ac1
-rw-r--r--data/defaults/Dream/userbouquet.favourites.tv10
-rwxr-xr-xdata/keymap.xml4
-rw-r--r--data/menu.xml5
-rwxr-xr-xdata/skin_default.xml14
-rwxr-xr-x[-rw-r--r--]data/skin_default/Makefile.am2
-rwxr-xr-xdata/skin_default/border_menu_350.pngbin0 -> 2754 bytes
-rwxr-xr-x[-rw-r--r--]data/skin_default/div-h.pngbin151 -> 140 bytes
-rw-r--r--data/skin_default/icons/dish.pngbin8320 -> 8195 bytes
-rw-r--r--data/skin_default/unhandled-key.pngbin0 -> 1335 bytes
-rw-r--r--lib/actions/action.cpp2
-rw-r--r--lib/base/elock.h13
-rw-r--r--lib/base/filepush.cpp26
-rw-r--r--lib/driver/rc.cpp30
-rw-r--r--lib/driver/rc.h8
-rw-r--r--lib/driver/rcconsole.cpp1
-rw-r--r--lib/driver/rcinput.cpp5
-rw-r--r--lib/driver/rcinput.h1
-rw-r--r--lib/dvb/decoder.cpp19
-rw-r--r--lib/dvb/decoder.h2
-rw-r--r--lib/dvb/dvb.cpp9
-rw-r--r--lib/dvb/epgcache.cpp246
-rw-r--r--lib/dvb/epgcache.h4
-rw-r--r--lib/dvb/idvb.h2
-rw-r--r--lib/dvb/lowlevel/mhw.h4
-rw-r--r--lib/dvb/pmt.cpp3
-rw-r--r--lib/dvb/pmt.h1
-rw-r--r--lib/dvb/pvrparse.cpp1
-rw-r--r--lib/dvb/tstools.cpp139
-rw-r--r--lib/dvb/tstools.h6
-rwxr-xr-x[-rw-r--r--]lib/python/Components/ChoiceList.py6
-rwxr-xr-x[-rw-r--r--]lib/python/Components/ConfigList.py46
-rwxr-xr-x[-rw-r--r--]lib/python/Components/EpgList.py12
-rwxr-xr-xlib/python/Components/FileList.py29
-rwxr-xr-xlib/python/Components/Harddisk.py7
-rw-r--r--lib/python/Components/Lcd.py17
-rwxr-xr-x[-rw-r--r--]lib/python/Components/MediaPlayer.py12
-rwxr-xr-xlib/python/Components/Network.py8
-rw-r--r--lib/python/Components/NimManager.py14
-rwxr-xr-x[-rw-r--r--]lib/python/Components/ParentalControl.py0
-rwxr-xr-x[-rw-r--r--]lib/python/Components/SelectionList.py4
-rwxr-xr-x[-rw-r--r--]lib/python/Components/ServiceList.py14
-rw-r--r--lib/python/Components/SystemInfo.py2
-rwxr-xr-x[-rw-r--r--]lib/python/Components/TimerList.py4
-rw-r--r--lib/python/Components/UsageConfig.py34
-rwxr-xr-xlib/python/Components/config.py18
-rwxr-xr-x[-rw-r--r--]lib/python/Plugins/Extensions/CutListEditor/meta/plugin_cutlisteditor.xml4
-rw-r--r--lib/python/Plugins/Extensions/CutListEditor/plugin.py83
-rwxr-xr-xlib/python/Plugins/Extensions/DVDBurn/TitleList.py3
-rwxr-xr-xlib/python/Plugins/Extensions/DVDBurn/meta/Makefile.am2
-rwxr-xr-xlib/python/Plugins/Extensions/DVDBurn/meta/dvdburn_de.jpgbin0 -> 157332 bytes
-rwxr-xr-xlib/python/Plugins/Extensions/DVDBurn/meta/dvdburn_en.jpgbin0 -> 123854 bytes
-rwxr-xr-x[-rw-r--r--]lib/python/Plugins/Extensions/DVDBurn/meta/plugin_dvdburn.xml2
-rwxr-xr-x[-rw-r--r--]lib/python/Plugins/Extensions/DVDPlayer/meta/plugin_dvdplayer.xml4
-rw-r--r--lib/python/Plugins/Extensions/DVDPlayer/src/servicedvd.cpp2
-rwxr-xr-x[-rw-r--r--]lib/python/Plugins/Extensions/GraphMultiEPG/GraphMultiEpg.py12
-rwxr-xr-x[-rw-r--r--]lib/python/Plugins/Extensions/GraphMultiEPG/meta/graphmultiepg_de.jpgbin185760 -> 141965 bytes
-rwxr-xr-x[-rw-r--r--]lib/python/Plugins/Extensions/GraphMultiEPG/meta/graphmultiepg_en.jpgbin184157 -> 141392 bytes
-rwxr-xr-x[-rw-r--r--]lib/python/Plugins/Extensions/GraphMultiEPG/meta/plugin_graphmultiepg.xml4
-rwxr-xr-x[-rw-r--r--]lib/python/Plugins/Extensions/MediaPlayer/meta/mediaplayer_de.jpgbin176933 -> 131540 bytes
-rwxr-xr-x[-rw-r--r--]lib/python/Plugins/Extensions/MediaPlayer/meta/mediaplayer_en.jpgbin171530 -> 128207 bytes
-rwxr-xr-x[-rw-r--r--]lib/python/Plugins/Extensions/MediaPlayer/meta/plugin_mediaplayer.xml4
-rwxr-xr-x[-rw-r--r--]lib/python/Plugins/Extensions/MediaPlayer/plugin.py6
-rwxr-xr-xlib/python/Plugins/Extensions/MediaScanner/meta/Makefile.am2
-rwxr-xr-xlib/python/Plugins/Extensions/MediaScanner/meta/mediascanner_de.jpgbin0 -> 87941 bytes
-rwxr-xr-xlib/python/Plugins/Extensions/MediaScanner/meta/mediascanner_en.jpgbin0 -> 85763 bytes
-rwxr-xr-x[-rw-r--r--]lib/python/Plugins/Extensions/MediaScanner/meta/plugin_mediascanner.xml2
-rwxr-xr-x[-rw-r--r--]lib/python/Plugins/Extensions/PicturePlayer/meta/plugin_pictureplayer.xml4
-rwxr-xr-xlib/python/Plugins/Plugin.py9
-rwxr-xr-xlib/python/Plugins/SystemPlugins/CleanupWizard/meta/Makefile.am2
-rwxr-xr-xlib/python/Plugins/SystemPlugins/CleanupWizard/meta/cleanupwizard_de.jpgbin0 -> 144289 bytes
-rwxr-xr-xlib/python/Plugins/SystemPlugins/CleanupWizard/meta/cleanupwizard_en.jpgbin0 -> 133755 bytes
-rwxr-xr-xlib/python/Plugins/SystemPlugins/CleanupWizard/meta/plugin_cleanupwizard.xml2
-rwxr-xr-x[-rw-r--r--]lib/python/Plugins/SystemPlugins/CommonInterfaceAssignment/meta/ciassignment.jpgbin88947 -> 76859 bytes
-rwxr-xr-x[-rw-r--r--]lib/python/Plugins/SystemPlugins/CommonInterfaceAssignment/meta/plugin_commoninterfaceassignment.xml4
-rwxr-xr-xlib/python/Plugins/SystemPlugins/CrashlogAutoSubmit/meta/Makefile.am2
-rwxr-xr-xlib/python/Plugins/SystemPlugins/CrashlogAutoSubmit/meta/crashlogautosubmit_de.jpgbin0 -> 127976 bytes
-rwxr-xr-xlib/python/Plugins/SystemPlugins/CrashlogAutoSubmit/meta/crashlogautosubmit_en.jpgbin0 -> 121808 bytes
-rwxr-xr-x[-rw-r--r--]lib/python/Plugins/SystemPlugins/CrashlogAutoSubmit/meta/plugin_crashlogautosubmit.xml4
-rwxr-xr-x[-rw-r--r--]lib/python/Plugins/SystemPlugins/DefaultServicesScanner/meta/defaultservicescanner.jpgbin104417 -> 87248 bytes
-rwxr-xr-x[-rw-r--r--]lib/python/Plugins/SystemPlugins/DefaultServicesScanner/meta/plugin_defaultservicesscanner.xml4
-rwxr-xr-xlib/python/Plugins/SystemPlugins/DiseqcTester/meta/Makefile.am2
-rw-r--r--lib/python/Plugins/SystemPlugins/DiseqcTester/meta/diseqctester.jpgbin84269 -> 0 bytes
-rwxr-xr-xlib/python/Plugins/SystemPlugins/DiseqcTester/meta/diseqctester_de.jpgbin0 -> 83220 bytes
-rwxr-xr-xlib/python/Plugins/SystemPlugins/DiseqcTester/meta/diseqctester_en.jpgbin0 -> 78731 bytes
-rwxr-xr-x[-rw-r--r--]lib/python/Plugins/SystemPlugins/DiseqcTester/meta/plugin_diseqctester.xml4
-rwxr-xr-xlib/python/Plugins/SystemPlugins/NFIFlash/meta/Makefile.am2
-rw-r--r--lib/python/Plugins/SystemPlugins/NFIFlash/meta/nfiflash.jpgbin192129 -> 0 bytes
-rwxr-xr-xlib/python/Plugins/SystemPlugins/NFIFlash/meta/nfiflash_de.jpgbin0 -> 168093 bytes
-rwxr-xr-xlib/python/Plugins/SystemPlugins/NFIFlash/meta/nfiflash_en.jpgbin0 -> 161749 bytes
-rwxr-xr-x[-rw-r--r--]lib/python/Plugins/SystemPlugins/NFIFlash/meta/plugin_nfiflash.xml4
-rwxr-xr-x[-rw-r--r--]lib/python/Plugins/SystemPlugins/NFIFlash/plugin.py26
-rwxr-xr-xlib/python/Plugins/SystemPlugins/NetworkWizard/NetworkWizard.py277
-rwxr-xr-xlib/python/Plugins/SystemPlugins/NetworkWizard/meta/Makefile.am2
-rwxr-xr-xlib/python/Plugins/SystemPlugins/NetworkWizard/meta/networkwizard_de.jpgbin0 -> 153354 bytes
-rwxr-xr-xlib/python/Plugins/SystemPlugins/NetworkWizard/meta/networkwizard_en.jpgbin0 -> 145574 bytes
-rwxr-xr-xlib/python/Plugins/SystemPlugins/NetworkWizard/meta/plugin_networkwizard.xml2
-rwxr-xr-xlib/python/Plugins/SystemPlugins/NetworkWizard/networkwizard.xml244
-rwxr-xr-x[-rw-r--r--]lib/python/Plugins/SystemPlugins/PositionerSetup/meta/plugin_positionersetup.xml4
-rwxr-xr-x[-rw-r--r--]lib/python/Plugins/SystemPlugins/PositionerSetup/meta/positionersetup.jpgbin104995 -> 89388 bytes
-rwxr-xr-x[-rw-r--r--]lib/python/Plugins/SystemPlugins/SatelliteEquipmentControl/meta/plugin_satelliteequipmentcontrol.xml4
-rwxr-xr-x[-rw-r--r--]lib/python/Plugins/SystemPlugins/SatelliteEquipmentControl/meta/satcontrol.jpgbin255436 -> 182193 bytes
-rwxr-xr-x[-rw-r--r--]lib/python/Plugins/SystemPlugins/Satfinder/meta/plugin_satfinder.xml6
-rwxr-xr-x[-rw-r--r--]lib/python/Plugins/SystemPlugins/Satfinder/meta/satfinder.jpgbin106870 -> 87698 bytes
-rwxr-xr-xlib/python/Plugins/SystemPlugins/SkinSelector/meta/Makefile.am2
-rwxr-xr-x[-rw-r--r--]lib/python/Plugins/SystemPlugins/SkinSelector/meta/plugin_skinselector.xml4
-rw-r--r--lib/python/Plugins/SystemPlugins/SkinSelector/meta/skinselector.jpgbin111278 -> 0 bytes
-rwxr-xr-xlib/python/Plugins/SystemPlugins/SkinSelector/meta/skinselector_de.jpgbin0 -> 136439 bytes
-rwxr-xr-xlib/python/Plugins/SystemPlugins/SkinSelector/meta/skinselector_en.jpgbin0 -> 126685 bytes
-rwxr-xr-xlib/python/Plugins/SystemPlugins/SoftwareManager/BackupRestore.py1
-rwxr-xr-x[-rw-r--r--]lib/python/Plugins/SystemPlugins/SoftwareManager/Makefile.am3
-rwxr-xr-xlib/python/Plugins/SystemPlugins/SoftwareManager/SoftwareTools.py226
-rwxr-xr-xlib/python/Plugins/SystemPlugins/SoftwareManager/meta/Makefile.am2
-rwxr-xr-x[-rw-r--r--]lib/python/Plugins/SystemPlugins/SoftwareManager/meta/plugin_softwaremanager.xml4
-rw-r--r--lib/python/Plugins/SystemPlugins/SoftwareManager/meta/softmanager.jpgbin111681 -> 0 bytes
-rwxr-xr-xlib/python/Plugins/SystemPlugins/SoftwareManager/meta/softwaremanager_de.jpgbin0 -> 95517 bytes
-rwxr-xr-xlib/python/Plugins/SystemPlugins/SoftwareManager/meta/softwaremanager_en.jpgbin0 -> 91769 bytes
-rwxr-xr-xlib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py1308
-rwxr-xr-xlib/python/Plugins/SystemPlugins/VideoEnhancement/meta/Makefile.am2
-rwxr-xr-xlib/python/Plugins/SystemPlugins/VideoEnhancement/meta/plugin_videoenhancement.xml13
-rwxr-xr-xlib/python/Plugins/SystemPlugins/VideoEnhancement/meta/videoenhancement.jpgbin134838 -> 0 bytes
-rwxr-xr-xlib/python/Plugins/SystemPlugins/VideoEnhancement/meta/videoenhancement_de.jpgbin0 -> 117151 bytes
-rwxr-xr-xlib/python/Plugins/SystemPlugins/VideoEnhancement/meta/videoenhancement_en.jpgbin0 -> 110365 bytes
-rwxr-xr-x[-rw-r--r--]lib/python/Plugins/SystemPlugins/VideoTune/meta/plugin_videotune.xml4
-rw-r--r--lib/python/Plugins/SystemPlugins/Videomode/VideoWizard.py8
-rwxr-xr-xlib/python/Plugins/SystemPlugins/Videomode/meta/Makefile.am2
-rwxr-xr-x[-rw-r--r--]lib/python/Plugins/SystemPlugins/Videomode/meta/plugin_videomode.xml4
-rw-r--r--lib/python/Plugins/SystemPlugins/Videomode/meta/videomode.jpgbin107578 -> 0 bytes
-rwxr-xr-xlib/python/Plugins/SystemPlugins/Videomode/meta/videomode_de.jpgbin0 -> 103506 bytes
-rwxr-xr-xlib/python/Plugins/SystemPlugins/Videomode/meta/videomode_en.jpgbin0 -> 95799 bytes
-rw-r--r--lib/python/Plugins/SystemPlugins/Videomode/videowizard.xml6
-rwxr-xr-xlib/python/Plugins/SystemPlugins/WirelessLan/Makefile.am2
-rwxr-xr-xlib/python/Plugins/SystemPlugins/WirelessLan/Wlan.py104
-rwxr-xr-xlib/python/Plugins/SystemPlugins/WirelessLan/meta/Makefile.am5
-rwxr-xr-xlib/python/Plugins/SystemPlugins/WirelessLan/meta/plugin_wirelesslan.xml27
-rwxr-xr-xlib/python/Plugins/SystemPlugins/WirelessLan/meta/wirelesslan_de.jpgbin0 -> 94178 bytes
-rwxr-xr-xlib/python/Plugins/SystemPlugins/WirelessLan/meta/wirelesslan_en.jpgbin0 -> 90678 bytes
-rwxr-xr-xlib/python/Plugins/SystemPlugins/WirelessLan/plugin.py254
-rw-r--r--lib/python/Plugins/newplugin.py4
-rw-r--r--lib/python/Screens/ChannelSelection.py49
-rw-r--r--lib/python/Screens/EpgSelection.py3
-rw-r--r--lib/python/Screens/EventView.py3
-rw-r--r--lib/python/Screens/InfoBar.py7
-rw-r--r--lib/python/Screens/InfoBarGenerics.py144
-rwxr-xr-x[-rw-r--r--]lib/python/Screens/LanguageSelection.py6
-rw-r--r--lib/python/Screens/LocationBox.py5
-rwxr-xr-xlib/python/Screens/Makefile.am2
-rw-r--r--lib/python/Screens/Menu.py16
-rw-r--r--lib/python/Screens/MessageBox.py4
-rw-r--r--lib/python/Screens/MovieSelection.py22
-rwxr-xr-xlib/python/Screens/NetworkSetup.py233
-rwxr-xr-xlib/python/Screens/PluginBrowser.py30
-rwxr-xr-x[-rw-r--r--]lib/python/Screens/RdsDisplay.py10
-rw-r--r--lib/python/Screens/RecordPaths.py194
-rw-r--r--lib/python/Screens/Satconfig.py26
-rw-r--r--lib/python/Screens/ScanSetup.py2
-rw-r--r--lib/python/Screens/Scart.py19
-rw-r--r--lib/python/Screens/SleepTimerEdit.py7
-rw-r--r--lib/python/Screens/TaskView.py7
-rw-r--r--lib/python/Screens/TimerEdit.py3
-rw-r--r--lib/python/Screens/TimerEntry.py18
-rw-r--r--lib/python/Screens/UnhandledKey.py7
-rwxr-xr-xlib/python/Screens/VirtualKeyBoard.py57
-rwxr-xr-xlib/python/Screens/Wizard.py65
-rwxr-xr-xlib/python/Tools/Directories.py23
-rw-r--r--lib/service/servicedvb.cpp97
-rw-r--r--lib/service/servicedvb.h4
-rw-r--r--lib/service/servicemp3.cpp144
-rw-r--r--lib/service/servicemp3.h16
-rw-r--r--lib/service/servicexine.cpp2
-rwxr-xr-xmytest.py4
-rwxr-xr-x[-rw-r--r--]skin.py2
-rwxr-xr-xtools/genmetaindex.py2
175 files changed, 3124 insertions, 1632 deletions
diff --git a/Navigation.py b/Navigation.py
index 2ca87f6f..2437bbf5 100644
--- a/Navigation.py
+++ b/Navigation.py
@@ -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()
diff --git a/RecordTimer.py b/RecordTimer.py
index 4907f64e..f670417a 100644
--- a/RecordTimer.py
+++ b/RecordTimer.py
@@ -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)
diff --git a/configure.ac b/configure.ac
index 5e403deb..1bda10ea 100755
--- a/configure.ac
+++ b/configure.ac
@@ -176,6 +176,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
diff --git a/data/defaults/Dream/userbouquet.favourites.tv b/data/defaults/Dream/userbouquet.favourites.tv
index f1adaf9e..cc5e9fe9 100644
--- a/data/defaults/Dream/userbouquet.favourites.tv
+++ b/data/defaults/Dream/userbouquet.favourites.tv
@@ -10,7 +10,7 @@
#SERVICE 1:0:1:33:21:85:C00000:0:0:0:
#SERVICE 1:0:1:701:5:85:C00000:0:0:0:
#SERVICE 1:0:1:2F1C:441:1:C00000:0:0:0:
-#SERVICE 1:0:1:7005:436:1:C00000:0:0:0:
+#SERVICE 1:0:1:6D6E:437:1:C00000:0:0:0:
#SERVICE 1:0:1:2FC:5:85:C00000:0:0:0:
#SERVICE 1:0:1:F98:454:1:C00000:0:0:0:
#SERVICE 1:0:1:7034:41B:1:C00000:0:0:0:
@@ -26,7 +26,6 @@
#SERVICE 1:64:B:0:0:0:0:0:0:0::Doku/Wissen/Themen
#DESCRIPTION Doku/Wissen/Themen
#SERVICE 1:0:1:6DD0:44D:1:C00000:0:0:0:
-#SERVICE 1:0:1:6D6E:437:1:C00000:0:0:0:
#SERVICE 1:0:1:6D6B:437:1:C00000:0:0:0:
#SERVICE 1:0:1:2775:444:1:C00000:0:0:0:
#SERVICE 1:0:1:293:5:85:C00000:0:0:0:
@@ -77,8 +76,6 @@
#SERVICE 1:64:5:0:0:0:0:0:0:0::Reisen
#DESCRIPTION Reisen
#SERVICE 1:0:1:20:21:85:C00000:0:0:0:
-#SERVICE 1:0:1:3339:45B:1:C00000:0:0:0:
-#SERVICE 1:0:1:27B9:444:1:C00000:0:0:0:
#SERVICE 1:64:9:0:0:0:0:0:0:0::Beratung
#DESCRIPTION Beratung
#SERVICE 1:0:1:295:21:85:C00000:0:0:0:
@@ -92,7 +89,6 @@
#SERVICE 1:0:1:36:7:85:C00000:0:0:0:
#SERVICE 1:0:1:307:7:85:C00000:0:0:0:
#SERVICE 1:0:1:296:5:85:C00000:0:0:0:
-#SERVICE 1:0:1:2791:444:1:C00000:0:0:0:
#SERVICE 1:0:1:383:21:85:C00000:0:0:0:
#SERVICE 1:0:1:313C:459:1:C00000:0:0:0:
#SERVICE 1:0:1:3159:459:1:C00000:0:0:0:
@@ -104,9 +100,9 @@
#SERVICE 1:0:19:2B66:3F3:1:C00000:0:0:0:
#SERVICE 1:0:19:2B70:3F3:1:C00000:0:0:0:
#SERVICE 1:0:19:6EEC:4B1:1:C00000:0:0:0:
-#SERVICE 1:0:19:1324:3EF:1:C00000:0:0:0:
-#SERVICE 1:0:19:1325:3EF:1:C00000:0:0:0:
+#SERVICE 1:0:19:EF12:421:1:C00000:0:0:0:
#SERVICE 1:0:19:2B84:3F3:1:C00000:0:0:0:
+#SERVICE 1:0:19:EF13:421:1:C00000:0:0:0:
#SERVICE 1:64:0:0:0:0:0:0:0:0::Alternativen
#DESCRIPTION Alternativen
#SERVICE 1:0:1:6DCB:44D:1:C00000:0:0:0:
diff --git a/data/keymap.xml b/data/keymap.xml
index 25538f87..9461d509 100755
--- a/data/keymap.xml
+++ b/data/keymap.xml
@@ -98,6 +98,10 @@
<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" />
diff --git a/data/menu.xml b/data/menu.xml
index c7fb8897..59195f15 100644
--- a/data/menu.xml
+++ b/data/menu.xml
@@ -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>
diff --git a/data/skin_default.xml b/data/skin_default.xml
index 16504abf..85c4016a 100755
--- a/data/skin_default.xml
+++ b/data/skin_default.xml
@@ -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" />
diff --git a/data/skin_default/Makefile.am b/data/skin_default/Makefile.am
index e2d2abcc..9e9b7cd4 100644..100755
--- a/data/skin_default/Makefile.am
+++ b/data/skin_default/Makefile.am
@@ -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
index 00000000..4f6f49c2
--- /dev/null
+++ b/data/skin_default/border_menu_350.png
Binary files differ
diff --git a/data/skin_default/div-h.png b/data/skin_default/div-h.png
index d6fcc7fb..9ab4ff45 100644..100755
--- a/data/skin_default/div-h.png
+++ b/data/skin_default/div-h.png
Binary files differ
diff --git a/data/skin_default/icons/dish.png b/data/skin_default/icons/dish.png
index f3c6548d..6148e07c 100644
--- a/data/skin_default/icons/dish.png
+++ b/data/skin_default/icons/dish.png
Binary files differ
diff --git a/data/skin_default/unhandled-key.png b/data/skin_default/unhandled-key.png
new file mode 100644
index 00000000..8e543498
--- /dev/null
+++ b/data/skin_default/unhandled-key.png
Binary files differ
diff --git a/lib/actions/action.cpp b/lib/actions/action.cpp
index 0eb4cdb1..a2d85ffd 100644
--- a/lib/actions/action.cpp
+++ b/lib/actions/action.cpp
@@ -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));
diff --git a/lib/base/elock.h b/lib/base/elock.h
index 51582e67..01757182 100644
--- a/lib/base/elock.h
+++ b/lib/base/elock.h
@@ -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()
{
diff --git a/lib/base/filepush.cpp b/lib/base/filepush.cpp
index 3412c84a..91f24ba0 100644
--- a/lib/base/filepush.cpp
+++ b/lib/base/filepush.cpp
@@ -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);
}
diff --git a/lib/driver/rc.cpp b/lib/driver/rc.cpp
index c7acd113..c56fde44 100644
--- a/lib/driver/rc.cpp
+++ b/lib/driver/rc.cpp
@@ -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;
}
diff --git a/lib/driver/rc.h b/lib/driver/rc.h
index 9708ea7b..52909468 100644
--- a/lib/driver/rc.h
+++ b/lib/driver/rc.h
@@ -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; }
};
diff --git a/lib/driver/rcconsole.cpp b/lib/driver/rcconsole.cpp
index bcce5601..eb5aee3d 100644
--- a/lib/driver/rcconsole.cpp
+++ b/lib/driver/rcconsole.cpp
@@ -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 */
diff --git a/lib/driver/rcinput.cpp b/lib/driver/rcinput.cpp
index d10d94f3..e593087d 100644
--- a/lib/driver/rcinput.cpp
+++ b/lib/driver/rcinput.cpp
@@ -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
diff --git a/lib/driver/rcinput.h b/lib/driver/rcinput.h
index c7f56975..3b4579c5 100644
--- a/lib/driver/rcinput.h
+++ b/lib/driver/rcinput.h
@@ -10,6 +10,7 @@ public:
void handleCode(long code);
eRCDeviceInputDev(eRCInputEventDriver *driver);
const char *getDescription() const;
+ void setExclusive(bool);
};
#endif
diff --git a/lib/dvb/decoder.cpp b/lib/dvb/decoder.cpp
index 710cc421..ef8dadc3 100644
--- a/lib/dvb/decoder.cpp
+++ b/lib/dvb/decoder.cpp
@@ -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),
diff --git a/lib/dvb/decoder.h b/lib/dvb/decoder.h
index b53638b5..3a0fbac1 100644
--- a/lib/dvb/decoder.h
+++ b/lib/dvb/decoder.h
@@ -193,6 +193,8 @@ public:
int getVideoProgressive();
int getVideoFrameRate();
int getVideoAspect();
+ static RESULT setHwPCMDelay(int delay);
+ static RESULT setHwAC3Delay(int delay);
};
#endif
diff --git a/lib/dvb/dvb.cpp b/lib/dvb/dvb.cpp
index 894287e8..6eaadb04 100644
--- a/lib/dvb/dvb.cpp
+++ b/lib/dvb/dvb.cpp
@@ -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;
diff --git a/lib/dvb/epgcache.cpp b/lib/dvb/epgcache.cpp
index 2dc36412..48cbfbfd 100644
--- a/lib/dvb/epgcache.cpp
+++ b/lib/dvb/epgcache.cpp
@@ -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
diff --git a/lib/dvb/epgcache.h b/lib/dvb/epgcache.h
index 7d1b163f..4d45d87e 100644
--- a/lib/dvb/epgcache.h
+++ b/lib/dvb/epgcache.h
@@ -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;
diff --git a/lib/dvb/idvb.h b/lib/dvb/idvb.h
index cff4dbb9..4ef7efad 100644
--- a/lib/dvb/idvb.h
+++ b/lib/dvb/idvb.h
@@ -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;
diff --git a/lib/dvb/lowlevel/mhw.h b/lib/dvb/lowlevel/mhw.h
index 0b4904fa..f06c86e8 100644
--- a/lib/dvb/lowlevel/mhw.h
+++ b/lib/dvb/lowlevel/mhw.h
@@ -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;
diff --git a/lib/dvb/pmt.cpp b/lib/dvb/pmt.cpp
index 9bd065b3..ee89a3a4 100644
--- a/lib/dvb/pmt.cpp
+++ b/lib/dvb/pmt.cpp
@@ -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;
diff --git a/lib/dvb/pmt.h b/lib/dvb/pmt.h
index a9ca23f2..483c06b1 100644
--- a/lib/dvb/pmt.h
+++ b/lib/dvb/pmt.h
@@ -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
diff --git a/lib/dvb/pvrparse.cpp b/lib/dvb/pvrparse.cpp
index 1393bf77..5cdecbd6 100644
--- a/lib/dvb/pvrparse.cpp
+++ b/lib/dvb/pvrparse.cpp
@@ -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);
diff --git a/lib/dvb/tstools.cpp b/lib/dvb/tstools.cpp
index a9eef406..d5ad2494 100644
--- a/lib/dvb/tstools.cpp
+++ b/lib/dvb/tstools.cpp
@@ -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
}
}
diff --git a/lib/dvb/tstools.h b/lib/dvb/tstools.h
index c230a341..ed8b9241 100644
--- a/lib/dvb/tstools.h
+++ b/lib/dvb/tstools.h
@@ -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;
diff --git a/lib/python/Components/ChoiceList.py b/lib/python/Components/ChoiceList.py
index fe505c2a..33868d61 100644..100755
--- a/lib/python/Components/ChoiceList.py
+++ b/lib/python/Components/ChoiceList.py
@@ -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))
diff --git a/lib/python/Components/ConfigList.py b/lib/python/Components/ConfigList.py
index 00949e2f..418a1b67 100644..100755
--- a/lib/python/Components/ConfigList.py
+++ b/lib/python/Components/ConfigList.py
@@ -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)
diff --git a/lib/python/Components/EpgList.py b/lib/python/Components/EpgList.py
index 59f92621..41cd1b2c 100644..100755
--- a/lib/python/Components/EpgList.py
+++ b/lib/python/Components/EpgList.py
@@ -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
diff --git a/lib/python/Components/FileList.py b/lib/python/Components/FileList.py
index 38b08547..222512ea 100755
--- a/lib/python/Components/FileList.py
+++ b/lib/python/Components/FileList.py
@@ -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
@@ -23,7 +23,6 @@ EXTENSIONS = {
"ts": "movie",
"avi": "movie",
"divx": "movie",
- "m4v": "movie",
"mpg": "movie",
"mpeg": "movie",
"mkv": "movie",
@@ -35,12 +34,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 +159,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 +258,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 +271,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 +376,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:
diff --git a/lib/python/Components/Harddisk.py b/lib/python/Components/Harddisk.py
index 2efdb68f..03f574f3 100755
--- a/lib/python/Components/Harddisk.py
+++ b/lib/python/Components/Harddisk.py
@@ -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
diff --git a/lib/python/Components/Lcd.py b/lib/python/Components/Lcd.py
index 0e501237..7d27c097 100644
--- a/lib/python/Components/Lcd.py
+++ b/lib/python/Components/Lcd.py
@@ -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:
diff --git a/lib/python/Components/MediaPlayer.py b/lib/python/Components/MediaPlayer.py
index 12f2727f..5583b22d 100644..100755
--- a/lib/python/Components/MediaPlayer.py
+++ b/lib/python/Components/MediaPlayer.py
@@ -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 ]
diff --git a/lib/python/Components/Network.py b/lib/python/Components/Network.py
index f65d6090..bd10d9c3 100755
--- a/lib/python/Components/Network.py
+++ b/lib/python/Components/Network.py
@@ -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):
diff --git a/lib/python/Components/NimManager.py b/lib/python/Components/NimManager.py
index 05204a74..00d06095 100644
--- a/lib/python/Components/NimManager.py
+++ b/lib/python/Components/NimManager.py
@@ -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
diff --git a/lib/python/Components/ParentalControl.py b/lib/python/Components/ParentalControl.py
index d68e01ff..d68e01ff 100644..100755
--- a/lib/python/Components/ParentalControl.py
+++ b/lib/python/Components/ParentalControl.py
diff --git a/lib/python/Components/SelectionList.py b/lib/python/Components/SelectionList.py
index 08af7d02..1c5423fb 100644..100755
--- a/lib/python/Components/SelectionList.py
+++ b/lib/python/Components/SelectionList.py
@@ -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 = [
diff --git a/lib/python/Components/ServiceList.py b/lib/python/Components/ServiceList.py
index b0283c11..6095812a 100644..100755
--- a/lib/python/Components/ServiceList.py
+++ b/lib/python/Components/ServiceList.py
@@ -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)
diff --git a/lib/python/Components/SystemInfo.py b/lib/python/Components/SystemInfo.py
index d2b405a2..f9c4065f 100644
--- a/lib/python/Components/SystemInfo.py
+++ b/lib/python/Components/SystemInfo.py
@@ -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"
diff --git a/lib/python/Components/TimerList.py b/lib/python/Components/TimerList.py
index 44a7eb4f..2a7405df 100644..100755
--- a/lib/python/Components/TimerList.py
+++ b/lib/python/Components/TimerList.py
@@ -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
diff --git a/lib/python/Components/UsageConfig.py b/lib/python/Components/UsageConfig.py
index 6fcab8bc..60827107 100644
--- a/lib/python/Components/UsageConfig.py
+++ b/lib/python/Components/UsageConfig.py
@@ -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
+
diff --git a/lib/python/Components/config.py b/lib/python/Components/config.py
index 1f8709b3..a6007b10 100755
--- a/lib/python/Components/config.py
+++ b/lib/python/Components/config.py
@@ -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
@@ -1283,7 +1283,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 +1319,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 +1338,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 +1352,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):
diff --git a/lib/python/Plugins/Extensions/CutListEditor/meta/plugin_cutlisteditor.xml b/lib/python/Plugins/Extensions/CutListEditor/meta/plugin_cutlisteditor.xml
index 23edc8e5..1431caf4 100644..100755
--- a/lib/python/Plugins/Extensions/CutListEditor/meta/plugin_cutlisteditor.xml
+++ b/lib/python/Plugins/Extensions/CutListEditor/meta/plugin_cutlisteditor.xml
@@ -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" />
diff --git a/lib/python/Plugins/Extensions/CutListEditor/plugin.py b/lib/python/Plugins/Extensions/CutListEditor/plugin.py
index 75663462..abd606d6 100644
--- a/lib/python/Plugins/Extensions/CutListEditor/plugin.py
+++ b/lib/python/Plugins/Extensions/CutListEditor/plugin.py
@@ -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()
diff --git a/lib/python/Plugins/Extensions/DVDBurn/TitleList.py b/lib/python/Plugins/Extensions/DVDBurn/TitleList.py
index d22cbe93..dbc988b1 100755
--- a/lib/python/Plugins/Extensions/DVDBurn/TitleList.py
+++ b/lib/python/Plugins/Extensions/DVDBurn/TitleList.py
@@ -200,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
diff --git a/lib/python/Plugins/Extensions/DVDBurn/meta/Makefile.am b/lib/python/Plugins/Extensions/DVDBurn/meta/Makefile.am
index 1899cb71..0b3be7d6 100755
--- a/lib/python/Plugins/Extensions/DVDBurn/meta/Makefile.am
+++ b/lib/python/Plugins/Extensions/DVDBurn/meta/Makefile.am
@@ -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
index 00000000..44729712
--- /dev/null
+++ b/lib/python/Plugins/Extensions/DVDBurn/meta/dvdburn_de.jpg
Binary files 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
index 00000000..509816d0
--- /dev/null
+++ b/lib/python/Plugins/Extensions/DVDBurn/meta/dvdburn_en.jpg
Binary files differ
diff --git a/lib/python/Plugins/Extensions/DVDBurn/meta/plugin_dvdburn.xml b/lib/python/Plugins/Extensions/DVDBurn/meta/plugin_dvdburn.xml
index 79715397..647d1cfd 100644..100755
--- a/lib/python/Plugins/Extensions/DVDBurn/meta/plugin_dvdburn.xml
+++ b/lib/python/Plugins/Extensions/DVDBurn/meta/plugin_dvdburn.xml
@@ -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" />
diff --git a/lib/python/Plugins/Extensions/DVDPlayer/meta/plugin_dvdplayer.xml b/lib/python/Plugins/Extensions/DVDPlayer/meta/plugin_dvdplayer.xml
index 26581383..1353f7d2 100644..100755
--- a/lib/python/Plugins/Extensions/DVDPlayer/meta/plugin_dvdplayer.xml
+++ b/lib/python/Plugins/Extensions/DVDPlayer/meta/plugin_dvdplayer.xml
@@ -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" />
diff --git a/lib/python/Plugins/Extensions/DVDPlayer/src/servicedvd.cpp b/lib/python/Plugins/Extensions/DVDPlayer/src/servicedvd.cpp
index 94f2ee38..0372c497 100644
--- a/lib/python/Plugins/Extensions/DVDPlayer/src/servicedvd.cpp
+++ b/lib/python/Plugins/Extensions/DVDPlayer/src/servicedvd.cpp
@@ -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)
diff --git a/lib/python/Plugins/Extensions/GraphMultiEPG/GraphMultiEpg.py b/lib/python/Plugins/Extensions/GraphMultiEPG/GraphMultiEpg.py
index b22c4b80..1d621f47 100644..100755
--- a/lib/python/Plugins/Extensions/GraphMultiEPG/GraphMultiEpg.py
+++ b/lib/python/Plugins/Extensions/GraphMultiEPG/GraphMultiEpg.py
@@ -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
diff --git a/lib/python/Plugins/Extensions/GraphMultiEPG/meta/graphmultiepg_de.jpg b/lib/python/Plugins/Extensions/GraphMultiEPG/meta/graphmultiepg_de.jpg
index 8dfdbbf1..b68d095a 100644..100755
--- a/lib/python/Plugins/Extensions/GraphMultiEPG/meta/graphmultiepg_de.jpg
+++ b/lib/python/Plugins/Extensions/GraphMultiEPG/meta/graphmultiepg_de.jpg
Binary files differ
diff --git a/lib/python/Plugins/Extensions/GraphMultiEPG/meta/graphmultiepg_en.jpg b/lib/python/Plugins/Extensions/GraphMultiEPG/meta/graphmultiepg_en.jpg
index 95b6665d..6953f27c 100644..100755
--- a/lib/python/Plugins/Extensions/GraphMultiEPG/meta/graphmultiepg_en.jpg
+++ b/lib/python/Plugins/Extensions/GraphMultiEPG/meta/graphmultiepg_en.jpg
Binary files differ
diff --git a/lib/python/Plugins/Extensions/GraphMultiEPG/meta/plugin_graphmultiepg.xml b/lib/python/Plugins/Extensions/GraphMultiEPG/meta/plugin_graphmultiepg.xml
index 7b0b134b..a10840da 100644..100755
--- a/lib/python/Plugins/Extensions/GraphMultiEPG/meta/plugin_graphmultiepg.xml
+++ b/lib/python/Plugins/Extensions/GraphMultiEPG/meta/plugin_graphmultiepg.xml
@@ -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" />
diff --git a/lib/python/Plugins/Extensions/MediaPlayer/meta/mediaplayer_de.jpg b/lib/python/Plugins/Extensions/MediaPlayer/meta/mediaplayer_de.jpg
index 4396161f..41a67c24 100644..100755
--- a/lib/python/Plugins/Extensions/MediaPlayer/meta/mediaplayer_de.jpg
+++ b/lib/python/Plugins/Extensions/MediaPlayer/meta/mediaplayer_de.jpg
Binary files differ
diff --git a/lib/python/Plugins/Extensions/MediaPlayer/meta/mediaplayer_en.jpg b/lib/python/Plugins/Extensions/MediaPlayer/meta/mediaplayer_en.jpg
index e1d35751..6bfbbc5e 100644..100755
--- a/lib/python/Plugins/Extensions/MediaPlayer/meta/mediaplayer_en.jpg
+++ b/lib/python/Plugins/Extensions/MediaPlayer/meta/mediaplayer_en.jpg
Binary files differ
diff --git a/lib/python/Plugins/Extensions/MediaPlayer/meta/plugin_mediaplayer.xml b/lib/python/Plugins/Extensions/MediaPlayer/meta/plugin_mediaplayer.xml
index 825793f2..2f9f22bf 100644..100755
--- a/lib/python/Plugins/Extensions/MediaPlayer/meta/plugin_mediaplayer.xml
+++ b/lib/python/Plugins/Extensions/MediaPlayer/meta/plugin_mediaplayer.xml
@@ -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" />
diff --git a/lib/python/Plugins/Extensions/MediaPlayer/plugin.py b/lib/python/Plugins/Extensions/MediaPlayer/plugin.py
index 98bc060c..a2422be7 100644..100755
--- a/lib/python/Plugins/Extensions/MediaPlayer/plugin.py
+++ b/lib/python/Plugins/Extensions/MediaPlayer/plugin.py
@@ -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)
@@ -110,7 +110,7 @@ class MediaPlayer(Screen, InfoBarBase, InfoBarSeek, InfoBarAudioSelection, InfoB
# 'None' is magic to start at the list of mountpoints
defaultDir = config.mediaplayer.defaultDir.getValue()
- self.filelist = FileList(defaultDir, matchingPattern = "(?i)^.*\.(mp2|mp3|ogg|ts|wav|wave|m3u|pls|e2pls|mpg|vob|avi|divx|m4v|mkv|mp4|m4a|dat|flac|mov)", useServiceRef = True, additionalExtensions = "4098:m3u 4098:e2pls 4098:pls")
+ self.filelist = FileList(defaultDir, matchingPattern = "(?i)^.*\.(mp2|mp3|ogg|ts|m2ts|wav|wave|m3u|pls|e2pls|mpg|vob|avi|divx|mkv|mp4|m4a|dat|flac|mov)", useServiceRef = True, additionalExtensions = "4098:m3u 4098:e2pls 4098:pls")
self["filelist"] = self.filelist
self.playlist = MyPlayList()
diff --git a/lib/python/Plugins/Extensions/MediaScanner/meta/Makefile.am b/lib/python/Plugins/Extensions/MediaScanner/meta/Makefile.am
index e2aa0e3b..d80b8c27 100755
--- a/lib/python/Plugins/Extensions/MediaScanner/meta/Makefile.am
+++ b/lib/python/Plugins/Extensions/MediaScanner/meta/Makefile.am
@@ -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
index 00000000..e6a191cd
--- /dev/null
+++ b/lib/python/Plugins/Extensions/MediaScanner/meta/mediascanner_de.jpg
Binary files 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
index 00000000..b9561c2f
--- /dev/null
+++ b/lib/python/Plugins/Extensions/MediaScanner/meta/mediascanner_en.jpg
Binary files differ
diff --git a/lib/python/Plugins/Extensions/MediaScanner/meta/plugin_mediascanner.xml b/lib/python/Plugins/Extensions/MediaScanner/meta/plugin_mediascanner.xml
index d899fdb8..eced924f 100644..100755
--- a/lib/python/Plugins/Extensions/MediaScanner/meta/plugin_mediascanner.xml
+++ b/lib/python/Plugins/Extensions/MediaScanner/meta/plugin_mediascanner.xml
@@ -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" />
diff --git a/lib/python/Plugins/Extensions/PicturePlayer/meta/plugin_pictureplayer.xml b/lib/python/Plugins/Extensions/PicturePlayer/meta/plugin_pictureplayer.xml
index 40e59b6c..faff9785 100644..100755
--- a/lib/python/Plugins/Extensions/PicturePlayer/meta/plugin_pictureplayer.xml
+++ b/lib/python/Plugins/Extensions/PicturePlayer/meta/plugin_pictureplayer.xml
@@ -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" />
diff --git a/lib/python/Plugins/Plugin.py b/lib/python/Plugins/Plugin.py
index d7fc6898..5a676cda 100755
--- a/lib/python/Plugins/Plugin.py
+++ b/lib/python/Plugins/Plugin.py
@@ -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
diff --git a/lib/python/Plugins/SystemPlugins/CleanupWizard/meta/Makefile.am b/lib/python/Plugins/SystemPlugins/CleanupWizard/meta/Makefile.am
index 94be4747..d9d96bcf 100755
--- a/lib/python/Plugins/SystemPlugins/CleanupWizard/meta/Makefile.am
+++ b/lib/python/Plugins/SystemPlugins/CleanupWizard/meta/Makefile.am
@@ -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
index 00000000..2f086fb8
--- /dev/null
+++ b/lib/python/Plugins/SystemPlugins/CleanupWizard/meta/cleanupwizard_de.jpg
Binary files 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
index 00000000..d014cb5d
--- /dev/null
+++ b/lib/python/Plugins/SystemPlugins/CleanupWizard/meta/cleanupwizard_en.jpg
Binary files differ
diff --git a/lib/python/Plugins/SystemPlugins/CleanupWizard/meta/plugin_cleanupwizard.xml b/lib/python/Plugins/SystemPlugins/CleanupWizard/meta/plugin_cleanupwizard.xml
index 10ccc73c..99add3d3 100755
--- a/lib/python/Plugins/SystemPlugins/CleanupWizard/meta/plugin_cleanupwizard.xml
+++ b/lib/python/Plugins/SystemPlugins/CleanupWizard/meta/plugin_cleanupwizard.xml
@@ -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" />
diff --git a/lib/python/Plugins/SystemPlugins/CommonInterfaceAssignment/meta/ciassignment.jpg b/lib/python/Plugins/SystemPlugins/CommonInterfaceAssignment/meta/ciassignment.jpg
index 120ac827..75771f98 100644..100755
--- a/lib/python/Plugins/SystemPlugins/CommonInterfaceAssignment/meta/ciassignment.jpg
+++ b/lib/python/Plugins/SystemPlugins/CommonInterfaceAssignment/meta/ciassignment.jpg
Binary files differ
diff --git a/lib/python/Plugins/SystemPlugins/CommonInterfaceAssignment/meta/plugin_commoninterfaceassignment.xml b/lib/python/Plugins/SystemPlugins/CommonInterfaceAssignment/meta/plugin_commoninterfaceassignment.xml
index bb2bf590..9abc5986 100644..100755
--- a/lib/python/Plugins/SystemPlugins/CommonInterfaceAssignment/meta/plugin_commoninterfaceassignment.xml
+++ b/lib/python/Plugins/SystemPlugins/CommonInterfaceAssignment/meta/plugin_commoninterfaceassignment.xml
@@ -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" />
diff --git a/lib/python/Plugins/SystemPlugins/CrashlogAutoSubmit/meta/Makefile.am b/lib/python/Plugins/SystemPlugins/CrashlogAutoSubmit/meta/Makefile.am
index b619c8c6..aed728db 100755
--- a/lib/python/Plugins/SystemPlugins/CrashlogAutoSubmit/meta/Makefile.am
+++ b/lib/python/Plugins/SystemPlugins/CrashlogAutoSubmit/meta/Makefile.am
@@ -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
index 00000000..04894160
--- /dev/null
+++ b/lib/python/Plugins/SystemPlugins/CrashlogAutoSubmit/meta/crashlogautosubmit_de.jpg
Binary files 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
index 00000000..5e5c728b
--- /dev/null
+++ b/lib/python/Plugins/SystemPlugins/CrashlogAutoSubmit/meta/crashlogautosubmit_en.jpg
Binary files differ
diff --git a/lib/python/Plugins/SystemPlugins/CrashlogAutoSubmit/meta/plugin_crashlogautosubmit.xml b/lib/python/Plugins/SystemPlugins/CrashlogAutoSubmit/meta/plugin_crashlogautosubmit.xml
index 261eb497..a118ed7f 100644..100755
--- a/lib/python/Plugins/SystemPlugins/CrashlogAutoSubmit/meta/plugin_crashlogautosubmit.xml
+++ b/lib/python/Plugins/SystemPlugins/CrashlogAutoSubmit/meta/plugin_crashlogautosubmit.xml
@@ -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" />
diff --git a/lib/python/Plugins/SystemPlugins/DefaultServicesScanner/meta/defaultservicescanner.jpg b/lib/python/Plugins/SystemPlugins/DefaultServicesScanner/meta/defaultservicescanner.jpg
index a0fd3b1c..f4d0a1e2 100644..100755
--- a/lib/python/Plugins/SystemPlugins/DefaultServicesScanner/meta/defaultservicescanner.jpg
+++ b/lib/python/Plugins/SystemPlugins/DefaultServicesScanner/meta/defaultservicescanner.jpg
Binary files differ
diff --git a/lib/python/Plugins/SystemPlugins/DefaultServicesScanner/meta/plugin_defaultservicesscanner.xml b/lib/python/Plugins/SystemPlugins/DefaultServicesScanner/meta/plugin_defaultservicesscanner.xml
index bf0ce253..41d41ed6 100644..100755
--- a/lib/python/Plugins/SystemPlugins/DefaultServicesScanner/meta/plugin_defaultservicesscanner.xml
+++ b/lib/python/Plugins/SystemPlugins/DefaultServicesScanner/meta/plugin_defaultservicesscanner.xml
@@ -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" />
diff --git a/lib/python/Plugins/SystemPlugins/DiseqcTester/meta/Makefile.am b/lib/python/Plugins/SystemPlugins/DiseqcTester/meta/Makefile.am
index 8405ed7a..9b0a2ede 100755
--- a/lib/python/Plugins/SystemPlugins/DiseqcTester/meta/Makefile.am
+++ b/lib/python/Plugins/SystemPlugins/DiseqcTester/meta/Makefile.am
@@ -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
index c872334c..00000000
--- a/lib/python/Plugins/SystemPlugins/DiseqcTester/meta/diseqctester.jpg
+++ /dev/null
Binary files 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
index 00000000..5a6e1532
--- /dev/null
+++ b/lib/python/Plugins/SystemPlugins/DiseqcTester/meta/diseqctester_de.jpg
Binary files 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
index 00000000..43dad76c
--- /dev/null
+++ b/lib/python/Plugins/SystemPlugins/DiseqcTester/meta/diseqctester_en.jpg
Binary files differ
diff --git a/lib/python/Plugins/SystemPlugins/DiseqcTester/meta/plugin_diseqctester.xml b/lib/python/Plugins/SystemPlugins/DiseqcTester/meta/plugin_diseqctester.xml
index 5415db08..33808b3e 100644..100755
--- a/lib/python/Plugins/SystemPlugins/DiseqcTester/meta/plugin_diseqctester.xml
+++ b/lib/python/Plugins/SystemPlugins/DiseqcTester/meta/plugin_diseqctester.xml
@@ -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" />
diff --git a/lib/python/Plugins/SystemPlugins/NFIFlash/meta/Makefile.am b/lib/python/Plugins/SystemPlugins/NFIFlash/meta/Makefile.am
index 686bded0..0633e7cf 100755
--- a/lib/python/Plugins/SystemPlugins/NFIFlash/meta/Makefile.am
+++ b/lib/python/Plugins/SystemPlugins/NFIFlash/meta/Makefile.am
@@ -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
index 0a5fa469..00000000
--- a/lib/python/Plugins/SystemPlugins/NFIFlash/meta/nfiflash.jpg
+++ /dev/null
Binary files 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
index 00000000..fec93f4b
--- /dev/null
+++ b/lib/python/Plugins/SystemPlugins/NFIFlash/meta/nfiflash_de.jpg
Binary files 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
index 00000000..32a9967b
--- /dev/null
+++ b/lib/python/Plugins/SystemPlugins/NFIFlash/meta/nfiflash_en.jpg
Binary files differ
diff --git a/lib/python/Plugins/SystemPlugins/NFIFlash/meta/plugin_nfiflash.xml b/lib/python/Plugins/SystemPlugins/NFIFlash/meta/plugin_nfiflash.xml
index 2de88f08..c81f4ca5 100644..100755
--- a/lib/python/Plugins/SystemPlugins/NFIFlash/meta/plugin_nfiflash.xml
+++ b/lib/python/Plugins/SystemPlugins/NFIFlash/meta/plugin_nfiflash.xml
@@ -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" />
diff --git a/lib/python/Plugins/SystemPlugins/NFIFlash/plugin.py b/lib/python/Plugins/SystemPlugins/NFIFlash/plugin.py
index 40914e12..28b33305 100644..100755
--- a/lib/python/Plugins/SystemPlugins/NFIFlash/plugin.py
+++ b/lib/python/Plugins/SystemPlugins/NFIFlash/plugin.py
@@ -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)]
diff --git a/lib/python/Plugins/SystemPlugins/NetworkWizard/NetworkWizard.py b/lib/python/Plugins/SystemPlugins/NetworkWizard/NetworkWizard.py
index 4d361157..75ca390b 100755
--- a/lib/python/Plugins/SystemPlugins/NetworkWizard/NetworkWizard.py
+++ b/lib/python/Plugins/SystemPlugins/NetworkWizard/NetworkWizard.py
@@ -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
+
+
diff --git a/lib/python/Plugins/SystemPlugins/NetworkWizard/meta/Makefile.am b/lib/python/Plugins/SystemPlugins/NetworkWizard/meta/Makefile.am
index 98dbe80b..e8f738c6 100755
--- a/lib/python/Plugins/SystemPlugins/NetworkWizard/meta/Makefile.am
+++ b/lib/python/Plugins/SystemPlugins/NetworkWizard/meta/Makefile.am
@@ -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
index 00000000..3999a413
--- /dev/null
+++ b/lib/python/Plugins/SystemPlugins/NetworkWizard/meta/networkwizard_de.jpg
Binary files 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
index 00000000..0a0434a0
--- /dev/null
+++ b/lib/python/Plugins/SystemPlugins/NetworkWizard/meta/networkwizard_en.jpg
Binary files differ
diff --git a/lib/python/Plugins/SystemPlugins/NetworkWizard/meta/plugin_networkwizard.xml b/lib/python/Plugins/SystemPlugins/NetworkWizard/meta/plugin_networkwizard.xml
index 660bbcd2..4d3adcbd 100755
--- a/lib/python/Plugins/SystemPlugins/NetworkWizard/meta/plugin_networkwizard.xml
+++ b/lib/python/Plugins/SystemPlugins/NetworkWizard/meta/plugin_networkwizard.xml
@@ -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" />
diff --git a/lib/python/Plugins/SystemPlugins/NetworkWizard/networkwizard.xml b/lib/python/Plugins/SystemPlugins/NetworkWizard/networkwizard.xml
index 134797a7..dcd9d933 100755
--- a/lib/python/Plugins/SystemPlugins/NetworkWizard/networkwizard.xml
+++ b/lib/python/Plugins/SystemPlugins/NetworkWizard/networkwizard.xml
@@ -1,172 +1,202 @@
<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>
diff --git a/lib/python/Plugins/SystemPlugins/PositionerSetup/meta/plugin_positionersetup.xml b/lib/python/Plugins/SystemPlugins/PositionerSetup/meta/plugin_positionersetup.xml
index d20b2e68..2cb47c07 100644..100755
--- a/lib/python/Plugins/SystemPlugins/PositionerSetup/meta/plugin_positionersetup.xml
+++ b/lib/python/Plugins/SystemPlugins/PositionerSetup/meta/plugin_positionersetup.xml
@@ -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" />
diff --git a/lib/python/Plugins/SystemPlugins/PositionerSetup/meta/positionersetup.jpg b/lib/python/Plugins/SystemPlugins/PositionerSetup/meta/positionersetup.jpg
index 63072137..7f8d8d22 100644..100755
--- a/lib/python/Plugins/SystemPlugins/PositionerSetup/meta/positionersetup.jpg
+++ b/lib/python/Plugins/SystemPlugins/PositionerSetup/meta/positionersetup.jpg
Binary files differ
diff --git a/lib/python/Plugins/SystemPlugins/SatelliteEquipmentControl/meta/plugin_satelliteequipmentcontrol.xml b/lib/python/Plugins/SystemPlugins/SatelliteEquipmentControl/meta/plugin_satelliteequipmentcontrol.xml
index 8fa36e54..4c0c7af7 100644..100755
--- a/lib/python/Plugins/SystemPlugins/SatelliteEquipmentControl/meta/plugin_satelliteequipmentcontrol.xml
+++ b/lib/python/Plugins/SystemPlugins/SatelliteEquipmentControl/meta/plugin_satelliteequipmentcontrol.xml
@@ -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" />
diff --git a/lib/python/Plugins/SystemPlugins/SatelliteEquipmentControl/meta/satcontrol.jpg b/lib/python/Plugins/SystemPlugins/SatelliteEquipmentControl/meta/satcontrol.jpg
index b9596a69..703650e2 100644..100755
--- a/lib/python/Plugins/SystemPlugins/SatelliteEquipmentControl/meta/satcontrol.jpg
+++ b/lib/python/Plugins/SystemPlugins/SatelliteEquipmentControl/meta/satcontrol.jpg
Binary files differ
diff --git a/lib/python/Plugins/SystemPlugins/Satfinder/meta/plugin_satfinder.xml b/lib/python/Plugins/SystemPlugins/Satfinder/meta/plugin_satfinder.xml
index aaab7e42..e9453deb 100644..100755
--- a/lib/python/Plugins/SystemPlugins/Satfinder/meta/plugin_satfinder.xml
+++ b/lib/python/Plugins/SystemPlugins/Satfinder/meta/plugin_satfinder.xml
@@ -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" />
diff --git a/lib/python/Plugins/SystemPlugins/Satfinder/meta/satfinder.jpg b/lib/python/Plugins/SystemPlugins/Satfinder/meta/satfinder.jpg
index c0bba0c8..44f09811 100644..100755
--- a/lib/python/Plugins/SystemPlugins/Satfinder/meta/satfinder.jpg
+++ b/lib/python/Plugins/SystemPlugins/Satfinder/meta/satfinder.jpg
Binary files differ
diff --git a/lib/python/Plugins/SystemPlugins/SkinSelector/meta/Makefile.am b/lib/python/Plugins/SystemPlugins/SkinSelector/meta/Makefile.am
index 689d97ef..d29fb002 100755
--- a/lib/python/Plugins/SystemPlugins/SkinSelector/meta/Makefile.am
+++ b/lib/python/Plugins/SystemPlugins/SkinSelector/meta/Makefile.am
@@ -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
diff --git a/lib/python/Plugins/SystemPlugins/SkinSelector/meta/plugin_skinselector.xml b/lib/python/Plugins/SystemPlugins/SkinSelector/meta/plugin_skinselector.xml
index 4ce7f1b0..717f732b 100644..100755
--- a/lib/python/Plugins/SystemPlugins/SkinSelector/meta/plugin_skinselector.xml
+++ b/lib/python/Plugins/SystemPlugins/SkinSelector/meta/plugin_skinselector.xml
@@ -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
index 74395eaa..00000000
--- a/lib/python/Plugins/SystemPlugins/SkinSelector/meta/skinselector.jpg
+++ /dev/null
Binary files 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
index 00000000..3b40708a
--- /dev/null
+++ b/lib/python/Plugins/SystemPlugins/SkinSelector/meta/skinselector_de.jpg
Binary files 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
index 00000000..b9f0bd3e
--- /dev/null
+++ b/lib/python/Plugins/SystemPlugins/SkinSelector/meta/skinselector_en.jpg
Binary files differ
diff --git a/lib/python/Plugins/SystemPlugins/SoftwareManager/BackupRestore.py b/lib/python/Plugins/SystemPlugins/SoftwareManager/BackupRestore.py
index 871f0a30..d9ccab57 100755
--- a/lib/python/Plugins/SystemPlugins/SoftwareManager/BackupRestore.py
+++ b/lib/python/Plugins/SystemPlugins/SoftwareManager/BackupRestore.py
@@ -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)
diff --git a/lib/python/Plugins/SystemPlugins/SoftwareManager/Makefile.am b/lib/python/Plugins/SystemPlugins/SoftwareManager/Makefile.am
index ee1e56de..2d5e3381 100644..100755
--- a/lib/python/Plugins/SystemPlugins/SoftwareManager/Makefile.am
+++ b/lib/python/Plugins/SystemPlugins/SoftwareManager/Makefile.am
@@ -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
index 00000000..4e7591ef
--- /dev/null
+++ b/lib/python/Plugins/SystemPlugins/SoftwareManager/SoftwareTools.py
@@ -0,0 +1,226 @@
+from enigma import eConsoleAppContainer
+from Components.Console import Console
+from Components.About import about
+from Components.DreamInfoHandler import DreamInfoHandler
+from Components.Language import language
+from Components.Sources.List import List
+from Components.Ipkg import IpkgComponent
+from Components.Network import iNetwork
+from Tools.Directories import pathExists, fileExists, resolveFilename, SCOPE_METADIR
+
+from time import time
+
+class SoftwareTools(DreamInfoHandler):
+ lastDownloadDate = None
+ NetworkConnectionAvailable = None
+ list_updating = False
+ available_updates = 0
+ available_updatelist = []
+ available_packetlist = []
+ installed_packetlist = {}
+
+
+ def __init__(self):
+ aboutInfo = about.getImageVersionString()
+ if aboutInfo.startswith("dev-"):
+ self.ImageVersion = 'Experimental'
+ else:
+ self.ImageVersion = 'Stable'
+ self.language = language.getLanguage()[:2] # getLanguage returns e.g. "fi_FI" for "language_country"
+ DreamInfoHandler.__init__(self, self.statusCallback, blocking = False, neededTag = 'ALL_TAGS', neededFlag = self.ImageVersion, language = self.language)
+ self.directory = resolveFilename(SCOPE_METADIR)
+ self.list = List([])
+ self.NotifierCallback = None
+ self.Console = Console()
+ self.UpdateConsole = Console()
+ self.cmdList = []
+ self.unwanted_extensions = ('-dbg', '-dev', '-doc')
+ self.ipkg = IpkgComponent()
+ self.ipkg.addCallback(self.ipkgCallback)
+
+ def statusCallback(self, status, progress):
+ pass
+
+ def startSoftwareTools(self, callback = None):
+ if callback is not None:
+ self.NotifierCallback = callback
+ iNetwork.checkNetworkState(self.checkNetworkCB)
+
+ def checkNetworkCB(self,data):
+ if data is not None:
+ if data <= 2:
+ SoftwareTools.NetworkConnectionAvailable = True
+ self.getUpdates()
+ else:
+ SoftwareTools.NetworkConnectionAvailable = False
+ self.getUpdates()
+
+ def getUpdates(self, callback = None):
+ if SoftwareTools.NetworkConnectionAvailable == True:
+ SoftwareTools.lastDownloadDate = time()
+ if SoftwareTools.list_updating is False and callback is None:
+ SoftwareTools.list_updating = True
+ self.ipkg.startCmd(IpkgComponent.CMD_UPDATE)
+ elif SoftwareTools.list_updating is False and callback is not None:
+ SoftwareTools.list_updating = True
+ self.NotifierCallback = callback
+ self.ipkg.startCmd(IpkgComponent.CMD_UPDATE)
+ elif SoftwareTools.list_updating is True and callback is not None:
+ #update info collecting already in progress
+ self.NotifierCallback = callback
+ else:
+ SoftwareTools.list_updating = False
+ if callback is not None:
+ callback(False)
+ elif self.NotifierCallback is not None:
+ self.NotifierCallback(False)
+
+ def ipkgCallback(self, event, param):
+ if event == IpkgComponent.EVENT_ERROR:
+ SoftwareTools.list_updating = False
+ elif event == IpkgComponent.EVENT_DONE:
+ if SoftwareTools.list_updating:
+ self.startIpkgListAvailable()
+ pass
+
+ def startIpkgListAvailable(self, callback = None):
+ if callback is not None:
+ SoftwareTools.list_updating = True
+ if SoftwareTools.list_updating:
+ if not self.UpdateConsole:
+ self.UpdateConsole = Console()
+ cmd = "ipkg list"
+ self.UpdateConsole.ePopen(cmd, self.IpkgListAvailableCB, callback)
+
+ def IpkgListAvailableCB(self, result, retval, extra_args = None):
+ (callback) = extra_args
+ if len(result):
+ if SoftwareTools.list_updating:
+ SoftwareTools.available_packetlist = []
+ for x in result.splitlines():
+ split = x.split(' - ')
+ name = split[0].strip()
+ if not any(name.endswith(x) for x in self.unwanted_extensions):
+ SoftwareTools.available_packetlist.append([name, split[1].strip(), split[2].strip()])
+ if callback is None:
+ self.startInstallMetaPackage()
+ else:
+ if self.UpdateConsole:
+ if len(self.UpdateConsole.appContainers) == 0:
+ callback(True)
+ else:
+ SoftwareTools.list_updating = False
+ if self.UpdateConsole:
+ if len(self.UpdateConsole.appContainers) == 0:
+ if callback is not None:
+ callback(False)
+
+ def startInstallMetaPackage(self, callback = None):
+ if callback is not None:
+ SoftwareTools.list_updating = True
+ if SoftwareTools.list_updating:
+ if not self.UpdateConsole:
+ self.UpdateConsole = Console()
+ cmd = "ipkg install enigma2-meta enigma2-plugins-meta enigma2-skins-meta"
+ self.UpdateConsole.ePopen(cmd, self.InstallMetaPackageCB, callback)
+
+ def InstallMetaPackageCB(self, result, retval, extra_args = None):
+ (callback) = extra_args
+ if len(result):
+ self.fillPackagesIndexList()
+ if callback is None:
+ self.startIpkgListInstalled()
+ else:
+ if self.UpdateConsole:
+ if len(self.UpdateConsole.appContainers) == 0:
+ callback(True)
+ else:
+ SoftwareTools.list_updating = False
+ if self.UpdateConsole:
+ if len(self.UpdateConsole.appContainers) == 0:
+ if callback is not None:
+ callback(False)
+
+ def startIpkgListInstalled(self, callback = None):
+ if callback is not None:
+ SoftwareTools.list_updating = True
+ if SoftwareTools.list_updating:
+ if not self.UpdateConsole:
+ self.UpdateConsole = Console()
+ cmd = "ipkg list_installed"
+ self.UpdateConsole.ePopen(cmd, self.IpkgListInstalledCB, callback)
+
+ def IpkgListInstalledCB(self, result, retval, extra_args = None):
+ (callback) = extra_args
+ if len(result):
+ SoftwareTools.installed_packetlist = {}
+ for x in result.splitlines():
+ split = x.split(' - ')
+ name = split[0].strip()
+ if not any(name.endswith(x) for x in self.unwanted_extensions):
+ SoftwareTools.installed_packetlist[name] = split[1].strip()
+ if callback is None:
+ self.countUpdates()
+ else:
+ if self.UpdateConsole:
+ if len(self.UpdateConsole.appContainers) == 0:
+ callback(True)
+ else:
+ SoftwareTools.list_updating = False
+ if self.UpdateConsole:
+ if len(self.UpdateConsole.appContainers) == 0:
+ if callback is not None:
+ callback(False)
+
+ def countUpdates(self, callback = None):
+ SoftwareTools.available_updates = 0
+ SoftwareTools.available_updatelist = []
+ for package in self.packagesIndexlist[:]:
+ attributes = package[0]["attributes"]
+ packagename = attributes["packagename"]
+ for x in SoftwareTools.available_packetlist:
+ if x[0] == packagename:
+ if SoftwareTools.installed_packetlist.has_key(packagename):
+ if SoftwareTools.installed_packetlist[packagename] != x[1]:
+ SoftwareTools.available_updates +=1
+ SoftwareTools.available_updatelist.append([packagename])
+
+ SoftwareTools.list_updating = False
+ if self.UpdateConsole:
+ if len(self.UpdateConsole.appContainers) == 0:
+ if callback is not None:
+ callback(True)
+ callback = None
+ elif self.NotifierCallback is not None:
+ self.NotifierCallback(True)
+ self.NotifierCallback = None
+
+ def startIpkgUpdate(self, callback = None):
+ if not self.Console:
+ self.Console = Console()
+ cmd = "ipkg update"
+ self.Console.ePopen(cmd, self.IpkgUpdateCB, callback)
+
+ def IpkgUpdateCB(self, result, retval, extra_args = None):
+ (callback) = extra_args
+ if len(result):
+ if self.Console:
+ if len(self.Console.appContainers) == 0:
+ if callback is not None:
+ callback(True)
+ callback = None
+
+ def cleanupSoftwareTools(self):
+ if self.NotifierCallback is not None:
+ self.NotifierCallback = None
+ self.ipkg.stop()
+ if self.Console is not None:
+ if len(self.Console.appContainers):
+ for name in self.Console.appContainers.keys():
+ self.Console.kill(name)
+ if self.UpdateConsole is not None:
+ if len(self.UpdateConsole.appContainers):
+ for name in self.UpdateConsole.appContainers.keys():
+ self.UpdateConsole.kill(name)
+
+iSoftwareTools = SoftwareTools() \ No newline at end of file
diff --git a/lib/python/Plugins/SystemPlugins/SoftwareManager/meta/Makefile.am b/lib/python/Plugins/SystemPlugins/SoftwareManager/meta/Makefile.am
index 341938c5..05a87d5a 100755
--- a/lib/python/Plugins/SystemPlugins/SoftwareManager/meta/Makefile.am
+++ b/lib/python/Plugins/SystemPlugins/SoftwareManager/meta/Makefile.am
@@ -2,4 +2,4 @@ installdir = $(datadir)/meta/
dist_install_DATA = plugin_softwaremanager.xml
-EXTRA_DIST = softmanager.jpg
+EXTRA_DIST = softwaremanager_en.jpg softwaremanager_de.jpg
diff --git a/lib/python/Plugins/SystemPlugins/SoftwareManager/meta/plugin_softwaremanager.xml b/lib/python/Plugins/SystemPlugins/SoftwareManager/meta/plugin_softwaremanager.xml
index fa84670e..cd425c33 100644..100755
--- a/lib/python/Plugins/SystemPlugins/SoftwareManager/meta/plugin_softwaremanager.xml
+++ b/lib/python/Plugins/SystemPlugins/SoftwareManager/meta/plugin_softwaremanager.xml
@@ -11,7 +11,7 @@
<description>The SoftwareManager manages your Dreambox software.\n
It's easy to update your receiver's software, install or remove extensions or even backup and restore your system settings.
</description>
- <screenshot src="http://www.dreamboxupdate.com/preview/softmanager.jpg" />
+ <screenshot src="http://www.dreamboxupdate.com/preview/plugin_softwaremanager_en.jpg" />
</info>
<info language="de">
<author>Dream Multimedia</author>
@@ -22,7 +22,7 @@
Sie können nun einfach Ihre Dreambox-Software aktualisieren, neue Erweiterungen installieren oder entfernen,
oder ihre Einstellungen sichern und wiederherstellen.
</description>
- <screenshot src="http://www.dreamboxupdate.com/preview/softmanager.jpg" />
+ <screenshot src="http://www.dreamboxupdate.com/preview/plugin_softwaremanager_de.jpg" />
</info>
<files type="package"> <!-- without version, without .ipk -->
<file type="package" name="enigma2-plugin-systemplugins-softwaremanager" />
diff --git a/lib/python/Plugins/SystemPlugins/SoftwareManager/meta/softmanager.jpg b/lib/python/Plugins/SystemPlugins/SoftwareManager/meta/softmanager.jpg
deleted file mode 100644
index a9d5a629..00000000
--- a/lib/python/Plugins/SystemPlugins/SoftwareManager/meta/softmanager.jpg
+++ /dev/null
Binary files differ
diff --git a/lib/python/Plugins/SystemPlugins/SoftwareManager/meta/softwaremanager_de.jpg b/lib/python/Plugins/SystemPlugins/SoftwareManager/meta/softwaremanager_de.jpg
new file mode 100755
index 00000000..54e64196
--- /dev/null
+++ b/lib/python/Plugins/SystemPlugins/SoftwareManager/meta/softwaremanager_de.jpg
Binary files differ
diff --git a/lib/python/Plugins/SystemPlugins/SoftwareManager/meta/softwaremanager_en.jpg b/lib/python/Plugins/SystemPlugins/SoftwareManager/meta/softwaremanager_en.jpg
new file mode 100755
index 00000000..0832f0ac
--- /dev/null
+++ b/lib/python/Plugins/SystemPlugins/SoftwareManager/meta/softwaremanager_en.jpg
Binary files differ
diff --git a/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py b/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py
index 3a1f835f..f61ea53c 100755
--- a/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py
+++ b/lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py
@@ -23,7 +23,8 @@ from Components.About import about
from Components.DreamInfoHandler import DreamInfoHandler
from Components.Language import language
from Components.AVSwitch import AVSwitch
-from Tools.Directories import pathExists, fileExists, resolveFilename, SCOPE_PLUGINS, SCOPE_SKIN_IMAGE, SCOPE_METADIR
+from Components.Network import iNetwork
+from Tools.Directories import pathExists, fileExists, resolveFilename, SCOPE_PLUGINS, SCOPE_CURRENT_PLUGIN, SCOPE_CURRENT_SKIN, SCOPE_METADIR
from Tools.LoadPixmap import LoadPixmap
from enigma import eTimer, quitMainloop, RT_HALIGN_LEFT, RT_VALIGN_CENTER, eListboxPythonMultiContent, eListbox, gFont, getDesktop, ePicLoad
from cPickle import dump, load
@@ -36,6 +37,7 @@ from twisted.internet import reactor
from ImageWizard import ImageWizard
from BackupRestore import BackupSelection, RestoreMenu, BackupScreen, RestoreScreen, getBackupPath, getBackupFilename
+from SoftwareTools import iSoftwareTools
config.plugins.configurationbackup = ConfigSubsection()
config.plugins.configurationbackup.backuplocation = ConfigText(default = '/media/hdd/', visible_width = 50, fixed_size = False)
@@ -74,30 +76,31 @@ def load_cache(cache_file):
class UpdatePluginMenu(Screen):
skin = """
- <screen name="UpdatePluginMenu" position="center,center" size="560,400" title="Software manager" >
+ <screen name="UpdatePluginMenu" position="center,center" size="610,410" title="Software management" >
<ePixmap pixmap="skin_default/buttons/red.png" position="0,0" size="140,40" alphatest="on" />
<widget source="key_red" render="Label" position="0,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" />
- <ePixmap pixmap="skin_default/border_menu_300.png" position="5,50" zPosition="1" size="300,300" transparent="1" alphatest="on" />
- <widget source="menu" render="Listbox" position="10,60" size="290,260" scrollbarMode="showOnDemand">
+ <ePixmap pixmap="skin_default/border_menu_350.png" position="5,50" zPosition="1" size="350,300" transparent="1" alphatest="on" />
+ <widget source="menu" render="Listbox" position="15,60" size="330,290" scrollbarMode="showOnDemand">
<convert type="TemplatedMultiContent">
{"template": [
- MultiContentEntryText(pos = (2, 2), size = (290, 22), flags = RT_HALIGN_LEFT, text = 1), # index 0 is the MenuText,
+ MultiContentEntryText(pos = (2, 2), size = (330, 24), flags = RT_HALIGN_LEFT, text = 1), # index 0 is the MenuText,
],
- "fonts": [gFont("Regular", 20)],
+ "fonts": [gFont("Regular", 22)],
"itemHeight": 25
}
</convert>
</widget>
- <widget source="menu" render="Listbox" position="310,50" size="240,300" scrollbarMode="showNever" selectionDisabled="1">
+ <widget source="menu" render="Listbox" position="360,50" size="240,300" scrollbarMode="showNever" selectionDisabled="1">
<convert type="TemplatedMultiContent">
{"template": [
MultiContentEntryText(pos = (2, 2), size = (240, 300), flags = RT_HALIGN_CENTER|RT_VALIGN_CENTER|RT_WRAP, text = 2), # index 2 is the Description,
],
- "fonts": [gFont("Regular", 20)],
+ "fonts": [gFont("Regular", 22)],
"itemHeight": 300
}
</convert>
</widget>
+ <widget source="status" render="Label" position="5,360" zPosition="10" size="600,50" halign="center" valign="center" font="Regular;22" transparent="1" shadowColor="black" shadowOffset="-1,-1" />
</screen>"""
def __init__(self, session, args = 0):
@@ -106,77 +109,133 @@ class UpdatePluginMenu(Screen):
self.menu = args
self.list = []
self.oktext = _("\nPress OK on your remote control to continue.")
+ self.text = ""
self.backupdirs = ' '.join( config.plugins.configurationbackup.backupdirs.value )
if self.menu == 0:
- self.list.append(("software-update", _("Software update"), _("\nOnline update of your Dreambox software." ) + self.oktext) )
- #self.list.append(("install-plugins", _("Install extensions"), _("\nInstall new Extensions or Plugins to your dreambox" ) + self.oktext) )
- self.list.append(("software-restore", _("Software restore"), _("\nRestore your Dreambox with a new firmware." ) + self.oktext))
- self.list.append(("system-backup", _("Backup system settings"), _("\nBackup your Dreambox settings." ) + self.oktext))
- self.list.append(("system-restore",_("Restore system settings"), _("\nRestore your Dreambox settings." ) + self.oktext))
- self.list.append(("ipkg-install", _("Install local extension"), _("\nScan for local packages and install them." ) + self.oktext))
+ self.list.append(("install-extensions", _("Manage extensions"), _("\nManage extensions or plugins for your Dreambox" ) + self.oktext, None))
+ self.list.append(("software-update", _("Software update"), _("\nOnline update of your Dreambox software." ) + self.oktext, None))
+ self.list.append(("software-restore", _("Software restore"), _("\nRestore your Dreambox with a new firmware." ) + self.oktext, None))
+ self.list.append(("system-backup", _("Backup system settings"), _("\nBackup your Dreambox settings." ) + self.oktext, None))
+ self.list.append(("system-restore",_("Restore system settings"), _("\nRestore your Dreambox settings." ) + self.oktext, None))
+ self.list.append(("ipkg-install", _("Install local extension"), _("\nScan for local extensions and install them." ) + self.oktext, None))
+ for p in plugins.getPlugins(PluginDescriptor.WHERE_SOFTWAREMANAGER):
+ if p.__call__.has_key("SoftwareSupported"):
+ callFnc = p.__call__["SoftwareSupported"](None)
+ if callFnc is not None:
+ if p.__call__.has_key("menuEntryName"):
+ menuEntryName = p.__call__["menuEntryName"](None)
+ else:
+ menuEntryName = _('Extended Software')
+ if p.__call__.has_key("menuEntryDescription"):
+ menuEntryDescription = p.__call__["menuEntryDescription"](None)
+ else:
+ menuEntryDescription = _('Extended Software Plugin')
+ self.list.append(('default-plugin', menuEntryName, menuEntryDescription + self.oktext, callFnc))
if config.usage.setup_level.index >= 2: # expert+
- self.list.append(("advanced", _("Advanced Options"), _("\nAdvanced options and settings." ) + self.oktext))
+ self.list.append(("advanced", _("Advanced Options"), _("\nAdvanced options and settings." ) + self.oktext, None))
elif self.menu == 1:
- self.list.append(("advancedrestore", _("Advanced restore"), _("\nRestore your backups by date." ) + self.oktext))
- self.list.append(("backuplocation", _("Choose backup location"), _("\nSelect your backup device.\nCurrent device: " ) + config.plugins.configurationbackup.backuplocation.value + self.oktext ))
- self.list.append(("backupfiles", _("Choose backup files"), _("Select files for backup. Currently selected:\n" ) + self.backupdirs + self.oktext))
- if config.usage.setup_level.index >= 2: # expert+
- self.list.append(("ipkg-manager", _("Packet management"), _("\nView, install and remove available or installed packages." ) + self.oktext))
- self.list.append(("ipkg-source",_("Choose upgrade source"), _("\nEdit the upgrade source address." ) + self.oktext))
+ self.list.append(("advancedrestore", _("Advanced restore"), _("\nRestore your backups by date." ) + self.oktext, None))
+ self.list.append(("backuplocation", _("Choose backup location"), _("\nSelect your backup device.\nCurrent device: " ) + config.plugins.configurationbackup.backuplocation.value + self.oktext, None))
+ self.list.append(("backupfiles", _("Choose backup files"), _("Select files for backup. Currently selected:\n" ) + self.backupdirs + self.oktext, None))
+ #if config.usage.setup_level.index >= 2: # expert+
+ # self.list.append(("ipkg-manager", _("Packet management"), _("\nView, install and remove available or installed packages." ) + self.oktext, None))
+ self.list.append(("ipkg-source",_("Choose upgrade source"), _("\nEdit the upgrade source address." ) + self.oktext, None))
+ for p in plugins.getPlugins(PluginDescriptor.WHERE_SOFTWAREMANAGER):
+ if p.__call__.has_key("AdvancedSoftwareSupported"):
+ callFnc = p.__call__["AdvancedSoftwareSupported"](None)
+ if callFnc is not None:
+ if p.__call__.has_key("menuEntryName"):
+ menuEntryName = p.__call__["menuEntryName"](None)
+ else:
+ menuEntryName = _('Advanced Software')
+ if p.__call__.has_key("menuEntryDescription"):
+ menuEntryDescription = p.__call__["menuEntryDescription"](None)
+ else:
+ menuEntryDescription = _('Advanced Software Plugin')
+ self.list.append(('advanced-plugin', menuEntryName, menuEntryDescription + self.oktext, callFnc))
self["menu"] = List(self.list)
self["key_red"] = StaticText(_("Close"))
+ self["status"] = StaticText("")
- self["shortcuts"] = ActionMap(["ShortcutActions", "WizardActions"],
+ self["shortcuts"] = ActionMap(["ShortcutActions", "WizardActions", "InfobarEPGActions"],
{
"ok": self.go,
"back": self.close,
"red": self.close,
}, -1)
-
self.onLayoutFinish.append(self.layoutFinished)
self.backuppath = getBackupPath()
self.backupfile = getBackupFilename()
self.fullbackupfilename = self.backuppath + "/" + self.backupfile
self.onShown.append(self.setWindowTitle)
+ #self.onClose.append(self.cleanup)
def layoutFinished(self):
idx = 0
self["menu"].index = idx
+ #self.getUpdateInfos()
def setWindowTitle(self):
- self.setTitle(_("Software manager"))
+ self.setTitle(_("Software management"))
+
+ def cleanup(self):
+ iNetwork.stopPingConsole()
+ iSoftwareTools.cleanupSoftwareTools()
+
+ def getUpdateInfos(self):
+ self.text = ""
+ if iSoftwareTools.NetworkConnectionAvailable == True:
+ if iSoftwareTools.list_updating is False:
+ if iSoftwareTools.available_updates is not 0:
+ self.text = _("There are at least ") + str(iSoftwareTools.available_updates) + _(" updates available.")
+ else:
+ self.text = "" #_("There are no updates available.")
+ else:
+ if iSoftwareTools.available_updates is not 0:
+ self.text = _("There are at least ") + str(iSoftwareTools.available_updates) + _(" updates available.")
+ else:
+ self.text = "" #_("There are no updates available.")
+ self.text += "\n" + _("A search for available updates is currently in progress.")
+ else:
+ self.text = _("No network connection available.")
+ self["status"].setText(self.text)
+
def go(self):
+ #iNetwork.stopPingConsole()
current = self["menu"].getCurrent()
if current:
- current = current[0]
+ currentEntry = current[0]
if self.menu == 0:
- if (current == "software-update"):
+ if (currentEntry == "software-update"):
self.session.openWithCallback(self.runUpgrade, MessageBox, _("Do you want to update your Dreambox?")+"\n"+_("\nAfter pressing OK, please wait!"))
- elif (current == "software-restore"):
+ elif (currentEntry == "software-restore"):
self.session.open(ImageWizard)
- elif (current == "install-plugins"):
+ elif (currentEntry == "install-extensions"):
self.session.open(PluginManager, self.skin_path)
- elif (current == "system-backup"):
+ elif (currentEntry == "system-backup"):
self.session.openWithCallback(self.backupDone,BackupScreen, runBackup = True)
- elif (current == "system-restore"):
+ elif (currentEntry == "system-restore"):
if os_path.exists(self.fullbackupfilename):
self.session.openWithCallback(self.startRestore, MessageBox, _("Are you sure you want to restore your Enigma2 backup?\nEnigma2 will restart after the restore"))
else:
self.session.open(MessageBox, _("Sorry no backups found!"), MessageBox.TYPE_INFO, timeout = 10)
- elif (current == "ipkg-install"):
+ elif (currentEntry == "ipkg-install"):
try:
from Plugins.Extensions.MediaScanner.plugin import main
main(self.session)
except:
self.session.open(MessageBox, _("Sorry MediaScanner is not installed!"), MessageBox.TYPE_INFO, timeout = 10)
- elif (current == "advanced"):
+ elif (currentEntry == "default-plugin"):
+ self.extended = current[3]
+ self.extended(self.session, None)
+ elif (currentEntry == "advanced"):
self.session.open(UpdatePluginMenu, 1)
elif self.menu == 1:
- if (current == "ipkg-manager"):
+ if (currentEntry == "ipkg-manager"):
self.session.open(PacketManager, self.skin_path)
- elif (current == "backuplocation"):
+ elif (currentEntry == "backuplocation"):
parts = [ (r.description, r.mountpoint, self.session) for r in harddiskmanager.getMountedPartitions(onlyhotplug = False)]
for x in parts:
if not access(x[1], F_OK|R_OK|W_OK) or x[1] == '/':
@@ -186,12 +245,15 @@ class UpdatePluginMenu(Screen):
parts.remove(x)
if len(parts):
self.session.openWithCallback(self.backuplocation_choosen, ChoiceBox, title = _("Please select medium to use as backup location"), list = parts)
- elif (current == "backupfiles"):
+ elif (currentEntry == "backupfiles"):
self.session.openWithCallback(self.backupfiles_choosen,BackupSelection)
- elif (current == "advancedrestore"):
+ elif (currentEntry == "advancedrestore"):
self.session.open(RestoreMenu, self.skin_path)
- elif (current == "ipkg-source"):
+ elif (currentEntry == "ipkg-source"):
self.session.open(IPKGMenu, self.skin_path)
+ elif (currentEntry == "advanced-plugin"):
+ self.extended = current[3]
+ self.extended(self.session, None)
def backupfiles_choosen(self, ret):
self.backupdirs = ' '.join( config.plugins.configurationbackup.backupdirs.value )
@@ -228,433 +290,11 @@ class UpdatePluginMenu(Screen):
self.exe = True
self.session.open(RestoreScreen, runRestore = True)
-class IPKGMenu(Screen):
- skin = """
- <screen name="IPKGMenu" position="center,center" size="560,400" title="Select upgrade source to edit." >
- <ePixmap pixmap="skin_default/buttons/red.png" position="0,0" size="140,40" alphatest="on" />
- <ePixmap pixmap="skin_default/buttons/green.png" position="140,0" size="140,40" alphatest="on" />
- <widget source="key_red" render="Label" position="0,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" />
- <widget source="key_green" render="Label" position="140,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" transparent="1" />
- <widget name="filelist" position="5,50" size="550,340" scrollbarMode="showOnDemand" />
- </screen>"""
-
- def __init__(self, session, plugin_path):
- Screen.__init__(self, session)
- self.skin_path = plugin_path
-
- self["key_red"] = StaticText(_("Close"))
- self["key_green"] = StaticText(_("Edit"))
-
- self.sel = []
- self.val = []
- self.entry = False
- self.exe = False
-
- self.path = ""
-
- self["actions"] = NumberActionMap(["SetupActions"],
- {
- "ok": self.KeyOk,
- "cancel": self.keyCancel
- }, -1)
-
- self["shortcuts"] = ActionMap(["ShortcutActions"],
- {
- "red": self.keyCancel,
- "green": self.KeyOk,
- })
- self.flist = []
- self["filelist"] = MenuList(self.flist)
- self.fill_list()
- self.onLayoutFinish.append(self.layoutFinished)
-
- def layoutFinished(self):
- self.setWindowTitle()
-
- def setWindowTitle(self):
- self.setTitle(_("Select upgrade source to edit."))
-
- def fill_list(self):
- self.flist = []
- self.path = '/etc/ipkg/'
- if (os_path.exists(self.path) == False):
- self.entry = False
- return
- for file in listdir(self.path):
- if (file.endswith(".conf")):
- if file != 'arch.conf':
- self.flist.append((file))
- self.entry = True
- self["filelist"].l.setList(self.flist)
-
- def KeyOk(self):
- if (self.exe == False) and (self.entry == True):
- self.sel = self["filelist"].getCurrent()
- self.val = self.path + self.sel
- self.session.open(IPKGSource, self.val)
-
- def keyCancel(self):
- self.close()
-
- def Exit(self):
- self.close()
-
-
-class IPKGSource(Screen):
- skin = """
- <screen name="IPKGSource" position="center,center" size="560,80" title="Edit upgrade source url." >
- <ePixmap pixmap="skin_default/buttons/red.png" position="0,0" size="140,40" alphatest="on" />
- <ePixmap pixmap="skin_default/buttons/green.png" position="140,0" size="140,40" alphatest="on" />
- <widget source="key_red" render="Label" position="0,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" />
- <widget source="key_green" render="Label" position="140,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" transparent="1" />
- <widget name="text" position="5,50" size="550,25" font="Regular;20" backgroundColor="background" foregroundColor="#cccccc" />
- </screen>"""
-
- def __init__(self, session, configfile = None):
- Screen.__init__(self, session)
- self.session = session
- self.configfile = configfile
- text = ""
- if self.configfile:
- try:
- fp = file(configfile, 'r')
- sources = fp.readlines()
- if sources:
- text = sources[0]
- fp.close()
- except IOError:
- pass
-
- desk = getDesktop(0)
- x= int(desk.size().width())
- y= int(desk.size().height())
-
- self["key_red"] = StaticText(_("Cancel"))
- self["key_green"] = StaticText(_("Save"))
-
- if (y>=720):
- self["text"] = Input(text, maxSize=False, type=Input.TEXT)
- else:
- self["text"] = Input(text, maxSize=False, visible_width = 55, type=Input.TEXT)
-
- self["actions"] = NumberActionMap(["WizardActions", "InputActions", "TextEntryActions", "KeyboardInputActions","ShortcutActions"],
- {
- "ok": self.go,
- "back": self.close,
- "red": self.close,
- "green": self.go,
- "left": self.keyLeft,
- "right": self.keyRight,
- "home": self.keyHome,
- "end": self.keyEnd,
- "deleteForward": self.keyDeleteForward,
- "deleteBackward": self.keyDeleteBackward,
- "1": self.keyNumberGlobal,
- "2": self.keyNumberGlobal,
- "3": self.keyNumberGlobal,
- "4": self.keyNumberGlobal,
- "5": self.keyNumberGlobal,
- "6": self.keyNumberGlobal,
- "7": self.keyNumberGlobal,
- "8": self.keyNumberGlobal,
- "9": self.keyNumberGlobal,
- "0": self.keyNumberGlobal
- }, -1)
-
- self.onLayoutFinish.append(self.layoutFinished)
-
- def layoutFinished(self):
- self.setWindowTitle()
- self["text"].right()
-
- def setWindowTitle(self):
- self.setTitle(_("Edit upgrade source url."))
-
- def go(self):
- text = self["text"].getText()
- if text:
- fp = file(self.configfile, 'w')
- fp.write(text)
- fp.write("\n")
- fp.close()
- self.close()
-
- def keyLeft(self):
- self["text"].left()
-
- def keyRight(self):
- self["text"].right()
-
- def keyHome(self):
- self["text"].home()
-
- def keyEnd(self):
- self["text"].end()
-
- def keyDeleteForward(self):
- self["text"].delete()
-
- def keyDeleteBackward(self):
- self["text"].deleteBackward()
-
- def keyNumberGlobal(self, number):
- self["text"].number(number)
-
-
-class PacketManager(Screen):
- skin = """
- <screen name="PacketManager" position="center,center" size="530,420" title="Packet manager" >
- <ePixmap pixmap="skin_default/buttons/red.png" position="0,0" size="140,40" alphatest="on" />
- <ePixmap pixmap="skin_default/buttons/green.png" position="140,0" size="140,40" alphatest="on" />
- <widget source="key_red" render="Label" position="0,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" />
- <widget source="key_green" render="Label" position="140,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" transparent="1" />
- <widget source="list" render="Listbox" position="5,50" size="520,365" scrollbarMode="showOnDemand">
- <convert type="TemplatedMultiContent">
- {"template": [
- MultiContentEntryText(pos = (5, 1), size = (440, 28), font=0, flags = RT_HALIGN_LEFT, text = 0), # index 0 is the name
- MultiContentEntryText(pos = (5, 26), size = (440, 20), font=1, flags = RT_HALIGN_LEFT, text = 2), # index 2 is the description
- MultiContentEntryPixmapAlphaTest(pos = (445, 2), size = (48, 48), png = 4), # index 4 is the status pixmap
- MultiContentEntryPixmapAlphaTest(pos = (5, 50), size = (510, 2), png = 5), # index 4 is the div pixmap
- ],
- "fonts": [gFont("Regular", 22),gFont("Regular", 14)],
- "itemHeight": 52
- }
- </convert>
- </widget>
- </screen>"""
-
- def __init__(self, session, plugin_path, args = None):
- Screen.__init__(self, session)
- self.session = session
- self.skin_path = plugin_path
-
- self["shortcuts"] = ActionMap(["ShortcutActions", "WizardActions"],
- {
- "ok": self.go,
- "back": self.exit,
- "red": self.exit,
- "green": self.reload,
- }, -1)
-
- self.list = []
- self.statuslist = []
- self["list"] = List(self.list)
- self["key_red"] = StaticText(_("Close"))
- self["key_green"] = StaticText(_("Reload"))
-
- self.list_updating = True
- self.packetlist = []
- self.installed_packetlist = {}
- self.Console = Console()
- self.cmdList = []
- self.cachelist = []
- self.cache_ttl = 86400 #600 is default, 0 disables, Seconds cache is considered valid (24h should be ok for caching ipkgs)
- self.cache_file = '/usr/lib/enigma2/python/Plugins/SystemPlugins/SoftwareManager/packetmanager.cache' #Path to cache directory
- self.oktext = _("\nAfter pressing OK, please wait!")
- self.unwanted_extensions = ('-dbg', '-dev', '-doc', 'busybox')
-
- self.ipkg = IpkgComponent()
- self.ipkg.addCallback(self.ipkgCallback)
- self.onShown.append(self.setWindowTitle)
- self.onLayoutFinish.append(self.rebuildList)
-
- def exit(self):
- self.ipkg.stop()
- if self.Console is not None:
- if len(self.Console.appContainers):
- for name in self.Console.appContainers.keys():
- self.Console.kill(name)
- self.close()
-
- def reload(self):
- if (os_path.exists(self.cache_file) == True):
- remove(self.cache_file)
- self.list_updating = True
- self.rebuildList()
-
- def setWindowTitle(self):
- self.setTitle(_("Packet manager"))
-
- def setStatus(self,status = None):
- if status:
- self.statuslist = []
- divpng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_SKIN_IMAGE, "skin_default/div-h.png"))
- if status == 'update':
- statuspng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_PLUGINS, "SystemPlugins/SoftwareManager/upgrade.png"))
- self.statuslist.append(( _("Package list update"), '', _("Trying to download a new packetlist. Please wait..." ),'',statuspng, divpng ))
- self['list'].setList(self.statuslist)
- elif status == 'error':
- statuspng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_PLUGINS, "SystemPlugins/SoftwareManager/remove.png"))
- self.statuslist.append(( _("Error"), '', _("There was an error downloading the packetlist. Please try again." ),'',statuspng, divpng ))
- self['list'].setList(self.statuslist)
-
- def rebuildList(self):
- self.setStatus('update')
- self.inv_cache = 0
- self.vc = valid_cache(self.cache_file, self.cache_ttl)
- if self.cache_ttl > 0 and self.vc != 0:
- try:
- self.buildPacketList()
- except:
- self.inv_cache = 1
- if self.cache_ttl == 0 or self.inv_cache == 1 or self.vc == 0:
- self.run = 0
- self.ipkg.startCmd(IpkgComponent.CMD_UPDATE)
-
- def go(self, returnValue = None):
- cur = self["list"].getCurrent()
- if cur:
- status = cur[3]
- package = cur[0]
- self.cmdList = []
- if status == 'installed':
- self.cmdList.append((IpkgComponent.CMD_REMOVE, { "package": package }))
- if len(self.cmdList):
- self.session.openWithCallback(self.runRemove, MessageBox, _("Do you want to remove the package:\n") + package + "\n" + self.oktext)
- elif status == 'upgradeable':
- self.cmdList.append((IpkgComponent.CMD_INSTALL, { "package": package }))
- if len(self.cmdList):
- self.session.openWithCallback(self.runUpgrade, MessageBox, _("Do you want to upgrade the package:\n") + package + "\n" + self.oktext)
- elif status == "installable":
- self.cmdList.append((IpkgComponent.CMD_INSTALL, { "package": package }))
- if len(self.cmdList):
- self.session.openWithCallback(self.runUpgrade, MessageBox, _("Do you want to install the package:\n") + package + "\n" + self.oktext)
-
- def runRemove(self, result):
- if result:
- self.session.openWithCallback(self.runRemoveFinished, Ipkg, cmdList = self.cmdList)
-
- def runRemoveFinished(self):
- self.session.openWithCallback(self.RemoveReboot, MessageBox, _("Remove finished.") +" "+_("Do you want to reboot your Dreambox?"), MessageBox.TYPE_YESNO)
-
- def RemoveReboot(self, result):
- if result is None:
- return
- if result is False:
- cur = self["list"].getCurrent()
- if cur:
- item = self['list'].getIndex()
- self.list[item] = self.buildEntryComponent(cur[0], cur[1], cur[2], 'installable')
- self.cachelist[item] = [cur[0], cur[1], cur[2], 'installable']
- self['list'].setList(self.list)
- write_cache(self.cache_file, self.cachelist)
- self.reloadPluginlist()
- if result:
- quitMainloop(3)
-
- def runUpgrade(self, result):
- if result:
- self.session.openWithCallback(self.runUpgradeFinished, Ipkg, cmdList = self.cmdList)
-
- def runUpgradeFinished(self):
- self.session.openWithCallback(self.UpgradeReboot, MessageBox, _("Upgrade finished.") +" "+_("Do you want to reboot your Dreambox?"), MessageBox.TYPE_YESNO)
-
- def UpgradeReboot(self, result):
- if result is None:
- return
- if result is False:
- cur = self["list"].getCurrent()
- if cur:
- item = self['list'].getIndex()
- self.list[item] = self.buildEntryComponent(cur[0], cur[1], cur[2], 'installed')
- self.cachelist[item] = [cur[0], cur[1], cur[2], 'installed']
- self['list'].setList(self.list)
- write_cache(self.cache_file, self.cachelist)
- self.reloadPluginlist()
- if result:
- quitMainloop(3)
-
- def ipkgCallback(self, event, param):
- if event == IpkgComponent.EVENT_ERROR:
- self.list_updating = False
- self.setStatus('error')
- elif event == IpkgComponent.EVENT_DONE:
- if self.list_updating:
- self.list_updating = False
- if not self.Console:
- self.Console = Console()
- cmd = "ipkg list"
- self.Console.ePopen(cmd, self.IpkgList_Finished)
- #print event, "-", param
- pass
-
- def IpkgList_Finished(self, result, retval, extra_args = None):
- if len(result):
- self.packetlist = []
- for x in result.splitlines():
- split = x.split(' - ') #self.blacklisted_packages
- if not any(split[0].strip().endswith(x) for x in self.unwanted_extensions):
- self.packetlist.append([split[0].strip(), split[1].strip(),split[2].strip()])
- if not self.Console:
- self.Console = Console()
- cmd = "ipkg list_installed"
- self.Console.ePopen(cmd, self.IpkgListInstalled_Finished)
-
- def IpkgListInstalled_Finished(self, result, retval, extra_args = None):
- if len(result):
- self.installed_packetlist = {}
- for x in result.splitlines():
- split = x.split(' - ')
- if not any(split[0].strip().endswith(x) for x in self.unwanted_extensions):
- self.installed_packetlist[split[0].strip()] = split[1].strip()
- self.buildPacketList()
-
- def buildEntryComponent(self, name, version, description, state):
- divpng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_SKIN_IMAGE, "skin_default/div-h.png"))
- if state == 'installed':
- installedpng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_PLUGINS, "SystemPlugins/SoftwareManager/installed.png"))
- return((name, version, description, state, installedpng, divpng))
- elif state == 'upgradeable':
- upgradeablepng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_PLUGINS, "SystemPlugins/SoftwareManager/upgradeable.png"))
- return((name, version, description, state, upgradeablepng, divpng))
- else:
- installablepng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_PLUGINS, "SystemPlugins/SoftwareManager/installable.png"))
- return((name, version, description, state, installablepng, divpng))
-
- def buildPacketList(self):
- self.list = []
- self.cachelist = []
-
- if self.cache_ttl > 0 and self.vc != 0:
- print 'Loading packagelist cache from ',self.cache_file
- try:
- self.cachelist = load_cache(self.cache_file)
- if len(self.cachelist) > 0:
- for x in self.cachelist:
- self.list.append(self.buildEntryComponent(x[0], x[1], x[2], x[3]))
- self['list'].setList(self.list)
- except:
- self.inv_cache = 1
-
- if self.cache_ttl == 0 or self.inv_cache == 1 or self.vc == 0:
- print 'rebuilding fresh package list'
- for x in self.packetlist:
- status = ""
- if self.installed_packetlist.has_key(x[0].strip()):
- if self.installed_packetlist[x[0].strip()] == x[1].strip():
- status = "installed"
- self.list.append(self.buildEntryComponent(x[0].strip(), x[1].strip(), x[2].strip(), status))
- else:
- status = "upgradeable"
- self.list.append(self.buildEntryComponent(x[0].strip(), x[1].strip(), x[2].strip(), status))
- else:
- status = "installable"
- self.list.append(self.buildEntryComponent(x[0].strip(), x[1].strip(), x[2].strip(), status))
- if not any(x[0].strip().endswith(x) for x in self.unwanted_extensions):
- self.cachelist.append([x[0].strip(), x[1].strip(), x[2].strip(), status])
- write_cache(self.cache_file, self.cachelist)
- self['list'].setList(self.list)
-
- def reloadPluginlist(self):
- plugins.readPluginList(resolveFilename(SCOPE_PLUGINS))
-
class PluginManager(Screen, DreamInfoHandler):
- lastDownloadDate = None
-
skin = """
- <screen name="PluginManager" position="center,center" size="560,440" title="Plugin manager" >
+ <screen name="PluginManager" position="center,center" size="560,440" title="Extensions management" >
<ePixmap pixmap="skin_default/buttons/red.png" position="0,0" size="140,40" alphatest="on" />
<ePixmap pixmap="skin_default/buttons/green.png" position="140,0" size="140,40" alphatest="on" />
<ePixmap pixmap="skin_default/buttons/yellow.png" position="280,0" size="140,40" alphatest="on" />
@@ -668,17 +308,17 @@ class PluginManager(Screen, DreamInfoHandler):
{"templates":
{"default": (51,[
MultiContentEntryText(pos = (30, 1), size = (470, 24), font=0, flags = RT_HALIGN_LEFT, text = 0), # index 0 is the name
- MultiContentEntryText(pos = (30, 25), size = (470, 20), font=1, flags = RT_HALIGN_LEFT, text = 2), # index 2 is the description
+ MultiContentEntryText(pos = (30, 25), size = (470, 24), font=1, flags = RT_HALIGN_LEFT, text = 2), # index 2 is the description
MultiContentEntryPixmapAlphaTest(pos = (475, 0), size = (48, 48), png = 5), # index 5 is the status pixmap
MultiContentEntryPixmapAlphaTest(pos = (0, 49), size = (550, 2), png = 6), # index 6 is the div pixmap
]),
"category": (40,[
MultiContentEntryText(pos = (30, 0), size = (500, 22), font=0, flags = RT_HALIGN_LEFT, text = 0), # index 0 is the name
- MultiContentEntryText(pos = (30, 22), size = (500, 16), font=1, flags = RT_HALIGN_LEFT, text = 1), # index 1 is the description
+ MultiContentEntryText(pos = (30, 22), size = (500, 16), font=2, flags = RT_HALIGN_LEFT, text = 1), # index 1 is the description
MultiContentEntryPixmapAlphaTest(pos = (0, 38), size = (550, 2), png = 3), # index 3 is the div pixmap
])
},
- "fonts": [gFont("Regular", 22),gFont("Regular", 16)],
+ "fonts": [gFont("Regular", 22),gFont("Regular", 20),gFont("Regular", 16)],
"itemHeight": 52
}
</convert>
@@ -690,15 +330,6 @@ class PluginManager(Screen, DreamInfoHandler):
Screen.__init__(self, session)
self.session = session
self.skin_path = plugin_path
- aboutInfo = about.getImageVersionString()
- if aboutInfo.startswith("dev-"):
- self.ImageVersion = 'Experimental'
- else:
- self.ImageVersion = 'Stable'
- self.language = language.getLanguage()[:2] # getLanguage returns e.g. "fi_FI" for "language_country"
-
- DreamInfoHandler.__init__(self, self.statusCallback, blocking = False, neededTag = 'ALL_TAGS', neededFlag = self.ImageVersion, language = self.language)
- self.directory = resolveFilename(SCOPE_METADIR)
self["shortcuts"] = ActionMap(["ShortcutActions", "WizardActions", "InfobarEPGActions", "HelpActions" ],
{
@@ -715,6 +346,7 @@ class PluginManager(Screen, DreamInfoHandler):
self.statuslist = []
self.selectedFiles = []
self.categoryList = []
+ self.packetlist = []
self["list"] = List(self.list)
self["key_red"] = StaticText(_("Close"))
self["key_green"] = StaticText("")
@@ -722,30 +354,22 @@ class PluginManager(Screen, DreamInfoHandler):
self["key_blue"] = StaticText("")
self["status"] = StaticText("")
- self.list_updating = True
- self.packetlist = []
- self.installed_packetlist = {}
- self.available_packetlist = []
- self.available_updates = 0
- self.Console = Console()
self.cmdList = []
self.oktext = _("\nAfter pressing OK, please wait!")
- self.unwanted_extensions = ('-dbg', '-dev', '-doc')
-
- self.ipkg = IpkgComponent()
- self.ipkg.addCallback(self.ipkgCallback)
if not self.selectionChanged in self["list"].onSelectionChanged:
self["list"].onSelectionChanged.append(self.selectionChanged)
self.currList = ""
self.currentSelectedTag = None
self.currentSelectedIndex = None
-
+ self.currentSelectedPackage = None
+ self.saved_currentSelectedPackage = None
+
self.onShown.append(self.setWindowTitle)
- self.onLayoutFinish.append(self.rebuildList)
+ self.onLayoutFinish.append(self.getUpdateInfos)
def setWindowTitle(self):
- self.setTitle(_("Plugin manager"))
+ self.setTitle(_("Extensions management"))
def exit(self):
if self.currList == "packages":
@@ -757,11 +381,7 @@ class PluginManager(Screen, DreamInfoHandler):
self["list"].updateList(self.categoryList)
self.selectionChanged()
else:
- self.ipkg.stop()
- if self.Console is not None:
- if len(self.Console.appContainers):
- for name in self.Console.appContainers.keys():
- self.Console.kill(name)
+ iSoftwareTools.cleanupSoftwareTools()
self.prepareInstall()
if len(self.cmdList):
self.session.openWithCallback(self.runExecute, PluginManagerInfo, self.skin_path, self.cmdList)
@@ -779,25 +399,43 @@ class PluginManager(Screen, DreamInfoHandler):
self["key_green"].setText("")
self["key_blue"].setText("")
self["key_yellow"].setText("")
- divpng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_SKIN_IMAGE, "skin_default/div-h.png"))
+ divpng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/div-h.png"))
if status == 'update':
- statuspng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_PLUGINS, "SystemPlugins/SoftwareManager/upgrade.png"))
- self.statuslist.append(( _("Package list update"), '', _("Trying to download a new packetlist. Please wait..." ),'', '', statuspng, divpng, None, '' ))
+ statuspng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_PLUGIN, "SystemPlugins/SoftwareManager/upgrade.png"))
+ self.statuslist.append(( _("Updating software catalog"), '', _("Searching for available updates. Please wait..." ),'', '', statuspng, divpng, None, '' ))
self["list"].style = "default"
self['list'].setList(self.statuslist)
elif status == 'sync':
- statuspng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_PLUGINS, "SystemPlugins/SoftwareManager/upgrade.png"))
+ statuspng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_PLUGIN, "SystemPlugins/SoftwareManager/upgrade.png"))
self.statuslist.append(( _("Package list update"), '', _("Searching for new installed or removed packages. Please wait..." ),'', '', statuspng, divpng, None, '' ))
self["list"].style = "default"
self['list'].setList(self.statuslist)
elif status == 'error':
- statuspng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_PLUGINS, "SystemPlugins/SoftwareManager/remove.png"))
+ statuspng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_PLUGIN, "SystemPlugins/SoftwareManager/remove.png"))
self.statuslist.append(( _("Error"), '', _("There was an error downloading the packetlist. Please try again." ),'', '', statuspng, divpng, None, '' ))
self["list"].style = "default"
self['list'].setList(self.statuslist)
- def statusCallback(self, status, progress):
- pass
+ def getUpdateInfos(self):
+ self.setState('update')
+ iSoftwareTools.getUpdates(self.getUpdateInfosCB)
+
+ def getUpdateInfosCB(self, retval = None):
+ if retval is not None:
+ if retval is True:
+ if iSoftwareTools.available_updates is not 0:
+ self["status"].setText(_("There are at least ") + str(iSoftwareTools.available_updates) + _(" updates available."))
+ else:
+ self["status"].setText(_("There are no updates available."))
+ elif retval is False:
+ self["status"].setText(_("No network connection available."))
+ self.rebuildList()
+
+ def rebuildList(self, retval = None):
+ if self.currentSelectedTag is None:
+ self.buildCategoryList()
+ else:
+ self.buildPacketList(self.currentSelectedTag)
def selectionChanged(self):
current = self["list"].getCurrent()
@@ -806,34 +444,34 @@ class PluginManager(Screen, DreamInfoHandler):
if self.currList == "packages":
self["key_red"].setText(_("Back"))
if current[4] == 'installed':
- self["key_green"].setText(_("Remove"))
+ self["key_green"].setText(_("Uninstall"))
elif current[4] == 'installable':
self["key_green"].setText(_("Install"))
elif current[4] == 'remove':
- self["key_green"].setText(_("Undo\nRemove"))
+ self["key_green"].setText(_("Undo uninstall"))
elif current[4] == 'install':
- self["key_green"].setText(_("Undo\nInstall"))
+ self["key_green"].setText(_("Undo install"))
self["key_yellow"].setText(_("View details"))
self["key_blue"].setText("")
- if len(self.selectedFiles) == 0 and self.available_updates is not 0:
- self["status"].setText(_("There are at least ") + str(self.available_updates) + _(" updates available."))
+ if len(self.selectedFiles) == 0 and iSoftwareTools.available_updates is not 0:
+ self["status"].setText(_("There are at least ") + str(iSoftwareTools.available_updates) + _(" updates available."))
elif len(self.selectedFiles) is not 0:
self["status"].setText(str(len(self.selectedFiles)) + _(" packages selected."))
else:
- self["status"].setText(_("There is nothing to be done."))
+ self["status"].setText(_("There are currently no outstanding actions."))
elif self.currList == "category":
self["key_red"].setText(_("Close"))
self["key_green"].setText("")
self["key_yellow"].setText("")
self["key_blue"].setText("")
- if len(self.selectedFiles) == 0 and self.available_updates is not 0:
- self["status"].setText(_("There are at least ") + str(self.available_updates) + _(" updates available."))
+ if len(self.selectedFiles) == 0 and iSoftwareTools.available_updates is not 0:
+ self["status"].setText(_("There are at least ") + str(iSoftwareTools.available_updates) + _(" updates available."))
self["key_yellow"].setText(_("Update"))
elif len(self.selectedFiles) is not 0:
self["status"].setText(str(len(self.selectedFiles)) + _(" packages selected."))
self["key_yellow"].setText(_("Process"))
else:
- self["status"].setText(_("There is nothing to be done."))
+ self["status"].setText(_("There are currently no outstanding actions."))
def getSelectionState(self, detailsFile):
for entry in self.selectedFiles:
@@ -841,82 +479,6 @@ class PluginManager(Screen, DreamInfoHandler):
return True
return False
- def rebuildList(self):
- self.setState('update')
- if not PluginManager.lastDownloadDate or (time() - PluginManager.lastDownloadDate) > 3600:
- # Only update from internet once per hour
- PluginManager.lastDownloadDate = time()
- print "last update time > 1h"
- self.ipkg.startCmd(IpkgComponent.CMD_UPDATE)
- else:
- print "last update time < 1h"
- self.startIpkgList()
-
- def ipkgCallback(self, event, param):
- if event == IpkgComponent.EVENT_ERROR:
- self.list_updating = False
- self.setState('error')
- elif event == IpkgComponent.EVENT_DONE:
- self.startIpkgList()
- pass
-
- def startIpkgList(self):
- if self.list_updating:
- if not self.Console:
- self.Console = Console()
- cmd = "ipkg list"
- self.Console.ePopen(cmd, self.IpkgList_Finished)
-
- def IpkgList_Finished(self, result, retval, extra_args = None):
- if len(result):
- self.available_packetlist = []
- for x in result.splitlines():
- split = x.split(' - ')
- if not any(split[0].strip().endswith(x) for x in self.unwanted_extensions):
- self.available_packetlist.append([split[0].strip(), split[1].strip(), split[2].strip()])
- self.startInstallMetaPackage()
-
- def startInstallMetaPackage(self):
- if self.list_updating:
- self.list_updating = False
- if not self.Console:
- self.Console = Console()
- cmd = "ipkg install enigma2-meta" #dummy,will change probably"
- self.Console.ePopen(cmd, self.InstallMetaPackage_Finished)
-
- def InstallMetaPackage_Finished(self, result, retval, extra_args = None):
- if len(result):
- self.fillPackagesIndexList()
- if not self.Console:
- self.Console = Console()
- self.setState('sync')
- cmd = "ipkg list_installed"
- self.Console.ePopen(cmd, self.IpkgListInstalled_Finished)
-
- def IpkgListInstalled_Finished(self, result, retval, extra_args = None):
- if len(result):
- self.installed_packetlist = {}
- for x in result.splitlines():
- split = x.split(' - ')
- if not any(split[0].strip().endswith(x) for x in self.unwanted_extensions):
- self.installed_packetlist[split[0].strip()] = split[1].strip()
- self.countUpdates()
- if self.currentSelectedTag is None:
- self.buildCategoryList()
- else:
- self.buildPacketList(self.currentSelectedTag)
-
- def countUpdates(self):
- self.available_updates = 0
- for package in self.packagesIndexlist[:]:
- attributes = package[0]["attributes"]
- packagename = attributes["packagename"]
- for x in self.available_packetlist:
- if x[0].strip() == packagename:
- if self.installed_packetlist.has_key(packagename):
- if self.installed_packetlist[packagename] != x[1].strip():
- self.available_updates +=1
-
def handleCurrent(self):
current = self["list"].getCurrent()
if current:
@@ -939,6 +501,7 @@ class PluginManager(Screen, DreamInfoHandler):
alreadyinList = True
if not alreadyinList:
self.selectedFiles.append((detailsFile,current[4],current[3]))
+ self.currentSelectedPackage = ((detailsFile,current[4],current[3]))
if current[4] == 'installed':
self.list[idx] = self.buildEntryComponent(current[0], current[1], current[2], current[3], 'remove', True)
elif current[4] == 'installable':
@@ -957,8 +520,9 @@ class PluginManager(Screen, DreamInfoHandler):
if current:
if self.currList == "packages":
if current[7] is not '':
- detailsfile = self.directory[0] + "/" + current[1]
+ detailsfile = iSoftwareTools.directory[0] + "/" + current[1]
if (os_path.exists(detailsfile) == True):
+ self.saved_currentSelectedPackage = self.currentSelectedPackage
self.session.openWithCallback(self.detailsClosed, PluginDetails, self.skin_path, current)
else:
self.session.open(MessageBox, _("Sorry, no Details available!"), MessageBox.TYPE_INFO, timeout = 10)
@@ -967,29 +531,29 @@ class PluginManager(Screen, DreamInfoHandler):
if len(self.cmdList):
self.session.openWithCallback(self.runExecute, PluginManagerInfo, self.skin_path, self.cmdList)
- def detailsClosed(self, result):
- if result:
- if not self.Console:
- self.Console = Console()
- self.setState('sync')
- PluginManager.lastDownloadDate = time()
- self.selectedFiles = []
- cmd = "ipkg update"
- self.Console.ePopen(cmd, self.InstallMetaPackage_Finished)
+ def detailsClosed(self, result = None):
+ if result is not None:
+ if result is not False:
+ self.setState('sync')
+ iSoftwareTools.lastDownloadDate = time()
+ for entry in self.selectedFiles:
+ if entry == self.saved_currentSelectedPackage:
+ self.selectedFiles.remove(entry)
+ iSoftwareTools.startIpkgListInstalled(self.rebuildList)
def buildEntryComponent(self, name, details, description, packagename, state, selected = False):
- divpng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_SKIN_IMAGE, "skin_default/div-h.png"))
+ divpng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/div-h.png"))
+ installedpng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_PLUGIN, "SystemPlugins/SoftwareManager/installed.png"))
+ installablepng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_PLUGIN, "SystemPlugins/SoftwareManager/installable.png"))
+ removepng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_PLUGIN, "SystemPlugins/SoftwareManager/remove.png"))
+ installpng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_PLUGIN, "SystemPlugins/SoftwareManager/install.png"))
if state == 'installed':
- installedpng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_PLUGINS, "SystemPlugins/SoftwareManager/installed.png"))
return((name, details, description, packagename, state, installedpng, divpng, selected))
elif state == 'installable':
- installablepng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_PLUGINS, "SystemPlugins/SoftwareManager/installable.png"))
return((name, details, description, packagename, state, installablepng, divpng, selected))
elif state == 'remove':
- removepng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_PLUGINS, "SystemPlugins/SoftwareManager/remove.png"))
return((name, details, description, packagename, state, removepng, divpng, selected))
elif state == 'install':
- installpng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_PLUGINS, "SystemPlugins/SoftwareManager/install.png"))
return((name, details, description, packagename, state, installpng, divpng, selected))
def buildPacketList(self, categorytag = None):
@@ -997,7 +561,7 @@ class PluginManager(Screen, DreamInfoHandler):
self.currList = "packages"
self.currentSelectedTag = categorytag
self.packetlist = []
- for package in self.packagesIndexlist[:]:
+ for package in iSoftwareTools.packagesIndexlist[:]:
prerequisites = package[0]["prerequisites"]
if prerequisites.has_key("tag"):
for foundtag in prerequisites["tag"]:
@@ -1012,19 +576,23 @@ class PluginManager(Screen, DreamInfoHandler):
self.list = []
for x in self.packetlist:
status = ""
- selectState = self.getSelectionState(x[1].strip())
- if self.installed_packetlist.has_key(x[3].strip()):
+ name = x[0].strip()
+ details = x[1].strip()
+ description = x[2].strip()
+ packagename = x[3].strip()
+ selectState = self.getSelectionState(details)
+ if iSoftwareTools.installed_packetlist.has_key(packagename):
if selectState == True:
status = "remove"
else:
status = "installed"
- self.list.append(self.buildEntryComponent(x[0].strip(), x[1].strip(), x[2].strip(), x[3].strip(), status, selected = selectState))
+ self.list.append(self.buildEntryComponent(name, details, description, packagename, status, selected = selectState))
else:
if selectState == True:
status = "install"
else:
status = "installable"
- self.list.append(self.buildEntryComponent(x[0].strip(), x[1].strip(), x[2].strip(), x[3].strip(), status, selected = selectState))
+ self.list.append(self.buildEntryComponent(name, details, description, packagename, status, selected = selectState))
if len(self.list):
self.list.sort(key=lambda x: x[0])
self["list"].style = "default"
@@ -1036,7 +604,7 @@ class PluginManager(Screen, DreamInfoHandler):
self.currList = "category"
self.categories = []
self.categoryList = []
- for package in self.packagesIndexlist[:]:
+ for package in iSoftwareTools.packagesIndexlist[:]:
prerequisites = package[0]["prerequisites"]
if prerequisites.has_key("tag"):
for foundtag in prerequisites["tag"]:
@@ -1051,7 +619,7 @@ class PluginManager(Screen, DreamInfoHandler):
self.selectionChanged()
def buildCategoryComponent(self, tag = None):
- divpng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_SKIN_IMAGE, "skin_default/div-h.png"))
+ divpng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/div-h.png"))
if tag is not None:
if tag == 'System':
return(( _("System"), _("View list of available system extensions" ), tag, divpng ))
@@ -1082,14 +650,14 @@ class PluginManager(Screen, DreamInfoHandler):
def prepareInstall(self):
self.cmdList = []
- if self.available_updates > 0:
+ if iSoftwareTools.available_updates > 0:
self.cmdList.append((IpkgComponent.CMD_UPGRADE, { "test_only": False }))
if self.selectedFiles and len(self.selectedFiles):
for plugin in self.selectedFiles:
- detailsfile = self.directory[0] + "/" + plugin[0]
+ detailsfile = iSoftwareTools.directory[0] + "/" + plugin[0]
if (os_path.exists(detailsfile) == True):
- self.fillPackageDetails(plugin[0])
- self.package = self.packageDetails[0]
+ iSoftwareTools.fillPackageDetails(plugin[0])
+ self.package = iSoftwareTools.packageDetails[0]
if self.package[0].has_key("attributes"):
self.attributes = self.package[0]["attributes"]
if self.attributes.has_key("package"):
@@ -1112,9 +680,13 @@ class PluginManager(Screen, DreamInfoHandler):
else:
self.cmdList.append((IpkgComponent.CMD_INSTALL, { "package": plugin[2] }))
- def runExecute(self, result):
- if result:
- self.session.openWithCallback(self.runExecuteFinished, Ipkg, cmdList = self.cmdList)
+ def runExecute(self, result = None):
+ if result is not None:
+ if result[0] is True:
+ self.session.openWithCallback(self.runExecuteFinished, Ipkg, cmdList = self.cmdList)
+ elif result[0] is False:
+ self.cmdList = result[1]
+ self.session.openWithCallback(self.runExecuteFinished, Ipkg, cmdList = self.cmdList)
else:
self.close()
@@ -1126,6 +698,7 @@ class PluginManager(Screen, DreamInfoHandler):
return
if result is False:
self.reloadPluginlist()
+ self.selectedFiles = []
self.detailsClosed(True)
if result:
quitMainloop(3)
@@ -1136,7 +709,7 @@ class PluginManager(Screen, DreamInfoHandler):
class PluginManagerInfo(Screen):
skin = """
- <screen name="PluginManagerInfo" position="center,center" size="560,440" title="Plugin manager activity information" >
+ <screen name="PluginManagerInfo" position="center,center" size="560,450" title="Plugin manager activity information" >
<ePixmap pixmap="skin_default/buttons/red.png" position="0,0" size="140,40" alphatest="on" />
<ePixmap pixmap="skin_default/buttons/green.png" position="140,0" size="140,40" alphatest="on" />
<widget source="key_red" render="Label" position="0,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" />
@@ -1144,18 +717,18 @@ class PluginManagerInfo(Screen):
<widget source="list" render="Listbox" position="5,50" size="550,350" scrollbarMode="showOnDemand" selectionDisabled="1">
<convert type="TemplatedMultiContent">
{"template": [
- MultiContentEntryText(pos = (50, 1), size = (150, 24), font=0, flags = RT_HALIGN_LEFT, text = 0), # index 0 is the name
- MultiContentEntryText(pos = (50, 25), size = (540, 24), font=1, flags = RT_HALIGN_LEFT, text = 1), # index 1 is the state
+ MultiContentEntryText(pos = (50, 0), size = (150, 26), font=0, flags = RT_HALIGN_LEFT, text = 0), # index 0 is the name
+ MultiContentEntryText(pos = (50, 27), size = (540, 23), font=1, flags = RT_HALIGN_LEFT, text = 1), # index 1 is the state
MultiContentEntryPixmapAlphaTest(pos = (0, 1), size = (48, 48), png = 2), # index 2 is the status pixmap
- MultiContentEntryPixmapAlphaTest(pos = (0, 49), size = (550, 2), png = 3), # index 3 is the div pixmap
+ MultiContentEntryPixmapAlphaTest(pos = (0, 48), size = (550, 2), png = 3), # index 3 is the div pixmap
],
- "fonts": [gFont("Regular", 22),gFont("Regular", 18)],
- "itemHeight": 52
+ "fonts": [gFont("Regular", 24),gFont("Regular", 22)],
+ "itemHeight": 50
}
</convert>
</widget>
- <ePixmap pixmap="skin_default/div-h.png" position="0,410" zPosition="10" size="560,2" transparent="1" alphatest="on" />
- <widget source="status" render="Label" position="5,420" zPosition="10" size="550,30" halign="center" valign="center" font="Regular;22" transparent="1" shadowColor="black" shadowOffset="-1,-1" />
+ <ePixmap pixmap="skin_default/div-h.png" position="0,404" zPosition="10" size="560,2" transparent="1" alphatest="on" />
+ <widget source="status" render="Label" position="5,408" zPosition="10" size="550,44" halign="center" valign="center" font="Regular;22" transparent="1" shadowColor="black" shadowOffset="-1,-1" />
</screen>"""
def __init__(self, session, plugin_path, cmdlist = None):
@@ -1166,17 +739,17 @@ class PluginManagerInfo(Screen):
self["shortcuts"] = ActionMap(["ShortcutActions", "WizardActions"],
{
- "ok": self.process,
+ "ok": self.process_all,
"back": self.exit,
"red": self.exit,
- "green": self.process,
+ "green": self.process_extensions,
}, -1)
self.list = []
self["list"] = List(self.list)
self["key_red"] = StaticText(_("Cancel"))
- self["key_green"] = StaticText(_("Continue"))
- self["status"] = StaticText(_("Following tasks will be done after you press continue!"))
+ self["key_green"] = StaticText(_("Only extensions."))
+ self["status"] = StaticText(_("Following tasks will be done after you press OK!"))
self.onShown.append(self.setWindowTitle)
self.onLayoutFinish.append(self.rebuildList)
@@ -1210,10 +783,10 @@ class PluginManagerInfo(Screen):
self['list'].updateList(self.list)
def buildEntryComponent(self, action,info):
- divpng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_SKIN_IMAGE, "skin_default/div-h.png"))
- upgradepng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_PLUGINS, "SystemPlugins/SoftwareManager/upgrade.png"))
- installpng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_PLUGINS, "SystemPlugins/SoftwareManager/install.png"))
- removepng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_PLUGINS, "SystemPlugins/SoftwareManager/remove.png"))
+ divpng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/div-h.png"))
+ upgradepng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_PLUGIN, "SystemPlugins/SoftwareManager/upgrade.png"))
+ installpng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_PLUGIN, "SystemPlugins/SoftwareManager/install.png"))
+ removepng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_PLUGIN, "SystemPlugins/SoftwareManager/remove.png"))
if action == 'install':
return(( _('Installing'), info, installpng, divpng))
elif action == 'remove':
@@ -1222,32 +795,41 @@ class PluginManagerInfo(Screen):
return(( _('Upgrading'), info, upgradepng, divpng))
def exit(self):
- self.close(False)
+ self.close()
- def process(self):
- self.close(True)
+ def process_all(self):
+ self.close((True,None))
+
+ def process_extensions(self):
+ self.list = []
+ if self.cmdlist is not None:
+ for entry in self.cmdlist:
+ cmd = entry[0]
+ if entry[0] in (0,2):
+ self.list.append((entry))
+ self.close((False,self.list))
class PluginManagerHelp(Screen):
skin = """
- <screen name="PluginManagerHelp" position="center,center" size="560,440" title="Plugin manager help" >
+ <screen name="PluginManagerHelp" position="center,center" size="560,450" title="Plugin manager help" >
<ePixmap pixmap="skin_default/buttons/red.png" position="0,0" size="140,40" alphatest="on" />
<widget source="key_red" render="Label" position="0,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" />
<widget source="list" render="Listbox" position="5,50" size="550,350" scrollbarMode="showOnDemand" selectionDisabled="1">
<convert type="TemplatedMultiContent">
{"template": [
- MultiContentEntryText(pos = (50, 1), size = (540, 24), font=0, flags = RT_HALIGN_LEFT, text = 0), # index 0 is the name
- MultiContentEntryText(pos = (50, 25), size = (540, 24), font=1, flags = RT_HALIGN_LEFT, text = 1), # index 1 is the state
+ MultiContentEntryText(pos = (50, 0), size = (150, 26), font=0, flags = RT_HALIGN_LEFT, text = 0), # index 0 is the name
+ MultiContentEntryText(pos = (50, 27), size = (540, 23), font=1, flags = RT_HALIGN_LEFT, text = 1), # index 1 is the state
MultiContentEntryPixmapAlphaTest(pos = (0, 1), size = (48, 48), png = 2), # index 2 is the status pixmap
- MultiContentEntryPixmapAlphaTest(pos = (0, 49), size = (550, 2), png = 3), # index 3 is the div pixmap
+ MultiContentEntryPixmapAlphaTest(pos = (0, 48), size = (550, 2), png = 3), # index 3 is the div pixmap
],
- "fonts": [gFont("Regular", 22),gFont("Regular", 18)],
- "itemHeight": 52
+ "fonts": [gFont("Regular", 24),gFont("Regular", 22)],
+ "itemHeight": 50
}
</convert>
</widget>
- <ePixmap pixmap="skin_default/div-h.png" position="0,410" zPosition="10" size="550,2" transparent="1" alphatest="on" />
- <widget source="status" render="Label" position="5,420" zPosition="10" size="550,30" halign="center" valign="center" font="Regular;22" transparent="1" shadowColor="black" shadowOffset="-1,-1" />
+ <ePixmap pixmap="skin_default/div-h.png" position="0,404" zPosition="10" size="560,2" transparent="1" alphatest="on" />
+ <widget source="status" render="Label" position="5,408" zPosition="10" size="550,44" halign="center" valign="center" font="Regular;22" transparent="1" shadowColor="black" shadowOffset="-1,-1" />
</screen>"""
def __init__(self, session, plugin_path):
@@ -1282,11 +864,11 @@ class PluginManagerHelp(Screen):
self['list'].updateList(self.list)
def buildEntryComponent(self, state):
- divpng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_SKIN_IMAGE, "skin_default/div-h.png"))
- installedpng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_PLUGINS, "SystemPlugins/SoftwareManager/installed.png"))
- installablepng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_PLUGINS, "SystemPlugins/SoftwareManager/installable.png"))
- removepng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_PLUGINS, "SystemPlugins/SoftwareManager/remove.png"))
- installpng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_PLUGINS, "SystemPlugins/SoftwareManager/install.png"))
+ divpng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/div-h.png"))
+ installedpng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_PLUGIN, "SystemPlugins/SoftwareManager/installed.png"))
+ installablepng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_PLUGIN, "SystemPlugins/SoftwareManager/installable.png"))
+ removepng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_PLUGIN, "SystemPlugins/SoftwareManager/remove.png"))
+ installpng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_PLUGIN, "SystemPlugins/SoftwareManager/install.png"))
if state == 'installed':
return(( _('This plugin is installed.'), _('You can remove this plugin.'), installedpng, divpng))
@@ -1369,7 +951,7 @@ class PluginDetails(Screen, DreamInfoHandler):
self.onLayoutFinish.append(self.setInfos)
def setWindowTitle(self):
- self.setTitle(_("Package details for: " + self.pluginname))
+ self.setTitle(_("Details for extension: " + self.pluginname))
def exit(self):
self.close(False)
@@ -1412,7 +994,7 @@ class PluginDetails(Screen, DreamInfoHandler):
self["author"].setText(_("Author: ") + self.author)
self["detailtext"].setText(self.description.strip())
- if self.pluginstate == 'installable':
+ if self.pluginstate in ('installable', 'install'):
self["key_green"].setText(_("Install"))
else:
self["key_green"].setText(_("Remove"))
@@ -1432,7 +1014,7 @@ class PluginDetails(Screen, DreamInfoHandler):
if not noScreenshot:
filename = self.thumbnail
else:
- filename = resolveFilename(SCOPE_PLUGINS, "SystemPlugins/SoftwareManager/noprev.png")
+ filename = resolveFilename(SCOPE_CURRENT_PLUGIN, "SystemPlugins/SoftwareManager/noprev.png")
sc = AVSwitch().getFramebufferScale()
self.picload.setPara((self["screenshot"].instance.size().width(), self["screenshot"].instance.size().height(), sc[0], sc[1], False, 1, "#00000000"))
@@ -1457,7 +1039,7 @@ class PluginDetails(Screen, DreamInfoHandler):
if self.attributes.has_key("package"):
self.packagefiles = self.attributes["package"]
self.cmdList = []
- if self.pluginstate == 'installed':
+ if self.pluginstate in ('installed', 'remove'):
if self.packagefiles:
for package in self.packagefiles[:]:
self.cmdList.append((IpkgComponent.CMD_REMOVE, { "package": package["name"] }))
@@ -1622,6 +1204,427 @@ class UpdatePlugin(Screen):
self.close()
+
+class IPKGMenu(Screen):
+ skin = """
+ <screen name="IPKGMenu" position="center,center" size="560,400" title="Select upgrade source to edit." >
+ <ePixmap pixmap="skin_default/buttons/red.png" position="0,0" size="140,40" alphatest="on" />
+ <ePixmap pixmap="skin_default/buttons/green.png" position="140,0" size="140,40" alphatest="on" />
+ <widget source="key_red" render="Label" position="0,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" />
+ <widget source="key_green" render="Label" position="140,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" transparent="1" />
+ <widget name="filelist" position="5,50" size="550,340" scrollbarMode="showOnDemand" />
+ </screen>"""
+
+ def __init__(self, session, plugin_path):
+ Screen.__init__(self, session)
+ self.skin_path = plugin_path
+
+ self["key_red"] = StaticText(_("Close"))
+ self["key_green"] = StaticText(_("Edit"))
+
+ self.sel = []
+ self.val = []
+ self.entry = False
+ self.exe = False
+
+ self.path = ""
+
+ self["actions"] = NumberActionMap(["SetupActions"],
+ {
+ "ok": self.KeyOk,
+ "cancel": self.keyCancel
+ }, -1)
+
+ self["shortcuts"] = ActionMap(["ShortcutActions"],
+ {
+ "red": self.keyCancel,
+ "green": self.KeyOk,
+ })
+ self.flist = []
+ self["filelist"] = MenuList(self.flist)
+ self.fill_list()
+ self.onLayoutFinish.append(self.layoutFinished)
+
+ def layoutFinished(self):
+ self.setWindowTitle()
+
+ def setWindowTitle(self):
+ self.setTitle(_("Select upgrade source to edit."))
+
+ def fill_list(self):
+ self.flist = []
+ self.path = '/etc/ipkg/'
+ if (os_path.exists(self.path) == False):
+ self.entry = False
+ return
+ for file in listdir(self.path):
+ if (file.endswith(".conf")):
+ if file != 'arch.conf':
+ self.flist.append((file))
+ self.entry = True
+ self["filelist"].l.setList(self.flist)
+
+ def KeyOk(self):
+ if (self.exe == False) and (self.entry == True):
+ self.sel = self["filelist"].getCurrent()
+ self.val = self.path + self.sel
+ self.session.open(IPKGSource, self.val)
+
+ def keyCancel(self):
+ self.close()
+
+ def Exit(self):
+ self.close()
+
+
+class IPKGSource(Screen):
+ skin = """
+ <screen name="IPKGSource" position="center,center" size="560,80" title="Edit upgrade source url." >
+ <ePixmap pixmap="skin_default/buttons/red.png" position="0,0" size="140,40" alphatest="on" />
+ <ePixmap pixmap="skin_default/buttons/green.png" position="140,0" size="140,40" alphatest="on" />
+ <widget source="key_red" render="Label" position="0,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" />
+ <widget source="key_green" render="Label" position="140,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" transparent="1" />
+ <widget name="text" position="5,50" size="550,25" font="Regular;20" backgroundColor="background" foregroundColor="#cccccc" />
+ </screen>"""
+
+ def __init__(self, session, configfile = None):
+ Screen.__init__(self, session)
+ self.session = session
+ self.configfile = configfile
+ text = ""
+ if self.configfile:
+ try:
+ fp = file(configfile, 'r')
+ sources = fp.readlines()
+ if sources:
+ text = sources[0]
+ fp.close()
+ except IOError:
+ pass
+
+ desk = getDesktop(0)
+ x= int(desk.size().width())
+ y= int(desk.size().height())
+
+ self["key_red"] = StaticText(_("Cancel"))
+ self["key_green"] = StaticText(_("Save"))
+
+ if (y>=720):
+ self["text"] = Input(text, maxSize=False, type=Input.TEXT)
+ else:
+ self["text"] = Input(text, maxSize=False, visible_width = 55, type=Input.TEXT)
+
+ self["actions"] = NumberActionMap(["WizardActions", "InputActions", "TextEntryActions", "KeyboardInputActions","ShortcutActions"],
+ {
+ "ok": self.go,
+ "back": self.close,
+ "red": self.close,
+ "green": self.go,
+ "left": self.keyLeft,
+ "right": self.keyRight,
+ "home": self.keyHome,
+ "end": self.keyEnd,
+ "deleteForward": self.keyDeleteForward,
+ "deleteBackward": self.keyDeleteBackward,
+ "1": self.keyNumberGlobal,
+ "2": self.keyNumberGlobal,
+ "3": self.keyNumberGlobal,
+ "4": self.keyNumberGlobal,
+ "5": self.keyNumberGlobal,
+ "6": self.keyNumberGlobal,
+ "7": self.keyNumberGlobal,
+ "8": self.keyNumberGlobal,
+ "9": self.keyNumberGlobal,
+ "0": self.keyNumberGlobal
+ }, -1)
+
+ self.onLayoutFinish.append(self.layoutFinished)
+
+ def layoutFinished(self):
+ self.setWindowTitle()
+ self["text"].right()
+
+ def setWindowTitle(self):
+ self.setTitle(_("Edit upgrade source url."))
+
+ def go(self):
+ text = self["text"].getText()
+ if text:
+ fp = file(self.configfile, 'w')
+ fp.write(text)
+ fp.write("\n")
+ fp.close()
+ self.close()
+
+ def keyLeft(self):
+ self["text"].left()
+
+ def keyRight(self):
+ self["text"].right()
+
+ def keyHome(self):
+ self["text"].home()
+
+ def keyEnd(self):
+ self["text"].end()
+
+ def keyDeleteForward(self):
+ self["text"].delete()
+
+ def keyDeleteBackward(self):
+ self["text"].deleteBackward()
+
+ def keyNumberGlobal(self, number):
+ self["text"].number(number)
+
+
+class PacketManager(Screen):
+ skin = """
+ <screen name="PacketManager" position="center,center" size="530,420" title="Packet manager" >
+ <ePixmap pixmap="skin_default/buttons/red.png" position="0,0" size="140,40" alphatest="on" />
+ <ePixmap pixmap="skin_default/buttons/green.png" position="140,0" size="140,40" alphatest="on" />
+ <widget source="key_red" render="Label" position="0,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" />
+ <widget source="key_green" render="Label" position="140,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" transparent="1" />
+ <widget source="list" render="Listbox" position="5,50" size="520,365" scrollbarMode="showOnDemand">
+ <convert type="TemplatedMultiContent">
+ {"template": [
+ MultiContentEntryText(pos = (5, 1), size = (440, 28), font=0, flags = RT_HALIGN_LEFT, text = 0), # index 0 is the name
+ MultiContentEntryText(pos = (5, 26), size = (440, 20), font=1, flags = RT_HALIGN_LEFT, text = 2), # index 2 is the description
+ MultiContentEntryPixmapAlphaTest(pos = (445, 2), size = (48, 48), png = 4), # index 4 is the status pixmap
+ MultiContentEntryPixmapAlphaTest(pos = (5, 50), size = (510, 2), png = 5), # index 4 is the div pixmap
+ ],
+ "fonts": [gFont("Regular", 22),gFont("Regular", 14)],
+ "itemHeight": 52
+ }
+ </convert>
+ </widget>
+ </screen>"""
+
+ def __init__(self, session, plugin_path, args = None):
+ Screen.__init__(self, session)
+ self.session = session
+ self.skin_path = plugin_path
+
+ self["shortcuts"] = ActionMap(["ShortcutActions", "WizardActions"],
+ {
+ "ok": self.go,
+ "back": self.exit,
+ "red": self.exit,
+ "green": self.reload,
+ }, -1)
+
+ self.list = []
+ self.statuslist = []
+ self["list"] = List(self.list)
+ self["key_red"] = StaticText(_("Close"))
+ self["key_green"] = StaticText(_("Reload"))
+
+ self.list_updating = True
+ self.packetlist = []
+ self.installed_packetlist = {}
+ self.Console = Console()
+ self.cmdList = []
+ self.cachelist = []
+ self.cache_ttl = 86400 #600 is default, 0 disables, Seconds cache is considered valid (24h should be ok for caching ipkgs)
+ self.cache_file = '/usr/lib/enigma2/python/Plugins/SystemPlugins/SoftwareManager/packetmanager.cache' #Path to cache directory
+ self.oktext = _("\nAfter pressing OK, please wait!")
+ self.unwanted_extensions = ('-dbg', '-dev', '-doc', 'busybox')
+
+ self.ipkg = IpkgComponent()
+ self.ipkg.addCallback(self.ipkgCallback)
+ self.onShown.append(self.setWindowTitle)
+ self.onLayoutFinish.append(self.rebuildList)
+
+ def exit(self):
+ self.ipkg.stop()
+ if self.Console is not None:
+ if len(self.Console.appContainers):
+ for name in self.Console.appContainers.keys():
+ self.Console.kill(name)
+ self.close()
+
+ def reload(self):
+ if (os_path.exists(self.cache_file) == True):
+ remove(self.cache_file)
+ self.list_updating = True
+ self.rebuildList()
+
+ def setWindowTitle(self):
+ self.setTitle(_("Packet manager"))
+
+ def setStatus(self,status = None):
+ if status:
+ self.statuslist = []
+ divpng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/div-h.png"))
+ if status == 'update':
+ statuspng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_PLUGIN, "SystemPlugins/SoftwareManager/upgrade.png"))
+ self.statuslist.append(( _("Package list update"), '', _("Trying to download a new packetlist. Please wait..." ),'',statuspng, divpng ))
+ self['list'].setList(self.statuslist)
+ elif status == 'error':
+ statuspng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_PLUGIN, "SystemPlugins/SoftwareManager/remove.png"))
+ self.statuslist.append(( _("Error"), '', _("There was an error downloading the packetlist. Please try again." ),'',statuspng, divpng ))
+ self['list'].setList(self.statuslist)
+
+ def rebuildList(self):
+ self.setStatus('update')
+ self.inv_cache = 0
+ self.vc = valid_cache(self.cache_file, self.cache_ttl)
+ if self.cache_ttl > 0 and self.vc != 0:
+ try:
+ self.buildPacketList()
+ except:
+ self.inv_cache = 1
+ if self.cache_ttl == 0 or self.inv_cache == 1 or self.vc == 0:
+ self.run = 0
+ self.ipkg.startCmd(IpkgComponent.CMD_UPDATE)
+
+ def go(self, returnValue = None):
+ cur = self["list"].getCurrent()
+ if cur:
+ status = cur[3]
+ package = cur[0]
+ self.cmdList = []
+ if status == 'installed':
+ self.cmdList.append((IpkgComponent.CMD_REMOVE, { "package": package }))
+ if len(self.cmdList):
+ self.session.openWithCallback(self.runRemove, MessageBox, _("Do you want to remove the package:\n") + package + "\n" + self.oktext)
+ elif status == 'upgradeable':
+ self.cmdList.append((IpkgComponent.CMD_INSTALL, { "package": package }))
+ if len(self.cmdList):
+ self.session.openWithCallback(self.runUpgrade, MessageBox, _("Do you want to upgrade the package:\n") + package + "\n" + self.oktext)
+ elif status == "installable":
+ self.cmdList.append((IpkgComponent.CMD_INSTALL, { "package": package }))
+ if len(self.cmdList):
+ self.session.openWithCallback(self.runUpgrade, MessageBox, _("Do you want to install the package:\n") + package + "\n" + self.oktext)
+
+ def runRemove(self, result):
+ if result:
+ self.session.openWithCallback(self.runRemoveFinished, Ipkg, cmdList = self.cmdList)
+
+ def runRemoveFinished(self):
+ self.session.openWithCallback(self.RemoveReboot, MessageBox, _("Remove finished.") +" "+_("Do you want to reboot your Dreambox?"), MessageBox.TYPE_YESNO)
+
+ def RemoveReboot(self, result):
+ if result is None:
+ return
+ if result is False:
+ cur = self["list"].getCurrent()
+ if cur:
+ item = self['list'].getIndex()
+ self.list[item] = self.buildEntryComponent(cur[0], cur[1], cur[2], 'installable')
+ self.cachelist[item] = [cur[0], cur[1], cur[2], 'installable']
+ self['list'].setList(self.list)
+ write_cache(self.cache_file, self.cachelist)
+ self.reloadPluginlist()
+ if result:
+ quitMainloop(3)
+
+ def runUpgrade(self, result):
+ if result:
+ self.session.openWithCallback(self.runUpgradeFinished, Ipkg, cmdList = self.cmdList)
+
+ def runUpgradeFinished(self):
+ self.session.openWithCallback(self.UpgradeReboot, MessageBox, _("Upgrade finished.") +" "+_("Do you want to reboot your Dreambox?"), MessageBox.TYPE_YESNO)
+
+ def UpgradeReboot(self, result):
+ if result is None:
+ return
+ if result is False:
+ cur = self["list"].getCurrent()
+ if cur:
+ item = self['list'].getIndex()
+ self.list[item] = self.buildEntryComponent(cur[0], cur[1], cur[2], 'installed')
+ self.cachelist[item] = [cur[0], cur[1], cur[2], 'installed']
+ self['list'].setList(self.list)
+ write_cache(self.cache_file, self.cachelist)
+ self.reloadPluginlist()
+ if result:
+ quitMainloop(3)
+
+ def ipkgCallback(self, event, param):
+ if event == IpkgComponent.EVENT_ERROR:
+ self.list_updating = False
+ self.setStatus('error')
+ elif event == IpkgComponent.EVENT_DONE:
+ if self.list_updating:
+ self.list_updating = False
+ if not self.Console:
+ self.Console = Console()
+ cmd = "ipkg list"
+ self.Console.ePopen(cmd, self.IpkgList_Finished)
+ #print event, "-", param
+ pass
+
+ def IpkgList_Finished(self, result, retval, extra_args = None):
+ if len(result):
+ self.packetlist = []
+ for x in result.splitlines():
+ split = x.split(' - ') #self.blacklisted_packages
+ if not any(split[0].strip().endswith(x) for x in self.unwanted_extensions):
+ self.packetlist.append([split[0].strip(), split[1].strip(),split[2].strip()])
+ if not self.Console:
+ self.Console = Console()
+ cmd = "ipkg list_installed"
+ self.Console.ePopen(cmd, self.IpkgListInstalled_Finished)
+
+ def IpkgListInstalled_Finished(self, result, retval, extra_args = None):
+ if len(result):
+ self.installed_packetlist = {}
+ for x in result.splitlines():
+ split = x.split(' - ')
+ if not any(split[0].strip().endswith(x) for x in self.unwanted_extensions):
+ self.installed_packetlist[split[0].strip()] = split[1].strip()
+ self.buildPacketList()
+
+ def buildEntryComponent(self, name, version, description, state):
+ divpng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/div-h.png"))
+ if state == 'installed':
+ installedpng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_PLUGIN, "SystemPlugins/SoftwareManager/installed.png"))
+ return((name, version, description, state, installedpng, divpng))
+ elif state == 'upgradeable':
+ upgradeablepng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_PLUGIN, "SystemPlugins/SoftwareManager/upgradeable.png"))
+ return((name, version, description, state, upgradeablepng, divpng))
+ else:
+ installablepng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_PLUGIN, "SystemPlugins/SoftwareManager/installable.png"))
+ return((name, version, description, state, installablepng, divpng))
+
+ def buildPacketList(self):
+ self.list = []
+ self.cachelist = []
+
+ if self.cache_ttl > 0 and self.vc != 0:
+ print 'Loading packagelist cache from ',self.cache_file
+ try:
+ self.cachelist = load_cache(self.cache_file)
+ if len(self.cachelist) > 0:
+ for x in self.cachelist:
+ self.list.append(self.buildEntryComponent(x[0], x[1], x[2], x[3]))
+ self['list'].setList(self.list)
+ except:
+ self.inv_cache = 1
+
+ if self.cache_ttl == 0 or self.inv_cache == 1 or self.vc == 0:
+ print 'rebuilding fresh package list'
+ for x in self.packetlist:
+ status = ""
+ if self.installed_packetlist.has_key(x[0].strip()):
+ if self.installed_packetlist[x[0].strip()] == x[1].strip():
+ status = "installed"
+ self.list.append(self.buildEntryComponent(x[0].strip(), x[1].strip(), x[2].strip(), status))
+ else:
+ status = "upgradeable"
+ self.list.append(self.buildEntryComponent(x[0].strip(), x[1].strip(), x[2].strip(), status))
+ else:
+ status = "installable"
+ self.list.append(self.buildEntryComponent(x[0].strip(), x[1].strip(), x[2].strip(), status))
+ if not any(x[0].strip().endswith(x) for x in self.unwanted_extensions):
+ self.cachelist.append([x[0].strip(), x[1].strip(), x[2].strip(), status])
+ write_cache(self.cache_file, self.cachelist)
+ self['list'].setList(self.list)
+
+ def reloadPluginlist(self):
+ plugins.readPluginList(resolveFilename(SCOPE_PLUGINS))
+
class IpkgInstaller(Screen):
skin = """
<screen name="IpkgInstaller" position="center,center" size="550,450" title="Install extensions" >
@@ -1687,15 +1690,20 @@ def UpgradeMain(session, **kwargs):
def startSetup(menuid):
if menuid != "setup":
return [ ]
- return [(_("Software manager"), UpgradeMain, "software_manager", 50)]
+ return [(_("Software management"), UpgradeMain, "software_manager", 50)]
+
+def autostart(reason, **kwargs):
+ if reason is True:
+ iSoftwareTools.startSoftwareTools()
def Plugins(path, **kwargs):
global plugin_path
plugin_path = path
list = [
- PluginDescriptor(name=_("Software manager"), description=_("Manage your receiver's software"), where = PluginDescriptor.WHERE_MENU, fnc=startSetup),
+ PluginDescriptor(where = [PluginDescriptor.WHERE_NETWORKCONFIG_READ], fnc = autostart),
+ PluginDescriptor(name=_("Software management"), description=_("Manage your receiver's software"), where = PluginDescriptor.WHERE_MENU, fnc=startSetup),
PluginDescriptor(name=_("Ipkg"), where = PluginDescriptor.WHERE_FILESCAN, fnc = filescan)
]
if config.usage.setup_level.index >= 2: # expert+
- list.append(PluginDescriptor(name=_("Software manager"), description=_("Manage your receiver's software"), where = PluginDescriptor.WHERE_EXTENSIONSMENU, fnc=UpgradeMain))
+ list.append(PluginDescriptor(name=_("Software management"), description=_("Manage your receiver's software"), where = PluginDescriptor.WHERE_EXTENSIONSMENU, fnc=UpgradeMain))
return list
diff --git a/lib/python/Plugins/SystemPlugins/VideoEnhancement/meta/Makefile.am b/lib/python/Plugins/SystemPlugins/VideoEnhancement/meta/Makefile.am
index 9e248084..2e80f306 100755
--- a/lib/python/Plugins/SystemPlugins/VideoEnhancement/meta/Makefile.am
+++ b/lib/python/Plugins/SystemPlugins/VideoEnhancement/meta/Makefile.am
@@ -2,4 +2,4 @@ installdir = $(datadir)/meta/
dist_install_DATA = plugin_videoenhancement.xml
-EXTRA_DIST = videoenhancement.jpg
+EXTRA_DIST = videoenhancement_en.jpg videoenhancement_de.jpg
diff --git a/lib/python/Plugins/SystemPlugins/VideoEnhancement/meta/plugin_videoenhancement.xml b/lib/python/Plugins/SystemPlugins/VideoEnhancement/meta/plugin_videoenhancement.xml
index 33b222ef..208c7e0c 100755
--- a/lib/python/Plugins/SystemPlugins/VideoEnhancement/meta/plugin_videoenhancement.xml
+++ b/lib/python/Plugins/SystemPlugins/VideoEnhancement/meta/plugin_videoenhancement.xml
@@ -1,5 +1,8 @@
<default>
<prerequisites>
+ <hardware type="dm8000" />
+ <hardware type="dm800" />
+ <hardware type="dm500hd" />
<tag type="Display" />
<tag type="System" />
</prerequisites>
@@ -9,15 +12,15 @@
<packagename>enigma2-plugin-systemplugins-videoenhancement</packagename>
<shortdescription>VideoEnhancement provides advanced video enhancement settings.</shortdescription>
<description>The VideoEnhancement extension provides advanced video enhancement settings.</description>
- <screenshot src="http://www.dreamboxupdate.com/preview/videoenhancement.jpg" />
+ <screenshot src="http://www.dreamboxupdate.com/preview/plugin_videoenhancement_en.jpg" />
</info>
<info language="de">
<author>Dream Multimedia</author>
- <name>VideoEnhancement</name>
+ <name>Erweiterte A/V Einstellungen</name>
<packagename>enigma2-plugin-systemplugins-videoenhancement</packagename>
- <shortdescription>Videomode bietet erweiterte Video Konfigurationsoptionen.</shortdescription>
- <description>Die Videomode-Erweiterung bietet erweiterte Video Konfigurationsoptionen.</description>
- <screenshot src="http://www.dreamboxupdate.com/preview/videoenhancement.jpg" />
+ <shortdescription>Erweiterte A/V Einstellungen für Ihre Dreambox.</shortdescription>
+ <description>Erweiterte A/V Einstellungen für Ihre Dreambox.</description>
+ <screenshot src="http://www.dreamboxupdate.com/preview/plugin_videoenhancement_de.jpg" />
</info>
<files type="package"> <!-- without version, without .ipk -->
diff --git a/lib/python/Plugins/SystemPlugins/VideoEnhancement/meta/videoenhancement.jpg b/lib/python/Plugins/SystemPlugins/VideoEnhancement/meta/videoenhancement.jpg
deleted file mode 100755
index 0e0ef6fc..00000000
--- a/lib/python/Plugins/SystemPlugins/VideoEnhancement/meta/videoenhancement.jpg
+++ /dev/null
Binary files differ
diff --git a/lib/python/Plugins/SystemPlugins/VideoEnhancement/meta/videoenhancement_de.jpg b/lib/python/Plugins/SystemPlugins/VideoEnhancement/meta/videoenhancement_de.jpg
new file mode 100755
index 00000000..ecf0161d
--- /dev/null
+++ b/lib/python/Plugins/SystemPlugins/VideoEnhancement/meta/videoenhancement_de.jpg
Binary files differ
diff --git a/lib/python/Plugins/SystemPlugins/VideoEnhancement/meta/videoenhancement_en.jpg b/lib/python/Plugins/SystemPlugins/VideoEnhancement/meta/videoenhancement_en.jpg
new file mode 100755
index 00000000..a97a7a34
--- /dev/null
+++ b/lib/python/Plugins/SystemPlugins/VideoEnhancement/meta/videoenhancement_en.jpg
Binary files differ
diff --git a/lib/python/Plugins/SystemPlugins/VideoTune/meta/plugin_videotune.xml b/lib/python/Plugins/SystemPlugins/VideoTune/meta/plugin_videotune.xml
index 75abb90e..c4609433 100644..100755
--- a/lib/python/Plugins/SystemPlugins/VideoTune/meta/plugin_videotune.xml
+++ b/lib/python/Plugins/SystemPlugins/VideoTune/meta/plugin_videotune.xml
@@ -9,7 +9,7 @@
<packagename>enigma2-plugin-systemplugins-videotune</packagename>
<shortdescription>VideoTune helps fine-tuning your tv display.</shortdescription>
<description>The VideoTune helps fine-tuning your tv display.\nYou can control brightness and contrast of your tv.</description>
- <screenshot src="http://www.dreamboxupdate.com/preview/videotune.jpg" />
+ <screenshot src="http://www.dreamboxupdate.com/preview/plugin_videotune.jpg" />
</info>
<info language="de">
<author>Dream Multimedia - DE</author>
@@ -18,7 +18,7 @@
<shortdescription>VideoTune hilft beim fein-einstellen des Fernsehers.</shortdescription>
<description>VideoTune hilf beim fein-einstellen des Fernsehers.\nSie können Kontrast und Helligkeit fein-einstellen.
</description>
- <screenshot src="http://www.dreamboxupdate.com/preview/videotune.jpg" />
+ <screenshot src="http://www.dreamboxupdate.com/preview/plugin_videotune.jpg" />
</info>
<files type="package"> <!-- ohne versionsnummer, ohne .ipkg -->
<file type="package" name="enigma2-plugin-systemplugins-videotune" />
diff --git a/lib/python/Plugins/SystemPlugins/Videomode/VideoWizard.py b/lib/python/Plugins/SystemPlugins/Videomode/VideoWizard.py
index cd1529aa..512bcec3 100644
--- a/lib/python/Plugins/SystemPlugins/Videomode/VideoWizard.py
+++ b/lib/python/Plugins/SystemPlugins/Videomode/VideoWizard.py
@@ -131,8 +131,12 @@ class VideoWizard(WizardLanguage, Rc):
def modeSelect(self, mode):
ratesList = self.listRates(mode)
print "ratesList:", ratesList
- self.hw.setMode(port = self.port, mode = mode, rate = ratesList[0][0])
-
+ if self.port == "DVI" and mode in ("720p", "1080i"):
+ self.rate = "multi"
+ self.hw.setMode(port = self.port, mode = mode, rate = "multi")
+ else:
+ self.hw.setMode(port = self.port, mode = mode, rate = ratesList[0][0])
+
def listRates(self, querymode = None):
if querymode is None:
querymode = self.mode
diff --git a/lib/python/Plugins/SystemPlugins/Videomode/meta/Makefile.am b/lib/python/Plugins/SystemPlugins/Videomode/meta/Makefile.am
index 6c012e84..ef474435 100755
--- a/lib/python/Plugins/SystemPlugins/Videomode/meta/Makefile.am
+++ b/lib/python/Plugins/SystemPlugins/Videomode/meta/Makefile.am
@@ -2,4 +2,4 @@ installdir = $(datadir)/meta/
dist_install_DATA = plugin_videomode.xml
-EXTRA_DIST = videomode.jpg
+EXTRA_DIST = videomode_en.jpg videomode_de.jpg
diff --git a/lib/python/Plugins/SystemPlugins/Videomode/meta/plugin_videomode.xml b/lib/python/Plugins/SystemPlugins/Videomode/meta/plugin_videomode.xml
index 3891e0b1..fbb6e3f4 100644..100755
--- a/lib/python/Plugins/SystemPlugins/Videomode/meta/plugin_videomode.xml
+++ b/lib/python/Plugins/SystemPlugins/Videomode/meta/plugin_videomode.xml
@@ -9,7 +9,7 @@
<packagename>enigma2-plugin-systemplugins-videomode</packagename>
<shortdescription>Videomode provides advanced video modes.</shortdescription>
<description>The Videomode extension provides advanced video modes.</description>
- <screenshot src="http://www.dreamboxupdate.com/preview/videomode.jpg" />
+ <screenshot src="http://www.dreamboxupdate.com/preview/plugin_videomode_en.jpg" />
</info>
<info language="de">
<author>Dream Multimedia</author>
@@ -17,7 +17,7 @@
<packagename>enigma2-plugin-systemplugins-videomode</packagename>
<shortdescription>Videomode bietet erweiterte Video Einstellungen.</shortdescription>
<description>Die Videomode-Erweiterung bietet erweiterte Video-Einstellungen.</description>
- <screenshot src="http://www.dreamboxupdate.com/preview/videomode.jpg" />
+ <screenshot src="http://www.dreamboxupdate.com/preview/plugin_videomode_de.jpg" />
</info>
<files type="package"> <!-- without version, without .ipk -->
diff --git a/lib/python/Plugins/SystemPlugins/Videomode/meta/videomode.jpg b/lib/python/Plugins/SystemPlugins/Videomode/meta/videomode.jpg
deleted file mode 100644
index adb5646b..00000000
--- a/lib/python/Plugins/SystemPlugins/Videomode/meta/videomode.jpg
+++ /dev/null
Binary files differ
diff --git a/lib/python/Plugins/SystemPlugins/Videomode/meta/videomode_de.jpg b/lib/python/Plugins/SystemPlugins/Videomode/meta/videomode_de.jpg
new file mode 100755
index 00000000..00b7ac70
--- /dev/null
+++ b/lib/python/Plugins/SystemPlugins/Videomode/meta/videomode_de.jpg
Binary files differ
diff --git a/lib/python/Plugins/SystemPlugins/Videomode/meta/videomode_en.jpg b/lib/python/Plugins/SystemPlugins/Videomode/meta/videomode_en.jpg
new file mode 100755
index 00000000..1f4288b9
--- /dev/null
+++ b/lib/python/Plugins/SystemPlugins/Videomode/meta/videomode_en.jpg
Binary files differ
diff --git a/lib/python/Plugins/SystemPlugins/Videomode/videowizard.xml b/lib/python/Plugins/SystemPlugins/Videomode/videowizard.xml
index 29ac4297..5dea661d 100644
--- a/lib/python/Plugins/SystemPlugins/Videomode/videowizard.xml
+++ b/lib/python/Plugins/SystemPlugins/Videomode/videowizard.xml
@@ -20,7 +20,7 @@ self.selectKey("DOWN")
self["portpic"].hide()
</code>
</step>
- <step id="rateselection" nextstep="dvirateintroduction" timeout="20" timeoutaction="selectnext">
+ <step id="rateselection" nextstep="end" timeout="20" timeoutaction="selectnext">
<condition>
self.condition = (self.port != "DVI" or self.mode == "PC")
</condition>
@@ -33,7 +33,7 @@ self.selectKey("UP")
self.selectKey("DOWN")
</code>
</step>
- <step id="dvirateintroduction" nextstep="dvirateselection">
+ <!--step id="dvirateintroduction" nextstep="dvirateselection">
<condition>
self.condition = (self.port == "DVI" and self.mode in ["720p", "1080i"])
</condition>
@@ -89,7 +89,7 @@ self.selectKey("UP")
self.selectKey("DOWN")
self.rateSelect("50Hz")
</code>
- </step>
+ </step-->
<step id="end">
<code>
self.hw.saveMode(self.port, self.mode, self.rate)
diff --git a/lib/python/Plugins/SystemPlugins/WirelessLan/Makefile.am b/lib/python/Plugins/SystemPlugins/WirelessLan/Makefile.am
index 365372c2..2f362379 100755
--- a/lib/python/Plugins/SystemPlugins/WirelessLan/Makefile.am
+++ b/lib/python/Plugins/SystemPlugins/WirelessLan/Makefile.am
@@ -1,6 +1,6 @@
installdir = $(pkglibdir)/python/Plugins/SystemPlugins/WirelessLan
-#SUBDIRS = meta
+SUBDIRS = meta
install_PYTHON = \
__init__.py \
diff --git a/lib/python/Plugins/SystemPlugins/WirelessLan/Wlan.py b/lib/python/Plugins/SystemPlugins/WirelessLan/Wlan.py
index ba1e13d4..1c1471ce 100755
--- a/lib/python/Plugins/SystemPlugins/WirelessLan/Wlan.py
+++ b/lib/python/Plugins/SystemPlugins/WirelessLan/Wlan.py
@@ -1,7 +1,7 @@
-from enigma import eListboxPythonMultiContent, eListbox, gFont, RT_HALIGN_LEFT, RT_HALIGN_RIGHT, RT_HALIGN_CENTER
-from Components.MultiContent import MultiContentEntryText
-from Components.GUIComponent import GUIComponent
-from Components.HTMLComponent import HTMLComponent
+#from enigma import eListboxPythonMultiContent, eListbox, gFont, RT_HALIGN_LEFT, RT_HALIGN_RIGHT, RT_HALIGN_CENTER
+#from Components.MultiContent import MultiContentEntryText
+#from Components.GUIComponent import GUIComponent
+#from Components.HTMLComponent import HTMLComponent
from Components.config import config, ConfigYesNo, NoSave, ConfigSubsection, ConfigText, ConfigSelection, ConfigPassword
from Components.Console import Console
@@ -35,13 +35,12 @@ config.plugins.wlan.encryption.psk = NoSave(ConfigPassword(default = "mysecurewl
class Wlan:
def __init__(self, iface):
a = ''; b = ''
-
for i in range(0, 255):
- a = a + chr(i)
- if i < 32 or i > 127:
- b = b + ' '
- else:
- b = b + chr(i)
+ a = a + chr(i)
+ if i < 32 or i > 127:
+ b = b + ' '
+ else:
+ b = b + chr(i)
self.iface = iface
self.wlaniface = {}
@@ -245,91 +244,6 @@ class Wlan:
return status
-
-class WlanList(HTMLComponent, GUIComponent):
- def __init__(self, session, iface):
-
- GUIComponent.__init__(self)
- self.w = Wlan(iface)
- self.iface = iface
-
- self.length = 0
- self.aplist = None
- self.list = None
- self.oldlist = None
- self.l = None
- self.l = eListboxPythonMultiContent()
-
- self.l.setFont(0, gFont("Regular", 32))
- self.l.setFont(1, gFont("Regular", 18))
- self.l.setFont(2, gFont("Regular", 16))
- self.l.setBuildFunc(self.buildWlanListEntry)
-
- self.reload()
-
- def buildWlanListEntry(self, essid, bssid, encrypted, iface, maxrate, signal):
-
- res = [ (essid, encrypted, iface) ]
-
- if essid == "":
- essid = bssid
-
- e = encrypted and _("Yes") or _("No")
- res.append( MultiContentEntryText(pos=(0, 0), size=(470, 35), font=0, flags=RT_HALIGN_LEFT, text=essid) )
- res.append( MultiContentEntryText(pos=(425, 0), size=(60, 20), font=1, flags=RT_HALIGN_LEFT, text=_("Signal: ")))
- res.append( MultiContentEntryText(pos=(480, 0), size=(70, 35), font=0, flags=RT_HALIGN_RIGHT, text="%s" %signal))
- res.append( MultiContentEntryText(pos=(0, 40), size=(180, 20), font=1, flags=RT_HALIGN_LEFT, text=_("Max. Bitrate: %s") %maxrate ))
- res.append( MultiContentEntryText(pos=(190, 40), size=(180, 20), font=1, flags=RT_HALIGN_CENTER, text=_("Encrypted: %s") %e ))
- res.append( MultiContentEntryText(pos=(345, 40), size=(190, 20), font=1, flags=RT_HALIGN_RIGHT, text=_("Interface: %s") %iface ))
- return res
-
-
- def reload(self):
- aps = self.w.getNetworkList()
-
- self.list = []
- self.aplist = []
- if aps is not None:
- print "[Wlan.py] got Accespoints!"
- for ap in aps:
- a = aps[ap]
- if a['active']:
- if a['essid'] != '':
- # a['essid'] = a['bssid']
- self.list.append( (a['essid'], a['bssid'], a['encrypted'], a['iface'], a['maxrate'], a['signal']) )
- #self.aplist.append( a['essid'])
- if self.oldlist is not None:
- for entry in self.oldlist:
- if entry not in self.list:
- self.list.append(entry)
-
- if len(self.list):
- for entry in self.list:
- self.aplist.append( entry[0])
- self.length = len(self.list)
- self.oldlist = self.list
- self.l.setList([])
- self.l.setList(self.list)
-
- GUI_WIDGET = eListbox
-
-
- def getCurrent(self):
- return self.l.getCurrentSelection()
-
-
- def postWidgetCreate(self, instance):
- instance.setContent(self.l)
- instance.setItemHeight(60)
-
-
- def getLength(self):
- return self.length
-
- def getList(self):
- return self.aplist
-
-
class wpaSupplicant:
def __init__(self):
pass
diff --git a/lib/python/Plugins/SystemPlugins/WirelessLan/meta/Makefile.am b/lib/python/Plugins/SystemPlugins/WirelessLan/meta/Makefile.am
new file mode 100755
index 00000000..6bc4aab0
--- /dev/null
+++ b/lib/python/Plugins/SystemPlugins/WirelessLan/meta/Makefile.am
@@ -0,0 +1,5 @@
+installdir = $(datadir)/meta/
+
+dist_install_DATA = plugin_wirelesslan.xml
+
+EXTRA_DIST = wirelesslan_de.jpg wirelesslan_en.jpg
diff --git a/lib/python/Plugins/SystemPlugins/WirelessLan/meta/plugin_wirelesslan.xml b/lib/python/Plugins/SystemPlugins/WirelessLan/meta/plugin_wirelesslan.xml
new file mode 100755
index 00000000..1f882b32
--- /dev/null
+++ b/lib/python/Plugins/SystemPlugins/WirelessLan/meta/plugin_wirelesslan.xml
@@ -0,0 +1,27 @@
+<default>
+ <prerequisites>
+ <tag type="Network" />
+ <tag type="System" />
+ </prerequisites>
+ <info language="en">
+ <author>Dream Multimedia</author>
+ <name>WirelessLan</name>
+ <packagename>enigma2-plugin-systemplugins-wirelesslan</packagename>
+ <shortdescription>Configure your WLAN network interface</shortdescription>
+ <description>The WirelessLan extensions helps you configuring your WLAN network interface.</description>
+ <screenshot src="http://www.dreamboxupdate.com/preview/plugin_wirelesslan_en.jpg" />
+ </info>
+ <info language="de">
+ <author>Dream Multimedia</author>
+ <name>WirelessLan</name>
+ <packagename>enigma2-plugin-systemplugins-wirelesslan</packagename>
+ <shortdescription>Konfigurieren Sie Ihr WLAN Netzwerk.</shortdescription>
+ <description>Die WirelessLan Erweiterung hilft Ihnen beim konfigurieren Ihres WLAN Netzwerkes..</description>
+ <screenshot src="http://www.dreamboxupdate.com/preview/plugin_wirelesslan_de.jpg" />
+ </info>
+
+ <files type="package"> <!-- without version, without .ipk -->
+ <file type="package" name="enigma2-plugin-systemplugins-wirelesslan" />
+ </files>
+
+</default>
diff --git a/lib/python/Plugins/SystemPlugins/WirelessLan/meta/wirelesslan_de.jpg b/lib/python/Plugins/SystemPlugins/WirelessLan/meta/wirelesslan_de.jpg
new file mode 100755
index 00000000..38695418
--- /dev/null
+++ b/lib/python/Plugins/SystemPlugins/WirelessLan/meta/wirelesslan_de.jpg
Binary files differ
diff --git a/lib/python/Plugins/SystemPlugins/WirelessLan/meta/wirelesslan_en.jpg b/lib/python/Plugins/SystemPlugins/WirelessLan/meta/wirelesslan_en.jpg
new file mode 100755
index 00000000..fe4fa97d
--- /dev/null
+++ b/lib/python/Plugins/SystemPlugins/WirelessLan/meta/wirelesslan_en.jpg
Binary files differ
diff --git a/lib/python/Plugins/SystemPlugins/WirelessLan/plugin.py b/lib/python/Plugins/SystemPlugins/WirelessLan/plugin.py
index b7a64b9a..c8568b98 100755
--- a/lib/python/Plugins/SystemPlugins/WirelessLan/plugin.py
+++ b/lib/python/Plugins/SystemPlugins/WirelessLan/plugin.py
@@ -4,6 +4,7 @@ from Components.ActionMap import ActionMap, NumberActionMap
from Components.Pixmap import Pixmap,MultiPixmap
from Components.Label import Label
from Components.Sources.StaticText import StaticText
+from Components.Sources.List import List
from Components.MenuList import MenuList
from Components.config import config, getConfigListEntry, ConfigYesNo, NoSave, ConfigSubsection, ConfigText, ConfigSelection, ConfigPassword
from Components.ConfigList import ConfigListScreen
@@ -11,8 +12,9 @@ from Components.Network import Network, iNetwork
from Components.Console import Console
from Plugins.Plugin import PluginDescriptor
from os import system, path as os_path, listdir
-from Wlan import Wlan, WlanList, wpaSupplicant
-from Wlan import Status, iStatus
+from Tools.Directories import resolveFilename, SCOPE_PLUGINS, SCOPE_SKIN_IMAGE
+from Tools.LoadPixmap import LoadPixmap
+from Wlan import Wlan, wpaSupplicant, iStatus
plugin_path = "/usr/lib/enigma2/python/Plugins/SystemPlugins/WirelessLan"
@@ -39,37 +41,35 @@ config.plugins.wlan.encryption.psk = NoSave(ConfigPassword(default = "mysecurewl
class WlanStatus(Screen):
skin = """
- <screen position="center,center" size="560,400" title="Wireless Network State" >
- <ePixmap pixmap="skin_default/buttons/red.png" position="0,0" size="140,40" alphatest="on" />
- <widget source="key_red" render="Label" position="0,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" />
-
- <widget source="LabelBSSID" render="Label" position="10,60" size="250,25" valign="left" font="Regular;20" transparent="1" foregroundColor="#FFFFFF" />
- <widget source="LabelESSID" render="Label" position="10,100" size="250,25" valign="center" font="Regular;20" transparent="1" foregroundColor="#FFFFFF" />
- <widget source="LabelQuality" render="Label" position="10,140" size="250,25" valign="center" font="Regular;20" transparent="1" foregroundColor="#FFFFFF" />
- <widget source="LabelSignal" render="Label" position="10,180" size="250,25" valign="center" font="Regular;20" transparent="1" foregroundColor="#FFFFFF" />
- <widget source="LabelBitrate" render="Label" position="10,220" size="250,25" valign="center" font="Regular;20" transparent="1" foregroundColor="#FFFFFF" />
- <widget source="LabelEnc" render="Label" position="10,260" size="250,25" valign="center" font="Regular;20" transparent="1" foregroundColor="#FFFFFF" />
-
- <widget source="BSSID" render="Label" position="320,60" size="180,25" valign="center" font="Regular;20" transparent="1" foregroundColor="#FFFFFF" />
- <widget source="ESSID" render="Label" position="320,100" size="180,25" valign="center" font="Regular;20" transparent="1" foregroundColor="#FFFFFF" />
- <widget source="quality" render="Label" position="320,140" size="180,25" valign="center" font="Regular;20" transparent="1" foregroundColor="#FFFFFF" />
- <widget source="signal" render="Label" position="320,180" size="180,25" valign="center" font="Regular;20" transparent="1" foregroundColor="#FFFFFF" />
- <widget source="bitrate" render="Label" position="320,220" size="180,25" valign="center" font="Regular;20" transparent="1" foregroundColor="#FFFFFF" />
- <widget source="enc" render="Label" position="320,260" size="180,25" valign="center" font="Regular;20" transparent="1" foregroundColor="#FFFFFF" />
-
- <ePixmap pixmap="skin_default/div-h.png" position="0,350" zPosition="1" size="560,2" />
- <widget source="IFtext" render="Label" position="10,355" size="120,21" zPosition="10" font="Regular;20" halign="left" backgroundColor="#25062748" transparent="1" />
- <widget source="IF" render="Label" position="120,355" size="400,21" zPosition="10" font="Regular;20" halign="left" backgroundColor="#25062748" transparent="1" />
- <widget source="Statustext" render="Label" position="10,375" size="115,21" zPosition="10" font="Regular;20" halign="left" backgroundColor="#25062748" transparent="1"/>
- <widget name="statuspic" pixmaps="skin_default/buttons/button_green.png,skin_default/buttons/button_green_off.png" position="130,380" zPosition="10" size="15,16" transparent="1" alphatest="on"/>
- </screen>
- """
+ <screen name="WlanStatus" position="center,center" size="560,400" title="Wireless Network State" >
+ <ePixmap pixmap="skin_default/buttons/red.png" position="0,0" size="140,40" alphatest="on" />
+ <widget source="key_red" render="Label" position="0,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" />
+
+ <widget source="LabelBSSID" render="Label" position="10,60" size="250,25" valign="left" font="Regular;20" transparent="1" foregroundColor="#FFFFFF" />
+ <widget source="LabelESSID" render="Label" position="10,100" size="250,25" valign="center" font="Regular;20" transparent="1" foregroundColor="#FFFFFF" />
+ <widget source="LabelQuality" render="Label" position="10,140" size="250,25" valign="center" font="Regular;20" transparent="1" foregroundColor="#FFFFFF" />
+ <widget source="LabelSignal" render="Label" position="10,180" size="250,25" valign="center" font="Regular;20" transparent="1" foregroundColor="#FFFFFF" />
+ <widget source="LabelBitrate" render="Label" position="10,220" size="250,25" valign="center" font="Regular;20" transparent="1" foregroundColor="#FFFFFF" />
+ <widget source="LabelEnc" render="Label" position="10,260" size="250,25" valign="center" font="Regular;20" transparent="1" foregroundColor="#FFFFFF" />
+
+ <widget source="BSSID" render="Label" position="320,60" size="180,25" valign="center" font="Regular;20" transparent="1" foregroundColor="#FFFFFF" />
+ <widget source="ESSID" render="Label" position="320,100" size="180,25" valign="center" font="Regular;20" transparent="1" foregroundColor="#FFFFFF" />
+ <widget source="quality" render="Label" position="320,140" size="180,25" valign="center" font="Regular;20" transparent="1" foregroundColor="#FFFFFF" />
+ <widget source="signal" render="Label" position="320,180" size="180,25" valign="center" font="Regular;20" transparent="1" foregroundColor="#FFFFFF" />
+ <widget source="bitrate" render="Label" position="320,220" size="180,25" valign="center" font="Regular;20" transparent="1" foregroundColor="#FFFFFF" />
+ <widget source="enc" render="Label" position="320,260" size="180,25" valign="center" font="Regular;20" transparent="1" foregroundColor="#FFFFFF" />
+
+ <ePixmap pixmap="skin_default/div-h.png" position="0,350" zPosition="1" size="560,2" />
+ <widget source="IFtext" render="Label" position="10,355" size="120,21" zPosition="10" font="Regular;20" halign="left" backgroundColor="#25062748" transparent="1" />
+ <widget source="IF" render="Label" position="120,355" size="400,21" zPosition="10" font="Regular;20" halign="left" backgroundColor="#25062748" transparent="1" />
+ <widget source="Statustext" render="Label" position="10,375" size="115,21" zPosition="10" font="Regular;20" halign="left" backgroundColor="#25062748" transparent="1"/>
+ <widget name="statuspic" pixmaps="skin_default/buttons/button_green.png,skin_default/buttons/button_green_off.png" position="130,380" zPosition="10" size="15,16" transparent="1" alphatest="on"/>
+ </screen>"""
def __init__(self, session, iface):
Screen.__init__(self, session)
self.session = session
self.iface = iface
- self.skin = WlanStatus.skin
self["LabelBSSID"] = StaticText(_('Accesspoint:'))
self["LabelESSID"] = StaticText(_('SSID:'))
@@ -114,7 +114,6 @@ class WlanStatus(Screen):
self.setTitle(_("Wireless Network State"))
def resetList(self):
- print "self.iface im resetlist",self.iface
iStatus.getDataForInterface(self.iface,self.getInfoCB)
def getInfoCB(self,data,status):
@@ -131,10 +130,9 @@ class WlanStatus(Screen):
def exit(self):
self.timer.stop()
- self.close()
+ self.close(True)
def updateStatusbar(self):
- print "self.iface im updateStatusbar",self.iface
self["BSSID"].setText(_("Please wait..."))
self["ESSID"].setText(_("Please wait..."))
self["quality"].setText(_("Please wait..."))
@@ -155,37 +153,55 @@ class WlanStatus(Screen):
class WlanScan(Screen):
skin = """
- <screen position="center,center" size="560,400" title="Choose a Wireless Network" >
- <ePixmap pixmap="skin_default/buttons/red.png" position="0,0" size="140,40" alphatest="on" />
- <ePixmap pixmap="skin_default/buttons/green.png" position="140,0" size="140,40" alphatest="on" />
- <ePixmap pixmap="skin_default/buttons/yellow.png" position="280,0" size="140,40" alphatest="on" />
- <widget source="key_red" render="Label" position="0,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" />
- <widget source="key_green" render="Label" position="140,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" transparent="1" />
- <widget source="key_yellow" render="Label" position="280,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#a08500" transparent="1" />
- <widget name="list" position="5,50" size="550,280" scrollbarMode="showOnDemand" />
- <ePixmap pixmap="skin_default/div-h.png" position="0,340" zPosition="1" size="560,2" />
- <widget source="info" render="Label" position="0,350" size="560,50" font="Regular;24" halign="center" valign="center" backgroundColor="#25062748" transparent="1" />
- </screen>
- """
+ <screen name="WlanScan" position="center,center" size="560,400" title="Choose a Wireless Network" >
+ <ePixmap pixmap="skin_default/buttons/red.png" position="0,0" size="140,40" alphatest="on" />
+ <ePixmap pixmap="skin_default/buttons/green.png" position="140,0" size="140,40" alphatest="on" />
+ <ePixmap pixmap="skin_default/buttons/yellow.png" position="280,0" size="140,40" alphatest="on" />
+ <widget source="key_red" render="Label" position="0,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" />
+ <widget source="key_green" render="Label" position="140,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" transparent="1" />
+ <widget source="key_yellow" render="Label" position="280,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#a08500" transparent="1" />
+ <widget source="list" render="Listbox" position="5,40" size="550,300" scrollbarMode="showOnDemand">
+ <convert type="TemplatedMultiContent">
+ {"template": [
+ MultiContentEntryText(pos = (0, 0), size = (550, 30), font=0, flags = RT_HALIGN_LEFT, text = 0), # index 0 is the essid
+ MultiContentEntryText(pos = (0, 30), size = (175, 20), font=1, flags = RT_HALIGN_LEFT, text = 5), # index 5 is the interface
+ MultiContentEntryText(pos = (175, 30), size = (175, 20), font=1, flags = RT_HALIGN_LEFT, text = 4), # index 0 is the encryption
+ MultiContentEntryText(pos = (350, 0), size = (200, 20), font=1, flags = RT_HALIGN_LEFT, text = 2), # index 0 is the signal
+ MultiContentEntryText(pos = (350, 30), size = (200, 20), font=1, flags = RT_HALIGN_LEFT, text = 3), # index 0 is the maxrate
+ MultiContentEntryPixmapAlphaTest(pos = (0, 52), size = (550, 2), png = 6), # index 6 is the div pixmap
+ ],
+ "fonts": [gFont("Regular", 28),gFont("Regular", 18)],
+ "itemHeight": 54
+ }
+ </convert>
+ </widget>
+ <ePixmap pixmap="skin_default/div-h.png" position="0,340" zPosition="1" size="560,2" />
+ <widget source="info" render="Label" position="0,350" size="560,50" font="Regular;24" halign="center" valign="center" backgroundColor="#25062748" transparent="1" />
+ </screen>"""
def __init__(self, session, iface):
Screen.__init__(self, session)
self.session = session
self.iface = iface
- self.skin = WlanScan.skin
self.skin_path = plugin_path
self.oldInterfaceState = iNetwork.getAdapterAttribute(self.iface, "up")
+ self.APList = None
+ self.newAPList = None
+ self.WlanList = None
+ self.cleanList = None
+ self.oldlist = None
+ self.listLenght = None
+ self.rescanTimer = eTimer()
+ self.rescanTimer.callback.append(self.rescanTimerFired)
self["info"] = StaticText()
- self.list = []
- self["list"] = WlanList(self.session, self.iface)
+ self.list = []
+ self["list"] = List(self.list)
- self.setInfo()
-
self["key_red"] = StaticText(_("Close"))
self["key_green"] = StaticText(_("Connect"))
- self["key_yellow"] = StaticText(_("Refresh"))
+ self["key_yellow"] = StaticText()
self["actions"] = NumberActionMap(["WizardActions", "InputActions", "EPGSelectActions"],
{
@@ -195,63 +211,161 @@ class WlanScan(Screen):
self["shortcuts"] = ActionMap(["ShortcutActions"],
{
- "red": self.cancel,
+ "red": self.cancel,
"green": self.select,
- "yellow": self.rescan,
})
self.onLayoutFinish.append(self.layoutFinished)
+ self.getAccessPoints(refresh = False)
def layoutFinished(self):
self.setTitle(_("Choose a wireless network"))
def select(self):
cur = self["list"].getCurrent()
- #print "CURRENT",cur
if cur is not None:
+ self.rescanTimer.stop()
+ del self.rescanTimer
if cur[1] is not None:
- essid = cur[0]
- if essid == '':
- essid = cur[1]
- encrypted = cur[2]
- self.close(essid,self["list"].getList())
+ essid = cur[1]
+ self.close(essid,self.getWlanList())
else:
self.close(None,None)
else:
+ self.rescanTimer.stop()
+ del self.rescanTimer
self.close(None,None)
def WlanSetupClosed(self, *ret):
if ret[0] == 2:
+ self.rescanTimer.stop()
+ del self.rescanTimer
self.close(None)
- def rescan(self):
- self["list"].reload()
- self.setInfo()
-
def cancel(self):
if self.oldInterfaceState is False:
+ iNetwork.setAdapterAttribute(self.iface, "up", False)
iNetwork.deactivateInterface(self.iface,self.deactivateInterfaceCB)
else:
+ self.rescanTimer.stop()
+ del self.rescanTimer
self.close(None)
def deactivateInterfaceCB(self,data):
if data is not None:
if data is True:
- iNetwork.getInterfaces(self.cancelCB)
-
- def cancelCB(self,data):
- if data is not None:
- if data is True:
+ self.rescanTimer.stop()
+ del self.rescanTimer
self.close(None)
- def setInfo(self):
- length = self["list"].getLength()
+ def rescanTimerFired(self):
+ self.rescanTimer.stop()
+ self.updateAPList()
+
+ def buildEntryComponent(self, essid, bssid, encrypted, iface, maxrate, signal):
+ divpng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_SKIN_IMAGE, "skin_default/div-h.png"))
+ encryption = encrypted and _("Yes") or _("No")
+ if bssid == 'hidden...':
+ return((essid, bssid, None, None, None, None, divpng))
+ else:
+ return((essid, bssid, _("Signal: ") + str(signal), _("Max. Bitrate: ") + str(maxrate), _("Encrypted: ") + encryption, _("Interface: ") + str(iface), divpng))
+
+ def updateAPList(self):
+ self.oldlist = []
+ self.oldlist = self.cleanList
+ self.newAPList = []
+ newList = []
+ tmpList = []
+ newListIndex = None
+ currentListEntry = None
+ currentListIndex = None
+ newList = self.getAccessPoints(refresh = True)
+ for oldentry in self.oldlist:
+ if oldentry not in newList:
+ newList.append(oldentry)
+
+ for newentry in newList:
+ if newentry[1] == "hidden...":
+ continue
+ tmpList.append(newentry)
+
+ if len(tmpList):
+ if "hidden..." not in tmpList:
+ tmpList.append( ( _("enter hidden network SSID"), "hidden...", True, self.iface, _("unavailable"), "" ) )
+
+ for entry in tmpList:
+ self.newAPList.append(self.buildEntryComponent( entry[0], entry[1], entry[2], entry[3], entry[4], entry[5] ))
+
+ currentListEntry = self["list"].getCurrent()
+ idx = 0
+ for entry in self.newAPList:
+ if entry == currentListEntry:
+ newListIndex = idx
+ idx +=1
+ self['list'].setList(self.newAPList)
+ self["list"].setIndex(newListIndex)
+ self["list"].updateList(self.newAPList)
+ self.listLenght = len(self.newAPList)
+ self.buildWlanList()
+ self.setInfo()
+
+ def getAccessPoints(self, refresh = False):
+ self.APList = []
+ self.cleanList = []
+ self.w = Wlan(self.iface)
+ 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']:
+ tmpList.append( (a['essid'], a['bssid']) )
+ compList.append( (a['essid'], a['bssid'], a['encrypted'], a['iface'], a['maxrate'], a['signal']) )
+
+ for entry in tmpList:
+ if entry[0] == "":
+ for compentry in compList:
+ if compentry[1] == entry[1]:
+ compList.remove(compentry)
+ for entry in compList:
+ self.cleanList.append( ( entry[0], entry[1], entry[2], entry[3], entry[4], entry[5] ) )
+
+ if "hidden..." not in self.cleanList:
+ self.cleanList.append( ( _("enter hidden network SSID"), "hidden...", True, self.iface, _("unavailable"), "" ) )
+
+ for entry in self.cleanList:
+ self.APList.append(self.buildEntryComponent( entry[0], entry[1], entry[2], entry[3], entry[4], entry[5] ))
+
+ if refresh is False:
+ self['list'].setList(self.APList)
+ self.listLenght = len(self.APList)
+ self.setInfo()
+ self.rescanTimer.start(5000)
+ return self.cleanList
+
+ def setInfo(self):
+ length = self.getLength()
if length == 0:
self["info"].setText(_("No wireless networks found! Please refresh."))
elif length == 1:
self["info"].setText(_("1 wireless network found!"))
else:
- self["info"].setText(str(length)+_(" wireless networks found!"))
+ self["info"].setText(str(length)+_(" wireless networks found!"))
+
+ def buildWlanList(self):
+ self.WlanList = []
+ currList = []
+ currList = self['list'].list
+ for entry in currList:
+ self.WlanList.append( (entry[1], entry[0]) )
+
+ def getLength(self):
+ return self.listLenght
+
+ def getWlanList(self):
+ return self.WlanList
def WlanStatusScreenMain(session, iface):
@@ -259,13 +373,11 @@ def WlanStatusScreenMain(session, iface):
def callFunction(iface):
-
w = Wlan(iface)
i = w.getWirelessInterfaces()
if i:
if iface in i:
return WlanStatusScreenMain
-
return None
diff --git a/lib/python/Plugins/newplugin.py b/lib/python/Plugins/newplugin.py
index 48bb28ea..c1c6f948 100644
--- a/lib/python/Plugins/newplugin.py
+++ b/lib/python/Plugins/newplugin.py
@@ -101,8 +101,8 @@ for where in targetlist:
importlist.append(where[0])
file.write("""from Screens.Screen import Screen
-from Plugins.Plugin import PluginDescriptor, %s
-""" % ', '.join(importlist))
+from Plugins.Plugin import PluginDescriptor
+""")
mainlist = []
for count in range(len(targetlist)):
diff --git a/lib/python/Screens/ChannelSelection.py b/lib/python/Screens/ChannelSelection.py
index 0432823b..5fbfd591 100644
--- a/lib/python/Screens/ChannelSelection.py
+++ b/lib/python/Screens/ChannelSelection.py
@@ -21,10 +21,13 @@ profile("ChannelSelection.py 2.3")
from Components.Input import Input
profile("ChannelSelection.py 3")
from Components.ParentalControl import parentalControl
+from Components.ChoiceList import ChoiceList, ChoiceEntryComponent
+from Components.SystemInfo import SystemInfo
from Screens.InputBox import InputBox, PinInput
from Screens.MessageBox import MessageBox
from Screens.ServiceInfo import ServiceInfo
profile("ChannelSelection.py 4")
+from Screens.PictureInPicture import PictureInPicture
from Screens.RdsDisplay import RassInteractive
from ServiceReference import ServiceReference
from Tools.BoundFunction import boundFunction
@@ -69,9 +72,9 @@ OFF = 0
EDIT_BOUQUET = 1
EDIT_ALTERNATIVES = 2
-def append_when_current_valid(current, menu, args, level = 0):
+def append_when_current_valid(current, menu, args, level = 0, key = ""):
if current and current.valid() and level <= config.usage.setup_level.index:
- menu.append(args)
+ menu.append(ChoiceEntryComponent(key, args))
class ChannelContextMenu(Screen):
def __init__(self, session, csel):
@@ -80,13 +83,15 @@ class ChannelContextMenu(Screen):
self.csel = csel
self.bsel = None
- self["actions"] = ActionMap(["OkCancelActions"],
+ self["actions"] = ActionMap(["OkCancelActions", "ColorActions", "NumberActions"],
{
"ok": self.okbuttonClick,
- "cancel": self.cancelClick
+ "cancel": self.cancelClick,
+ "blue": self.showServiceInPiP
})
menu = [ ]
+ self.pipAvailable = False
current = csel.getCurrentSelection()
current_root = csel.getRoot()
current_sel_path = current.getPath()
@@ -122,8 +127,11 @@ class ChannelContextMenu(Screen):
append_when_current_valid(current, menu, (_("remove entry"), self.removeCurrentService), level = 0)
if current_root and current_root.getPath().find("flags == %d" %(FLAG_SERVICE_NEW_FOUND)) != -1:
append_when_current_valid(current, menu, (_("remove new found flag"), self.removeNewFoundFlag), level = 0)
+ if isPlayable and SystemInfo.get("NumVideoDecoders", 1) > 1:
+ append_when_current_valid(current, menu, (_("Activate Picture in Picture"), self.showServiceInPiP), level = 0, key = "blue")
+ self.pipAvailable = True
else:
- menu.append((_("add bouquet"), self.showBouquetInputBox))
+ menu.append(ChoiceEntryComponent(text = (_("add bouquet"), self.showBouquetInputBox)))
append_when_current_valid(current, menu, (_("remove entry"), self.removeBouquet), level = 0)
if inBouquet: # current list is editable?
@@ -131,7 +139,7 @@ class ChannelContextMenu(Screen):
if not csel.movemode:
append_when_current_valid(current, menu, (_("enable move mode"), self.toggleMoveMode), level = 1)
if not inBouquetRootList and current_root and not (current_root.flags & eServiceReference.isGroup):
- menu.append((_("add marker"), self.showMarkerInputBox))
+ menu.append(ChoiceEntryComponent(text = (_("add marker"), self.showMarkerInputBox)))
if haveBouquets:
append_when_current_valid(current, menu, (_("enable bouquet edit"), self.bouquetMarkStart), level = 0)
else:
@@ -156,11 +164,11 @@ class ChannelContextMenu(Screen):
append_when_current_valid(current, menu, (_("end alternatives edit"), self.bouquetMarkEnd), level = 0)
append_when_current_valid(current, menu, (_("abort alternatives edit"), self.bouquetMarkAbort), level = 0)
- menu.append((_("back"), self.cancelClick))
- self["menu"] = MenuList(menu)
+ menu.append(ChoiceEntryComponent(text = (_("back"), self.cancelClick)))
+ self["menu"] = ChoiceList(menu)
def okbuttonClick(self):
- self["menu"].getCurrent()[1]()
+ self["menu"].getCurrent()[0][1]()
def cancelClick(self):
self.close(False)
@@ -189,6 +197,23 @@ class ChannelContextMenu(Screen):
self.close()
else:
self.session.openWithCallback(self.close, MessageBox, _("The pin code you entered is wrong."), MessageBox.TYPE_ERROR)
+
+ def showServiceInPiP(self):
+ if not self.pipAvailable:
+ return
+ if self.session.pipshown:
+ del self.session.pip
+ self.session.pip = self.session.instantiateDialog(PictureInPicture)
+ self.session.pip.show()
+ newservice = self.csel.servicelist.getCurrent()
+ if self.session.pip.playService(newservice):
+ self.session.pipshown = True
+ self.session.pip.servicePath = self.csel.getCurrentServicePath()
+ self.close(True)
+ else:
+ self.session.pipshown = False
+ del self.session.pip
+ self.session.openWithCallback(self.close, MessageBox, _("Could not open Picture in Picture"), MessageBox.TYPE_ERROR)
def addServiceToBouquetSelected(self):
bouquets = self.csel.getBouquetList()
@@ -648,7 +673,11 @@ class ChannelSelectionEdit:
self.entry_marked = True
def doContext(self):
- self.session.open(ChannelContextMenu, self)
+ self.session.openWithCallback(self.exitContext, ChannelContextMenu, self)
+
+ def exitContext(self, close = False):
+ if close:
+ self.cancel()
MODE_TV = 0
MODE_RADIO = 1
diff --git a/lib/python/Screens/EpgSelection.py b/lib/python/Screens/EpgSelection.py
index 3dde7e22..f8edba11 100644
--- a/lib/python/Screens/EpgSelection.py
+++ b/lib/python/Screens/EpgSelection.py
@@ -6,6 +6,7 @@ from Components.Label import Label
from Components.EpgList import EPGList, EPG_TYPE_SINGLE, EPG_TYPE_SIMILAR, EPG_TYPE_MULTI
from Components.ActionMap import ActionMap
from Components.TimerSanityCheck import TimerSanityCheck
+from Components.UsageConfig import preferredTimerPath
from Components.Sources.ServiceEvent import ServiceEvent
from Components.Sources.Event import Event
from Screens.TimerEdit import TimerSanityConflict
@@ -235,7 +236,7 @@ class EPGSelection(Screen):
self.session.openWithCallback(cb_func, MessageBox, _("Do you really want to delete %s?") % event.getEventName())
break
else:
- newEntry = RecordTimerEntry(serviceref, checkOldTimers = True, *parseEvent(event))
+ newEntry = RecordTimerEntry(serviceref, checkOldTimers = True, dirname = preferredTimerPath(), *parseEvent(event))
self.session.openWithCallback(self.finishedAdd, TimerEntry, newEntry)
def finishedAdd(self, answer):
diff --git a/lib/python/Screens/EventView.py b/lib/python/Screens/EventView.py
index c1ffb585..cced3ceb 100644
--- a/lib/python/Screens/EventView.py
+++ b/lib/python/Screens/EventView.py
@@ -6,6 +6,7 @@ from Components.Button import Button
from Components.Label import Label
from Components.ScrollLabel import ScrollLabel
from Components.TimerList import TimerList
+from Components.UsageConfig import preferredTimerPath
from enigma import eEPGCache, eTimer, eServiceReference
from RecordTimer import RecordTimerEntry, parseEvent, AFTEREVENT
from TimerEntry import TimerEntry
@@ -85,7 +86,7 @@ class EventViewBase:
self.session.openWithCallback(cb_func, MessageBox, _("Do you really want to delete %s?") % event.getEventName())
break
else:
- newEntry = RecordTimerEntry(self.currentService, checkOldTimers = True, *parseEvent(self.event))
+ newEntry = RecordTimerEntry(self.currentService, checkOldTimers = True, dirname = preferredTimerPath(), *parseEvent(self.event))
self.session.openWithCallback(self.finishedAdd, TimerEntry, newEntry)
def finishedAdd(self, answer):
diff --git a/lib/python/Screens/InfoBar.py b/lib/python/Screens/InfoBar.py
index 59cc21d3..5b061245 100644
--- a/lib/python/Screens/InfoBar.py
+++ b/lib/python/Screens/InfoBar.py
@@ -12,7 +12,7 @@ profile("LOAD:InfoBarGenerics")
from Screens.InfoBarGenerics import InfoBarShowHide, \
InfoBarNumberZap, InfoBarChannelSelection, InfoBarMenu, InfoBarRdsDecoder, \
InfoBarEPG, InfoBarSeek, InfoBarInstantRecord, \
- InfoBarAudioSelection, InfoBarAdditionalInfo, InfoBarNotifications, InfoBarDish, \
+ InfoBarAudioSelection, InfoBarAdditionalInfo, InfoBarNotifications, InfoBarDish, InfoBarUnhandledKey, \
InfoBarSubserviceSelection, InfoBarShowMovies, InfoBarTimeshift, \
InfoBarServiceNotifications, InfoBarPVRState, InfoBarCueSheetSupport, InfoBarSimpleEventView, \
InfoBarSummarySupport, InfoBarMoviePlayerSummarySupport, InfoBarTimeshiftState, InfoBarTeletextPlugin, InfoBarExtensions, \
@@ -29,7 +29,7 @@ from Screens.HelpMenu import HelpableScreen
class InfoBar(InfoBarBase, InfoBarShowHide,
InfoBarNumberZap, InfoBarChannelSelection, InfoBarMenu, InfoBarEPG, InfoBarRdsDecoder,
InfoBarInstantRecord, InfoBarAudioSelection,
- HelpableScreen, InfoBarAdditionalInfo, InfoBarNotifications, InfoBarDish,
+ HelpableScreen, InfoBarAdditionalInfo, InfoBarNotifications, InfoBarDish, InfoBarUnhandledKey,
InfoBarSubserviceSelection, InfoBarTimeshift, InfoBarSeek,
InfoBarSummarySupport, InfoBarTimeshiftState, InfoBarTeletextPlugin, InfoBarExtensions,
InfoBarPiP, InfoBarPlugins, InfoBarSubtitleSupport, InfoBarServiceErrorPopupSupport, InfoBarJobman,
@@ -52,7 +52,7 @@ class InfoBar(InfoBarBase, InfoBarShowHide,
for x in HelpableScreen, \
InfoBarBase, InfoBarShowHide, \
InfoBarNumberZap, InfoBarChannelSelection, InfoBarMenu, InfoBarEPG, InfoBarRdsDecoder, \
- InfoBarInstantRecord, InfoBarAudioSelection, \
+ InfoBarInstantRecord, InfoBarAudioSelection, InfoBarUnhandledKey, \
InfoBarAdditionalInfo, InfoBarNotifications, InfoBarDish, InfoBarSubserviceSelection, \
InfoBarTimeshift, InfoBarSeek, InfoBarSummarySupport, InfoBarTimeshiftState, \
InfoBarTeletextPlugin, InfoBarExtensions, InfoBarPiP, InfoBarSubtitleSupport, InfoBarJobman, \
@@ -212,7 +212,6 @@ class MoviePlayer(InfoBarBase, InfoBarShowHide, \
return
if answer in ("quit", "quitanddeleteconfirmed"):
- config.movielist.last_videodir.cancel()
self.close()
elif answer == "movielist":
ref = self.session.nav.getCurrentlyPlayingServiceReference()
diff --git a/lib/python/Screens/InfoBarGenerics.py b/lib/python/Screens/InfoBarGenerics.py
index 2cbfeb73..7ae0b123 100644
--- a/lib/python/Screens/InfoBarGenerics.py
+++ b/lib/python/Screens/InfoBarGenerics.py
@@ -10,6 +10,7 @@ from Components.ServiceEventTracker import ServiceEventTracker
from Components.Sources.Boolean import Boolean
from Components.config import config, ConfigBoolean, ConfigClock
from Components.SystemInfo import SystemInfo
+from Components.UsageConfig import preferredInstantRecordPath, defaultMoviePath
from EpgSelection import EPGSelection
from Plugins.Plugin import PluginDescriptor
@@ -25,13 +26,14 @@ from Screens.PictureInPicture import PictureInPicture
from Screens.SubtitleDisplay import SubtitleDisplay
from Screens.RdsDisplay import RdsInfoDisplay, RassInteractive
from Screens.TimeDateInput import TimeDateInput
+from Screens.UnhandledKey import UnhandledKey
from ServiceReference import ServiceReference
from Tools import Notifications
-from Tools.Directories import SCOPE_HDD, resolveFilename, fileExists
+from Tools.Directories import fileExists
from enigma import eTimer, eServiceCenter, eDVBServicePMTHandler, iServiceInformation, \
- iPlayableService, eServiceReference, eEPGCache
+ iPlayableService, eServiceReference, eEPGCache, eActionMap
from time import time, localtime, strftime
from os import stat as os_stat
@@ -46,6 +48,39 @@ class InfoBarDish:
def __init__(self):
self.dishDialog = self.session.instantiateDialog(Dish)
+class InfoBarUnhandledKey:
+ def __init__(self):
+ self.unhandledKeyDialog = self.session.instantiateDialog(UnhandledKey)
+ self.hideUnhandledKeySymbolTimer = eTimer()
+ self.hideUnhandledKeySymbolTimer.callback.append(self.unhandledKeyDialog.hide)
+ self.checkUnusedTimer = eTimer()
+ self.checkUnusedTimer.callback.append(self.checkUnused)
+ self.onLayoutFinish.append(self.unhandledKeyDialog.hide)
+ eActionMap.getInstance().bindAction('', -0x7FFFFFFF, self.actionA) #highest prio
+ eActionMap.getInstance().bindAction('', 0x7FFFFFFF, self.actionB) #lowest prio
+ self.flags = (1<<1);
+ self.uflags = 0;
+
+ #this function is called on every keypress!
+ def actionA(self, key, flag):
+ if flag != 4:
+ if self.flags & (1<<1):
+ self.flags = self.uflags = 0
+ self.flags |= (1<<flag)
+ if flag == 1: # break
+ self.checkUnusedTimer.start(0, True)
+ return 0
+
+ #this function is only called when no other action has handled this key
+ def actionB(self, key, flag):
+ if flag != 4:
+ self.uflags |= (1<<flag)
+
+ def checkUnused(self):
+ if self.flags == self.uflags:
+ self.unhandledKeyDialog.show()
+ self.hideUnhandledKeySymbolTimer.start(2000, True)
+
class InfoBarShowHide:
""" InfoBar show/hide control, accepts toggleShow and hide actions, might start
fancy animations. """
@@ -690,8 +725,7 @@ class InfoBarSeek:
iPlayableService.evEOF: self.__evEOF,
iPlayableService.evSOF: self.__evSOF,
})
-
- self.minSpeedBackward = useSeekBackHack and 16 or 0
+ self.fast_winding_hint_message_showed = False
class InfoBarSeekActionMap(HelpableActionMap):
def __init__(self, screen, *args, **kwargs):
@@ -739,24 +773,19 @@ class InfoBarSeek:
self.__seekableStatusChanged()
def makeStateForward(self, n):
- minspeed = config.seek.stepwise_minspeed.value
- repeat = int(config.seek.stepwise_repeat.value)
- if minspeed != "Never" and n >= int(minspeed) and repeat > 1:
- return (0, n * repeat, repeat, ">> %dx" % n)
- else:
+# minspeed = config.seek.stepwise_minspeed.value
+# repeat = int(config.seek.stepwise_repeat.value)
+# if minspeed != "Never" and n >= int(minspeed) and repeat > 1:
+# return (0, n * repeat, repeat, ">> %dx" % n)
+# else:
return (0, n, 0, ">> %dx" % n)
def makeStateBackward(self, n):
- minspeed = config.seek.stepwise_minspeed.value
- repeat = int(config.seek.stepwise_repeat.value)
- if self.minSpeedBackward and n < self.minSpeedBackward:
- r = (self.minSpeedBackward - 1)/ n + 1
- if minspeed != "Never" and n >= int(minspeed) and repeat > 1:
- r = max(r, repeat)
- return (0, -n * r, r, "<< %dx" % n)
- elif minspeed != "Never" and n >= int(minspeed) and repeat > 1:
- return (0, -n * repeat, repeat, "<< %dx" % n)
- else:
+# minspeed = config.seek.stepwise_minspeed.value
+# repeat = int(config.seek.stepwise_repeat.value)
+# if minspeed != "Never" and n >= int(minspeed) and repeat > 1:
+# return (0, -n * repeat, repeat, "<< %dx" % n)
+# else:
return (0, -n, 0, "<< %dx" % n)
def makeStateSlowMotion(self, n):
@@ -823,6 +852,7 @@ class InfoBarSeek:
# print "seekable"
def __serviceStarted(self):
+ self.fast_winding_hint_message_showed = False
self.seekstate = self.SEEK_STATE_PLAY
self.__seekableStatusChanged()
@@ -876,7 +906,7 @@ class InfoBarSeek:
if config.seek.on_pause.value == "play":
self.unPauseService()
elif config.seek.on_pause.value == "step":
- self.doSeekRelative(0)
+ self.doSeekRelative(1)
elif config.seek.on_pause.value == "last":
self.setSeekState(self.lastseekstate)
self.lastseekstate = self.SEEK_STATE_PLAY
@@ -913,6 +943,13 @@ class InfoBarSeek:
self.showAfterSeek()
def seekFwd(self):
+ seek = self.getSeek()
+ if seek and not (seek.isCurrentlySeekable() & 2):
+ if not self.fast_winding_hint_message_showed and (seek.isCurrentlySeekable() & 1):
+ self.session.open(MessageBox, _("No fast winding possible yet.. but you can use the number buttons to skip forward/backward!"), MessageBox.TYPE_INFO, timeout=10)
+ self.fast_winding_hint_message_showed = True
+ return
+ return 0 # trade as unhandled action
if self.seekstate == self.SEEK_STATE_PLAY:
self.setSeekState(self.makeStateForward(int(config.seek.enter_forward.value)))
elif self.seekstate == self.SEEK_STATE_PAUSE:
@@ -942,6 +979,13 @@ class InfoBarSeek:
self.setSeekState(self.makeStateSlowMotion(speed))
def seekBack(self):
+ seek = self.getSeek()
+ if seek and not (seek.isCurrentlySeekable() & 2):
+ if not self.fast_winding_hint_message_showed and (seek.isCurrentlySeekable() & 1):
+ self.session.open(MessageBox, _("No fast winding possible yet.. but you can use the number buttons to skip forward/backward!"), MessageBox.TYPE_INFO, timeout=10)
+ self.fast_winding_hint_message_showed = True
+ return
+ return 0 # trade as unhandled action
seekstate = self.seekstate
if seekstate == self.SEEK_STATE_PLAY:
self.setSeekState(self.makeStateBackward(int(config.seek.enter_backward.value)))
@@ -949,7 +993,7 @@ class InfoBarSeek:
self.setSeekState(self.makeStateBackward(int(config.seek.enter_backward.value)))
self.doSeekRelative(-6)
elif seekstate == self.SEEK_STATE_PAUSE:
- self.doSeekRelative(-3)
+ self.doSeekRelative(-1)
elif self.isStateForward(seekstate):
speed = seekstate[1]
if seekstate[2]:
@@ -1212,10 +1256,7 @@ class InfoBarTimeshift:
self.setSeekState(self.SEEK_STATE_PAUSE)
if back:
- self.doSeek(-5) # seek some gops before end
self.ts_rewind_timer.start(200, 1)
- else:
- self.doSeek(-1) # seek 1 gop before end
def rewindService(self):
self.setSeekState(self.makeStateBackward(int(config.seek.enter_backward.value)))
@@ -1484,7 +1525,7 @@ class InfoBarInstantRecord:
if isinstance(serviceref, eServiceReference):
serviceref = ServiceReference(serviceref)
- recording = RecordTimerEntry(serviceref, begin, end, name, description, eventid, dirname = config.movielist.last_videodir.value)
+ recording = RecordTimerEntry(serviceref, begin, end, name, description, eventid, dirname = preferredInstantRecordPath())
recording.dontSave = True
if event is None or limitEvent == False:
@@ -1585,9 +1626,9 @@ class InfoBarInstantRecord:
self.session.nav.RecordTimer.timeChanged(entry)
def instantRecord(self):
- dir = config.movielist.last_videodir.value
- if not fileExists(dir, 'w'):
- dir = resolveFilename(SCOPE_HDD)
+ dir = preferredInstantRecordPath()
+ if not dir or not fileExists(dir, 'w'):
+ dir = defaultMoviePath()
try:
stat = os_stat(dir)
except:
@@ -1669,17 +1710,46 @@ class InfoBarAudioSelection:
else:
break
+ availableKeys = []
+ usedKeys = []
+
if SystemInfo["CanDownmixAC3"]:
- tlist = [(_("AC3 downmix") + " - " +(_("Off"), _("On"))[config.av.downmix_ac3.value and 1 or 0], "CALLFUNC", self.changeAC3Downmix),
- ((_("Left"), _("Stereo"), _("Right"))[self.audioChannel.getCurrentChannel()], "mode"),
- ("--", "")] + tlist
- keys = [ "red", "green", "", "1", "2", "3", "4", "5", "6", "7", "8", "9", "0"] + [""]*n
- selection += 3
- else:
- tlist = [((_("Left"), _("Stereo"), _("Right"))[self.audioChannel.getCurrentChannel()], "mode"), ("--", "")] + tlist
- keys = [ "red", "", "1", "2", "3", "4", "5", "6", "7", "8", "9", "0"] + [""]*n
+ flist = [(_("AC3 downmix") + " - " +(_("Off"), _("On"))[config.av.downmix_ac3.value and 1 or 0], "CALLFUNC", self.changeAC3Downmix),
+ ((_("Left"), _("Stereo"), _("Right"))[self.audioChannel.getCurrentChannel()], "mode")]
+ usedKeys.extend(["red", "green"])
+ availableKeys.extend(["yellow", "blue"])
selection += 2
- self.session.openWithCallback(self.audioSelected, ChoiceBox, title=_("Select audio track"), list = tlist, selection = selection, keys = keys, skin_name = "AudioTrackSelection")
+ else:
+ flist = [((_("Left"), _("Stereo"), _("Right"))[self.audioChannel.getCurrentChannel()], "mode")]
+ usedKeys.extend(["red"])
+ availableKeys.extend(["green", "yellow", "blue"])
+ selection += 1
+
+ if hasattr(self, "runPlugin"):
+ class PluginCaller:
+ def __init__(self, fnc, *args):
+ self.fnc = fnc
+ self.args = args
+ def __call__(self, *args, **kwargs):
+ self.fnc(*self.args)
+
+ Plugins = [ (p.name, PluginCaller(self.runPlugin, p)) for p in plugins.getPlugins(where = PluginDescriptor.WHERE_AUDIOMENU) ]
+
+ for p in Plugins:
+ selection += 1
+ flist.append((p[0], "CALLFUNC", p[1]))
+ if availableKeys:
+ usedKeys.append(availableKeys[0])
+ del availableKeys[0]
+ else:
+ usedKeys.append("")
+
+ flist.append(("--", ""))
+ usedKeys.append("")
+ selection += 1
+
+ keys = usedKeys + [ "1", "2", "3", "4", "5", "6", "7", "8", "9", "0" ] + [""] * n
+ self.session.openWithCallback(self.audioSelected, ChoiceBox, title=_("Select audio track"), list = flist + tlist, selection = selection, keys = keys, skin_name = "AudioTrackSelection")
else:
del self.audioTracks
diff --git a/lib/python/Screens/LanguageSelection.py b/lib/python/Screens/LanguageSelection.py
index 082daa55..fce10ac5 100644..100755
--- a/lib/python/Screens/LanguageSelection.py
+++ b/lib/python/Screens/LanguageSelection.py
@@ -13,14 +13,14 @@ def _cached(x):
from Screens.Rc import Rc
-from Tools.Directories import resolveFilename, SCOPE_SKIN_IMAGE
+from Tools.Directories import resolveFilename, SCOPE_CURRENT_SKIN
from Tools.LoadPixmap import LoadPixmap
def LanguageEntryComponent(file, name, index):
- png = LoadPixmap(resolveFilename(SCOPE_SKIN_IMAGE, "countries/" + file + ".png"))
+ png = LoadPixmap(resolveFilename(SCOPE_CURRENT_SKIN, "countries/" + file + ".png"))
if png == None:
- png = LoadPixmap(resolveFilename(SCOPE_SKIN_IMAGE, "countries/missing.png"))
+ png = LoadPixmap(resolveFilename(SCOPE_CURRENT_SKIN, "countries/missing.png"))
res = (index, name, png)
return res
diff --git a/lib/python/Screens/LocationBox.py b/lib/python/Screens/LocationBox.py
index 61d7105d..29d94f55 100644
--- a/lib/python/Screens/LocationBox.py
+++ b/lib/python/Screens/LocationBox.py
@@ -289,6 +289,11 @@ class LocationBox(Screen, NumericalTextInput, HelpableScreen):
else:
self["filelist"].refresh()
self.removeBookmark(name, True)
+ val = self.realBookmarks and self.realBookmarks.value
+ if val and name in val:
+ val.remove(name)
+ self.realBookmarks.value = val
+ self.realBookmarks.save()
def up(self):
self[self.currList].up()
diff --git a/lib/python/Screens/Makefile.am b/lib/python/Screens/Makefile.am
index 44994b86..5457bf64 100755
--- a/lib/python/Screens/Makefile.am
+++ b/lib/python/Screens/Makefile.am
@@ -14,5 +14,5 @@ install_PYTHON = \
SubtitleDisplay.py SubservicesQuickzap.py ParentalControlSetup.py NumericalTextInputHelpDialog.py \
SleepTimerEdit.py Ipkg.py RdsDisplay.py Globals.py DefaultWizard.py \
SessionGlobals.py LocationBox.py WizardLanguage.py TaskView.py Rc.py VirtualKeyBoard.py \
- TextBox.py FactoryReset.py
+ TextBox.py FactoryReset.py RecordPaths.py UnhandledKey.py
diff --git a/lib/python/Screens/Menu.py b/lib/python/Screens/Menu.py
index 5f2032f1..bb0709e5 100644
--- a/lib/python/Screens/Menu.py
+++ b/lib/python/Screens/Menu.py
@@ -97,8 +97,12 @@ class Menu(Screen):
def addMenu(self, destList, node):
requires = node.get("requires")
- if requires and not SystemInfo.get(requires, False):
- return
+ if requires:
+ if requires[0] == '!':
+ if SystemInfo.get(requires[1:], False):
+ return
+ elif not SystemInfo.get(requires, False):
+ return
MenuTitle = _(node.get("text", "??").encode("UTF-8"))
entryID = node.get("entryID", "undefined")
weight = node.get("weight", 50)
@@ -120,8 +124,12 @@ class Menu(Screen):
def addItem(self, destList, node):
requires = node.get("requires")
- if requires and not SystemInfo.get(requires, False):
- return
+ if requires:
+ if requires[0] == '!':
+ if SystemInfo.get(requires[1:], False):
+ return
+ elif not SystemInfo.get(requires, False):
+ return
item_text = node.get("text", "").encode("UTF-8")
entryID = node.get("entryID", "undefined")
weight = node.get("weight", 50)
diff --git a/lib/python/Screens/MessageBox.py b/lib/python/Screens/MessageBox.py
index 86bf07d3..f3538b7b 100644
--- a/lib/python/Screens/MessageBox.py
+++ b/lib/python/Screens/MessageBox.py
@@ -12,9 +12,11 @@ class MessageBox(Screen):
TYPE_WARNING = 2
TYPE_ERROR = 3
- def __init__(self, session, text, type = TYPE_YESNO, timeout = -1, close_on_any_key = False, default = True, enable_input = True):
+ def __init__(self, session, text, type = TYPE_YESNO, timeout = -1, close_on_any_key = False, default = True, enable_input = True, msgBoxID = None):
self.type = type
Screen.__init__(self, session)
+
+ self.msgBoxID = msgBoxID
self["text"] = Label(text)
self["Text"] = StaticText(text)
diff --git a/lib/python/Screens/MovieSelection.py b/lib/python/Screens/MovieSelection.py
index 174a4f07..0468f8a0 100644
--- a/lib/python/Screens/MovieSelection.py
+++ b/lib/python/Screens/MovieSelection.py
@@ -7,8 +7,9 @@ from Components.DiskInfo import DiskInfo
from Components.Pixmap import Pixmap
from Components.Label import Label
from Components.PluginComponent import plugins
-from Components.config import config, ConfigSubsection, ConfigText, ConfigInteger, ConfigLocations
+from Components.config import config, ConfigSubsection, ConfigText, ConfigInteger, ConfigLocations, ConfigSet
from Components.Sources.ServiceEvent import ServiceEvent
+from Components.UsageConfig import defaultMoviePath
from Plugins.Plugin import PluginDescriptor
@@ -31,6 +32,7 @@ config.movielist.last_timer_videodir = ConfigText(default=resolveFilename(SCOPE_
config.movielist.videodirs = ConfigLocations(default=[resolveFilename(SCOPE_HDD)])
config.movielist.first_tags = ConfigText(default="")
config.movielist.second_tags = ConfigText(default="")
+config.movielist.last_selected_tags = ConfigSet([], default=[])
def setPreferredTagEditor(te):
@@ -168,7 +170,10 @@ class MovieSelection(Screen, HelpableScreen, SelectionEventInfo):
HelpableScreen.__init__(self)
self.tags = [ ]
- self.selected_tags = None
+ if selectedmovie:
+ self.selected_tags = config.movielist.last_selected_tags.value
+ else:
+ self.selected_tags = None
self.selected_tags_ele = None
self.movemode = False
@@ -183,8 +188,8 @@ class MovieSelection(Screen, HelpableScreen, SelectionEventInfo):
self["DescriptionBorder"] = Pixmap()
self["DescriptionBorder"].hide()
- if not pathExists(config.movielist.last_videodir.value):
- config.movielist.last_videodir.value = resolveFilename(SCOPE_HDD)
+ if not fileExists(config.movielist.last_videodir.value):
+ config.movielist.last_videodir.value = defaultMoviePath()
config.movielist.last_videodir.save()
self.current_ref = eServiceReference("2:0:1:0:0:0:0:0:0:0:" + config.movielist.last_videodir.value)
@@ -292,6 +297,7 @@ class MovieSelection(Screen, HelpableScreen, SelectionEventInfo):
self.close(None)
def saveconfig(self):
+ config.movielist.last_selected_tags.value = self.selected_tags
config.movielist.moviesort.save()
config.movielist.listtype.save()
config.movielist.description.save()
@@ -339,8 +345,8 @@ class MovieSelection(Screen, HelpableScreen, SelectionEventInfo):
self["list"].setSortType(type)
def reloadList(self, sel = None, home = False):
- if not pathExists(config.movielist.last_videodir.value):
- path = resolveFilename(SCOPE_HDD)
+ if not fileExists(config.movielist.last_videodir.value):
+ path = defaultMoviePath()
config.movielist.last_videodir.value = path
config.movielist.last_videodir.save()
self.current_ref = eServiceReference("2:0:1:0:0:0:0:0:0:0:" + path)
@@ -370,7 +376,7 @@ class MovieSelection(Screen, HelpableScreen, SelectionEventInfo):
def gotFilename(self, res):
if res is not None and res is not config.movielist.last_videodir.value:
- if pathExists(res):
+ if fileExists(res):
config.movielist.last_videodir.value = res
config.movielist.last_videodir.save()
self.current_ref = eServiceReference("2:0:1:0:0:0:0:0:0:0:" + res)
@@ -392,7 +398,7 @@ class MovieSelection(Screen, HelpableScreen, SelectionEventInfo):
def showTagsN(self, tagele):
if not self.tags:
self.showTagWarning()
- elif not tagele or self.selected_tags_ele == tagele or not tagele.value in self.tags:
+ elif not tagele or (self.selected_tags and tagele.value in self.selected_tags) or not tagele.value in self.tags:
self.showTagsMenu(tagele)
else:
self.selected_tags_ele = tagele
diff --git a/lib/python/Screens/NetworkSetup.py b/lib/python/Screens/NetworkSetup.py
index ec2bafe5..3e9354ea 100755
--- a/lib/python/Screens/NetworkSetup.py
+++ b/lib/python/Screens/NetworkSetup.py
@@ -6,6 +6,7 @@ from Screens.VirtualKeyBoard import VirtualKeyBoard
from Screens.HelpMenu import HelpableScreen
from Components.Network import iNetwork
from Components.Sources.StaticText import StaticText
+from Components.Sources.Boolean import Boolean
from Components.Label import Label,MultiColorLabel
from Components.Pixmap import Pixmap,MultiPixmap
from Components.MenuList import MenuList
@@ -14,7 +15,7 @@ from Components.ConfigList import ConfigListScreen
from Components.PluginComponent import plugins
from Components.MultiContent import MultiContentEntryText, MultiContentEntryPixmapAlphaTest
from Components.ActionMap import ActionMap, NumberActionMap, HelpableActionMap
-from Tools.Directories import resolveFilename, SCOPE_PLUGINS, SCOPE_SKIN_IMAGE
+from Tools.Directories import resolveFilename, SCOPE_PLUGINS, SCOPE_CURRENT_SKIN
from Tools.LoadPixmap import LoadPixmap
from Plugins.Plugin import PluginDescriptor
from enigma import eTimer, ePoint, eSize, RT_HALIGN_LEFT, eListboxPythonMultiContent, gFont
@@ -36,14 +37,14 @@ def InterfaceEntryComponent(index,name,default,active ):
num_configured_if = len(iNetwork.getConfiguredAdapters())
if num_configured_if >= 2:
if default is True:
- png = LoadPixmap(resolveFilename(SCOPE_SKIN_IMAGE, "skin_default/buttons/button_blue.png"))
+ png = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/buttons/button_blue.png"))
if default is False:
- png = LoadPixmap(resolveFilename(SCOPE_SKIN_IMAGE, "skin_default/buttons/button_blue_off.png"))
+ png = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/buttons/button_blue_off.png"))
res.append(MultiContentEntryPixmapAlphaTest(pos=(10, 5), size=(25, 25), png = png))
if active is True:
- png2 = LoadPixmap(resolveFilename(SCOPE_SKIN_IMAGE, "skin_default/icons/lock_on.png"))
+ png2 = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/icons/lock_on.png"))
if active is False:
- png2 = LoadPixmap(resolveFilename(SCOPE_SKIN_IMAGE, "skin_default/icons/lock_error.png"))
+ png2 = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/icons/lock_error.png"))
res.append(MultiContentEntryPixmapAlphaTest(pos=(40, 1), size=(25, 25), png = png2))
return res
@@ -278,7 +279,6 @@ class NameserverSetup(Screen, ConfigListScreen, HelpableScreen):
def remove(self):
print "currentIndex:", self["config"].getCurrentIndex()
-
index = self["config"].getCurrentIndex()
if index < len(self.nameservers):
iNetwork.removeNameserver(self.nameservers[index])
@@ -309,24 +309,19 @@ class AdapterSetup(Screen, ConfigListScreen, HelpableScreen):
self["OkCancelActions"] = HelpableActionMap(self, "OkCancelActions",
{
- "cancel": (self.cancel, _("exit network adapter setup menu")),
- "ok": (self.ok, _("select menu entry")),
+ "cancel": (self.keyCancel, _("exit network adapter configuration")),
+ "ok": (self.keySave, _("activate network adapter configuration")),
})
self["ColorActions"] = HelpableActionMap(self, "ColorActions",
{
- "red": (self.cancel, _("exit network adapter configuration")),
+ "red": (self.keyCancel, _("exit network adapter configuration")),
"blue": (self.KeyBlue, _("open nameserver configuration")),
})
- self["VirtualKB"] = HelpableActionMap(self, "VirtualKeyboardActions",
- {
- "showVirtualKeyboard": (self.KeyText, [_("open virtual keyboard input help"),_("* Only available when entering hidden SSID or network key")] ),
- })
-
self["actions"] = NumberActionMap(["SetupActions"],
{
- "ok": self.ok,
+ "ok": self.keySave,
}, -2)
self.list = []
@@ -355,9 +350,10 @@ class AdapterSetup(Screen, ConfigListScreen, HelpableScreen):
self["key_red"] = StaticText(_("Cancel"))
self["key_blue"] = StaticText(_("Edit DNS"))
- self["VKeyIcon"] = Pixmap()
+ self["VKeyIcon"] = Boolean(False)
self["HelpWindow"] = Pixmap()
-
+ self["HelpWindow"].hide()
+
def layoutFinished(self):
self["DNS1"].setText(self.primaryDNS.getText())
self["DNS2"].setText(self.secondaryDNS.getText())
@@ -386,9 +382,6 @@ class AdapterSetup(Screen, ConfigListScreen, HelpableScreen):
self["Gateway"].setText("")
self["Gatewaytext"].setText("")
self["Adapter"].setText(iNetwork.getFriendlyAdapterName(self.iface))
- self["VKeyIcon"].hide()
- self["VirtualKB"].setEnabled(False)
- self["HelpWindow"].hide()
def createConfig(self):
self.InterfaceEntry = None
@@ -426,7 +419,6 @@ class AdapterSetup(Screen, ConfigListScreen, HelpableScreen):
try:
self.aps = self.w.getNetworkList()
if self.aps is not None:
- print "[NetworkSetup.py] got Accespoints!"
for ap in self.aps:
a = self.aps[ap]
if a['active']:
@@ -443,7 +435,7 @@ class AdapterSetup(Screen, ConfigListScreen, HelpableScreen):
self.default = self.wsconfig['ssid']
if "hidden..." not in self.nwlist:
- self.nwlist.append(("hidden...",_("hidden network")))
+ self.nwlist.append(("hidden...",_("enter hidden network SSID")))
if self.default not in self.nwlist:
self.nwlist.append((self.default,self.default))
config.plugins.wlan.essid = NoSave(ConfigSelection(self.nwlist, default = self.default ))
@@ -518,30 +510,10 @@ class AdapterSetup(Screen, ConfigListScreen, HelpableScreen):
self["config"].list = self.list
self["config"].l.setList(self.list)
- if not self.selectionChanged in self["config"].onSelectionChanged:
- self["config"].onSelectionChanged.append(self.selectionChanged)
def KeyBlue(self):
self.session.openWithCallback(self.NameserverSetupClosed, NameserverSetup)
- def KeyText(self):
- if self.iface == "wlan0" or self.iface == "ath0" :
- if self["config"].getCurrent() == self.hiddenSSID:
- if config.plugins.wlan.essid.value == 'hidden...':
- self.session.openWithCallback(self.VirtualKeyBoardSSIDCallback, VirtualKeyBoard, title = (_("Enter WLAN network name/SSID:")), text = config.plugins.wlan.essid.value)
- if self["config"].getCurrent() == self.encryptionKey:
- self.session.openWithCallback(self.VirtualKeyBoardKeyCallback, VirtualKeyBoard, title = (_("Enter WLAN passphrase/key:")), text = config.plugins.wlan.encryption.psk.value)
-
- def VirtualKeyBoardSSIDCallback(self, callback = None):
- if callback is not None and len(callback):
- config.plugins.wlan.hiddenessid.setValue(callback)
- self["config"].invalidate(self.hiddenSSID)
-
- def VirtualKeyBoardKeyCallback(self, callback = None):
- if callback is not None and len(callback):
- config.plugins.wlan.encryption.psk.setValue(callback)
- self["config"].invalidate(self.encryptionKey)
-
def newConfig(self):
if self["config"].getCurrent() == self.InterfaceEntry:
self.createSetup()
@@ -564,34 +536,41 @@ class AdapterSetup(Screen, ConfigListScreen, HelpableScreen):
def keyRight(self):
ConfigListScreen.keyRight(self)
self.newConfig()
+
+ def keySave(self):
+ self.hideInputHelp()
+ if self["config"].isChanged():
+ self.session.openWithCallback(self.keySaveConfirm, MessageBox, (_("Are you sure you want to activate this network configuration?\n\n") + self.oktext ) )
+ else:
+ if self.finished_cb:
+ self.finished_cb()
+ else:
+ self.close('cancel')
- def selectionChanged(self):
- current = self["config"].getCurrent()
- if current == self.hiddenSSID and config.plugins.wlan.essid.value == 'hidden...':
- helpwindowpos = self["HelpWindow"].getPosition()
- if current[1].help_window.instance is not None:
- current[1].help_window.instance.move(ePoint(helpwindowpos[0],helpwindowpos[1]))
- self["VKeyIcon"].show()
- self["VirtualKB"].setEnabled(True)
- elif current == self.encryptionKey and config.plugins.wlan.encryption.enabled.value:
- helpwindowpos = self["HelpWindow"].getPosition()
- if current[1].help_window.instance is not None:
- current[1].help_window.instance.move(ePoint(helpwindowpos[0],helpwindowpos[1]))
- self["VKeyIcon"].show()
- self["VirtualKB"].setEnabled(True)
+ def keySaveConfirm(self, ret = False):
+ if (ret == True):
+ num_configured_if = len(iNetwork.getConfiguredAdapters())
+ if num_configured_if >= 1:
+ if num_configured_if == 1 and self.iface in iNetwork.getConfiguredAdapters():
+ self.applyConfig(True)
+ else:
+ self.session.openWithCallback(self.secondIfaceFoundCB, MessageBox, _("A second configured interface has been found.\n\nDo you want to disable the second network interface?"), default = True)
+ else:
+ self.applyConfig(True)
else:
- self["VKeyIcon"].hide()
- self["VirtualKB"].setEnabled(False)
+ self.keyCancel()
- def ok(self):
- current = self["config"].getCurrent()
- if current == self.hiddenSSID and config.plugins.wlan.essid.value == 'hidden...':
- if current[1].help_window.instance is not None:
- current[1].help_window.instance.hide()
- elif current == self.encryptionKey and config.plugins.wlan.encryption.enabled.value:
- if current[1].help_window.instance is not None:
- current[1].help_window.instance.hide()
- self.session.openWithCallback(self.applyConfig, MessageBox, (_("Are you sure you want to activate this network configuration?\n\n") + self.oktext ) )
+ def secondIfaceFoundCB(self,data):
+ if data is False:
+ self.applyConfig(True)
+ else:
+ configuredInterfaces = iNetwork.getConfiguredAdapters()
+ for interface in configuredInterfaces:
+ if interface == self.iface:
+ continue
+ iNetwork.setAdapterAttribute(interface, "up", False)
+ iNetwork.deactivateInterface(interface)
+ self.applyConfig(True)
def applyConfig(self, ret = False):
if (ret == True):
@@ -612,7 +591,7 @@ class AdapterSetup(Screen, ConfigListScreen, HelpableScreen):
iNetwork.restartNetwork(self.applyConfigDataAvail)
self.applyConfigRef = self.session.openWithCallback(self.applyConfigfinishedCB, MessageBox, _("Please wait for activation of your network configuration..."), type = MessageBox.TYPE_INFO, enable_input = False)
else:
- self.cancel()
+ self.keyCancel()
def applyConfigDataAvail(self, data):
if data is True:
@@ -624,46 +603,39 @@ class AdapterSetup(Screen, ConfigListScreen, HelpableScreen):
def applyConfigfinishedCB(self,data):
if data is True:
- num_configured_if = len(iNetwork.getConfiguredAdapters())
- if num_configured_if >= 2:
- self.session.openWithCallback(self.secondIfaceFoundCB, MessageBox, _("Your network configuration has been activated.\nA second configured interface has been found.\n\nDo you want to disable the second network interface?"), default = True)
+ if self.finished_cb:
+ self.session.openWithCallback(lambda x : self.finished_cb(), MessageBox, _("Your network configuration has been activated."), type = MessageBox.TYPE_INFO, timeout = 10)
else:
- if self.finished_cb:
- self.session.openWithCallback(lambda x : self.finished_cb(), MessageBox, _("Your network configuration has been activated."), type = MessageBox.TYPE_INFO, timeout = 10)
- else:
- self.session.openWithCallback(self.ConfigfinishedCB, MessageBox, _("Your network configuration has been activated."), type = MessageBox.TYPE_INFO, timeout = 10)
-
- def secondIfaceFoundCB(self,data):
- if data is False:
- self.close('ok')
- else:
- configuredInterfaces = iNetwork.getConfiguredAdapters()
- for interface in configuredInterfaces:
- if interface == self.iface:
- continue
- iNetwork.setAdapterAttribute(interface, "up", False)
- iNetwork.deactivateInterface(interface)
- self.applyConfig(True)
+ self.session.openWithCallback(self.ConfigfinishedCB, MessageBox, _("Your network configuration has been activated."), type = MessageBox.TYPE_INFO, timeout = 10)
def ConfigfinishedCB(self,data):
if data is not None:
if data is True:
self.close('ok')
- def cancel(self):
+ def keyCancelConfirm(self, result):
+ if not result:
+ return
if self.oldInterfaceState is False:
- iNetwork.deactivateInterface(self.iface,self.cancelCB)
+ iNetwork.deactivateInterface(self.iface,self.keyCancelCB)
else:
self.close('cancel')
- def cancelCB(self,data):
+ def keyCancel(self):
+ self.hideInputHelp()
+ if self["config"].isChanged():
+ self.session.openWithCallback(self.keyCancelConfirm, MessageBox, _("Really close without saving settings?"))
+ else:
+ self.close('cancel')
+
+ def keyCancelCB(self,data):
if data is not None:
if data is True:
self.close('cancel')
def runAsync(self, finished_cb):
self.finished_cb = finished_cb
- self.ok()
+ self.keySave()
def NameserverSetupClosed(self, *ret):
iNetwork.loadNameserverConfig()
@@ -675,6 +647,15 @@ class AdapterSetup(Screen, ConfigListScreen, HelpableScreen):
def cleanup(self):
iNetwork.stopLinkStateConsole()
+
+ def hideInputHelp(self):
+ current = self["config"].getCurrent()
+ if current == self.hiddenSSID and config.plugins.wlan.essid.value == 'hidden...':
+ if current[1].help_window.instance is not None:
+ current[1].help_window.instance.hide()
+ elif current == self.encryptionKey and config.plugins.wlan.encryption.enabled.value:
+ if current[1].help_window.instance is not None:
+ current[1].help_window.instance.hide()
class AdapterSetupConfiguration(Screen, HelpableScreen):
@@ -684,6 +665,7 @@ class AdapterSetupConfiguration(Screen, HelpableScreen):
self.session = session
self.iface = iface
self.restartLanRef = None
+ self.LinkState = None
self.mainmenu = self.genMainMenu()
self["menulist"] = MenuList(self.mainmenu)
self["key_red"] = StaticText(_("Close"))
@@ -733,6 +715,7 @@ class AdapterSetupConfiguration(Screen, HelpableScreen):
self.onClose.append(self.cleanup)
def ok(self):
+ self.cleanup()
if self["menulist"].getCurrent()[1] == 'edit':
if self.iface == 'wlan0' or self.iface == 'ath0':
try:
@@ -813,7 +796,6 @@ class AdapterSetupConfiguration(Screen, HelpableScreen):
self.loadDescription()
def loadDescription(self):
- print self["menulist"].getCurrent()[1]
if self["menulist"].getCurrent()[1] == 'edit':
self["description"].setText(_("Edit the network configuration of your Dreambox.\n" ) + self.oktext )
if self["menulist"].getCurrent()[1] == 'test':
@@ -832,16 +814,18 @@ class AdapterSetupConfiguration(Screen, HelpableScreen):
self["description"].setText(_(self["menulist"].getCurrent()[1][1]) + self.oktext )
def updateStatusbar(self, data = None):
+ self.mainmenu = self.genMainMenu()
+ self["menulist"].l.setList(self.mainmenu)
self["IFtext"].setText(_("Network:"))
self["IF"].setText(iNetwork.getFriendlyAdapterName(self.iface))
self["Statustext"].setText(_("Link:"))
if self.iface == 'wlan0' or self.iface == 'ath0':
try:
- from Plugins.SystemPlugins.WirelessLan.Wlan import iStatus,Status
+ from Plugins.SystemPlugins.WirelessLan.Wlan import iStatus
except:
- self["statuspic"].setPixmapNum(1)
- self["statuspic"].show()
+ self["statuspic"].setPixmapNum(1)
+ self["statuspic"].show()
else:
iStatus.getDataForInterface(self.iface,self.getInfoCB)
else:
@@ -863,7 +847,6 @@ class AdapterSetupConfiguration(Screen, HelpableScreen):
callFnc = p.__call__["ifaceSupported"](self.iface)
if callFnc is not None:
self.extended = callFnc
- print p.__call__
if p.__call__.has_key("WlanPluginEntry"): # internally used only for WLAN Plugin
menu.append((_("Scan Wireless Networks"), "scanwlan"))
if iNetwork.getAdapterAttribute(self.iface, "up"):
@@ -902,20 +885,14 @@ class AdapterSetupConfiguration(Screen, HelpableScreen):
# Display Wlan not available Message
self.showErrorMessage()
else:
- self.mainmenu = self.genMainMenu()
- self["menulist"].l.setList(self.mainmenu)
self.updateStatusbar()
else:
- self.mainmenu = self.genMainMenu()
- self["menulist"].l.setList(self.mainmenu)
self.updateStatusbar()
def WlanStatusClosed(self, *ret):
if ret is not None and len(ret):
from Plugins.SystemPlugins.WirelessLan.Wlan import iStatus,Status
iStatus.stopWlanConsole()
- self.mainmenu = self.genMainMenu()
- self["menulist"].l.setList(self.mainmenu)
self.updateStatusbar()
def WlanScanClosed(self,*ret):
@@ -924,8 +901,6 @@ class AdapterSetupConfiguration(Screen, HelpableScreen):
else:
from Plugins.SystemPlugins.WirelessLan.Wlan import iStatus,Status
iStatus.stopWlanConsole()
- self.mainmenu = self.genMainMenu()
- self["menulist"].l.setList(self.mainmenu)
self.updateStatusbar()
def restartLan(self, ret = False):
@@ -947,15 +922,19 @@ class AdapterSetupConfiguration(Screen, HelpableScreen):
self.session.open(MessageBox, _("Finished restarting your network"), type = MessageBox.TYPE_INFO, timeout = 10, default = False)
def dataAvail(self,data):
- self.output = data.strip()
- result = self.output.split('\n')
- pattern = re_compile("Link detected: yes")
- for item in result:
- if re_search(pattern, item):
- self["statuspic"].setPixmapNum(0)
- else:
- self["statuspic"].setPixmapNum(1)
- self["statuspic"].show()
+ self.LinkState = None
+ for line in data.splitlines():
+ line = line.strip()
+ if 'Link detected:' in line:
+ if "yes" in line:
+ self.LinkState = True
+ else:
+ self.LinkState = False
+ if self.LinkState == True:
+ iNetwork.checkNetworkState(self.checkNetworkCB)
+ else:
+ self["statuspic"].setPixmapNum(1)
+ self["statuspic"].show()
def showErrorMessage(self):
self.session.open(MessageBox, self.errortext, type = MessageBox.TYPE_INFO,timeout = 10 )
@@ -963,22 +942,42 @@ class AdapterSetupConfiguration(Screen, HelpableScreen):
def cleanup(self):
iNetwork.stopLinkStateConsole()
iNetwork.stopDeactivateInterfaceConsole()
+ iNetwork.stopPingConsole()
try:
- from Plugins.SystemPlugins.WirelessLan.Wlan import iStatus,Status
+ from Plugins.SystemPlugins.WirelessLan.Wlan import iStatus
except ImportError:
pass
else:
iStatus.stopWlanConsole()
def getInfoCB(self,data,status):
+ self.LinkState = None
if data is not None:
if data is True:
if status is not None:
if status[self.iface]["acesspoint"] == "No Connection" or status[self.iface]["acesspoint"] == "Not-Associated" or status[self.iface]["acesspoint"] == False:
+ self.LinkState = False
self["statuspic"].setPixmapNum(1)
+ self["statuspic"].show()
else:
- self["statuspic"].setPixmapNum(0)
- self["statuspic"].show()
+ self.LinkState = True
+ iNetwork.checkNetworkState(self.checkNetworkCB)
+
+ def checkNetworkCB(self,data):
+ if iNetwork.getAdapterAttribute(self.iface, "up") is True:
+ if self.LinkState is True:
+ if data <= 2:
+ self["statuspic"].setPixmapNum(0)
+ else:
+ self["statuspic"].setPixmapNum(1)
+ self["statuspic"].show()
+ else:
+ self["statuspic"].setPixmapNum(1)
+ self["statuspic"].show()
+ else:
+ self["statuspic"].setPixmapNum(1)
+ self["statuspic"].show()
+
class NetworkAdapterTest(Screen):
def __init__(self, session,iface):
@@ -1397,4 +1396,4 @@ class NetworkAdapterTest(Screen):
pass
else:
iStatus.stopWlanConsole()
-
+
diff --git a/lib/python/Screens/PluginBrowser.py b/lib/python/Screens/PluginBrowser.py
index 3a7df9fb..cce08aed 100755
--- a/lib/python/Screens/PluginBrowser.py
+++ b/lib/python/Screens/PluginBrowser.py
@@ -1,5 +1,5 @@
from Screen import Screen
-
+from Components.Language import language
from enigma import eConsoleAppContainer
from Components.ActionMap import ActionMap
@@ -9,28 +9,36 @@ from Components.Label import Label
from Screens.MessageBox import MessageBox
from Screens.Console import Console
from Plugins.Plugin import PluginDescriptor
-from Tools.Directories import resolveFilename, SCOPE_PLUGINS, SCOPE_SKIN_IMAGE
+from Tools.Directories import resolveFilename, fileExists, SCOPE_PLUGINS, SCOPE_SKIN_IMAGE
from Tools.LoadPixmap import LoadPixmap
from time import time
+def languageChanged():
+ plugins.clearPluginList()
+ plugins.readPluginList(resolveFilename(SCOPE_PLUGINS))
+
class PluginBrowser(Screen):
def __init__(self, session):
Screen.__init__(self, session)
- self["red"] = Label(_("Remove Plugins"))
- self["green"] = Label(_("Download Plugins"))
+ self["red"] = Label()
+ self["green"] = Label()
self.list = []
self["list"] = PluginList(self.list)
- self["actions"] = ActionMap(["WizardActions", "ColorActions"],
+ self["actions"] = ActionMap(["WizardActions"],
{
"ok": self.save,
"back": self.close,
+ })
+ self["PluginDownloadActions"] = ActionMap(["ColorActions"],
+ {
"red": self.delete,
"green": self.download
})
+ self["PluginDownloadActions"].setEnabled(False)
self.onFirstExecBegin.append(self.checkWarnings)
self.onShown.append(self.updateList)
@@ -43,7 +51,6 @@ class PluginBrowser(Screen):
self.session.open(MessageBox, text = text, type = MessageBox.TYPE_WARNING)
def save(self):
- #self.close()
self.run()
def run(self):
@@ -54,7 +61,15 @@ class PluginBrowser(Screen):
self.pluginlist = plugins.getPlugins(PluginDescriptor.WHERE_PLUGINMENU)
self.list = [PluginEntryComponent(plugin) for plugin in self.pluginlist]
self["list"].l.setList(self.list)
-
+ if fileExists(resolveFilename(SCOPE_PLUGINS, "SystemPlugins/SoftwareManager/plugin.py")):
+ self["red"].setText("")
+ self["green"].setText("")
+ self["PluginDownloadActions"].setEnabled(False)
+ else:
+ self["red"].setText(_("Remove Plugins"))
+ self["green"].setText(_("Download Plugins"))
+ self["PluginDownloadActions"].setEnabled(True)
+
def delete(self):
self.session.openWithCallback(self.PluginDownloadBrowserClosed, PluginDownloadBrowser, PluginDownloadBrowser.REMOVE)
@@ -226,3 +241,4 @@ class PluginDownloadBrowser(Screen):
self.list = list
self["list"].l.setList(list)
+language.addCallback(languageChanged) \ No newline at end of file
diff --git a/lib/python/Screens/RdsDisplay.py b/lib/python/Screens/RdsDisplay.py
index 36d45908..0b99584f 100644..100755
--- a/lib/python/Screens/RdsDisplay.py
+++ b/lib/python/Screens/RdsDisplay.py
@@ -4,7 +4,7 @@ from Components.ActionMap import NumberActionMap
from Components.ServiceEventTracker import ServiceEventTracker
from Components.Pixmap import Pixmap
from Components.Label import Label
-from Tools.Directories import resolveFilename, SCOPE_SKIN_IMAGE
+from Tools.Directories import resolveFilename, SCOPE_CURRENT_SKIN
from Tools.LoadPixmap import LoadPixmap
class RdsInfoDisplay(Screen):
@@ -122,10 +122,10 @@ class RassInteractive(Screen):
9 : self["subpages_9"] }
self.subpage_png = {
- 1 : LoadPixmap(resolveFilename(SCOPE_SKIN_IMAGE, "skin_default/icons/rass_page1.png")),
- 2 : LoadPixmap(resolveFilename(SCOPE_SKIN_IMAGE, "skin_default/icons/rass_page2.png")),
- 3 : LoadPixmap(resolveFilename(SCOPE_SKIN_IMAGE, "skin_default/icons/rass_page3.png")),
- 4 : LoadPixmap(resolveFilename(SCOPE_SKIN_IMAGE, "skin_default/icons/rass_page4.png")) }
+ 1 : LoadPixmap(resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/icons/rass_page1.png")),
+ 2 : LoadPixmap(resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/icons/rass_page2.png")),
+ 3 : LoadPixmap(resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/icons/rass_page3.png")),
+ 4 : LoadPixmap(resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/icons/rass_page4.png")) }
self.current_page=0;
self.current_subpage=0;
diff --git a/lib/python/Screens/RecordPaths.py b/lib/python/Screens/RecordPaths.py
new file mode 100644
index 00000000..c833266f
--- /dev/null
+++ b/lib/python/Screens/RecordPaths.py
@@ -0,0 +1,194 @@
+from Screens.Screen import Screen
+from Screens.LocationBox import MovieLocationBox, TimeshiftLocationBox
+from Screens.MessageBox import MessageBox
+from Components.Label import Label
+from Components.config import config, ConfigSelection, getConfigListEntry, configfile
+from Components.ConfigList import ConfigListScreen
+from Components.ActionMap import ActionMap
+from Tools.Directories import fileExists
+
+
+class RecordPathsSettings(Screen,ConfigListScreen):
+ skin = """
+ <screen name="RecordPathsSettings" position="160,150" size="450,200" title="Recording paths">
+ <ePixmap pixmap="skin_default/buttons/red.png" position="10,0" size="140,40" alphatest="on" />
+ <ePixmap pixmap="skin_default/buttons/green.png" position="300,0" size="140,40" alphatest="on" />
+ <widget source="key_red" render="Label" position="10,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" />
+ <widget source="key_green" render="Label" position="300,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" transparent="1" />
+ <widget name="config" position="10,44" size="430,146" />
+ </screen>"""
+
+ def __init__(self, session):
+ from Components.Sources.StaticText import StaticText
+ Screen.__init__(self, session)
+ self["key_red"] = StaticText(_("Cancel"))
+ self["key_green"] = StaticText(_("Save"))
+
+ ConfigListScreen.__init__(self, [])
+ self.initConfigList()
+
+ self["setupActions"] = ActionMap(["SetupActions", "ColorActions"],
+ {
+ "green": self.save,
+ "red": self.cancel,
+ "cancel": self.cancel,
+ "ok": self.ok,
+ }, -2)
+
+ def checkReadWriteDir(self, configele):
+ print "checkReadWrite: ", configele.value
+ if configele.value in [x[0] for x in self.styles] or fileExists(configele.value, "w"):
+ configele.last_value = configele.value
+ return True
+ else:
+ dir = configele.value
+ configele.value = configele.last_value
+ self.session.open(
+ MessageBox,
+ _("The directory %s is not writable.\nMake sure you select a writable directory instead.")%dir,
+ type = MessageBox.TYPE_ERROR
+ )
+ return False
+
+ def initConfigList(self):
+ self.styles = [ ("<default>", _("<Default movie location>")), ("<current>", _("<Current movielist location>")), ("<timer>", _("<Last timer location>")) ]
+ styles_keys = [x[0] for x in self.styles]
+ tmp = config.movielist.videodirs.value
+ default = config.usage.default_path.value
+ if default not in tmp:
+ tmp = tmp[:]
+ tmp.append(default)
+ print "DefaultPath: ", default, tmp
+ self.default_dirname = ConfigSelection(default = default, choices = tmp)
+ tmp = config.movielist.videodirs.value
+ default = config.usage.timer_path.value
+ if default not in tmp and default not in styles_keys:
+ tmp = tmp[:]
+ tmp.append(default)
+ print "TimerPath: ", default, tmp
+ self.timer_dirname = ConfigSelection(default = default, choices = self.styles+tmp)
+ tmp = config.movielist.videodirs.value
+ default = config.usage.instantrec_path.value
+ if default not in tmp and default not in styles_keys:
+ tmp = tmp[:]
+ tmp.append(default)
+ print "InstantrecPath: ", default, tmp
+ self.instantrec_dirname = ConfigSelection(default = default, choices = self.styles+tmp)
+ default = config.usage.timeshift_path.value
+ tmp = config.usage.allowed_timeshift_paths.value
+ if default not in tmp:
+ tmp = tmp[:]
+ tmp.append(default)
+ print "TimeshiftPath: ", default, tmp
+ self.timeshift_dirname = ConfigSelection(default = default, choices = tmp)
+ self.default_dirname.addNotifier(self.checkReadWriteDir, initial_call=False, immediate_feedback=False)
+ self.timer_dirname.addNotifier(self.checkReadWriteDir, initial_call=False, immediate_feedback=False)
+ self.instantrec_dirname.addNotifier(self.checkReadWriteDir, initial_call=False, immediate_feedback=False)
+ self.timeshift_dirname.addNotifier(self.checkReadWriteDir, initial_call=False, immediate_feedback=False)
+
+ self.list = []
+ if config.usage.setup_level.index >= 2:
+ self.default_entry = getConfigListEntry(_("Default movie location"), self.default_dirname)
+ self.list.append(self.default_entry)
+ self.timer_entry = getConfigListEntry(_("Timer record location"), self.timer_dirname)
+ self.list.append(self.timer_entry)
+ self.instantrec_entry = getConfigListEntry(_("Instant record location"), self.instantrec_dirname)
+ self.list.append(self.instantrec_entry)
+ else:
+ self.default_entry = getConfigListEntry(_("Movie location"), self.default_dirname)
+ self.list.append(self.default_entry)
+ self.timeshift_entry = getConfigListEntry(_("Timeshift location"), self.timeshift_dirname)
+ self.list.append(self.timeshift_entry)
+ self["config"].setList(self.list)
+
+ def ok(self):
+ currentry = self["config"].getCurrent()
+ self.lastvideodirs = config.movielist.videodirs.value
+ self.lasttimeshiftdirs = config.usage.allowed_timeshift_paths.value
+ if config.usage.setup_level.index >= 2:
+ txt = _("Default movie location")
+ else:
+ txt = _("Movie location")
+ if currentry == self.default_entry:
+ self.entrydirname = self.default_dirname
+ self.session.openWithCallback(
+ self.dirnameSelected,
+ MovieLocationBox,
+ txt,
+ self.default_dirname.value
+ )
+ elif currentry == self.timer_entry:
+ self.entrydirname = self.timer_dirname
+ self.session.openWithCallback(
+ self.dirnameSelected,
+ MovieLocationBox,
+ _("Initial location in new timers"),
+ self.timer_dirname.value
+ )
+ elif currentry == self.instantrec_entry:
+ self.entrydirname = self.instantrec_dirname
+ self.session.openWithCallback(
+ self.dirnameSelected,
+ MovieLocationBox,
+ _("Location for instant recordings"),
+ self.instantrec_dirname.value
+ )
+ elif currentry == self.timeshift_entry:
+ self.entrydirname = self.timeshift_dirname
+ config.usage.timeshift_path.value = self.timeshift_dirname.value
+ self.session.openWithCallback(
+ self.dirnameSelected,
+ TimeshiftLocationBox
+ )
+
+ def dirnameSelected(self, res):
+ if res is not None:
+ self.entrydirname.value = res
+ if config.movielist.videodirs.value != self.lastvideodirs:
+ styles_keys = [x[0] for x in self.styles]
+ tmp = config.movielist.videodirs.value
+ default = self.default_dirname.value
+ if default not in tmp:
+ tmp = tmp[:]
+ tmp.append(default)
+ self.default_dirname.setChoices(tmp, default=default)
+ tmp = config.movielist.videodirs.value
+ default = self.timer_dirname.value
+ if default not in tmp and default not in styles_keys:
+ tmp = tmp[:]
+ tmp.append(default)
+ self.timer_dirname.setChoices(self.styles+tmp, default=default)
+ tmp = config.movielist.videodirs.value
+ default = self.instantrec_dirname.value
+ if default not in tmp and default not in styles_keys:
+ tmp = tmp[:]
+ tmp.append(default)
+ self.instantrec_dirname.setChoices(self.styles+tmp, default=default)
+ self.entrydirname.value = res
+ if config.usage.allowed_timeshift_paths.value != self.lasttimeshiftdirs:
+ tmp = config.usage.allowed_timeshift_paths.value
+ default = self.instantrec_dirname.value
+ if default not in tmp:
+ tmp = tmp[:]
+ tmp.append(default)
+ self.timeshift_dirname.setChoices(tmp, default=default)
+ self.entrydirname.value = res
+ if self.entrydirname.last_value != res:
+ self.checkReadWriteDir(self.entrydirname)
+
+ def save(self):
+ currentry = self["config"].getCurrent()
+ if self.checkReadWriteDir(currentry[1]):
+ config.usage.default_path.value = self.default_dirname.value
+ config.usage.timer_path.value = self.timer_dirname.value
+ config.usage.instantrec_path.value = self.instantrec_dirname.value
+ config.usage.timeshift_path.value = self.timeshift_dirname.value
+ config.usage.default_path.save()
+ config.usage.timer_path.save()
+ config.usage.instantrec_path.save()
+ config.usage.timeshift_path.save()
+ self.close()
+
+ def cancel(self):
+ self.close()
+
diff --git a/lib/python/Screens/Satconfig.py b/lib/python/Screens/Satconfig.py
index 8b5089a3..d5249b99 100644
--- a/lib/python/Screens/Satconfig.py
+++ b/lib/python/Screens/Satconfig.py
@@ -5,9 +5,11 @@ from Components.ActionMap import ActionMap
from Components.ConfigList import ConfigListScreen
from Components.MenuList import MenuList
from Components.NimManager import nimmanager
-from Components.config import getConfigListEntry, config, ConfigNothing, ConfigSelection, updateConfigElement
+from Components.config import getConfigListEntry, config, ConfigNothing, ConfigSelection, updateConfigElement,\
+ ConfigSatlist
from Components.Sources.List import List
from Screens.MessageBox import MessageBox
+from Screens.ChoiceBox import ChoiceBox
from time import mktime, localtime
from datetime import datetime
@@ -144,6 +146,8 @@ class NimSetup(Screen, ConfigListScreen):
currSat = self.nimConfig.advanced.sat[cur_orb_pos]
self.fillListWithAdvancedSatEntrys(currSat)
self.have_advanced = True
+ if self.nim.description == "Alps BSBE2" and config.usage.setup_level.index >= 2: # expert
+ self.list.append(getConfigListEntry(_("Tone Amplitude"), self.nimConfig.toneAmplitude))
elif self.nim.isCompatible("DVB-C"):
self.configMode = getConfigListEntry(_("Configuration Mode"), self.nimConfig.configMode)
self.list.append(self.configMode)
@@ -342,10 +346,10 @@ class NimSetup(Screen, ConfigListScreen):
new_configured_sats = nimmanager.getConfiguredSats()
self.unconfed_sats = old_configured_sats - new_configured_sats
self.satpos_to_remove = None
- self.deleteConfirmed(False)
+ self.deleteConfirmed((None, "no"))
def deleteConfirmed(self, confirmed):
- if confirmed:
+ if confirmed[1] == "yes" or confirmed[1] == "yestoall":
eDVBDB.getInstance().removeServices(-1, -1, -1, self.satpos_to_remove)
if self.satpos_to_remove is not None:
@@ -365,21 +369,26 @@ class NimSetup(Screen, ConfigListScreen):
else:
h = _("E")
sat_name = ("%d.%d" + h) % (orbpos / 10, orbpos % 10)
- self.session.openWithCallback(self.deleteConfirmed, MessageBox, _("Delete no more configured satellite\n%s?") %(sat_name))
+
+ if confirmed[1] == "yes" or confirmed[1] == "no":
+ self.session.openWithCallback(self.deleteConfirmed, ChoiceBox, _("Delete no more configured satellite\n%s?") %(sat_name), [(_("Yes"), "yes"), (_("No"), "no"), (_("Yes to all"), "yestoall"), (_("No to all"), "notoall")])
+ if confirmed[1] == "yestoall" or confirmed[1] == "notoall":
+ self.deleteConfirmed(confirmed)
break
if not self.satpos_to_remove:
self.close()
-
+
def __init__(self, session, slotid):
Screen.__init__(self, session)
self.list = [ ]
ConfigListScreen.__init__(self, self.list)
- self["actions"] = ActionMap(["SetupActions"],
+ self["actions"] = ActionMap(["SetupActions", "SatlistShortcutAction"],
{
"ok": self.keySave,
"cancel": self.keyCancel,
+ "nothingconnected": self.nothingConnectedShortcut
}, -2)
self.slotid = slotid
@@ -416,6 +425,11 @@ class NimSetup(Screen, ConfigListScreen):
# we need to call saveAll to reset the connectedTo choices
self.saveAll()
self.close()
+
+ def nothingConnectedShortcut(self):
+ if type(self["config"].getCurrent()[1]) is ConfigSatlist:
+ self["config"].getCurrent()[1].setValue("3601")
+ self["config"].invalidateCurrent()
class NimSelection(Screen):
def __init__(self, session):
diff --git a/lib/python/Screens/ScanSetup.py b/lib/python/Screens/ScanSetup.py
index bea08724..fa787a70 100644
--- a/lib/python/Screens/ScanSetup.py
+++ b/lib/python/Screens/ScanSetup.py
@@ -524,6 +524,8 @@ class ScanSetup(ConfigListScreen, Screen, CableTransponderSearchSupport):
for n in nimmanager.nim_slots:
if n.config_mode == "nothing":
continue
+ if n.config_mode == "advanced" and len(nimmanager.getSatListForNim(n.slot)) < 1:
+ continue
if n.config_mode in ("loopthrough", "satposdepends"):
root_id = nimmanager.sec.getRoot(n.slot_id, int(n.config.connectedTo.value))
if n.type == nimmanager.nim_slots[root_id].type: # check if connected from a DVB-S to DVB-S2 Nim or vice versa
diff --git a/lib/python/Screens/Scart.py b/lib/python/Screens/Scart.py
index dc511448..00e78593 100644
--- a/lib/python/Screens/Scart.py
+++ b/lib/python/Screens/Scart.py
@@ -1,10 +1,13 @@
from Screen import Screen
from MessageBox import MessageBox
from Components.AVSwitch import AVSwitch
+from Tools import Notifications
class Scart(Screen):
def __init__(self, session, start_visible=True):
Screen.__init__(self, session)
+ self.msgBox = None
+ self.notificationVisible = None
self.avswitch = AVSwitch()
@@ -22,7 +25,11 @@ class Scart(Screen):
if not self.msgVisible:
self.msgVisible = True
self.avswitch.setInput("SCART")
- self.msgBox = self.session.openWithCallback(self.MsgBoxClosed, MessageBox, _("If you see this, something is wrong with\nyour scart connection. Press OK to return."), MessageBox.TYPE_ERROR)
+ if not self.session.in_exec:
+ self.notificationVisible = True
+ Notifications.AddNotificationWithCallback(self.MsgBoxClosed, MessageBox, _("If you see this, something is wrong with\nyour scart connection. Press OK to return."), MessageBox.TYPE_ERROR, msgBoxID = "scart_msgbox")
+ else:
+ self.msgBox = self.session.openWithCallback(self.MsgBoxClosed, MessageBox, _("If you see this, something is wrong with\nyour scart connection. Press OK to return."), MessageBox.TYPE_ERROR)
def MsgBoxClosed(self, *val):
self.msgBox = None
@@ -35,3 +42,13 @@ class Scart(Screen):
return
self.avswitch.setInput("ENCODER")
self.msgVisible = False
+ if self.notificationVisible:
+ self.avswitch.setInput("ENCODER")
+ self.notificationVisible = False
+ for notification in Notifications.current_notifications:
+ try:
+ if notification[1].msgBoxID == "scart_msgbox":
+ notification[1].close()
+ except:
+ print "other notification is open. try another one."
+ \ No newline at end of file
diff --git a/lib/python/Screens/SleepTimerEdit.py b/lib/python/Screens/SleepTimerEdit.py
index ff061d88..e5e7af4e 100644
--- a/lib/python/Screens/SleepTimerEdit.py
+++ b/lib/python/Screens/SleepTimerEdit.py
@@ -5,6 +5,7 @@ from Components.Input import Input
from Components.Label import Label
from Components.Pixmap import Pixmap
from Components.config import config, ConfigInteger
+from Components.SystemInfo import SystemInfo
from enigma import eEPGCache
from SleepTimer import SleepTimer
from time import time
@@ -77,7 +78,11 @@ class SleepTimerEdit(Screen):
self["red_text"].setText(_("Action:") + " " + _("Disable timer"))
if config.SleepTimer.action.value == "shutdown":
- self["green_text"].setText(_("Sleep timer action:") + " " + _("Deep Standby"))
+ if SystemInfo["DeepstandbySupport"]:
+ shutdownString = _("Deep Standby")
+ else:
+ shutdownString = _("Shutdown")
+ self["green_text"].setText(_("Sleep timer action:") + " " + shutdownString)
elif config.SleepTimer.action.value == "standby":
self["green_text"].setText(_("Sleep timer action:") + " " + _("Standby"))
diff --git a/lib/python/Screens/TaskView.py b/lib/python/Screens/TaskView.py
index 1453c05f..eb926ca3 100644
--- a/lib/python/Screens/TaskView.py
+++ b/lib/python/Screens/TaskView.py
@@ -1,6 +1,7 @@
from Screen import Screen
from Components.ConfigList import ConfigListScreen
from Components.config import config, ConfigSubsection, ConfigSelection, getConfigListEntry
+from Components.SystemInfo import SystemInfo
from InfoBarGenerics import InfoBarNotifications
import Screens.Standby
from Tools import Notifications
@@ -44,7 +45,11 @@ class JobView(InfoBarNotifications, Screen, ConfigListScreen):
self.afterevents = [ "nothing", "standby", "deepstandby", "close" ]
self.settings = ConfigSubsection()
- self.settings.afterEvent = ConfigSelection(choices = [("nothing", _("do nothing")), ("close", _("Close")), ("standby", _("go to standby")), ("deepstandby", _("go to deep standby"))], default = self.afterevents[afterEvent])
+ if SystemInfo["DeepstandbySupport"]:
+ shutdownString = _("go to deep standby")
+ else:
+ shutdownString = _("shut down")
+ self.settings.afterEvent = ConfigSelection(choices = [("nothing", _("do nothing")), ("close", _("Close")), ("standby", _("go to standby")), ("deepstandby", shutdownString)], default = self.afterevents[afterEvent])
self.setupList()
self.state_changed()
diff --git a/lib/python/Screens/TimerEdit.py b/lib/python/Screens/TimerEdit.py
index caaf8c95..54354987 100644
--- a/lib/python/Screens/TimerEdit.py
+++ b/lib/python/Screens/TimerEdit.py
@@ -4,6 +4,7 @@ from Components.config import config
from Components.MenuList import MenuList
from Components.TimerList import TimerList
from Components.TimerSanityCheck import TimerSanityCheck
+from Components.UsageConfig import preferredTimerPath
from RecordTimer import RecordTimerEntry, parseEvent, AFTEREVENT
from Screen import Screen
from Screens.ChoiceBox import ChoiceBox
@@ -243,7 +244,7 @@ class TimerEditList(Screen):
else:
data = parseEvent(event, description = False)
- self.addTimer(RecordTimerEntry(serviceref, checkOldTimers = True, dirname = config.movielist.last_timer_videodir.value, *data))
+ self.addTimer(RecordTimerEntry(serviceref, checkOldTimers = True, dirname = preferredTimerPath(), *data))
def addTimer(self, timer):
self.session.openWithCallback(self.finishedAdd, TimerEntry, timer)
diff --git a/lib/python/Screens/TimerEntry.py b/lib/python/Screens/TimerEntry.py
index edd19685..b231b568 100644
--- a/lib/python/Screens/TimerEntry.py
+++ b/lib/python/Screens/TimerEntry.py
@@ -8,11 +8,12 @@ from Components.MenuList import MenuList
from Components.Button import Button
from Components.Label import Label
from Components.Pixmap import Pixmap
+from Components.SystemInfo import SystemInfo
+from Components.UsageConfig import defaultMoviePath
from Screens.MovieSelection import getPreferredTagEditor
from Screens.LocationBox import MovieLocationBox
from Screens.ChoiceBox import ChoiceBox
from RecordTimer import AFTEREVENT
-from Tools.Directories import resolveFilename, SCOPE_HDD
from enigma import eEPGCache
from time import localtime, mktime, time, strftime
from datetime import datetime
@@ -93,7 +94,11 @@ class TimerEntry(Screen, ConfigListScreen):
day[weekday] = 1
self.timerentry_justplay = ConfigSelection(choices = [("zap", _("zap")), ("record", _("record"))], default = {0: "record", 1: "zap"}[justplay])
- self.timerentry_afterevent = ConfigSelection(choices = [("nothing", _("do nothing")), ("standby", _("go to standby")), ("deepstandby", _("go to deep standby")), ("auto", _("auto"))], default = afterevent)
+ if SystemInfo["DeepstandbySupport"]:
+ shutdownString = _("go to deep standby")
+ else:
+ shutdownString = _("shut down")
+ self.timerentry_afterevent = ConfigSelection(choices = [("nothing", _("do nothing")), ("standby", _("go to standby")), ("deepstandby", shutdownString), ("auto", _("auto"))], default = afterevent)
self.timerentry_type = ConfigSelection(choices = [("once",_("once")), ("repeated", _("repeated"))], default = type)
self.timerentry_name = ConfigText(default = self.timer.name, visible_width = 50, fixed_size = False)
self.timerentry_description = ConfigText(default = self.timer.description, visible_width = 50, fixed_size = False)
@@ -106,7 +111,7 @@ class TimerEntry(Screen, ConfigListScreen):
self.timerentry_starttime = ConfigClock(default = self.timer.begin)
self.timerentry_endtime = ConfigClock(default = self.timer.end)
- default = self.timer.dirname or resolveFilename(SCOPE_HDD)
+ default = self.timer.dirname or defaultMoviePath()
tmp = config.movielist.videodirs.value
if default not in tmp:
tmp.append(default)
@@ -273,9 +278,10 @@ class TimerEntry(Screen, ConfigListScreen):
self.timer.service_ref = self.timerentry_service_ref
self.timer.tags = self.timerentry_tags
- self.timer.dirname = self.timerentry_dirname.value
- config.movielist.last_timer_videodir.value = self.timer.dirname
- config.movielist.last_timer_videodir.save()
+ if self.timer.dirname or self.timerentry_dirname.value != defaultMoviePath():
+ self.timer.dirname = self.timerentry_dirname.value
+ config.movielist.last_timer_videodir.value = self.timer.dirname
+ config.movielist.last_timer_videodir.save()
if self.timerentry_type.value == "once":
self.timer.begin, self.timer.end = self.getBeginEnd()
diff --git a/lib/python/Screens/UnhandledKey.py b/lib/python/Screens/UnhandledKey.py
new file mode 100644
index 00000000..63bfed5b
--- /dev/null
+++ b/lib/python/Screens/UnhandledKey.py
@@ -0,0 +1,7 @@
+from Screen import Screen
+from Components.Pixmap import Pixmap
+
+class UnhandledKey(Screen):
+ def __init__(self, session):
+ Screen.__init__(self, session)
+ self["UnhandledKeyPixmap"] = Pixmap()
diff --git a/lib/python/Screens/VirtualKeyBoard.py b/lib/python/Screens/VirtualKeyBoard.py
index 19500ed7..7846e4b8 100755
--- a/lib/python/Screens/VirtualKeyBoard.py
+++ b/lib/python/Screens/VirtualKeyBoard.py
@@ -7,26 +7,25 @@ from Components.MenuList import MenuList
from Components.MultiContent import MultiContentEntryText, MultiContentEntryPixmapAlphaTest
from enigma import eListboxPythonMultiContent, gFont, RT_HALIGN_CENTER, RT_VALIGN_CENTER
from Screen import Screen
-from Tools.Directories import resolveFilename, SCOPE_SKIN_IMAGE
+from Tools.Directories import resolveFilename, SCOPE_CURRENT_SKIN
from Tools.LoadPixmap import LoadPixmap
class VirtualKeyBoardList(MenuList):
def __init__(self, list, enableWrapAround=False):
MenuList.__init__(self, list, enableWrapAround, eListboxPythonMultiContent)
- self.l.setFont(0, gFont("Regular", 22))
+ self.l.setFont(0, gFont("Regular", 28))
self.l.setItemHeight(45)
def VirtualKeyBoardEntryComponent(keys, selectedKey,shiftMode=False):
- key_backspace = LoadPixmap(cached=True, path=resolveFilename(SCOPE_SKIN_IMAGE, "skin_default/vkey_backspace.png"))
- key_bg = LoadPixmap(cached=True, path=resolveFilename(SCOPE_SKIN_IMAGE, "skin_default/vkey_bg.png"))
- key_clr = LoadPixmap(cached=True, path=resolveFilename(SCOPE_SKIN_IMAGE, "skin_default/vkey_clr.png"))
- key_esc = LoadPixmap(cached=True, path=resolveFilename(SCOPE_SKIN_IMAGE, "skin_default/vkey_esc.png"))
- key_ok = LoadPixmap(cached=True, path=resolveFilename(SCOPE_SKIN_IMAGE, "skin_default/vkey_ok.png"))
- key_sel = LoadPixmap(cached=True, path=resolveFilename(SCOPE_SKIN_IMAGE, "skin_default/vkey_sel.png"))
- key_shift = LoadPixmap(cached=True, path=resolveFilename(SCOPE_SKIN_IMAGE, "skin_default/vkey_shift.png"))
- key_shift_sel = LoadPixmap(cached=True, path=resolveFilename(SCOPE_SKIN_IMAGE, "skin_default/vkey_shift_sel.png"))
- key_space = LoadPixmap(cached=True, path=resolveFilename(SCOPE_SKIN_IMAGE, "skin_default/vkey_space.png"))
-
+ key_backspace = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/vkey_backspace.png"))
+ key_bg = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/vkey_bg.png"))
+ key_clr = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/vkey_clr.png"))
+ key_esc = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/vkey_esc.png"))
+ key_ok = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/vkey_ok.png"))
+ key_sel = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/vkey_sel.png"))
+ key_shift = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/vkey_shift.png"))
+ key_shift_sel = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/vkey_shift_sel.png"))
+ key_space = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/vkey_space.png"))
res = [ (keys) ]
x = 0
@@ -36,33 +35,45 @@ def VirtualKeyBoardEntryComponent(keys, selectedKey,shiftMode=False):
else:
shiftkey_png = key_shift
for key in keys:
+ width = None
if key == "EXIT":
- res.append(MultiContentEntryPixmapAlphaTest(pos=(x, 0), size=(45, 45), png=key_esc))
+ width = key_esc.size().width()
+ res.append(MultiContentEntryPixmapAlphaTest(pos=(x, 0), size=(width, 45), png=key_esc))
elif key == "BACKSPACE":
- res.append(MultiContentEntryPixmapAlphaTest(pos=(x, 0), size=(45, 45), png=key_backspace))
+ width = key_backspace.size().width()
+ res.append(MultiContentEntryPixmapAlphaTest(pos=(x, 0), size=(width, 45), png=key_backspace))
elif key == "CLEAR":
- res.append(MultiContentEntryPixmapAlphaTest(pos=(x, 0), size=(45, 45), png=key_clr))
+ width = key_clr.size().width()
+ res.append(MultiContentEntryPixmapAlphaTest(pos=(x, 0), size=(width, 45), png=key_clr))
elif key == "SHIFT":
- res.append(MultiContentEntryPixmapAlphaTest(pos=(x, 0), size=(45, 45), png=shiftkey_png))
+ width = shiftkey_png.size().width()
+ res.append(MultiContentEntryPixmapAlphaTest(pos=(x, 0), size=(width, 45), png=shiftkey_png))
elif key == "SPACE":
- res.append(MultiContentEntryPixmapAlphaTest(pos=(x, 0), size=(45, 45), png=key_space))
+ width = key_space.size().width()
+ res.append(MultiContentEntryPixmapAlphaTest(pos=(x, 0), size=(width, 45), png=key_space))
elif key == "OK":
- res.append(MultiContentEntryPixmapAlphaTest(pos=(x, 0), size=(45, 45), png=key_ok))
+ width = key_ok.size().width()
+ res.append(MultiContentEntryPixmapAlphaTest(pos=(x, 0), size=(width, 45), png=key_ok))
#elif key == "<-":
# res.append(MultiContentEntryPixmapAlphaTest(pos=(x, 0), size=(45, 45), png=key_left))
#elif key == "->":
# res.append(MultiContentEntryPixmapAlphaTest(pos=(x, 0), size=(45, 45), png=key_right))
else:
+ width = key_bg.size().width()
res.extend((
- MultiContentEntryPixmapAlphaTest(pos=(x, 0), size=(45, 45), png=key_bg),
- MultiContentEntryText(pos=(x, 0), size=(45, 45), font=0, text=key.encode("utf-8"), flags=RT_HALIGN_CENTER | RT_VALIGN_CENTER)
+ MultiContentEntryPixmapAlphaTest(pos=(x, 0), size=(width, 45), png=key_bg),
+ MultiContentEntryText(pos=(x, 0), size=(width, 45), font=0, text=key.encode("utf-8"), flags=RT_HALIGN_CENTER | RT_VALIGN_CENTER)
))
if selectedKey == count:
- res.append(MultiContentEntryPixmapAlphaTest(pos=(x, 0), size=(45, 45), png=key_sel))
-
- x += 45
+ width = key_sel.size().width()
+ res.append(MultiContentEntryPixmapAlphaTest(pos=(x, 0), size=(width, 45), png=key_sel))
+
+ if width is not None:
+ x += width
+ else:
+ x += 45
count += 1
return res
diff --git a/lib/python/Screens/Wizard.py b/lib/python/Screens/Wizard.py
index 74219eb1..1bff0284 100755
--- a/lib/python/Screens/Wizard.py
+++ b/lib/python/Screens/Wizard.py
@@ -1,16 +1,15 @@
from Screen import Screen
-
from Screens.HelpMenu import HelpableScreen
from Screens.MessageBox import MessageBox
-from Components.config import config, KEY_LEFT, KEY_RIGHT, KEY_HOME, KEY_END, KEY_0, KEY_DELETE, KEY_BACKSPACE, KEY_OK, KEY_TOGGLEOW, KEY_ASCII, KEY_TIMEOUT, KEY_NUMBERS
+from Components.config import config, ConfigText, ConfigPassword, KEY_LEFT, KEY_RIGHT, KEY_HOME, KEY_END, KEY_0, KEY_DELETE, KEY_BACKSPACE, KEY_OK, KEY_TOGGLEOW, KEY_ASCII, KEY_TIMEOUT, KEY_NUMBERS
from Components.Label import Label
+from Components.Sources.StaticText import StaticText
from Components.Slider import Slider
from Components.ActionMap import NumberActionMap
from Components.MenuList import MenuList
from Components.ConfigList import ConfigList
from Components.Sources.List import List
-
from enigma import eTimer
from xml.sax import make_parser
@@ -19,8 +18,8 @@ from xml.sax.handler import ContentHandler
class WizardSummary(Screen):
skin = """
<screen position="0,0" size="132,64">
- <widget name="text" position="6,4" size="120,42" font="Regular;14" transparent="1" />
- <widget source="parent.list" render="Label" position="6,25" size="120,21" font="Regular;16">
+ <widget source="text" render="Label" position="6,0" size="120,16" font="Regular;16" transparent="1" />
+ <widget source="parent.list" render="Label" position="6,18" size="120,46" font="Regular;12">
<convert type="StringListSelection" />
</widget>
</screen>"""
@@ -36,7 +35,7 @@ class WizardSummary(Screen):
#self.skinName.append("Wizard")
#print "*************+++++++++++++++++****************++++++++++******************* WizardSummary", self.skinName
#
- self["text"] = Label("")
+ self["text"] = StaticText("")
self.onShow.append(self.setCallback)
def setCallback(self):
@@ -214,12 +213,13 @@ class Wizard(Screen):
self.onShown.append(self.updateValues)
self.configInstance = None
+ self.currentConfigIndex = None
self.lcdCallbacks = []
self.disableKeys = False
- self["actions"] = NumberActionMap(["WizardActions", "NumberActions", "ColorActions", "SetupActions", "InputAsciiActions"],
+ self["actions"] = NumberActionMap(["WizardActions", "NumberActions", "ColorActions", "SetupActions", "InputAsciiActions", "KeyboardInputActions"],
{
"gotAsciiCode": self.keyGotAscii,
"ok": self.ok,
@@ -245,6 +245,13 @@ class Wizard(Screen):
"9": self.keyNumberGlobal,
"0": self.keyNumberGlobal
}, -1)
+
+ self["VirtualKB"] = NumberActionMap(["VirtualKeyboardActions"],
+ {
+ "showVirtualKeyboard": self.KeyText,
+ }, -2)
+
+ self["VirtualKB"].setEnabled(False)
def red(self):
print "red"
@@ -405,6 +412,7 @@ class Wizard(Screen):
self.resetCounter()
if (self.showConfig and self.wizard[self.currStep]["config"]["screen"] != None or self.wizard[self.currStep]["config"]["type"] == "dynamic"):
self["config"].instance.moveSelection(self["config"].instance.moveUp)
+ self.handleInputHelpers()
elif (self.showList and len(self.wizard[self.currStep]["evaluatedlist"]) > 0):
self["list"].selectPrevious()
if self.wizard[self.currStep].has_key("onselect"):
@@ -418,6 +426,7 @@ class Wizard(Screen):
self.resetCounter()
if (self.showConfig and self.wizard[self.currStep]["config"]["screen"] != None or self.wizard[self.currStep]["config"]["type"] == "dynamic"):
self["config"].instance.moveSelection(self["config"].instance.moveDown)
+ self.handleInputHelpers()
elif (self.showList and len(self.wizard[self.currStep]["evaluatedlist"]) > 0):
#self["list"].instance.moveSelection(self["list"].instance.moveDown)
self["list"].selectNext()
@@ -598,6 +607,9 @@ class Wizard(Screen):
print "clearConfigList", self.configInstance["config"], self["config"]
else:
self["config"].l.setList([])
+ self.handleInputHelpers()
+
+
else:
if self.has_key("config"):
self["config"].hide()
@@ -614,6 +626,45 @@ class Wizard(Screen):
self.finished(gotoStep = self.wizard[self.currStep]["timeoutstep"])
self.updateText()
+ 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.currentConfigIndex = self["config"].getCurrentIndex()
+ 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):
+ if isinstance(self["config"].getCurrent()[1], ConfigText) or isinstance(self["config"].getCurrent()[1], ConfigPassword):
+ 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]))
+ self["config"].instance.moveSelectionTo(self.currentConfigIndex)
+ self["config"].setCurrentIndex(self.currentConfigIndex)
+ self["config"].getCurrent()[1].setValue(callback)
+ self["config"].invalidate(self["config"].getCurrent())
+
+
class WizardManager:
def __init__(self):
self.wizards = []
diff --git a/lib/python/Tools/Directories.py b/lib/python/Tools/Directories.py
index 681bc049..8ed2c8a4 100755
--- a/lib/python/Tools/Directories.py
+++ b/lib/python/Tools/Directories.py
@@ -33,6 +33,7 @@ SCOPE_DEFAULTDIR = 13
SCOPE_DEFAULTPARTITION = 14
SCOPE_DEFAULTPARTITIONMOUNTDIR = 15
SCOPE_METADIR = 16
+SCOPE_CURRENT_PLUGIN = 17
PATH_CREATE = 0
PATH_DONTCREATE = 1
@@ -85,7 +86,27 @@ def resolveFilename(scope, base = "", path_prefix = None):
tmp = defaultPaths[SCOPE_SKIN]
pos = config.skin.primary_skin.value.rfind('/')
if pos != -1:
- path = tmp[0]+config.skin.primary_skin.value[:pos+1]
+ #if basefile is not available use default skin path as fallback
+ tmpfile = tmp[0]+config.skin.primary_skin.value[:pos+1] + base
+ if fileExists(tmpfile):
+ path = tmp[0]+config.skin.primary_skin.value[:pos+1]
+ else:
+ path = tmp[0]
+ else:
+ path = tmp[0]
+
+ elif scope == SCOPE_CURRENT_PLUGIN:
+ tmp = defaultPaths[SCOPE_PLUGINS]
+ from Components.config import config
+ skintmp = defaultPaths[SCOPE_SKIN]
+ pos = config.skin.primary_skin.value.rfind('/')
+ if pos != -1:
+ #if basefile is not available inside current skin path, use the original provided file as fallback
+ skintmpfile = skintmp[0]+config.skin.primary_skin.value[:pos+1] + base
+ if fileExists(skintmpfile):
+ path = skintmp[0]+config.skin.primary_skin.value[:pos+1]
+ else:
+ path = tmp[0]
else:
path = tmp[0]
else:
diff --git a/lib/service/servicedvb.cpp b/lib/service/servicedvb.cpp
index 1a28fbdd..69329ce0 100644
--- a/lib/service/servicedvb.cpp
+++ b/lib/service/servicedvb.cpp
@@ -917,7 +917,7 @@ eDVBServicePlay::eDVBServicePlay(const eServiceReference &ref, eDVBService *serv
m_is_pvr = !m_reference.path.empty();
m_timeshift_enabled = m_timeshift_active = 0, m_timeshift_changed = 0;
- m_skipmode = 0;
+ m_skipmode = m_fastforward = m_slowmotion = 0;
CONNECT(m_service_handler.serviceEvent, eDVBServicePlay::serviceEvent);
CONNECT(m_service_handler_timeshift.serviceEvent, eDVBServicePlay::serviceEventTimeshift);
@@ -1029,6 +1029,9 @@ void eDVBServicePlay::serviceEvent(int event)
m_event((iPlayableService*)this, evUpdatedInfo);
break;
}
+ case eDVBServicePMTHandler::eventPreStart:
+ loadCuesheet();
+ break;
case eDVBServicePMTHandler::eventEOF:
m_event((iPlayableService*)this, evEOF);
break;
@@ -1095,7 +1098,6 @@ RESULT eDVBServicePlay::start()
m_event_handler.inject(event, 0);
m_event_handler.inject(empty, 1);
}
- loadCuesheet();
m_event(this, evStart);
}
return 0;
@@ -1185,7 +1187,10 @@ RESULT eDVBServicePlay::setSlowMotion(int ratio)
eDebug("eDVBServicePlay::setSlowMotion(%d)", ratio);
setFastForward_internal(0);
if (m_decoder)
+ {
+ m_slowmotion = ratio;
return m_decoder->setSlowMotion(ratio);
+ }
else
return -1;
}
@@ -1197,10 +1202,11 @@ RESULT eDVBServicePlay::setFastForward(int ratio)
return setFastForward_internal(ratio);
}
-RESULT eDVBServicePlay::setFastForward_internal(int ratio)
+RESULT eDVBServicePlay::setFastForward_internal(int ratio, bool final_seek)
{
- int skipmode, ffratio;
-
+ int skipmode, ffratio, ret = 0;
+ pts_t pos=0;
+
if (ratio > 8)
{
skipmode = ratio;
@@ -1225,19 +1231,28 @@ RESULT eDVBServicePlay::setFastForward_internal(int ratio)
if (m_cue)
m_cue->setSkipmode(skipmode * 90000); /* convert to 90000 per second */
}
-
+
m_skipmode = skipmode;
-
+
+ if (final_seek)
+ eDebug("trickplay stopped .. ret %d, pos %lld", getPlayPosition(pos), pos);
+
+ m_fastforward = ffratio;
+
if (!m_decoder)
return -1;
-
+
if (ffratio == 0)
; /* return m_decoder->play(); is done in caller*/
else if (ffratio != 1)
- return m_decoder->setFastForward(ffratio);
+ ret = m_decoder->setFastForward(ffratio);
else
- return m_decoder->setTrickmode();
- return 0;
+ ret = m_decoder->setTrickmode();
+
+ if (pos)
+ eDebug("final seek after trickplay ret %d", seekTo(pos));
+
+ return ret;
}
RESULT eDVBServicePlay::seek(ePtr<iSeekableService> &ptr)
@@ -1266,9 +1281,10 @@ RESULT eDVBServicePlay::getLength(pts_t &len)
RESULT eDVBServicePlay::pause()
{
eDebug("eDVBServicePlay::pause");
- setFastForward_internal(0);
+ setFastForward_internal(0, m_slowmotion || m_fastforward > 1);
if (m_decoder)
{
+ m_slowmotion = 0;
m_is_paused = 1;
return m_decoder->pause();
} else
@@ -1278,9 +1294,10 @@ RESULT eDVBServicePlay::pause()
RESULT eDVBServicePlay::unpause()
{
eDebug("eDVBServicePlay::unpause");
- setFastForward_internal(0);
+ setFastForward_internal(0, m_slowmotion || m_fastforward > 1);
if (m_decoder)
{
+ m_slowmotion = 0;
m_is_paused = 0;
return m_decoder->play();
} else
@@ -1370,7 +1387,14 @@ RESULT eDVBServicePlay::setTrickmode(int trick)
RESULT eDVBServicePlay::isCurrentlySeekable()
{
- return m_is_pvr || m_timeshift_active;
+ int ret = 0;
+ if (m_decoder)
+ {
+ ret = (m_is_pvr || m_timeshift_active) ? 3 : 0; // fast forward/backward possible and seeking possible
+ if (m_decoder->getVideoWidth() == -1)
+ ret &= ~2;
+ }
+ return ret;
}
RESULT eDVBServicePlay::frontendInfo(ePtr<iFrontendInformation> &ptr)
@@ -1728,6 +1752,7 @@ int eDVBServicePlay::selectAudioStream(int i)
{
eDVBServicePMTHandler::program program;
eDVBServicePMTHandler &h = m_timeshift_active ? m_service_handler_timeshift : m_service_handler;
+ pts_t position = -1;
if (h.getProgramInfo(program))
return -1;
@@ -1750,6 +1775,9 @@ int eDVBServicePlay::selectAudioStream(int i)
apidtype = program.audioStreams[stream].type;
}
+ if (i != -1 && apid != m_current_audio_pid && (m_is_pvr || m_timeshift_active))
+ eDebug("getPlayPosition ret %d, pos %lld in selectAudioStream", getPlayPosition(position), position);
+
m_current_audio_pid = apid;
if (m_is_primary && m_decoder->setAudioPID(apid, apidtype))
@@ -1758,6 +1786,9 @@ int eDVBServicePlay::selectAudioStream(int i)
return -4;
}
+ if (position != -1)
+ eDebug("seekTo ret %d", seekTo(position));
+
int rdsPid = apid;
/* if we are not in PVR mode, timeshift is not active and we are not in pip mode, check if we need to enable the rds reader */
@@ -2229,7 +2260,7 @@ void eDVBServicePlay::switchToLive()
m_new_subtitle_page_connection = 0;
m_rds_decoder_event_connection = 0;
m_video_event_connection = 0;
- m_is_paused = m_skipmode = 0; /* not supported in live mode */
+ m_is_paused = m_skipmode = m_fastforward = m_slowmotion = 0; /* not supported in live mode */
/* free the timeshift service handler, we need the resources */
m_service_handler_timeshift.free();
@@ -2263,12 +2294,13 @@ void eDVBServicePlay::switchToTimeshift()
r.path = m_timeshift_file;
m_cue = new eCueSheet();
+ m_cue->seekTo(0, -1000);
m_service_handler_timeshift.tune(r, 1, m_cue, 0, m_dvb_service); /* use the decoder demux for everything */
eDebug("eDVBServicePlay::switchToTimeshift, in pause mode now.");
pause();
updateDecoder(); /* mainly to switch off PCR, and to set pause */
-
+
m_event((iPlayableService*)this, evSeekableStatusChanged);
}
@@ -2398,17 +2430,8 @@ void eDVBServicePlay::updateDecoder()
}
}
- std::string config_delay;
- int config_delay_int = 0;
- if(ePythonConfigQuery::getConfigValue("config.av.generalAC3delay", config_delay) == 0)
- config_delay_int = atoi(config_delay.c_str());
- m_decoder->setAC3Delay(ac3_delay == -1 ? config_delay_int : ac3_delay + config_delay_int);
-
- if(ePythonConfigQuery::getConfigValue("config.av.generalPCMdelay", config_delay) == 0)
- config_delay_int = atoi(config_delay.c_str());
- else
- config_delay_int = 0;
- m_decoder->setPCMDelay(pcm_delay == -1 ? config_delay_int : pcm_delay + config_delay_int);
+ setAC3Delay(ac3_delay == -1 ? 0 : ac3_delay);
+ setPCMDelay(pcm_delay == -1 ? 0 : pcm_delay);
m_decoder->setVideoPID(vpid, vpidtype);
selectAudioStream();
@@ -2932,16 +2955,28 @@ void eDVBServicePlay::setAC3Delay(int delay)
{
if (m_dvb_service)
m_dvb_service->setCacheEntry(eDVBService::cAC3DELAY, delay ? delay : -1);
- if (m_decoder)
- m_decoder->setAC3Delay(delay);
+ if (m_decoder) {
+ std::string config_delay;
+ int config_delay_int = 0;
+ if(ePythonConfigQuery::getConfigValue("config.av.generalAC3delay", config_delay) == 0)
+ config_delay_int = atoi(config_delay.c_str());
+ m_decoder->setAC3Delay(delay + config_delay_int);
+ }
}
void eDVBServicePlay::setPCMDelay(int delay)
{
if (m_dvb_service)
m_dvb_service->setCacheEntry(eDVBService::cPCMDELAY, delay ? delay : -1);
- if (m_decoder)
- m_decoder->setPCMDelay(delay);
+ if (m_decoder) {
+ std::string config_delay;
+ int config_delay_int = 0;
+ if(ePythonConfigQuery::getConfigValue("config.av.generalPCMdelay", config_delay) == 0)
+ config_delay_int = atoi(config_delay.c_str());
+ else
+ config_delay_int = 0;
+ m_decoder->setPCMDelay(delay + config_delay_int);
+ }
}
void eDVBServicePlay::video_event(struct iTSMPEGDecoder::videoEvent event)
diff --git a/lib/service/servicedvb.h b/lib/service/servicedvb.h
index b4d0f196..e3c7fd58 100644
--- a/lib/service/servicedvb.h
+++ b/lib/service/servicedvb.h
@@ -220,7 +220,7 @@ private:
int m_current_audio_stream;
int selectAudioStream(int n = -1);
- RESULT setFastForward_internal(int ratio);
+ RESULT setFastForward_internal(int ratio, bool final_seek=false);
/* timeshift */
ePtr<iDVBTSRecorder> m_record;
@@ -233,6 +233,8 @@ private:
void updateDecoder();
int m_skipmode;
+ int m_fastforward;
+ int m_slowmotion;
/* cuesheet */
diff --git a/lib/service/servicemp3.cpp b/lib/service/servicemp3.cpp
index 34d09363..cf71f781 100644
--- a/lib/service/servicemp3.cpp
+++ b/lib/service/servicemp3.cpp
@@ -2,20 +2,23 @@
/* note: this requires gstreamer 0.10.x and a big list of plugins. */
/* it's currently hardcoded to use a big-endian alsasink as sink. */
+#include <lib/base/ebase.h>
#include <lib/base/eerror.h>
+#include <lib/base/init_num.h>
+#include <lib/base/init.h>
+#include <lib/base/nconfig.h>
#include <lib/base/object.h>
-#include <lib/base/ebase.h>
-#include <string>
+#include <lib/dvb/decoder.h>
+#include <lib/components/file_eraser.h>
+#include <lib/gui/esubtitle.h>
#include <lib/service/servicemp3.h>
#include <lib/service/service.h>
-#include <lib/components/file_eraser.h>
-#include <lib/base/init_num.h>
-#include <lib/base/init.h>
+
+#include <string>
+
#include <gst/gst.h>
#include <gst/pbutils/missing-plugins.h>
#include <sys/stat.h>
-/* for subtitles */
-#include <lib/gui/esubtitle.h>
// eServiceFactoryMP3
@@ -187,6 +190,8 @@ int eStaticServiceMP3Info::getLength(const eServiceReference &ref)
}
// eServiceMP3
+int eServiceMP3::ac3_delay,
+ eServiceMP3::pcm_delay;
eServiceMP3::eServiceMP3(eServiceReference ref)
:m_ref(ref), m_pump(eApp, 1)
@@ -635,7 +640,31 @@ RESULT eServiceMP3::setTrickmode(int trick)
RESULT eServiceMP3::isCurrentlySeekable()
{
- return 1;
+ int ret = 3; // seeking and fast/slow winding possible
+ GstElement *sink;
+
+ if (!m_gst_playbin)
+ return 0;
+ if (m_state != stRunning)
+ return 0;
+
+ g_object_get (G_OBJECT (m_gst_playbin), "video-sink", &sink, NULL);
+
+ // disable fast winding yet when a dvbvideosink or dvbaudiosink is used
+ // for this we must do some changes on different places.. (gstreamer.. our sinks.. enigma2)
+ if (sink) {
+ ret &= ~2; // only seeking possible
+ gst_object_unref(sink);
+ }
+ else {
+ g_object_get (G_OBJECT (m_gst_playbin), "audio-sink", &sink, NULL);
+ if (sink) {
+ ret &= ~2; // only seeking possible
+ gst_object_unref(sink);
+ }
+ }
+
+ return ret;
}
RESULT eServiceMP3::info(ePtr<iServiceInformation>&i)
@@ -659,7 +688,6 @@ RESULT eServiceMP3::getName(std::string &name)
return 0;
}
-
int eServiceMP3::getInfo(int w)
{
const gchar *tag = 0;
@@ -955,6 +983,12 @@ RESULT eServiceMP3::subtitle(ePtr<iSubtitleOutput> &ptr)
return 0;
}
+RESULT eServiceMP3::audioDelay(ePtr<iAudioDelay> &ptr)
+{
+ ptr = this;
+ return 0;
+}
+
int eServiceMP3::getNumberOfTracks()
{
return m_audioStreams.size();
@@ -1093,6 +1127,8 @@ void eServiceMP3::gstBusCall(GstBus *bus, GstMessage *msg)
g_object_set (G_OBJECT (sink), "emit-signals", TRUE, NULL);
gst_object_unref(sink);
}
+ setAC3Delay(ac3_delay);
+ setPCMDelay(pcm_delay);
} break;
case GST_STATE_CHANGE_PAUSED_TO_PLAYING:
{
@@ -1579,6 +1615,96 @@ int eServiceMP3::setBufferSize(int size)
return 0;
}
+int eServiceMP3::getAC3Delay()
+{
+ return ac3_delay;
+}
+
+int eServiceMP3::getPCMDelay()
+{
+ return pcm_delay;
+}
+
+void eServiceMP3::setAC3Delay(int delay)
+{
+ ac3_delay = delay;
+ if (!m_gst_playbin || m_state != stRunning)
+ return;
+ else
+ {
+ GstElement *sink;
+ int config_delay_int = delay;
+ g_object_get (G_OBJECT (m_gst_playbin), "video-sink", &sink, NULL);
+
+ if (sink)
+ {
+ std::string config_delay;
+ if(ePythonConfigQuery::getConfigValue("config.av.generalAC3delay", config_delay) == 0)
+ config_delay_int += atoi(config_delay.c_str());
+ gst_object_unref(sink);
+ }
+ else
+ {
+ eDebug("dont apply ac3 delay when no video is running!");
+ config_delay_int = 0;
+ }
+
+ g_object_get (G_OBJECT (m_gst_playbin), "audio-sink", &sink, NULL);
+
+ if (sink)
+ {
+ gchar *name = gst_element_get_name(sink);
+ if (strstr(name, "dvbaudiosink"))
+ eTSMPEGDecoder::setHwAC3Delay(config_delay_int);
+ g_free(name);
+ gst_object_unref(sink);
+ }
+ }
+}
+
+void eServiceMP3::setPCMDelay(int delay)
+{
+ pcm_delay = delay;
+ if (!m_gst_playbin || m_state != stRunning)
+ return;
+ else
+ {
+ GstElement *sink;
+ int config_delay_int = delay;
+ g_object_get (G_OBJECT (m_gst_playbin), "video-sink", &sink, NULL);
+
+ if (sink)
+ {
+ std::string config_delay;
+ if(ePythonConfigQuery::getConfigValue("config.av.generalPCMdelay", config_delay) == 0)
+ config_delay_int += atoi(config_delay.c_str());
+ gst_object_unref(sink);
+ }
+ else
+ {
+ eDebug("dont apply pcm delay when no video is running!");
+ config_delay_int = 0;
+ }
+
+ g_object_get (G_OBJECT (m_gst_playbin), "audio-sink", &sink, NULL);
+
+ if (sink)
+ {
+ gchar *name = gst_element_get_name(sink);
+ if (strstr(name, "dvbaudiosink"))
+ eTSMPEGDecoder::setHwPCMDelay(config_delay_int);
+ else
+ {
+ // this is realy untested..and not used yet
+ gint64 offset = config_delay_int;
+ offset *= 1000000; // milli to nano
+ g_object_set (G_OBJECT (m_gst_playbin), "ts-offset", offset, NULL);
+ }
+ g_free(name);
+ gst_object_unref(sink);
+ }
+ }
+}
#else
#warning gstreamer not available, not building media player
diff --git a/lib/service/servicemp3.h b/lib/service/servicemp3.h
index 15ed0b07..985179f6 100644
--- a/lib/service/servicemp3.h
+++ b/lib/service/servicemp3.h
@@ -49,8 +49,9 @@ typedef enum { atUnknown, atMPEG, atMP3, atAC3, atDTS, atAAC, atPCM, atOGG, atFL
typedef enum { stPlainText, stSSA, stSRT } subtype_t;
typedef enum { ctNone, ctMPEGTS, ctMPEGPS, ctMKV, ctAVI, ctMP4, ctVCD, ctCDA } containertype_t;
-class eServiceMP3: public iPlayableService, public iPauseableService,
- public iServiceInformation, public iSeekableService, public iAudioTrackSelection, public iAudioChannelSelection, public iSubtitleOutput, public iStreamedService, public Object
+class eServiceMP3: public iPlayableService, public iPauseableService,
+ public iServiceInformation, public iSeekableService, public iAudioTrackSelection, public iAudioChannelSelection,
+ public iSubtitleOutput, public iStreamedService, public iAudioDelay, public Object
{
DECLARE_REF(eServiceMP3);
public:
@@ -70,13 +71,14 @@ public:
RESULT audioTracks(ePtr<iAudioTrackSelection> &ptr);
RESULT audioChannel(ePtr<iAudioChannelSelection> &ptr);
RESULT subtitle(ePtr<iSubtitleOutput> &ptr);
+ RESULT audioDelay(ePtr<iAudioDelay> &ptr);
// not implemented (yet)
RESULT frontendInfo(ePtr<iFrontendInformation> &ptr) { ptr = 0; return -1; }
RESULT subServices(ePtr<iSubserviceList> &ptr) { ptr = 0; return -1; }
RESULT timeshift(ePtr<iTimeshiftService> &ptr) { ptr = 0; return -1; }
RESULT cueSheet(ePtr<iCueSheet> &ptr) { ptr = 0; return -1; }
- RESULT audioDelay(ePtr<iAudioDelay> &ptr) { ptr = 0; return -1; }
+
RESULT rdsDecoder(ePtr<iRdsDecoder> &ptr) { ptr = 0; return -1; }
RESULT keys(ePtr<iServiceKeys> &ptr) { ptr = 0; return -1; }
RESULT stream(ePtr<iStreamableService> &ptr) { ptr = 0; return -1; }
@@ -122,6 +124,12 @@ public:
PyObject *getBufferCharge();
int setBufferSize(int size);
+ // iAudioDelay
+ int getAC3Delay();
+ int getPCMDelay();
+ void setAC3Delay(int);
+ void setPCMDelay(int);
+
struct audioStream
{
GstPad* pad;
@@ -166,6 +174,8 @@ public:
}
};
private:
+ static int pcm_delay;
+ static int ac3_delay;
int m_currentAudioStream;
int m_currentSubtitleStream;
int selectAudioStream(int i);
diff --git a/lib/service/servicexine.cpp b/lib/service/servicexine.cpp
index 44e6a6e0..6b9adfb9 100644
--- a/lib/service/servicexine.cpp
+++ b/lib/service/servicexine.cpp
@@ -315,7 +315,7 @@ RESULT eServiceXine::setTrickmode(int trick)
RESULT eServiceXine::isCurrentlySeekable()
{
- return 1;
+ return 3;
}
RESULT eServiceXine::info(ePtr<iServiceInformation>&i)
diff --git a/mytest.py b/mytest.py
index e42c1003..c748538a 100755
--- a/mytest.py
+++ b/mytest.py
@@ -41,14 +41,14 @@ profile("LOAD:skin")
from skin import readSkin
profile("LOAD:Tools")
-from Tools.Directories import InitFallbackFiles, resolveFilename, SCOPE_PLUGINS, SCOPE_SKIN_IMAGE
+from Tools.Directories import InitFallbackFiles, resolveFilename, SCOPE_PLUGINS, SCOPE_CURRENT_SKIN
from Components.config import config, configfile, ConfigText, ConfigYesNo, ConfigInteger, NoSave
InitFallbackFiles()
profile("ReloadProfiles")
eDVBDB.getInstance().reloadBouquets()
-config.misc.radiopic = ConfigText(default = resolveFilename(SCOPE_SKIN_IMAGE)+"radio.mvi")
+config.misc.radiopic = ConfigText(default = resolveFilename(SCOPE_CURRENT_SKIN, "radio.mvi"))
config.misc.isNextRecordTimerAfterEventActionAuto = ConfigYesNo(default=False)
config.misc.useTransponderTime = ConfigYesNo(default=True)
config.misc.startCounter = ConfigInteger(default=0) # number of e2 starts...
diff --git a/skin.py b/skin.py
index 5b8ce650..064fd219 100644..100755
--- a/skin.py
+++ b/skin.py
@@ -148,6 +148,8 @@ def applySingleAttribute(guiObject, desktop, attrib, value, scale = ((1,1),(1,1)
guiObject.setFont(parseFont(value, scale))
elif attrib == 'zPosition':
guiObject.setZPosition(int(value))
+ elif attrib == 'itemHeight':
+ guiObject.setItemHeight(int(value))
elif attrib in ("pixmap", "backgroundPixmap", "selectionPixmap"):
ptr = loadPixmap(value, desktop) # this should already have been filename-resolved.
if attrib == "pixmap":
diff --git a/tools/genmetaindex.py b/tools/genmetaindex.py
index 82e79616..f7dc5b98 100755
--- a/tools/genmetaindex.py
+++ b/tools/genmetaindex.py
@@ -24,7 +24,7 @@ for file in sys.argv[2:]:
assert info
for i in info[:]:
- if i.tag not in ["name", "packagename", "shortdescription"]:
+ if i.tag not in ["name", "packagename", "packagetype", "shortdescription"]:
info.remove(i)
for i in info[:]: