diff options
author | Denis Kenzior <denkenz@gmail.com> | 2009-10-12 11:56:41 -0500 |
---|---|---|
committer | Denis Kenzior <denkenz@gmail.com> | 2009-10-15 16:15:16 -0500 |
commit | 1575f2dcd103b9e41e52c247a039e1b17d3833b0 (patch) | |
tree | 2bdb08a924f6088968629cd08712aa9b3c6dbf43 /gatchat/gatmux.c | |
parent | e4017db3bb8b5f37060e7e7610e121f66b39c636 (diff) | |
download | ofono-1575f2dcd103b9e41e52c247a039e1b17d3833b0.tar.bz2 |
Fix: Notify sources upon shutdown
Diffstat (limited to 'gatchat/gatmux.c')
-rw-r--r-- | gatchat/gatmux.c | 247 |
1 files changed, 128 insertions, 119 deletions
diff --git a/gatchat/gatmux.c b/gatchat/gatmux.c index e100d30a..770ee4cb 100644 --- a/gatchat/gatmux.c +++ b/gatchat/gatmux.c @@ -331,125 +331,6 @@ static void debug_message(struct gsm0710_context *ctx, const char *msg) { } -static GAtMux *mux_new_gsm0710_common(GIOChannel *channel, - int mode, int frame_size) -{ - GAtMux *mux; - - if (!channel) - return NULL; - - mux = g_try_new0(GAtMux, 1); - if (!mux) - return NULL; - - mux->ref_count = 1; - - mux->channel = channel; - g_io_channel_ref(channel); - - g_io_channel_set_close_on_unref(channel, TRUE); - - gsm0710_initialize(&mux->ctx); - mux->ctx.user_data = mux; - - mux->ctx.read = do_read; - mux->ctx.write = do_write; - mux->ctx.deliver_data = deliver_data; - mux->ctx.deliver_status = deliver_status; - mux->ctx.debug_message = debug_message; - - mux->ctx.mode = mode; - mux->ctx.frame_size = frame_size; - - return mux; -} - -GAtMux *g_at_mux_new_gsm0710_basic(GIOChannel *channel, int frame_size) -{ - return mux_new_gsm0710_common(channel, GSM0710_MODE_BASIC, frame_size); -} - -GAtMux *g_at_mux_new_gsm0710_advanced(GIOChannel *channel, int frame_size) -{ - return mux_new_gsm0710_common(channel, GSM0710_MODE_ADVANCED, - frame_size); -} - -GAtMux *g_at_mux_ref(GAtMux *mux) -{ - if (mux == NULL) - return NULL; - - g_atomic_int_inc(&mux->ref_count); - - return mux; -} - -void g_at_mux_unref(GAtMux *mux) -{ - if (mux == NULL) - return; - - if (g_atomic_int_dec_and_test(&mux->ref_count)) { - g_at_mux_shutdown(mux); - - g_io_channel_unref(mux->channel); - - g_free(mux); - } -} - -gboolean g_at_mux_start(GAtMux *mux) -{ - if (mux->channel == NULL) - return FALSE; - - mux->read_watch = g_io_add_watch_full(mux->channel, G_PRIORITY_DEFAULT, - G_IO_IN | G_IO_HUP | G_IO_ERR | G_IO_NVAL, - received_data, mux, NULL); - - gsm0710_startup(&mux->ctx); - - return TRUE; -} - -gboolean g_at_mux_shutdown(GAtMux *mux) -{ - if (mux->read_watch > 0) - g_source_remove(mux->read_watch); - - if (mux->channel == NULL) - return FALSE; - - gsm0710_shutdown(&mux->ctx); - - return TRUE; -} - -gboolean g_at_mux_set_disconnect_function(GAtMux *mux, - GAtDisconnectFunc disconnect, gpointer user_data) -{ - if (mux == NULL) - return FALSE; - - mux->user_disconnect = disconnect; - mux->user_disconnect_data = user_data; - - return TRUE; -} - -gboolean g_at_mux_set_debug(GAtMux *mux, GAtDebugFunc func, gpointer user) -{ - if (mux == NULL) - return FALSE; - - mux->debugf = func; - mux->debug_data = user; - - return TRUE; -} - static gboolean watch_check(GSource *source) { return FALSE; @@ -598,6 +479,134 @@ static GIOFuncs channel_funcs = { channel_get_flags, }; +static GAtMux *mux_new_gsm0710_common(GIOChannel *channel, + int mode, int frame_size) +{ + GAtMux *mux; + + if (!channel) + return NULL; + + mux = g_try_new0(GAtMux, 1); + if (!mux) + return NULL; + + mux->ref_count = 1; + + mux->channel = channel; + g_io_channel_ref(channel); + + g_io_channel_set_close_on_unref(channel, TRUE); + + gsm0710_initialize(&mux->ctx); + mux->ctx.user_data = mux; + + mux->ctx.read = do_read; + mux->ctx.write = do_write; + mux->ctx.deliver_data = deliver_data; + mux->ctx.deliver_status = deliver_status; + mux->ctx.debug_message = debug_message; + + mux->ctx.mode = mode; + mux->ctx.frame_size = frame_size; + + return mux; +} + +GAtMux *g_at_mux_new_gsm0710_basic(GIOChannel *channel, int frame_size) +{ + return mux_new_gsm0710_common(channel, GSM0710_MODE_BASIC, frame_size); +} + +GAtMux *g_at_mux_new_gsm0710_advanced(GIOChannel *channel, int frame_size) +{ + return mux_new_gsm0710_common(channel, GSM0710_MODE_ADVANCED, + frame_size); +} + +GAtMux *g_at_mux_ref(GAtMux *mux) +{ + if (mux == NULL) + return NULL; + + g_atomic_int_inc(&mux->ref_count); + + return mux; +} + +void g_at_mux_unref(GAtMux *mux) +{ + if (mux == NULL) + return; + + if (g_atomic_int_dec_and_test(&mux->ref_count)) { + g_at_mux_shutdown(mux); + + g_io_channel_unref(mux->channel); + + g_free(mux); + } +} + +gboolean g_at_mux_start(GAtMux *mux) +{ + if (mux->channel == NULL) + return FALSE; + + mux->read_watch = g_io_add_watch_full(mux->channel, G_PRIORITY_DEFAULT, + G_IO_IN | G_IO_HUP | G_IO_ERR | G_IO_NVAL, + received_data, mux, NULL); + + gsm0710_startup(&mux->ctx); + + return TRUE; +} + +gboolean g_at_mux_shutdown(GAtMux *mux) +{ + int i; + + if (mux->read_watch > 0) + g_source_remove(mux->read_watch); + + for (i = 0; i < MAX_CHANNELS; i++) { + if (mux->dlcs[i] == NULL) + continue; + + channel_close((GIOChannel *) mux->dlcs[i], NULL); + } + + if (mux->channel == NULL) + return FALSE; + + gsm0710_shutdown(&mux->ctx); + + return TRUE; +} + +gboolean g_at_mux_set_disconnect_function(GAtMux *mux, + GAtDisconnectFunc disconnect, gpointer user_data) +{ + if (mux == NULL) + return FALSE; + + mux->user_disconnect = disconnect; + mux->user_disconnect_data = user_data; + + return TRUE; +} + +gboolean g_at_mux_set_debug(GAtMux *mux, GAtDebugFunc func, gpointer user) +{ + if (mux == NULL) + return FALSE; + + mux->debugf = func; + mux->debug_data = user; + + return TRUE; +} + GIOChannel *g_at_mux_create_channel(GAtMux *mux) { GAtMuxChannel *mux_channel; |