1 /* modest-account-mgr.c */
3 /* insert (c)/licensing information) */
6 #include "modest-marshal.h"
7 #include "modest-account-keys.h"
8 #include "modest-account-mgr.h"
10 /* 'private'/'protected' functions */
11 static void modest_account_mgr_class_init (ModestAccountMgrClass * klass);
12 static void modest_account_mgr_init (ModestAccountMgr * obj);
13 static void modest_account_mgr_finalize (GObject * obj);
15 static gchar *get_account_keyname (const gchar * accname, const gchar * name);
16 static gchar *get_server_account_keyname (const gchar * accname,
21 ACCOUNT_CHANGE_SIGNAL,
22 ACCOUNT_REMOVE_SIGNAL,
27 typedef struct _ModestAccountMgrPrivate ModestAccountMgrPrivate;
28 struct _ModestAccountMgrPrivate {
29 ModestConf *modest_conf;
32 #define MODEST_ACCOUNT_MGR_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE((o), \
33 MODEST_TYPE_ACCOUNT_MGR, \
34 ModestAccountMgrPrivate))
36 static GObjectClass *parent_class = NULL;
38 static guint signals[LAST_SIGNAL] = {0};
41 /* map configuration changes to account changes */
43 modest_account_mgr_check_change (ModestConf *conf, const gchar *key,
44 const gchar *new_value, gpointer user_data)
46 ModestAccountMgr *amgr = user_data;
50 g_signal_emit (amgr, signals[ACCOUNT_CHANGE_SIGNAL], 0, key, new_value);
52 g_message ("value changed: %s %s\n", key, new_value);
57 modest_account_mgr_get_type (void)
59 static GType my_type = 0;
62 static const GTypeInfo my_info = {
63 sizeof (ModestAccountMgrClass),
65 NULL, /* base finalize */
66 (GClassInitFunc) modest_account_mgr_class_init,
67 NULL, /* class finalize */
68 NULL, /* class data */
69 sizeof (ModestAccountMgr),
71 (GInstanceInitFunc) modest_account_mgr_init,
74 my_type = g_type_register_static (G_TYPE_OBJECT,
82 modest_account_mgr_class_init (ModestAccountMgrClass * klass)
84 GObjectClass *gobject_class;
85 GType paramtypes[2] = {G_TYPE_POINTER, G_TYPE_POINTER};
87 gobject_class = (GObjectClass *) klass;
89 parent_class = g_type_class_peek_parent (klass);
90 gobject_class->finalize = modest_account_mgr_finalize;
92 g_type_class_add_private (gobject_class,
93 sizeof (ModestAccountMgrPrivate));
95 /* signal definitions */
96 signals[ACCOUNT_ADD_SIGNAL] =
97 g_signal_newv ("account-add",
98 G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST,
100 g_cclosure_marshal_VOID__POINTER,
101 G_TYPE_NONE, 1, paramtypes);
103 signals[ACCOUNT_REMOVE_SIGNAL] =
104 g_signal_newv ("account-remove",
105 G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST,
107 g_cclosure_marshal_VOID__POINTER,
108 G_TYPE_NONE, 1, paramtypes);
109 signals[ACCOUNT_CHANGE_SIGNAL] =
110 g_signal_newv ("account-change",
111 G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST,
113 modest_marshal_VOID__POINTER_POINTER,
114 G_TYPE_NONE, 2, paramtypes);
119 modest_account_mgr_init (ModestAccountMgr * obj)
121 ModestAccountMgrPrivate *priv = MODEST_ACCOUNT_MGR_GET_PRIVATE (obj);
123 priv->modest_conf = NULL;
127 modest_account_mgr_finalize (GObject * obj)
129 ModestAccountMgr *self = MODEST_ACCOUNT_MGR (obj);
130 ModestAccountMgrPrivate *priv = MODEST_ACCOUNT_MGR_GET_PRIVATE (self);
132 if (priv->modest_conf) {
133 g_object_unref (G_OBJECT(priv->modest_conf));
134 priv->modest_conf = NULL;
139 modest_account_mgr_new (ModestConf * conf)
142 ModestAccountMgrPrivate *priv;
144 g_return_val_if_fail (conf, NULL);
146 obj = G_OBJECT (g_object_new (MODEST_TYPE_ACCOUNT_MGR, NULL));
147 priv = MODEST_ACCOUNT_MGR_GET_PRIVATE (obj);
150 * increase the ref count on the modest_conf. Normally, the
151 * ModestConf should outlive the ModestAccountMgr though
153 g_object_ref (G_OBJECT (priv->modest_conf = conf));
155 g_signal_connect (G_OBJECT (conf), "key-changed",
156 G_CALLBACK (modest_account_mgr_check_change), obj);
162 modest_account_mgr_add_account (ModestAccountMgr * self, const gchar * name,
163 const gchar * store_account,
164 const gchar * transport_account,
167 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 already exists");
178 * we create the account by adding an account 'dir', with the name <name>,
179 * and in that the 'display_name' string key
181 priv = MODEST_ACCOUNT_MGR_GET_PRIVATE (self);
183 key = get_account_keyname (name, MODEST_ACCOUNT_DISPLAY_NAME);
184 modest_conf_set_string (priv->modest_conf, key, name, err);
188 key = get_account_keyname (name,
189 MODEST_ACCOUNT_STORE_ACCOUNT);
190 modest_conf_set_string (priv->modest_conf, key, store_account,
195 if (transport_account) {
196 key = get_account_keyname (name,
197 MODEST_ACCOUNT_TRANSPORT_ACCOUNT);
198 modest_conf_set_string (priv->modest_conf, key,
199 transport_account, err);
203 return TRUE; /* TODO: error handling */
208 modest_account_mgr_remove_account (ModestAccountMgr * self,
209 const gchar * name, GError ** err)
211 ModestAccountMgrPrivate *priv;
215 g_return_val_if_fail (self, FALSE);
216 g_return_val_if_fail (name, FALSE);
218 if (!modest_account_mgr_account_exists (self, name, err)) {
219 g_warning ("account doest not exist");
223 priv = MODEST_ACCOUNT_MGR_GET_PRIVATE (self);
224 key = get_account_keyname (name, NULL);
226 retval = modest_conf_remove_key (priv->modest_conf, key, NULL);
234 null_means_empty (const gchar * str)
236 return str ? str : "";
241 modest_account_mgr_add_server_account (ModestAccountMgr * self,
243 const gchar * hostname,
244 const gchar * username,
245 const gchar * password,
248 ModestAccountMgrPrivate *priv;
251 g_return_val_if_fail (self, FALSE);
252 g_return_val_if_fail (name, FALSE);
254 /* TODO: check already exists */
256 priv = MODEST_ACCOUNT_MGR_GET_PRIVATE (self);
257 acckey = g_strconcat (MODEST_SERVER_ACCOUNT_NAMESPACE, "/",
260 if (modest_conf_key_exists (priv->modest_conf, acckey, NULL)) {
261 g_warning ("server account %s already exists", name);
267 key = g_strconcat (acckey, "/", MODEST_ACCOUNT_HOSTNAME, NULL);
268 modest_conf_set_string (priv->modest_conf, key,
269 null_means_empty (hostname), NULL);
273 key = g_strconcat (acckey, "/", MODEST_ACCOUNT_USERNAME, NULL);
274 modest_conf_set_string (priv->modest_conf, key,
275 null_means_empty (username), NULL);
280 key = g_strconcat (acckey, "/", MODEST_ACCOUNT_PASSWORD,
282 modest_conf_set_string (priv->modest_conf, key,
283 null_means_empty (password), NULL);
288 key = g_strconcat (acckey, "/", MODEST_ACCOUNT_PROTO, NULL);
289 modest_conf_set_string (priv->modest_conf, key,
290 null_means_empty (proto), NULL);
294 return TRUE; /* FIXME: better error checking */
298 modest_account_mgr_remove_server_account (ModestAccountMgr * self,
299 const gchar * name, GError ** err)
301 ModestAccountMgrPrivate *priv;
305 g_return_val_if_fail (self, FALSE);
306 g_return_val_if_fail (name, FALSE);
308 priv = MODEST_ACCOUNT_MGR_GET_PRIVATE (self);
310 acckey = g_strconcat (MODEST_SERVER_ACCOUNT_NAMESPACE, "/",
313 if (!modest_conf_key_exists (priv->modest_conf, acckey, NULL)) {
314 g_warning ("server account %s does not exist exist", name);
319 retval = modest_conf_remove_key (priv->modest_conf, acckey, NULL);
326 /* strip the first /n/ character from each element */
327 /* caller must make sure all elements are strings with
328 * length >= n, and also that data can be freed.
331 strip_prefix_from_elements (GSList * lst, guint n)
333 GSList *cursor = lst;
336 gchar *str = (gchar *) cursor->data;
338 cursor->data = g_strdup (str + n);
340 cursor = cursor->next;
347 modest_account_mgr_server_account_names (ModestAccountMgr * self,
348 const gchar * account_name,
349 ModestProtoType type,
351 gboolean only_enabled)
355 ModestAccountMgrPrivate *priv;
356 const size_t prefix_len =
357 strlen (MODEST_SERVER_ACCOUNT_NAMESPACE "/");
359 g_return_val_if_fail (self, NULL);
361 priv = MODEST_ACCOUNT_MGR_GET_PRIVATE (self);
362 accounts = modest_conf_list_subkeys (priv->modest_conf,
363 MODEST_SERVER_ACCOUNT_NAMESPACE,
366 /* no restrictions, return everything */
367 if (type == MODEST_PROTO_TYPE_ANY && !proto)
368 return strip_prefix_from_elements (accounts, prefix_len);
370 /* otherwise, filter out the none-matching ones */
373 gchar *keyspace, *proto_key, *acc_proto;
375 keyspace = (gchar *) cursor->data;
377 g_strconcat (keyspace, "/", MODEST_ACCOUNT_PROTO,
380 modest_conf_get_string (priv->modest_conf, proto_key,
384 if ((!acc_proto) || /* proto not defined? */
385 (type != MODEST_PROTO_TYPE_ANY && /* proto type ... */
386 modest_proto_type (acc_proto) != type) || /* ... matches? */
387 (proto && strcmp (proto, acc_proto) != 0)) { /* proto matches? */
388 /* no match: remove from the list */
389 GSList *nxt = cursor->next;
392 accounts = g_slist_delete_link (accounts, cursor);
395 cursor = cursor->next;
398 return strip_prefix_from_elements (accounts, prefix_len);
403 modest_account_mgr_account_names (ModestAccountMgr * self, GError ** err)
406 ModestAccountMgrPrivate *priv;
407 const size_t prefix_len = strlen (MODEST_ACCOUNT_NAMESPACE "/");
410 g_return_val_if_fail (self, NULL);
412 priv = MODEST_ACCOUNT_MGR_GET_PRIVATE (self);
414 accounts = modest_conf_list_subkeys (priv->modest_conf,
415 MODEST_ACCOUNT_NAMESPACE, err);
416 return strip_prefix_from_elements (accounts, prefix_len);
421 get_account_string (ModestAccountMgr * self, const gchar * name,
422 const gchar * key, gboolean server_account, GError ** err)
424 ModestAccountMgrPrivate *priv;
429 g_return_val_if_fail (self, NULL);
430 g_return_val_if_fail (name, NULL);
431 g_return_val_if_fail (key, NULL);
434 keyname = get_server_account_keyname (name, key);
436 keyname = get_account_keyname (name, key);
438 priv = MODEST_ACCOUNT_MGR_GET_PRIVATE (self);
439 retval = modest_conf_get_string (priv->modest_conf, keyname, err);
447 modest_account_mgr_get_server_account_string (ModestAccountMgr * self,
452 return get_account_string (self, name, key, TRUE, err);
457 modest_account_mgr_get_account_string (ModestAccountMgr * self,
458 const gchar * name, const gchar * key,
461 return get_account_string (self, name, key, FALSE, err);
466 get_account_int (ModestAccountMgr * self, const gchar * name,
467 const gchar * key, gboolean server_account, GError ** err)
469 ModestAccountMgrPrivate *priv;
474 g_return_val_if_fail (self, -1);
475 g_return_val_if_fail (name, -1);
476 g_return_val_if_fail (key, -1);
479 keyname = get_server_account_keyname (name, key);
481 keyname = get_account_keyname (name, key);
483 priv = MODEST_ACCOUNT_MGR_GET_PRIVATE (self);
484 retval = modest_conf_get_int (priv->modest_conf, keyname, err);
492 modest_account_mgr_get_server_account_int (ModestAccountMgr * self,
494 const gchar * key, GError ** err)
496 return get_account_int (self, name, key, TRUE, err);
501 modest_account_mgr_get_account_int (ModestAccountMgr * self,
502 const gchar * name, const gchar * key,
505 return get_account_int (self, name, key, FALSE, err);
510 get_account_bool (ModestAccountMgr * self, const gchar * name,
511 const gchar * key, gboolean server_account, GError ** err)
513 ModestAccountMgrPrivate *priv;
518 g_return_val_if_fail (self, -1);
519 g_return_val_if_fail (name, -1);
520 g_return_val_if_fail (key, -1);
523 keyname = get_server_account_keyname (name, key);
525 keyname = get_account_keyname (name, key);
527 priv = MODEST_ACCOUNT_MGR_GET_PRIVATE (self);
528 retval = modest_conf_get_int (priv->modest_conf, keyname, err);
536 modest_account_mgr_get_server_account_bool (ModestAccountMgr * self,
538 const gchar * key, GError ** err)
540 return get_account_bool (self, name, key, TRUE, err);
545 modest_account_mgr_get_account_bool (ModestAccountMgr * self,
546 const gchar * name, const gchar * key,
549 return get_account_bool (self, name, key, FALSE, err);
554 set_account_string (ModestAccountMgr * self, const gchar * name,
555 const gchar * key, const gchar * val,
556 gboolean server_account, GError ** err)
558 ModestAccountMgrPrivate *priv;
563 g_return_val_if_fail (self, FALSE);
564 g_return_val_if_fail (name, FALSE);
565 g_return_val_if_fail (key, FALSE);
568 keyname = get_server_account_keyname (name, key);
570 keyname = get_account_keyname (name, key);
572 priv = MODEST_ACCOUNT_MGR_GET_PRIVATE (self);
574 retval = modest_conf_set_string (priv->modest_conf, keyname, val,
583 modest_account_mgr_set_server_account_string (ModestAccountMgr * self,
589 return set_account_string (self, name, key, val, TRUE, err);
594 modest_account_mgr_set_account_string (ModestAccountMgr * self,
595 const gchar * name, const gchar * key,
596 const gchar * val, GError ** err)
598 return set_account_string (self, name, key, val, FALSE, err);
603 set_account_int (ModestAccountMgr * self, const gchar * name,
604 const gchar * key, gboolean server_account, int val,
607 ModestAccountMgrPrivate *priv;
612 g_return_val_if_fail (self, FALSE);
613 g_return_val_if_fail (name, FALSE);
614 g_return_val_if_fail (key, FALSE);
617 keyname = get_server_account_keyname (name, key);
619 keyname = get_account_keyname (name, key);
621 priv = MODEST_ACCOUNT_MGR_GET_PRIVATE (self);
623 retval = modest_conf_set_int (priv->modest_conf, keyname, val, err);
631 modest_account_mgr_set_server_account_int (ModestAccountMgr * self,
633 const gchar * key, int val,
636 return set_account_int (self, name, key, val, TRUE, err);
641 modest_account_mgr_set_account_int (ModestAccountMgr * self,
642 const gchar * name, const gchar * key,
643 int val, GError ** err)
645 return set_account_int (self, name, key, val, FALSE, err);
650 set_account_bool (ModestAccountMgr * self, const gchar * name,
651 const gchar * key, gboolean server_account, gboolean val,
654 ModestAccountMgrPrivate *priv;
659 g_return_val_if_fail (self, FALSE);
660 g_return_val_if_fail (name, FALSE);
661 g_return_val_if_fail (key, FALSE);
664 keyname = get_server_account_keyname (name, key);
666 keyname = get_account_keyname (name, key);
668 priv = MODEST_ACCOUNT_MGR_GET_PRIVATE (self);
670 retval = modest_conf_set_bool (priv->modest_conf, keyname, val, err);
678 modest_account_mgr_set_server_account_bool (ModestAccountMgr * self,
680 const gchar * key, gboolean val,
683 return set_account_bool (self, name, key, val, TRUE, err);
688 modest_account_mgr_set_account_bool (ModestAccountMgr * self,
689 const gchar * name, const gchar * key,
690 gboolean val, GError ** err)
692 return set_account_bool (self, name, key, val, FALSE, err);
697 account_exists (ModestAccountMgr * self, const gchar * name,
698 gboolean server_account, GError ** err)
700 ModestAccountMgrPrivate *priv;
705 g_return_val_if_fail (self, FALSE);
706 g_return_val_if_fail (name, FALSE);
709 keyname = get_server_account_keyname (name, NULL);
711 keyname = get_account_keyname (name, NULL);
713 priv = MODEST_ACCOUNT_MGR_GET_PRIVATE (self);
714 retval = modest_conf_key_exists (priv->modest_conf, keyname, err);
722 modest_account_mgr_server_account_exists (ModestAccountMgr * self,
723 const gchar * name, GError ** err)
725 return account_exists (self, name, TRUE, err);
730 modest_account_mgr_account_exists (ModestAccountMgr * self,
731 const gchar * name, GError ** err)
733 return account_exists (self, name, FALSE, err);
737 /* must be freed by caller */
739 get_account_keyname (const gchar * accname, const gchar * name)
743 (MODEST_ACCOUNT_NAMESPACE, "/",
744 accname, "/", name, NULL);
747 (MODEST_ACCOUNT_NAMESPACE, "/", accname, NULL);
751 /* must be freed by caller */
753 get_server_account_keyname (const gchar * accname, const gchar * name)
757 (MODEST_SERVER_ACCOUNT_NAMESPACE, "/",
758 accname, "/", name, NULL);
761 (MODEST_SERVER_ACCOUNT_NAMESPACE, "/", accname, NULL);