implement a basic Start/StopListening

This implements the ListeningStopped signal (especially the EAGAIN if we're
already listening) but does not yet actually trigger the listening on the
device.

There is still no timeout, and no signal gets emitted.
The current way of testing this is:
- call StartListening() on the DBus device
- start discovery on the adapter by some other mean
- press the button on the device -> the sync will happen
- call StopDiscovery()
- press the button on the device -> the sync will *not* happen
pull/15/head
Benjamin Tissoires 2018-01-19 11:19:26 +01:00 committed by Peter Hutterer
parent 0e6d82dd14
commit e3fff4015a
2 changed files with 76 additions and 7 deletions

View File

@ -119,6 +119,10 @@ class TuhiDevice(GObject.Object):
self._tuhi_dbus_device = device
self._tuhi_dbus_device.connect('pair-requested', self._on_pair_requested)
@property
def listening(self):
return self._tuhi_dbus_device.listening
def connect_device(self):
self._bluez_device.connect_device()
@ -264,8 +268,12 @@ class Tuhi(GObject.Object):
d.dbus_device = self.server.create_device(d)
self.devices[bluez_device.address] = d
d = self.devices[bluez_device.address]
if Tuhi._is_pairing_device(bluez_device):
logger.debug('{}: call Pair() on device'.format(bluez_device.objpath))
elif d.listening:
d.connect_device()
def main(args):

View File

@ -12,6 +12,7 @@
#
import logging
import errno
from gi.repository import GObject, Gio, GLib
@ -45,6 +46,9 @@ INTROSPECTION_XML = """
<property type='s' name='Name' access='read'/>
<property type='s' name='Address' access='read'/>
<property type='uu' name='Dimensions' access='read'/>
<property type='b' name='Listening' access='read'>
<annotation name='org.freedesktop.DBus.Property.EmitsChangedSignal' value='true'/>
</property>
<property type='u' name='DrawingsAvailable' access='read'>
<annotation name='org.freedesktop.DBus.Property.EmitsChangedSignal' value='true'/>
</property>
@ -53,7 +57,11 @@ INTROSPECTION_XML = """
<arg name='result' type='i' direction='out'/>
</method>
<method name='Listen'>
<method name='StartListening'>
<annotation name='org.freedesktop.DBus.Method.NoReply' value='true'/>
</method>
<method name='StopListening'>
<annotation name='org.freedesktop.DBus.Method.NoReply' value='true'/>
</method>
@ -94,6 +102,7 @@ class TuhiDBusDevice(GObject.Object):
self.width, self.height = 0, 0
self.drawings = []
self.paired = device.paired
self._listening = False
objpath = device.address.replace(':', '_')
self.objpath = "{}/{}".format(BASE_PATH, objpath)
@ -101,6 +110,34 @@ class TuhiDBusDevice(GObject.Object):
self._dbusid = self._register_object(connection)
device.connect('notify::paired', self._on_device_paired)
@GObject.Property
def listening(self):
return self._listening
@listening.setter
def listening(self, value):
if self._listening == value:
return
self._listening = value
props = GLib.VariantBuilder(GLib.VariantType('a{sv}'))
de = GLib.Variant.new_dict_entry(GLib.Variant.new_string('Listening'),
GLib.Variant.new_variant(
GLib.Variant.new_boolean(value)))
props.add_value(de)
props = props.end()
inval_props = GLib.VariantBuilder(GLib.VariantType('as'))
inval_props = inval_props.end()
self._connection.emit_signal(None, self.objpath,
"org.freedesktop.DBus.Properties",
"PropertiesChanged",
GLib.Variant.new_tuple(
GLib.Variant.new_string(INTF_DEVICE),
props,
inval_props))
@GObject.Property
def paired(self):
return self._paired
@ -132,8 +169,11 @@ class TuhiDBusDevice(GObject.Object):
self._pair()
result = GLib.Variant.new_int32(0)
invocation.return_value(GLib.Variant.new_tuple(result))
elif methodname == 'Listen':
self._listen()
elif methodname == 'StartListening':
self._start_listening(connection, sender)
invocation.return_value()
elif methodname == 'StopListening':
self._stop_listening(connection, sender)
invocation.return_value()
elif methodname == 'GetJSONData':
json = GLib.Variant.new_string(self._json_data(args))
@ -153,6 +193,8 @@ class TuhiDBusDevice(GObject.Object):
return GLib.Variant.new_tuple(w, h)
elif propname == 'DrawingsAvailable':
return GLib.Variant.new_uint32(len(self.drawings))
elif propname == 'Listening':
return GLib.Variant.new_boolean(self.listening)
return None
@ -165,10 +207,29 @@ class TuhiDBusDevice(GObject.Object):
def _on_device_paired(self, device, pspec):
self.paired = device.paired
def _listen(self):
# FIXME: start listen asynchronously
# FIXME: update property when listen finishes
pass
def _start_listening(self, connection, sender):
if self.listening:
logger.debug("{} - already listening".format(self))
status = GLib.Variant.new_int32(-errno.EAGAIN)
status = GLib.Variant.new_tuple(status)
connection.emit_signal(sender, self.objpath, INTF_DEVICE,
"ListeningStopped", status)
return
# FIXME: notify the server to start discovery
self.listening = True
def _stop_listening(self, connection, sender):
if not self.listening:
return
# FIXME: notify the server to stop discovery
self.listening = False
status = GLib.Variant.new_int32(0)
status = GLib.Variant.new_tuple(status)
connection.emit_signal(sender, self.objpath, INTF_DEVICE,
"ListeningStopped", status)
def _json_data(self, args):
index = args[0]