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_free (priv->changed_conf_keys);
73 priv->changed_conf_keys = NULL;
76 return TRUE; /* Call this again later. */
80 on_key_change (ModestConf *conf, const gchar *key, ModestConfEvent event, gpointer user_data)
82 /* printf("DEBUG: %s: key=%s\n", __FUNCTION__, key); */
84 ModestAccountMgr *self = MODEST_ACCOUNT_MGR (user_data);
85 ModestAccountMgrPrivate *priv = MODEST_ACCOUNT_MGR_GET_PRIVATE (self);
87 /* there is only one not-really-account key which will still emit
88 * a signal: a change in MODEST_CONF_DEFAULT_ACCOUNT */
89 if (key && strcmp (key, MODEST_CONF_DEFAULT_ACCOUNT) == 0) {
90 /* Get the default account instead. */
92 /* Store the key for later notification in our timeout callback.
93 * Notifying for every key change would cause unnecessary work: */
94 priv->changed_conf_keys = g_slist_append (NULL,
98 gboolean is_account_key = FALSE;
99 gboolean is_server_account = FALSE;
100 gchar* account = _modest_account_mgr_account_from_key (key, &is_account_key, &is_server_account);
102 /* if this is not an account-related key change, ignore */
106 /* account was removed -- emit this, even if the account was
107 disabled. This should not happen unless the user directly
109 if (is_account_key && event == MODEST_CONF_EVENT_KEY_UNSET) {
110 g_signal_emit (G_OBJECT(self), signals[ACCOUNT_REMOVED_SIGNAL], 0,
111 account, is_server_account);
116 /* is this account enabled? */
117 gboolean enabled = FALSE;
118 if (is_server_account)
121 enabled = modest_account_mgr_get_enabled (self, account);
123 /* Notify is server account was changed, default account was changed
124 * or when enabled/disabled changes:
127 g_str_has_suffix (key, MODEST_ACCOUNT_ENABLED) ||
128 strcmp (key, MODEST_CONF_DEFAULT_ACCOUNT) == 0) {
129 /* Store the key for later notification in our timeout callback.
130 * Notifying for every key change would cause unnecessary work: */
131 priv->changed_conf_keys = g_slist_append (NULL,
140 modest_account_mgr_get_type (void)
142 static GType my_type = 0;
145 static const GTypeInfo my_info = {
146 sizeof (ModestAccountMgrClass),
147 NULL, /* base init */
148 NULL, /* base finalize */
149 (GClassInitFunc) modest_account_mgr_class_init,
150 NULL, /* class finalize */
151 NULL, /* class data */
152 sizeof (ModestAccountMgr),
154 (GInstanceInitFunc) modest_account_mgr_init,
158 my_type = g_type_register_static (G_TYPE_OBJECT,
166 modest_account_mgr_class_init (ModestAccountMgrClass * klass)
168 GObjectClass *gobject_class;
169 gobject_class = (GObjectClass *) klass;
171 parent_class = g_type_class_peek_parent (klass);
172 gobject_class->finalize = modest_account_mgr_finalize;
174 g_type_class_add_private (gobject_class,
175 sizeof (ModestAccountMgrPrivate));
177 /* signal definitions */
178 signals[ACCOUNT_REMOVED_SIGNAL] =
179 g_signal_new ("account_removed",
180 G_TYPE_FROM_CLASS (klass),
182 G_STRUCT_OFFSET(ModestAccountMgrClass,account_removed),
184 modest_marshal_VOID__STRING_BOOLEAN,
185 G_TYPE_NONE, 2, G_TYPE_STRING, G_TYPE_BOOLEAN);
186 signals[ACCOUNT_CHANGED_SIGNAL] =
187 g_signal_new ("account_changed",
188 G_TYPE_FROM_CLASS (klass),
190 G_STRUCT_OFFSET(ModestAccountMgrClass,account_changed),
192 modest_marshal_VOID__STRING_STRING_BOOLEAN,
193 G_TYPE_NONE, 3, G_TYPE_STRING, G_TYPE_POINTER, G_TYPE_BOOLEAN);
198 modest_account_mgr_init (ModestAccountMgr * obj)
200 ModestAccountMgrPrivate *priv =
201 MODEST_ACCOUNT_MGR_GET_PRIVATE (obj);
203 priv->modest_conf = NULL;
205 priv->timeout = g_timeout_add (1000 /* milliseconds */, on_timeout_notify_changes, obj);
209 modest_account_mgr_finalize (GObject * obj)
211 ModestAccountMgrPrivate *priv =
212 MODEST_ACCOUNT_MGR_GET_PRIVATE (obj);
214 if (priv->modest_conf) {
215 g_object_unref (G_OBJECT(priv->modest_conf));
216 priv->modest_conf = NULL;
220 g_source_remove (priv->timeout);
222 if (priv->changed_conf_keys)
223 g_slist_free (priv->changed_conf_keys);
225 G_OBJECT_CLASS(parent_class)->finalize (obj);
230 modest_account_mgr_new (ModestConf *conf)
233 ModestAccountMgrPrivate *priv;
235 g_return_val_if_fail (conf, NULL);
237 obj = G_OBJECT (g_object_new (MODEST_TYPE_ACCOUNT_MGR, NULL));
238 priv = MODEST_ACCOUNT_MGR_GET_PRIVATE (obj);
240 g_object_ref (G_OBJECT(conf));
241 priv->modest_conf = conf;
243 g_signal_connect (G_OBJECT (conf), "key_changed",
244 G_CALLBACK (on_key_change),
247 return MODEST_ACCOUNT_MGR (obj);
252 null_means_empty (const gchar * str)
254 return str ? str : "";
259 modest_account_mgr_add_account (ModestAccountMgr *self,
261 const gchar *store_account,
262 const gchar *transport_account,
265 ModestAccountMgrPrivate *priv;
268 gchar *default_account;
271 g_return_val_if_fail (MODEST_IS_ACCOUNT_MGR(self), FALSE);
272 g_return_val_if_fail (name, FALSE);
273 g_return_val_if_fail (strchr(name, '/') == NULL, FALSE);
275 priv = MODEST_ACCOUNT_MGR_GET_PRIVATE (self);
278 * we create the account by adding an account 'dir', with the name <name>,
279 * and in that the 'display_name' string key
281 key = _modest_account_mgr_get_account_keyname (name, MODEST_ACCOUNT_DISPLAY_NAME, FALSE);
282 if (modest_account_mgr_account_exists (self, key, FALSE)) {
283 g_printerr ("modest: account already exists\n");
288 ok = modest_conf_set_string (priv->modest_conf, key, name, &err);
291 g_printerr ("modest: cannot set display name\n");
293 g_printerr ("modest: Error adding account conf: %s\n", err->message);
300 key = _modest_account_mgr_get_account_keyname (name, MODEST_ACCOUNT_STORE_ACCOUNT, FALSE);
301 ok = modest_conf_set_string (priv->modest_conf, key, store_account, &err);
304 g_printerr ("modest: failed to set store account '%s'\n",
307 g_printerr ("modest: Error adding store account conf: %s\n", err->message);
315 if (transport_account) {
316 key = _modest_account_mgr_get_account_keyname (name, MODEST_ACCOUNT_TRANSPORT_ACCOUNT,
318 ok = modest_conf_set_string (priv->modest_conf, key, transport_account, &err);
321 g_printerr ("modest: failed to set transport account '%s'\n",
324 g_printerr ("modest: Error adding transport account conf: %s\n", err->message);
331 /* Make sure that leave-messages-on-server is enabled by default,
332 * as per the UI spec, though it is only meaningful for accounts using POP.
333 * (possibly this gconf key should be under the server account): */
334 modest_account_mgr_set_bool (self, name,
335 MODEST_ACCOUNT_LEAVE_ON_SERVER, TRUE, FALSE /* not server account */);
338 modest_account_mgr_set_enabled (self, name, enabled);
340 /* if no default account has been defined yet, do so now */
341 default_account = modest_account_mgr_get_default_account (self);
342 if (!default_account)
343 modest_account_mgr_set_default_account (self, name);
344 g_free (default_account);
353 modest_account_mgr_add_server_account (ModestAccountMgr * self,
354 const gchar * name, const gchar *hostname,
356 const gchar * username, const gchar * password,
357 ModestTransportStoreProtocol proto,
358 ModestConnectionProtocol security,
359 ModestAuthProtocol auth)
361 ModestAccountMgrPrivate *priv;
366 g_return_val_if_fail (MODEST_IS_ACCOUNT_MGR(self), FALSE);
367 g_return_val_if_fail (name, FALSE);
368 g_return_val_if_fail (strchr(name, '/') == NULL, FALSE);
370 priv = MODEST_ACCOUNT_MGR_GET_PRIVATE (self);
373 key = _modest_account_mgr_get_account_keyname (name, MODEST_ACCOUNT_HOSTNAME, TRUE);
374 if (modest_conf_key_exists (priv->modest_conf, key, &err)) {
375 g_printerr ("modest: server account '%s' already exists\n", name);
382 modest_conf_set_string (priv->modest_conf, key, null_means_empty(hostname), &err);
384 g_printerr ("modest: failed to set %s: %s\n", key, err->message);
393 key = _modest_account_mgr_get_account_keyname (name, MODEST_ACCOUNT_USERNAME, TRUE);
394 ok = modest_conf_set_string (priv->modest_conf, key, null_means_empty (username), &err);
396 g_printerr ("modest: failed to set %s: %s\n", key, err->message);
406 key = _modest_account_mgr_get_account_keyname (name, MODEST_ACCOUNT_PASSWORD, TRUE);
407 ok = modest_conf_set_string (priv->modest_conf, key, null_means_empty (password), &err);
409 g_printerr ("modest: failed to set %s: %s\n", key, err->message);
418 key = _modest_account_mgr_get_account_keyname (name, MODEST_ACCOUNT_PROTO, TRUE);
419 ok = modest_conf_set_string (priv->modest_conf, key,
420 modest_protocol_info_get_transport_store_protocol_name(proto),
423 g_printerr ("modest: failed to set %s: %s\n", key, err->message);
433 key = _modest_account_mgr_get_account_keyname (name, MODEST_ACCOUNT_PORT, TRUE);
434 ok = modest_conf_set_int (priv->modest_conf, key, portnumber, &err);
436 g_printerr ("modest: failed to set %s: %s\n", key, err->message);
446 key = _modest_account_mgr_get_account_keyname (name, MODEST_ACCOUNT_AUTH_MECH, TRUE);
447 ok = modest_conf_set_string (priv->modest_conf, key,
448 modest_protocol_info_get_auth_protocol_name (auth),
451 g_printerr ("modest: failed to set %s: %s\n", key, err->message);
459 /* Add the security settings: */
460 modest_server_account_set_security (self, name, security);
464 g_printerr ("modest: failed to add server account\n");
471 /** modest_account_mgr_add_server_account_uri:
472 * Only used for mbox and maildir accounts.
475 modest_account_mgr_add_server_account_uri (ModestAccountMgr * self,
476 const gchar *name, ModestTransportStoreProtocol proto,
479 ModestAccountMgrPrivate *priv;
483 g_return_val_if_fail (MODEST_IS_ACCOUNT_MGR(self), FALSE);
484 g_return_val_if_fail (name, FALSE);
485 g_return_val_if_fail (strchr(name, '/') == NULL, FALSE);
486 g_return_val_if_fail (uri, FALSE);
488 priv = MODEST_ACCOUNT_MGR_GET_PRIVATE (self);
492 key = _modest_account_mgr_get_account_keyname (name, MODEST_ACCOUNT_PROTO, TRUE);
493 ok = modest_conf_set_string (priv->modest_conf, key,
494 modest_protocol_info_get_transport_store_protocol_name(proto),
499 g_printerr ("modest: failed to set proto\n");
504 key = _modest_account_mgr_get_account_keyname (name, MODEST_ACCOUNT_URI, TRUE);
505 ok = modest_conf_set_string (priv->modest_conf, key, uri, NULL);
509 g_printerr ("modest: failed to set uri\n");
518 modest_account_mgr_remove_account (ModestAccountMgr * self,
519 const gchar* name, gboolean server_account)
521 ModestAccountMgrPrivate *priv;
526 g_return_val_if_fail (MODEST_IS_ACCOUNT_MGR(self), FALSE);
527 g_return_val_if_fail (name, FALSE);
529 if (!modest_account_mgr_account_exists (self, name, server_account)) {
530 g_printerr ("modest: %s: account '%s' does not exist\n", __FUNCTION__, name);
534 /* Notify the observers. We need to do that here because they
535 could need to use the configuration keys before deleting
536 them, i.e., the account store will delete the cache. We
537 only notify about removals of modest accounts */
539 g_signal_emit (G_OBJECT(self), signals[ACCOUNT_REMOVED_SIGNAL], 0,
540 name, server_account);
542 /* in case we're deleting an account, also delete the dependent store and transport account */
543 if (!server_account) {
544 gchar *server_account_name;
546 server_account_name = modest_account_mgr_get_string (self, name, MODEST_ACCOUNT_STORE_ACCOUNT,
548 if (server_account_name) {
549 if (!modest_account_mgr_remove_account (self, server_account_name, TRUE))
550 g_printerr ("modest: failed to remove store account '%s' (%s)\n",
551 server_account_name, name);
552 g_free (server_account_name);
554 g_printerr ("modest: could not find the store account for %s\n", name);
556 server_account_name = modest_account_mgr_get_string (self, name, MODEST_ACCOUNT_TRANSPORT_ACCOUNT,
558 if (server_account_name) {
559 if (!modest_account_mgr_remove_account (self, server_account_name, TRUE))
560 g_printerr ("modest: failed to remove transport account '%s' (%s)\n",
561 server_account_name, name);
562 g_free (server_account_name);
564 g_printerr ("modest: could not find the transport account for %s\n", name);
567 priv = MODEST_ACCOUNT_MGR_GET_PRIVATE (self);
568 key = _modest_account_mgr_get_account_keyname (name, NULL, server_account);
570 retval = modest_conf_remove_key (priv->modest_conf, key, &err);
574 g_printerr ("modest: error removing key: %s\n", err->message);
578 /* If this was the default, then remove that setting: */
579 if (!server_account) {
580 gchar *default_account_name = modest_account_mgr_get_default_account (self);
581 if (default_account_name && (strcmp (default_account_name, name) == 0))
582 modest_account_mgr_unset_default_account (self);
583 g_free (default_account_name);
591 /* strip the first /n/ character from each element
592 * caller must make sure all elements are strings with
593 * length >= n, and also that data can be freed.
597 strip_prefix_from_elements (GSList * lst, guint n)
600 memmove (lst->data, lst->data + n,
601 strlen(lst->data) - n + 1);
609 modest_account_mgr_search_server_accounts (ModestAccountMgr * self,
610 const gchar * account_name,
611 ModestTransportStoreProtocol proto)
615 ModestAccountMgrPrivate *priv;
619 g_return_val_if_fail (self, NULL);
621 key = _modest_account_mgr_get_account_keyname (account_name, NULL, TRUE);
622 priv = MODEST_ACCOUNT_MGR_GET_PRIVATE (self);
624 /* get the list of all server accounts */
625 accounts = modest_conf_list_subkeys (priv->modest_conf, key, &err);
627 g_printerr ("modest: failed to get subkeys for '%s' (%s)\n", key,
633 /* filter out the ones with the wrong protocol */
634 /* we could optimize for unknown proto / unknown type, but it will only
635 * make the code more complex */
638 gchar *account = _modest_account_mgr_account_from_key ((gchar*)cursor->data, NULL, NULL);
639 gchar *acc_proto = modest_account_mgr_get_string (self, account, MODEST_ACCOUNT_PROTO,TRUE);
640 ModestTransportStoreProtocol this_proto =
641 modest_protocol_info_get_transport_store_protocol (acc_proto);
642 if (this_proto != MODEST_PROTOCOL_TRANSPORT_STORE_UNKNOWN && this_proto != proto) {
643 GSList *nxt = cursor->next;
644 accounts = g_slist_delete_link (accounts, cursor);
647 cursor = cursor->next;
653 /* +1 because we must remove the ending '/' as well */
654 strip_prefix_from_elements (accounts, strlen(key)+1);
660 modest_account_mgr_account_names (ModestAccountMgr * self, gboolean only_enabled)
663 ModestAccountMgrPrivate *priv;
666 const size_t prefix_len = strlen (MODEST_ACCOUNT_NAMESPACE "/");
668 g_return_val_if_fail (self, NULL);
670 priv = MODEST_ACCOUNT_MGR_GET_PRIVATE (self);
672 accounts = modest_conf_list_subkeys (priv->modest_conf,
673 MODEST_ACCOUNT_NAMESPACE, &err);
675 g_printerr ("modest: failed to get subkeys (%s): %s\n",
676 MODEST_ACCOUNT_NAMESPACE, err->message);
678 return NULL; /* assume accounts did not get value when err is set...*/
681 strip_prefix_from_elements (accounts, prefix_len);
683 GSList *result = NULL;
685 /* Unescape the keys to get the account names: */
686 GSList *iter = accounts;
691 const gchar* account_name_key = (const gchar*)iter->data;
692 /* printf ("DEBUG: %s: account_name_key=%s\n", __FUNCTION__, account_name_key); */
693 gchar* unescaped_name = account_name_key ?
694 modest_conf_key_unescape (account_name_key)
696 /* printf (" DEBUG: %s: unescaped name=%s\n", __FUNCTION__, unescaped_name); */
700 if (unescaped_name &&
701 !modest_account_mgr_get_enabled (self, unescaped_name)) {
707 result = g_slist_append (result, unescaped_name);
710 g_free (unescaped_name);
713 iter = g_slist_next (iter);
716 /* TODO: Free the strings too? */
717 g_slist_free (accounts);
725 modest_account_mgr_get_string (ModestAccountMgr *self, const gchar *name,
726 const gchar *key, gboolean server_account) {
728 ModestAccountMgrPrivate *priv;
734 g_return_val_if_fail (self, NULL);
735 g_return_val_if_fail (name, NULL);
736 g_return_val_if_fail (key, NULL);
738 keyname = _modest_account_mgr_get_account_keyname (name, key, server_account);
740 priv = MODEST_ACCOUNT_MGR_GET_PRIVATE (self);
741 retval = modest_conf_get_string (priv->modest_conf, keyname, &err);
743 g_printerr ("modest: error getting string '%s': %s\n", keyname, err->message);
754 modest_account_mgr_get_password (ModestAccountMgr *self, const gchar *name,
755 const gchar *key, gboolean server_account)
757 return modest_account_mgr_get_string (self, name, key, server_account);
764 modest_account_mgr_get_int (ModestAccountMgr *self, const gchar *name, const gchar *key,
765 gboolean server_account)
767 ModestAccountMgrPrivate *priv;
773 g_return_val_if_fail (MODEST_IS_ACCOUNT_MGR(self), -1);
774 g_return_val_if_fail (name, -1);
775 g_return_val_if_fail (key, -1);
777 keyname = _modest_account_mgr_get_account_keyname (name, key, server_account);
779 priv = MODEST_ACCOUNT_MGR_GET_PRIVATE (self);
780 retval = modest_conf_get_int (priv->modest_conf, keyname, &err);
782 g_printerr ("modest: error getting int '%s': %s\n", keyname, err->message);
794 modest_account_mgr_get_bool (ModestAccountMgr * self, const gchar *account,
795 const gchar * key, gboolean server_account)
797 ModestAccountMgrPrivate *priv;
803 g_return_val_if_fail (MODEST_IS_ACCOUNT_MGR(self), FALSE);
804 g_return_val_if_fail (account, FALSE);
805 g_return_val_if_fail (key, FALSE);
807 keyname = _modest_account_mgr_get_account_keyname (account, key, server_account);
809 priv = MODEST_ACCOUNT_MGR_GET_PRIVATE (self);
810 retval = modest_conf_get_bool (priv->modest_conf, keyname, &err);
812 g_printerr ("modest: error getting bool '%s': %s\n", keyname, err->message);
824 modest_account_mgr_get_list (ModestAccountMgr *self, const gchar *name,
825 const gchar *key, ModestConfValueType list_type,
826 gboolean server_account)
828 ModestAccountMgrPrivate *priv;
834 g_return_val_if_fail (MODEST_IS_ACCOUNT_MGR(self), NULL);
835 g_return_val_if_fail (name, NULL);
836 g_return_val_if_fail (key, NULL);
838 keyname = _modest_account_mgr_get_account_keyname (name, key, server_account);
840 priv = MODEST_ACCOUNT_MGR_GET_PRIVATE (self);
841 retval = modest_conf_get_list (priv->modest_conf, keyname, list_type, &err);
843 g_printerr ("modest: error getting list '%s': %s\n", keyname,
855 modest_account_mgr_set_string (ModestAccountMgr * self, const gchar * name,
856 const gchar * key, const gchar * val, gboolean server_account)
858 ModestAccountMgrPrivate *priv;
864 g_return_val_if_fail (MODEST_IS_ACCOUNT_MGR(self), FALSE);
865 g_return_val_if_fail (name, FALSE);
866 g_return_val_if_fail (key, FALSE);
868 keyname = _modest_account_mgr_get_account_keyname (name, key, server_account);
870 priv = MODEST_ACCOUNT_MGR_GET_PRIVATE (self);
872 retval = modest_conf_set_string (priv->modest_conf, keyname, val, &err);
874 g_printerr ("modest: error setting string '%s': %s\n", keyname, err->message);
884 modest_account_mgr_set_password (ModestAccountMgr * self, const gchar * name,
885 const gchar * key, const gchar * val, gboolean server_account)
887 return modest_account_mgr_set_password (self, name, key, val, server_account);
893 modest_account_mgr_set_int (ModestAccountMgr * self, const gchar * name,
894 const gchar * key, int val, gboolean server_account)
896 ModestAccountMgrPrivate *priv;
902 g_return_val_if_fail (MODEST_IS_ACCOUNT_MGR(self), FALSE);
903 g_return_val_if_fail (name, FALSE);
904 g_return_val_if_fail (key, FALSE);
906 keyname = _modest_account_mgr_get_account_keyname (name, key, server_account);
908 priv = MODEST_ACCOUNT_MGR_GET_PRIVATE (self);
910 retval = modest_conf_set_int (priv->modest_conf, keyname, val, &err);
912 g_printerr ("modest: error setting int '%s': %s\n", keyname, err->message);
923 modest_account_mgr_set_bool (ModestAccountMgr * self, const gchar * name,
924 const gchar * key, gboolean val, gboolean server_account)
926 ModestAccountMgrPrivate *priv;
932 g_return_val_if_fail (MODEST_IS_ACCOUNT_MGR(self), FALSE);
933 g_return_val_if_fail (name, FALSE);
934 g_return_val_if_fail (key, FALSE);
936 keyname = _modest_account_mgr_get_account_keyname (name, key, server_account);
938 priv = MODEST_ACCOUNT_MGR_GET_PRIVATE (self);
940 retval = modest_conf_set_bool (priv->modest_conf, keyname, val, &err);
942 g_printerr ("modest: error setting bool '%s': %s\n", keyname, err->message);
952 modest_account_mgr_set_list (ModestAccountMgr *self,
956 ModestConfValueType list_type,
957 gboolean server_account)
959 ModestAccountMgrPrivate *priv;
964 g_return_val_if_fail (self, FALSE);
965 g_return_val_if_fail (name, FALSE);
966 g_return_val_if_fail (key, FALSE);
967 g_return_val_if_fail (val, FALSE);
969 keyname = _modest_account_mgr_get_account_keyname (name, key, server_account);
971 priv = MODEST_ACCOUNT_MGR_GET_PRIVATE (self);
972 retval = modest_conf_set_list (priv->modest_conf, keyname, val, list_type, &err);
974 g_printerr ("modest: error setting list '%s': %s\n", keyname, err->message);
984 modest_account_mgr_account_exists (ModestAccountMgr * self, const gchar * name,
985 gboolean server_account)
987 ModestAccountMgrPrivate *priv;
993 g_return_val_if_fail (MODEST_IS_ACCOUNT_MGR(self), FALSE);
994 g_return_val_if_fail (name, FALSE);
996 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,
1010 gboolean modest_account_mgr_account_with_display_name_exists (ModestAccountMgr *self,
1011 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);