diff options
Diffstat (limited to 'src/mm-base-call.c')
-rw-r--r-- | src/mm-base-call.c | 320 |
1 files changed, 1 insertions, 319 deletions
diff --git a/src/mm-base-call.c b/src/mm-base-call.c index 6308fd18..e0158495 100644 --- a/src/mm-base-call.c +++ b/src/mm-base-call.c @@ -28,6 +28,7 @@ #include "mm-base-call.h" #include "mm-broadband-modem.h" +#include "mm-auth-provider.h" #include "mm-iface-modem.h" #include "mm-iface-modem-voice.h" #include "mm-base-modem-at.h" @@ -989,314 +990,6 @@ mm_base_call_received_dtmf (MMBaseCall *self, } /*****************************************************************************/ -/* Start the CALL */ - -static gboolean -call_start_finish (MMBaseCall *self, - GAsyncResult *res, - GError **error) -{ - return g_task_propagate_boolean (G_TASK (res), error); -} - -static void -call_start_ready (MMBaseModem *modem, - GAsyncResult *res, - GTask *task) -{ - GError *error = NULL; - const gchar *response = NULL; - - response = mm_base_modem_at_command_finish (modem, res, &error); - - /* check response for error */ - if (response && response[0]) - error = g_error_new (MM_CORE_ERROR, MM_CORE_ERROR_FAILED, - "Couldn't start the call: Unhandled response '%s'", response); - - if (error) - g_task_return_error (task, error); - else - g_task_return_boolean (task, TRUE); - g_object_unref (task); -} - -static void -call_start (MMBaseCall *self, - GCancellable *cancellable, - GAsyncReadyCallback callback, - gpointer user_data) -{ - GError *error = NULL; - GTask *task; - gchar *cmd; - MMIfacePortAt *port; - - task = g_task_new (self, NULL, callback, user_data); - - port = mm_base_modem_peek_best_at_port (MM_BASE_MODEM (self->priv->modem), &error); - if (!port) { - g_task_return_error (task, error); - g_object_unref (task); - return; - } - - cmd = g_strdup_printf ("ATD%s;", mm_gdbus_call_get_number (MM_GDBUS_CALL (self))); - mm_base_modem_at_command_full (self->priv->modem, - port, - cmd, - 90, - FALSE, /* no cached */ - FALSE, /* no raw */ - cancellable, - (GAsyncReadyCallback)call_start_ready, - task); - g_free (cmd); -} - -/*****************************************************************************/ -/* Accept the call */ - -static gboolean -call_accept_finish (MMBaseCall *self, - GAsyncResult *res, - GError **error) -{ - return g_task_propagate_boolean (G_TASK (res), error); -} - -static void -call_accept_ready (MMBaseModem *modem, - GAsyncResult *res, - GTask *task) -{ - GError *error = NULL; - const gchar *response; - - response = mm_base_modem_at_command_finish (modem, res, &error); - - /* check response for error */ - if (response && response[0]) - g_set_error (&error, MM_CORE_ERROR, MM_CORE_ERROR_FAILED, - "Couldn't accept the call: Unhandled response '%s'", response); - - if (error) - g_task_return_error (task, error); - else - g_task_return_boolean (task, TRUE); - g_object_unref (task); -} - -static void -call_accept (MMBaseCall *self, - GAsyncReadyCallback callback, - gpointer user_data) -{ - GTask *task; - - task = g_task_new (self, NULL, callback, user_data); - mm_base_modem_at_command (self->priv->modem, - "ATA", - 2, - FALSE, - (GAsyncReadyCallback)call_accept_ready, - task); -} - -/*****************************************************************************/ -/* Deflect the call */ - -static gboolean -call_deflect_finish (MMBaseCall *self, - GAsyncResult *res, - GError **error) -{ - return g_task_propagate_boolean (G_TASK (res), error); -} - -static void -call_deflect_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 - g_task_return_boolean (task, TRUE); - g_object_unref (task); -} - -static void -call_deflect (MMBaseCall *self, - const gchar *number, - GAsyncReadyCallback callback, - gpointer user_data) -{ - GTask *task; - gchar *cmd; - - task = g_task_new (self, NULL, callback, user_data); - - cmd = g_strdup_printf ("+CTFR=%s", number); - mm_base_modem_at_command (self->priv->modem, - cmd, - 20, - FALSE, - (GAsyncReadyCallback)call_deflect_ready, - task); - g_free (cmd); -} - -/*****************************************************************************/ -/* Hangup the call */ - -static gboolean -call_hangup_finish (MMBaseCall *self, - GAsyncResult *res, - GError **error) -{ - return g_task_propagate_boolean (G_TASK (res), error); -} - -static void -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 - g_task_return_boolean (task, TRUE); - g_object_unref (task); -} - -static void -chup_fallback (GTask *task) -{ - MMBaseCall *self; - - self = g_task_get_source_object (task); - mm_base_modem_at_command (self->priv->modem, - "+CHUP", - 2, - FALSE, - (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_obj_warn (self, "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 */ - -static gboolean -call_send_dtmf_finish (MMBaseCall *self, - GAsyncResult *res, - GError **error) -{ - return g_task_propagate_boolean (G_TASK (res), error); -} - -static void -call_send_dtmf_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_obj_dbg (self, "couldn't send dtmf: %s", error->message); - g_task_return_error (task, error); - g_object_unref (task); - return; - } - - g_task_return_boolean (task, TRUE); - g_object_unref (task); -} - -static void -call_send_dtmf (MMBaseCall *self, - const gchar *dtmf, - GAsyncReadyCallback callback, - gpointer user_data) -{ - GTask *task; - gchar *cmd; - - task = g_task_new (self, NULL, callback, user_data); - - cmd = g_strdup_printf ("AT+VTS=%c", dtmf[0]); - mm_base_modem_at_command (self->priv->modem, - cmd, - 3, - FALSE, - (GAsyncReadyCallback)call_send_dtmf_ready, - task); - - g_free (cmd); -} - -/*****************************************************************************/ static gchar * log_object_build_id (MMLogObject *_self) @@ -1498,17 +1191,6 @@ mm_base_call_class_init (MMBaseCallClass *klass) object_class->finalize = finalize; object_class->dispose = dispose; - klass->start = call_start; - klass->start_finish = call_start_finish; - klass->accept = call_accept; - klass->accept_finish = call_accept_finish; - klass->deflect = call_deflect; - klass->deflect_finish = call_deflect_finish; - klass->hangup = call_hangup; - klass->hangup_finish = call_hangup_finish; - klass->send_dtmf = call_send_dtmf; - klass->send_dtmf_finish = call_send_dtmf_finish; - properties[PROP_CONNECTION] = g_param_spec_object (MM_BASE_CALL_CONNECTION, "Connection", |