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,
24 typedef struct _ModestAccountMgrPrivate ModestAccountMgrPrivate;
25 struct _ModestAccountMgrPrivate {
26 ModestConf *modest_conf;
29 #define MODEST_ACCOUNT_MGR_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE((o), \
30 MODEST_TYPE_ACCOUNT_MGR, \
31 ModestAccountMgrPrivate))
33 static GObjectClass *parent_class = NULL;
35 /* uncomment the following if you have defined any signals */
36 /* static guint signals[LAST_SIGNAL] = {0}; */
39 modest_account_mgr_get_type (void)
41 static GType my_type = 0;
44 static const GTypeInfo my_info = {
45 sizeof (ModestAccountMgrClass),
47 NULL, /* base finalize */
48 (GClassInitFunc) modest_account_mgr_class_init,
49 NULL, /* class finalize */
50 NULL, /* class data */
51 sizeof (ModestAccountMgr),
53 (GInstanceInitFunc) modest_account_mgr_init,
56 my_type = g_type_register_static (G_TYPE_OBJECT,
64 modest_account_mgr_class_init (ModestAccountMgrClass * klass)
66 GObjectClass *gobject_class;
68 gobject_class = (GObjectClass *) klass;
70 parent_class = g_type_class_peek_parent (klass);
71 gobject_class->finalize = modest_account_mgr_finalize;
73 g_type_class_add_private (gobject_class,
74 sizeof (ModestAccountMgrPrivate));
76 /* signal definitions go here, e.g.: */
77 /* signals[MY_SIGNAL_1] = */
78 /* g_signal_new ("my_signal_1",....); */
79 /* signals[MY_SIGNAL_2] = */
80 /* g_signal_new ("my_signal_2",....); */
86 modest_account_mgr_init (ModestAccountMgr * obj)
88 ModestAccountMgrPrivate *priv = MODEST_ACCOUNT_MGR_GET_PRIVATE (obj);
90 priv->modest_conf = NULL;
94 modest_account_mgr_finalize (GObject * obj)
96 ModestAccountMgr *self = MODEST_ACCOUNT_MGR (obj);
97 ModestAccountMgrPrivate *priv = MODEST_ACCOUNT_MGR_GET_PRIVATE (self);
99 if (priv->modest_conf) {
100 g_object_unref (G_OBJECT(priv->modest_conf));
101 priv->modest_conf = NULL;
106 modest_account_mgr_new (ModestConf * conf)
109 ModestAccountMgrPrivate *priv;
111 g_return_val_if_fail (conf, NULL);
113 obj = G_OBJECT (g_object_new (MODEST_TYPE_ACCOUNT_MGR, NULL));
114 priv = MODEST_ACCOUNT_MGR_GET_PRIVATE (obj);
117 * increase the ref count on the modest_conf. Normally, the
118 * ModestConf should outlive the ModestAccountMgr though
120 g_object_ref (G_OBJECT (priv->modest_conf = conf));
126 modest_account_mgr_add_account (ModestAccountMgr * self, const gchar * name,
127 const gchar * store_account,
128 const gchar * transport_account,
131 ModestAccountMgrPrivate *priv;
135 g_return_val_if_fail (self, FALSE);
136 g_return_val_if_fail (name, FALSE);
138 if (modest_account_mgr_account_exists (self, name, err)) {
139 g_warning ("account already exists");
143 * we create the account by adding an account 'dir', with the name <name>,
144 * and in that the 'display_name' string key
146 priv = MODEST_ACCOUNT_MGR_GET_PRIVATE (self);
148 key = get_account_keyname (name, MODEST_ACCOUNT_DISPLAY_NAME);
149 modest_conf_set_string (priv->modest_conf, key, name, err);
153 key = get_account_keyname (name,
154 MODEST_ACCOUNT_STORE_ACCOUNT);
155 modest_conf_set_string (priv->modest_conf, key, store_account,
160 if (transport_account) {
161 key = get_account_keyname (name,
162 MODEST_ACCOUNT_TRANSPORT_ACCOUNT);
163 modest_conf_set_string (priv->modest_conf, key,
164 transport_account, err);
168 return TRUE; /* TODO: error handling */
173 modest_account_mgr_remove_account (ModestAccountMgr * self,
174 const gchar * name, GError ** err)
176 ModestAccountMgrPrivate *priv;
180 g_return_val_if_fail (self, FALSE);
181 g_return_val_if_fail (name, FALSE);
183 if (!modest_account_mgr_account_exists (self, name, err)) {
184 g_warning ("account doest not exist");
188 priv = MODEST_ACCOUNT_MGR_GET_PRIVATE (self);
189 key = get_account_keyname (name, NULL);
191 retval = modest_conf_remove_key (priv->modest_conf, key, NULL);
199 null_means_empty (const gchar * str)
201 return str ? str : "";
206 modest_account_mgr_add_server_account (ModestAccountMgr * self,
208 const gchar * hostname,
209 const gchar * username,
210 const gchar * password,
213 ModestAccountMgrPrivate *priv;
216 g_return_val_if_fail (self, FALSE);
217 g_return_val_if_fail (name, FALSE);
219 /* TODO: check already exists */
221 priv = MODEST_ACCOUNT_MGR_GET_PRIVATE (self);
222 acckey = g_strconcat (MODEST_SERVER_ACCOUNT_NAMESPACE, "/",
225 if (modest_conf_key_exists (priv->modest_conf, acckey, NULL)) {
226 g_warning ("server account %s already exists", name);
232 key = g_strconcat (acckey, "/", MODEST_ACCOUNT_HOSTNAME, NULL);
233 modest_conf_set_string (priv->modest_conf, key,
234 null_means_empty (hostname), NULL);
238 key = g_strconcat (acckey, "/", MODEST_ACCOUNT_USERNAME, NULL);
239 modest_conf_set_string (priv->modest_conf, key,
240 null_means_empty (username), NULL);
245 key = g_strconcat (acckey, "/", MODEST_ACCOUNT_PASSWORD,
247 modest_conf_set_string (priv->modest_conf, key,
248 null_means_empty (password), NULL);
253 key = g_strconcat (acckey, "/", MODEST_ACCOUNT_PROTO, NULL);
254 modest_conf_set_string (priv->modest_conf, key,
255 null_means_empty (proto), NULL);
259 return TRUE; /* FIXME: better error checking */
263 modest_account_mgr_remove_server_account (ModestAccountMgr * self,
264 const gchar * name, GError ** err)
266 ModestAccountMgrPrivate *priv;
270 g_return_val_if_fail (self, FALSE);
271 g_return_val_if_fail (name, FALSE);
273 priv = MODEST_ACCOUNT_MGR_GET_PRIVATE (self);
275 acckey = g_strconcat (MODEST_SERVER_ACCOUNT_NAMESPACE, "/",
278 if (!modest_conf_key_exists (priv->modest_conf, acckey, NULL)) {
279 g_warning ("server account %s does not exist exist", name);
284 retval = modest_conf_remove_key (priv->modest_conf, acckey, NULL);
291 /* strip the first /n/ character from each element */
292 /* caller must make sure all elements are strings with
293 * length >= n, and also that data can be freed.
296 strip_prefix_from_elements (GSList * lst, guint n)
298 GSList *cursor = lst;
301 gchar *str = (gchar *) cursor->data;
303 cursor->data = g_strdup (str + n);
305 cursor = cursor->next;
312 modest_account_mgr_server_account_names (ModestAccountMgr * self,
313 const gchar * account_name,
314 ModestProtoType type,
316 gboolean only_enabled)
320 ModestAccountMgrPrivate *priv;
321 const size_t prefix_len =
322 strlen (MODEST_SERVER_ACCOUNT_NAMESPACE "/");
324 g_return_val_if_fail (self, NULL);
326 priv = MODEST_ACCOUNT_MGR_GET_PRIVATE (self);
327 accounts = modest_conf_list_subkeys (priv->modest_conf,
328 MODEST_SERVER_ACCOUNT_NAMESPACE,
331 /* no restrictions, return everything */
332 if (type == MODEST_PROTO_TYPE_ANY && !proto)
333 return strip_prefix_from_elements (accounts, prefix_len);
335 /* otherwise, filter out the none-matching ones */
338 gchar *keyspace, *proto_key, *acc_proto;
340 keyspace = (gchar *) cursor->data;
342 g_strconcat (keyspace, "/", MODEST_ACCOUNT_PROTO,
345 modest_conf_get_string (priv->modest_conf, proto_key,
349 if ((!acc_proto) || /* proto not defined? */
350 (type != MODEST_PROTO_TYPE_ANY && /* proto type ... */
351 modest_proto_type (acc_proto) != type) || /* ... matches? */
352 (proto && strcmp (proto, acc_proto) != 0)) { /* proto matches? */
353 /* no match: remove from the list */
354 GSList *nxt = cursor->next;
357 accounts = g_slist_delete_link (accounts, cursor);
360 cursor = cursor->next;
363 return strip_prefix_from_elements (accounts, prefix_len);
368 modest_account_mgr_account_names (ModestAccountMgr * self, GError ** err)
370 GSList *accounts, *cursor;
371 ModestAccountMgrPrivate *priv;
372 const size_t prefix_len = strlen (MODEST_ACCOUNT_NAMESPACE "/");
375 g_return_val_if_fail (self, NULL);
377 priv = MODEST_ACCOUNT_MGR_GET_PRIVATE (self);
379 accounts = modest_conf_list_subkeys (priv->modest_conf,
380 MODEST_ACCOUNT_NAMESPACE, err);
381 return strip_prefix_from_elements (accounts, prefix_len);
386 get_account_string (ModestAccountMgr * self, const gchar * name,
387 const gchar * key, gboolean server_account, GError ** err)
389 ModestAccountMgrPrivate *priv;
394 g_return_val_if_fail (self, NULL);
395 g_return_val_if_fail (name, NULL);
396 g_return_val_if_fail (key, NULL);
399 keyname = get_server_account_keyname (name, key);
401 keyname = get_account_keyname (name, key);
403 priv = MODEST_ACCOUNT_MGR_GET_PRIVATE (self);
404 retval = modest_conf_get_string (priv->modest_conf, keyname, err);
412 modest_account_mgr_get_server_account_string (ModestAccountMgr * self,
417 return get_account_string (self, name, key, TRUE, err);
422 modest_account_mgr_get_account_string (ModestAccountMgr * self,
423 const gchar * name, const gchar * key,
426 return get_account_string (self, name, key, FALSE, err);
431 get_account_int (ModestAccountMgr * self, const gchar * name,
432 const gchar * key, gboolean server_account, GError ** err)
434 ModestAccountMgrPrivate *priv;
439 g_return_val_if_fail (self, -1);
440 g_return_val_if_fail (name, -1);
441 g_return_val_if_fail (key, -1);
444 keyname = get_server_account_keyname (name, key);
446 keyname = get_account_keyname (name, key);
448 priv = MODEST_ACCOUNT_MGR_GET_PRIVATE (self);
449 retval = modest_conf_get_int (priv->modest_conf, keyname, err);
457 modest_account_mgr_get_server_account_int (ModestAccountMgr * self,
459 const gchar * key, GError ** err)
461 return get_account_int (self, name, key, TRUE, err);
466 modest_account_mgr_get_account_int (ModestAccountMgr * self,
467 const gchar * name, const gchar * key,
470 return get_account_int (self, name, key, FALSE, err);
475 get_account_bool (ModestAccountMgr * self, const gchar * name,
476 const gchar * key, gboolean server_account, GError ** err)
478 ModestAccountMgrPrivate *priv;
483 g_return_val_if_fail (self, -1);
484 g_return_val_if_fail (name, -1);
485 g_return_val_if_fail (key, -1);
488 keyname = get_server_account_keyname (name, key);
490 keyname = get_account_keyname (name, key);
492 priv = MODEST_ACCOUNT_MGR_GET_PRIVATE (self);
493 retval = modest_conf_get_int (priv->modest_conf, keyname, err);
501 modest_account_mgr_get_server_account_bool (ModestAccountMgr * self,
503 const gchar * key, GError ** err)
505 return get_account_bool (self, name, key, TRUE, err);
510 modest_account_mgr_get_account_bool (ModestAccountMgr * self,
511 const gchar * name, const gchar * key,
514 return get_account_bool (self, name, key, FALSE, err);
519 set_account_string (ModestAccountMgr * self, const gchar * name,
520 const gchar * key, const gchar * val,
521 gboolean server_account, GError ** err)
523 ModestAccountMgrPrivate *priv;
528 g_return_val_if_fail (self, FALSE);
529 g_return_val_if_fail (name, FALSE);
530 g_return_val_if_fail (key, FALSE);
533 keyname = get_server_account_keyname (name, key);
535 keyname = get_account_keyname (name, key);
537 priv = MODEST_ACCOUNT_MGR_GET_PRIVATE (self);
539 retval = modest_conf_set_string (priv->modest_conf, keyname, val,
548 modest_account_mgr_set_server_account_string (ModestAccountMgr * self,
554 return set_account_string (self, name, key, val, TRUE, err);
559 modest_account_mgr_set_account_string (ModestAccountMgr * self,
560 const gchar * name, const gchar * key,
561 const gchar * val, GError ** err)
563 return set_account_string (self, name, key, val, FALSE, err);
568 set_account_int (ModestAccountMgr * self, const gchar * name,
569 const gchar * key, gboolean server_account, int val,
572 ModestAccountMgrPrivate *priv;
577 g_return_val_if_fail (self, FALSE);
578 g_return_val_if_fail (name, FALSE);
579 g_return_val_if_fail (key, FALSE);
582 keyname = get_server_account_keyname (name, key);
584 keyname = get_account_keyname (name, key);
586 priv = MODEST_ACCOUNT_MGR_GET_PRIVATE (self);
588 retval = modest_conf_set_int (priv->modest_conf, keyname, val, err);
596 modest_account_mgr_set_server_account_int (ModestAccountMgr * self,
598 const gchar * key, int val,
601 return set_account_int (self, name, key, val, TRUE, err);
606 modest_account_mgr_set_account_int (ModestAccountMgr * self,
607 const gchar * name, const gchar * key,
608 int val, GError ** err)
610 return set_account_int (self, name, key, val, FALSE, err);
615 set_account_bool (ModestAccountMgr * self, const gchar * name,
616 const gchar * key, gboolean server_account, gboolean val,
619 ModestAccountMgrPrivate *priv;
624 g_return_val_if_fail (self, FALSE);
625 g_return_val_if_fail (name, FALSE);
626 g_return_val_if_fail (key, FALSE);
629 keyname = get_server_account_keyname (name, key);
631 keyname = get_account_keyname (name, key);
633 priv = MODEST_ACCOUNT_MGR_GET_PRIVATE (self);
635 retval = modest_conf_set_bool (priv->modest_conf, keyname, val, err);
643 modest_account_mgr_set_server_account_bool (ModestAccountMgr * self,
645 const gchar * key, gboolean val,
648 return set_account_bool (self, name, key, val, TRUE, err);
653 modest_account_mgr_set_account_bool (ModestAccountMgr * self,
654 const gchar * name, const gchar * key,
655 gboolean val, GError ** err)
657 return set_account_bool (self, name, key, val, FALSE, err);
662 account_exists (ModestAccountMgr * self, const gchar * name,
663 gboolean server_account, GError ** err)
665 ModestAccountMgrPrivate *priv;
670 g_return_val_if_fail (self, FALSE);
671 g_return_val_if_fail (name, FALSE);
674 keyname = get_account_keyname (name, NULL);
676 keyname = get_server_account_keyname (name, NULL);
678 priv = MODEST_ACCOUNT_MGR_GET_PRIVATE (self);
679 retval = modest_conf_key_exists (priv->modest_conf, keyname, err);
687 modest_account_mgr_server_account_exists (ModestAccountMgr * self,
688 const gchar * name, GError ** err)
690 return account_exists (self, name, TRUE, err);
695 modest_account_mgr_account_exists (ModestAccountMgr * self,
696 const gchar * name, GError ** err)
698 return account_exists (self, name, FALSE, err);
702 /* must be freed by caller */
704 get_account_keyname (const gchar * accname, const gchar * name)
708 (MODEST_ACCOUNT_NAMESPACE, "/",
709 accname, "/", name, NULL);
712 (MODEST_ACCOUNT_NAMESPACE, "/", accname, NULL);
716 /* must be freed by caller */
718 get_server_account_keyname (const gchar * accname, const gchar * name)
722 (MODEST_SERVER_ACCOUNT_NAMESPACE, "/",
723 accname, "/", name, NULL);
726 (MODEST_SERVER_ACCOUNT_NAMESPACE, "/", accname, NULL);