add support for cyclic garbage collection to eTimer and eSocketNotifier
[vuplus_dvbapp] / lib / python / Screens / ChannelSelection.py
index 94cf1ae..d640ac2 100644 (file)
@@ -1,28 +1,39 @@
+from Tools.Profile import profile
+
 from Screen import Screen
 from Components.Button import Button
 from Components.ServiceList import ServiceList
 from Components.ActionMap import NumberActionMap, ActionMap, HelpableActionMap
 from Components.MenuList import MenuList
 from Components.ServiceEventTracker import ServiceEventTracker
+profile("ChannelSelection.py 1")
 from EpgSelection import EPGSelection
-from enigma import eServiceReference, eEPGCache, eServiceCenter, eTimer, eDVBDB, iPlayableService, iServiceInformation
+from enigma import eServiceReference, eEPGCache, eServiceCenter, eRCInput, eTimer, eDVBDB, iPlayableService, iServiceInformation, getPrevAsciiCode
 from Components.config import config, ConfigSubsection, ConfigText
 from Tools.NumericalTextInput import NumericalTextInput
+profile("ChannelSelection.py 2")
 from Components.NimManager import nimmanager
-from Components.Sources.Clock import Clock
+profile("ChannelSelection.py 2.1")
+from Components.Sources.Source import ObsoleteSource
+profile("ChannelSelection.py 2.2")
 from Components.Sources.RdsDecoder import RdsDecoder
+profile("ChannelSelection.py 2.3")
 from Components.Sources.ServiceEvent import ServiceEvent
+profile("ChannelSelection.py 2.4")
 from Components.Input import Input
+profile("ChannelSelection.py 3")
 from Components.ParentalControl import parentalControl
 from Components.Pixmap import Pixmap
 from Screens.InputBox import InputBox, PinInput
 from Screens.MessageBox import MessageBox
 from Screens.ServiceInfo import ServiceInfo
+profile("ChannelSelection.py 4")
 from Screens.RdsDisplay import RassInteractive
 from ServiceReference import ServiceReference
 from Tools.BoundFunction import boundFunction
 from re import compile
 from os import remove
+profile("ChannelSelection.py after imports")
 
 FLAG_SERVICE_NEW_FOUND = 64 #define in lib/dvb/idvb.h as dxNewFound = 64
 
@@ -61,13 +72,14 @@ OFF = 0
 EDIT_BOUQUET = 1
 EDIT_ALTERNATIVES = 2
 
-def apend_when_current_valid(current, menu, args):
-       if current and current.valid():
+def append_when_current_valid(current, menu, args, level = 0):
+       if current and current.valid() and level <= config.usage.setup_level.index:
                menu.append(args)
 
 class ChannelContextMenu(Screen):
        def __init__(self, session, csel):
                Screen.__init__(self, session)
+               #raise "we need a better summary screen here"
                self.csel = csel
                self.bsel = None
 
@@ -87,63 +99,63 @@ class ChannelContextMenu(Screen):
                haveBouquets = config.usage.multibouquet.value
 
                if not (len(current_sel_path) or current_sel_flags & (eServiceReference.isDirectory|eServiceReference.isMarker)):
-                       apend_when_current_valid(current, menu, (_("show transponder info"), self.showServiceInformations))
+                       append_when_current_valid(current, menu, (_("show transponder info"), self.showServiceInformations), level = 2)
                if csel.bouquet_mark_edit == OFF and not csel.movemode:
                        if not inBouquetRootList:
                                isPlayable = not (current_sel_flags & (eServiceReference.isMarker|eServiceReference.isDirectory))
                                if isPlayable:
                                        if config.ParentalControl.configured.value:
                                                if parentalControl.getProtectionLevel(csel.getCurrentSelection().toCompareString()) == -1:
-                                                       apend_when_current_valid(current, menu, (_("add to parental protection"), boundFunction(self.addParentalProtection, csel.getCurrentSelection())))
+                                                       append_when_current_valid(current, menu, (_("add to parental protection"), boundFunction(self.addParentalProtection, csel.getCurrentSelection())), level = 0)
                                                else:
-                                                       apend_when_current_valid(current, menu, (_("remove from parental protection"), boundFunction(self.removeParentalProtection, csel.getCurrentSelection())))
+                                                       append_when_current_valid(current, menu, (_("remove from parental protection"), boundFunction(self.removeParentalProtection, csel.getCurrentSelection())), level = 0)
                                        if haveBouquets:
-                                               apend_when_current_valid(current, menu, (_("add service to bouquet"), self.addServiceToBouquetSelected))
+                                               append_when_current_valid(current, menu, (_("add service to bouquet"), self.addServiceToBouquetSelected), level = 0)
                                        else:
