def _disconnect_service( self, object_path: str, uuid: str, port: int, ok: Callable[[], None], err: Callable[ [Union[BluezDBusException, "NMConnectionError", GLib.Error, str]], None] ) -> None: if uuid == '00000000-0000-0000-0000-000000000000': device = Device(obj_path=object_path) device.disconnect(reply_handler=ok, error_handler=err) else: service = get_service(Device(obj_path=object_path), uuid) assert service is not None if any( plugin.service_disconnect_handler(service, ok, err) for plugin in self.parent.Plugins.get_loaded_plugins( ServiceConnectHandler)): pass elif isinstance(service, SerialService): service.disconnect(port, reply_handler=ok, error_handler=err) for plugin in self.parent.Plugins.get_loaded_plugins( RFCOMMConnectedListener): plugin.on_rfcomm_disconnect(port) logging.info("Disconnecting rfcomm device") elif isinstance(service, NetworkService): service.disconnect(reply_handler=ok, error_handler=err)
def _disconnect_service( self, object_path: str, uuid: str, port: int, ok: Callable[[], None], err: Callable[ [Union[BluezDBusException, NMConnectionError, GLib.Error, str]], None] ) -> None: if uuid == '00000000-0000-0000-0000-000000000000': device = Device(obj_path=object_path) device.disconnect(reply_handler=ok, error_handler=err) else: def cb(_inst, ret): if ret: raise StopException service = get_service(Device(obj_path=object_path), uuid) assert service is not None if isinstance( service, SerialService ) and 'NMDUNSupport' in self.parent.Plugins.get_loaded(): self.parent.Plugins.run_ex("service_disconnect_handler", cb, service, ok, err) elif isinstance( service, SerialService ) and 'PPPSupport' in self.parent.Plugins.get_loaded(): service.disconnect(port, reply_handler=ok, error_handler=err) self.parent.Plugins.run("on_rfcomm_disconnect", port) logging.info("Disconnecting rfcomm device") else: if not self.parent.Plugins.run_ex("service_disconnect_handler", cb, service, ok, err) \ and isinstance(service, NetworkService): service.disconnect(reply_handler=ok, error_handler=err)
def connect_service(self, object_path, uuid, ok, err): try: self.parent.Plugins.RecentConns except KeyError: logging.warning("RecentConns plugin is unavailable") else: self.parent.Plugins.RecentConns.notify(object_path, uuid) if uuid == '00000000-0000-0000-0000-000000000000': device = Device(object_path) device.connect(reply_handler=ok, error_handler=err) else: service = get_service(Device(object_path), uuid) if service.group == 'serial': def reply(rfcomm): self.parent.Plugins.run("on_rfcomm_connected", service, rfcomm) ok(rfcomm) rets = self.parent.Plugins.run("rfcomm_connect_handler", service, reply, err) if True in rets: pass else: logging.info("No handler registered") err(dbus.DBusException( "Service not supported\nPossibly the plugin that handles this service is not loaded")) else: def cb(_inst, ret): if ret: raise StopException if not self.parent.Plugins.run_ex("service_connect_handler", cb, service, ok, err): service.connect(reply_handler=ok, error_handler=err)
def _disconnect_service(self, object_path, uuid, port, ok, err): if uuid == '00000000-0000-0000-0000-000000000000': device = Device(object_path) device.disconnect(reply_handler=ok, error_handler=err) else: def cb(_inst, ret): if ret: raise StopException service = get_service(Device(object_path), uuid) if service.group == 'serial' and 'NMDUNSupport' in self.parent.Plugins.get_loaded( ): self.parent.Plugins.run_ex("service_disconnect_handler", cb, service, ok, err) elif service.group == 'serial' and 'PPPSupport' in self.parent.Plugins.get_loaded( ): service.disconnect(port, reply_handler=ok, error_handler=err) self.parent.Plugins.run("on_rfcomm_disconnect", port) logging.info("Disconnecting rfcomm device") else: if not self.parent.Plugins.run_ex("service_disconnect_handler", cb, service, ok, err): service.disconnect(reply_handler=ok, error_handler=err)
def connect_service(self, object_path: str, uuid: str, ok: Callable[[], None], err: Callable[[Union[BluezDBusException, NMConnectionError, RFCOMMError, GLib.Error, str]], None]) -> None: try: self.parent.Plugins.RecentConns except KeyError: logging.warning("RecentConns plugin is unavailable") else: self.parent.Plugins.RecentConns.notify(object_path, uuid) if uuid == '00000000-0000-0000-0000-000000000000': device = Device(obj_path=object_path) device.connect(reply_handler=ok, error_handler=err) else: service = get_service(Device(obj_path=object_path), uuid) assert service is not None if any(plugin.service_connect_handler(service, ok, err) for plugin in self.parent.Plugins.get_loaded_plugins(ServiceConnectHandler)): pass elif isinstance(service, SerialService): def reply(rfcomm: str) -> None: assert isinstance(service, SerialService) # https://github.com/python/mypy/issues/2608 for plugin in self.parent.Plugins.get_loaded_plugins(RFCOMMConnectedListener): plugin.on_rfcomm_connected(service, rfcomm) ok() if not any(plugin.rfcomm_connect_handler(service, reply, err) for plugin in self.parent.Plugins.get_loaded_plugins(RFCOMMConnectHandler)): service.connect(reply_handler=lambda port: ok(), error_handler=err) elif isinstance(service, NetworkService): service.connect(reply_handler=lambda interface: ok(), error_handler=err) else: logging.info("No handler registered") err("Service not supported\nPossibly the plugin that handles this service is not loaded")
def list_devices(self): if self.__class__.get_interface_version()[0] < 5: devices = self.get_interface().ListDevices() return [Device(device) for device in devices] else: objects = self.manager_interface.GetManagedObjects() devices = [] for path, interfaces in objects.items(): if 'org.bluez.Device1' in interfaces: devices.append(path) return [Device(device) for device in devices]
def connect_service( self, object_path: str, uuid: str, ok: Callable[[], None], err: Callable[[ Union[BluezDBusException, NMConnectionError, RFCOMMError, GLib.Error, str] ], None] ) -> None: try: self.parent.Plugins.RecentConns except KeyError: logging.warning("RecentConns plugin is unavailable") else: self.parent.Plugins.RecentConns.notify(object_path, uuid) if uuid == '00000000-0000-0000-0000-000000000000': device = Device(obj_path=object_path) device.connect(reply_handler=ok, error_handler=err) else: def cb(_inst, ret): if ret: raise StopException service = get_service(Device(obj_path=object_path), uuid) assert service is not None if isinstance( service, SerialService ) and 'NMDUNSupport' in self.parent.Plugins.get_loaded(): self.parent.Plugins.run_ex("service_connect_handler", cb, service, ok, err) elif isinstance( service, SerialService ) and 'PPPSupport' in self.parent.Plugins.get_loaded(): def reply(rfcomm): self.parent.Plugins.run("on_rfcomm_connected", service, rfcomm) ok() rets = self.parent.Plugins.run("rfcomm_connect_handler", service, reply, err) if True in rets: pass else: logging.info("No handler registered") err("Service not supported\nPossibly the plugin that handles this service is not loaded" ) else: if not self.parent.Plugins.run_ex("service_connect_handler", cb, service, ok, err) \ and isinstance(service, (SerialService, NetworkService)): service.connect(reply_handler=lambda *args: ok(), error_handler=err)
def __on_manager_signal(self, manager, path, signal_name): if signal_name == 'adapter-removed': self.emit("adapter-removed", path) if path == self.__adapter_path: self.clear() self.Adapter = None self.set_adapter() if signal_name == 'adapter-added': if self.Adapter is None: self.set_adapter(path) self.emit("adapter-added", path) if signal_name == 'device-created': tree_iter = self.find_device_by_path(path) if tree_iter is None: dev = Device(obj_path=path) self.device_add_event(dev) if signal_name == 'device-removed': tree_iter = self.find_device_by_path(path) if tree_iter: row = self.get(tree_iter, "device") dev = row["device"] self.device_remove_event(dev)
def on_device_property_changed(self, path: str, key: str, value: Any) -> None: if key == "ServicesResolved" and value: device = Device(obj_path=path) if self.applicable(device): text = "%d%%" % BluezBattery(obj_path=path)["Percentage"] Notification(device["Alias"], text, icon_name="battery").show()
def notify(self, object_path, uuid): device = Device(obj_path=object_path) logging.info(f"{device} {uuid}") item = {} try: adapter = self.parent.Manager.get_adapter(device['Adapter']) except DBusNoSuchAdapterError: logging.warning("adapter not found") return item["adapter"] = adapter["Address"] item["address"] = device['Address'] item["alias"] = device['Alias'] item["icon"] = device['Icon'] item["name"] = ServiceUUID(uuid).name item["uuid"] = uuid item["time"] = time.time() item["device"] = object_path item["mitem"] = None # menu item object for i in self.items: if i["adapter"] == item["adapter"] and \ i["address"] == item["address"] and \ i["uuid"] == item["uuid"]: i["time"] = item["time"] i["device"] = item["device"] self.initialize() return self.items.append(item) self.initialize() self.store_state()
def list_devices(self): objects = self.manager_interface.GetManagedObjects() devices = [] for path, interfaces in objects.items(): if 'org.bluez.Device1' in interfaces: devices.append(path) return [Device(device) for device in devices]
def notify(self, object_path: str, uuid: str) -> None: device = Device(obj_path=object_path) logging.info(f"{device} {uuid}") try: adapter = self.parent.Manager.get_adapter(device['Adapter']) except DBusNoSuchAdapterError: logging.warning("adapter not found") return item: "Item" = { "adapter": adapter["Address"], "address": device['Address'], "alias": device['Alias'], "icon": device['Icon'], "name": ServiceUUID(uuid).name, "uuid": uuid, "time": time.time(), "device": object_path, "mitem": None } for i in self.items: if i["adapter"] == item["adapter"] and \ i["address"] == item["address"] and \ i["uuid"] == item["uuid"]: i["time"] = item["time"] i["device"] = item["device"] self.initialize() return self.items.append(item) self.initialize() self._store_state()
def notify(self, object_path, uuid): device = Device(object_path) logging.info("%s %s" % (device, uuid)) item = {} try: adapter = Adapter(device['Adapter']) except: logging.warning("adapter not found") return item["adapter"] = adapter["Address"] item["address"] = device['Address'] item["alias"] = device['Alias'] item["icon"] = device['Icon'] item["name"] = ServiceUUID(uuid).name item["uuid"] = uuid item["time"] = time.time() item["device"] = object_path item["mitem"] = None #menu item object for i in self.items: if i["adapter"] == item["adapter"] and \ i["address"] == item["address"] and \ i["uuid"] == item["uuid"]: i["time"] = item["time"] i["device"] = item["device"] self.initialize() return self.items.append(item) self.initialize() self.store_state()
def notify(self, object_path: str, uuid: str) -> None: device = Device(obj_path=object_path) logging.info(f"{device} {uuid}") try: adapter = self.parent.Manager.get_adapter(device['Adapter']) except DBusNoSuchAdapterError: logging.warning("adapter not found") return item = { "adapter": adapter["Address"], "address": device['Address'], "alias": device['Alias'], "icon": device['Icon'], "name": ServiceUUID(uuid).name, "uuid": uuid, "time": str(time.time()), } stored_items = self.get_option("recent-connections") for i in stored_items: if i["adapter"] == item["adapter"] and \ i["address"] == item["address"] and \ i["uuid"] == item["uuid"]: i["time"] = item["time"] i["device"] = object_path break else: stored_items.append(item) self.set_option("recent-connections", stored_items) self._rebuild()
def create_paired_device(self, address, agent_path, capability, error_handler=None, reply_handler=None, timeout=120): # BlueZ 4 only! def reply_handler_wrapper(obj_path): if not callable(reply_handler): return reply_handler(Device(obj_path)) def error_handler_wrapper(exception): exception = parse_dbus_error(exception) if not callable(error_handler): raise exception error_handler(exception) if reply_handler is None and error_handler is None: obj_path = self.get_interface().CreatePairedDevice( address, agent_path, capability) return Device(obj_path) else: self.get_interface().CreatePairedDevice( address, agent_path, capability, reply_handler=reply_handler_wrapper, error_handler=error_handler_wrapper, timeout=timeout)
def _on_display_pin_code(self, device: str, pin_code: str) -> None: logging.info(f'DisplayPinCode ({device}, {pin_code})') dev = Device(obj_path=device) self._devhandlerids[device] = dev.connect_signal("property-changed", self._on_device_property_changed) notify_message = _("Pairing PIN code for") + f" {self.get_device_string(device)}: {pin_code}" self._notification = Notification("Bluetooth", notify_message, 0, icon_name="blueman") self._notification.show()
def _on_display_pin_code(self, device, pin_code): logging.info('DisplayPinCode (%s, %s)' % (device, pin_code)) dev = Device(obj_path=device) self._devhandlerids[device] = dev.connect_signal("property-changed", self._on_device_property_changed) notify_message = _("Pairing PIN code for") + " %s: %s" % (self.get_device_string(device), pin_code) self.n = Notification("Bluetooth", notify_message, 0, icon_name="blueman") self.n.show()
def list_devices(self): objects = self._call('GetManagedObjects', interface=self.manager_interface) devices = [] for path, interfaces in objects.items(): if 'org.bluez.Device1' in interfaces: if path.startswith(self.get_object_path()): devices.append(path) return [Device(device) for device in devices]
def on_device_property_changed(self, path: str, key: str, value: Any) -> None: if key == "Connected": device = Device(obj_path=path) if value and "Battery" in self.parent.Plugins.get_loaded() and Battery.applicable(device): return Notification(device["Alias"], _("Connected") if value else _("Disconnected"), icon_name=device["Icon"]).show()
def on_device_property_changed(self, path, key, value): if key == "Connected": klass = Device(path)["Class"] & 0x1fff if klass == 0x504 or klass == 0x508: if value: self.xdg_screensaver("suspend") else: self.xdg_screensaver("resume")
def DisconnectDevice(self, obj_path, ok, err): dev = Device(BluezDevice(obj_path)) self.Applet.Plugins.Run("on_device_disconnect", dev) def on_timeout(): dev.Device.disconnect(reply_handler=ok, error_handler=err) GLib.timeout_add(1000, on_timeout)
def on_auth_action(action: str) -> None: logging.info(action) if action == "always": Device(obj_path=device).set("Trusted", True) if action == "always" or action == "accept": ok() else: err(BluezErrorRejected("Rejected"))
def on_device_property_changed(self, path: str, key: str, value: Any) -> None: if key == "Connected": klass = Device(obj_path=path)["Class"] & 0x1fff if klass == 0x504 or klass == 0x508: if value: self.xdg_screensaver("suspend") else: self.xdg_screensaver("resume")
def on_auth_action(action): logging.info(action) if action == "always": device = Device(obj_path=n._device) device.set("Trusted", True) if action == "always" or action == "accept": ok() else: err(BluezErrorRejected("Rejected"))
def list_devices(self): paths = [] for obj_proxy in self._object_manager.get_objects(): proxy = obj_proxy.get_interface('org.bluez.Device1') if proxy: object_path = proxy.get_object_path() if object_path.startswith(self.get_object_path()): paths.append(object_path) return [Device(path) for path in paths]
def _on_display_passkey(self, device: str, passkey: int, entered: int) -> None: logging.info(f"DisplayPasskey ({device}, {passkey:d} {entered:d})") dev = Device(obj_path=device) self._devhandlerids[device] = dev.connect_signal("property-changed", self._on_device_property_changed) key = f"{passkey:06}" notify_message = _("Pairing passkey for") + f" {self.get_device_string(device)}: " \ f"{key[:entered]}<b>{key[entered]}</b>{key[entered+1:]}" self._close() self._notification = Notification("Bluetooth", notify_message, 0, icon_name="blueman") self._notification.show()
def get_devices(self, adapter_path: str = "/") -> List[Device]: paths = [] for obj_proxy in self._object_manager.get_objects(): proxy = obj_proxy.get_interface('org.bluez.Device1') if proxy: object_path = proxy.get_object_path() if object_path.startswith(adapter_path): paths.append(object_path) return [Device(obj_path=path) for path in paths]
def disconnect_service(self, object_path, uuid, port, ok, err): if uuid == '00000000-0000-0000-0000-000000000000': device = Device(object_path) device.disconnect(reply_handler=ok, error_handler=err) else: service = get_service(Device(object_path), uuid) if service.group == 'serial': service.disconnect(port) self.Applet.Plugins.Run("on_rfcomm_disconnect", port) logging.info("Disonnecting rfcomm device") else: def cb(_inst, ret): if ret: raise StopException if not self.Applet.Plugins.RunEx("service_disconnect_handler", cb, service, ok, err): service.disconnect(reply_handler=ok, error_handler=err)
def _on_display_passkey(self, device, passkey, _entered): logging.info(f"DisplayPasskey ({device}, {passkey:d})") dev = Device(obj_path=device) self._devhandlerids[device] = dev.connect_signal( "property-changed", self._on_device_property_changed) notify_message = _("Pairing passkey for" ) + f" {self.get_device_string(device)}: {passkey}" self.n = Notification("Bluetooth", notify_message, 0, icon_name="blueman") self.n.show()
def _on_display_passkey(self, device, passkey, _entered): logging.info('DisplayPasskey (%s, %d)' % (device, passkey)) dev = Device(device) dev.connect_signal("property-changed", self._on_device_property_changed) notify_message = _("Pairing passkey for") + " %s: %s" % ( self.get_device_string(device), passkey) self.n = Notification("Bluetooth", notify_message, 0, icon_name="blueman") self.n.show()