[gnome-documents] miner: add a display name property on the miner object



commit 753bf47cd72e8b8b739418b0cf11bf828c5143ab
Author: Cosimo Cecchi <cosimoc gnome org>
Date:   Thu Oct 25 15:53:36 2012 -0400

    miner: add a display name property on the miner object
    
    This will be useful to display in a notification while the miner is running.

 src/miner/gd-miner.c   |   85 ++++++++++++++++++++++++++++++++++++++++-------
 src/miner/gd-miner.h   |    2 +
 src/miner/miner-main.c |   31 +++++++++++++++--
 src/miners.js          |    1 +
 4 files changed, 102 insertions(+), 17 deletions(-)
---
diff --git a/src/miner/gd-miner.c b/src/miner/gd-miner.c
index 8c17ea9..1d1008d 100644
--- a/src/miner/gd-miner.c
+++ b/src/miner/gd-miner.c
@@ -29,12 +29,16 @@ G_DEFINE_TYPE (GdMiner, gd_miner, G_TYPE_OBJECT)
 
 struct _GdMinerPrivate {
   GoaClient *client;
+  GError *client_error;
+
   TrackerSparqlConnection *connection;
 
   GCancellable *cancellable;
   GSimpleAsyncResult *result;
 
   GList *pending_jobs;
+
+  gchar *display_name;
 };
 
 static void
@@ -71,13 +75,66 @@ gd_miner_dispose (GObject *object)
   g_clear_object (&self->priv->cancellable);
   g_clear_object (&self->priv->result);
 
+  g_free (self->priv->display_name);
+  g_clear_error (&self->priv->client_error);
+
   G_OBJECT_CLASS (gd_miner_parent_class)->dispose (object);
 }
 
 static void
+gd_miner_init_goa (GdMiner *self)
+{
+  GoaAccount *account;
+  GoaObject *object;
+  const gchar *provider_type;
+  GList *accounts, *l;
+  GdMinerClass *miner_class = GD_MINER_GET_CLASS (self);
+
+  self->priv->client = goa_client_new_sync (NULL, &self->priv->client_error);
+
+  if (self->priv->client_error != NULL)
+    {
+      g_critical ("Unable to create GoaClient: %s - indexing for %s will not work",
+                  self->priv->client_error->message, miner_class->goa_provider_type);
+      return;
+    }
+
+  accounts = goa_client_get_accounts (self->priv->client);
+  for (l = accounts; l != NULL; l = l->next)
+    {
+      object = l->data;
+
+      account = goa_object_peek_account (object);
+      if (account == NULL)
+        continue;
+
+      provider_type = goa_account_get_provider_type (account);
+      if (g_strcmp0 (provider_type, miner_class->goa_provider_type) == 0)
+        {
+          g_free (self->priv->display_name);
+          self->priv->display_name = goa_account_dup_provider_name (account);
+          break;
+        }
+    }
+
+  g_list_free_full (accounts, g_object_unref);
+}
+
+static void
+gd_miner_constructed (GObject *obj)
+{
+  GdMiner *self = GD_MINER (obj);
+
+  G_OBJECT_CLASS (gd_miner_parent_class)->constructed (obj);
+
+  gd_miner_init_goa (self);
+}
+
+static void
 gd_miner_init (GdMiner *self)
 {
   self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self, GD_TYPE_MINER, GdMinerPrivate);
+  self->priv->display_name = g_strdup ("");
 }
 
 static void
