CI mmi is now working every time (for support alphacrypt parental control or other...
[vuplus_dvbapp] / lib / python / Screens / Ci.py
1 from Screen import *
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
8
9 from Components.HTMLComponent import *
10 from Components.GUIComponent import *
11 from Components.config import *
12 from Components.ConfigList import ConfigList
13
14 from enigma import eTimer, eDVBCI_UI, eListboxPythonStringContent, eListboxPythonConfigContent
15
16 TYPE_MENU = 0
17 TYPE_CONFIG = 1
18
19 class CiMmi(Screen):
20         def __init__(self, session, slotid, action):
21                 Screen.__init__(self, session)
22
23                 print "ciMMI with action" + str(action)
24
25                 self.slotid = slotid
26
27                 self.timer = eTimer()
28                 self.timer.timeout.get().append(self.keyCancel)
29
30                 #else the skins fails
31                 self["title"] = Label("")
32                 self["subtitle"] = Label("")
33                 self["bottom"] = Label("")
34                 self["entries"] = ConfigList([ ])
35                 self.listtype = TYPE_CONFIG
36
37                 self["actions"] = NumberActionMap(["SetupActions"],
38                         {
39                                 "ok": self.okbuttonClick,
40                                 "cancel": self.keyCancel,
41                                 #for PIN
42                                 "left": self.keyLeft,
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
54                         }, -1)
55
56                 self.action = action
57
58                 if action == 2:         #start MMI
59                         eDVBCI_UI.getInstance().startMMI(self.slotid)
60                         self.showWait()
61                 elif action == 3:               #mmi already there (called from infobar)
62                         self.showScreen()
63
64         def addEntry(self, list, entry):
65                 if entry[0] == "TEXT":          #handle every item (text / pin only?)
66                         list.append( (entry[1], entry[2]) )
67                 if entry[0] == "PIN":
68                         self.pinlength = entry[1]
69                         if entry[3] == 1:
70                                 # masked pins:
71                                 x = configElement_nonSave("", configSequence, [1234], configsequencearg.get("PINCODE", (self.pinlength, "*")))
72                         else:                           
73                                 # unmasked pins:
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"))
79
80         def okbuttonClick(self):
81                 self.timer.stop()
82                 if self.tag == "WAIT":
83                         print "do nothing - wait"
84                 elif self.tag == "MENU":
85                         print "answer MENU"
86                         cur = self["entries"].getCurrent()
87                         if cur:
88                                 eDVBCI_UI.getInstance().answerMenu(self.slotid, cur[1])
89                         else:
90                                 eDVBCI_UI.getInstance().answerMenu(self.slotid, 0)
91                         self.showWait() 
92                 elif self.tag == "LIST":
93                         print "answer LIST"
94                         eDVBCI_UI.getInstance().answerMenu(self.slotid, 0)
95                         self.showWait() 
96                 elif self.tag == "ENQ":
97                         answer = str(self.pin[1].parent.value[0])
98                         length = len(answer)
99                         while length < self.pinlength:
100                                 answer = '0'+answer
101                                 length+=1
102                         eDVBCI_UI.getInstance().answerEnq(self.slotid, answer)
103                         self.showWait()
104
105         def closeMmi(self):
106                 self.timer.stop()
107                 self.close(self.slotid)
108
109         def keyCancel(self):
110                 self.timer.stop()
111                 if self.tag == "WAIT":
112                         eDVBCI_UI.getInstance().stopMMI(self.slotid)
113                         self.closeMmi()
114                 elif self.tag in [ "MENU", "LIST" ]:
115                         print "cancel list"
116                         eDVBCI_UI.getInstance().answerMenu(self.slotid, 0)
117                         self.showWait()
118                 elif self.tag == "ENQ":
119                         print "cancel enq"
120                         eDVBCI_UI.getInstance().cancelEnq(self.slotid)
121                         self.showWait()
122                 else:
123                         print "give cancel action to ci"        
124
125         def keyConfigEntry(self, key):
126                 self.timer.stop()
127                 try:
128                         self["entries"].handleKey(key)
129                 except:
130                         pass
131
132         def keyNumberGlobal(self, number):
133                 self.timer.stop()
134                 self.keyConfigEntry(config.key[str(number)])
135
136         def keyLeft(self):
137                 self.timer.stop()
138                 self.keyConfigEntry(config.key["prevElement"])
139
140         def keyRight(self):
141                 self.timer.stop()
142                 self.keyConfigEntry(config.key["nextElement"])
143
144         def updateList(self, list):
145                 List = self["entries"]
146                 try:
147                         List.instance.moveSelectionTo(0)
148                 except:
149                         List.l.setList(list)
150                         return
151
152                 if self.tag == "ENQ":
153                         type = TYPE_CONFIG
154                 else:
155                         type = TYPE_MENU
156
157                 if type != self.listtype:
158                         if type == TYPE_CONFIG:
159                                 List.l = eListboxPythonConfigContent()
160                         else:
161                                 List.l = eListboxPythonStringContent()
162                         List.instance.setContent(List.l)
163                         self.listtype = type
164
165                 List.l.setList(list)
166
167         def showWait(self):
168                 self.tag = "WAIT"
169                 self["title"].setText("")
170                 self["subtitle"].setText("")
171                 self["bottom"].setText("")
172                 list = [ ]
173                 list.append( ("wait for ci...", 0) )
174                 self.updateList(list)
175
176         def showScreen(self):
177                 screen = eDVBCI_UI.getInstance().getMMIScreen(self.slotid)
178         
179                 list = [ ]
180
181                 self.timer.stop()
182                 if len(screen) > 0 and screen[0][0] == "CLOSE":
183                         timeout = screen[0][1]
184                         if timeout > 0:
185                                 self.timer.start(timeout*1000, True)
186                         else:
187                                 self.keyCancel()
188                 else:
189                         self.tag = screen[0][0]
190                         for entry in screen:
191                                 if entry[0] == "PIN":
192                                         self.addEntry(list, entry)
193                                 else:
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)
203
204         def ciStateChanged(self):
205                 if self.action == 0:                    #reset
206                         self.closeMmi()
207                 if self.action == 1:                    #init
208                         self.closeMmi()
209
210                 #module still there ?                   
211                 if eDVBCI_UI.getInstance().getState(self.slotid) != 2:
212                         self.closeMmi()
213
214                 #mmi session still active ?                     
215                 if eDVBCI_UI.getInstance().getMMIState(self.slotid) != 1:
216                         self.closeMmi()
217
218                 if self.action > 1 and eDVBCI_UI.getInstance().availableMMI(self.slotid) == 1:
219                         self.showScreen()
220
221                 #FIXME: check for mmi-session closed    
222
223 class CiMessageHandler:
224         def __init__(self):
225                 self.session = None
226                 self.ci = { }
227                 self.dlgs = { }
228                 eDVBCI_UI.getInstance().ciStateChanged.get().append(self.ciStateChanged)
229
230         def setSession(self, session):
231                 self.session = session
232
233         def ciStateChanged(self, slot):
234                 if slot in self.ci:
235                         self.ci[slot](slot)
236                 else:
237                         if slot in self.dlgs:
238                                 self.dlgs[slot].ciStateChanged()
239                         elif eDVBCI_UI.getInstance().availableMMI(slot) == 1:
240                                 if self.session:
241                                         self.dlgs[slot] = self.session.openWithCallback(self.dlgClosed, CiMmi, slot, 3)
242                                 else:
243                                         print "no session"
244
245         def dlgClosed(self, slot):
246                 del self.dlgs[slot]
247
248         def registerCIMessageHandler(self, slot, func):
249                 self.unregisterCIMessageHandler(slot)
250                 self.ci[slot] = func
251
252         def unregisterCIMessageHandler(self, slot):
253                 if slot in self.ci:
254                         del self.ci[slot]
255
256 CiHandler = CiMessageHandler()
257
258 class CiSelection(Screen):
259         def __init__(self, session):
260                 Screen.__init__(self, session)
261
262                 self["actions"] = ActionMap(["OkCancelActions"],
263                         {
264                                 "ok": self.okbuttonClick,
265                                 "cancel": self.cancel
266                         })
267
268                 self.dlg = None
269                 self.state = { }
270                 self.list = [ ]
271                 self["entries"] = MenuList(list)
272                 self.clearMenu()
273                 self.createMenu(0) # FIXME more than one CI
274                 CiHandler.registerCIMessageHandler(0, self.ciStateChanged)
275
276         def clearMenu(self):
277                 self.list = [ ]
278
279         def createMenu(self, slot):
280                 self.list.append( (_("Reset"), 0, slot) )
281                 self.list.append( (_("Init"), 1, slot) )
282
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
289                         #get appname
290                         appname = eDVBCI_UI.getInstance().getAppName(slot)
291                         self.list.append( (appname, 2, slot) )
292
293                 self["entries"].list = self.list
294                 self["entries"].l.setList(self.list)
295
296         def ciStateChanged(self, slot):
297                 if self.dlg:
298                         self.dlg.ciStateChanged()
299                 else:
300                         state = eDVBCI_UI.getInstance().getState(slot)
301                         if self.state[slot] != state:
302                                 #print "something happens"
303                                 self.state[slot] = state
304                                 self.clearMenu()
305                                 self.createMenu(slot)
306
307         def dlgClosed(self, slot):
308                 self.dlg = None
309
310         def okbuttonClick(self):
311                 cur = self["entries"].getCurrent()
312                 if cur:
313                         action = cur[1]
314                         slot = cur[2]
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)
321
322                 #generate menu / list
323                 #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)
328
329         def cancel(self):
330                 CiHandler.unregisterCIMessageHandler(0)
331                 self.close()