11 import dbus.mainloop.glib
15 ##=================================================================
18 #signal handler #1 for Manager
19 def manager_Added(self, name):
20 print (" Added %s") % name
21 self.manager_getDetails()
23 #signal handler #2 for Manager
24 def manager_Removed(self, name):
25 print (" Removed %s") % name
26 if self.adapters_remove is not None:
27 self.adapter_update(name)
30 #connect to the manager in order to be notified on
32 def manager_Connect(self):
34 manager_obj = self.sessionBus.get_object('org.neard', "/")
35 # Add 2 handlers to follow Adapters
36 manager_obj.connect_to_signal('AdapterAdded',
39 manager_obj.connect_to_signal('AdapterRemoved',
42 self.iface_manager = dbus.Interface(manager_obj, 'org.neard.Manager')
45 print ("Can't connect to org.neard.Manager");
46 self.iface_manager = None
47 #Retrieve the manager informations
48 self.manager_getDetails()
50 def manager_getDetails(self):
51 #No iface_manager means adapter removed
52 if self.iface_manager is None:
53 if self.adapters_remove is not None:
54 self.adapters_remove()
56 #Need to update adapter's details
57 self.adapter_updateDetails(self.iface_manager.GetProperties())
59 def adapter_PropertyChanged(self, prop, value, adapt_path = None):
60 print("Prop changed: %s") % prop
62 adapt_properties[prop] = value
64 self.target_updateDetails(adapt_properties)
66 self.adapter_update(adapt_path, adapt_properties)
68 #Update the records UI
69 def record_updateDetails(self, target_properties):
70 for record_path in target_properties["Records"]:
71 print ("REC %s ") % record_path
72 record_obj = self.systemBus.get_object('org.neard',
74 record_iface = dbus.Interface(record_obj,'org.neard.Record')
75 record_properties = record_iface.GetProperties()
77 self.recordregistered[record_path] = True
80 self.records_update(record_path, record_properties)
82 #Update the targets UI
83 def target_updateDetails(self, adapt_properties):
84 if adapt_properties["Targets"]:
85 for target_path in adapt_properties["Targets"]:
86 print ("TGT %s ") % target_path
87 target_obj = self.systemBus.get_object('org.neard', target_path)
89 target_iface = dbus.Interface(target_obj,'org.neard.Target')
90 target_properties = target_iface.GetProperties()
92 self.targetregistered[target_path] = True
94 self.targets_update(target_path, target_properties)
96 self.record_updateDetails(target_properties)
98 print ("remove targets and records")
100 self.records_update()
103 #Something changed, must update the UI
104 def adapter_updateDetails(self, properties):
105 if self.adapter_update is not None and "Adapters" in properties:
106 for adapt_path in properties["Adapters"]:
107 if adapt_path in self.adaptregistered:
108 print (" already registered %s") % adapt_path
110 #Get valuable informations from the object
111 adapter_obj = self.systemBus.get_object('org.neard',
113 adapter_obj.connect_to_signal('PropertyChanged',
114 self.adapter_PropertyChanged,
116 path_keyword='adapt_path')
118 adapt_iface = dbus.Interface(adapter_obj,'org.neard.Adapter')
119 adapt_properties = adapt_iface.GetProperties()
121 self.adaptregistered[adapt_path] = True
124 self.adapter_update(adapt_path, adapt_properties)
126 #udpate UI for targets
127 self.target_updateDetails(adapt_properties)
130 #Search DBUS to find any neard instance
131 def neardNameOwnerChanged(self, proxy):
133 print("Neard is connected to session bus")
134 self.manager_Connect()
136 print("Neard is disconnected from session bus")
137 self.iface_manager = None
138 self.adaptregistered = {}
139 self.manager_getDetails()
142 def __init__(self, adapter_update = None, adapters_remove = None,
143 targets_update = None, records_update = None):
145 self.adapter_update = adapter_update
146 self.adapters_remove = adapters_remove
147 self.targets_update = targets_update
148 self.records_update = records_update
150 self.adaptregistered = {}
151 self.targetregistered = {}
152 self.recordregistered = {}
154 self.systemBus = dbus.SessionBus()
156 #Prepare the first handler
157 self.systemBus.watch_name_owner('org.neard',
158 self.neardNameOwnerChanged)
160 ##=================================================================
161 class NeardUI(Neard):
163 # return the current selection
164 def adapters_actionToggle(self, i, col):
166 return self.adapters_list.get_value(i, col)
169 # Action: activate or not the polling mode
170 def adapter_pollingToggled(self, poolingRendererToggle, path, user):
172 i = self.adapters_list.get_iter(path)
173 objpath = self.adapters_list.get_value(i, 0)
174 adapter_obj = self.systemBus.get_object('org.neard', objpath)
175 adapt_iface = dbus.Interface(adapter_obj,'org.neard.Adapter')
177 if self.adapters_actionToggle(i, 3):
178 print ("Stop Polling %s") % objpath
179 adapt_iface.StopPoll()
181 print ("Start Polling %s") % objpath
182 adapt_iface.StartPoll()
185 #------------------------------
186 #Set the field values
187 def adapters_setUIList(self, adapt_properties, i, col, name, path = None):
188 if name in adapt_properties:
189 value = adapt_properties[name]
191 if name == "Targets":
193 for tgts in adapt_properties[name]:
194 #For each target, add it to the target lbox:
196 short_tgt = tgts[len(path)+1:]
199 value = "{" + short_tgt
201 value = value + "," + short_tgt
204 if name == "Protocols":
206 for protos in adapt_properties[name]:
210 value = value + " " + protos
212 if value is not None:
213 self.adapters_list.set_value(i, col, value)
214 print (" property %s, value %s") % (name, value)
216 # Clear one or all the adapters present in list
217 def adapter_RemoveUI(self):
218 self.adapters_list.clear()
220 #Add, Update or delete a list entry
221 def adapter_UpdateUI(self, path = None, adapt_properties = None):
222 i = self.adapters_list.get_iter_first()
224 if self.adapters_list.get_value(i, 0) == path:
226 i = self.adapters_list.iter_next(i)
228 if adapt_properties is None:
230 print ("Delete adapter %s") % path
231 self.adapters_list.remove(i)
233 print ("Already deleted adapter %s") % path
237 i = self.adapters_list.append()
238 self.adapters_list.set_value(i, 0, path)
239 print ("Add adapter %s") % (path)
241 print ("Update adapter %s") % (path)
244 self.adapters_setUIList(adapt_properties, i, 2, "Powered")
245 self.adapters_setUIList(adapt_properties, i, 3, "Polling")
246 self.adapters_setUIList(adapt_properties, i, 4, "Protocols")
247 self.adapters_setUIList(adapt_properties, i, 5, "Targets", path)
249 #--------------------------------------------------
250 def targets_setUIList(self, target_properties, i, col, name):
251 if name in target_properties:
252 value = target_properties[name]
254 if name == "Records":
256 for tgts in target_properties[name]:
257 #For each target, add it to the target lbox:
261 value = value + "-" + tgts
263 if name == "TagType":
265 for tgts in target_properties[name]:
266 #For each target, add it to the target lbox:
270 value = value + "-" + tgts
272 if value is not None:
273 self.targets_list.set_value(i, col, value)
274 print (" property %s, value %s") % (name, value)
276 #Add, Update or delete a list entry
277 def target_UpdateUI(self, path = None, target_properties = None):
278 print("Target Update %s") % path
279 i = self.targets_list.get_iter_first()
281 if self.targets_list.get_value(i, 0) == path:
283 i = self.targets_list.iter_next(i)
285 #Delete mode: Remove all
286 if target_properties is None:
287 i = self.targets_list.get_iter_first()
289 path_name = self.targets_list.get_value(i, 0)
290 print ("Deleted target %s") % path_name
291 self.targets_list.remove(i)
292 if self.targets_list.iter_is_valid(i):
293 i = self.targets_list.iter_next(i)
299 i = self.targets_list.append()
300 self.targets_list.set_value(i, 0, path)
301 print ("Add target %s") % (path)
303 print ("Update target %s") % (path)
304 self.targets_setUIList(target_properties, i, 2, "ReadOnly")
305 self.targets_setUIList(target_properties, i, 3, "Type")
306 self.targets_setUIList(target_properties, i, 4, "TagType")
307 self.targets_setUIList(target_properties, i, 5, "Records")
309 #--------------------------------------------------
310 def records_setUIList(self, record_properties, i, col, name):
311 if name in record_properties:
312 value = record_properties[name]
315 for rec_data in record_properties:
316 if rec_data != "Type":
319 value = value + rec_data + " : " +record_properties[rec_data]
321 if value is not None:
322 self.records_list.set_value(i, col, value)
323 print (" property %s, value %s") % (name, value)
325 #Add, Update or delete a list entry
326 def record_UpdateUI(self, path = None, record_properties = None):
327 print("Record Update %s") % path
328 i = self.records_list.get_iter_first()
330 if self.records_list.get_value(i, 0) == path:
332 i = self.records_list.iter_next(i)
334 #Delete mode: Remove all records
335 if record_properties is None:
336 i = self.records_list.get_iter_first()
338 path_name = self.records_list.get_value(i, 0)
339 print ("Delete record %s") % path_name
340 self.records_list.remove(i)
341 if self.records_list.iter_is_valid(i):
342 i = self.records_list.iter_next(i)
348 i = self.records_list.append()
349 self.records_list.set_value(i, 0, path)
350 print ("Add record %s") % (path)
352 print ("Update record %s") % (path)
354 self.records_setUIList(record_properties, i, 2, "Type")
355 self.records_setUIList(record_properties, i, 3, "Data")
358 def target_RemoveUI(self):
359 printf("Target Remove")
361 #Adapter selected on lbox
362 def on_adapter_sel_changed(self, selection = None):
363 model, iter = selection.get_selected()
365 value = self.adapters_list.get_value(iter, 0)
366 print ("value %s") % value
367 value = self.adapters_list.get_value(iter, 5)
368 print ("target: %s") % value
371 #-----------------------------------------------------
372 # Prepare TreeView for Adapters
373 def createAdaptersWidgets(self, adaptlist):
376 tv_adapters = gtk.TreeView(adaptlist)
378 column = gtk.TreeViewColumn("Path", gtk.CellRendererText(), text=0)
379 tv_adapters.append_column(column)
381 toggle = gtk.CellRendererToggle()
382 column = gtk.TreeViewColumn("Powered", toggle, active=2)
383 tv_adapters.append_column(column)
385 toggle = gtk.CellRendererToggle()
386 column = gtk.TreeViewColumn("Polling", toggle, active=3)
387 toggle.connect('toggled', self.adapter_pollingToggled, None)
388 tv_adapters.append_column(column)
390 column = gtk.TreeViewColumn("Protocols",gtk.CellRendererText(), text=4)
391 tv_adapters.append_column(column)
393 column = gtk.TreeViewColumn("Targets", gtk.CellRendererText(), text=5)
394 tv_adapters.append_column(column)
396 tv_adapters.get_selection().connect("changed",
397 self.on_adapter_sel_changed)
401 # Prepare TreeView for Targets
402 def createTargetsWidgets(self, targets_list):
405 tv_targets = gtk.TreeView(targets_list)
407 column = gtk.TreeViewColumn("Path", gtk.CellRendererText(), text=0)
408 tv_targets.append_column(column)
409 toggle = gtk.CellRendererToggle()
410 column = gtk.TreeViewColumn("ReadOnly", toggle, active=2)
411 tv_targets.append_column(column)
413 column = gtk.TreeViewColumn("Type", gtk.CellRendererText(), text=3)
414 tv_targets.append_column(column)
416 column = gtk.TreeViewColumn("NFC Type ", gtk.CellRendererText(), text=4)
417 tv_targets.append_column(column)
419 column = gtk.TreeViewColumn("Record", gtk.CellRendererText(), text=5)
420 tv_targets.append_column(column)
424 # Prepare TreeView for Records
425 def createRecordsWidgets(self, records_list):
427 tv_records = gtk.TreeView(records_list)
429 column = gtk.TreeViewColumn("Path", gtk.CellRendererText(), text=0)
430 tv_records.append_column(column)
432 column = gtk.TreeViewColumn("Type", gtk.CellRendererText(), text=2)
433 tv_records.append_column(column)
435 column = gtk.TreeViewColumn("Data", gtk.CellRendererText(), text=3)
436 tv_records.append_column(column)
439 def dlg_onResponse(self, dialog, response):
440 self.neardDialog.destroy()
441 self.neardDialog = None
442 if self.response_callback is not None:
443 self.response_callback(response)
445 #------------------------------
447 def createDialog(self, title = None):
448 if self.title is not None:
450 dialog = gtk.Dialog(title, None,
452 gtk.DIALOG_DESTROY_WITH_PARENT,
453 (gtk.STOCK_OK, gtk.RESPONSE_ACCEPT))
454 dialog.set_property("resizable", True)
455 dialog.set_default_size(800, 300)
457 notebook = gtk.Notebook()
458 dialog.child.add(notebook)
460 # Create the first tab...an adapters's list
461 scrolledwindow = gtk.ScrolledWindow()
462 widget = self.createAdaptersWidgets(self.adapters_list)
463 scrolledwindow.add(widget)
464 # notebook.append_page(widget, gtk.Label("Adapters"))
465 notebook.append_page(scrolledwindow, gtk.Label("Adapters"))
467 scrolledwindow = gtk.ScrolledWindow()
468 widget = self.createTargetsWidgets(self.targets_list)
469 scrolledwindow.add(widget)
470 #notebook.append_page(widget, gtk.Label("Targets"))
471 notebook.append_page(scrolledwindow, gtk.Label("Targets"))
473 scrolledwindow = gtk.ScrolledWindow()
474 widget = self.createRecordsWidgets(self.records_list)
475 scrolledwindow.add(widget)
476 notebook.append_page(scrolledwindow, gtk.Label("Records"))
478 dialog.connect('response', self.dlg_onResponse)
479 # dialog.vbox.pack_end(vbox, True, True, 0)
483 if self.neardDialog is None:
484 self.neardDialog = self.createDialog()
485 self.neardDialog.show_all()
487 def __init__(self, title = None, response_callback = None):
489 self.response_callback = response_callback
490 self.neardDialog = None
492 self.adapters_list = gtk.ListStore(gobject.TYPE_STRING, # path =0
493 gobject.TYPE_STRING, # Name = 1
494 gobject.TYPE_BOOLEAN, # powered = 2
495 gobject.TYPE_BOOLEAN, # polling = 3
496 gobject.TYPE_STRING, # protocols = 4
497 gobject.TYPE_STRING) # targets = 5
499 self.targets_list = gtk.ListStore(gobject.TYPE_STRING, # path =0
500 gobject.TYPE_STRING, # Name = 1
501 gobject.TYPE_BOOLEAN, # Read Only 2
502 gobject.TYPE_STRING, # tag Type = 3
503 gobject.TYPE_STRING, # Type = 4
504 gobject.TYPE_STRING) # Record = 5
506 self.records_list = gtk.ListStore(gobject.TYPE_STRING, # path =0
507 gobject.TYPE_STRING, # Name = 1
508 gobject.TYPE_STRING, # Type = 2
509 gobject.TYPE_STRING) # content = 3
511 Neard.__init__(self, self.adapter_UpdateUI, self.adapter_RemoveUI
512 , self.target_UpdateUI, self.record_UpdateUI)
514 ##=================================================================
515 if __name__ == "__main__":
517 def endmainloop(response):
520 dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
521 mainloop = gobject.MainLoop()
523 m = NeardUI("Neard", endmainloop)