+ def enterPath(self, ref, justSet=False):
+ self.servicePath.append(ref)
+ self.setRoot(ref, justSet)
+
+ def pathUp(self, justSet=False):
+ prev = self.servicePath.pop()
+ if self.servicePath:
+ current = self.servicePath[-1]
+ self.setRoot(current, justSet)
+ if not justSet:
+ self.setCurrentSelection(prev)
+ return prev
+
+ def isBasePathEqual(self, ref):
+ if len(self.servicePath) > 1 and self.servicePath[0] == ref:
+ return True
+ return False
+
+ def isPrevPathEqual(self, ref):
+ length = len(self.servicePath)
+ if length > 1 and self.servicePath[length-2] == ref:
+ return True
+ return False
+
+ def preEnterPath(self, refstr):
+ return False
+
+ def showAllServices(self):
+ if not self.pathChangeDisabled:
+ refstr = '%s ORDER BY name'%(self.service_types)
+ if not self.preEnterPath(refstr):
+ ref = eServiceReference(refstr)
+ currentRoot = self.getRoot()
+ if currentRoot is None or currentRoot != ref:
+ self.clearPath()
+ self.enterPath(ref)
+
+ def showSatellites(self):
+ if not self.pathChangeDisabled:
+ refstr = '%s FROM SATELLITES ORDER BY satellitePosition'%(self.service_types)
+ if not self.preEnterPath(refstr):
+ ref = eServiceReference(refstr)
+ justSet=False
+ prev = None
+
+ if self.isBasePathEqual(ref):
+ if self.isPrevPathEqual(ref):
+ justSet=True
+ prev = self.pathUp(justSet)
+ else:
+ currentRoot = self.getRoot()
+ if currentRoot is None or currentRoot != ref:
+ justSet=True
+ self.clearPath()
+ self.enterPath(ref, True)
+ if justSet:
+ serviceHandler = eServiceCenter.getInstance()
+ servicelist = serviceHandler.list(ref)
+ if not servicelist is None:
+ while True:
+ service = servicelist.getNext()
+ if not service.valid(): #check if end of list
+ break
+ 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:
+ service_type = _("New")
+ else:
+ service_type = _("Services")
+ try:
+ # why we need this cast?
+ service_name = str(nimmanager.getSatDescription(orbpos))
+ except:
+ if unsigned_orbpos == 0xFFFF: #Cable
+ service_name = _("Cable")
+ elif unsigned_orbpos == 0xEEEE: #Terrestrial
+ service_name = _("Terrestrial")
+ else:
+ if orbpos > 1800: # west
+ orbpos = 3600 - orbpos
+ h = _("W")
+ else:
+ h = _("E")
+ 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)
+
+ def showProviders(self):
+ if not self.pathChangeDisabled:
+ refstr = '%s FROM PROVIDERS ORDER BY name'%(self.service_types)
+ if not self.preEnterPath(refstr):
+ ref = eServiceReference(refstr)
+ if self.isBasePathEqual(ref):
+ self.pathUp()
+ else:
+ currentRoot = self.getRoot()
+ if currentRoot is None or currentRoot != ref:
+ self.clearPath()
+ self.enterPath(ref)
+
+ def changeBouquet(self, direction):
+ if not self.pathChangeDisabled:
+ if len(self.servicePath) > 1:
+ #when enter satellite root list we must do some magic stuff..
+ ref = eServiceReference('%s FROM SATELLITES ORDER BY satellitePosition'%(self.service_types))
+ if self.isBasePathEqual(ref):
+ self.showSatellites()
+ else:
+ self.pathUp()
+ if direction < 0:
+ self.moveUp()
+ else:
+ self.moveDown()
+ ref = self.getCurrentSelection()
+ self.enterPath(ref)
+
+ def inBouquet(self):
+ if self.servicePath and self.servicePath[0] == self.bouquet_root:
+ return True
+ return False
+
+ def atBegin(self):
+ return self.servicelist.atBegin()
+
+ def atEnd(self):
+ return self.servicelist.atEnd()
+
+ def nextBouquet(self):
+ self.changeBouquet(+1)
+
+ def prevBouquet(self):
+ self.changeBouquet(-1)
+
+ def showFavourites(self):
+ if not self.pathChangeDisabled:
+ if not self.preEnterPath(self.bouquet_rootstr):
+ if self.isBasePathEqual(self.bouquet_root):
+ self.pathUp()
+ else:
+ currentRoot = self.getRoot()
+ if currentRoot is None or currentRoot != self.bouquet_root:
+ self.clearPath()
+ self.enterPath(self.bouquet_root)
+
+ def keyNumberGlobal(self, number):
+ unichar = self.numericalTextInput.getKey(number)
+ charstr = unichar.encode("utf-8")
+ 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()
+
+ def getCurrentSelection(self):
+ return self.servicelist.getCurrent()
+
+ def setCurrentSelection(self, service):
+ self.servicelist.setCurrent(service)
+
+ def getBouquetList(self):
+ bouquets = [ ]
+ serviceHandler = eServiceCenter.getInstance()
+ if config.usage.multibouquet.value:
+ list = serviceHandler.list(self.bouquet_root)
+ if list:
+ while True:
+ s = list.getNext()
+ if not s.valid():
+ break
+ if s.flags & eServiceReference.isDirectory:
+ info = serviceHandler.info(s)
+ if info:
+ bouquets.append((info.getName(s), s))
+ return bouquets
+ else:
+ info = serviceHandler.info(self.bouquet_root)
+ if info:
+ bouquets.append((info.getName(self.bouquet_root), self.bouquet_root))
+ return bouquets
+ return None
+
+ def keyNumber0(self, num):
+ if len(self.servicePath) > 1:
+ self.keyGoUp()
+ else:
+ self.keyNumberGlobal(num)
+
+ def keyGoUp(self):
+ if len(self.servicePath) > 1:
+ if self.isBasePathEqual(self.bouquet_root):
+ self.showFavourites()
+ else:
+ ref = eServiceReference('%s FROM SATELLITES ORDER BY satellitePosition'%(self.service_types))
+ if self.isBasePathEqual(ref):
+ self.showSatellites()
+ else:
+ ref = eServiceReference('%s FROM PROVIDERS ORDER BY name'%(self.service_types))
+ if self.isBasePathEqual(ref):
+ self.showProviders()
+ else:
+ self.showAllServices()
+
+ def nextMarker(self):
+ self.servicelist.moveToNextMarker()
+
+ def prevMarker(self):
+ self.servicelist.moveToPrevMarker()
+
+HISTORYSIZE = 20
+
+#config for lastservice
+config.tv = ConfigSubsection()
+config.tv.lastservice = ConfigText()
+config.tv.lastroot = ConfigText()
+config.radio = ConfigSubsection()
+config.radio.lastservice = ConfigText()
+config.radio.lastroot = ConfigText()
+config.servicelist = ConfigSubsection()
+config.servicelist.lastmode = ConfigText(default = "tv")
+
+class ChannelSelection(ChannelSelectionBase, ChannelSelectionEdit, ChannelSelectionEPG, SelectionEventInfo):
+ def __init__(self, session):
+ ChannelSelectionBase.__init__(self,session)
+ ChannelSelectionEdit.__init__(self)
+ ChannelSelectionEPG.__init__(self)
+ SelectionEventInfo.__init__(self)
+
+ self["actions"] = ActionMap(["OkCancelActions", "TvRadioActions"],
+ {
+ "cancel": self.cancel,
+ "ok": self.channelSelected,
+ "keyRadio": self.setModeRadio,
+ "keyTV": self.setModeTv,
+ })
+
+ self.__event_tracker = ServiceEventTracker(screen=self, eventmap=
+ {
+ iPlayableService.evStart: self.__evServiceStart,
+ iPlayableService.evEnd: self.__evServiceEnd
+ })
+
+ self.lastChannelRootTimer = eTimer()
+ self.lastChannelRootTimer.callback.append(self.__onCreate)
+ self.lastChannelRootTimer.start(100,True)
+
+ self.history_tv = [ ]
+ self.history_radio = [ ]
+ self.history = self.history_tv
+ self.history_pos = 0
+
+ self.lastservice = config.tv.lastservice
+ self.lastroot = config.tv.lastroot
+ 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()
+
+ def __evServiceStart(self):
+ service = self.session.nav.getCurrentService()
+ if service:
+ info = service.info()
+ if info:
+ refstr = info.getInfoString(iServiceInformation.sServiceref)
+ self.servicelist.setPlayableIgnoreService(eServiceReference(refstr))
+
+ def __evServiceEnd(self):
+ self.servicelist.setPlayableIgnoreService(eServiceReference())
+
+ def setMode(self):
+ self.restoreRoot()
+ lastservice=eServiceReference(self.lastservice.value)
+ if lastservice.valid():
+ self.setCurrentSelection(lastservice)
+
+ def setModeTv(self):
+ if self.revertMode is None and config.servicelist.lastmode.value == "radio":
+ self.revertMode = MODE_RADIO
+ self.history = self.history_tv
+ self.lastservice = config.tv.lastservice
+ self.lastroot = config.tv.lastroot
+ config.servicelist.lastmode.value = "tv"
+ self.setTvMode()
+ self.setMode()
+
+ def setModeRadio(self):
+ if self.revertMode is None and config.servicelist.lastmode.value == "tv":
+ self.revertMode = MODE_TV
+ if config.usage.e1like_radio_mode.value:
+ self.history = self.history_radio
+ self.lastservice = config.radio.lastservice
+ self.lastroot = config.radio.lastroot
+ config.servicelist.lastmode.value = "radio"
+ self.setRadioMode()
+ self.setMode()
+
+ def __onCreate(self):
+ if config.usage.e1like_radio_mode.value:
+ if config.servicelist.lastmode.value == "tv":
+ self.setModeTv()
+ else:
+ self.setModeRadio()
+ else:
+ self.setModeTv()
+ lastservice=eServiceReference(self.lastservice.value)
+ if lastservice.valid():
+ self.zap()
+
+ def channelSelected(self):
+ ref = self.getCurrentSelection()