From 962a3c1f9bcaafc1e281af544240d8bc8450239b Mon Sep 17 00:00:00 2001 From: "Dirk-Jan C. Binnema" Date: Thu, 2 Aug 2007 13:35:22 +0000 Subject: [PATCH] * add modest-signal-mgr, some small utility functions for gobject to remember what g_signal_connects they did, and make sure they are all disconnected when you finalize the object; this was needed for a bugfix pmo-trunk-r2909 --- src/Makefile.am | 4 ++- src/modest-signal-mgr.c | 71 +++++++++++++++++++++++++++++++++++++++++++++++ src/modest-signal-mgr.h | 57 +++++++++++++++++++++++++++++++++++++ 3 files changed, 131 insertions(+), 1 deletion(-) create mode 100644 src/modest-signal-mgr.c create mode 100644 src/modest-signal-mgr.h diff --git a/src/Makefile.am b/src/Makefile.am index ee460a5..e85aa35 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -1,6 +1,6 @@ # # Makefile.am -# Time-stamp: <2007-06-23 15:17:46 (djcb)> +# Time-stamp: <2007-08-02 16:13:34 (djcb)> SUBDIRS=$(MODEST_PLATFORM) widgets $(dbus_api) @@ -78,6 +78,8 @@ modest_SOURCES=\ modest-runtime-priv.h\ modest-singletons.c\ modest-singletons.h\ + modest-signal-mgr.h\ + modest-signal-mgr.c\ modest-text-utils.c\ modest-text-utils.h\ modest-tny-account-store.c\ diff --git a/src/modest-signal-mgr.c b/src/modest-signal-mgr.c new file mode 100644 index 0000000..b5f05b3 --- /dev/null +++ b/src/modest-signal-mgr.c @@ -0,0 +1,71 @@ +/* Copyright (c) 2006, Nokia Corporation + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Nokia Corporation nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS + * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER + * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "modest-signal-mgr.h" + +typedef struct { + guint handler_id; + GObject *obj; +} SignalHandler; + +GSList * +modest_signal_mgr_connect (GSList *lst, GObject *instance, const gchar *detail, + GCallback handler, gpointer data) +{ + SignalHandler *sighandler; + + g_return_val_if_fail (instance, lst); + g_return_val_if_fail (detail, lst); + g_return_val_if_fail (handler, lst); + + sighandler = g_new (SignalHandler, 1); + sighandler->obj = g_object_ref (instance); + sighandler->handler_id = g_signal_connect (instance, detail, handler, data); + + return g_slist_prepend (lst, (gpointer)sighandler); +} + + +void +modest_signal_mgr_disconnect_all_and_destroy (GSList *lst) +{ + GSList *cursor; + for (cursor = lst; cursor; cursor = g_slist_next(cursor)) { + SignalHandler *handler; + handler = (SignalHandler*)cursor->data; + if (g_signal_handler_is_connected (handler->obj, handler->handler_id)) { + //g_debug ("disconnecting %d", handler->handler_id); + g_signal_handler_disconnect (handler->obj, handler->handler_id); + } + + g_object_unref (handler->obj); + g_free (handler); + } + g_slist_free (lst); +} diff --git a/src/modest-signal-mgr.h b/src/modest-signal-mgr.h new file mode 100644 index 0000000..bd0ae8e --- /dev/null +++ b/src/modest-signal-mgr.h @@ -0,0 +1,57 @@ +/* Copyright (c) 2006, Nokia Corporation + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Nokia Corporation nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS + * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER + * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef __MODEST_SIGNAL_MGR_H__ +#define __MODEST_SIGNAL_MGR_H__ + +#include + +G_BEGIN_DECLS + +/** + * modest_signal_mgr_connect: + * + * do a g_signal_connect, and add the handler data to the list + * @lst: a GSList + * + * TRUE if this succeeded, FALSE otherwise. + */ +GSList *modest_signal_mgr_connect (GSList *lst, GObject *instance, const gchar *detail, + GCallback handler, gpointer data); + +/** + * modest_signal_mgr_disconnect_all_and_destroy: + * + * disconnect all signals in the list, and destroy the list + * + */ +void modest_signal_mgr_disconnect_all_and_destroy (GSList *lst); + +G_END_DECLS +#endif /*__MODEST_SIGNAL_MGR__*/ -- 1.7.9.5