From edd0b327e0479c5f3ce48f3d2b25fdc8abb379ea Mon Sep 17 00:00:00 2001 From: Pekka Pessi Date: Tue, 23 Nov 2010 16:07:00 +0200 Subject: gisi: Remove forward reference --- gisi/modem.c | 189 +++++++++++++++++++++++++++++------------------------------ 1 file changed, 94 insertions(+), 95 deletions(-) (limited to 'gisi/modem.c') diff --git a/gisi/modem.c b/gisi/modem.c index 746a56f1..971d09e9 100644 --- a/gisi/modem.c +++ b/gisi/modem.c @@ -275,53 +275,44 @@ static gboolean isi_callback(GIOChannel *channel, GIOCondition cond, return TRUE; } -GIsiModem *g_isi_modem_create(unsigned index) +static gboolean modem_subs_update(gpointer data) { - GIsiModem *modem; - GIOChannel *inds; - GIOChannel *reqs; - - if (index == 0) { - errno = ENODEV; - return NULL; - } + GHashTableIter iter; + gpointer keyptr, value; - modem = g_try_new0(GIsiModem, 1); - if (!modem) { - errno = ENOMEM; - return NULL; - } + GIsiModem *modem = data; + uint8_t msg[3 + 256] = { + 0, PNS_SUBSCRIBED_RESOURCES_IND, + 0, + }; + uint8_t count = 0; - inds = g_isi_phonet_new(index); - reqs = g_isi_phonet_new(index); + modem->subs_source = 0; - if (!inds || !reqs) { - g_free(modem); - return NULL; - } + g_hash_table_iter_init(&iter, modem->services); - modem->req_fd = g_io_channel_unix_get_fd(reqs); - modem->req_watch = g_io_add_watch(reqs, - G_IO_IN|G_IO_ERR|G_IO_HUP|G_IO_NVAL, - isi_callback, modem); - modem->ind_fd = g_io_channel_unix_get_fd(inds); - modem->ind_watch = g_io_add_watch(inds, - G_IO_IN|G_IO_ERR|G_IO_HUP|G_IO_NVAL, - isi_callback, modem); + while (g_hash_table_iter_next(&iter, &keyptr, &value)) { + GIsiServiceMux *mux = value; - g_io_channel_unref(reqs); - g_io_channel_unref(inds); + if (mux->subscriptions > 0) { + msg[3 + count] = mux->resource; + count++; + } + } + msg[2] = count; - modem->index = index; - modem->services = g_hash_table_new_full(g_direct_hash, NULL, - NULL, service_finalize); + sendto(modem->ind_fd, msg, 3 + msg[2], MSG_NOSIGNAL, (void *)&commgr, + sizeof(commgr)); - return modem; + return FALSE; } -GIsiModem *g_isi_modem_create_by_name(const char *name) +static void modem_subs_update_when_idle(GIsiModem *modem) { - return g_isi_modem_create(if_nametoindex(name)); + if (modem->subs_source > 0) + return; + + modem->subs_source = g_idle_add(modem_subs_update, modem); } static void service_name_register(GIsiServiceMux *mux) @@ -358,45 +349,85 @@ static void service_name_deregister(GIsiServiceMux *mux) (void *)&namesrv, sizeof(namesrv)); } -static gboolean modem_subs_update(gpointer data) +static void pending_destroy(gpointer value, gpointer user) { - GHashTableIter iter; - gpointer keyptr, value; + GIsiPending *op = value; - GIsiModem *modem = data; - uint8_t msg[3 + 256] = { - 0, PNS_SUBSCRIBED_RESOURCES_IND, - 0, - }; - uint8_t count = 0; + if (!op) + return; - modem->subs_source = 0; + if (op->timeout > 0) + g_source_remove(op->timeout); - g_hash_table_iter_init(&iter, modem->services); + if (op->destroy) + op->destroy(op->data); - while (g_hash_table_iter_next(&iter, &keyptr, &value)) { - GIsiServiceMux *mux = value; + g_free(op); +} - if (mux->subscriptions > 0) { - msg[3 + count] = mux->resource; - count++; - } - } - msg[2] = count; +static void service_finalize(gpointer value) +{ + GIsiServiceMux *mux = value; + GIsiModem *modem = mux->modem; - sendto(modem->ind_fd, msg, 3 + msg[2], MSG_NOSIGNAL, (void *)&commgr, - sizeof(commgr)); + if (mux->subscriptions > 0) + modem_subs_update_when_idle(modem); - return FALSE; -} + if (mux->registrations > 0) + service_name_deregister(mux); + g_slist_foreach(mux->pending, pending_destroy, NULL); + g_slist_free(mux->pending); + g_free(mux); +} -static void modem_subs_update_when_idle(GIsiModem *modem) +GIsiModem *g_isi_modem_create(unsigned index) { - if (modem->subs_source > 0) - return; + GIsiModem *modem; + GIOChannel *inds; + GIOChannel *reqs; - modem->subs_source = g_idle_add(modem_subs_update, modem); + if (index == 0) { + errno = ENODEV; + return NULL; + } + + modem = g_try_new0(GIsiModem, 1); + if (!modem) { + errno = ENOMEM; + return NULL; + } + + inds = g_isi_phonet_new(index); + reqs = g_isi_phonet_new(index); + + if (!inds || !reqs) { + g_free(modem); + return NULL; + } + + modem->req_fd = g_io_channel_unix_get_fd(reqs); + modem->req_watch = g_io_add_watch(reqs, + G_IO_IN|G_IO_ERR|G_IO_HUP|G_IO_NVAL, + isi_callback, modem); + modem->ind_fd = g_io_channel_unix_get_fd(inds); + modem->ind_watch = g_io_add_watch(inds, + G_IO_IN|G_IO_ERR|G_IO_HUP|G_IO_NVAL, + isi_callback, modem); + + g_io_channel_unref(reqs); + g_io_channel_unref(inds); + + modem->index = index; + modem->services = g_hash_table_new_full(g_direct_hash, NULL, + NULL, service_finalize); + + return modem; +} + +GIsiModem *g_isi_modem_create_by_name(const char *name) +{ + return g_isi_modem_create(if_nametoindex(name)); } static uint8_t service_next_utid(GIsiServiceMux *mux) @@ -449,38 +480,6 @@ static void service_regs_decr(GIsiServiceMux *mux) service_name_deregister(mux); } -static void pending_destroy(gpointer value, gpointer user) -{ - GIsiPending *op = value; - - if (!op) - return; - - if (op->timeout > 0) - g_source_remove(op->timeout); - - if (op->destroy) - op->destroy(op->data); - - g_free(op); -} - -static void service_finalize(gpointer value) -{ - GIsiServiceMux *mux = value; - GIsiModem *modem = mux->modem; - - if (mux->subscriptions > 0) - modem_subs_update_when_idle(modem); - - if (mux->registrations > 0) - service_name_deregister(mux); - - g_slist_foreach(mux->pending, pending_destroy, NULL); - g_slist_free(mux->pending); - g_free(mux); -} - void g_isi_modem_destroy(GIsiModem *modem) { if (!modem) -- cgit v1.2.3