aboutsummaryrefslogtreecommitdiff
path: root/src/mm-base-call.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/mm-base-call.c')
-rw-r--r--src/mm-base-call.c68
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 */