diff options
author | Aleksander Morgado <aleksander@aleksander.es> | 2018-06-14 11:59:04 +0200 |
---|---|---|
committer | Dan Williams <dcbw@redhat.com> | 2018-10-16 17:09:21 +0000 |
commit | 0ac15f6e229a57c7ebefc9731d11bdba3f151c77 (patch) | |
tree | 2874c3123b0e6c325029dc9ebf0328243c8fb595 | |
parent | fa67a4f9bb014c947a9bb1c5f207ea787c8976b7 (diff) |
base-call: fix logic when accepting calls
Don't return FALSE when call is successfully accepted, otherwise the
caller will get very confused:
ModemManager[19952]: <debug> [1528968478.344338] (ttyACM2): --> 'ATA<CR>'
ModemManager[19952]: <debug> [1528968478.361986] (ttyACM2): <-- '<CR><LF>OK<CR><LF>'
(ModemManager:19952): GLib-GIO-CRITICAL **: 11:27:58.387: g_dbus_method_invocation_take_error: assertion 'error != NULL' failed
And also, make sure the async task is always finished, even when
mm_base_modem_at_command_finish() returns an error which is not
MM_SERIAL_ERROR_RESPONSE_TIMEOUT.
-rw-r--r-- | src/mm-base-call.c | 52 |
1 files changed, 16 insertions, 36 deletions
diff --git a/src/mm-base-call.c b/src/mm-base-call.c index 947a6d38..7b020e0c 100644 --- a/src/mm-base-call.c +++ b/src/mm-base-call.c @@ -661,73 +661,53 @@ call_start (MMBaseCall *self, } /*****************************************************************************/ - -/* Accept the CALL */ +/* Accept the call */ static gboolean -call_accept_finish (MMBaseCall *self, - GAsyncResult *res, - GError **error) +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, +call_accept_ready (MMBaseModem *modem, GAsyncResult *res, - GTask *task) + GTask *task) { - MMBaseCall *self; - GError *error = NULL; + MMBaseCall *self; + GError *error = NULL; const gchar *response; self = g_task_get_source_object (task); response = mm_base_modem_at_command_finish (modem, res, &error); - if (error) { - if (g_error_matches (error, MM_SERIAL_ERROR, MM_SERIAL_ERROR_RESPONSE_TIMEOUT)) { - g_task_return_error (task, error); - g_object_unref (task); - return; - } - - mm_dbg ("Couldn't accept call : '%s'", error->message); - g_error_free (error); - return; - } /* check response for error */ - if (response && response[0]) { + if (response && response[0]) g_set_error (&error, MM_CORE_ERROR, MM_CORE_ERROR_FAILED, - "Couldn't accept the call: " - "Unhandled response '%s'", response); + "Couldn't accept the call: Unhandled response '%s'", response); - /* Update state */ + if (error) { mm_base_call_change_state (self, MM_CALL_STATE_TERMINATED, MM_CALL_STATE_REASON_ERROR); + g_task_return_error (task, error); } else { - /* Update state */ mm_base_call_change_state (self, MM_CALL_STATE_ACTIVE, MM_CALL_STATE_REASON_ACCEPTED); + g_task_return_boolean (task, TRUE); } - if (error) { - g_task_return_error (task, error); - g_object_unref (task); - return; - } - - g_task_return_boolean (task, FALSE); g_object_unref (task); } static void -call_accept (MMBaseCall *self, - GAsyncReadyCallback callback, - gpointer user_data) +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, |