summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarlos Garnacho <carlosg@gnome.org>2020-05-20 03:03:50 +0200
committerJean Felder <jean.felder@gmail.com>2020-08-21 15:05:10 +0000
commitaf9c1afc4ed71ca2474e0aa02e1593457df73b33 (patch)
treefc95fd3dfb8abb89525785088e4c6db7cfa38111
parentfbf7e700f8275c241c13bb67dc39df5c95c12079 (diff)
downloadgrilo-plugins-af9c1afc4ed71ca2474e0aa02e1593457df73b33.tar.gz
tracker3: Make sources manage notifications
Instead of being a singleton, the GrlSource sets up its own notification.
-rw-r--r--src/tracker3/grl-tracker-source-api.c5
-rw-r--r--src/tracker3/grl-tracker-source-notif.c50
-rw-r--r--src/tracker3/grl-tracker-source-notif.h7
-rw-r--r--src/tracker3/grl-tracker-source-priv.h2
-rw-r--r--src/tracker3/grl-tracker-source.c20
-rw-r--r--src/tracker3/grl-tracker.c5
6 files changed, 52 insertions, 37 deletions
diff --git a/src/tracker3/grl-tracker-source-api.c b/src/tracker3/grl-tracker-source-api.c
index e627c23..59dc1cf 100644
--- a/src/tracker3/grl-tracker-source-api.c
+++ b/src/tracker3/grl-tracker-source-api.c
@@ -1217,7 +1217,8 @@ grl_tracker_source_change_start (GrlSource *source, GError **error)
{
GrlTrackerSourcePriv *priv = GRL_TRACKER_SOURCE_GET_PRIVATE (source);
- priv->notify_changes = TRUE;
+ priv->notifier =
+ grl_tracker_source_notify_new (source, priv->tracker_connection);
return TRUE;
}
@@ -1227,7 +1228,7 @@ grl_tracker_source_change_stop (GrlSource *source, GError **error)
{
GrlTrackerSourcePriv *priv = GRL_TRACKER_SOURCE_GET_PRIVATE (source);
- priv->notify_changes = FALSE;
+ g_clear_object (&priv->notifier);
return TRUE;
}
diff --git a/src/tracker3/grl-tracker-source-notif.c b/src/tracker3/grl-tracker-source-notif.c
index fa415be..c3d7e96 100644
--- a/src/tracker3/grl-tracker-source-notif.c
+++ b/src/tracker3/grl-tracker-source-notif.c
@@ -36,19 +36,18 @@
#define GRL_LOG_DOMAIN_DEFAULT tracker_notif_log_domain
GRL_LOG_DOMAIN_STATIC(tracker_notif_log_domain);
-#define GRL_TRACKER_TYPE_SOURCE_NOTIFY grl_tracker_source_notify_get_type ()
-G_DECLARE_FINAL_TYPE (GrlTrackerSourceNotify, grl_tracker_source_notify, GRL_TRACKER, SOURCE_NOTIFY, GObject)
-
struct _GrlTrackerSourceNotify {
GObject parent;
TrackerSparqlConnection *connection;
TrackerNotifier *notifier;
+ GrlSource *source;
guint events_signal_id;
};
enum {
PROP_0,
PROP_CONNECTION,
+ PROP_SOURCE,
N_PROPS
};
@@ -56,8 +55,6 @@ static GParamSpec *props[N_PROPS] = { 0, };
G_DEFINE_TYPE (GrlTrackerSourceNotify, grl_tracker_source_notify, G_TYPE_OBJECT)
-static GrlTrackerSourceNotify *singleton = NULL;
-
static GrlMedia *
media_for_event (GrlTrackerSourceNotify *self,
TrackerNotifierEvent *event)
@@ -83,17 +80,11 @@ handle_changes (GrlTrackerSourceNotify *self,
TrackerNotifierEventType tracker_type,
GrlSourceChangeType change_type)
{
- GrlTrackerSource *source = NULL;
TrackerNotifierEvent *event;
GPtrArray *change_list;
GrlMedia *media;
gint i;
- source = grl_tracker_source_find ("");
-
- if (!source || !grl_tracker_source_can_notify (source))
- return;
-
change_list = g_ptr_array_new ();
for (i = 0; i < events->len; i++) {
@@ -105,7 +96,7 @@ handle_changes (GrlTrackerSourceNotify *self,
g_ptr_array_add (change_list, media);
}
- grl_source_notify_change_list (GRL_SOURCE (source), change_list,
+ grl_source_notify_change_list (self->source, change_list,
change_type, FALSE);
}
@@ -139,6 +130,9 @@ grl_tracker_source_notify_get_property (GObject *object,
case PROP_CONNECTION:
g_value_set_object (value, self->connection);
break;
+ case PROP_SOURCE:
+ g_value_set_object (value, self->source);
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
@@ -157,6 +151,9 @@ grl_tracker_source_notify_set_property (GObject *object,
case PROP_CONNECTION:
self->connection = g_value_get_object (value);
break;
+ case PROP_SOURCE:
+ self->source = g_value_get_object (value);
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
@@ -207,6 +204,14 @@ grl_tracker_source_notify_class_init (GrlTrackerSourceNotifyClass *klass)
G_PARAM_READWRITE |
G_PARAM_CONSTRUCT_ONLY |
G_PARAM_STATIC_STRINGS);
+ props[PROP_SOURCE] =
+ g_param_spec_object ("source",
+ "Source",
+ "Source being notified",
+ GRL_TYPE_SOURCE,
+ G_PARAM_READWRITE |
+ G_PARAM_CONSTRUCT_ONLY |
+ G_PARAM_STATIC_STRINGS);
g_object_class_install_properties (object_class, N_PROPS, props);
}
@@ -216,19 +221,12 @@ grl_tracker_source_notify_init (GrlTrackerSourceNotify *self)
{
}
-void
-grl_tracker_notify_init (TrackerSparqlConnection *sparql_conn)
-{
- if (singleton != NULL)
- return;
-
- singleton = g_object_new (GRL_TRACKER_TYPE_SOURCE_NOTIFY,
- "connection", sparql_conn,
- NULL);
-}
-
-void
-grl_tracker_notify_shutdown (void)
+GrlTrackerSourceNotify *
+grl_tracker_source_notify_new (GrlSource *source,
+ TrackerSparqlConnection *sparql_conn)
{
- g_clear_object (&singleton);
+ return g_object_new (GRL_TRACKER_TYPE_SOURCE_NOTIFY,
+ "source", source,
+ "connection", sparql_conn,
+ NULL);
}
diff --git a/src/tracker3/grl-tracker-source-notif.h b/src/tracker3/grl-tracker-source-notif.h
index dd78722..6b6e567 100644
--- a/src/tracker3/grl-tracker-source-notif.h
+++ b/src/tracker3/grl-tracker-source-notif.h
@@ -31,6 +31,9 @@
/* ------- Definitions ------- */
+#define GRL_TRACKER_TYPE_SOURCE_NOTIFY grl_tracker_source_notify_get_type ()
+G_DECLARE_FINAL_TYPE (GrlTrackerSourceNotify, grl_tracker_source_notify, GRL_TRACKER, SOURCE_NOTIFY, GObject)
+
#define TRACKER_DATASOURCES_REQUEST \
"SELECT " \
"(SELECT GROUP_CONCAT(rdf:type(?source), \":\") " \
@@ -49,7 +52,7 @@
/**/
-void grl_tracker_notify_init (TrackerSparqlConnection *sparql_conn);
-void grl_tracker_notify_shutdown (void);
+GrlTrackerSourceNotify * grl_tracker_source_notify_new (GrlSource *source,
+ TrackerSparqlConnection *sparql_conn);
#endif /* _GRL_TRACKER_SOURCE_NOTIF_H_ */
diff --git a/src/tracker3/grl-tracker-source-priv.h b/src/tracker3/grl-tracker-source-priv.h
index 227e19d..7016b6e 100644
--- a/src/tracker3/grl-tracker-source-priv.h
+++ b/src/tracker3/grl-tracker-source-priv.h
@@ -29,6 +29,7 @@
#include "grl-tracker-source.h"
#include "grl-tracker-source-cache.h"
+#include "grl-tracker-source-notif.h"
#ifdef HAVE_CONFIG_H
#include "config.h"
@@ -65,6 +66,7 @@ struct _GrlTrackerSourcePriv {
TrackerSparqlConnection *tracker_connection;
GHashTable *operations;
+ GrlTrackerSourceNotify *notifier;
gchar *tracker_datasource;
gboolean notify_changes;
diff --git a/src/tracker3/grl-tracker-source.c b/src/tracker3/grl-tracker-source.c
index 78c3998..c0b245f 100644
--- a/src/tracker3/grl-tracker-source.c
+++ b/src/tracker3/grl-tracker-source.c
@@ -65,6 +65,8 @@ static void grl_tracker_source_set_property (GObject *object,
static void grl_tracker_source_finalize (GObject *object);
+static void grl_tracker_source_constructed (GObject *object);
+
/* ===================== Globals ================= */
/* shared data across */
@@ -97,6 +99,7 @@ grl_tracker_source_class_init (GrlTrackerSourceClass * klass)
g_class->finalize = grl_tracker_source_finalize;
g_class->set_property = grl_tracker_source_set_property;
+ g_class->constructed = grl_tracker_source_constructed;
source_class->cancel = grl_tracker_source_cancel;
source_class->supported_keys = grl_tracker_supported_keys;
@@ -148,12 +151,25 @@ grl_tracker_source_init (GrlTrackerSource *source)
}
static void
+grl_tracker_source_constructed (GObject *object)
+{
+ GrlTrackerSource *self;
+
+ self = GRL_TRACKER_SOURCE (object);
+
+ g_clear_object (&self->priv->tracker_connection);
+
+ G_OBJECT_CLASS (grl_tracker_source_parent_class)->constructed (object);
+}
+
+static void
grl_tracker_source_finalize (GObject *object)
{
GrlTrackerSource *self;
self = GRL_TRACKER_SOURCE (object);
+ g_clear_object (&self->priv->notifier);
g_clear_object (&self->priv->tracker_connection);
G_OBJECT_CLASS (grl_tracker_source_parent_class)->finalize (object);
@@ -251,7 +267,7 @@ grl_tracker_source_can_notify (GrlTrackerSource *source)
GrlTrackerSourcePriv *priv = GRL_TRACKER_SOURCE_GET_PRIVATE (source);
if (priv->state == GRL_TRACKER_SOURCE_STATE_RUNNING)
- return priv->notify_changes;
+ return priv->notifier != NULL;
return FALSE;
}
@@ -306,8 +322,6 @@ grl_tracker_source_sources_init (void)
if (grl_tracker_connection != NULL) {
GrlTrackerSource *source;
- grl_tracker_notify_init (grl_tracker_connection);
-
/* One source to rule them all. */
source = grl_tracker_source_new (grl_tracker_connection);
grl_tracker_add_source (source);
diff --git a/src/tracker3/grl-tracker.c b/src/tracker3/grl-tracker.c
index 3505db5..380f816 100644
--- a/src/tracker3/grl-tracker.c
+++ b/src/tracker3/grl-tracker.c
@@ -68,11 +68,8 @@ init_sources (void)
grl_tracker_queue = grl_tracker_queue_new ();
- if (grl_tracker_connection != NULL) {
- grl_tracker_notify_init (grl_tracker_connection);
-
+ if (grl_tracker_connection != NULL)
grl_tracker_source_sources_init ();
- }
}
static void