add some functions
[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
13 from enigma import *
14
15 #use this class to synchronize all ci to/from user communications
16 class CiWait(Screen):
17         def cancel(self):
18                 #stop pending requests
19                 self.Timer.stop()
20                 self.close()
21
22         def TimerCheck(self):
23                 #special cases to prevent to fast resets/inits
24                 if self.lastQuery == 0:
25                         self.cancel()
26                 elif self.lastQuery == 1:
27                         self.cancel()
28
29         def __init__(self, session, slot, query):
30                 Screen.__init__(self, session)
31
32                 self["message"] = Label(_("waiting for CI..."))
33
34                 self["actions"] = ActionMap(["OkCancelActions"], 
35                         {
36                                 "cancel": self.cancel
37                         })
38                         
39                 self.lastQuery = query
40
41                 self.Timer = eTimer()
42                 self.Timer.timeout.get().append(self.TimerCheck)
43
44                 if query == 0:                                                                  #reset
45                         self.Timer.start(1000)                          #block 1 second
46                         print "reset"
47                         eDVBCI_UI.getInstance().setReset(slot)
48                 if query == 1:                                                                  #init
49                         self.Timer.start(1000)                          #block 1 second
50                         print "init"
51                         eDVBCI_UI.getInstance().initialize(slot)
52                 if query == 2:                                                                  #mmi-open
53                         print "mmi open"
54                         eDVBCI_UI.getInstance().startMMI(slot)
55                 if query == 3:                                                                  #mmi-answer
56                         print "mmi answer"
57                         eDVBCI_UI.getInstance().answerMMI(slot, 0, 0)
58                         
59
60 class CiEntryList(HTMLComponent, GUIComponent):
61         def __init__(self, list):
62                 GUIComponent.__init__(self)
63                 self.l = eListboxPythonConfigContent()
64                 self.l.setList(list)
65                 self.l.setSeperation(100)
66                 self.list = list
67
68         def toggle(self):
69                 selection = self.getCurrent()
70                 selection[1].toggle()
71                 self.invalidateCurrent()
72
73         def handleKey(self, key):
74                 #not every element got an .handleKey
75                 try:
76                         selection = self.getCurrent()
77                         selection[1].handleKey(key)
78                         self.invalidateCurrent()
79                 except: 
80                         pass    
81
82         def getCurrent(self):
83                 return self.l.getCurrentSelection()
84
85         def getCurrentIndex(self):
86                 return self.l.getCurrentSelectionIndex()
87
88         def invalidateCurrent(self):
89                 self.l.invalidateEntry(self.l.getCurrentSelectionIndex())
90
91         def GUIcreate(self, parent):
92                 self.instance = eListbox(parent)
93                 self.instance.setContent(self.l)
94
95         def GUIdelete(self):
96                 self.instance.setContent(None)
97                 self.instance = None
98
99 class CiMmi(Screen):
100         def addEntry(self, list, entry, index):
101                 if entry[0] == "TEXT":          #handle every item (text / pin only?)
102                         list.append( (entry[1], index) )
103                 if entry[0] == "PIN":
104                         if entry[3] == 1:
105                                 # masked pins:
106                                 x = configElement_nonSave("", configSequence, [1234], configsequencearg.get("PINCODE", (entry[1], "-")))
107                         else:                           
108                                 # unmasked pins:
109                                 x = configElement_nonSave("", configSequence, [1234], configsequencearg.get("PINCODE", (entry[1], "")))                 
110                                 
111                         self.pin = getConfigListEntry(entry[2],x)
112                         list.append( self.pin )
113
114         def okbuttonClick(self):
115                 if self.tag == 0:       #ENQ
116                         print "enq- answer pin:" +  str(self.pin[1].parent.value[0])
117                         #ci[self.slotid]->getInstance().mmiEnqAnswer(self.pin[1].parent.value[0])
118                 elif self.tag == 1:     #Menu
119                         print "answer - actual:" + str(self["entries"].getCurrentIndex())
120                         #ci[self.slotid]->getInstance().mmiAnswer(self["entries"].getCurrentIndex())
121                 elif self.tag == 2:     #List
122                         print "answer on List - send 0"
123                         #ci[self.slotid]->getInstance().mmiAnswer(0)
124                 self.close()
125
126         def keyNumberGlobal(self, number):
127                 self["entries"].handleKey(config.key[str(number)])
128
129         def keyLeft(self):
130                 self["entries"].handleKey(config.key["prevElement"])
131
132         def keyRight(self):
133                 self["entries"].handleKey(config.key["nextElement"])
134
135         def keyCancel(self):
136                 print "keyCancel"
137                 self.close()
138                 
139                 #tag is 0=ENQ 1=Menu 2=List
140         def __init__(self, session, slotid, tag, title, subtitle, bottom, entries):
141                 Screen.__init__(self, session)
142
143                 self.slotid = slotid
144                 self.tag = tag
145                 self["title"] = Label(title)
146                 self["subtitle"] = Label(subtitle)
147                 self["bottom"] = Label(bottom)
148                                 
149                 list = [ ]
150                 cnt = 0
151                 for entry in entries:
152                         self.addEntry(list, entry, cnt)
153                         cnt = cnt + 1
154                 self["entries"] = CiEntryList(list)
155
156                 self["actions"] = NumberActionMap(["SetupActions"],
157                         {
158                                 "ok": self.okbuttonClick,
159                                 "cancel": self.keyCancel,
160                                 #for PIN
161                                 "left": self.keyLeft,
162                                 "right": self.keyRight,
163                                 "1": self.keyNumberGlobal,
164                                 "2": self.keyNumberGlobal,
165                                 "3": self.keyNumberGlobal,
166                                 "4": self.keyNumberGlobal,
167                                 "5": self.keyNumberGlobal,
168                                 "6": self.keyNumberGlobal,
169                                 "7": self.keyNumberGlobal,
170                                 "8": self.keyNumberGlobal,
171                                 "9": self.keyNumberGlobal,
172                                 "0": self.keyNumberGlobal
173                         }, -1)
174
175
176 class CiSelection(Screen):
177         def createMenu(self):
178                 self.list = [ ]
179                 self.list.append( ("Reset", 0) )
180                 self.list.append( ("Init", 1) )
181                 
182                 self.state = eDVBCI_UI.getInstance().getState(0)
183                 if self.state == 0:                     #no module
184                         self.list.append( ("no module found", 2) )
185                 elif self.state == 1:           #module in init
186                         self.list.append( ("init module", 2) )
187                 elif self.state == 2:           #module ready
188                         #get appname            
189                         appname = eDVBCI_UI.getInstance().getAppName(0)
190                         self.list.append( (appname, 2) )
191
192                 self["entries"] .list = self.list
193                 self["entries"] .l.setList(self.list)
194
195         def TimerCheck(self):
196                 state = eDVBCI_UI.getInstance().getState(0)
197                 if self.state != state:
198                         print "something happens"
199                         self.state = state
200                         self.createMenu()
201         
202         def okbuttonClick(self):
203                 if self.state == 2:
204                         #FIXME: find out the correct slot
205                         self.session.open(CiWait, 0, self["entries"].getCurrent()[1])
206
207                 #generate menu / list
208                 #list = [ ]
209                 #list.append( ("TEXT", "CA-Info") )
210                 #list.append( ("TEXT", "Card Status") )
211                 #list.append( ("PIN", 6, "Card Pin", 1) )
212                 #self.session.open(CiMmi, 0, 0, "Wichtiges CI", "Mainmenu", "Footer", list)
213
214         def cancel(self):
215                 self.Timer.stop()
216                 self.close()
217                 
218         def __init__(self, session):
219                 #FIXME support for one ci only
220                 Screen.__init__(self, session)
221                 
222                 self["actions"] = ActionMap(["OkCancelActions"], 
223                         {
224                                 "ok": self.okbuttonClick,
225                                 "cancel": self.cancel
226                         })
227
228                 self.list = [ ]
229                 self["entries"] = CiEntryList(list)
230                 self.createMenu()
231
232                 self.Timer = eTimer()
233                 self.Timer.timeout.get().append(self.TimerCheck)
234                 self.Timer.start(1000)