@@ -85,6 +142,7 @@ gd_miner_class_init (GdMinerClass *klass)
 {
   GObjectClass *oclass = G_OBJECT_CLASS (klass);
 
+  oclass->constructed = gd_miner_constructed;
   oclass->dispose = gd_miner_dispose;
 
   g_type_class_add_private (klass, sizeof (GdMinerPrivate));
@@ -552,11 +610,8 @@ gd_miner_cleanup_old_accounts (GdMiner *self,
 }
 
 static void
-client_ready_cb (GObject *source,
-                 GAsyncResult *res,
-                 gpointer user_data)
+gd_miner_refresh_db_real (GdMiner *self)
 {
-  GdMiner *self = user_data;
   GoaDocuments *documents;
   GoaAccount *account;
   GoaObject *object;
@@ -565,14 +620,6 @@ client_ready_cb (GObject *source,
   GList *accounts, *doc_objects, *acc_objects, *l;
   GdMinerClass *miner_class = GD_MINER_GET_CLASS (self);
 
-  self->priv->client = goa_client_new_finish (res, &error);
-
-  if (error != NULL)
-    {
-      gd_miner_complete_error (self, error);
-      return;
-    }
-
   doc_objects = NULL;
   acc_objects = NULL;
 
@@ -619,7 +666,13 @@ sparql_connection_ready_cb (GObject *object,
       return;
     }
 
-  goa_client_new (self->priv->cancellable, client_ready_cb, self);
+  gd_miner_refresh_db_real (self);
+}
+
+const gchar *
+gd_miner_get_display_name (GdMiner *self)
+{
+  return self->priv->display_name;
 }
 
 void
@@ -628,6 +681,12 @@ gd_miner_refresh_db_async (GdMiner *self,
                            GAsyncReadyCallback callback,
                            gpointer user_data)
 {
+  if (self->priv->client_error != NULL)
+    {
+      gd_miner_complete_error (self, self->priv->client_error);
+      return;
+    }
+
   self->priv->result =
     g_simple_async_result_new (G_OBJECT (self),
                                callback, user_data,
diff --git a/src/miner/gd-miner.h b/src/miner/gd-miner.h
index c61135a..273b5b7 100644
--- a/src/miner/gd-miner.h
+++ b/src/miner/gd-miner.h
@@ -83,6 +83,8 @@ struct _GdMinerClass
 
 GType gd_miner_get_type (void);
 
+const gchar * gd_miner_get_display_name (GdMiner *self);
+
 void gd_miner_refresh_db_async (GdMiner *self,
                                 GCancellable *cancellable,
                                 GAsyncReadyCallback callback,
diff --git a/src/miner/miner-main.c b/src/miner/miner-main.c
index 0e2b9cd..276073a 100644
--- a/src/miner/miner-main.c
+++ b/src/miner/miner-main.c
@@ -33,6 +33,7 @@ static const gchar introspection_xml[] =
   "  <interface name='org.gnome.Documents.Miner'>"
   "    <method name='RefreshDB'>"
   "    </method>"
+  "    <property name='DisplayName' type='s' access='read'/>"
   "  </interface>"
   "</node>";
 
@@ -42,6 +43,7 @@ static GMainLoop *loop = NULL;
 static guint name_owner_id = 0;
 static guint autoquit_id = 0;
 static gboolean refreshing = FALSE;
+static GdMiner *miner = NULL;
 
 static gboolean
 autoquit_timeout_cb (gpointer _unused)
@@ -118,8 +120,6 @@ miner_refresh_db_ready_cb (GObject *source,
 static void
 handle_refresh_db (GDBusMethodInvocation *invocation)
 {
-  GdMiner *miner;
-
   ensure_autoquit_off ();
 
   /* if we're refreshing already, compress with the current request */
@@ -128,7 +128,6 @@ handle_refresh_db (GDBusMethodInvocation *invocation)
 
   refreshing = TRUE;
   cancellable = g_cancellable_new ();
-  miner = g_object_new (MINER_TYPE, NULL);
 
   gd_miner_refresh_db_async (miner, cancellable,
                              miner_refresh_db_ready_cb, invocation);
@@ -152,10 +151,33 @@ handle_method_call (GDBusConnection       *connection,
     g_assert_not_reached ();
 }
 
+static GVariant *
+handle_get_display_name ()
+{
+  return g_variant_new_string (gd_miner_get_display_name (miner));
+}
+
+static GVariant *
+handle_get_property (GDBusConnection       *connection,
+                     const gchar           *sender,
+                     const gchar           *object_path,
+                     const gchar           *interface_name,
+                     const gchar           *property_name,
+                     GError               **error,
+                     gpointer               user_data)
+{
+  if (g_strcmp0 (property_name, "DisplayName") == 0)
+    return handle_get_display_name ();
+
+  g_assert_not_reached ();
+
+  return NULL;
+}
+
 static const GDBusInterfaceVTable interface_vtable =
 {
   handle_method_call,
-  NULL, /* get_property */
+  handle_get_property,
   NULL, /* set_property */
 };
 
@@ -185,6 +207,7 @@ on_bus_acquired (GDBusConnection *connection,
       _exit (1);
     }
 
+  miner = g_object_new (MINER_TYPE, NULL);
   g_debug ("Object exported on the session bus");
 }
 
diff --git a/src/miners.js b/src/miners.js
index 988c468..f5bbf54 100644
--- a/src/miners.js
+++ b/src/miners.js
@@ -25,6 +25,7 @@ const GLib = imports.gi.GLib;
 
 const MinerIface = <interface name="org.gnome.Documents.Miner">
     <method name="RefreshDB" />
+    <property name="DisplayName" type="s" access="read"/>
 </interface>;
 
 var MinerProxy = Gio.DBusProxy.makeProxyWrapper(MinerIface);



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]