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