better cast
[enigma2.git] / 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.TimerCheck)
29                 self.Timer.start(1000)
30
31                 #else the skins fails
32                 self["title"] = Label("")
33                 self["subtitle"] = Label("")
34                 self["bottom"] = Label("")
35                 self["entries"] = ConfigList([ ])
36                 self.listtype = TYPE_CONFIG
37
38                 self["actions"] = NumberActionMap(["SetupActions"],
39                         {
40                                 "ok": self.okbuttonClick,
41                                 "cancel": self.keyCancel,
42                                 #for PIN
43                                 "left": self.keyLeft,
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
55                         }, -1)
56
57                 self.action = action
58
59                 if action == 0:                 #reset
60                         eDVBCI_UI.getInstance().setReset(self.slotid)
61                         self.showWait()
62                 elif action == 1:               #init
63                         eDVBCI_UI.getInstance().setInit(self.slotid)
64                 elif action == 2:               #start MMI
65                         eDVBCI_UI.getInstance().startMMI(self.slotid)
66                         self.showWait()
67                 elif action == 3:               #mmi already there (called from infobar)
68                         self.showScreen()
69
70         def addEntry(self, list, entry):
71                 if entry[0] == "TEXT":          #handle every item (text / pin only?)
72                         list.append( (entry[1], entry[2]) )
73                 if entry[0] == "PIN":
74                         self.pinlength = entry[1]
75                         if entry[3] == 1:
76                                 # masked pins:
77                                 x = configElement_nonSave("", configSequence, [1234], configsequencearg.get("PINCODE", (self.pinlength, "*")))
78                         else:                           
79                                 # unmasked pins:
80                                 x = configElement_nonSave("", configSequence, [1234], configsequencearg.get("PINCODE", (self.pinlength, "")))
81                         self["subtitle"].setText(entry[2])
82                         self.pin = getConfigListEntry("",x)
83                         list.append( self.pin )
84                         self["bottom"].setText(_("please press OK when ready"))
85
86         def okbuttonClick(self):
87                 print "ok"
88                 if self.tag == "WAIT":
89                         print "do nothing - wait"
90                 elif self.tag == "MENU":
91                         print "answer MENU"
92                         cur = self["entries"].getCurrent()
93                         if cur:
94                                 eDVBCI_UI.getInstance().answerMenu(self.slotid, cur[1])
95                         else:
96                                 eDVBCI_UI.getInstance().answerMenu(self.slotid, 0)
97                         self.showWait() 
98                 elif self.tag == "LIST":
99                         print "answer LIST"
100                         eDVBCI_UI.getInstance().answerMenu(self.slotid, 0)
101                         self.showWait() 
102                 elif self.tag == "ENQ":
103                         answer = str(self.pin[1].parent.value[0])
104                         length = len(answer)
105                         while length < self.pinlength:
106                                 answer = '0'+answer
107                                 length+=1
108                         eDVBCI_UI.getInstance().answerEnq(self.slotid, answer)
109                         self.showWait()
110
111         def closeMmi(self):
112                 self.Timer.stop()
113                 self.close()
114
115         def keyCancel(self):
116                 print "keyCancel"
117                 if self.tag == "WAIT":
118                         eDVBCI_UI.getInstance().stopMMI(self.slotid)
119                         self.closeMmi()
120                 elif self.tag in [ "MENU", "LIST" ]:
121                         print "cancel list"
122                         eDVBCI_UI.getInstance().answerMenu(self.slotid, 0)
123                         self.showWait()
124                 elif self.tag == "ENQ":
125                         print "cancel enq"
126                         eDVBCI_UI.getInstance().cancelEnq(self.slotid)
127                         self.showWait()
128                 else:
129                         print "give cancel action to ci"        
130
131         def keyConfigEntry(self, key):
132                 try:
133                         self["entries"].handleKey(key)
134                 except AttributeError:
135                         pass
136
137         def keyNumberGlobal(self, number):
138                 self.keyConfigEntry(config.key[str(number)])
139
140         def keyLeft(self):
141                 self.keyConfigEntry(config.key["prevElement"])
142
143         def keyRight(self):
144                 self.keyConfigEntry(config.key["nextElement"])
145
146         def updateList(self, list):
147                 List = self["entries"]
148                 try:
149                         List.instance.moveSelectionTo(0)
150                 except:
151                         List.l.setList(list)
152                         return
153
154                 if self.tag == "ENQ":
155                         type = TYPE_CONFIG
156                 else:
157                         type = TYPE_MENU
158
159                 if type != self.listtype:
160                         if type == TYPE_CONFIG:
161                                 List.l = eListboxPythonConfigContent()
162                         else:
163                                 List.l = eListboxPythonStringContent()
164                         List.instance.setContent(List.l)
165                         self.listtype = type
166
167                 List.l.setList(list)
168
169         def showWait(self):
170                 self.tag = "WAIT"
171                 self["title"].setText("")
172                 self["subtitle"].setText("")
173                 self["bottom"].setText("")
174                 list = [ ]
175                 list.append( ("wait for ci...", 0) )
176                 self.updateList(list)
177
178         def showScreen(self):
179                 screen = eDVBCI_UI.getInstance().getMMIScreen(self.slotid)
180         
181                 list = [ ]
182
183                 self.tag = screen[0][0]
184
185                 for entry in screen:
186                         if entry[0] == "PIN":
187                                 self.addEntry(list, entry)
188                         else:
189                                 if entry[0] == "TITLE":
190                                         self["title"].setText(entry[1])
191                                 elif entry[0] == "SUBTITLE":
192                                         self["subtitle"].setText(entry[1])
193                                 elif entry[0] == "BOTTOM":
194                                         self["bottom"].setText(entry[1])
195                                 elif entry[0] == "TEXT":
196                                         self.addEntry(list, entry)
197                 self.updateList(list)
198
199         def TimerCheck(self):
200                 if self.action == 0:                    #reset
201                         self.closeMmi()
202                 if self.action == 1:                    #init
203                         self.closeMmi()
204
205                 #module still there ?                   
206                 if eDVBCI_UI.getInstance().getState(self.slotid) != 2:
207                         self.closeMmi()
208
209                 #mmi session still active ?                     
210                 if eDVBCI_UI.getInstance().getMMIState(self.slotid) != 1:
211                         self.closeMmi()
212
213                 if eDVBCI_UI.getInstance().availableMMI(self.slotid) == 1:
214                         self.showScreen()
215
216                 #FIXME: check for mmi-session closed    
217
218 class CiSelection(Screen):
219         def createMenu(self):
220                 self.list = [ ]
221                 self.list.append( (_("Reset"), 0) )
222                 self.list.append( (_("Init"), 1) )
223                 
224                 self.state = eDVBCI_UI.getInstance().getState(0)
225                 if self.state == 0:                     #no module
226                         self.list.append( (_("no module found"), 2) )
227                 elif self.state == 1:           #module in init
228                         self.list.append( (_("init module"), 2) )
229                 elif self.state == 2:           #module ready
230                         #get appname            
231                         appname = eDVBCI_UI.getInstance().getAppName(0)
232                         self.list.append( (appname, 2) )
233
234                 self["entries"].list = self.list
235                 self["entries"].l.setList(self.list)
236
237         def TimerCheck(self):
238                 state = eDVBCI_UI.getInstance().getState(0)
239                 if self.state != state:
240                         #print "something happens"
241                         self.state = state
242                         self.createMenu()
243         
244         def okbuttonClick(self):
245                 self.slot = 0
246         
247                 if self.state == 2:
248                         self.session.open(CiMmi, 0, self["entries"].getCurrent()[1])
249
250                 #generate menu / list
251                 #list = [ ]
252                 #list.append( ("TEXT", "CA-Info") )
253                 #list.append( ("TEXT", "Card Status") )
254                 #list.append( ("PIN", 6, "Card Pin", 1) )
255                 #self.session.open(CiMmi, 0, 0, "Wichtiges CI", "Mainmenu", "Footer", list)
256
257         def cancel(self):
258                 self.Timer.stop()
259                 self.close()
260
261         def mmiAvail(self, slot):
262                 print "mmi avail slot", slot
263
264         def __init__(self, session):
265                 #FIXME support for one ci only
266                 Screen.__init__(self, session)
267                 
268                 self["actions"] = ActionMap(["OkCancelActions"], 
269                         {
270                                 "ok": self.okbuttonClick,
271                                 "cancel": self.cancel
272                         })
273
274                 self.list = [ ]
275                 self["entries"] = MenuList(list)
276                 self.createMenu()
277
278                 self.Timer = eTimer()
279                 self.Timer.timeout.get().append(self.TimerCheck)
280                 self.Timer.start(1000)
281
282                 eDVBCI_UI.getInstance().mmiAvail.get().append(self.mmiAvail)