dbus: Send out a PropertyChanged event when a device is paired

Just updating the array isn't enough, we need to bubble up the property
change and then manually send the PropertyChanged event
This commit is contained in:
Peter Hutterer 2018-01-22 17:11:47 +10:00
parent daac6e6d96
commit d3192dc070
2 changed files with 44 additions and 0 deletions

View File

@ -93,6 +93,14 @@ class TuhiDevice(GObject.Object):
self._tuhi_dbus_device = None self._tuhi_dbus_device = None
@GObject.Property
def paired(self):
return self._paired
@paired.setter
def paired(self, paired):
self._paired = paired
@property @property
def name(self): def name(self):
return self._bluez_device.name return self._bluez_device.name

View File

@ -99,6 +99,15 @@ class TuhiDBusDevice(GObject.Object):
self._connection = connection self._connection = connection
self._dbusid = self._register_object(connection) self._dbusid = self._register_object(connection)
device.connect('notify::paired', self._on_device_paired)
@GObject.Property
def paired(self):
return self._paired
@paired.setter
def paired(self, paired):
self._paired = paired
def remove(self): def remove(self):
self._connection.unregister_object(self._dbusid) self._connection.unregister_object(self._dbusid)
@ -153,6 +162,10 @@ class TuhiDBusDevice(GObject.Object):
def _pair(self): def _pair(self):
self.emit('pair-requested') self.emit('pair-requested')
def _on_device_paired(self, device, pspec):
logger.debug('{}: is paired {}'.format(device, device.paired))
self.paired = device.paired
def _listen(self): def _listen(self):
# FIXME: start listen asynchronously # FIXME: start listen asynchronously
# FIXME: update property when listen finishes # FIXME: update property when listen finishes
@ -287,11 +300,34 @@ class TuhiDBusServer(GObject.Object):
def create_device(self, device): def create_device(self, device):
dev = TuhiDBusDevice(device, self._connection) dev = TuhiDBusDevice(device, self._connection)
dev.connect('notify::paired', self._on_device_paired)
self._devices.append(dev) self._devices.append(dev)
if not device.paired: if not device.paired:
self._emit_pairable_signal(dev) self._emit_pairable_signal(dev)
return dev return dev
def _on_device_paired(self, device, param):
logger.debug('dbus server {}: is paired {}'.format(device, device.paired))
props = GLib.VariantBuilder(GLib.VariantType('a{sv}'))
objpaths = GLib.Variant.new_array(GLib.VariantType('o'),
[GLib.Variant.new_object_path(d.objpath)
for d in self._devices if d.paired])
de = GLib.Variant.new_dict_entry(GLib.Variant.new_string('Devices'),
GLib.Variant.new_variant(objpaths))
props.add_value(de)
props = props.end()
inval_props = GLib.VariantBuilder(GLib.VariantType('as'))
inval_props = inval_props.end()
self._connection.emit_signal(None, BASE_PATH,
"org.freedesktop.DBus.Properties",
"PropertiesChanged",
GLib.Variant.new_tuple(
GLib.Variant.new_string(INTF_MANAGER),
props,
inval_props))
def _emit_pairable_signal(self, device): def _emit_pairable_signal(self, device):
arg = GLib.Variant.new_object_path(device.objpath) arg = GLib.Variant.new_object_path(device.objpath)
self._connection.emit_signal(None, BASE_PATH, INTF_MANAGER, self._connection.emit_signal(None, BASE_PATH, INTF_MANAGER,