1 /* modest-identity-mgr.c */
3 /* insert (c)/licensing information) */
6 #include "modest-marshal.h"
7 #include "modest-identity-mgr.h"
9 /* 'private'/'protected' functions */
10 static void modest_identity_mgr_class_init (ModestIdentityMgrClass * klass);
11 static void modest_identity_mgr_init (ModestIdentityMgr * obj);
12 static void modest_identity_mgr_finalize (GObject * obj);
14 static gchar *get_identity_keyname (const gchar * accname,
19 IDENTITY_CHANGE_SIGNAL,
20 IDENTITY_REMOVE_SIGNAL,
25 typedef struct _ModestIdentityMgrPrivate ModestIdentityMgrPrivate;
26 struct _ModestIdentityMgrPrivate {
27 ModestConf *modest_conf;
28 GSList *current_identities;
31 #define MODEST_IDENTITY_MGR_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE((o), \
32 MODEST_TYPE_IDENTITY_MGR, \
33 ModestIdentityMgrPrivate))
35 static GObjectClass *parent_class = NULL;
37 /* uncomment the following if you have defined any signals */
38 static guint signals[LAST_SIGNAL] = {0};
42 delete_account_from_list (GSList *list, const gchar *name)
44 GSList *iter, *result;
49 if (!strcmp (name, iter->data)) {
50 result = g_slist_delete_link (list, iter);
54 iter = g_slist_next (iter);
60 find_account_in_list (GSList *list, const gchar *name)
62 GSList *iter, *result;
67 if (!strcmp (name, iter->data)) {
72 iter = g_slist_next (iter);
79 modest_identity_mgr_check_change (ModestConf *conf,
81 const gchar *new_value,
84 ModestIdentityMgr *id_mgr = userdata;
85 ModestIdentityMgrPrivate *priv = MODEST_IDENTITY_MGR_GET_PRIVATE(id_mgr);
89 if ((strlen(key) > strlen(MODEST_IDENTITY_NAMESPACE "/")
90 && g_str_has_prefix(key, MODEST_IDENTITY_NAMESPACE))) {
91 subkey = g_strdup(key + strlen(MODEST_IDENTITY_NAMESPACE "/"));
92 if (! strstr(subkey, "/")) { /* no more '/' means an entry was modified */
94 priv->current_identities =
95 delete_account_from_list (priv->current_identities, subkey);
96 g_signal_emit(id_mgr, signals[IDENTITY_REMOVE_SIGNAL], 0, subkey);
100 param = strstr(subkey, "/");
104 if (!find_account_in_list(priv->current_identities, subkey)) {
105 priv->current_identities =
106 g_slist_prepend(priv->current_identities, g_strdup(subkey));
107 g_signal_emit(id_mgr, signals[IDENTITY_ADD_SIGNAL], 0, subkey);
109 g_signal_emit(id_mgr, signals[IDENTITY_CHANGE_SIGNAL], 0, subkey, param, new_value);
116 modest_identity_mgr_get_type (void)
118 static GType my_type = 0;
121 static const GTypeInfo my_info = {
122 sizeof (ModestIdentityMgrClass),
123 NULL, /* base init */
124 NULL, /* base finalize */
125 (GClassInitFunc) modest_identity_mgr_class_init,
126 NULL, /* class finalize */
127 NULL, /* class data */
128 sizeof (ModestIdentityMgr),
130 (GInstanceInitFunc) modest_identity_mgr_init,
133 my_type = g_type_register_static (G_TYPE_OBJECT,
141 modest_identity_mgr_class_init (ModestIdentityMgrClass * klass)
143 GObjectClass *gobject_class;
144 GType paramtypes[3] = {G_TYPE_POINTER, G_TYPE_POINTER, G_TYPE_POINTER};
146 gobject_class = (GObjectClass *) klass;
148 parent_class = g_type_class_peek_parent (klass);
149 gobject_class->finalize = modest_identity_mgr_finalize;
151 g_type_class_add_private (gobject_class,
152 sizeof (ModestIdentityMgrPrivate));
154 /* signal definitions */
155 signals[IDENTITY_ADD_SIGNAL] =
156 g_signal_newv ("identity-add",
157 G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST,
159 g_cclosure_marshal_VOID__POINTER,
160 G_TYPE_NONE, 1, paramtypes);
162 signals[IDENTITY_REMOVE_SIGNAL] =
163 g_signal_newv ("identity-remove",
164 G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST,
166 g_cclosure_marshal_VOID__POINTER,
167 G_TYPE_NONE, 1, paramtypes);
168 signals[IDENTITY_CHANGE_SIGNAL] =
169 g_signal_newv ("identity-change",
170 G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST,
172 modest_marshal_VOID__POINTER_POINTER_POINTER,
173 G_TYPE_NONE, 3, paramtypes);
178 modest_identity_mgr_init (ModestIdentityMgr * obj)
180 ModestIdentityMgrPrivate *priv =
181 MODEST_IDENTITY_MGR_GET_PRIVATE (obj);
182 priv->modest_conf = NULL;
186 modest_identity_mgr_finalize (GObject * obj)
188 ModestIdentityMgr *self = MODEST_IDENTITY_MGR (obj);
189 ModestIdentityMgrPrivate *priv =
190 MODEST_IDENTITY_MGR_GET_PRIVATE (self);
192 g_object_unref (G_OBJECT (priv->modest_conf));
193 priv->modest_conf = NULL;
197 modest_identity_mgr_new (ModestConf * conf)
200 ModestIdentityMgrPrivate *priv;
202 g_return_val_if_fail (conf, NULL);
204 obj = G_OBJECT (g_object_new (MODEST_TYPE_IDENTITY_MGR, NULL));
205 priv = MODEST_IDENTITY_MGR_GET_PRIVATE (obj);
208 * increase the ref count on the modest_conf. Normally, the
209 * ModestConf should outlive the ModestIdentityMgr though
211 g_object_ref (G_OBJECT (priv->modest_conf = conf));
213 priv->current_identities = modest_identity_mgr_identity_names (MODEST_IDENTITY_MGR(obj), NULL);
215 g_signal_connect(G_OBJECT(conf),
217 G_CALLBACK (modest_identity_mgr_check_change),
224 modest_identity_mgr_remove_identity (ModestIdentityMgr * self,
225 const gchar * name, GError ** err)
227 ModestIdentityMgrPrivate *priv;
231 g_return_val_if_fail (self, FALSE);
232 g_return_val_if_fail (name, FALSE);
234 if (!modest_identity_mgr_identity_exists (self, name, err)) {
235 g_warning ("identity doest not exist");
239 priv = MODEST_IDENTITY_MGR_GET_PRIVATE (self);
240 key = get_identity_keyname (name, NULL);
242 retval = modest_conf_remove_key (priv->modest_conf, key, NULL);
250 null_means_empty (const gchar * str)
252 return str ? str : "";
257 modest_identity_mgr_add_identity (ModestIdentityMgr * self,
259 const gchar * realname,
261 const gchar * replyto,
262 const gchar * signature,
263 const gboolean use_signature,
264 const gchar * id_via,
265 const gboolean use_id_via)
267 ModestIdentityMgrPrivate *priv;
270 g_return_val_if_fail (self, FALSE);
271 g_return_val_if_fail (name, FALSE);
273 /* TODO: check already exists */
275 priv = MODEST_IDENTITY_MGR_GET_PRIVATE (self);
276 id_key = g_strconcat (MODEST_IDENTITY_NAMESPACE, "/", name, NULL);
278 if (modest_conf_key_exists (priv->modest_conf, id_key, NULL)) {
279 g_warning ("identity %s already exists", name);
285 key = g_strconcat (id_key, "/", MODEST_IDENTITY_REALNAME, NULL);
286 modest_conf_set_string (priv->modest_conf, key,
287 null_means_empty (realname), NULL);
291 key = g_strconcat (id_key, "/", MODEST_IDENTITY_EMAIL, NULL);
292 modest_conf_set_string (priv->modest_conf, key,
293 null_means_empty (email), NULL);
297 key = g_strconcat (id_key, "/", MODEST_IDENTITY_REPLYTO, NULL);
298 modest_conf_set_string (priv->modest_conf, key,
299 null_means_empty (replyto), NULL);
303 key = g_strconcat (id_key, "/", MODEST_IDENTITY_SIGNATURE, NULL);
304 modest_conf_set_string (priv->modest_conf, key,
305 null_means_empty (signature), NULL);
309 key = g_strconcat (id_key, "/", MODEST_IDENTITY_USE_SIGNATURE, NULL);
310 modest_conf_set_bool (priv->modest_conf, key, use_signature, NULL);
314 key = g_strconcat (id_key, "/", MODEST_IDENTITY_ID_VIA, NULL);
315 modest_conf_set_string (priv->modest_conf, key,
316 null_means_empty (id_via), NULL);
320 key = g_strconcat (id_key, "/", MODEST_IDENTITY_USE_ID_VIA, NULL);
321 modest_conf_set_bool (priv->modest_conf, key, use_id_via, NULL);
326 return TRUE; /* FIXME: better error checking */
329 /* strip the first /n/ character from each element */
330 /* caller must make sure all elements are strings with
331 * length >= n, and also that data can be freed.
333 /* this function is copied from modest-account-mgr. Maybe it should be moved
334 * to modest-list-utils or the like...
337 strip_prefix_from_elements (GSList * lst, guint n)
339 GSList *cursor = lst;
342 gchar *str = (gchar *) cursor->data;
344 cursor->data = g_strdup (str + n);
346 cursor = cursor->next;
352 modest_identity_mgr_identity_names (ModestIdentityMgr * self, GError ** err)
355 ModestIdentityMgrPrivate *priv;
356 const size_t prefix_len = strlen (MODEST_IDENTITY_NAMESPACE "/");
359 g_return_val_if_fail (self, NULL);
361 priv = MODEST_IDENTITY_MGR_GET_PRIVATE (self);
363 identities = modest_conf_list_subkeys (priv->modest_conf,
364 MODEST_IDENTITY_NAMESPACE,
366 return strip_prefix_from_elements (identities, prefix_len);
371 modest_identity_mgr_get_identity_string (ModestIdentityMgr * self,
373 const gchar * key, GError ** err)
375 ModestIdentityMgrPrivate *priv;
380 g_return_val_if_fail (self, NULL);
381 g_return_val_if_fail (name, NULL);
382 g_return_val_if_fail (key, NULL);
384 keyname = get_identity_keyname (name, key);
386 priv = MODEST_IDENTITY_MGR_GET_PRIVATE (self);
387 retval = modest_conf_get_string (priv->modest_conf, keyname, err);
395 modest_identity_mgr_get_identity_int (ModestIdentityMgr * self,
396 const gchar * name, const gchar * key,
399 ModestIdentityMgrPrivate *priv;
404 g_return_val_if_fail (self, -1);
405 g_return_val_if_fail (name, -1);
406 g_return_val_if_fail (key, -1);
408 keyname = get_identity_keyname (name, key);
409 priv = MODEST_IDENTITY_MGR_GET_PRIVATE (self);
410 retval = modest_conf_get_int (priv->modest_conf, keyname, err);
419 modest_identity_mgr_get_identity_bool (ModestIdentityMgr * self,
420 const gchar * name, const gchar * key,
423 ModestIdentityMgrPrivate *priv;
428 g_return_val_if_fail (self, FALSE);
429 g_return_val_if_fail (name, FALSE);
430 g_return_val_if_fail (key, FALSE);
432 keyname = get_identity_keyname (name, key);
434 priv = MODEST_IDENTITY_MGR_GET_PRIVATE (self);
435 retval = modest_conf_get_bool (priv->modest_conf, keyname, err);
443 modest_identity_mgr_set_identity_string (ModestIdentityMgr * self,
445 const gchar * key, const gchar * val,
448 ModestIdentityMgrPrivate *priv;
453 g_return_val_if_fail (self, FALSE);
454 g_return_val_if_fail (name, FALSE);
455 g_return_val_if_fail (key, FALSE);
457 keyname = get_identity_keyname (name, key);
459 priv = MODEST_IDENTITY_MGR_GET_PRIVATE (self);
461 retval = modest_conf_set_string (priv->modest_conf, keyname, val,
470 modest_identity_mgr_set_identity_int (ModestIdentityMgr * self,
471 const gchar * name, const gchar * key,
472 const gint val, GError ** err)
474 ModestIdentityMgrPrivate *priv;
479 g_return_val_if_fail (self, FALSE);
480 g_return_val_if_fail (name, FALSE);
481 g_return_val_if_fail (key, FALSE);
483 keyname = get_identity_keyname (name, key);
485 priv = MODEST_IDENTITY_MGR_GET_PRIVATE (self);
487 retval = modest_conf_set_int (priv->modest_conf, keyname, val, err);
495 modest_identity_mgr_set_identity_bool (ModestIdentityMgr * self,
496 const gchar * name, const gchar * key,
497 gboolean val, GError ** err)
499 ModestIdentityMgrPrivate *priv;
504 g_return_val_if_fail (self, FALSE);
505 g_return_val_if_fail (name, FALSE);
506 g_return_val_if_fail (key, FALSE);
508 keyname = get_identity_keyname (name, key);
510 priv = MODEST_IDENTITY_MGR_GET_PRIVATE (self);
512 retval = modest_conf_set_bool (priv->modest_conf, keyname, val, err);
520 modest_identity_mgr_identity_exists (ModestIdentityMgr * self,
521 const gchar * name, GError ** err)
523 ModestIdentityMgrPrivate *priv;
528 g_return_val_if_fail (self, FALSE);
529 g_return_val_if_fail (name, FALSE);
531 keyname = get_identity_keyname (name, NULL);
533 priv = MODEST_IDENTITY_MGR_GET_PRIVATE (self);
534 retval = modest_conf_key_exists (priv->modest_conf, keyname, err);
541 /* must be freed by caller */
543 get_identity_keyname (const gchar * idname, const gchar * name)
547 (MODEST_IDENTITY_NAMESPACE, "/",
548 idname, "/", name, NULL);
551 (MODEST_IDENTITY_NAMESPACE, "/", idname, NULL);