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)
28 self.timer.timeout.get().append(self.keyCancel)
31 self["title"] = Label("")
32 self["subtitle"] = Label("")
33 self["bottom"] = Label("")
34 self["entries"] = ConfigList([ ])
35 self.listtype = TYPE_CONFIG
37 self["actions"] = NumberActionMap(["SetupActions"],
39 "ok": self.okbuttonClick,
40 "cancel": self.keyCancel,
43 "right": self.keyRight,
44 "1": self.keyNumberGlobal,
45 "2": self.keyNumberGlobal,
46 "3": self.keyNumberGlobal,
47 "4": self.keyNumberGlobal,
48 "5": self.keyNumberGlobal,
49 "6": self.keyNumberGlobal,
50 "7": self.keyNumberGlobal,
51 "8": self.keyNumberGlobal,
52 "9": self.keyNumberGlobal,
53 "0": self.keyNumberGlobal
58 if action == 2: #start MMI
59 eDVBCI_UI.getInstance().startMMI(self.slotid)
61 elif action == 3: #mmi already there (called from infobar)
64 def addEntry(self, list, entry):
65 if entry[0] == "TEXT": #handle every item (text / pin only?)
66 list.append( (entry[1], entry[2]) )
68 self.pinlength = entry[1]
71 x = configElement_nonSave("", configSequence, [1234], configsequencearg.get("PINCODE", (self.pinlength, "*")))
74 x = configElement_nonSave("", configSequence, [1234], configsequencearg.get("PINCODE", (self.pinlength, "")))
75 self["subtitle"].setText(entry[2])
76 self.pin = getConfigListEntry("",x)
77 list.append( self.pin )
78 self["bottom"].setText(_("please press OK when ready"))
80 def okbuttonClick(self):
82 if self.tag == "WAIT":
83 print "do nothing - wait"
84 elif self.tag == "MENU":
86 cur = self["entries"].getCurrent()
88 eDVBCI_UI.getInstance().answerMenu(self.slotid, cur[1])
90 eDVBCI_UI.getInstance().answerMenu(self.slotid, 0)
92 elif self.tag == "LIST":
94 eDVBCI_UI.getInstance().answerMenu(self.slotid, 0)
96 elif self.tag == "ENQ":
97 answer = str(self.pin[1].parent.value[0])
99 while length < self.pinlength:
102 eDVBCI_UI.getInstance().answerEnq(self.slotid, answer)
107 self.close(self.slotid)
111 if self.tag == "WAIT":
112 eDVBCI_UI.getInstance().stopMMI(self.slotid)
114 elif self.tag in [ "MENU", "LIST" ]:
116 eDVBCI_UI.getInstance().answerMenu(self.slotid, 0)
118 elif self.tag == "ENQ":
120 eDVBCI_UI.getInstance().cancelEnq(self.slotid)
123 print "give cancel action to ci"
125 def keyConfigEntry(self, key):
128 self["entries"].handleKey(key)
132 def keyNumberGlobal(self, number):
134 self.keyConfigEntry(config.key[str(number)])
138 self.keyConfigEntry(config.key["prevElement"])
142 self.keyConfigEntry(config.key["nextElement"])
144 def updateList(self, list):
145 List = self["entries"]
147 List.instance.moveSelectionTo(0)
152 if self.tag == "ENQ":
157 if type != self.listtype:
158 if type == TYPE_CONFIG:
159 List.l = eListboxPythonConfigContent()
161 List.l = eListboxPythonStringContent()
162 List.instance.setContent(List.l)
169 self["title"].setText("")
170 self["subtitle"].setText("")
171 self["bottom"].setText("")
173 list.append( ("wait for ci...", 0) )
174 self.updateList(list)
176 def showScreen(self):
177 screen = eDVBCI_UI.getInstance().getMMIScreen(self.slotid)
182 if len(screen) > 0 and screen[0][0] == "CLOSE":
183 timeout = screen[0][1]
185 self.timer.start(timeout*1000, True)
189 self.tag = screen[0][0]
191 if entry[0] == "PIN":
192 self.addEntry(list, entry)
194 if entry[0] == "TITLE":
195 self["title"].setText(entry[1])
196 elif entry[0] == "SUBTITLE":
197 self["subtitle"].setText(entry[1])
198 elif entry[0] == "BOTTOM":
199 self["bottom"].setText(entry[1])
200 elif entry[0] == "TEXT":
201 self.addEntry(list, entry)
202 self.updateList(list)
204 def ciStateChanged(self):
205 if self.action == 0: #reset
207 if self.action == 1: #init
210 #module still there ?
211 if eDVBCI_UI.getInstance().getState(self.slotid) != 2:
214 #mmi session still active ?
215 if eDVBCI_UI.getInstance().getMMIState(self.slotid) != 1:
218 if self.action > 1 and eDVBCI_UI.getInstance().availableMMI(self.slotid) == 1:
221 #FIXME: check for mmi-session closed
223 class CiMessageHandler:
228 eDVBCI_UI.getInstance().ciStateChanged.get().append(self.ciStateChanged)
230 def setSession(self, session):
231 self.session = session
233 def ciStateChanged(self, slot):
237 if slot in self.dlgs:
238 self.dlgs[slot].ciStateChanged()
239 elif eDVBCI_UI.getInstance().availableMMI(slot) == 1:
241 self.dlgs[slot] = self.session.openWithCallback(self.dlgClosed, CiMmi, slot, 3)
245 def dlgClosed(self, slot):
248 def registerCIMessageHandler(self, slot, func):
249 self.unregisterCIMessageHandler(slot)
252 def unregisterCIMessageHandler(self, slot):
256 CiHandler = CiMessageHandler()
258 class CiSelection(Screen):
259 def __init__(self, session):
260 Screen.__init__(self, session)
262 self["actions"] = ActionMap(["OkCancelActions"],
264 "ok": self.okbuttonClick,
265 "cancel": self.cancel
271 self["entries"] = MenuList(list)
273 self.createMenu(0) # FIXME more than one CI
274 CiHandler.registerCIMessageHandler(0, self.ciStateChanged)
279 def createMenu(self, slot):
280 self.list.append( (_("Reset"), 0, slot) )
281 self.list.append( (_("Init"), 1, slot) )
283 self.state[slot] = eDVBCI_UI.getInstance().getState(slot)
284 if self.state[slot] == 0: #no module
285 self.list.append( (_("no module found"), 2, slot) )
286 elif self.state[slot] == 1: #module in init
287 self.list.append( (_("init module"), 2, slot) )
288 elif self.state[slot] == 2: #module ready
290 appname = eDVBCI_UI.getInstance().getAppName(slot)
291 self.list.append( (appname, 2, slot) )
293 self["entries"].list = self.list
294 self["entries"].l.setList(self.list)
296 def ciStateChanged(self, slot):
298 self.dlg.ciStateChanged()
300 state = eDVBCI_UI.getInstance().getState(slot)
301 if self.state[slot] != state:
302 #print "something happens"
303 self.state[slot] = state
305 self.createMenu(slot)
307 def dlgClosed(self, slot):
310 def okbuttonClick(self):
311 cur = self["entries"].getCurrent()
315 if action == 0: #reset
316 eDVBCI_UI.getInstance().setReset(slot)
317 elif action == 1: #init
318 eDVBCI_UI.getInstance().setInit(slot)
319 elif self.state[slot] == 2:
320 self.dlg = self.session.openWithCallback(self.dlgClosed, CiMmi, slot, action)
322 #generate menu / list
324 #list.append( ("TEXT", "CA-Info") )
325 #list.append( ("TEXT", "Card Status") )
326 #list.append( ("PIN", 6, "Card Pin", 1) )
327 #self.session.open(CiMmi, 0, 0, "Wichtiges CI", "Mainmenu", "Footer", list)
330 CiHandler.unregisterCIMessageHandler(0)