1 /* Copyright (c) 2006, Nokia Corporation
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are
8 * * Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * * Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.
13 * * Neither the name of the Nokia Corporation nor the names of its
14 * contributors may be used to endorse or promote products derived from
15 * this software without specific prior written permission.
17 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
18 * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
19 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
20 * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
21 * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
22 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
23 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
24 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
25 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
26 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
27 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30 #include "modest-signal-mgr.h"
40 modest_signal_mgr_connect (GSList *lst,
42 const gchar *signal_name,
46 SignalHandler *sighandler;
48 g_return_val_if_fail (instance, lst);
49 g_return_val_if_fail (signal_name, lst);
50 g_return_val_if_fail (handler, lst);
52 sighandler = g_new (SignalHandler, 1);
53 sighandler->obj = g_object_ref (instance);
54 sighandler->handler_id = g_signal_connect (instance, signal_name, handler, data);
55 sighandler->signal_name = g_strdup (signal_name);
57 return g_slist_prepend (lst, (gpointer)sighandler);
62 modest_signal_mgr_disconnect_all_and_destroy (GSList *lst)
65 for (cursor = lst; cursor; cursor = g_slist_next(cursor)) {
66 SignalHandler *handler;
67 handler = (SignalHandler*)cursor->data;
68 if (handler && handler->obj && G_IS_OBJECT(handler->obj)) {
69 if (g_signal_handler_is_connected (handler->obj, handler->handler_id)) {
70 g_signal_handler_disconnect (handler->obj, handler->handler_id);
72 g_object_unref (handler->obj);
73 g_free (handler->signal_name);
82 obj_in_a_signal_handler (gconstpointer a,
85 SignalHandler *handler, *list_item_handler;
87 list_item_handler = (SignalHandler *) a;
88 handler = (SignalHandler *) b;
90 if (list_item_handler->obj == handler->obj &&
91 !strcmp (list_item_handler->signal_name, handler->signal_name))
98 modest_signal_mgr_disconnect (GSList *list,
100 const gchar *signal_name)
103 SignalHandler *signal_handler = NULL, *tmp = NULL;
105 tmp = g_new (SignalHandler, 1);
107 tmp->signal_name = g_strdup (signal_name);
109 /* Find the element */
110 item = g_slist_find_custom (list, tmp, obj_in_a_signal_handler);
111 g_return_val_if_fail (item != NULL, list);
113 /* Disconnect the signal */
114 signal_handler = (SignalHandler *) item->data;
115 g_signal_handler_disconnect (signal_handler->obj, signal_handler->handler_id);
117 /* Free the handlers */
118 g_object_unref (signal_handler->obj);
119 g_free (signal_handler->signal_name);
120 g_free (signal_handler);
121 g_free (tmp->signal_name);
124 /* Remove item from list */
125 return g_slist_delete_link (list, item);
129 modest_signal_mgr_is_connected (GSList *list,
131 const gchar *signal_name)
134 SignalHandler *tmp = NULL;
136 /* Build the helper object */
137 tmp = g_new (SignalHandler, 1);
139 tmp->signal_name = g_strdup (signal_name);
141 /* Find the element */
142 item = g_slist_find_custom (list, tmp, obj_in_a_signal_handler);
144 /* Free the handlers */
145 g_free (tmp->signal_name);
148 return (item != NULL) ? TRUE : FALSE;