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