diff options
author | Aleksander Morgado <aleksander@lanedo.com> | 2012-08-23 18:52:32 +0200 |
---|---|---|
committer | Aleksander Morgado <aleksander@lanedo.com> | 2012-08-23 18:56:23 +0200 |
commit | 2d0cb24af86610032e4f797ccc407ec0722623bd (patch) | |
tree | 62a1830b608848c47314de0e4397b3d3a0f976fb | |
parent | 3ddb57d816ae449c4b4b2d7fc4c201d4d68cf50d (diff) |
mbm: implement custom 3GPP disconnection sequence
-rw-r--r-- | plugins/mbm/mm-broadband-bearer-mbm.c | 82 |
1 files changed, 82 insertions, 0 deletions
diff --git a/plugins/mbm/mm-broadband-bearer-mbm.c b/plugins/mbm/mm-broadband-bearer-mbm.c index e0624616..1e2b9f7a 100644 --- a/plugins/mbm/mm-broadband-bearer-mbm.c +++ b/plugins/mbm/mm-broadband-bearer-mbm.c @@ -448,6 +448,86 @@ dial_3gpp (MMBroadbandBearer *self, } /*****************************************************************************/ +/* 3GPP disconnect */ + +typedef struct { + MMBroadbandBearerMbm *self; + MMBaseModem *modem; + MMAtSerialPort *primary; + GSimpleAsyncResult *result; +} DisconnectContext; + +static void +disconnect_context_complete_and_free (DisconnectContext *ctx) +{ + g_simple_async_result_complete (ctx->result); + g_object_unref (ctx->result); + g_object_unref (ctx->primary); + g_object_unref (ctx->self); + g_object_unref (ctx->modem); + g_free (ctx); +} + +static gboolean +disconnect_3gpp_finish (MMBroadbandBearer *self, + GAsyncResult *res, + GError **error) +{ + return !g_simple_async_result_propagate_error (G_SIMPLE_ASYNC_RESULT (res), error); +} + +static void +disconnect_enap_ready (MMBaseModem *modem, + GAsyncResult *res, + DisconnectContext *ctx) +{ + GError *error = NULL; + + /* Ignore errors for now */ + mm_base_modem_at_command_full_finish (MM_BASE_MODEM (modem), res, &error); + if (error) { + mm_dbg ("Disconnection failed (not fatal): %s", error->message); + g_error_free (error); + } + + g_simple_async_result_set_op_res_gboolean (ctx->result, TRUE); + disconnect_context_complete_and_free (ctx); +} + +static void +disconnect_3gpp (MMBroadbandBearer *self, + MMBroadbandModem *modem, + MMAtSerialPort *primary, + MMAtSerialPort *secondary, + MMPort *data, + guint cid, + GAsyncReadyCallback callback, + gpointer user_data) +{ + DisconnectContext *ctx; + + g_assert (primary != NULL); + + ctx = g_new0 (DisconnectContext, 1); + ctx->self = g_object_ref (self); + ctx->modem = MM_BASE_MODEM (g_object_ref (modem)); + ctx->primary = g_object_ref (primary); + ctx->result = g_simple_async_result_new (G_OBJECT (self), + callback, + user_data, + disconnect_3gpp); + + mm_base_modem_at_command_full (MM_BASE_MODEM (modem), + primary, + "*ENAP=0", + 3, + FALSE, + NULL, /* cancellable */ + (GAsyncReadyCallback)disconnect_enap_ready, + ctx); +} + +/*****************************************************************************/ MMBearer * mm_broadband_bearer_mbm_new_finish (GAsyncResult *res, @@ -507,4 +587,6 @@ mm_broadband_bearer_mbm_class_init (MMBroadbandBearerMbmClass *klass) broadband_bearer_class->dial_3gpp = dial_3gpp; broadband_bearer_class->dial_3gpp_finish = dial_3gpp_finish; + broadband_bearer_class->disconnect_3gpp = disconnect_3gpp; + broadband_bearer_class->disconnect_3gpp_finish = disconnect_3gpp_finish; } |