4c8167d4b3c8918919b767e7b39532765b8155b9
[vuplus_dvbapp] / lib / python / Plugins / SystemPlugins / CommonInterfaceAssignment / plugin.py
1 from Screens.Screen import Screen
2 from Screens.ChannelSelection import *
3 from Components.ActionMap import HelpableActionMap, ActionMap, NumberActionMap
4 from Components.Sources.List import List
5 from Components.Sources.StaticText import StaticText
6 from Components.config import ConfigNothing
7 from Components.ConfigList import ConfigList
8 from Components.Label import Label
9 from Components.SelectionList import SelectionList
10 from Components.MenuList import MenuList
11 from ServiceReference import ServiceReference
12 from Plugins.Plugin import PluginDescriptor
13 from xml.etree.cElementTree import parse as ci_parse
14 from Tools.XMLTools import elementsWithTag, mergeText, stringToXML
15 from enigma import eDVBCI_UI, eDVBCIInterfaces
16
17 from os import system, path as os_path
18
19 class CIselectMainMenu(Screen):
20         skin = """
21                 <screen position="205,150" size="310,270"  title="CI Assignment" >
22                         <widget name="CiList" position="10,10" size="290,200" scrollbarMode="showOnDemand" />
23                         <ePixmap position="10,210" size="290,2" pixmap="skin_default/div-h.png" transparent="1" alphatest="on" />
24                         <ePixmap pixmap="skin_default/buttons/red.png" position="10,220" size="140,40" alphatest="on" />
25                         <ePixmap pixmap="skin_default/buttons/green.png" position="160,220" size="140,40" alphatest="on" />
26                         <widget source="key_red" render="Label" position="10,220" zPosition="1" size="140,40" font="Regular;19" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" />
27                         <widget source="key_green" render="Label" position="160,220" zPosition="1" size="140,40" font="Regular;19" halign="center" valign="center" backgroundColor="#1f771f" transparent="1" />
28                 </screen>"""
29
30         def __init__(self, session, args = 0):
31                 self.skin = CIselectMainMenu.skin
32                 Screen.__init__(self, session)
33
34                 self["key_red"] = StaticText(_("Cancel"))
35                 self["key_green"] = StaticText(_("Config"))
36
37                 self["actions"] = ActionMap(["ColorActions","SetupActions"],
38                         {
39                                 "green": self.greenPressed,
40                                 "red": self.redPressed,
41                                 "yellow": self.yellowPressed,
42                                 "ok": self.greenPressed,
43                                 "cancel": self.cancel
44                         }, -1)
45
46                 NUM_CI=eDVBCIInterfaces.getInstance().getNumOfSlots()
47
48                 print "[CI_Wizzard] FOUND %d CI Slots " % NUM_CI
49
50                 self.dlg = None
51                 self.state = { }
52                 self.list = [ ]
53                 if NUM_CI > 0:
54                         for slot in range(NUM_CI):
55                                 state = eDVBCI_UI.getInstance().getState(slot)
56                                 if state == 0:
57                                         appname = _("Slot %d") %(slot+1) + " - " + _("no module")
58                                 elif state == 1:        
59                                         appname = _("Slot %d") %(slot+1) + " - " + _("init modules")
60                                 elif state == 2:
61                                         appname = _("Slot %d") %(slot+1) + " - " + eDVBCI_UI.getInstance().getAppName(slot)
62                                 self.list.append( (appname, ConfigNothing(), 0, slot) )
63                 else:
64                         self.list.append( (_("no CI slots found") , ConfigNothing(), 1, -1) )
65
66                 menuList = ConfigList(self.list)
67                 menuList.list = self.list
68                 menuList.l.setList(self.list)
69                 self["CiList"] = menuList
70
71         def greenPressed(self):
72                 cur = self["CiList"].getCurrent()
73                 if cur and len(cur) > 2:
74                         action = cur[2]
75                         slot = cur[3]
76                         if action == 1:
77                                 print "[CI_Wizzard] there is no CI Slot in your receiver"
78                         else:
79                                 print "[CI_Wizzard] selected CI Slot : %d" % slot
80                                 if config.usage.setup_level.index > 1: # advanced
81                                         self.session.open(CIconfigMenu, slot)
82                                 else:
83                                         self.session.open(easyCIconfigMenu, slot)
84
85         def yellowPressed(self):
86                 NUM_CI=eDVBCIInterfaces.getInstance().getNumOfSlots()
87                 print "[CI_Check] FOUND %d CI Slots " % NUM_CI
88                 if NUM_CI > 0:
89                         for ci in range(NUM_CI):
90                                 print eDVBCIInterfaces.getInstance().getDescrambleRules(ci)
91 #               else:
92 #                       print "no ci found"
93
94         def redPressed(self):
95                 print "[CI_Config] RED BUTTON not implemented yet - only use self.cancel()"
96                 self.cancel()
97
98         def cancel(self):
99                 self.close()
100
101 class CIconfigMenu(Screen):
102         skin = """
103                 <screen position="60,80" size="595,436" title="CI Assignment" >
104                         <widget name="CAidList.desc" position="10,10" size="575,22" font="Regular;20" />
105                         <widget name="CAidList" position="10,40" size="575,45" font="Regular;20" />
106                         <widget name="ServiceList.desc" position="10,90" size="575,22" font="Regular;20" />
107                         <widget name="ServiceList" position="10,120" size="575,250" scrollbarMode="showOnDemand" />
108                         <ePixmap position="10,380" size="575,2" pixmap="skin_default/div-h.png" transparent="1" alphatest="on" />
109                         <ePixmap pixmap="skin_default/buttons/red.png" position="10,390" size="140,40" alphatest="on" />
110                         <ePixmap pixmap="skin_default/buttons/green.png" position="155,390" size="140,40" alphatest="on" />
111                         <ePixmap pixmap="skin_default/buttons/yellow.png" position="300,390" size="140,40" alphatest="on" />
112                         <ePixmap pixmap="skin_default/buttons/blue.png" position="445,390" size="140,40" alphatest="on" />
113                         <widget source="key_red" render="Label" position="10,390" zPosition="1" size="140,40" font="Regular;19" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" />
114                         <widget source="key_green" render="Label" position="155,390" zPosition="1" size="140,40" font="Regular;19" halign="center" valign="center" backgroundColor="#1f771f" transparent="1" />
115                         <widget source="key_yellow" render="Label" position="300,390" zPosition="1" size="140,40" font="Regular;19" halign="center" valign="center" backgroundColor="#1f771f" transparent="1" />
116                         <widget source="key_blue" render="Label" position="445,390" zPosition="1" size="140,40" font="Regular;19" halign="center" valign="center" backgroundColor="#1f771f" transparent="1" />
117                 </screen>"""
118
119         def __init__(self, session, ci_slot="9"):
120                 self.skin = CIconfigMenu.skin
121                 Screen.__init__(self, session)
122                 self.ci_slot=ci_slot
123                 self.filename="/etc/enigma2/ci"+str(self.ci_slot)+".xml"
124                 
125                 self["key_red"] = StaticText(_("delete"))
126                 self["key_green"] = StaticText(_("add Service"))
127                 self["key_yellow"] = StaticText(_("add Provider"))
128                 self["key_blue"] = StaticText(_("select CAId"))
129                 self["CAidList.desc"] = Label(_("assigned CAIds"))
130                 self["ServiceList.desc"] = Label(_("assigned Services/Provider"))
131
132                 self["actions"] = ActionMap(["ColorActions","SetupActions"],
133                         {
134                                 "green": self.greenPressed,
135                                 "red": self.redPressed,
136                                 "yellow": self.yellowPressed,
137                                 "blue": self.bluePressed,
138                                 "ok": self.okPressed,
139                                 "cancel": self.cancel
140                         }, -1)
141                         
142                 print "[CI_Wizzard_Config] Configuring CI Slots : %d  " % self.ci_slot
143
144                 i=0
145                 self.caidlist=[]
146                 print eDVBCIInterfaces.getInstance().readCICaIds(self.ci_slot)
147                 for caid in eDVBCIInterfaces.getInstance().readCICaIds(self.ci_slot):
148                         i+=1
149                         self.caidlist.append((str(hex(int(caid))),str(caid),i))
150
151                 print "[CI_Wizzard_Config_CI%d] read following CAIds from CI: %s" %(self.ci_slot, self.caidlist)
152                 self.selectedcaid =[]
153                 self.servicelist = []
154                 self.caids=_("no CAId selected")
155                 self["CAidList"] = Label(self.caids)
156
157                 serviceList = ConfigList(self.servicelist)
158                 serviceList.list = self.servicelist
159                 serviceList.l.setList(self.servicelist)
160                 self["ServiceList"] = serviceList
161
162                 self.loadXML()
163                 # if config mode !=advanced autoselect any caid
164                 if config.usage.setup_level.index <= 1: # advanced
165                         self.selectedcaid=self.caidlist
166
167         def redPressed(self):
168                 self.delete()
169
170         def greenPressed(self):
171                 self.session.openWithCallback( self.finishedChannelSelection, myChannelSelection, None)
172
173         def yellowPressed(self):
174                 self.session.openWithCallback( self.finishedProviderSelection, myProviderSelection, None)
175
176         def bluePressed(self):
177                 self.session.openWithCallback(self.finishedCAidSelection, CAidSelect, self.caidlist, self.selectedcaid)
178
179         def okPressed(self):
180                 print "[CI_Config_CI%d] OK BUTTON not implemented yet" %self.ci_slot
181
182         def cancel(self):
183                 self.saveXML()
184                 activate_all(self)
185                 self.close()
186
187         def delete(self):
188                 cur = self["ServiceList"].getCurrent()
189                 if cur and len(cur) > 2:
190                         self.servicelist.remove(cur)
191                 self["ServiceList"].l.setList(self.servicelist)
192
193         def finishedChannelSelection(self, *args):
194                 if len(args):
195                         ref=args[0]
196                         service_ref = ServiceReference(ref)
197                         service_name = service_ref.getServiceName()
198                         if find_in_list(self.servicelist, service_name, 0)==False:
199                                 split_ref=service_ref.ref.toString().split(":")
200                                 if split_ref[0] == "1":                 #== dvb service und nicht muell von None
201                                         self.servicelist.append( (service_name , ConfigNothing(), 0, service_ref.ref.toString()) )
202                                         self["ServiceList"].l.setList(self.servicelist)
203
204         def finishedProviderSelection(self, *args):
205                 if len(args)>1: # bei nix selected kommt nur 1 arg zurueck (==None)
206                         name=args[0]
207                         dvbnamespace=args[1]
208                         if find_in_list(self.servicelist, name, 0)==False:
209                                 self.servicelist.append( (name , ConfigNothing(), 1, dvbnamespace) )
210                                 self["ServiceList"].l.setList(self.servicelist)
211
212         def finishedCAidSelection(self, *args):
213                 if len(args):
214                         self.selectedcaid=args[0]
215                         self.caids=""
216                         for item in self.selectedcaid:
217                                 if len(self.caids):
218                                         self.caids+= ", " + item[0]
219                                 else:
220                                         self.caids=item[0]
221                 else:
222                         self.selectedcaid=[]
223                         self.caids=_("no CAId selected")
224                 self["CAidList"].setText(self.caids)
225
226         def saveXML(self):
227                 try:
228                         fp = file(self.filename, 'w')
229                         fp.write("<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n")
230                         fp.write("<ci>\n")
231                         fp.write("\t<slot>\n")
232                         fp.write("\t\t<id>%s</id>\n" % self.ci_slot)
233                         for item in self.selectedcaid:
234                                 if len(self.selectedcaid):
235                                         fp.write("\t\t<caid id=\"%s\" />\n" % item[0])
236                         for item in self.servicelist:
237                                 if len(self.servicelist):
238                                         if item[2]==1:
239                                                 fp.write("\t\t<provider name=\"%s\" dvbnamespace=\"%s\" />\n" % (item[0], item[3]))
240                                         else:
241                                                 fp.write("\t\t<service name=\"%s\" ref=\"%s\" />\n"  % (item[0], item[3]))
242                         fp.write("\t</slot>\n")
243                         fp.write("</ci>\n")
244                         fp.close()
245                 except:
246                         print "[CI_Config_CI%d] xml not written" %self.ci_slot
247                         os.unlink(self.filename)
248
249         def loadXML(self):
250                 if not os_path.exists(self.filename):
251                         return
252
253                 def getValue(definitions, default):
254                         ret = ""
255                         Len = len(definitions)
256                         return Len > 0 and definitions[Len-1].text or default
257
258                 try:
259                         tree = ci_parse(self.filename).getroot()
260                         self.read_services=[]
261                         self.read_providers=[]
262                         self.usingcaid=[]
263                         self.ci_config=[]
264 #                       for ci in tree.findall("ci"):
265                         for slot in tree.findall("slot"):
266                                 read_slot = getValue(slot.findall("id"), False).encode("UTF-8")
267                                 print "ci " + read_slot
268
269                                 i=0
270                                 for caid in slot.findall("caid"):
271                                         read_caid = caid.get("id").encode("UTF-8")
272                                         self.selectedcaid.append((str(read_caid),str(read_caid),i))
273                                         self.usingcaid.append(long(read_caid,16))
274                                         i+=1
275
276                                 for service in  slot.findall("service"):
277                                         read_service_name = service.get("name").encode("UTF-8")
278                                         read_service_ref = service.get("ref").encode("UTF-8")
279                                         self.read_services.append (read_service_ref)
280
281                                 for provider in  slot.findall("provider"):
282                                         read_provider_name = provider.get("name").encode("UTF-8")
283                                         read_provider_dvbname = provider.get("dvbnamespace").encode("UTF-8")
284                                         self.read_providers.append((read_provider_name,read_provider_dvbname))
285
286                                 self.ci_config.append((int(read_slot), (self.read_services, self.read_providers, self.usingcaid)))
287                 except:
288                         print "[CI_Config_CI%d] error parsing xml..." %self.ci_slot
289
290                 for item in self.read_services:
291                         if len(item):
292                                 self.finishedChannelSelection(item)
293
294                 for item in self.read_providers:
295                         if len(item):
296                                 self.finishedProviderSelection(item[0],item[1])
297
298                 print self.ci_config
299                 self.finishedCAidSelection(self.selectedcaid)
300                 self["ServiceList"].l.setList(self.servicelist)
301
302 class easyCIconfigMenu(CIconfigMenu):
303         skin = """
304                 <screen position="80,80" size="470,420" title="CI Assignment" >
305                         <widget name="ServiceList.desc" position="10,10" size="420,22" font="Regular;20" />
306                         <widget name="ServiceList" position="10,40" size="450,340" scrollbarMode="showOnDemand" />
307                         <ePixmap position="10,360" size="450,2" pixmap="skin_default/div-h.png" transparent="1" alphatest="on" />
308                         <ePixmap pixmap="skin_default/buttons/red.png" position="10,370" size="140,40" alphatest="on" />
309                         <ePixmap pixmap="skin_default/buttons/green.png" position="160,370" size="140,40" alphatest="on" />
310                         <ePixmap pixmap="skin_default/buttons/yellow.png" position="310,370" size="140,40" alphatest="on" />
311                         <widget source="key_red" render="Label" position="10,370" zPosition="1" size="140,40" font="Regular;19" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" />
312                         <widget source="key_green" render="Label" position="160,370" zPosition="1" size="140,40" font="Regular;19" halign="center" valign="center" backgroundColor="#1f771f" transparent="1" />
313                         <widget source="key_yellow" render="Label" position="310,370" zPosition="1" size="140,40" font="Regular;19" halign="center" valign="center" backgroundColor="#1f771f" transparent="1" />
314                 </screen>"""
315
316         def __init__(self, session, ci_slot="9"):
317                 ci=ci_slot
318                 CIconfigMenu.__init__(self, session, ci_slot)
319                 self.skin = easyCIconfigMenu.skin
320         
321                 self["actions"] = ActionMap(["ColorActions","SetupActions"],
322                 {
323                         "green": self.greenPressed,
324                         "red": self.redPressed,
325                         "yellow": self.yellowPressed,
326                         "blue": self.bluePressed,
327                         "ok": self.okPressed,
328                         "cancel": self.cancel
329                 }, -1)
330         
331         def bluePressed(self):
332                 print "do nothing"
333
334 class CAidSelect(Screen):
335         skin = """
336                 <screen position="210,140" size="310,290"  title="select CAId's" >
337                         <widget name="list" position="10,10" size="290,210" scrollbarMode="showOnDemand" />
338                         <ePixmap position="10,230" size="290,2" pixmap="skin_default/div-h.png" transparent="1" alphatest="on" />
339                         <ePixmap pixmap="skin_default/buttons/red.png" position="10,240" size="140,40" alphatest="on" />
340                         <ePixmap pixmap="skin_default/buttons/green.png" position="160,240" size="140,40" alphatest="on" />
341                         <widget source="key_red" render="Label" position="10,240" zPosition="1" size="140,40" font="Regular;19" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" />
342                         <widget source="key_green" render="Label" position="160,240" zPosition="1" size="140,40" font="Regular;19" halign="center" valign="center" backgroundColor="#1f771f" transparent="1" />
343                 </screen>"""
344         
345         def __init__(self, session, list, selected_caids):
346                 self.skin = CAidSelect.skin
347                 Screen.__init__(self, session)
348
349                 self.list = SelectionList()
350                 self["list"] = self.list
351
352                 for listindex in range(len(list)):
353                         if find_in_list(selected_caids,list[listindex][0],0):
354                                 self.list.addSelection(list[listindex][0], list[listindex][1], listindex, True)
355                         else:
356                                 self.list.addSelection(list[listindex][0], list[listindex][1], listindex, False)
357
358                 self["key_red"] = StaticText(_("Cancel"))
359                 self["key_green"] = StaticText(_("Save"))
360
361                 self["actions"] = ActionMap(["ColorActions","SetupActions"],
362                 {
363                         "ok": self.list.toggleSelection, 
364                         "cancel": self.cancel, 
365                         "green": self.greenPressed,
366                         "red": self.cancel
367                 }, -1)
368
369         def greenPressed(self):
370                 list = self.list.getSelectionsList()
371                 print list
372                 self.close(list)
373
374         def cancel(self):
375                 self.close()
376
377 class myProviderSelection(ChannelSelectionBase):
378         skin = """
379                 <screen position="80,80" size="560,430" title="Select provider to add...">
380                         <ePixmap pixmap="skin_default/buttons/red.png" position="0,0" size="140,40" alphatest="on" />
381                         <ePixmap pixmap="skin_default/buttons/green.png" position="140,0" size="140,40" alphatest="on" />
382                         <ePixmap pixmap="skin_default/buttons/yellow.png" position="280,0" size="140,40" alphatest="on" />
383                         <ePixmap pixmap="skin_default/buttons/blue.png" position="420,0" size="140,40" alphatest="on" />
384                         <widget name="key_red" position="0,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" />
385                         <widget name="key_green" position="140,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" transparent="1" />
386                         <widget name="key_yellow" position="280,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#a08500" transparent="1" />
387                         <widget name="key_blue" position="420,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#18188b" transparent="1" />
388                         <widget name="list" position="00,45" size="560,364" scrollbarMode="showOnDemand" />
389                 </screen>"""
390
391         def __init__(self, session, title):
392                 ChannelSelectionBase.__init__(self, session)
393                 self.onShown.append(self.__onExecCallback)
394
395                 self["actions"] = ActionMap(["OkCancelActions", "ChannelSelectBaseActions"],
396                         {
397                                 "showFavourites": self.doNothing,
398                                 "showAllServices": self.doNothing,
399                                 "showProviders": self.doNothing,
400                                 "showSatellites": self.doNothing,
401                                 "cancel": self.cancel,
402                                 "ok": self.channelSelected,
403                         })
404                 self["key_red"] = StaticText(_(""))
405                 self["key_green"] = StaticText(_(""))
406                 self["key_yellow"] = StaticText(_(""))
407                 self["key_blue"] = StaticText(_(""))
408
409         def doNothing(self):
410                 print "nothing to do..."
411
412         def __onExecCallback(self):
413                 self.showSatellites()
414
415         def channelSelected(self): # just return selected service
416                 ref = self.getCurrentSelection()
417                 splited_ref=ref.toString().split(":")
418                 if ref.flags == 7 and splited_ref[6] != "0":
419                         self.dvbnamespace=splited_ref[6]
420                         self.enterPath(ref)
421                 else:
422                         self.close(ref.getName(), self.dvbnamespace)
423
424         def showSatellites(self):
425                 if not self.pathChangeDisabled:
426                         refstr = '%s FROM SATELLITES ORDER BY satellitePosition'%(self.service_types)
427                         if not self.preEnterPath(refstr):
428                                 ref = eServiceReference(refstr)
429                                 justSet=False
430                                 prev = None
431
432                                 if self.isBasePathEqual(ref):
433                                         if self.isPrevPathEqual(ref):
434                                                 justSet=True
435                                         prev = self.pathUp(justSet)
436                                 else:
437                                         currentRoot = self.getRoot()
438                                         if currentRoot is None or currentRoot != ref:
439                                                 justSet=True
440                                                 self.clearPath()
441                                                 self.enterPath(ref, True)
442                                 if justSet:
443                                         serviceHandler = eServiceCenter.getInstance()
444                                         servicelist = serviceHandler.list(ref)
445                                         if not servicelist is None:
446                                                 while True:
447                                                         service = servicelist.getNext()
448                                                         if not service.valid(): #check if end of list
449                                                                 break
450                                                         unsigned_orbpos = service.getUnsignedData(4) >> 16
451                                                         orbpos = service.getData(4) >> 16
452                                                         if orbpos < 0:
453                                                                 orbpos += 3600
454                                                         if service.getPath().find("FROM PROVIDER") != -1:
455                                                                 service_type = _("Providers")
456                                                                 try:
457                                                                         # why we need this cast?
458                                                                         service_name = str(nimmanager.getSatDescription(orbpos))
459                                                                 except:
460                                                                         if unsigned_orbpos == 0xFFFF: #Cable
461                                                                                 service_name = _("Cable")
462                                                                         elif unsigned_orbpos == 0xEEEE: #Terrestrial
463                                                                                 service_name = _("Terrestrial")
464                                                                         else:
465                                                                                 if orbpos > 1800: # west
466                                                                                         orbpos = 3600 - orbpos
467                                                                                         h = _("W")
468                                                                                 else:
469                                                                                         h = _("E")
470                                                                                 service_name = ("%d.%d" + h) % (orbpos / 10, orbpos % 10)
471                                                                 service.setName("%s - %s" % (service_name, service_type))
472                                                                 self.servicelist.addService(service)
473                                                 self.servicelist.finishFill()
474                                                 if prev is not None:
475                                                         self.setCurrentSelection(prev)
476
477         def cancel(self):
478                 self.close(None)
479
480 class myChannelSelection(ChannelSelectionBase):
481         skin = """
482                 <screen position="80,80" size="560,430" title="Select service to add...">
483                         <ePixmap pixmap="skin_default/buttons/red.png" position="0,0" size="140,40" alphatest="on" />
484                         <ePixmap pixmap="skin_default/buttons/green.png" position="140,0" size="140,40" alphatest="on" />
485                         <ePixmap pixmap="skin_default/buttons/yellow.png" position="280,0" size="140,40" alphatest="on" />
486                         <ePixmap pixmap="skin_default/buttons/blue.png" position="420,0" size="140,40" alphatest="on" />
487                         <widget name="key_red" position="0,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" />
488                         <widget name="key_green" position="140,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" transparent="1" />
489                         <widget name="key_yellow" position="280,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#a08500" transparent="1" />
490                         <widget name="key_blue" position="420,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#18188b" transparent="1" />
491                         <widget name="list" position="00,45" size="560,364" scrollbarMode="showOnDemand" />
492                 </screen>"""
493
494         def __init__(self, session, title):
495                 ChannelSelectionBase.__init__(self, session)
496                 self.onShown.append(self.__onExecCallback)
497                 service = self.session.nav.getCurrentService()
498                 if service:
499                         info = service.info()
500                         if info:
501                                 refstr = info.getInfoString(iServiceInformation.sServiceref)
502                                 self.servicelist.setPlayableIgnoreService(eServiceReference(refstr))
503
504                 self["actions"] = ActionMap(["OkCancelActions", "TvRadioActions", "ChannelSelectBaseActions"],
505                         {
506                                 "showProviders": self.doNothing,
507                                 "showSatellites": self.doNothing,
508                                 "cancel": self.cancel,
509                                 "ok": self.channelSelected,
510                                 "keyRadio": self.setModeRadio,
511                                 "keyTV": self.setModeTv
512                         })
513
514                 self["key_green"] = StaticText(_(""))
515                 self["key_yellow"] = StaticText(_(""))
516
517         def __onExecCallback(self):
518                 self.setModeTv()
519
520         def doNothing(self):
521                 print "nothing to do..."
522
523         def channelSelected(self): # just return selected service
524                 ref = self.getCurrentSelection()
525                 if (ref.flags & 7) == 7:
526                         self.enterPath(ref)
527                 elif not (ref.flags & eServiceReference.isMarker):
528                         ref = self.getCurrentSelection()
529                         self.close(ref)
530
531         def setModeTv(self):
532                 self.setTvMode()
533                 self.showFavourites()
534
535         def setModeRadio(self):
536                 self.setRadioMode()
537                 self.showFavourites()
538
539         def cancel(self):
540                 self.close(None)
541
542 def activate_all(session):
543         NUM_CI=eDVBCIInterfaces.getInstance().getNumOfSlots()
544         print "[CI_Activate] FOUND %d CI Slots " % NUM_CI
545         if NUM_CI > 0:
546                 ci_config=[]
547                 def getValue(definitions, default):
548                         # Initialize Output
549                         ret = ""
550                         # How many definitions are present
551                         Len = len(definitions)
552                         return Len > 0 and definitions[Len-1].text or default   
553
554                 for ci in range(NUM_CI):
555                         filename="/etc/enigma2/ci"+str(ci)+".xml"
556
557                         if not os_path.exists(filename):
558                                 print "[CI_Activate_Config_CI%d] no config file found" %ci
559
560                         try:
561                                 tree = ci_parse(filename).getroot()
562                                 read_services=[]
563                                 read_providers=[]
564                                 usingcaid=[]
565                                 for slot in tree.findall("slot"):
566                                         read_slot = getValue(slot.findall("id"), False).encode("UTF-8")
567
568                                         for caid in slot.findall("caid"):
569                                                 read_caid = caid.get("id").encode("UTF-8")
570                                                 usingcaid.append(long(read_caid,16))
571
572                                         for service in slot.findall("service"):
573                                                 read_service_ref = service.get("ref").encode("UTF-8")
574                                                 read_services.append (read_service_ref)
575
576                                         for provider in slot.findall("provider"):
577                                                 read_provider_name = provider.get("name").encode("UTF-8")
578                                                 read_provider_dvbname = provider.get("dvbnamespace").encode("UTF-8")
579                                                 read_providers.append((read_provider_name,long(read_provider_dvbname,16)))
580
581                                         ci_config.append((int(read_slot), (read_services, read_providers, usingcaid)))
582                         except:
583                                 print "[CI_Activate_Config_CI%d] error parsing xml..." %ci
584
585                 for item in ci_config:
586                         print "[CI_Activate] activate CI%d with following settings:" %item[0]
587                         print item[0]
588                         print item[1]
589                         try:
590                                 eDVBCIInterfaces.getInstance().setDescrambleRules(item[0],item[1])
591                         except:
592                                 print "[CI_Activate_Config_CI%d] error setting DescrambleRules..." %item[0]
593
594 def find_in_list(list, search, listpos=0):
595         for item in list:
596                 if item[listpos]==search:
597                         return True
598         return False
599
600 global_session = None
601
602 def sessionstart(reason, session):
603         global global_session
604         global_session = session
605
606 def autostart(reason, **kwargs):
607         global global_session
608         if reason == 0:
609                 print "[CI_Assignment] activating ci configs:"
610                 activate_all(global_session)
611         elif reason == 1:
612                 global_session = None
613
614 def main(session, **kwargs):
615         session.open(CIselectMainMenu)
616
617 def menu(menuid, **kwargs):
618         if menuid == "setup" and eDVBCIInterfaces.getInstance().getNumOfSlots():
619                 return [(_("Common Interface Assignment"), main, "ci_assign", 11)]
620         return [ ]
621
622 def Plugins(**kwargs):
623         if config.usage.setup_level.index > 1:
624                 return [PluginDescriptor( where = PluginDescriptor.WHERE_SESSIONSTART, fnc = sessionstart ),
625                                 PluginDescriptor( where = PluginDescriptor.WHERE_AUTOSTART, fnc = autostart ),
626                                 PluginDescriptor( name = "CommonInterfaceAssignment", description = _("a gui to assign services/providers/caids to common interface modules"), where = PluginDescriptor.WHERE_MENU, fnc = menu )]
627         else:
628                 return [PluginDescriptor( where = PluginDescriptor.WHERE_SESSIONSTART, fnc = sessionstart ),
629                                 PluginDescriptor( where = PluginDescriptor.WHERE_AUTOSTART, fnc = autostart ),
630                                 PluginDescriptor( name = "CommonInterfaceAssignment", description = _("a gui to assign services/providers to common interface modules"), where = PluginDescriptor.WHERE_MENU, fnc = menu )]