1 from Tools import RedirectOutput
5 from Components.Language import language
8 print "language set to", language.getLanguage()
9 eServiceEvent.setEPGLanguage(language.getLanguage())
11 language.addCallback(setEPGLanguage)
14 import Screens.InfoBar
15 from Screens.SimpleSummary import SimpleSummary
20 import ServiceReference
22 from Navigation import Navigation
24 from skin import readSkin, applyAllAttributes
26 from Components.config import configfile
27 from Tools.Directories import InitFallbackFiles, resolveFilename, SCOPE_PLUGINS
29 eDVBDB.getInstance().reloadBouquets()
35 from twisted.internet import reactor
40 print "twisted not available"
44 # initialize autorun plugins and plugin menu entries
45 from Components.PluginComponent import plugins
47 from Screens.Wizard import wizardManager
48 from Screens.ImageWizard import *
49 from Screens.StartWizard import *
50 from Screens.TutorialWizard import *
51 from Tools.BoundFunction import boundFunction
52 from Plugins.Plugin import PluginDescriptor
56 def dump(dir, p = ""):
57 if isinstance(dir, dict):
58 for (entry, val) in dir.items():
59 dump(val, p + "(dict)/" + entry)
60 if hasattr(dir, "__dict__"):
61 for name, value in dir.__dict__.items():
62 if not had.has_key(str(value)):
64 dump(value, p + "/" + str(name))
66 print p + "/" + str(name) + ":" + str(dir.__class__) + "(cycle)"
68 print p + ":" + str(dir)
70 # + ":" + str(dir.__class__)
75 def create(self, screen): pass
79 class HTMLOutputDevice(OutputDevice):
80 def create(self, comp):
81 print comp.produceHTML()
83 html = HTMLOutputDevice()
85 class GUIOutputDevice(OutputDevice):
87 def create(self, comp, desktop):
88 comp.createGUIScreen(self.parent, desktop)
91 def __init__(self, desktop = None, summary_desktop = None, navigation = None):
92 self.desktop = desktop
93 self.summary_desktop = summary_desktop
95 self.delay_timer = eTimer()
96 self.delay_timer.timeout.get().append(self.processDelay)
98 self.current_dialog = None
100 self.dialog_stack = [ ]
101 self.summary_stack = [ ]
106 for p in plugins.getPlugins(PluginDescriptor.WHERE_SESSIONSTART):
107 p(reason=0, session=self)
109 def processDelay(self):
110 callback = self.current_dialog.callback
112 retval = self.current_dialog.returnValue
114 if self.current_dialog.isTmp:
115 self.current_dialog.doClose()
116 # dump(self.current_dialog)
117 del self.current_dialog
119 del self.current_dialog.callback
122 if callback is not None:
126 assert not self.in_exec
128 c = self.current_dialog
132 summary = c.createSummary() or SimpleSummary
133 self.summary = self.instantiateSummaryDialog(summary, c)
136 c.addSummary(self.summary)
139 # when execBegin opened a new dialog, don't bother showing the old one.
140 if c == self.current_dialog:
147 self.current_dialog.execEnd()
148 self.current_dialog.hide()
149 self.current_dialog.removeSummary(self.summary)
152 def create(self, screen, arguments, **kwargs):
153 # creates an instance of 'screen' (which is a class)
155 return screen(self, *arguments, **kwargs)
157 errstr = "Screen %s(%s, %s): %s" % (str(screen), str(arguments), str(kwargs), sys.exc_info()[0])
159 traceback.print_exc(file=sys.stdout)
162 def instantiateDialog(self, screen, *arguments, **kwargs):
163 return self.doInstantiateDialog(screen, arguments, kwargs, self.desktop)
165 def instantiateSummaryDialog(self, screen, *arguments, **kwargs):
166 return self.doInstantiateDialog(screen, arguments, kwargs, self.summary_desktop)
168 def doInstantiateDialog(self, screen, arguments, kwargs, desktop):
172 dlg = self.create(screen, arguments, **kwargs)
174 print 'EXCEPTION IN DIALOG INIT CODE, ABORTING:'
176 traceback.print_exc(file=sys.stdout)
184 readSkin(dlg, None, dlg.skinName, desktop)
186 # create GUI view of this dialog
187 assert desktop is not None
191 for (key, value) in dlg.skinAttributes:
192 if key == "zPosition":
197 dlg.instance = eWindow(desktop, z)
199 applyAllAttributes(dlg.instance, desktop, dlg.skinAttributes)
200 gui = GUIOutputDevice()
201 gui.parent = dlg.instance
202 gui.create(dlg, desktop)
206 def pushCurrent(self):
207 if self.current_dialog:
208 self.dialog_stack.append(self.current_dialog)
211 def popCurrent(self):
212 if len(self.dialog_stack):
213 self.current_dialog = self.dialog_stack.pop()
216 self.current_dialog = None
218 def execDialog(self, dialog):
220 self.current_dialog = dialog
221 self.current_dialog.isTmp = False
222 self.current_dialog.callback = None # would cause re-entrancy problems.
225 def openWithCallback(self, callback, screen, *arguments, **kwargs):
226 dlg = self.open(screen, *arguments, **kwargs)
227 dlg.callback = callback
229 def open(self, screen, *arguments, **kwargs):
231 dlg = self.current_dialog = self.instantiateDialog(screen, *arguments, **kwargs)
237 def keyEvent(self, code):
238 print "code " + str(code)
240 def close(self, *retval):
242 print "close after exec!"
245 self.current_dialog.returnValue = retval
246 self.delay_timer.start(0, 1)
249 def pushSummary(self):
250 if self.summary is not None:
252 self.summary_stack.append(self.summary)
255 def popSummary(self):
256 if self.summary is not None:
257 self.summary.doClose()
258 self.summary = self.summary_stack.pop()
259 if self.summary is not None:
262 from Screens.Volume import Volume
263 from Screens.Mute import Mute
264 from GlobalActions import globalActionMap
265 from Components.config import ConfigSubsection, configSequence, configElement, configsequencearg
267 #TODO .. move this to a own .py file
269 """Volume control, handles volUp, volDown, volMute actions and display
270 a corresponding dialog"""
271 def __init__(self, session):
272 global globalActionMap
273 globalActionMap.actions["volumeUp"]=self.volUp
274 globalActionMap.actions["volumeDown"]=self.volDown
275 globalActionMap.actions["volumeMute"]=self.volMute
277 config.audio = ConfigSubsection()
278 config.audio.volume = configElement("config.audio.volume", configSequence, [100], configsequencearg.get("INTEGER", (0, 100)))
280 self.volumeDialog = session.instantiateDialog(Volume)
281 self.muteDialog = session.instantiateDialog(Mute)
283 self.hideVolTimer = eTimer()
284 self.hideVolTimer.timeout.get().append(self.volHide)
286 vol = config.audio.volume.value[0]
287 self.volumeDialog.setValue(vol)
288 eDVBVolumecontrol.getInstance().setVolume(vol, vol)
291 config.audio.volume.value = eDVBVolumecontrol.getInstance().getVolume()
292 config.audio.volume.save()
295 if (eDVBVolumecontrol.getInstance().isMuted()):
297 eDVBVolumecontrol.getInstance().volumeUp()
298 self.volumeDialog.show()
299 self.volumeDialog.setValue(eDVBVolumecontrol.getInstance().getVolume())
301 self.hideVolTimer.start(3000, True)
304 if (eDVBVolumecontrol.getInstance().isMuted()):
306 eDVBVolumecontrol.getInstance().volumeDown()
307 self.volumeDialog.show()
308 self.volumeDialog.setValue(eDVBVolumecontrol.getInstance().getVolume())
310 self.hideVolTimer.start(3000, True)
313 self.volumeDialog.hide()
316 eDVBVolumecontrol.getInstance().volumeToggleMute()
317 self.volumeDialog.setValue(eDVBVolumecontrol.getInstance().getVolume())
319 if (eDVBVolumecontrol.getInstance().isMuted()):
320 self.muteDialog.show()
322 self.muteDialog.hide()
324 from Screens.Standby import Standby
327 """ PowerKey stuff - handles the powerkey press and powerkey release actions"""
329 def __init__(self, session):
330 self.session = session
331 self.powerKeyTimer = eTimer()
332 self.powerKeyTimer.timeout.get().append(self.powertimer)
333 globalActionMap.actions["powerdown"]=self.powerdown
334 globalActionMap.actions["powerup"]=self.powerup
335 self.standbyblocked = 0
336 # self["PowerKeyActions"] = HelpableActionMap(self, "PowerKeyActions",
338 #"powerdown": self.powerdown,
339 #"powerup": self.powerup,
340 #"discreteStandby": (self.standby, "Go standby"),
341 #"discretePowerOff": (self.quit, "Go to deep standby"),
344 def powertimer(self):
345 print "PowerOff - Now!"
349 self.standbyblocked = 0
350 self.powerKeyTimer.start(3000, True)
353 self.powerKeyTimer.stop()
354 if self.standbyblocked == 0:
355 self.standbyblocked = 1
359 self.session.open(Standby, self)
366 plugins.readPluginList(resolveFilename(SCOPE_PLUGINS))
368 session = Session(desktop = getDesktop(0), summary_desktop = getDesktop(1), navigation = Navigation())
372 for p in plugins.getPlugins(PluginDescriptor.WHERE_WIZARD):
373 screensToRun.append(p.__call__)
375 screensToRun += wizardManager.getWizards()
377 screensToRun.append(Screens.InfoBar.InfoBar)
379 def runNextScreen(session, screensToRun, *result):
381 quitMainloop(*result)
384 screen = screensToRun[0]
386 if len(screensToRun):
387 session.openWithCallback(boundFunction(runNextScreen, session, screensToRun[1:]), screen)
391 runNextScreen(session, screensToRun)
393 CONNECT(keyPressedSignal(), session.keyEvent)
395 vol = VolumeControl(session)
396 power = PowerKey(session)
402 from Tools.DreamboxHardware import setFPWakeuptime
403 from time import time
404 nextRecordingTime = session.nav.RecordTimer.getNextRecordingTime()
405 if nextRecordingTime != -1:
406 if (nextRecordingTime - time() < 330): # no time to switch box back on
407 setFPWakeuptime(time() + 30) # so switch back on in 30 seconds
409 setFPWakeuptime(nextRecordingTime - (300))
411 session.nav.shutdown()
416 keymapparser.readKeymap()
418 skin.loadSkinData(getDesktop(0))
420 import Components.InputDevice
421 Components.InputDevice.InitInputDevices()
423 import Components.AVSwitch
424 Components.AVSwitch.InitAVSwitch()
426 import Components.RecordingConfig
427 Components.RecordingConfig.InitRecordingConfig()
429 import Components.UsageConfig
430 Components.UsageConfig.InitUsageConfig()
432 import Components.Network
433 Components.Network.InitNetwork()
435 import Components.Lcd
436 Components.Lcd.InitLcd()
438 import Components.SetupDevices
439 Components.SetupDevices.InitSetupDevices()
441 import Components.RFmod
442 Components.RFmod.InitRFmod()
444 import Components.NimManager
446 # first, setup a screen
452 print 'EXCEPTION IN PYTHON STARTUP CODE:'
454 traceback.print_exc(file=sys.stdout)