1 /* modest-account-mgr.c */
3 /* insert (c)/licensing information) */
6 #include "modest-account-mgr.h"
8 /* 'private'/'protected' functions */
9 static void modest_account_mgr_class_init (ModestAccountMgrClass *klass);
10 static void modest_account_mgr_init (ModestAccountMgr *obj);
11 static void modest_account_mgr_finalize (GObject *obj);
13 static gchar* get_account_keyname (const gchar *accname, const gchar *name);
14 static gchar* get_server_account_keyname (const gchar *accname, const gchar *name);
15 static gchar* get_identity_keyname (const gchar *accname, const gchar *name);
24 typedef struct _ModestAccountMgrPrivate ModestAccountMgrPrivate;
25 struct _ModestAccountMgrPrivate {
26 ModestConf *modest_conf;
28 #define MODEST_ACCOUNT_MGR_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE((o), \
29 MODEST_TYPE_ACCOUNT_MGR, \
30 ModestAccountMgrPrivate))
32 static GObjectClass *parent_class = NULL;
34 /* uncomment the following if you have defined any signals */
35 /* static guint signals[LAST_SIGNAL] = {0}; */
38 modest_account_mgr_get_type (void)
40 static GType my_type = 0;
42 static const GTypeInfo my_info = {
43 sizeof(ModestAccountMgrClass),
45 NULL, /* base finalize */
46 (GClassInitFunc) modest_account_mgr_class_init,
47 NULL, /* class finalize */
48 NULL, /* class data */
49 sizeof(ModestAccountMgr),
51 (GInstanceInitFunc) modest_account_mgr_init,
54 my_type = g_type_register_static (G_TYPE_OBJECT,
62 modest_account_mgr_class_init (ModestAccountMgrClass *klass)
64 GObjectClass *gobject_class;
65 gobject_class = (GObjectClass*) klass;
67 parent_class = g_type_class_peek_parent (klass);
68 gobject_class->finalize = modest_account_mgr_finalize;
70 g_type_class_add_private (gobject_class, sizeof(ModestAccountMgrPrivate));
72 /* signal definitions go here, e.g.: */
73 /* signals[MY_SIGNAL_1] = */
74 /* g_signal_new ("my_signal_1",....); */
75 /* signals[MY_SIGNAL_2] = */
76 /* g_signal_new ("my_signal_2",....); */
82 modest_account_mgr_init (ModestAccountMgr *obj)
84 ModestAccountMgrPrivate *priv = MODEST_ACCOUNT_MGR_GET_PRIVATE(obj);
85 priv->modest_conf = NULL;
89 modest_account_mgr_finalize (GObject *obj)
91 ModestAccountMgr *self = MODEST_ACCOUNT_MGR(obj);
92 ModestAccountMgrPrivate *priv = MODEST_ACCOUNT_MGR_GET_PRIVATE(self);
94 g_object_unref (G_OBJECT(priv->modest_conf));
95 priv->modest_conf = NULL;
99 modest_account_mgr_new (ModestConf *conf)
102 ModestAccountMgrPrivate *priv;
104 g_return_val_if_fail (conf, NULL);
106 obj = G_OBJECT(g_object_new(MODEST_TYPE_ACCOUNT_MGR, NULL));
107 priv = MODEST_ACCOUNT_MGR_GET_PRIVATE(obj);
110 * increase the ref count on the modest_conf. Normally, the
111 * ModestConf should outlive the ModestAccountMgr though
113 g_object_ref(G_OBJECT(priv->modest_conf = conf));
120 modest_account_mgr_add_account (ModestAccountMgr *self, const gchar* name,
121 const gchar *store_account,
122 const gchar *transport_account,
125 ModestAccountMgrPrivate *priv;
129 g_return_val_if_fail (self, FALSE);
130 g_return_val_if_fail (name, FALSE);
132 if (modest_account_mgr_account_exists (self, name, err)) {
133 g_warning ("account already exists");
137 * we create the account by adding an account 'dir', with the name <name>,
138 * and in that the 'display_name' string key
140 priv = MODEST_ACCOUNT_MGR_GET_PRIVATE(self);
142 key = get_account_keyname (name, MODEST_ACCOUNT_DISPLAY_NAME);
143 modest_conf_set_string (priv->modest_conf, key, name, err);
147 key = get_account_keyname (name, MODEST_ACCOUNT_STORE_ACCOUNT);
148 modest_conf_set_string (priv->modest_conf, key, store_account, err);
152 if (transport_account) {
153 key = get_account_keyname (name, MODEST_ACCOUNT_TRANSPORT_ACCOUNT);
154 modest_conf_set_string (priv->modest_conf, key, transport_account, err);
158 return TRUE; /* TODO: error handling */
163 modest_account_mgr_remove_account (ModestAccountMgr *self, const gchar* name,
166 ModestAccountMgrPrivate *priv;
170 g_return_val_if_fail (self, FALSE);
171 g_return_val_if_fail (name, FALSE);
173 if (!modest_account_mgr_account_exists (self, name, err)) {
174 g_warning ("account doest not exist");
178 priv = MODEST_ACCOUNT_MGR_GET_PRIVATE(self);
179 key = get_account_keyname (name, NULL);
181 retval = modest_conf_remove_key (priv->modest_conf, key, NULL);
189 null_means_empty(const gchar* str)
191 return str ? str : "";
196 modest_account_mgr_add_server_account (ModestAccountMgr *self,
198 const gchar *hostname,
199 const gchar *username,
200 const gchar *password,
203 ModestAccountMgrPrivate *priv;
206 g_return_val_if_fail (self, FALSE);
207 g_return_val_if_fail (name, FALSE);
209 /* TODO: check already exists */
211 priv = MODEST_ACCOUNT_MGR_GET_PRIVATE(self);
212 acckey = g_strconcat (MODEST_SERVER_ACCOUNT_NAMESPACE, "/",
215 if (modest_conf_key_exists(priv->modest_conf, acckey, NULL)) {
216 g_warning ("server account %s already exists", name);
222 key = g_strconcat (acckey, "/", MODEST_ACCOUNT_HOSTNAME, NULL);
223 modest_conf_set_string (priv->modest_conf, key,
224 null_means_empty(hostname), NULL);
228 key = g_strconcat (acckey, "/", MODEST_ACCOUNT_USERNAME, NULL);
229 modest_conf_set_string (priv->modest_conf, key,
230 null_means_empty(username), NULL);
236 key = g_strconcat (acckey, "/", MODEST_ACCOUNT_PASSWORD, NULL);
237 modest_conf_set_string (priv->modest_conf, key,
238 null_means_empty(password), NULL);
243 key = g_strconcat (acckey, "/", MODEST_ACCOUNT_PROTO, NULL);
244 modest_conf_set_string (priv->modest_conf, key,
245 null_means_empty(proto),
250 return TRUE; /* FIXME: better error checking */
254 modest_account_mgr_remove_server_account (ModestAccountMgr *self,
258 ModestAccountMgrPrivate *priv;
262 g_return_val_if_fail (self, FALSE);
263 g_return_val_if_fail (name, FALSE);
265 priv = MODEST_ACCOUNT_MGR_GET_PRIVATE(self);
267 acckey = g_strconcat (MODEST_SERVER_ACCOUNT_NAMESPACE, "/",
270 if (!modest_conf_key_exists(priv->modest_conf, acckey, NULL)) {
271 g_warning ("server account %s does not exist exist", name);
276 retval = modest_conf_remove_key (priv->modest_conf, acckey, NULL);
283 modest_account_mgr_remove_identity (ModestAccountMgr *self,
287 ModestAccountMgrPrivate *priv;
291 g_return_val_if_fail (self, FALSE);
292 g_return_val_if_fail (name, FALSE);
294 priv = MODEST_ACCOUNT_MGR_GET_PRIVATE(self);
296 acckey = g_strconcat (MODEST_IDENTITY_NAMESPACE, "/",
299 if (!modest_conf_key_exists(priv->modest_conf, acckey, NULL)) {
300 g_warning ("server account %s does not exist exist", name);
305 retval = modest_conf_remove_key (priv->modest_conf, acckey, NULL);
314 modest_account_mgr_add_identity (ModestAccountMgr *self,
317 const gchar *replyto,
318 const gchar *signature,
319 const gboolean use_signature,
321 const gboolean use_id_via)
323 ModestAccountMgrPrivate *priv;
326 g_return_val_if_fail (self, FALSE);
327 g_return_val_if_fail (name, FALSE);
329 /* TODO: check already exists */
331 priv = MODEST_ACCOUNT_MGR_GET_PRIVATE(self);
332 id_key = g_strconcat (MODEST_IDENTITY_NAMESPACE, "/",
335 if (modest_conf_key_exists(priv->modest_conf, id_key, NULL)) {
336 g_warning ("identity %s already exists", name);
342 key = g_strconcat (id_key, "/", MODEST_ACCOUNT_EMAIL, NULL);
343 modest_conf_set_string (priv->modest_conf, key,
344 null_means_empty(email), NULL);
348 key = g_strconcat (id_key, "/", MODEST_ACCOUNT_REPLYTO, NULL);
349 modest_conf_set_string (priv->modest_conf, key,
350 null_means_empty(replyto), NULL);
354 key = g_strconcat (id_key, "/", MODEST_ACCOUNT_SIGNATURE, NULL);
355 modest_conf_set_string (priv->modest_conf, key,
356 null_means_empty(signature), NULL);
360 key = g_strconcat (id_key, "/", MODEST_ACCOUNT_USE_SIGNATURE, NULL);
361 modest_conf_set_bool (priv->modest_conf, key,
362 use_signature, NULL);
366 key = g_strconcat (id_key, "/", MODEST_ACCOUNT_ID_VIA, NULL);
367 modest_conf_set_string (priv->modest_conf, key,
368 null_means_empty(id_via), NULL);
372 key = g_strconcat (id_key, "/", MODEST_ACCOUNT_USE_ID_VIA, NULL);
373 modest_conf_set_bool (priv->modest_conf, key,
378 return TRUE; /* FIXME: better error checking */
381 /* strip the first /n/ character from each element */
382 /* caller must make sure all elements are strings with
383 * length >= n, and also that data can be freed.
386 strip_prefix_from_elements (GSList *lst, guint n)
388 GSList *cursor = lst;
390 gchar *str = (gchar*)cursor->data;
391 cursor->data = g_strdup (str + n);
393 cursor = cursor->next;
401 modest_account_mgr_server_account_names (ModestAccountMgr *self,
402 const gchar* account_name,
403 ModestProtoType type,
405 gboolean only_enabled)
409 ModestAccountMgrPrivate *priv;
410 const size_t prefix_len =
411 strlen (MODEST_SERVER_ACCOUNT_NAMESPACE "/");
413 g_return_val_if_fail (self, NULL);
415 priv = MODEST_ACCOUNT_MGR_GET_PRIVATE(self);
416 accounts = modest_conf_list_subkeys (priv->modest_conf,
417 MODEST_SERVER_ACCOUNT_NAMESPACE,
420 /* no restrictions, return everything */
421 if (type == MODEST_PROTO_TYPE_ANY && !proto)
422 return strip_prefix_from_elements (accounts,prefix_len);
424 /* otherwise, filter out the none-matching ones */
427 gchar *keyspace, *proto_key, *acc_proto;
429 keyspace = (gchar*) cursor->data;
430 proto_key = g_strconcat (keyspace, "/", MODEST_ACCOUNT_PROTO, NULL);
431 acc_proto = modest_conf_get_string (priv->modest_conf, proto_key,
435 if ((!acc_proto) || /* proto not defined? */
436 (type != MODEST_PROTO_TYPE_ANY && /* proto type ... */
437 modest_proto_type (acc_proto) != type) || /* ... matches? */
438 (proto && strcmp(proto,acc_proto) != 0)) { /* proto matches? */
439 /* no match: remove from the list */
440 GSList *nxt = cursor->next;
442 accounts = g_slist_delete_link (accounts, cursor);
445 cursor = cursor->next;
448 return strip_prefix_from_elements (accounts, prefix_len);
454 modest_account_mgr_account_names (ModestAccountMgr *self, GError **err)
456 GSList *accounts, *cursor;
457 ModestAccountMgrPrivate *priv;
458 const size_t prefix_len =
459 strlen (MODEST_ACCOUNT_NAMESPACE "/");
462 g_return_val_if_fail (self, NULL);
464 priv = MODEST_ACCOUNT_MGR_GET_PRIVATE(self);
466 accounts = modest_conf_list_subkeys (priv->modest_conf,
467 MODEST_ACCOUNT_NAMESPACE,
469 return strip_prefix_from_elements (accounts, prefix_len);
475 get_account_string (ModestAccountMgr *self, const gchar *name,
476 const gchar *key, gboolean server_account,
479 ModestAccountMgrPrivate *priv;
484 g_return_val_if_fail (self, NULL);
485 g_return_val_if_fail (name, NULL);
486 g_return_val_if_fail (key, NULL);
489 keyname = get_server_account_keyname (name, key);
491 keyname = get_account_keyname (name, key);
493 priv = MODEST_ACCOUNT_MGR_GET_PRIVATE(self);
494 retval = modest_conf_get_string (priv->modest_conf,keyname,err);
502 modest_account_mgr_get_server_account_string (ModestAccountMgr *self, const gchar *name,
503 const gchar *key, GError **err)
505 return get_account_string (self, name, key, TRUE, err);
509 modest_account_mgr_get_account_string (ModestAccountMgr *self, const gchar *name,
510 const gchar *key, GError **err)
512 return get_account_string (self, name, key, FALSE, err);
516 modest_account_mgr_get_identity_string (ModestAccountMgr *self, const gchar *name,
517 const gchar *key, GError **err)
519 ModestAccountMgrPrivate *priv;
524 g_return_val_if_fail (self, NULL);
525 g_return_val_if_fail (name, NULL);
526 g_return_val_if_fail (key, NULL);
528 keyname = get_identity_keyname (name, key);
530 priv = MODEST_ACCOUNT_MGR_GET_PRIVATE(self);
531 retval = modest_conf_get_string (priv->modest_conf,keyname,err);
539 get_account_int (ModestAccountMgr *self, const gchar *name,
540 const gchar *key, gboolean server_account,
543 ModestAccountMgrPrivate *priv;
548 g_return_val_if_fail (self, -1);
549 g_return_val_if_fail (name, -1);
550 g_return_val_if_fail (key, -1);
553 keyname = get_server_account_keyname (name, key);
555 keyname = get_account_keyname (name, key);
557 priv = MODEST_ACCOUNT_MGR_GET_PRIVATE(self);
558 retval = modest_conf_get_int (priv->modest_conf,keyname,err);
566 modest_account_mgr_get_server_account_int (ModestAccountMgr *self, const gchar *name,
567 const gchar *key, GError **err)
569 return get_account_int (self, name, key, TRUE, err);
573 modest_account_mgr_get_account_int (ModestAccountMgr *self, const gchar *name,
574 const gchar *key, GError **err)
576 return get_account_int (self, name, key, FALSE, err);
582 get_account_bool (ModestAccountMgr *self, const gchar *name,
583 const gchar *key, gboolean server_account,
586 ModestAccountMgrPrivate *priv;
591 g_return_val_if_fail (self, -1);
592 g_return_val_if_fail (name, -1);
593 g_return_val_if_fail (key, -1);
596 keyname = get_server_account_keyname (name, key);
598 keyname = get_account_keyname (name, key);
600 priv = MODEST_ACCOUNT_MGR_GET_PRIVATE(self);
601 retval = modest_conf_get_int (priv->modest_conf,keyname,err);
610 modest_account_mgr_get_server_account_bool (ModestAccountMgr *self, const gchar *name,
611 const gchar *key, GError **err)
613 return get_account_bool (self, name, key, TRUE, err);
617 modest_account_mgr_get_account_bool (ModestAccountMgr *self, const gchar *name,
618 const gchar *key, GError **err)
620 return get_account_bool (self, name, key, FALSE, err);
628 set_account_string (ModestAccountMgr *self, const gchar *name,
629 const gchar *key, const gchar* val, gboolean server_account,
632 ModestAccountMgrPrivate *priv;
637 g_return_val_if_fail (self, FALSE);
638 g_return_val_if_fail (name, FALSE);
639 g_return_val_if_fail (key, FALSE);
642 keyname = get_server_account_keyname (name, key);
644 keyname = get_account_keyname (name, key);
646 priv = MODEST_ACCOUNT_MGR_GET_PRIVATE(self);
648 retval = modest_conf_set_string (priv->modest_conf,keyname,val,err);
659 modest_account_mgr_set_server_account_string (ModestAccountMgr *self, const gchar *name,
660 const gchar *key, const gchar* val,
663 return set_account_string (self, name, key, val, TRUE, err);
669 modest_account_mgr_set_account_string (ModestAccountMgr *self, const gchar *name,
670 const gchar *key, const gchar* val,
673 return set_account_string (self, name, key, val, FALSE, err);
678 set_account_int (ModestAccountMgr *self, const gchar *name,
679 const gchar *key, gboolean server_account, int val,
682 ModestAccountMgrPrivate *priv;
687 g_return_val_if_fail (self, FALSE);
688 g_return_val_if_fail (name, FALSE);
689 g_return_val_if_fail (key, FALSE);
692 keyname = get_server_account_keyname (name, key);
694 keyname = get_account_keyname (name, key);
696 priv = MODEST_ACCOUNT_MGR_GET_PRIVATE(self);
698 retval = modest_conf_set_int (priv->modest_conf,keyname,val,err);
707 modest_account_mgr_set_server_account_int (ModestAccountMgr *self, const gchar *name,
708 const gchar *key, int val,
711 return set_account_int (self, name, key, val, TRUE, err);
716 modest_account_mgr_set_account_int (ModestAccountMgr *self, const gchar *name,
717 const gchar *key, int val,
720 return set_account_int (self, name, key, val, FALSE, err);
727 set_account_bool (ModestAccountMgr *self, const gchar *name,
728 const gchar *key, gboolean server_account, gboolean val,
731 ModestAccountMgrPrivate *priv;
736 g_return_val_if_fail (self, FALSE);
737 g_return_val_if_fail (name, FALSE);
738 g_return_val_if_fail (key, FALSE);
741 keyname = get_server_account_keyname (name, key);
743 keyname = get_account_keyname (name, key);
745 priv = MODEST_ACCOUNT_MGR_GET_PRIVATE(self);
747 retval = modest_conf_set_bool (priv->modest_conf,keyname,val,err);
755 modest_account_mgr_set_server_account_bool (ModestAccountMgr *self, const gchar *name,
756 const gchar *key, gboolean val,
759 return set_account_bool (self, name, key, val, TRUE, err);
765 modest_account_mgr_set_account_bool (ModestAccountMgr *self, const gchar *name,
766 const gchar *key, gboolean val,
769 return set_account_bool (self, name, key, val, FALSE, err);
777 account_exists (ModestAccountMgr *self, const gchar *name, gboolean server_account,
780 ModestAccountMgrPrivate *priv;
785 g_return_val_if_fail (self, FALSE);
786 g_return_val_if_fail (name, FALSE);
789 keyname = get_account_keyname (name, NULL);
791 keyname = get_server_account_keyname (name, NULL);
793 priv = MODEST_ACCOUNT_MGR_GET_PRIVATE(self);
794 retval = modest_conf_key_exists (priv->modest_conf,keyname,err);
802 modest_account_mgr_server_account_exists (ModestAccountMgr *self, const gchar *name,
805 return account_exists (self, name, TRUE, err);
810 modest_account_mgr_account_exists (ModestAccountMgr *self, const gchar *name,
813 return account_exists (self, name, FALSE, err);
817 modest_account_mgr_identity_exists (ModestAccountMgr *self, const gchar *name,
820 return account_exists (self, name, TRUE, err);
825 /* must be freed by caller */
827 get_account_keyname (const gchar *accname, const gchar *name)
831 (MODEST_ACCOUNT_NAMESPACE, "/",
832 accname, "/", name, NULL);
835 (MODEST_ACCOUNT_NAMESPACE, "/",
840 /* must be freed by caller */
842 get_server_account_keyname (const gchar *accname, const gchar *name)
846 (MODEST_SERVER_ACCOUNT_NAMESPACE, "/",
847 accname, "/", name, NULL);
850 (MODEST_SERVER_ACCOUNT_NAMESPACE, "/",
854 /* must be freed by caller */
856 get_identity_keyname (const gchar *accname, const gchar *name)
860 (MODEST_IDENTITY_NAMESPACE "/",
861 accname, "/", name, NULL);
864 (MODEST_IDENTITY_NAMESPACE, "/",