-                                               apend_when_current_valid(current, menu, (_("add service to favourites"), self.addServiceToBouquetSelected))
+                                               append_when_current_valid(current, menu, (_("add service to favourites"), self.addServiceToBouquetSelected), level = 0)
                                else:
                                        if haveBouquets:
                                                if not inBouquet and current_sel_path.find("PROVIDERS") == -1:
-                                                       apend_when_current_valid(current, menu, (_("copy to bouquets"), self.copyCurrentToBouquetList))
+                                                       append_when_current_valid(current, menu, (_("copy to bouquets"), self.copyCurrentToBouquetList), level = 0)
                                        if current_sel_path.find("flags == %d" %(FLAG_SERVICE_NEW_FOUND)) != -1:
-                                               apend_when_current_valid(current, menu, (_("remove all new found flags"), self.removeAllNewFoundFlags))
+                                               append_when_current_valid(current, menu, (_("remove all new found flags"), self.removeAllNewFoundFlags), level = 0)
                                if inBouquet:
-                                       apend_when_current_valid(current, menu, (_("remove entry"), self.removeCurrentService))
+                                       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:
-                                       apend_when_current_valid(current, menu, (_("remove new found flag"), self.removeNewFoundFlag))
+                                       append_when_current_valid(current, menu, (_("remove new found flag"), self.removeNewFoundFlag), level = 0)
                        else:
                                        menu.append((_("add bouquet"), self.showBouquetInputBox))
-                                       apend_when_current_valid(current, menu, (_("remove entry"), self.removeBouquet))
+                                       append_when_current_valid(current, menu, (_("remove entry"), self.removeBouquet), level = 0)
 
                if inBouquet: # current list is editable?
                        if csel.bouquet_mark_edit == OFF:
                                if not csel.movemode:
-                                       apend_when_current_valid(current, menu, (_("enable move mode"), self.toggleMoveMode))
+                                       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))
                                                if haveBouquets:
-                                                       apend_when_current_valid(current, menu, (_("enable bouquet edit"), self.bouquetMarkStart))
+                                                       append_when_current_valid(current, menu, (_("enable bouquet edit"), self.bouquetMarkStart), level = 0)
                                                else:
-                                                       apend_when_current_valid(current, menu, (_("enable favourite edit"), self.bouquetMarkStart))
+                                                       append_when_current_valid(current, menu, (_("enable favourite edit"), self.bouquetMarkStart), level = 0)
                                                if current_sel_flags & eServiceReference.isGroup:
-                                                       apend_when_current_valid(current, menu, (_("edit alternatives"), self.editAlternativeServices))
-                                                       apend_when_current_valid(current, menu, (_("show alternatives"), self.showAlternativeServices))
-                                                       apend_when_current_valid(current, menu, (_("remove all alternatives"), self.removeAlternativeServices))
+                                                       append_when_current_valid(current, menu, (_("edit alternatives"), self.editAlternativeServices), level = 2)
+                                                       append_when_current_valid(current, menu, (_("show alternatives"), self.showAlternativeServices), level = 2)
+                                                       append_when_current_valid(current, menu, (_("remove all alternatives"), self.removeAlternativeServices), level = 2)
                                                elif not current_sel_flags & eServiceReference.isMarker:
-                                                       apend_when_current_valid(current, menu, (_("add alternatives"), self.addAlternativeServices))
+                                                       append_when_current_valid(current, menu, (_("add alternatives"), self.addAlternativeServices), level = 2)
                                else:
-                                       apend_when_current_valid(current, menu, (_("disable move mode"), self.toggleMoveMode))
+                                       append_when_current_valid(current, menu, (_("disable move mode"), self.toggleMoveMode), level = 0)
                        else:
                                if csel.bouquet_mark_edit == EDIT_BOUQUET:
                                        if haveBouquets:
-                                               apend_when_current_valid(current, menu, (_("end bouquet edit"), self.bouquetMarkEnd))
-                                               apend_when_current_valid(current, menu, (_("abort bouquet edit"), self.bouquetMarkAbort))
+                                               append_when_current_valid(current, menu, (_("end bouquet edit"), self.bouquetMarkEnd), level = 0)
+                                               append_when_current_valid(current, menu, (_("abort bouquet edit"), self.bouquetMarkAbort), level = 0)
                                        else:
-                                               apend_when_current_valid(current, menu, (_("end favourites edit"), self.bouquetMarkEnd))
-                                               apend_when_current_valid(current, menu, (_("abort favourites edit"), self.bouquetMarkAbort))
+                                               append_when_current_valid(current, menu, (_("end favourites edit"), self.bouquetMarkEnd), level = 0)
+                                               append_when_current_valid(current, menu, (_("abort favourites edit"), self.bouquetMarkAbort), level = 0)
                                else:
