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 g_object_unref (G_OBJECT (priv->modest_conf));
100 priv->modest_conf = NULL;
104 modest_account_mgr_new (ModestConf * conf)
107 ModestAccountMgrPrivate *priv;
109 g_return_val_if_fail (conf, NULL);
111 obj = G_OBJECT (g_object_new (MODEST_TYPE_ACCOUNT_MGR, NULL));
112 priv = MODEST_ACCOUNT_MGR_GET_PRIVATE (obj);
115 * increase the ref count on the modest_conf. Normally, the
116 * ModestConf should outlive the ModestAccountMgr though
118 g_object_ref (G_OBJECT (priv->modest_conf = conf));
124 modest_account_mgr_add_account (ModestAccountMgr * self, const gchar * name,
125 const gchar * store_account,
126 const gchar * transport_account,
129 ModestAccountMgrPrivate *priv;
133 g_return_val_if_fail (self, FALSE);
134 g_return_val_if_fail (name, FALSE);
136 if (modest_account_mgr_account_exists (self, name, err)) {
137 g_warning ("account already exists");
141 * we create the account by adding an account 'dir', with the name <name>,
142 * and in that the 'display_name' string key
144 priv = MODEST_ACCOUNT_MGR_GET_PRIVATE (self);
146 key = get_account_keyname (name, MODEST_ACCOUNT_DISPLAY_NAME);
147 modest_conf_set_string (priv->modest_conf, key, name, err);
151 key = get_account_keyname (name,
152 MODEST_ACCOUNT_STORE_ACCOUNT);
153 modest_conf_set_string (priv->modest_conf, key, store_account,
158 if (transport_account) {
159 key = get_account_keyname (name,
160 MODEST_ACCOUNT_TRANSPORT_ACCOUNT);
161 modest_conf_set_string (priv->modest_conf, key,
162 transport_account, err);
166 return TRUE; /* TODO: error handling */
171 modest_account_mgr_remove_account (ModestAccountMgr * self,
172 const gchar * name, GError ** err)
174 ModestAccountMgrPrivate *priv;
178 g_return_val_if_fail (self, FALSE);
179 g_return_val_if_fail (name, FALSE);
181 if (!modest_account_mgr_account_exists (self, name, err)) {
182 g_warning ("account doest not exist");
186 priv = MODEST_ACCOUNT_MGR_GET_PRIVATE (self);
187 key = get_account_keyname (name, NULL);
189 retval = modest_conf_remove_key (priv->modest_conf, key, NULL);
197 null_means_empty (const gchar * str)
199 return str ? str : "";
204 modest_account_mgr_add_server_account (ModestAccountMgr * self,
206 const gchar * hostname,
207 const gchar * username,
208 const gchar * password,
211 ModestAccountMgrPrivate *priv;
214 g_return_val_if_fail (self, FALSE);
215 g_return_val_if_fail (name, FALSE);
217 /* TODO: check already exists */
219 priv = MODEST_ACCOUNT_MGR_GET_PRIVATE (self);
220 acckey = g_strconcat (MODEST_SERVER_ACCOUNT_NAMESPACE, "/",
223 if (modest_conf_key_exists (priv->modest_conf, acckey, NULL)) {
224 g_warning ("server account %s already exists", name);
230 key = g_strconcat (acckey, "/", MODEST_ACCOUNT_HOSTNAME, NULL);
231 modest_conf_set_string (priv->modest_conf, key,
232 null_means_empty (hostname), NULL);
236 key = g_strconcat (acckey, "/", MODEST_ACCOUNT_USERNAME, NULL);
237 modest_conf_set_string (priv->modest_conf, key,
238 null_means_empty (username), NULL);
243 key = g_strconcat (acckey, "/", MODEST_ACCOUNT_PASSWORD,
245 modest_conf_set_string (priv->modest_conf, key,
246 null_means_empty (password), NULL);
251 key = g_strconcat (acckey, "/", MODEST_ACCOUNT_PROTO, NULL);
252 modest_conf_set_string (priv->modest_conf, key,
253 null_means_empty (proto), NULL);
257 return TRUE; /* FIXME: better error checking */
261 modest_account_mgr_remove_server_account (ModestAccountMgr * self,
262 const gchar * name, GError ** err)
264 ModestAccountMgrPrivate *priv;
268 g_return_val_if_fail (self, FALSE);
269 g_return_val_if_fail (name, FALSE);
271 priv = MODEST_ACCOUNT_MGR_GET_PRIVATE (self);
273 acckey = g_strconcat (MODEST_SERVER_ACCOUNT_NAMESPACE, "/",
276 if (!modest_conf_key_exists (priv->modest_conf, acckey, NULL)) {
277 g_warning ("server account %s does not exist exist", name);
282 retval = modest_conf_remove_key (priv->modest_conf, acckey, NULL);
289 /* strip the first /n/ character from each element */
290 /* caller must make sure all elements are strings with
291 * length >= n, and also that data can be freed.
294 strip_prefix_from_elements (GSList * lst, guint n)
296 GSList *cursor = lst;
299 gchar *str = (gchar *) cursor->data;
301 cursor->data = g_strdup (str + n);
303 cursor = cursor->next;
310 modest_account_mgr_server_account_names (ModestAccountMgr * self,
311 const gchar * account_name,
312 ModestProtoType type,
314 gboolean only_enabled)
318 ModestAccountMgrPrivate *priv;
319 const size_t prefix_len =
320 strlen (MODEST_SERVER_ACCOUNT_NAMESPACE "/");
322 g_return_val_if_fail (self, NULL);
324 priv = MODEST_ACCOUNT_MGR_GET_PRIVATE (self);
325 accounts = modest_conf_list_subkeys (priv->modest_conf,
326 MODEST_SERVER_ACCOUNT_NAMESPACE,
329 /* no restrictions, return everything */
330 if (type == MODEST_PROTO_TYPE_ANY && !proto)
331 return strip_prefix_from_elements (accounts, prefix_len);
333 /* otherwise, filter out the none-matching ones */
336 gchar *keyspace, *proto_key, *acc_proto;
338 keyspace = (gchar *) cursor->data;
340 g_strconcat (keyspace, "/", MODEST_ACCOUNT_PROTO,
343 modest_conf_get_string (priv->modest_conf, proto_key,
347 if ((!acc_proto) || /* proto not defined? */
348 (type != MODEST_PROTO_TYPE_ANY && /* proto type ... */
349 modest_proto_type (acc_proto) != type) || /* ... matches? */
350 (proto && strcmp (proto, acc_proto) != 0)) { /* proto matches? */
351 /* no match: remove from the list */
352 GSList *nxt = cursor->next;
355 accounts = g_slist_delete_link (accounts, cursor);
358 cursor = cursor->next;
361 return strip_prefix_from_elements (accounts, prefix_len);
366 modest_account_mgr_account_names (ModestAccountMgr * self, GError ** err)
368 GSList *accounts, *cursor;
369 ModestAccountMgrPrivate *priv;
370 const size_t prefix_len = strlen (MODEST_ACCOUNT_NAMESPACE "/");
373 g_return_val_if_fail (self, NULL);
375 priv = MODEST_ACCOUNT_MGR_GET_PRIVATE (self);
377 accounts = modest_conf_list_subkeys (priv->modest_conf,
378 MODEST_ACCOUNT_NAMESPACE, err);
379 return strip_prefix_from_elements (accounts, prefix_len);
384 get_account_string (ModestAccountMgr * self, const gchar * name,
385 const gchar * key, gboolean server_account, GError ** err)
387 ModestAccountMgrPrivate *priv;
392 g_return_val_if_fail (self, NULL);
393 g_return_val_if_fail (name, NULL);
394 g_return_val_if_fail (key, NULL);
397 keyname = get_server_account_keyname (name, key);
399 keyname = get_account_keyname (name, key);
401 priv = MODEST_ACCOUNT_MGR_GET_PRIVATE (self);
402 retval = modest_conf_get_string (priv->modest_conf, keyname, err);
410 modest_account_mgr_get_server_account_string (ModestAccountMgr * self,
415 return get_account_string (self, name, key, TRUE, err);
420 modest_account_mgr_get_account_string (ModestAccountMgr * self,
421 const gchar * name, const gchar * key,
424 return get_account_string (self, name, key, FALSE, err);
429 get_account_int (ModestAccountMgr * self, const gchar * name,
430 const gchar * key, gboolean server_account, GError ** err)
432 ModestAccountMgrPrivate *priv;
437 g_return_val_if_fail (self, -1);
438 g_return_val_if_fail (name, -1);
439 g_return_val_if_fail (key, -1);
442 keyname = get_server_account_keyname (name, key);
444 keyname = get_account_keyname (name, key);
446 priv = MODEST_ACCOUNT_MGR_GET_PRIVATE (self);
447 retval = modest_conf_get_int (priv->modest_conf, keyname, err);
455 modest_account_mgr_get_server_account_int (ModestAccountMgr * self,
457 const gchar * key, GError ** err)
459 return get_account_int (self, name, key, TRUE, err);
464 modest_account_mgr_get_account_int (ModestAccountMgr * self,
465 const gchar * name, const gchar * key,
468 return get_account_int (self, name, key, FALSE, err);
473 get_account_bool (ModestAccountMgr * self, const gchar * name,
474 const gchar * key, gboolean server_account, GError ** err)
476 ModestAccountMgrPrivate *priv;
481 g_return_val_if_fail (self, -1);
482 g_return_val_if_fail (name, -1);
483 g_return_val_if_fail (key, -1);
486 keyname = get_server_account_keyname (name, key);
488 keyname = get_account_keyname (name, key);
490 priv = MODEST_ACCOUNT_MGR_GET_PRIVATE (self);
491 retval = modest_conf_get_int (priv->modest_conf, keyname, err);
499 modest_account_mgr_get_server_account_bool (ModestAccountMgr * self,
501 const gchar * key, GError ** err)
503 return get_account_bool (self, name, key, TRUE, err);
508 modest_account_mgr_get_account_bool (ModestAccountMgr * self,
509 const gchar * name, const gchar * key,
512 return get_account_bool (self, name, key, FALSE, err);
517 set_account_string (ModestAccountMgr * self, const gchar * name,
518 const gchar * key, const gchar * val,
519 gboolean server_account, GError ** err)
521 ModestAccountMgrPrivate *priv;
526 g_return_val_if_fail (self, FALSE);
527 g_return_val_if_fail (name, FALSE);
528 g_return_val_if_fail (key, FALSE);
531 keyname = get_server_account_keyname (name, key);
533 keyname = get_account_keyname (name, key);
535 priv = MODEST_ACCOUNT_MGR_GET_PRIVATE (self);
537 retval = modest_conf_set_string (priv->modest_conf, keyname, val,
546 modest_account_mgr_set_server_account_string (ModestAccountMgr * self,
552 return set_account_string (self, name, key, val, TRUE, err);
557 modest_account_mgr_set_account_string (ModestAccountMgr * self,
558 const gchar * name, const gchar * key,
559 const gchar * val, GError ** err)
561 return set_account_string (self, name, key, val, FALSE, err);
566 set_account_int (ModestAccountMgr * self, const gchar * name,
567 const gchar * key, gboolean server_account, int val,
570 ModestAccountMgrPrivate *priv;
575 g_return_val_if_fail (self, FALSE);
576 g_return_val_if_fail (name, FALSE);
577 g_return_val_if_fail (key, FALSE);
580 keyname = get_server_account_keyname (name, key);
582 keyname = get_account_keyname (name, key);
584 priv = MODEST_ACCOUNT_MGR_GET_PRIVATE (self);
586 retval = modest_conf_set_int (priv->modest_conf, keyname, val, err);
594 modest_account_mgr_set_server_account_int (ModestAccountMgr * self,
596 const gchar * key, int val,
599 return set_account_int (self, name, key, val, TRUE, err);
604 modest_account_mgr_set_account_int (ModestAccountMgr * self,
605 const gchar * name, const gchar * key,
606 int val, GError ** err)
608 return set_account_int (self, name, key, val, FALSE, err);
613 set_account_bool (ModestAccountMgr * self, const gchar * name,
614 const gchar * key, gboolean server_account, gboolean val,
617 ModestAccountMgrPrivate *priv;
622 g_return_val_if_fail (self, FALSE);
623 g_return_val_if_fail (name, FALSE);
624 g_return_val_if_fail (key, FALSE);
627 keyname = get_server_account_keyname (name, key);
629 keyname = get_account_keyname (name, key);
631 priv = MODEST_ACCOUNT_MGR_GET_PRIVATE (self);
633 retval = modest_conf_set_bool (priv->modest_conf, keyname, val, err);
641 modest_account_mgr_set_server_account_bool (ModestAccountMgr * self,
643 const gchar * key, gboolean val,
646 return set_account_bool (self, name, key, val, TRUE, err);
651 modest_account_mgr_set_account_bool (ModestAccountMgr * self,
652 const gchar * name, const gchar * key,
653 gboolean val, GError ** err)
655 return set_account_bool (self, name, key, val, FALSE, err);
660 account_exists (ModestAccountMgr * self, const gchar * name,
661 gboolean server_account, GError ** err)
663 ModestAccountMgrPrivate *priv;
668 g_return_val_if_fail (self, FALSE);
669 g_return_val_if_fail (name, FALSE);
672 keyname = get_account_keyname (name, NULL);
674 keyname = get_server_account_keyname (name, NULL);
676 priv = MODEST_ACCOUNT_MGR_GET_PRIVATE (self);
677 retval = modest_conf_key_exists (priv->modest_conf, keyname, err);
685 modest_account_mgr_server_account_exists (ModestAccountMgr * self,
686 const gchar * name, GError ** err)
688 return account_exists (self, name, TRUE, err);
693 modest_account_mgr_account_exists (ModestAccountMgr * self,
694 const gchar * name, GError ** err)
696 return account_exists (self, name, FALSE, err);
700 /* must be freed by caller */
702 get_account_keyname (const gchar * accname, const gchar * name)
706 (MODEST_ACCOUNT_NAMESPACE, "/",
707 accname, "/", name, NULL);
710 (MODEST_ACCOUNT_NAMESPACE, "/", accname, NULL);
714 /* must be freed by caller */
716 get_server_account_keyname (const gchar * accname, const gchar * name)
720 (MODEST_SERVER_ACCOUNT_NAMESPACE, "/",
721 accname, "/", name, NULL);
724 (MODEST_SERVER_ACCOUNT_NAMESPACE, "/", accname, NULL);