telepathy-mission-control: McdStorage: when acting on one account, only store it in its plugin

Simon McVittie smcv at kemper.freedesktop.org
Thu Jan 30 04:34:41 PST 2014


Module: telepathy-mission-control
Branch: master
Commit: 1e1ba5f4fef9ee83411d55e376f0f5fec0a6e892
URL:    http://cgit.freedesktop.org/telepathy/telepathy-mission-control/commit/?id=1e1ba5f4fef9ee83411d55e376f0f5fec0a6e892

Author: Simon McVittie <simon.mcvittie at collabora.co.uk>
Date:   Thu Nov 14 16:51:37 2013 +0000

McdStorage: when acting on one account, only store it in its plugin

Bug: https://bugs.freedesktop.org/show_bug.cgi?id=27727

---

 src/mcd-storage.c |   68 ++++++++++++++++++++++++++++++++---------------------
 1 file changed, 41 insertions(+), 27 deletions(-)

diff --git a/src/mcd-storage.c b/src/mcd-storage.c
index dffc498..07d07f3 100644
--- a/src/mcd-storage.c
+++ b/src/mcd-storage.c
@@ -1245,13 +1245,14 @@ update_storage (McdStorage *self,
     const gchar *key,
     GVariant *variant)
 {
-  GList *store;
   McpAccountManager *ma = MCP_ACCOUNT_MANAGER (self);
   gboolean updated = FALSE;
+  McpAccountStorage *plugin;
 
-  for (store = stores; store != NULL; store = g_list_next (store))
+  plugin = g_hash_table_lookup (self->accounts, account);
+
+  if (plugin != NULL)
     {
-      McpAccountStorage *plugin = store->data;
       const gchar *pn = mcp_account_storage_name (plugin);
       McpAccountStorageSetResult res;
 
@@ -1268,8 +1269,6 @@ update_storage (McdStorage *self,
             DEBUG ("MCP:%s -> store %s %s.%s", pn,
                 parameter ? "parameter" : "attribute", account, key);
             updated = TRUE;
-            /* set it to NULL in all lower-priority stores */
-            variant = NULL;
             break;
 
           case MCP_ACCOUNT_STORAGE_SET_RESULT_FAILED:
@@ -1286,6 +1285,10 @@ update_storage (McdStorage *self,
             g_warn_if_reached ();
         }
     }
+  else
+    {
+      g_assert_not_reached ();
+    }
 
   return updated;
 }
@@ -1809,24 +1812,29 @@ void
 mcd_storage_delete_account (McdStorage *self,
     const gchar *account)
 {
-  GList *store;
   McpAccountManager *ma = MCP_ACCOUNT_MANAGER (self);
+  McpAccountStorage *plugin;
 
   g_return_if_fail (MCD_IS_STORAGE (self));
   g_return_if_fail (account != NULL);
 
-  g_hash_table_remove (self->accounts, account);
+  plugin = g_hash_table_lookup (self->accounts, account);
 
-  for (store = stores; store != NULL; store = g_list_next (store))
+  if (plugin == NULL)
     {
-      McpAccountStorage *plugin = store->data;
-
-      /* FIXME: when we know which plugin owns the account, we can stop
-       * ignoring the error (if any), and make this method async
-       * in order to pass the error up to McdAccount */
-      mcp_account_storage_delete_async (plugin, ma, account,
-          delete_cb, g_strdup (account));
+      /* we wanted no account, we got no account, I call that success! */
+      return;
     }
+
+  g_object_ref (plugin);
+  g_hash_table_remove (self->accounts, account);
+
+  /* FIXME: stop ignoring the error (if any), and make this method async
+   * in order to pass the error up to McdAccount */
+  mcp_account_storage_delete_async (plugin, ma, account,
+      delete_cb, g_strdup (account));
+
+  g_object_unref (plugin);
 }
 
 /*
@@ -1842,24 +1850,30 @@ mcd_storage_commit (McdStorage *self, const gchar *account)
 {
   GList *store;
   McpAccountManager *ma = MCP_ACCOUNT_MANAGER (self);
+  McpAccountStorage *plugin;
+  const gchar *pname;
 
   g_return_if_fail (MCD_IS_STORAGE (self));
 
+  if (account != NULL)
+    {
+      plugin = g_hash_table_lookup (self->accounts, account);
+      g_return_val_if_fail (plugin != NULL, FALSE);
+
+      pname = mcp_account_storage_name (plugin);
+
+      DEBUG ("flushing plugin %s %s to long term storage", pname, account);
+      mcp_account_storage_commit (plugin, ma, account);
+      return;
+    }
+
   for (store = stores; store != NULL; store = g_list_next (store))
     {
-      McpAccountStorage *plugin = store->data;
-      const gchar *pname = mcp_account_storage_name (plugin);
+      plugin = store->data;
+      pname = mcp_account_storage_name (plugin);
 
-      if (account != NULL)
-        {
-          DEBUG ("flushing plugin %s %s to long term storage", pname, account);
-          mcp_account_storage_commit (plugin, ma, account);
-        }
-      else
-        {
-          DEBUG ("flushing plugin %s to long term storage", pname);
-          mcp_account_storage_commit (plugin, ma, NULL);
-        }
+      DEBUG ("flushing plugin %s to long term storage", pname);
+      mcp_account_storage_commit (plugin, ma, NULL);
     }
 }
 



More information about the telepathy-commits mailing list