-                                               apend_when_current_valid(current, menu, (_("end alternatives edit"), self.bouquetMarkEnd))
-                                               apend_when_current_valid(current, menu, (_("abort alternatives edit"), self.bouquetMarkAbort))
+                                               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)
@@ -158,7 +170,7 @@ class ChannelContextMenu(Screen):
                self.session.open( ServiceInfo, self.csel.getCurrentSelection() )
 
        def showBouquetInputBox(self):
-               self.session.openWithCallback(self.bouquetInputCallback, InputBox, title=_("Please enter a name for the new bouquet"), text="bouquetname", maxSize=False, type=Input.TEXT)
+               self.session.openWithCallback(self.bouquetInputCallback, InputBox, title=_("Please enter a name for the new bouquet"), text="bouquetname", maxSize=False, visible_width = 56, type=Input.TEXT)
 
        def bouquetInputCallback(self, bouquet):
                if bouquet is not None:
@@ -204,7 +216,7 @@ class ChannelContextMenu(Screen):
                self.close()
 
        def showMarkerInputBox(self):
-               self.session.openWithCallback(self.markerInputCallback, InputBox, title=_("Please enter a name for the new marker"), text="markername", maxSize=False, type=Input.TEXT)
+               self.session.openWithCallback(self.markerInputCallback, InputBox, title=_("Please enter a name for the new marker"), text="markername", maxSize=False, visible_width = 56, type=Input.TEXT)
 
        def markerInputCallback(self, marker):
                if marker is not None:
@@ -275,7 +287,7 @@ class SelectionEventInfo:
                self["ServiceEvent"] = ServiceEvent()
                self.servicelist.connectSelChanged(self.__selectionChanged)
                self.timer = eTimer()
-               self.timer.timeout.get().append(self.updateEventInfo)
+               self.timer.callback.append(self.updateEventInfo)
                self.onShown.append(self.__selectionChanged)
 
        def __selectionChanged(self):
@@ -647,7 +659,7 @@ class ChannelSelectionBase(Screen):
 
                self.bouquetNumOffsetCache = { }
 
