[evolution-kolab/gnome-2-30] KolabMailAccess: allocate mem for strans function pointers



commit da36d083f2cece51e2a8e63c7acd9bd3957eb846
Author: Christian Hilberg <hilberg kernelconcepts de>
Date:   Thu Nov 17 18:33:24 2011 +0100

    KolabMailAccess: allocate mem for strans function pointers
    
    * ISO C forbids conversion of function pointer to object pointer type
      (there's no guarantee that a function pointer will always
      fit into a void*)
    * therefore, we need to explicitly allocate some memory
      via a struct containing the function pointer as a member,
      which we can then stuff into a GHashTable

 src/libekolab/kolab-mail-access.c |   71 ++++++++++++++++++++++++++----------
 1 files changed, 51 insertions(+), 20 deletions(-)
---
diff --git a/src/libekolab/kolab-mail-access.c b/src/libekolab/kolab-mail-access.c
index 90b1247..b494e4f 100644
--- a/src/libekolab/kolab-mail-access.c
+++ b/src/libekolab/kolab-mail-access.c
@@ -910,6 +910,11 @@ kolab_mail_access_local_delete (KolabMailAccess *self,
 
 typedef gboolean (*KolabMailAccessStateTransitionFunc) (KolabMailAccess *self, GError **err);
 
+typedef struct _KolabMailAccessSTFWrap KolabMailAccessSTFWrap;
+struct _KolabMailAccessSTFWrap {
+	KolabMailAccessStateTransitionFunc fn;
+};
+
 /* this must be kept in sync with KolabMailAccessOpmodeID */
 static gint opmode_values[] = {
 	KOLAB_MAIL_ACCESS_OPMODE_INVAL,
@@ -1415,6 +1420,7 @@ kolab_mail_access_new_strans_table (void)
 {
 	GHashTable *stranstbl = NULL;
 	GHashTable *tmp_tbl = NULL;
+	KolabMailAccessSTFWrap *tmp_stf = NULL;
 	
 	/* state transition function table */
 	stranstbl = g_hash_table_new_full (g_int_hash,
@@ -1422,47 +1428,72 @@ kolab_mail_access_new_strans_table (void)
 	                                   NULL,
 	                                   kolab_util_glib_ghashtable_gdestroy);
 	
-	/* transitions from CONFIGURED state */
-	tmp_tbl = g_hash_table_new (g_int_hash, g_int_equal);
+	/* --- transitions from CONFIGURED state --- */
+	tmp_tbl = g_hash_table_new_full (g_int_hash, g_int_equal, NULL, g_free);
+	/* configured -> offline */
+	tmp_stf = g_new0 (KolabMailAccessSTFWrap, 1);
+	tmp_stf->fn = kolab_mail_access_strans_configured_offline;
 	g_hash_table_insert (tmp_tbl,
 	                     &opmode_values[KOLAB_MAIL_ACCESS_OPMODE_OFFLINE],
-	                     (gpointer)kolab_mail_access_strans_configured_offline);
+	                     tmp_stf);
+	/* configured -> online */
+	tmp_stf = g_new0 (KolabMailAccessSTFWrap, 1);
+	tmp_stf->fn = kolab_mail_access_strans_configured_online;
 	g_hash_table_insert (tmp_tbl,
 	                     &opmode_values[KOLAB_MAIL_ACCESS_OPMODE_ONLINE],
-	                     (gpointer)kolab_mail_access_strans_configured_online);
+	                     tmp_stf);
+	/* insert CONFIGURED */
 	g_hash_table_insert (stranstbl,
 	                     &opmode_values[KOLAB_MAIL_ACCESS_OPMODE_CONFIGURED],
-	                     (gpointer)tmp_tbl);
+	                     tmp_tbl);
 
-	/* transitions from OFFLINE state */
-	tmp_tbl = g_hash_table_new (g_int_hash, g_int_equal);
+	/* --- transitions from OFFLINE state --- */
+	tmp_tbl = g_hash_table_new_full (g_int_hash, g_int_equal, NULL, g_free);
+	/* offline -> online */
+	tmp_stf = g_new0 (KolabMailAccessSTFWrap, 1);
+	tmp_stf->fn = kolab_mail_access_strans_offline_online;	
 	g_hash_table_insert (tmp_tbl,
 	                     &opmode_values[KOLAB_MAIL_ACCESS_OPMODE_ONLINE],
-	                     (gpointer)kolab_mail_access_strans_offline_online);
+	                     tmp_stf);
+	/* offline -> shutdown */
+	tmp_stf = g_new0 (KolabMailAccessSTFWrap, 1);
+	tmp_stf->fn = kolab_mail_access_strans_offline_shutdown;	
 	g_hash_table_insert (tmp_tbl,
 	                     &opmode_values[KOLAB_MAIL_ACCESS_OPMODE_SHUTDOWN],
-	                     (gpointer)kolab_mail_access_strans_offline_shutdown);
+	                     tmp_stf);
+	/* insert OFFLINE */
 	g_hash_table_insert (stranstbl,
 	                     &opmode_values[KOLAB_MAIL_ACCESS_OPMODE_OFFLINE],
 	                     tmp_tbl);
 
