From da2616074cf83d7f1c4d9139ba95e54734e88c6c Mon Sep 17 00:00:00 2001 From: Neui Date: Fri, 14 May 2021 23:27:38 +0200 Subject: [PATCH] Migrate hamster plugin to use Gio dbus --- GTG/plugins/hamster/hamster.py | 27 ++++++++++++++++++--------- GTG/plugins/hamster/helper.py | 17 ++++++++++------- 2 files changed, 28 insertions(+), 16 deletions(-) diff --git a/GTG/plugins/hamster/hamster.py b/GTG/plugins/hamster/hamster.py index 716dce0d83..5f67ec32fe 100644 --- a/GTG/plugins/hamster/hamster.py +++ b/GTG/plugins/hamster/hamster.py @@ -22,8 +22,7 @@ from calendar import timegm from gettext import gettext as _ -import dbus -from gi.repository import Gtk +from gi.repository import GLib, Gtk, Gio from GTG.core.task import Task from GTG.plugins.hamster.helper import FactBuilder @@ -72,7 +71,7 @@ def send_task(self, task): return fact = FactBuilder(self.hamster, self.preferences).build(task) start_time = timegm(datetime.datetime.now().timetuple()) - hamster_id = self.hamster.AddFact(fact, start_time, 0, False) + hamster_id = self.hamster.AddFact('(siib)', fact, start_time, 0, False) ids = self.get_hamster_ids(task) ids.append(str(hamster_id)) @@ -87,13 +86,21 @@ def get_records(self, task): valid_ids = [] for i in ids: try: - fact = self.hamster.GetFact(i) + fact = self.hamster.GetFact('(i)', int(i)) if fact and i not in valid_ids: records.append(fact) valid_ids.append(i) continue - except dbus.DBusException: - pass + except GLib.Error as e: + dbus_error_domain = GLib.quark_to_string(Gio.DBusError.quark()) + if e.matches(Gio.io_error_quark(), Gio.IOErrorEnum.DBUS_ERROR) \ + or e.domain == dbus_error_domain: + # Imitating the previous code that just caught DBus errors + # Not sure what is was catching for. Trying to give an + # invalid ID results in using that Gio DBUS_ERROR error + pass + else: + raise e modified = True if modified: self.set_hamster_ids(task, valid_ids) @@ -122,7 +129,7 @@ def stop_task(self, task_id): # Hamster deletes an activity if it's finish time is set earlier # than current time. Hence, we are setting finish time # some buffer secs from now - self.hamster.StopTracking(now + self.BUFFER_TIME) + self.hamster.StopTracking('(i)', now + self.BUFFER_TIME) self.tracked_task_id = None # Datastore ### @@ -152,8 +159,10 @@ def on_task_modified(self, task_id, path): # Plugin api methods ### def activate(self, plugin_api): self.plugin_api = plugin_api - self.hamster = dbus.SessionBus().get_object('org.gnome.Hamster', - '/org/gnome/Hamster') + dbus = Gio.bus_get_sync(Gio.BusType.SESSION, None) + self.hamster = Gio.DBusProxy.new_sync( + dbus, Gio.DBusProxyFlags.NONE, None, 'org.gnome.Hamster', + '/org/gnome/Hamster', 'org.gnome.Hamster', None) # add button if plugin_api.is_browser(): diff --git a/GTG/plugins/hamster/helper.py b/GTG/plugins/hamster/helper.py index 1df300f181..917107be79 100644 --- a/GTG/plugins/hamster/helper.py +++ b/GTG/plugins/hamster/helper.py @@ -1,6 +1,6 @@ import re -import dbus +from gi.repository import GLib, Gio class FactBuilder(): @@ -25,7 +25,7 @@ def _build_activity_title(self, task): if self.preferences['activity'] == 'tag': hamster_activities = { str(x[0]).lower() - for x in self.hamster.GetActivities('') + for x in self.hamster.GetActivities('(s)', '') } activity_candidates = hamster_activities.intersection(gtg_tags) if len(activity_candidates) >= 1: @@ -45,7 +45,7 @@ def _build_category(self, task): if self.preferences['category'] == 'auto_tag': hamster_activities = { str(activity[0]): activity[1] - for activity in self.hamster.GetActivities('') + for activity in self.hamster.GetActivities('(s)', '') } if gtg_title in hamster_activities or \ gtg_title.replace(",", "") in hamster_activities: @@ -78,13 +78,16 @@ def _build_tags(self, task): tag_candidates = [] try: if self.preferences['tags'] == 'existing': - hamster_tags = {str(x[1]) for x in self.hamster.GetTags(False)} + hamster_tags = {str(x[1]) for x in self.hamster.GetTags('(b)', False)} tag_candidates = list(hamster_tags.intersection(set(gtg_tags))) elif self.preferences['tags'] == 'all': tag_candidates = gtg_tags - except dbus.exceptions.DBusException: - # old hamster version, doesn't support tags - pass + except GLib.Error as e: + if e.matches(Gio.DBusError.quark(), + Gio.DBusError.UNKNOWN_METHOD): + pass # old hamster version, doesn't support tags + else: + raise e tag_str = "".join([" #" + x for x in tag_candidates]) return tag_str