+
+static gboolean
+obj_in_a_signal_handler (gconstpointer a,
+ gconstpointer b)
+{
+ SignalHandler *handler, *list_item_handler;
+
+ list_item_handler = (SignalHandler *) a;
+ handler = (SignalHandler *) b;
+
+ if (list_item_handler->obj == handler->obj &&
+ !strcmp (list_item_handler->signal_name, handler->signal_name))
+ return FALSE;
+ else
+ return TRUE;
+}
+
+GSList *
+modest_signal_mgr_disconnect (GSList *list,
+ GObject *instance,
+ const gchar *signal_name)
+{
+ GSList *item = NULL;
+ SignalHandler *signal_handler = NULL, *tmp = NULL;
+
+ tmp = g_new (SignalHandler, 1);
+ tmp->obj = instance;
+ tmp->signal_name = g_strdup (signal_name);
+
+ /* Find the element */
+ item = g_slist_find_custom (list, tmp, obj_in_a_signal_handler);
+ g_return_val_if_fail (item != NULL, list);
+
+ /* Disconnect the signal */
+ signal_handler = (SignalHandler *) item->data;
+ g_signal_handler_disconnect (signal_handler->obj, signal_handler->handler_id);
+
+ /* Free the handlers */
+ g_object_unref (signal_handler->obj);
+ g_free (signal_handler->signal_name);
+ g_free (signal_handler);
+ g_free (tmp->signal_name);
+ g_free (tmp);
+
+ /* Remove item from list */
+ return g_slist_delete_link (list, item);
+}
+
+gboolean
+modest_signal_mgr_is_connected (GSList *list,
+ GObject *instance,
+ const gchar *signal_name)
+{
+ GSList *item = NULL;
+ SignalHandler *tmp = NULL;
+
+ /* Build the helper object */
+ tmp = g_new (SignalHandler, 1);
+ tmp->obj = instance;
+ tmp->signal_name = g_strdup (signal_name);
+
+ /* Find the element */
+ item = g_slist_find_custom (list, tmp, obj_in_a_signal_handler);
+
+ /* Free the handlers */
+ g_free (tmp->signal_name);
+ g_free (tmp);
+
+ return (item != NULL) ? TRUE : FALSE;
+}