diff options
author | Aleksander Morgado <aleksander@lanedo.com> | 2012-08-22 17:14:14 +0200 |
---|---|---|
committer | Aleksander Morgado <aleksander@lanedo.com> | 2012-08-23 18:56:22 +0200 |
commit | 7027c6e9729f5eeaf53c11d7791b372cb9e85e43 (patch) | |
tree | 384d176829cc4260f7cba965db1eaca51b2d41fa | |
parent | d8bc27a8c3681693a0c297a965d5f5858258d96a (diff) |
sierra: custom 3GPP disconnection sequence
-rw-r--r-- | plugins/sierra/mm-broadband-bearer-sierra.c | 97 |
1 files changed, 97 insertions, 0 deletions
diff --git a/plugins/sierra/mm-broadband-bearer-sierra.c b/plugins/sierra/mm-broadband-bearer-sierra.c index f18305dc..58bec2f5 100644 --- a/plugins/sierra/mm-broadband-bearer-sierra.c +++ b/plugins/sierra/mm-broadband-bearer-sierra.c @@ -275,6 +275,101 @@ dial_3gpp (MMBroadbandBearer *self, } /*****************************************************************************/ +/* 3GPP disconnect */ + +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 +parent_disconnect_3gpp_ready (MMBroadbandBearer *self, + GAsyncResult *res, + GSimpleAsyncResult *simple) +{ + GError *error = NULL; + + if (!MM_BROADBAND_BEARER_CLASS (mm_broadband_bearer_sierra_parent_class)->disconnect_3gpp_finish (self, res, &error)) { + mm_dbg ("Parent disconnection failed (not fatal): %s", error->message); + g_error_free (error); + } + + g_simple_async_result_set_op_res_gboolean (simple, TRUE); + g_simple_async_result_complete (simple); + g_object_unref (simple); +} + +static void +disconnect_scact_ready (MMBaseModem *modem, + GAsyncResult *res, + GSimpleAsyncResult *simple) +{ + 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 (simple, TRUE); + g_simple_async_result_complete (simple); + g_object_unref (simple); +} + +static void +disconnect_3gpp (MMBroadbandBearer *self, + MMBroadbandModem *modem, + MMAtSerialPort *primary, + MMAtSerialPort *secondary, + MMPort *data, + guint cid, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GSimpleAsyncResult *result; + + g_assert (primary != NULL); + + result = g_simple_async_result_new (G_OBJECT (self), + callback, + user_data, + disconnect_3gpp); + + if (!MM_IS_AT_SERIAL_PORT (data)) { + gchar *command; + + /* Use specific CID */ + command = g_strdup_printf ("!SCACT=0,%u", cid); + mm_base_modem_at_command_full (MM_BASE_MODEM (modem), + primary, + command, + 3, + FALSE, + NULL, /* cancellable */ + (GAsyncReadyCallback)disconnect_scact_ready, + result); + g_free (command); + return; + } + + /* Chain up parent's disconnection if we don't have a net port */ + MM_BROADBAND_BEARER_CLASS (mm_broadband_bearer_sierra_parent_class)->disconnect_3gpp ( + self, + modem, + primary, + secondary, + data, + cid, + (GAsyncReadyCallback)parent_disconnect_3gpp_ready, + result); +} + +/*****************************************************************************/ MMBearer * mm_broadband_bearer_sierra_new_finish (GAsyncResult *res, @@ -326,4 +421,6 @@ mm_broadband_bearer_sierra_class_init (MMBroadbandBearerSierraClass *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; } |