def on_load(self, applet): self._config = Config("org.blueman.transfer") if not self._config["shared-path"]: d = GLib.get_user_special_dir(GLib.UserDirectory.DIRECTORY_DOWNLOAD) if not d: self._config["shared-path"] = os.path.expanduser("~") else: self._config["shared-path"] = d if not os.path.isdir(self._config["shared-path"]): logging.info("Configured share directory %s does not exist" % self._config["shared-path"]) text = _("Configured directory for incoming files does not exist") secondary_text = _("Please make sure that directory \"<b>%s</b>\" exists or configure it with blueman-services") dlg = ErrorDialog(text, secondary_text % self._config["shared-path"]) dlg.run() dlg.destroy() self._manager = obex.Manager() self._manager.connect("transfer-started", self._on_transfer_started) self._manager.connect("transfer-completed", self._on_transfer_completed) self._manager.connect('session-removed', self._on_session_removed) self._watch = obex.Manager.watch_name_owner(self._on_dbus_name_appeared, self._on_dbus_name_vanished)
def on_apply(self): if self.on_query_apply_state(): logging.info("network apply") m = Mechanism() nap_enable = self.Builder.get_object("nap-enable") if nap_enable.props.active: if self.Builder.get_object("r_dhcpd").props.active: stype = "DhcpdHandler" elif self.Builder.get_object("r_dnsmasq").props.active: stype = "DnsMasqHandler" elif self.Builder.get_object("r_udhcpd").props.active: stype = "UdhcpdHandler" net_ip = self.Builder.get_object("net_ip") try: m.EnableNetwork('(ayays)', inet_aton(net_ip.props.text), inet_aton("255.255.255.0"), stype) if not self.Config["nap-enable"]: self.Config["nap-enable"] = True except Exception as e: d = ErrorDialog("<b>Failed to apply network settings</b>", excp=e, parent=self.widget.get_toplevel()) d.run() d.destroy() return else: self.Config["nap-enable"] = False m.DisableNetwork() self.clear_options()
def on_session_failed(self, _client, msg): d = ErrorDialog(_("Error occurred"), msg.reason.split(None, 1)[1], icon_name="blueman", parent=self.get_toplevel()) d.run() d.destroy() self.emit("result", False)
def on_session_failed(self, _client, msg): d = ErrorDialog(_("Error occurred"), msg.reason.split(None, 1)[1], icon_name="blueman") d.run() d.destroy() exit(1)
def err(_obj, result, _user_data): d = ErrorDialog("<b>Failed to apply network settings</b>", "You might not be able to connect to the Bluetooth network via this machine", result, margin_left=9) d.run() d.destroy()
def on_session_failed(self, _client: Client, msg: BluezDBusException) -> None: parent = self.get_toplevel() assert isinstance(parent, Gtk.Container) d = ErrorDialog(_("Error occurred"), msg.reason.split(None, 1)[1], icon_name="blueman", parent=parent) d.run() d.destroy() self.emit("result", False)
def on_transfer_error(self, _transfer: Optional[Transfer], msg: str = "") -> None: if not self.error_dialog: self.speed.reset() parent = self.get_toplevel() assert isinstance(parent, Gtk.Container) d = ErrorDialog(msg, _("Error occurred while sending file %s") % self.files[-1].get_basename(), modal=True, icon_name="blueman", parent=parent, buttons=Gtk.ButtonsType.NONE) if len(self.files) > 1: d.add_button(_("Skip"), Gtk.ResponseType.NO) d.add_button(_("Retry"), Gtk.ResponseType.YES) d.add_button(_("_Cancel"), Gtk.ResponseType.CANCEL) if self.object_push: self.client.remove_session(self.object_push.get_object_path()) def on_response(dialog: Gtk.Dialog, resp: int) -> None: dialog.destroy() self.error_dialog = None if resp == Gtk.ResponseType.CANCEL: self.on_cancel(None) elif resp == Gtk.ResponseType.NO: finfo = self.files[-1].query_info( 'standard::*', Gio.FileQueryInfoFlags.NONE) self.total_bytes -= finfo.get_size() self.total_transferred -= self.transferred self.transferred = 0 del self.files[-1] if not self.object_push: self.create_session() self.process_queue() elif resp == Gtk.ResponseType.YES: self.total_transferred -= self.transferred self.transferred = 0 if not self.object_push: self.create_session() self.process_queue() else: self.on_cancel(None) d.connect("response", on_response) d.show() self.error_dialog = d
def on_dbus_name_vanished(_connection, name): logging.info(name) self.Applet.disconnect_by_func(on_applet_signal) self.hide() d = ErrorDialog( _("Connection to BlueZ failed"), _("Bluez daemon is not running, blueman-manager cannot continue.\n" "This probably means that there were no Bluetooth adapters detected " "or Bluetooth daemon was not started."), icon_name="blueman") d.run() d.destroy() # FIXME ui can handle BlueZ start/stop but we should inform user Gtk.main_quit()
def on_apply(self) -> None: if self.on_query_apply_state(): logging.info("network apply") m = Mechanism() nap_enable = self._builder.get_widget("nap-enable", Gtk.CheckButton) if nap_enable.props.active: if self._builder.get_widget("r_dhcpd", Gtk.RadioButton).props.active: stype = "DhcpdHandler" elif self._builder.get_widget("r_dnsmasq", Gtk.RadioButton).props.active: stype = "DnsMasqHandler" elif self._builder.get_widget("r_udhcpd", Gtk.RadioButton).props.active: stype = "UdhcpdHandler" net_ip = self._builder.get_widget("net_ip", Gtk.Entry) try: m.EnableNetwork('(sss)', net_ip.props.text, "255.255.255.0", stype) if not self.Config["nap-enable"]: self.Config["nap-enable"] = True except Exception as e: parent = self.widget.get_toplevel() assert isinstance(parent, Gtk.Container) d = ErrorDialog("<b>Failed to apply network settings</b>", excp=e, parent=parent) d.run() d.destroy() return else: self.Config["nap-enable"] = False m.DisableNetwork() self.clear_options()
def on_dbus_name_vanished(_connection, name): logging.info(name) if self._applet_sig is not None: self.Applet.disconnect(self._applet_sig) self._applet_sig = None self.hide() d = ErrorDialog( _("Connection to BlueZ failed"), _("Bluez daemon is not running, blueman-manager cannot continue.\n" "This probably means that there were no Bluetooth adapters detected " "or Bluetooth daemon was not started."), icon_name="blueman") d.run() d.destroy() try: exit(1) except: Gtk.main_quit()
def on_dbus_name_vanished(_connection: Gio.DBusConnection, name: str) -> None: logging.info(name) if self._applethandlerid: self.Applet.disconnect(self._applethandlerid) self._applethandlerid = None self.hide() d = ErrorDialog( _("Connection to BlueZ failed"), _("Bluez daemon is not running, blueman-manager cannot continue.\n" "This probably means that there were no Bluetooth adapters detected " "or Bluetooth daemon was not started."), icon_name="blueman") d.run() d.destroy() # FIXME ui can handle BlueZ start/stop but we should inform user self.quit()
def on_transfer_error(self, _transfer, msg=""): if not self.error_dialog: self.speed.reset() d = ErrorDialog(msg, _("Error occurred while sending file %s") % os.path.basename(self.files[-1]), modal=True, icon_name="blueman") if len(self.files) > 1: d.add_button(_("Skip"), Gtk.ResponseType.NO) d.add_button(_("Retry"), Gtk.ResponseType.YES) d.add_button("_Cancel", Gtk.ResponseType.CANCEL) def on_response(dialog, resp): dialog.destroy() self.error_dialog = None if resp == "_Cancel": self.on_cancel(None) elif resp == Gtk.ResponseType.NO: self.total_bytes -= os.path.getsize(self.files[-1]) self.total_transferred -= self.transferred self.transferred = 0 del self.files[-1] if not self.object_push: self.create_session() self.process_queue() elif resp == Gtk.ResponseType.YES: self.total_transferred -= self.transferred self.transferred = 0 if not self.object_push: self.create_session() self.process_queue() else: self.on_cancel(None) d.connect("response", on_response) d.show() self.error_dialog = d
def load_plugin(self, name: Optional[str] = None, user_action: bool = False) -> None: if name: try: self.__load_plugin(self.__classes[name]) except LoadException: pass except Exception: if user_action: d = ErrorDialog(_( "<b>An error has occured while loading " "a plugin. Please notify the developers " "with the content of this message to our </b>\n" "<a href=\"http://github.com/blueman-project/blueman/issues\">website.</a>" ), excp=traceback.format_exc()) d.run() d.destroy() raise return path = os.path.dirname(self.module_path.__file__) plugins = [] for root, dirs, files in os.walk(path): for f in files: if f.endswith(".py") and not (f.endswith(".pyc") or f.endswith("_.py")): plugins.append(f[0:-3]) logging.info(plugins) for plugin in plugins: try: importlib.import_module(self.module_path.__name__ + f".{plugin}") except ImportError: logging.error(f"Unable to load plugin module {plugin}", exc_info=True) for cls in self.plugin_class.__subclasses__(): self.__classes[cls.__name__] = cls if cls.__name__ not in self.__deps: self.__deps[cls.__name__] = [] if cls.__name__ not in self.__cfls: self.__cfls[cls.__name__] = [] for c in cls.__depends__: if c not in self.__deps: self.__deps[c] = [] self.__deps[c].append(cls.__name__) for c in cls.__conflicts__: if c not in self.__cfls: self.__cfls[c] = [] self.__cfls[c].append(cls.__name__) if c not in self.__cfls[cls.__name__]: self.__cfls[cls.__name__].append(c) cl = self.config_list for name, cls in self.__classes.items(): for dep in self.__deps[name]: # plugins that are required by not unloadable plugins are not unloadable too if not self.__classes[dep].__unloadable__: cls.__unloadable__ = False if (cls.__autoload__ or (cl and cls.__name__ in cl)) and \ not (cls.__unloadable__ and cl and "!" + cls.__name__ in cl): self.__load_plugin(cls)
def __init__(self, device, adapter_path, files): super().__init__( title=_("Bluetooth File Transfer"), name="BluemanSendTo", icon_name="blueman", border_width=5, default_width=400, window_position=Gtk.WindowPosition.CENTER, type_hint=Gdk.WindowTypeHint.DIALOG ) self.b_cancel = self.add_button("_Stop", Gtk.ResponseType.CLOSE) self.b_cancel.props.receives_default = True self.b_cancel.props.use_underline = True self.b_cancel.connect("clicked", self.on_cancel) self.Builder = Gtk.Builder(translation_domain="blueman") bind_textdomain_codeset("blueman", "UTF-8") self.Builder.add_from_file(UI_PATH + "/send-dialog.ui") grid = self.Builder.get_object("sendto") content_area = self.get_content_area() content_area.add(grid) self.l_dest = self.Builder.get_object("l_dest") self.l_file = self.Builder.get_object("l_file") self.pb = self.Builder.get_object("pb") self.pb.props.text = _("Connecting") self.device = device self.adapter = Adapter(adapter_path) self.manager = Manager() self.files: List[Gio.File] = [] self.num_files = 0 self.object_push = None self.transfer = None self.total_bytes = 0 self.total_transferred = 0 self._last_bytes = 0 self._last_update = 0.0 self.error_dialog = None self.cancelling = False # bytes transferred on a current transfer self.transferred = 0 self.speed = SpeedCalc(6) for file_name in files: parsed_file = Gio.File.parse_name(file_name) if not parsed_file.query_exists(): logging.info("Skipping non existing file %s" % parsed_file.get_path()) continue file_info = parsed_file.query_info("standard::*", Gio.FileQueryInfoFlags.NONE) if file_info.get_file_type() == Gio.FileType.DIRECTORY: logging.info("Skipping directory %s" % parsed_file.get_path()) continue self.files.append(parsed_file) self.num_files += 1 self.total_bytes += file_info.get_size() if len(self.files) == 0: self.emit("result", False) try: self.client = Client() self.manager.connect_signal('session-added', self.on_session_added) self.manager.connect_signal('session-removed', self.on_session_removed) except GLib.Error as e: if 'StartServiceByName' in e.message: logging.debug(e.message) d = ErrorDialog(_("obexd not available"), _("Failed to autostart obex service. Make sure the obex " "daemon is running"), parent=self.get_toplevel()) d.run() d.destroy() self.emit("result", False) else: # Fail on anything else raise self.l_file.props.label = self.files[-1].get_basename() self.client.connect('session-failed', self.on_session_failed) logging.info("Sending to %s" % device['Address']) self.l_dest.props.label = device['Alias'] # Stop discovery if discovering and let adapter settle for a second if self.adapter["Discovering"]: self.adapter.stop_discovery() time.sleep(1) self.create_session() self.show()
def __init__(self, device, adapter_path, files): super(Sender, self).__init__(title=_("Bluetooth File Transfer")) self.set_name("BluemanSendTo") self.set_position(Gtk.WindowPosition.CENTER) self.set_type_hint(Gdk.WindowTypeHint.DIALOG) self.props.border_width = 5 self.props.icon_name = "blueman" self.props.width_request = 400 self.b_cancel = self.add_button("_Stop", Gtk.ResponseType.CLOSE) self.b_cancel.props.receives_default = True self.b_cancel.props.use_underline = True self.b_cancel.connect("clicked", self.on_cancel) self.Builder = Gtk.Builder() self.Builder.set_translation_domain("blueman") bind_textdomain_codeset("blueman", "UTF-8") self.Builder.add_from_file(UI_PATH + "/send-dialog.ui") grid = self.Builder.get_object("sendto") content_area = self.get_content_area() content_area.add(grid) self.l_dest = self.Builder.get_object("l_dest") self.l_file = self.Builder.get_object("l_file") self.pb = self.Builder.get_object("pb") self.pb.props.text = _("Connecting") self.device = device self.adapter = Adapter(adapter_path) self.files = files self.object_push = None self.transfer = None self.total_bytes = 0 self.total_transferred = 0 self._last_bytes = 0 self._last_update = 0 self.error_dialog = None self.cancelling = False # bytes transferred on a current transfer self.transferred = 0 self.speed = SpeedCalc(6) for i in range(len(self.files) - 1, -1, -1): f = self.files[i] match = re.match("file://(.*)", f) if match: f = self.files[i] = urllib.parse.unquote(match.groups(1)[0]) if os.path.exists(f) and not os.path.isdir(f): f = os.path.abspath(f) self.total_bytes += os.path.getsize(f) else: self.files.remove(f) self.num_files = len(self.files) try: self.client = obex.Client() except GLib.Error as e: if 'StartServiceByName' in e.message: logging.debug(e.message) d = ErrorDialog( _("obexd not available"), _("Failed to autostart obex service. Make sure the obex " "daemon is running")) d.run() d.destroy() exit(1) else: # Fail on anything else raise if self.num_files == 0: exit(1) self.l_file.props.label = os.path.basename(self.files[-1]) self.client.connect('session-created', self.on_session_created) self.client.connect('session-failed', self.on_session_failed) self.client.connect('session-removed', self.on_session_removed) logging.info("Sending to %s" % device['Address']) self.l_dest.props.label = device['Alias'] # Stop discovery if discovering and let adapter settle for a second if self.adapter["Discovering"]: self.adapter.stop_discovery() time.sleep(1) self.create_session() self.show()