1 /* Copyright (c) 2006, Nokia Corporation
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are
8 * * Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * * Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.
13 * * Neither the name of the Nokia Corporation nor the names of its
14 * contributors may be used to endorse or promote products derived from
15 * this software without specific prior written permission.
17 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
18 * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
19 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
20 * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
21 * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
22 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
23 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
24 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
25 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
26 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
27 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31 #include <modest-marshal.h>
32 #include <modest-account-mgr.h>
33 #include <modest-account-mgr-priv.h>
34 #include <modest-account-mgr-helpers.h>
36 /* 'private'/'protected' functions */
37 static void modest_account_mgr_class_init (ModestAccountMgrClass * klass);
38 static void modest_account_mgr_init (ModestAccountMgr * obj);
39 static void modest_account_mgr_finalize (GObject * obj);
43 ACCOUNT_CHANGED_SIGNAL,
44 ACCOUNT_REMOVED_SIGNAL,
50 static GObjectClass *parent_class = NULL;
51 static guint signals[LAST_SIGNAL] = {0};
53 /* We signal key changes in batches, every X seconds: */
55 on_timeout_notify_changes (gpointer data)
57 ModestAccountMgr *self = MODEST_ACCOUNT_MGR (data);
58 ModestAccountMgrPrivate *priv = MODEST_ACCOUNT_MGR_GET_PRIVATE (self);
60 /* TODO: Also store the account names, and notify one list for each account,
61 * if anything uses the account names. */
63 if (priv->changed_conf_keys) {
64 gchar *default_account =
65 modest_account_mgr_get_default_account (self);
67 g_signal_emit (G_OBJECT(self), signals[ACCOUNT_CHANGED_SIGNAL], 0,
68 default_account, priv->changed_conf_keys, FALSE);
70 g_free (default_account);
72 g_slist_foreach (priv->changed_conf_keys, (GFunc) g_free, NULL);
73 g_slist_free (priv->changed_conf_keys);
74 priv->changed_conf_keys = NULL;
77 return TRUE; /* Call this again later. */
81 on_key_change (ModestConf *conf, const gchar *key, ModestConfEvent event, gpointer user_data)
83 ModestAccountMgr *self = MODEST_ACCOUNT_MGR (user_data);
84 ModestAccountMgrPrivate *priv = MODEST_ACCOUNT_MGR_GET_PRIVATE (self);
86 /* there is only one not-really-account key which will still emit
87 * a signal: a change in MODEST_CONF_DEFAULT_ACCOUNT */
88 if (key && strcmp (key, MODEST_CONF_DEFAULT_ACCOUNT) == 0) {
89 /* Get the default account instead. */
91 /* Store the key for later notification in our timeout callback.
92 * Notifying for every key change would cause unnecessary work: */
93 priv->changed_conf_keys = g_slist_append (priv->changed_conf_keys,
94 (gpointer) g_strdup (key));
97 gboolean is_account_key = FALSE;
98 gboolean is_server_account = FALSE;
99 gchar* account = _modest_account_mgr_account_from_key (key, &is_account_key, &is_server_account);
101 /* if this is not an account-related key change, ignore */
105 /* account was removed -- emit this, even if the account was
106 disabled. This should not happen unless the user directly
108 if (is_account_key && event == MODEST_CONF_EVENT_KEY_UNSET) {
109 g_signal_emit (G_OBJECT(self), signals[ACCOUNT_REMOVED_SIGNAL], 0,
110 account, is_server_account);
115 /* is this account enabled? */
116 gboolean enabled = FALSE;
117 if (is_server_account)
120 enabled = modest_account_mgr_get_enabled (self, account);
122 /* Notify is server account was changed, default account was changed
123 * or when enabled/disabled changes:
126 g_str_has_suffix (key, MODEST_ACCOUNT_ENABLED) ||
127 strcmp (key, MODEST_CONF_DEFAULT_ACCOUNT) == 0) {
128 /* Store the key for later notification in our timeout callback.
129 * Notifying for every key change would cause unnecessary work: */
130 priv->changed_conf_keys = g_slist_append (NULL,
131 (gpointer) g_strdup (key));
139 modest_account_mgr_get_type (void)
141 static GType my_type = 0;
144 static const GTypeInfo my_info = {
145 sizeof (ModestAccountMgrClass),
146 NULL, /* base init */
147 NULL, /* base finalize */
148 (GClassInitFunc) modest_account_mgr_class_init,
149 NULL, /* class finalize */
150 NULL, /* class data */
151 sizeof (ModestAccountMgr),
153 (GInstanceInitFunc) modest_account_mgr_init,
157 my_type = g_type_register_static (G_TYPE_OBJECT,
165 modest_account_mgr_class_init (ModestAccountMgrClass * klass)
167 GObjectClass *gobject_class;
168 gobject_class = (GObjectClass *) klass;
170 parent_class = g_type_class_peek_parent (klass);
171 gobject_class->finalize = modest_account_mgr_finalize;
173 g_type_class_add_private (gobject_class,
174 sizeof (ModestAccountMgrPrivate));
176 /* signal definitions */
177 signals[ACCOUNT_REMOVED_SIGNAL] =
178 g_signal_new ("account_removed",
179 G_TYPE_FROM_CLASS (klass),
181 G_STRUCT_OFFSET(ModestAccountMgrClass,account_removed),
183 modest_marshal_VOID__STRING_BOOLEAN,
184 G_TYPE_NONE, 2, G_TYPE_STRING, G_TYPE_BOOLEAN);
185 signals[ACCOUNT_CHANGED_SIGNAL] =
186 g_signal_new ("account_changed",
187 G_TYPE_FROM_CLASS (klass),
189 G_STRUCT_OFFSET(ModestAccountMgrClass,account_changed),
191 modest_marshal_VOID__STRING_POINTER_BOOLEAN,
192 G_TYPE_NONE, 3, G_TYPE_STRING, G_TYPE_POINTER, G_TYPE_BOOLEAN);
197 modest_account_mgr_init (ModestAccountMgr * obj)
199 ModestAccountMgrPrivate *priv =
200 MODEST_ACCOUNT_MGR_GET_PRIVATE (obj);
202 priv->modest_conf = NULL;
204 priv->timeout = g_timeout_add (1000 /* milliseconds */, on_timeout_notify_changes, obj);
208 modest_account_mgr_finalize (GObject * obj)
210 ModestAccountMgrPrivate *priv =
211 MODEST_ACCOUNT_MGR_GET_PRIVATE (obj);
213 if (priv->modest_conf) {
214 g_object_unref (G_OBJECT(priv->modest_conf));
215 priv->modest_conf = NULL;
219 g_source_remove (priv->timeout);
221 if (priv->changed_conf_keys) {
222 g_slist_foreach (priv->changed_conf_keys, (GFunc) g_free, NULL);
223 g_slist_free (priv->changed_conf_keys);
226 G_OBJECT_CLASS(parent_class)->finalize (obj);
231 modest_account_mgr_new (ModestConf *conf)
234 ModestAccountMgrPrivate *priv;
236 g_return_val_if_fail (conf, NULL);
238 obj = G_OBJECT (g_object_new (MODEST_TYPE_ACCOUNT_MGR, NULL));
239 priv = MODEST_ACCOUNT_MGR_GET_PRIVATE (obj);
241 g_object_ref (G_OBJECT(conf));
242 priv->modest_conf = conf;
244 g_signal_connect (G_OBJECT (conf), "key_changed",
245 G_CALLBACK (on_key_change),
248 return MODEST_ACCOUNT_MGR (obj);
253 null_means_empty (const gchar * str)
255 return str ? str : "";
260 modest_account_mgr_add_account (ModestAccountMgr *self,
262 const gchar *store_account,
263 const gchar *transport_account,
266 ModestAccountMgrPrivate *priv;
269 gchar *default_account;
272 g_return_val_if_fail (MODEST_IS_ACCOUNT_MGR(self), FALSE);
273 g_return_val_if_fail (name, FALSE);
274 g_return_val_if_fail (strchr(name, '/') == NULL, FALSE);
276 priv = MODEST_ACCOUNT_MGR_GET_PRIVATE (self);
279 * we create the account by adding an account 'dir', with the name <name>,
280 * and in that the 'display_name' string key
282 key = _modest_account_mgr_get_account_keyname (name, MODEST_ACCOUNT_DISPLAY_NAME, FALSE);
283 if (modest_account_mgr_account_exists (self, key, FALSE)) {
284 g_printerr ("modest: account already exists\n");
289 ok = modest_conf_set_string (priv->modest_conf, key, name, &err);
292 g_printerr ("modest: cannot set display name\n");
294 g_printerr ("modest: Error adding account conf: %s\n", err->message);
301 key = _modest_account_mgr_get_account_keyname (name, MODEST_ACCOUNT_STORE_ACCOUNT, FALSE);
302 ok = modest_conf_set_string (priv->modest_conf, key, store_account, &err);
305 g_printerr ("modest: failed to set store account '%s'\n",
308 g_printerr ("modest: Error adding store account conf: %s\n", err->message);
316 if (transport_account) {
317 key = _modest_account_mgr_get_account_keyname (name, MODEST_ACCOUNT_TRANSPORT_ACCOUNT,
319 ok = modest_conf_set_string (priv->modest_conf, key, transport_account, &err);
322 g_printerr ("modest: failed to set transport account '%s'\n",
325 g_printerr ("modest: Error adding transport account conf: %s\n", err->message);
332 /* Make sure that leave-messages-on-server is enabled by default,
333 * as per the UI spec, though it is only meaningful for accounts using POP.
334 * (possibly this gconf key should be under the server account): */
335 modest_account_mgr_set_bool (self, name,
336 MODEST_ACCOUNT_LEAVE_ON_SERVER, TRUE, FALSE /* not server account */);
339 modest_account_mgr_set_enabled (self, name, enabled);
341 /* if no default account has been defined yet, do so now */
342 default_account = modest_account_mgr_get_default_account (self);
343 if (!default_account)
344 modest_account_mgr_set_default_account (self, name);
345 g_free (default_account);
352 modest_account_mgr_add_server_account (ModestAccountMgr * self,
353 const gchar * name, const gchar *hostname,
355 const gchar * username, const gchar * password,
356 ModestTransportStoreProtocol proto,
357 ModestConnectionProtocol security,
358 ModestAuthProtocol auth)
360 ModestAccountMgrPrivate *priv;
365 g_return_val_if_fail (MODEST_IS_ACCOUNT_MGR(self), FALSE);
366 g_return_val_if_fail (name, FALSE);
367 g_return_val_if_fail (strchr(name, '/') == NULL, FALSE);
369 priv = MODEST_ACCOUNT_MGR_GET_PRIVATE (self);
372 key = _modest_account_mgr_get_account_keyname (name, MODEST_ACCOUNT_HOSTNAME, TRUE);
373 if (modest_conf_key_exists (priv->modest_conf, key, &err)) {
374 g_printerr ("modest: server account '%s' already exists\n", name);
381 modest_conf_set_string (priv->modest_conf, key, null_means_empty(hostname), &err);
383 g_printerr ("modest: failed to set %s: %s\n", key, err->message);
392 key = _modest_account_mgr_get_account_keyname (name, MODEST_ACCOUNT_USERNAME, TRUE);
393 ok = modest_conf_set_string (priv->modest_conf, key, null_means_empty (username), &err);
395 g_printerr ("modest: failed to set %s: %s\n", key, err->message);
405 key = _modest_account_mgr_get_account_keyname (name, MODEST_ACCOUNT_PASSWORD, TRUE);
406 ok = modest_conf_set_string (priv->modest_conf, key, null_means_empty (password), &err);
408 g_printerr ("modest: failed to set %s: %s\n", key, err->message);
417 key = _modest_account_mgr_get_account_keyname (name, MODEST_ACCOUNT_PROTO, TRUE);
418 ok = modest_conf_set_string (priv->modest_conf, key,
419 modest_protocol_info_get_transport_store_protocol_name(proto),
422 g_printerr ("modest: failed to set %s: %s\n", key, err->message);
432 key = _modest_account_mgr_get_account_keyname (name, MODEST_ACCOUNT_PORT, TRUE);
433 ok = modest_conf_set_int (priv->modest_conf, key, portnumber, &err);
435 g_printerr ("modest: failed to set %s: %s\n", key, err->message);
445 key = _modest_account_mgr_get_account_keyname (name, MODEST_ACCOUNT_AUTH_MECH, TRUE);
446 ok = modest_conf_set_string (priv->modest_conf, key,
447 modest_protocol_info_get_auth_protocol_name (auth),
450 g_printerr ("modest: failed to set %s: %s\n", key, err->message);
458 /* Add the security settings: */
459 modest_server_account_set_security (self, name, security);
463 g_printerr ("modest: failed to add server account\n");
470 /** modest_account_mgr_add_server_account_uri:
471 * Only used for mbox and maildir accounts.
474 modest_account_mgr_add_server_account_uri (ModestAccountMgr * self,
475 const gchar *name, ModestTransportStoreProtocol proto,
478 ModestAccountMgrPrivate *priv;
482 g_return_val_if_fail (MODEST_IS_ACCOUNT_MGR(self), FALSE);
483 g_return_val_if_fail (name, FALSE);
484 g_return_val_if_fail (strchr(name, '/') == NULL, FALSE);
485 g_return_val_if_fail (uri, FALSE);
487 priv = MODEST_ACCOUNT_MGR_GET_PRIVATE (self);
491 key = _modest_account_mgr_get_account_keyname (name, MODEST_ACCOUNT_PROTO, TRUE);
492 ok = modest_conf_set_string (priv->modest_conf, key,
493 modest_protocol_info_get_transport_store_protocol_name(proto),
498 g_printerr ("modest: failed to set proto\n");
503 key = _modest_account_mgr_get_account_keyname (name, MODEST_ACCOUNT_URI, TRUE);
504 ok = modest_conf_set_string (priv->modest_conf, key, uri, NULL);
508 g_printerr ("modest: failed to set uri\n");
517 modest_account_mgr_remove_account (ModestAccountMgr * self,
518 const gchar* name, gboolean server_account)
520 ModestAccountMgrPrivate *priv;
525 g_return_val_if_fail (MODEST_IS_ACCOUNT_MGR(self), FALSE);
526 g_return_val_if_fail (name, FALSE);
528 if (!modest_account_mgr_account_exists (self, name, server_account)) {
529 g_printerr ("modest: %s: account '%s' does not exist\n", __FUNCTION__, name);
533 /* Notify the observers. We need to do that here because they
534 could need to use the configuration keys before deleting
535 them, i.e., the account store will delete the cache. We
536 only notify about removals of modest accounts */
538 g_signal_emit (G_OBJECT(self), signals[ACCOUNT_REMOVED_SIGNAL], 0,
539 name, server_account);
541 /* in case we're deleting an account, also delete the dependent store and transport account */
542 if (!server_account) {
543 gchar *server_account_name;
545 server_account_name = modest_account_mgr_get_string (self, name, MODEST_ACCOUNT_STORE_ACCOUNT,
547 if (server_account_name) {
548 if (!modest_account_mgr_remove_account (self, server_account_name, TRUE))
549 g_printerr ("modest: failed to remove store account '%s' (%s)\n",
550 server_account_name, name);
551 g_free (server_account_name);
553 g_printerr ("modest: could not find the store account for %s\n", name);
555 server_account_name = modest_account_mgr_get_string (self, name, MODEST_ACCOUNT_TRANSPORT_ACCOUNT,
557 if (server_account_name) {
558 if (!modest_account_mgr_remove_account (self, server_account_name, TRUE))
559 g_printerr ("modest: failed to remove transport account '%s' (%s)\n",
560 server_account_name, name);
561 g_free (server_account_name);
563 g_printerr ("modest: could not find the transport account for %s\n", name);
566 priv = MODEST_ACCOUNT_MGR_GET_PRIVATE (self);
567 key = _modest_account_mgr_get_account_keyname (name, NULL, server_account);
569 retval = modest_conf_remove_key (priv->modest_conf, key, &err);
573 g_printerr ("modest: error removing key: %s\n", err->message);
577 /* If this was the default, then remove that setting: */
578 if (!server_account) {
579 gchar *default_account_name = modest_account_mgr_get_default_account (self);
580 if (default_account_name && (strcmp (default_account_name, name) == 0))
581 modest_account_mgr_unset_default_account (self);
582 g_free (default_account_name);
584 /* pick another one as the new default account */
585 modest_account_mgr_set_first_account_as_default (self);
592 /* strip the first /n/ character from each element
593 * caller must make sure all elements are strings with
594 * length >= n, and also that data can be freed.
598 strip_prefix_from_elements (GSList * lst, guint n)
601 memmove (lst->data, lst->data + n,
602 strlen(lst->data) - n + 1);
610 modest_account_mgr_search_server_accounts (ModestAccountMgr * self,
611 const gchar * account_name,
612 ModestTransportStoreProtocol proto)
616 ModestAccountMgrPrivate *priv;
620 g_return_val_if_fail (self, NULL);
622 key = _modest_account_mgr_get_account_keyname (account_name, NULL, TRUE);
623 priv = MODEST_ACCOUNT_MGR_GET_PRIVATE (self);
625 /* get the list of all server accounts */
626 accounts = modest_conf_list_subkeys (priv->modest_conf, key, &err);
628 g_printerr ("modest: failed to get subkeys for '%s' (%s)\n", key,
634 /* filter out the ones with the wrong protocol */
635 /* we could optimize for unknown proto / unknown type, but it will only
636 * make the code more complex */
639 gchar *account = _modest_account_mgr_account_from_key ((gchar*)cursor->data, NULL, NULL);
640 gchar *acc_proto = modest_account_mgr_get_string (self, account, MODEST_ACCOUNT_PROTO,TRUE);
641 ModestTransportStoreProtocol this_proto =
642 modest_protocol_info_get_transport_store_protocol (acc_proto);
643 if (this_proto != MODEST_PROTOCOL_TRANSPORT_STORE_UNKNOWN && this_proto != proto) {
644 GSList *nxt = cursor->next;
645 accounts = g_slist_delete_link (accounts, cursor);
648 cursor = cursor->next;
654 /* +1 because we must remove the ending '/' as well */
655 strip_prefix_from_elements (accounts, strlen(key)+1);
661 modest_account_mgr_account_names (ModestAccountMgr * self, gboolean only_enabled)
664 ModestAccountMgrPrivate *priv;
667 const size_t prefix_len = strlen (MODEST_ACCOUNT_NAMESPACE "/");
669 g_return_val_if_fail (self, NULL);
671 priv = MODEST_ACCOUNT_MGR_GET_PRIVATE (self);
673 accounts = modest_conf_list_subkeys (priv->modest_conf,
674 MODEST_ACCOUNT_NAMESPACE, &err);
676 g_printerr ("modest: failed to get subkeys (%s): %s\n",
677 MODEST_ACCOUNT_NAMESPACE, err->message);
679 return NULL; /* assume accounts did not get value when err is set...*/
682 strip_prefix_from_elements (accounts, prefix_len);
684 GSList *result = NULL;
686 /* Unescape the keys to get the account names: */
687 GSList *iter = accounts;
692 const gchar* account_name_key = (const gchar*)iter->data;
693 /* printf ("DEBUG: %s: account_name_key=%s\n", __FUNCTION__, account_name_key); */
694 gchar* unescaped_name = account_name_key ?
695 modest_conf_key_unescape (account_name_key)
697 /* printf (" DEBUG: %s: unescaped name=%s\n", __FUNCTION__, unescaped_name); */
701 if (unescaped_name &&
702 !modest_account_mgr_get_enabled (self, unescaped_name)) {
708 result = g_slist_append (result, unescaped_name);
711 g_free (unescaped_name);
714 iter = g_slist_next (iter);
717 /* TODO: Free the strings too? */
718 g_slist_free (accounts);
726 modest_account_mgr_get_string (ModestAccountMgr *self, const gchar *name,
727 const gchar *key, gboolean server_account) {
729 ModestAccountMgrPrivate *priv;
735 g_return_val_if_fail (self, NULL);
736 g_return_val_if_fail (name, NULL);
737 g_return_val_if_fail (key, NULL);
739 keyname = _modest_account_mgr_get_account_keyname (name, key, server_account);
741 priv = MODEST_ACCOUNT_MGR_GET_PRIVATE (self);
742 retval = modest_conf_get_string (priv->modest_conf, keyname, &err);
744 g_printerr ("modest: error getting string '%s': %s\n", keyname, err->message);
755 modest_account_mgr_get_password (ModestAccountMgr *self, const gchar *name,
756 const gchar *key, gboolean server_account)
758 return modest_account_mgr_get_string (self, name, key, server_account);
765 modest_account_mgr_get_int (ModestAccountMgr *self, const gchar *name, const gchar *key,
766 gboolean server_account)
768 ModestAccountMgrPrivate *priv;
774 g_return_val_if_fail (MODEST_IS_ACCOUNT_MGR(self), -1);
775 g_return_val_if_fail (name, -1);
776 g_return_val_if_fail (key, -1);
778 keyname = _modest_account_mgr_get_account_keyname (name, key, server_account);
780 priv = MODEST_ACCOUNT_MGR_GET_PRIVATE (self);
781 retval = modest_conf_get_int (priv->modest_conf, keyname, &err);
783 g_printerr ("modest: error getting int '%s': %s\n", keyname, err->message);
795 modest_account_mgr_get_bool (ModestAccountMgr * self, const gchar *account,
796 const gchar * key, gboolean server_account)
798 ModestAccountMgrPrivate *priv;
804 g_return_val_if_fail (MODEST_IS_ACCOUNT_MGR(self), FALSE);
805 g_return_val_if_fail (account, FALSE);
806 g_return_val_if_fail (key, FALSE);
808 keyname = _modest_account_mgr_get_account_keyname (account, key, server_account);
810 priv = MODEST_ACCOUNT_MGR_GET_PRIVATE (self);
811 retval = modest_conf_get_bool (priv->modest_conf, keyname, &err);
813 g_printerr ("modest: error getting bool '%s': %s\n", keyname, err->message);
825 modest_account_mgr_get_list (ModestAccountMgr *self, const gchar *name,
826 const gchar *key, ModestConfValueType list_type,
827 gboolean server_account)
829 ModestAccountMgrPrivate *priv;
835 g_return_val_if_fail (MODEST_IS_ACCOUNT_MGR(self), NULL);
836 g_return_val_if_fail (name, NULL);
837 g_return_val_if_fail (key, NULL);
839 keyname = _modest_account_mgr_get_account_keyname (name, key, server_account);
841 priv = MODEST_ACCOUNT_MGR_GET_PRIVATE (self);
842 retval = modest_conf_get_list (priv->modest_conf, keyname, list_type, &err);
844 g_printerr ("modest: error getting list '%s': %s\n", keyname,
856 modest_account_mgr_set_string (ModestAccountMgr * self, const gchar * name,
857 const gchar * key, const gchar * val, gboolean server_account)
859 ModestAccountMgrPrivate *priv;
865 g_return_val_if_fail (MODEST_IS_ACCOUNT_MGR(self), FALSE);
866 g_return_val_if_fail (name, FALSE);
867 g_return_val_if_fail (key, FALSE);
869 keyname = _modest_account_mgr_get_account_keyname (name, key, server_account);
871 priv = MODEST_ACCOUNT_MGR_GET_PRIVATE (self);
873 retval = modest_conf_set_string (priv->modest_conf, keyname, val, &err);
875 g_printerr ("modest: error setting string '%s': %s\n", keyname, err->message);
885 modest_account_mgr_set_password (ModestAccountMgr * self, const gchar * name,
886 const gchar * key, const gchar * val, gboolean server_account)
888 return modest_account_mgr_set_password (self, name, key, val, server_account);
894 modest_account_mgr_set_int (ModestAccountMgr * self, const gchar * name,
895 const gchar * key, int val, gboolean server_account)
897 ModestAccountMgrPrivate *priv;
903 g_return_val_if_fail (MODEST_IS_ACCOUNT_MGR(self), FALSE);
904 g_return_val_if_fail (name, FALSE);
905 g_return_val_if_fail (key, FALSE);
907 keyname = _modest_account_mgr_get_account_keyname (name, key, server_account);
909 priv = MODEST_ACCOUNT_MGR_GET_PRIVATE (self);
911 retval = modest_conf_set_int (priv->modest_conf, keyname, val, &err);
913 g_printerr ("modest: error setting int '%s': %s\n", keyname, err->message);
924 modest_account_mgr_set_bool (ModestAccountMgr * self, const gchar * name,
925 const gchar * key, gboolean val, gboolean server_account)
927 ModestAccountMgrPrivate *priv;
933 g_return_val_if_fail (MODEST_IS_ACCOUNT_MGR(self), FALSE);
934 g_return_val_if_fail (name, FALSE);
935 g_return_val_if_fail (key, FALSE);
937 keyname = _modest_account_mgr_get_account_keyname (name, key, server_account);
939 priv = MODEST_ACCOUNT_MGR_GET_PRIVATE (self);
941 retval = modest_conf_set_bool (priv->modest_conf, keyname, val, &err);
943 g_printerr ("modest: error setting bool '%s': %s\n", keyname, err->message);
953 modest_account_mgr_set_list (ModestAccountMgr *self,
957 ModestConfValueType list_type,
958 gboolean server_account)
960 ModestAccountMgrPrivate *priv;
965 g_return_val_if_fail (self, FALSE);
966 g_return_val_if_fail (name, FALSE);
967 g_return_val_if_fail (key, FALSE);
968 g_return_val_if_fail (val, FALSE);
970 keyname = _modest_account_mgr_get_account_keyname (name, key, server_account);
972 priv = MODEST_ACCOUNT_MGR_GET_PRIVATE (self);
973 retval = modest_conf_set_list (priv->modest_conf, keyname, val, list_type, &err);
975 g_printerr ("modest: error setting list '%s': %s\n", keyname, err->message);
985 modest_account_mgr_account_exists (ModestAccountMgr * self, const gchar * name,
986 gboolean server_account)
988 ModestAccountMgrPrivate *priv;
994 g_return_val_if_fail (MODEST_IS_ACCOUNT_MGR(self), FALSE);
995 g_return_val_if_fail (name, FALSE);
997 keyname = _modest_account_mgr_get_account_keyname (name, NULL, server_account);
998 priv = MODEST_ACCOUNT_MGR_GET_PRIVATE (self);
999 retval = modest_conf_key_exists (priv->modest_conf, keyname, &err);
1001 g_printerr ("modest: error determining existance of '%s': %s\n", keyname,
1011 modest_account_mgr_account_with_display_name_exists (ModestAccountMgr *self, const gchar *display_name)
1013 GSList *account_names = NULL;
1014 GSList *cursor = NULL;
1016 cursor = account_names = modest_account_mgr_account_names (self,
1017 TRUE /* enabled accounts, because disabled accounts are not user visible. */);
1019 gboolean found = FALSE;
1021 /* Look at each non-server account to check their display names; */
1023 const gchar * account_name = (gchar*)cursor->data;
1025 ModestAccountData *account_data = modest_account_mgr_get_account_data (self, account_name);
1026 if (!account_data) {
1027 g_printerr ("modest: failed to get account data for %s\n", account_name);
1031 if(account_data->display_name && (strcmp (account_data->display_name, display_name) == 0)) {
1036 modest_account_mgr_free_account_data (self, account_data);
1037 cursor = cursor->next;
1039 g_slist_free (account_names);
1048 modest_account_mgr_unset (ModestAccountMgr *self, const gchar *name,
1049 const gchar *key, gboolean server_account)
1051 ModestAccountMgrPrivate *priv;
1057 g_return_val_if_fail (MODEST_IS_ACCOUNT_MGR(self), FALSE);
1058 g_return_val_if_fail (name, FALSE);
1059 g_return_val_if_fail (key, FALSE);
1061 keyname = _modest_account_mgr_get_account_keyname (name, key, server_account);
1063 priv = MODEST_ACCOUNT_MGR_GET_PRIVATE (self);
1064 retval = modest_conf_remove_key (priv->modest_conf, keyname, &err);
1066 g_printerr ("modest: error unsetting'%s': %s\n", keyname,
1076 _modest_account_mgr_account_from_key (const gchar *key, gboolean *is_account_key, gboolean *is_server_account)
1078 /* Initialize input parameters: */
1080 *is_account_key = FALSE;
1082 if (is_server_account)
1083 *is_server_account = FALSE;
1085 const gchar* account_ns = MODEST_ACCOUNT_NAMESPACE "/";
1086 const gchar* server_account_ns = MODEST_SERVER_ACCOUNT_NAMESPACE "/";
1088 gchar *account = NULL;
1090 /* determine whether it's an account or a server account,
1091 * based on the prefix */
1092 if (g_str_has_prefix (key, account_ns)) {
1094 if (is_server_account)
1095 *is_server_account = FALSE;
1097 account = g_strdup (key + strlen (account_ns));
1099 } else if (g_str_has_prefix (key, server_account_ns)) {
1101 if (is_server_account)
1102 *is_server_account = TRUE;
1104 account = g_strdup (key + strlen (server_account_ns));
1108 /* if there are any slashes left in the key, it's not
1109 * the toplevel entry for an account
1111 cursor = strstr(account, "/");
1113 if (is_account_key && cursor)
1114 *is_account_key = TRUE;
1116 /* put a NULL where the first slash was */
1121 /* The key is an escaped string, so unescape it to get the actual account name: */
1122 gchar *unescaped_name = modest_conf_key_unescape (account);
1124 return unescaped_name;
1131 /* must be freed by caller */
1133 _modest_account_mgr_get_account_keyname (const gchar *account_name, const gchar * name, gboolean server_account)
1135 gchar *retval = NULL;
1137 gchar *namespace = server_account ? MODEST_SERVER_ACCOUNT_NAMESPACE : MODEST_ACCOUNT_NAMESPACE;
1140 return g_strdup (namespace);
1142 /* Always escape the conf keys, so that it is acceptable to gconf: */
1143 gchar *escaped_account_name = account_name ? modest_conf_key_escape (account_name) : NULL;
1144 gchar *escaped_name = name ? modest_conf_key_escape (name) : NULL;
1146 if (escaped_account_name && escaped_name)
1147 retval = g_strconcat (namespace, "/", escaped_account_name, "/", escaped_name, NULL);
1148 else if (escaped_account_name)
1149 retval = g_strconcat (namespace, "/", escaped_account_name, NULL);
1152 if (!modest_conf_key_is_valid (retval)) {
1153 g_warning ("%s: Generated conf key was invalid: %s", __FUNCTION__, retval);
1158 g_free (escaped_name);
1159 g_free (escaped_account_name);
1165 modest_account_mgr_has_accounts (ModestAccountMgr* self, gboolean enabled)
1167 /* Check that at least one account exists: */
1168 GSList *account_names = modest_account_mgr_account_names (self,
1170 gboolean accounts_exist = account_names != NULL;
1171 g_slist_free (account_names);
1173 return accounts_exist;