From 5c062183b8475bc46d7acb7c225e749e992fd3fa Mon Sep 17 00:00:00 2001 From: Raul Gutierrez Segales Date: Thu, 21 Jul 2011 01:33:50 +0100 Subject: [PATCH] Configure the writeable store by type_id and store id Fixes: https://bugzilla.gnome.org/show_bug.cgi?id=654907 --- NEWS | 1 + folks/individual-aggregator.vala | 44 ++++++++++++++++++++++++++++++++-------- folks/persona-store.vala | 8 +++++++- 3 files changed, 44 insertions(+), 9 deletions(-) diff --git a/NEWS b/NEWS index 9b7d656..6ca3444 100644 --- a/NEWS +++ b/NEWS @@ -24,6 +24,7 @@ Bugs fixed: * Bug 650414 — Need better APIs to handle image data * Bug 652643 — Add PersonaStore cache * Bug 655510 — Make truly-writeable *Details property setters public +* Bug 654907 — The writable store shouldn't be set by type_id API changes: * Swf.Persona retains and exposes its libsocialweb Contact diff --git a/folks/individual-aggregator.vala b/folks/individual-aggregator.vala index 049e722..39151dc 100644 --- a/folks/individual-aggregator.vala +++ b/folks/individual-aggregator.vala @@ -65,6 +65,7 @@ public class Folks.IndividualAggregator : Object private bool _is_prepared = false; private Debug _debug; private string _configured_writeable_store_type_id; + private string _configured_writeable_store_id; private static const string _FOLKS_CONFIG_KEY = "/system/folks/backends/primary_store"; @@ -181,20 +182,22 @@ public class Folks.IndividualAggregator : Object this._debug.print_status.connect (this._debug_print_status); /* Check out the configured writeable store */ - var store_type_id = Environment.get_variable ("FOLKS_WRITEABLE_STORE"); - if (store_type_id != null) + var store_config_ids = Environment.get_variable ("FOLKS_WRITEABLE_STORE"); + if (store_config_ids != null) { - this._configured_writeable_store_type_id = store_type_id; + this._set_writeable_store (store_config_ids); } else { this._configured_writeable_store_type_id = "key-file"; + this._configured_writeable_store_id = ""; + try { unowned GConf.Client client = GConf.Client.get_default (); GConf.Value? val = client.get (this._FOLKS_CONFIG_KEY); if (val != null) - this._configured_writeable_store_type_id = val.get_string (); + this._set_writeable_store (val.get_string ()); } catch (GLib.Error e) { @@ -222,6 +225,21 @@ public class Folks.IndividualAggregator : Object this._debug.print_status.disconnect (this._debug_print_status); } + private void _set_writeable_store (string store_config_ids) + { + if (store_config_ids.str (":") != null) + { + var ids = store_config_ids.split (":", 2); + this._configured_writeable_store_type_id = ids[0]; + this._configured_writeable_store_id = ids[1]; + } + else + { + this._configured_writeable_store_type_id = store_config_ids; + this._configured_writeable_store_id = ""; + } + } + private void _debug_print_status (Debug debug) { const string domain = Debug.STATUS_LOG_DOMAIN; @@ -449,12 +467,22 @@ public class Folks.IndividualAggregator : Object var store_id = this._get_store_full_id (store.type_id, store.id); /* We use the configured PersonaStore as the only trusted and writeable - * PersonaStore. */ + * PersonaStore. + * + * If the type_id is `eds` we *must* know the actual store + * (address book) we are talking about or we might end up using + * a random store on every run. + */ if (store.type_id == this._configured_writeable_store_type_id) { - store.is_writeable = true; - store.trust_level = PersonaStoreTrust.FULL; - this._writeable_store = store; + if ((store.type_id != "eds" && + this._configured_writeable_store_id == "") || + this._configured_writeable_store_id == store.id) + { + store.is_writeable = true; + store.trust_level = PersonaStoreTrust.FULL; + this._writeable_store = store; + } } this._stores.set (store_id, store); diff --git a/folks/persona-store.vala b/folks/persona-store.vala index e70e88a..cdf3a69 100644 --- a/folks/persona-store.vala +++ b/folks/persona-store.vala @@ -374,7 +374,13 @@ public abstract class Folks.PersonaStore : Object * This is guaranteed to always be available; even before * {@link PersonaStore.prepare} is called. */ - public abstract string type_id { get; } + public abstract string type_id + { + /* Note: the type_id must not contain colons because the primary writeable + * store is configured, either via GConf or the FOLKS_WRITEABLE_STORE + * env variable, with a string of the form 'type_id:store_id'. */ + get; + } /** * The human-readable, service-specific name used to represent the -- 2.7.4