-               self["ChannelSelectBaseActions"] = NumberActionMap(["ChannelSelectBaseActions", "NumberActions"],
+               self["ChannelSelectBaseActions"] = NumberActionMap(["ChannelSelectBaseActions", "NumberActions", "InputAsciiActions"],
                        {
                                "showFavourites": self.showFavourites,
                                "showAllServices": self.showAllServices,
@@ -657,6 +669,7 @@ class ChannelSelectionBase(Screen):
                                "prevBouquet": self.prevBouquet,
                                "nextMarker": self.nextMarker,
                                "prevMarker": self.prevMarker,
+                               "gotAsciiCode": self.keyAsciiCode,
                                "1": self.keyNumberGlobal,
                                "2": self.keyNumberGlobal,
                                "3": self.keyNumberGlobal,
@@ -866,7 +879,10 @@ class ChannelSelectionBase(Screen):
                                                        service = servicelist.getNext()
                                                        if not service.valid(): #check if end of list
                                                                break
-                                                       orbpos = service.getUnsignedData(4) >> 16
+                                                       unsigned_orbpos = service.getUnsignedData(4) >> 16
+                                                       orbpos = service.getData(4) >> 16
+                                                       if orbpos < 0:
+                                                               orbpos += 3600
                                                        if service.getPath().find("FROM PROVIDER") != -1:
                                                                service_type = _("Providers")
                                                        elif service.getPath().find("flags == %d" %(FLAG_SERVICE_NEW_FOUND)) != -1:
@@ -877,9 +893,9 @@ class ChannelSelectionBase(Screen):
                                                                # why we need this cast?
                                                                service_name = str(nimmanager.getSatDescription(orbpos))
                                                        except:
-                                                               if orbpos == 0xFFFF: #Cable
+                                                               if unsigned_orbpos == 0xFFFF: #Cable
                                                                        service_name = _("Cable")
-                                                               elif orbpos == 0xEEEE: #Terrestrial
+                                                               elif unsigned_orbpos == 0xEEEE: #Terrestrial
                                                                        service_name = _("Terrestrial")
                                                                else:
                                                                        if orbpos > 1800: # west
@@ -890,6 +906,17 @@ class ChannelSelectionBase(Screen):
                                                                        service_name = ("%d.%d" + h) % (orbpos / 10, orbpos % 10)
                                                        service.setName("%s - %s" % (service_name, service_type))
                                                        self.servicelist.addService(service)
+                                               cur_ref = self.session.nav.getCurrentlyPlayingServiceReference()
+                                               if cur_ref:
+                                                       pos = self.service_types.rfind(':')
+                                                       refstr = '%s (channelID == %08x%04x%04x) && %s ORDER BY name' %(self.service_types[:pos+1],
+                                                               cur_ref.getUnsignedData(4), # NAMESPACE
+                                                               cur_ref.getUnsignedData(2), # TSID
+                                                               cur_ref.getUnsignedData(3), # ONID
+                                                               self.service_types[pos+1:])
+                                                       ref = eServiceReference(refstr)
+                                                       ref.setName(_("Current Transponder"))
+                                                       self.servicelist.addService(ref)
                                                self.servicelist.finishFill()
                                                if prev is not None:
                                                        self.setCurrentSelection(prev)
@@ -957,6 +984,12 @@ class ChannelSelectionBase(Screen):
                if len(charstr) == 1:
                        self.servicelist.moveToChar(charstr[0])
 
+       def keyAsciiCode(self):
+               unichar = unichr(getPrevAsciiCode())
+               charstr = unichar.encode("utf-8")
+               if len(charstr) == 1:
+                       self.servicelist.moveToChar(charstr[0])
+
        def getRoot(self):
                return self.servicelist.getRoot()
 
@@ -1042,6 +1075,8 @@ class ChannelSelection(ChannelSelectionBase, ChannelSelectionEdit, ChannelSelect
                ChannelSelectionEPG.__init__(self)
                SelectionEventInfo.__init__(self)
 
+               self["CurrentTime"] = ObsoleteSource(new_source = "global.CurrentTime", removal_date = "2008-01")
+
                self["actions"] = ActionMap(["OkCancelActions", "TvRadioActions"],
                        {
                                "cancel": self.cancel,
@@ -1057,7 +1092,7 @@ class ChannelSelection(ChannelSelectionBase, ChannelSelectionEdit, ChannelSelect
                        })
 
                self.lastChannelRootTimer = eTimer()
-               self.lastChannelRootTimer.timeout.get().append(self.__onCreate)
+               self.lastChannelRootTimer.callback.append(self.__onCreate)
                self.lastChannelRootTimer.start(100,True)
 
                self.history_tv = [ ]
@@ -1070,6 +1105,15 @@ class ChannelSelection(ChannelSelectionBase, ChannelSelectionEdit, ChannelSelect
                self.revertMode = None
                config.usage.multibouquet.addNotifier(self.multibouquet_config_changed)
                self.new_service_played = False
+               self.onExecBegin.append(self.asciiOn)
+
+       def asciiOn(self):
+               rcinput = eRCInput.getInstance()
+               rcinput.setKeyboardMode(rcinput.kmAscii)
+
+       def asciiOff(self):
+               rcinput = eRCInput.getInstance()
+               rcinput.setKeyboardMode(rcinput.kmNone)
 
        def multibouquet_config_changed(self, val):
                self.recallBouquetMode()
@@ -1137,6 +1181,7 @@ class ChannelSelection(ChannelSelectionBase, ChannelSelectionEdit, ChannelSelect
                        root = self.getRoot()
                        if not root or not (root.flags & eServiceReference.isGroup):
                                self.zap()
+                               self.asciiOff()
                                self.close(ref)
 
        #called from infoBar and channelSelected
@@ -1281,6 +1326,7 @@ class ChannelSelection(ChannelSelectionBase, ChannelSelectionEdit, ChannelSelect
                elif self.revertMode == MODE_RADIO:
                        self.setModeRadio()
                self.revertMode = None
+               self.asciiOff()
                self.close(None)
 
 from Screens.InfoBarGenerics import InfoBarEvent, InfoBarServiceName
@@ -1290,7 +1336,7 @@ class RadioInfoBar(Screen, InfoBarEvent, InfoBarServiceName):
                Screen.__init__(self, session)
                InfoBarEvent.__init__(self)
                InfoBarServiceName.__init__(self)
-               self["CurrentTime"] = Clock()
+               self["CurrentTime"] = ObsoleteSource(new_source = "global.CurrentTime", removal_date = "2008-01")
                self["RdsDecoder"] = RdsDecoder(self.session.nav)
                self["BlinkingPoint"] = Pixmap()
                self["BlinkingPoint"].hide()
@@ -1303,9 +1349,6 @@ class ChannelSelectionRadio(ChannelSelectionBase, ChannelSelectionEdit, ChannelS
                ChannelSelectionEdit.__init__(self)
                ChannelSelectionEPG.__init__(self)
                self.infobar = infobar
-               config.radio = ConfigSubsection();
-               config.radio.lastservice = ConfigText()
-               config.radio.lastroot = ConfigText()
                self.onLayoutFinish.append(self.onCreate)
 
                self.info = session.instantiateDialog(RadioInfoBar) # our simple infobar
@@ -1408,6 +1451,8 @@ class ChannelSelectionRadio(ChannelSelectionBase, ChannelSelectionEdit, ChannelS
                if lastservice.valid():
                        self.servicelist.setCurrent(lastservice)
                        self.session.nav.playService(lastservice)
+               else:
+                       self.session.nav.stopService()
                self.info.show()
 
        def channelSelected(self): # just return selected service