diff options
Diffstat (limited to 'src/mm-base-call.c')
-rw-r--r-- | src/mm-base-call.c | 68 |
1 files changed, 58 insertions, 10 deletions
diff --git a/src/mm-base-call.c b/src/mm-base-call.c index 293a3dd7..e208b007 100644 --- a/src/mm-base-call.c +++ b/src/mm-base-call.c @@ -1030,14 +1030,13 @@ call_hangup_finish (MMBaseCall *self, } static void -call_hangup_ready (MMBaseModem *modem, - GAsyncResult *res, - GTask *task) +chup_ready (MMBaseModem *modem, + GAsyncResult *res, + GTask *task) { GError *error = NULL; mm_base_modem_at_command_finish (modem, res, &error); - if (error) g_task_return_error (task, error); else @@ -1046,21 +1045,70 @@ call_hangup_ready (MMBaseModem *modem, } static void -call_hangup (MMBaseCall *self, - GAsyncReadyCallback callback, - gpointer user_data) +chup_fallback (GTask *task) { - GTask *task; + MMBaseCall *self; - task = g_task_new (self, NULL, callback, user_data); + self = g_task_get_source_object (task); mm_base_modem_at_command (self->priv->modem, "+CHUP", 2, FALSE, - (GAsyncReadyCallback)call_hangup_ready, + (GAsyncReadyCallback)chup_ready, task); } +static void +chld_hangup_ready (MMBaseModem *modem, + GAsyncResult *res, + GTask *task) +{ + MMBaseCall *self; + GError *error = NULL; + + self = g_task_get_source_object (task); + + mm_base_modem_at_command_finish (modem, res, &error); + if (error) { + mm_warn ("couldn't hangup single call with call id '%u': %s", + self->priv->index, error->message); + g_error_free (error); + chup_fallback (task); + return; + } + + g_task_return_boolean (task, TRUE); + g_object_unref (task); +} + +static void +call_hangup (MMBaseCall *self, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GTask *task; + + task = g_task_new (self, NULL, callback, user_data); + + /* Try to hangup the single call id */ + if (self->priv->index) { + gchar *cmd; + + cmd = g_strdup_printf ("+CHLD=1%u", self->priv->index); + mm_base_modem_at_command (self->priv->modem, + cmd, + 2, + FALSE, + (GAsyncReadyCallback)chld_hangup_ready, + task); + g_free (cmd); + return; + } + + /* otherwise terminate all */ + chup_fallback (task); +} + /*****************************************************************************/ /* Send DTMF tone to call */ |