2 from Components.MenuList import MenuList
3 from Components.ActionMap import ActionMap
4 from Components.ActionMap import NumberActionMap
5 from Components.Header import Header
6 from Components.Button import Button
7 from Components.Label import Label
9 from Components.HTMLComponent import *
10 from Components.GUIComponent import *
11 from Components.config import *
12 from Components.ConfigList import ConfigList
14 from enigma import eTimer, eDVBCI_UI, eListboxPythonStringContent, eListboxPythonConfigContent
20 def __init__(self, session, slotid, action):
21 Screen.__init__(self, session)
23 print "ciMMI with action" + str(action)
29 self.timer.timeout.get().append(self.keyCancel)
32 self["title"] = Label("")
33 self["subtitle"] = Label("")
34 self["bottom"] = Label("")
35 self["entries"] = ConfigList([ ])
36 self.listtype = TYPE_CONFIG
38 self["actions"] = NumberActionMap(["SetupActions"],
40 "ok": self.okbuttonClick,
41 "cancel": self.keyCancel,
44 "right": self.keyRight,
45 "1": self.keyNumberGlobal,
46 "2": self.keyNumberGlobal,
47 "3": self.keyNumberGlobal,
48 "4": self.keyNumberGlobal,
49 "5": self.keyNumberGlobal,
50 "6": self.keyNumberGlobal,
51 "7": self.keyNumberGlobal,
52 "8": self.keyNumberGlobal,
53 "9": self.keyNumberGlobal,
54 "0": self.keyNumberGlobal
59 if action == 2: #start MMI
60 eDVBCI_UI.getInstance().startMMI(self.slotid)
62 elif action == 3: #mmi already there (called from infobar)
65 def addEntry(self, list, entry):
66 if entry[0] == "TEXT": #handle every item (text / pin only?)
67 list.append( (entry[1], entry[2]) )
69 self.pinlength = entry[1]
72 x = configElement_nonSave("", configSequence, [1234], configsequencearg.get("PINCODE", (self.pinlength, "*")))
75 x = configElement_nonSave("", configSequence, [1234], configsequencearg.get("PINCODE", (self.pinlength, "")))
76 self["subtitle"].setText(entry[2])
77 self.pin = getConfigListEntry("",x)
78 list.append( self.pin )
79 self["bottom"].setText(_("please press OK when ready"))
81 def okbuttonClick(self):
85 if self.tag == "WAIT":
86 print "do nothing - wait"
87 elif self.tag == "MENU":
89 cur = self["entries"].getCurrent()
91 eDVBCI_UI.getInstance().answerMenu(self.slotid, cur[1])
93 eDVBCI_UI.getInstance().answerMenu(self.slotid, 0)
95 elif self.tag == "LIST":
97 eDVBCI_UI.getInstance().answerMenu(self.slotid, 0)
99 elif self.tag == "ENQ":
100 answer = str(self.pin[1].parent.value[0])
102 while length < self.pinlength:
105 eDVBCI_UI.getInstance().answerEnq(self.slotid, answer)
110 self.close(self.slotid)
116 if self.tag == "WAIT":
117 eDVBCI_UI.getInstance().stopMMI(self.slotid)
119 elif self.tag in [ "MENU", "LIST" ]:
121 eDVBCI_UI.getInstance().answerMenu(self.slotid, 0)
123 elif self.tag == "ENQ":
125 eDVBCI_UI.getInstance().cancelEnq(self.slotid)
128 print "give cancel action to ci"
130 def keyConfigEntry(self, key):
133 self["entries"].handleKey(key)
137 def keyNumberGlobal(self, number):
139 self.keyConfigEntry(config.key[str(number)])
143 self.keyConfigEntry(config.key["prevElement"])
147 self.keyConfigEntry(config.key["nextElement"])
149 def updateList(self, list):
150 List = self["entries"]
152 List.instance.moveSelectionTo(0)
157 if self.tag and self.tag == "ENQ":
162 if type != self.listtype:
163 if type == TYPE_CONFIG:
164 List.l = eListboxPythonConfigContent()
166 List.l = eListboxPythonStringContent()
167 List.instance.setContent(List.l)
174 self["title"].setText("")
175 self["subtitle"].setText("")
176 self["bottom"].setText("")
178 list.append( ("wait for ci...", 0) )
179 self.updateList(list)
181 def showScreen(self):
182 screen = eDVBCI_UI.getInstance().getMMIScreen(self.slotid)
187 if len(screen) > 0 and screen[0][0] == "CLOSE":
188 timeout = screen[0][1]
190 self.timer.start(timeout*1000, True)
194 self.tag = screen[0][0]
196 if entry[0] == "PIN":
197 self.addEntry(list, entry)
199 if entry[0] == "TITLE":
200 self["title"].setText(entry[1])
201 elif entry[0] == "SUBTITLE":
202 self["subtitle"].setText(entry[1])
203 elif entry[0] == "BOTTOM":
204 self["bottom"].setText(entry[1])
205 elif entry[0] == "TEXT":
206 self.addEntry(list, entry)
207 self.updateList(list)
209 def ciStateChanged(self):
210 if self.action == 0: #reset
212 if self.action == 1: #init
215 #module still there ?
216 if eDVBCI_UI.getInstance().getState(self.slotid) != 2:
219 #mmi session still active ?
220 if eDVBCI_UI.getInstance().getMMIState(self.slotid) != 1:
223 if self.action > 1 and eDVBCI_UI.getInstance().availableMMI(self.slotid) == 1:
226 #FIXME: check for mmi-session closed
228 class CiMessageHandler:
233 eDVBCI_UI.getInstance().ciStateChanged.get().append(self.ciStateChanged)
235 def setSession(self, session):
236 self.session = session
238 def ciStateChanged(self, slot):
242 if slot in self.dlgs:
243 self.dlgs[slot].ciStateChanged()
244 elif eDVBCI_UI.getInstance().availableMMI(slot) == 1:
246 self.dlgs[slot] = self.session.openWithCallback(self.dlgClosed, CiMmi, slot, 3)
250 def dlgClosed(self, slot):
253 def registerCIMessageHandler(self, slot, func):
254 self.unregisterCIMessageHandler(slot)
257 def unregisterCIMessageHandler(self, slot):
261 CiHandler = CiMessageHandler()
263 class CiSelection(Screen):
264 def __init__(self, session):
265 Screen.__init__(self, session)
267 self["actions"] = ActionMap(["OkCancelActions"],
269 "ok": self.okbuttonClick,
270 "cancel": self.cancel
276 self["entries"] = MenuList(list)
278 self.createMenu(0) # FIXME more than one CI
279 CiHandler.registerCIMessageHandler(0, self.ciStateChanged)
284 def createMenu(self, slot):
285 self.list.append( (_("Reset"), 0, slot) )
286 self.list.append( (_("Init"), 1, slot) )
288 self.state[slot] = eDVBCI_UI.getInstance().getState(slot)
289 if self.state[slot] == 0: #no module
290 self.list.append( (_("no module found"), 2, slot) )
291 elif self.state[slot] == 1: #module in init
292 self.list.append( (_("init module"), 2, slot) )
293 elif self.state[slot] == 2: #module ready
295 appname = eDVBCI_UI.getInstance().getAppName(slot)
296 self.list.append( (appname, 2, slot) )
298 self["entries"].list = self.list
299 self["entries"].l.setList(self.list)
301 def ciStateChanged(self, slot):
303 self.dlg.ciStateChanged()
305 state = eDVBCI_UI.getInstance().getState(slot)
306 if self.state[slot] != state:
307 #print "something happens"
308 self.state[slot] = state
310 self.createMenu(slot)
312 def dlgClosed(self, slot):
315 def okbuttonClick(self):
316 cur = self["entries"].getCurrent()
320 if action == 0: #reset
321 eDVBCI_UI.getInstance().setReset(slot)
322 elif action == 1: #init
323 eDVBCI_UI.getInstance().setInit(slot)
324 elif self.state[slot] == 2:
325 self.dlg = self.session.openWithCallback(self.dlgClosed, CiMmi, slot, action)
327 #generate menu / list
329 #list.append( ("TEXT", "CA-Info") )
330 #list.append( ("TEXT", "Card Status") )
331 #list.append( ("PIN", 6, "Card Pin", 1) )
332 #self.session.open(CiMmi, 0, 0, "Wichtiges CI", "Mainmenu", "Footer", list)
335 CiHandler.unregisterCIMessageHandler(0)