[evolution-kolab/gnome-2-30] KolabMailAccess: allocate mem for strans function pointers
- From: Christian Hilberg <chilberg src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [evolution-kolab/gnome-2-30] KolabMailAccess: allocate mem for strans function pointers
- Date: Thu, 17 Nov 2011 17:50:51 +0000 (UTC)
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]