42f1e0091f947ad5cd781e103cbf2e8805cd95b3
[enigma2.git] / mytest.py
1 from enigma import *
2 from tools import *
3
4 from Components.Language import language
5
6 import traceback
7 import Screens.InfoBar
8
9 import sys
10 import time
11
12 import ServiceReference
13
14 from Navigation import Navigation
15
16 from skin import readSkin, applyAllAttributes
17
18 from Components.config import configfile
19 from Tools.Directories import InitFallbackFiles
20 InitFallbackFiles()
21 eDVBDB.getInstance().reloadBouquets()
22
23 try:
24         from twisted.internet import e2reactor
25         e2reactor.install()
26         
27         from twisted.internet import reactor
28         
29         def runReactor():
30                 reactor.run()
31 except:
32         def runReactor():
33                 runMainloop()
34
35 # initialize autorun plugins and plugin menu entries
36 from Components.PluginComponent import plugins
37 plugins.getPluginList(runAutostartPlugins=True)
38 from Screens.Wizard import wizardManager
39 from Screens.StartWizard import *
40 from Screens.TutorialWizard import *
41 from Tools.BoundFunction import boundFunction
42
43 had = dict()
44
45 def dump(dir, p = ""):
46         if isinstance(dir, dict):
47                 for (entry, val) in dir.items():
48                         dump(val, p + "(dict)/" + entry)
49         if hasattr(dir, "__dict__"):
50                 for name, value in dir.__dict__.items():
51                         if not had.has_key(str(value)):
52                                 had[str(value)] = 1
53                                 dump(value, p + "/" + str(name))
54                         else:
55                                 print p + "/" + str(name) + ":" + str(dir.__class__) + "(cycle)"
56         else:
57                 print p + ":" + str(dir)
58
59 # + ":" + str(dir.__class__)
60
61 # display
62
63 class OutputDevice:
64         def create(self, screen): pass
65
66 # display: HTML
67
68 class HTMLOutputDevice(OutputDevice):
69         def create(self, comp):
70                 print comp.produceHTML()
71
72 html = HTMLOutputDevice()
73
74 class GUIOutputDevice(OutputDevice):
75         parent = None
76         def create(self, comp, desktop):
77                 comp.createGUIScreen(self.parent, desktop)
78
79 class Session:
80         def __init__(self):
81                 self.desktop = None
82                 self.delayTimer = eTimer()
83                 self.delayTimer.timeout.get().append(self.processDelay)
84                 
85                 self.currentDialog = None
86                 
87                 self.dialogStack = [ ]
88         
89         def processDelay(self):
90                 self.execEnd()
91                 
92                 callback = self.currentDialog.callback
93
94                 retval = self.currentDialog.returnValue
95
96                 if self.currentDialog.isTmp:
97                         self.currentDialog.doClose()
98 #                       dump(self.currentDialog)
99                         del self.currentDialog
100                 else:
101                         del self.currentDialog.callback
102                 
103                 self.popCurrent()
104                 if callback is not None:
105                         callback(*retval)
106
107         def execBegin(self):
108                 c = self.currentDialog
109                 c.execBegin()
110
111                 # when execBegin opened a new dialog, don't bother showing the old one.
112                 if c == self.currentDialog:
113                         c.instance.show()
114                 
115         def execEnd(self):
116                 self.currentDialog.execEnd()
117                 self.currentDialog.instance.hide()
118         
119         def create(self, screen, arguments):
120                 # creates an instance of 'screen' (which is a class)
121                 try:
122                         return screen(self, *arguments)
123                 except:
124                         errstr = "Screen %s(%s): %s" % (str(screen), str(arguments), sys.exc_info()[0])
125                         print errstr
126                         traceback.print_exc(file=sys.stdout)
127                         quitMainloop(5)
128                         
129         
130         def instantiateDialog(self, screen, *arguments):
131                 # create dialog
132                 
133                 try:
134                         dlg = self.create(screen, arguments)
135                 except:
136                         print 'EXCEPTION IN DIALOG INIT CODE, ABORTING:'
137                         print '-'*60
138                         traceback.print_exc(file=sys.stdout)
139                         quitMainloop(5)
140                         print '-'*60
141                 
142                 if dlg is None:
143                         return
144
145                 # read skin data
146                 readSkin(dlg, None, dlg.skinName, self.desktop)
147
148                 # create GUI view of this dialog
149                 assert self.desktop != None
150                 
151                 z = 0
152                 for (key, value) in dlg.skinAttributes:
153                         if key == "zPosition":
154                                 z = int(value)
155
156                 dlg.instance = eWindow(self.desktop, z)
157                 applyAllAttributes(dlg.instance, self.desktop, dlg.skinAttributes)
158                 gui = GUIOutputDevice()
159                 gui.parent = dlg.instance
160                 gui.create(dlg, self.desktop)
161                 
162                 return dlg
163          
164         def pushCurrent(self):
165                 if self.currentDialog:
166                         self.dialogStack.append(self.currentDialog)
167                         self.execEnd()
168         
169         def popCurrent(self):
170                 if len(self.dialogStack):
171                         self.currentDialog = self.dialogStack.pop()
172                         self.execBegin()
173                 else:
174                         self.currentDialog = None
175
176         def execDialog(self, dialog):
177                 self.pushCurrent()
178                 self.currentDialog = dialog
179                 self.currentDialog.isTmp = False
180                 self.currentDialog.callback = None # would cause re-entrancy problems.
181                 self.execBegin()
182
183         def openWithCallback(self, callback, screen, *arguments):
184                 dlg = self.open(screen, *arguments)
185                 dlg.callback = callback
186
187         def open(self, screen, *arguments):
188                 self.pushCurrent()
189                 dlg = self.currentDialog = self.instantiateDialog(screen, *arguments)
190                 dlg.isTmp = True
191                 dlg.callback = None
192                 self.execBegin()
193                 return dlg
194
195         def keyEvent(self, code):
196                 print "code " + str(code)
197
198         def close(self, *retval):
199                 self.currentDialog.returnValue = retval
200                 self.delayTimer.start(0, 1)
201
202 def runScreenTest():
203         session = Session()
204         session.desktop = getDesktop()
205         
206         session.nav = Navigation()
207         
208         screensToRun = wizardManager.getWizards()
209         screensToRun.append(Screens.InfoBar.InfoBar)
210         
211         def runNextScreen(session, screensToRun, *result):
212                 if result:
213                         quitMainloop(result)
214
215                 screen = screensToRun[0]
216                 
217                 if len(screensToRun):
218                         session.openWithCallback(boundFunction(runNextScreen, session, screensToRun[1:]), screen)
219                 else:
220                         session.open(screen)
221         
222         runNextScreen(session, screensToRun)
223
224         CONNECT(keyPressedSignal(), session.keyEvent)
225         
226         runReactor()
227         
228         configfile.save()
229         
230         session.nav.shutdown()
231         
232         return 0
233
234 import keymapparser
235 keymapparser.readKeymap()
236 import skin
237 skin.loadSkin(getDesktop())
238
239 import Components.InputDevice
240 Components.InputDevice.InitInputDevices()
241
242 import Components.AVSwitch
243 Components.AVSwitch.InitAVSwitch()
244
245 import Components.RecordingConfig
246 Components.RecordingConfig.InitRecordingConfig()
247
248 import Components.UsageConfig
249 Components.UsageConfig.InitUsageConfig()
250
251 import Components.Network
252 Components.Network.InitNetwork()
253
254 import Components.Lcd
255 Components.Lcd.InitLcd()
256
257 import Components.SetupDevices
258 Components.SetupDevices.InitSetupDevices()
259
260 import Components.RFmod
261 Components.RFmod.InitRFmod()
262
263 import Components.NimManager
264
265 # first, setup a screen
266 try:
267         runScreenTest()
268         plugins.getPluginList(runAutoendPlugins=True)
269 except:
270         print 'EXCEPTION IN PYTHON STARTUP CODE:'
271         print '-'*60
272         traceback.print_exc(file=sys.stdout)
273         quitMainloop(5)
274         print '-'*60