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);
23 typedef struct _ModestAccountMgrPrivate ModestAccountMgrPrivate;
24 struct _ModestAccountMgrPrivate {
25 ModestConf *modest_conf;
27 #define MODEST_ACCOUNT_MGR_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE((o), \
28 MODEST_TYPE_ACCOUNT_MGR, \
29 ModestAccountMgrPrivate))
31 static GObjectClass *parent_class = NULL;
33 /* uncomment the following if you have defined any signals */
34 /* static guint signals[LAST_SIGNAL] = {0}; */
37 modest_account_mgr_get_type (void)
39 static GType my_type = 0;
41 static const GTypeInfo my_info = {
42 sizeof(ModestAccountMgrClass),
44 NULL, /* base finalize */
45 (GClassInitFunc) modest_account_mgr_class_init,
46 NULL, /* class finalize */
47 NULL, /* class data */
48 sizeof(ModestAccountMgr),
50 (GInstanceInitFunc) modest_account_mgr_init,
53 my_type = g_type_register_static (G_TYPE_OBJECT,
61 modest_account_mgr_class_init (ModestAccountMgrClass *klass)
63 GObjectClass *gobject_class;
64 gobject_class = (GObjectClass*) klass;
66 parent_class = g_type_class_peek_parent (klass);
67 gobject_class->finalize = modest_account_mgr_finalize;
69 g_type_class_add_private (gobject_class, sizeof(ModestAccountMgrPrivate));
71 /* signal definitions go here, e.g.: */
72 /* signals[MY_SIGNAL_1] = */
73 /* g_signal_new ("my_signal_1",....); */
74 /* signals[MY_SIGNAL_2] = */
75 /* g_signal_new ("my_signal_2",....); */
81 modest_account_mgr_init (ModestAccountMgr *obj)
83 ModestAccountMgrPrivate *priv = MODEST_ACCOUNT_MGR_GET_PRIVATE(obj);
84 priv->modest_conf = NULL;
88 modest_account_mgr_finalize (GObject *obj)
90 ModestAccountMgr *self = MODEST_ACCOUNT_MGR(obj);
91 ModestAccountMgrPrivate *priv = MODEST_ACCOUNT_MGR_GET_PRIVATE(self);
93 g_object_unref (G_OBJECT(priv->modest_conf));
94 priv->modest_conf = NULL;
98 modest_account_mgr_new (ModestConf *conf)
101 ModestAccountMgrPrivate *priv;
103 g_return_val_if_fail (conf, NULL);
105 obj = G_OBJECT(g_object_new(MODEST_TYPE_ACCOUNT_MGR, NULL));
106 priv = MODEST_ACCOUNT_MGR_GET_PRIVATE(obj);
109 * increase the ref count on the modest_conf. Normally, the
110 * ModestConf should outlive the ModestAccountMgr though
112 g_object_ref(G_OBJECT(priv->modest_conf = conf));
119 modest_account_mgr_add_account (ModestAccountMgr *self, const gchar* name,
120 const gchar *store_account,
121 const gchar *transport_account,
124 ModestAccountMgrPrivate *priv;
128 g_return_val_if_fail (self, FALSE);
129 g_return_val_if_fail (name, FALSE);
131 if (modest_account_mgr_account_exists (self, name, err)) {
132 g_warning ("account already exists");
136 * we create the account by adding an account 'dir', with the name <name>,
137 * and in that the 'display_name' string key
139 priv = MODEST_ACCOUNT_MGR_GET_PRIVATE(self);
141 key = get_account_keyname (name, MODEST_ACCOUNT_DISPLAY_NAME);
142 modest_conf_set_string (priv->modest_conf, key, name, err);
146 key = get_account_keyname (name, MODEST_ACCOUNT_STORE_ACCOUNT);
147 modest_conf_set_string (priv->modest_conf, key, store_account, err);
151 if (transport_account) {
152 key = get_account_keyname (name, MODEST_ACCOUNT_TRANSPORT_ACCOUNT);
153 modest_conf_set_string (priv->modest_conf, key, transport_account, err);
157 return TRUE; /* TODO: error handling */
162 modest_account_mgr_remove_account (ModestAccountMgr *self, const gchar* name,
165 ModestAccountMgrPrivate *priv;
169 g_return_val_if_fail (self, FALSE);
170 g_return_val_if_fail (name, FALSE);
172 if (!modest_account_mgr_account_exists (self, name, err)) {
173 g_warning ("account doest not exist");
177 priv = MODEST_ACCOUNT_MGR_GET_PRIVATE(self);
178 key = get_account_keyname (name, NULL);
180 retval = modest_conf_remove_key (priv->modest_conf, key, NULL);
188 null_means_empty(const gchar* str)
190 return str ? str : "";
195 modest_account_mgr_add_server_account (ModestAccountMgr *self,
197 const gchar *hostname,
198 const gchar *username,
199 const gchar *password,
202 ModestAccountMgrPrivate *priv;
205 g_return_val_if_fail (self, FALSE);
206 g_return_val_if_fail (name, FALSE);
208 /* TODO: check already exists */
210 priv = MODEST_ACCOUNT_MGR_GET_PRIVATE(self);
211 acckey = g_strconcat (MODEST_SERVER_ACCOUNT_NAMESPACE, "/",
214 if (modest_conf_key_exists(priv->modest_conf, acckey, NULL)) {
215 g_warning ("server account %s already exists", name);
221 key = g_strconcat (acckey, "/", MODEST_ACCOUNT_HOSTNAME, NULL);
222 modest_conf_set_string (priv->modest_conf, key,
223 null_means_empty(hostname), NULL);
227 key = g_strconcat (acckey, "/", MODEST_ACCOUNT_USERNAME, NULL);
228 modest_conf_set_string (priv->modest_conf, key,
229 null_means_empty(username), NULL);
235 key = g_strconcat (acckey, "/", MODEST_ACCOUNT_PASSWORD, NULL);
236 modest_conf_set_string (priv->modest_conf, key,
237 null_means_empty(password), NULL);
242 key = g_strconcat (acckey, "/", MODEST_ACCOUNT_PROTO, NULL);
243 modest_conf_set_string (priv->modest_conf, key,
244 null_means_empty(proto),
248 return TRUE; /* FIXME: better error checking */
252 modest_account_mgr_remove_server_account (ModestAccountMgr *self,
256 ModestAccountMgrPrivate *priv;
260 g_return_val_if_fail (self, FALSE);
261 g_return_val_if_fail (name, FALSE);
263 priv = MODEST_ACCOUNT_MGR_GET_PRIVATE(self);
265 acckey = g_strconcat (MODEST_SERVER_ACCOUNT_NAMESPACE, "/",
268 if (!modest_conf_key_exists(priv->modest_conf, acckey, NULL)) {
269 g_warning ("server account %s does not exist exist", name);
274 retval = modest_conf_remove_key (priv->modest_conf, acckey, NULL);
281 /* strip the first /n/ character from each element */
282 /* caller must make sure all elements are strings with
283 * length >= n, and also that data can be freed.
286 strip_prefix_from_elements (GSList *lst, guint n)
288 GSList *cursor = lst;
290 gchar *str = (gchar*)cursor->data;
291 cursor->data = g_strdup (str + n);
293 cursor = cursor->next;
301 modest_account_mgr_server_account_names (ModestAccountMgr *self,
302 const gchar* account_name,
303 ModestProtoType type,
305 gboolean only_enabled)
309 ModestAccountMgrPrivate *priv;
310 const size_t prefix_len =
311 strlen (MODEST_SERVER_ACCOUNT_NAMESPACE "/");
313 g_return_val_if_fail (self, NULL);
315 priv = MODEST_ACCOUNT_MGR_GET_PRIVATE(self);
316 accounts = modest_conf_list_subkeys (priv->modest_conf,
317 MODEST_SERVER_ACCOUNT_NAMESPACE,
320 /* no restrictions, return everything */
321 if (type == MODEST_PROTO_TYPE_ANY && !proto)
322 return strip_prefix_from_elements (accounts,prefix_len);
324 /* otherwise, filter out the none-matching ones */
327 gchar *keyspace, *proto_key, *acc_proto;
329 keyspace = (gchar*) cursor->data;
330 proto_key = g_strconcat (keyspace, "/", MODEST_ACCOUNT_PROTO, NULL);
331 acc_proto = modest_conf_get_string (priv->modest_conf, proto_key,
335 if ((!acc_proto) || /* proto not defined? */
336 (type != MODEST_PROTO_TYPE_ANY && /* proto type ... */
337 modest_proto_type (acc_proto) != type) || /* ... matches? */
338 (proto && strcmp(proto,acc_proto) != 0)) { /* proto matches? */
339 /* no match: remove from the list */
340 GSList *nxt = cursor->next;
342 accounts = g_slist_delete_link (accounts, cursor);
345 cursor = cursor->next;
348 return strip_prefix_from_elements (accounts, prefix_len);
354 modest_account_mgr_account_names (ModestAccountMgr *self, GError **err)
356 GSList *accounts, *cursor;
357 ModestAccountMgrPrivate *priv;
358 const size_t prefix_len =
359 strlen (MODEST_ACCOUNT_NAMESPACE "/");
362 g_return_val_if_fail (self, NULL);
364 priv = MODEST_ACCOUNT_MGR_GET_PRIVATE(self);
366 accounts = modest_conf_list_subkeys (priv->modest_conf,
367 MODEST_ACCOUNT_NAMESPACE,
369 return strip_prefix_from_elements (accounts, prefix_len);
375 get_account_string (ModestAccountMgr *self, const gchar *name,
376 const gchar *key, gboolean server_account,
379 ModestAccountMgrPrivate *priv;
384 g_return_val_if_fail (self, NULL);
385 g_return_val_if_fail (name, NULL);
386 g_return_val_if_fail (key, NULL);
389 keyname = get_server_account_keyname (name, key);
391 keyname = get_account_keyname (name, key);
393 priv = MODEST_ACCOUNT_MGR_GET_PRIVATE(self);
394 retval = modest_conf_get_string (priv->modest_conf,keyname,err);
402 modest_account_mgr_get_server_account_string (ModestAccountMgr *self, const gchar *name,
403 const gchar *key, GError **err)
405 return get_account_string (self, name, key, TRUE, err);
409 modest_account_mgr_get_account_string (ModestAccountMgr *self, const gchar *name,
410 const gchar *key, GError **err)
412 return get_account_string (self, name, key, FALSE, err);
418 get_account_int (ModestAccountMgr *self, const gchar *name,
419 const gchar *key, gboolean server_account,
422 ModestAccountMgrPrivate *priv;
427 g_return_val_if_fail (self, -1);
428 g_return_val_if_fail (name, -1);
429 g_return_val_if_fail (key, -1);
432 keyname = get_server_account_keyname (name, key);
434 keyname = get_account_keyname (name, key);
436 priv = MODEST_ACCOUNT_MGR_GET_PRIVATE(self);
437 retval = modest_conf_get_int (priv->modest_conf,keyname,err);
445 modest_account_mgr_get_server_account_int (ModestAccountMgr *self, const gchar *name,
446 const gchar *key, GError **err)
448 return get_account_int (self, name, key, TRUE, err);
452 modest_account_mgr_get_account_int (ModestAccountMgr *self, const gchar *name,
453 const gchar *key, GError **err)
455 return get_account_int (self, name, key, FALSE, err);
461 get_account_bool (ModestAccountMgr *self, const gchar *name,
462 const gchar *key, gboolean server_account,
465 ModestAccountMgrPrivate *priv;
470 g_return_val_if_fail (self, -1);
471 g_return_val_if_fail (name, -1);
472 g_return_val_if_fail (key, -1);
475 keyname = get_server_account_keyname (name, key);
477 keyname = get_account_keyname (name, key);
479 priv = MODEST_ACCOUNT_MGR_GET_PRIVATE(self);
480 retval = modest_conf_get_int (priv->modest_conf,keyname,err);
489 modest_account_mgr_get_server_account_bool (ModestAccountMgr *self, const gchar *name,
490 const gchar *key, GError **err)
492 return get_account_bool (self, name, key, TRUE, err);
496 modest_account_mgr_get_account_bool (ModestAccountMgr *self, const gchar *name,
497 const gchar *key, GError **err)
499 return get_account_bool (self, name, key, FALSE, err);
507 set_account_string (ModestAccountMgr *self, const gchar *name,
508 const gchar *key, const gchar* val, gboolean server_account,
511 ModestAccountMgrPrivate *priv;
516 g_return_val_if_fail (self, FALSE);
517 g_return_val_if_fail (name, FALSE);
518 g_return_val_if_fail (key, FALSE);
521 keyname = get_server_account_keyname (name, key);
523 keyname = get_account_keyname (name, key);
525 priv = MODEST_ACCOUNT_MGR_GET_PRIVATE(self);
527 retval = modest_conf_set_string (priv->modest_conf,keyname,val,err);
538 modest_account_mgr_set_server_account_string (ModestAccountMgr *self, const gchar *name,
539 const gchar *key, const gchar* val,
542 return set_account_string (self, name, key, val, TRUE, err);
548 modest_account_mgr_set_account_string (ModestAccountMgr *self, const gchar *name,
549 const gchar *key, const gchar* val,
552 return set_account_string (self, name, key, val, FALSE, err);
557 set_account_int (ModestAccountMgr *self, const gchar *name,
558 const gchar *key, gboolean server_account, int val,
561 ModestAccountMgrPrivate *priv;
566 g_return_val_if_fail (self, FALSE);
567 g_return_val_if_fail (name, FALSE);
568 g_return_val_if_fail (key, FALSE);
571 keyname = get_server_account_keyname (name, key);
573 keyname = get_account_keyname (name, key);
575 priv = MODEST_ACCOUNT_MGR_GET_PRIVATE(self);
577 retval = modest_conf_set_int (priv->modest_conf,keyname,val,err);
586 modest_account_mgr_set_server_account_int (ModestAccountMgr *self, const gchar *name,
587 const gchar *key, int val,
590 return set_account_int (self, name, key, val, TRUE, err);
595 modest_account_mgr_set_account_int (ModestAccountMgr *self, const gchar *name,
596 const gchar *key, int val,
599 return set_account_int (self, name, key, val, FALSE, err);
606 set_account_bool (ModestAccountMgr *self, const gchar *name,
607 const gchar *key, gboolean server_account, gboolean val,
610 ModestAccountMgrPrivate *priv;
615 g_return_val_if_fail (self, FALSE);
616 g_return_val_if_fail (name, FALSE);
617 g_return_val_if_fail (key, FALSE);
620 keyname = get_server_account_keyname (name, key);
622 keyname = get_account_keyname (name, key);
624 priv = MODEST_ACCOUNT_MGR_GET_PRIVATE(self);
626 retval = modest_conf_set_bool (priv->modest_conf,keyname,val,err);
634 modest_account_mgr_set_server_account_bool (ModestAccountMgr *self, const gchar *name,
635 const gchar *key, gboolean val,
638 return set_account_bool (self, name, key, val, TRUE, err);
644 modest_account_mgr_set_account_bool (ModestAccountMgr *self, const gchar *name,
645 const gchar *key, gboolean val,
648 return set_account_bool (self, name, key, val, FALSE, err);
656 account_exists (ModestAccountMgr *self, const gchar *name, gboolean server_account,
659 ModestAccountMgrPrivate *priv;
664 g_return_val_if_fail (self, FALSE);
665 g_return_val_if_fail (name, FALSE);
668 keyname = get_account_keyname (name, NULL);
670 keyname = get_server_account_keyname (name, NULL);
672 priv = MODEST_ACCOUNT_MGR_GET_PRIVATE(self);
673 retval = modest_conf_key_exists (priv->modest_conf,keyname,err);
681 modest_account_mgr_server_account_exists (ModestAccountMgr *self, const gchar *name,
684 return account_exists (self, name, TRUE, err);
690 modest_account_mgr_account_exists (ModestAccountMgr *self, const gchar *name,
693 return account_exists (self, name, FALSE, err);
698 /* must be freed by caller */
700 get_account_keyname (const gchar *accname, const gchar *name)
704 (MODEST_ACCOUNT_NAMESPACE, "/",
705 accname, "/", name, NULL);
708 (MODEST_ACCOUNT_NAMESPACE, "/",
713 /* must be freed by caller */
715 get_server_account_keyname (const gchar *accname, const gchar *name)
719 (MODEST_SERVER_ACCOUNT_NAMESPACE, "/",
720 accname, "/", name, NULL);
723 (MODEST_SERVER_ACCOUNT_NAMESPACE, "/",