summaryrefslogtreecommitdiff
path: root/bin
diff options
authorYung Shen <yung.shen@canonical.com>2016-04-06 16:59:44 +0800
committerYung Shen <yung.shen@canonical.com>2016-04-06 16:59:44 +0800
commit45ab34142aa87eb11f9eb8bafe841a11afdb2a2d (patch)
treee048a80e8b09fc26d531c04478878cc579779368 /bin
parent523a61bfd8ba3b90f88a64d651daec118c8357b9 (diff)
Update bt_helper.py from https://github.com/kissiel/bt_helper at commit a3948d4 for exit code support
Diffstat (limited to 'bin')
-rw-r--r--bin/bt_helper.py22
1 files changed, 17 insertions, 5 deletions
diff --git a/bin/bt_helper.py b/bin/bt_helper.py
index fc87b4e..91f879a 100644
--- a/bin/bt_helper.py
+++ b/bin/bt_helper.py
@@ -19,10 +19,11 @@ typical Bluetooth task like scanning for devices and pairing with them.
It talks with BlueZ stack using dbus.
"""
+import logging
+
import dbus
import dbus.service
import dbus.mainloop.glib
-import logging
from gi.repository import GObject
logger = logging.getLogger(__file__)
@@ -35,10 +36,16 @@ AGENT_IFACE = 'org.bluez.Agent1'
dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
+# To get additional Bluetoot CoDs, check
+# https://www.bluetooth.com/specifications/assigned-numbers/baseband
BT_ANY = 0
BT_KEYBOARD = int('0x2540', 16)
+class BtException(Exception):
+ pass
+
+
class BtManager:
""" Main point of contact with dbus factoring bt objects. """
def __init__(self, verbose=False):
@@ -113,7 +120,7 @@ class BtManager:
def wait(self):
self._main_loop.run()
- def resume(self):
+ def quit_loop(self):
self._main_loop.quit()
def ensure_adapters_powered(self):
@@ -185,6 +192,7 @@ class BtDevice:
self._if.object_path)[DEVICE_IFACE]
self._bt_mgr = bt_mgr
self._prop_if = bt_mgr.get_prop_iface(dbus_iface)
+ self._pair_outcome = None
def __str__(self):
return "{} ({})".format(self.name, self.address)
@@ -203,6 +211,8 @@ class BtDevice:
self._if.Pair(
reply_handler=self._pair_ok, error_handler=self._pair_error)
self._bt_mgr.wait()
+ if self._pair_outcome:
+ raise BtException(self._pair_outcome)
try:
self._if.Connect()
except dbus.exceptions.DBusException as exc:
@@ -228,11 +238,13 @@ class BtDevice:
def _pair_ok(self):
logger.info('%s successfully paired', self.name)
- self._bt_mgr.resume()
+ self._pair_outcome = None
+ self._bt_mgr.quit_loop()
def _pair_error(self, error):
logger.warning('Pairing of %s device failed. %s', self.name, error)
- self._bt_mgr.resume()
+ self._pair_outcome = error
+ self._bt_mgr.quit_loop()
class Rejected(dbus.DBusException):
@@ -240,7 +252,7 @@ class Rejected(dbus.DBusException):
class BtAgent(dbus.service.Object):
- """Agent authenticating everything what's possible."""
+ """Agent authenticating everything that is possible."""
@dbus.service.method(AGENT_IFACE, in_signature="os", out_signature="")
def AuthorizeService(self, device, uuid):
logger.info("AuthorizeService (%s, %s)", device, uuid)