-	/* transitions from ONLINE state */
-	tmp_tbl = g_hash_table_new (g_int_hash, g_int_equal);
+	/* --- transitions from ONLINE state --- */
+	tmp_tbl = g_hash_table_new_full (g_int_hash, g_int_equal, NULL, g_free);
+	/* online -> offline */
+	tmp_stf = g_new0 (KolabMailAccessSTFWrap, 1);
+	tmp_stf->fn = kolab_mail_access_strans_online_offline;
 	g_hash_table_insert (tmp_tbl,
 	                     &opmode_values[KOLAB_MAIL_ACCESS_OPMODE_OFFLINE],
-	                     (gpointer)kolab_mail_access_strans_online_offline);
+	                     tmp_stf);
+	/* online -> shutdown */
+	tmp_stf = g_new0 (KolabMailAccessSTFWrap, 1);
+	tmp_stf->fn = kolab_mail_access_strans_online_shutdown;
 	g_hash_table_insert (tmp_tbl,
 	                     &opmode_values[KOLAB_MAIL_ACCESS_OPMODE_SHUTDOWN],
-	                     (gpointer)kolab_mail_access_strans_online_shutdown);
+	                     tmp_stf);
+	/* insert ONLINE */
 	g_hash_table_insert (stranstbl,
 	                     &opmode_values[KOLAB_MAIL_ACCESS_OPMODE_ONLINE],
 	                     tmp_tbl);
 
-	/* transitions from SHUTDOWN state */
-	tmp_tbl = g_hash_table_new (g_int_hash, g_int_equal);
+	/* --- transitions from SHUTDOWN state --- */
+	tmp_tbl = g_hash_table_new_full (g_int_hash, g_int_equal, NULL, g_free);
+	/* shutdown -> configured */
+	tmp_stf = g_new0 (KolabMailAccessSTFWrap, 1);
+	tmp_stf->fn = kolab_mail_access_strans_shutdown_configured;
 	g_hash_table_insert (tmp_tbl,
 	                     &opmode_values[KOLAB_MAIL_ACCESS_OPMODE_CONFIGURED],
-	                     (gpointer)kolab_mail_access_strans_shutdown_configured);
+	                     tmp_stf);
+	/* insert SHUTDOWN */
 	g_hash_table_insert (stranstbl,
 	                     &opmode_values[KOLAB_MAIL_ACCESS_OPMODE_SHUTDOWN],
 	                     tmp_tbl);
@@ -1476,7 +1507,7 @@ kolab_mail_access_get_strans_func (KolabMailAccess *self,
                                    GError **err)
 {
 	KolabMailAccessPrivate *priv = NULL;
-	gpointer func = NULL;
+	KolabMailAccessSTFWrap *stf = NULL;
 	GHashTable *tbl = NULL;
 	
 	g_assert (KOLAB_IS_MAIL_ACCESS (self));
@@ -1500,8 +1531,8 @@ kolab_mail_access_get_strans_func (KolabMailAccess *self,
 	}
 
 	/* lookup transition function for (current opmode)->(opmode) */
-	func = g_hash_table_lookup (tbl, &opmode_values[opmode]);
-	if (func == NULL) {
+	stf = (KolabMailAccessSTFWrap*) g_hash_table_lookup (tbl, &opmode_values[opmode]);
+	if (stf == NULL) {
 		g_set_error (err,
 			     KOLAB_BACKEND_ERROR,
 			     KOLAB_BACKEND_ERROR_STATE_WRONG_FOR_OP,
@@ -1511,7 +1542,7 @@ kolab_mail_access_get_strans_func (KolabMailAccess *self,
 		             opmode);
 	}
 	
-	return (KolabMailAccessStateTransitionFunc)func;
+	return stf->fn;
 }
 
 /*----------------------------------------------------------------------------*/



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]