diff options
Diffstat (limited to 'src/mm-base-call.c')
-rw-r--r-- | src/mm-base-call.c | 112 |
1 files changed, 35 insertions, 77 deletions
diff --git a/src/mm-base-call.c b/src/mm-base-call.c index 6972276a..8f9f3fda 100644 --- a/src/mm-base-call.c +++ b/src/mm-base-call.c @@ -79,17 +79,23 @@ handle_start_ready (MMBaseCall *self, { GError *error = NULL; - if (!MM_BASE_CALL_GET_CLASS (self)->start_finish (self, res, &error)) + if (!MM_BASE_CALL_GET_CLASS (self)->start_finish (self, res, &error)) { + mm_warn ("Couldn't start call : '%s'", error->message); + /* Convert errors into call state updates */ + if (g_error_matches (error, MM_CONNECTION_ERROR, MM_CONNECTION_ERROR_NO_DIALTONE)) + mm_base_call_change_state (self, MM_CALL_STATE_TERMINATED, MM_CALL_STATE_REASON_ERROR); + else if (g_error_matches (error, MM_CONNECTION_ERROR, MM_CONNECTION_ERROR_BUSY) || + g_error_matches (error, MM_CONNECTION_ERROR, MM_CONNECTION_ERROR_NO_ANSWER) || + g_error_matches (error, MM_CONNECTION_ERROR, MM_CONNECTION_ERROR_NO_CARRIER)) + mm_base_call_change_state (self, MM_CALL_STATE_TERMINATED, MM_CALL_STATE_REASON_REFUSED_OR_BUSY); + else + mm_base_call_change_state (self, MM_CALL_STATE_TERMINATED, MM_CALL_STATE_REASON_UNKNOWN); g_dbus_method_invocation_take_error (ctx->invocation, error); - else { - /* Transition from Unknown->Dialing */ - if (mm_gdbus_call_get_state (MM_GDBUS_CALL (ctx->self)) == MM_CALL_STATE_UNKNOWN ) { - /* Update state */ - mm_base_call_change_state (self, MM_CALL_STATE_DIALING, MM_CALL_STATE_REASON_OUTGOING_STARTED); - } + } else { + mm_dbg ("Call started"); + mm_base_call_change_state (self, MM_CALL_STATE_DIALING, MM_CALL_STATE_REASON_OUTGOING_STARTED); mm_gdbus_call_complete_start (MM_GDBUS_CALL (ctx->self), ctx->invocation); } - handle_start_context_free (ctx); } @@ -130,6 +136,8 @@ handle_start_auth_ready (MMBaseModem *modem, return; } + mm_base_call_change_state (ctx->self, MM_CALL_STATE_RINGING_OUT, MM_CALL_STATE_REASON_OUTGOING_STARTED); + MM_BASE_CALL_GET_CLASS (ctx->self)->start (ctx->self, (GAsyncReadyCallback)handle_start_ready, ctx); @@ -176,22 +184,18 @@ handle_accept_context_free (HandleAcceptContext *ctx) static void handle_accept_ready (MMBaseCall *self, - GAsyncResult *res, - HandleAcceptContext *ctx) + GAsyncResult *res, + HandleAcceptContext *ctx) { GError *error = NULL; - if (!MM_BASE_CALL_GET_CLASS (self)->accept_finish (self, res, &error)) + if (!MM_BASE_CALL_GET_CLASS (self)->accept_finish (self, res, &error)) { + mm_base_call_change_state (self, MM_CALL_STATE_TERMINATED, MM_CALL_STATE_REASON_ERROR); g_dbus_method_invocation_take_error (ctx->invocation, error); - else { - /* Transition from Unknown->Dialing */ - if (mm_gdbus_call_get_state (MM_GDBUS_CALL (ctx->self)) == MM_CALL_STATE_RINGING_IN) { - /* Update state */ - mm_base_call_change_state (self, MM_CALL_STATE_ACTIVE, MM_CALL_STATE_REASON_ACCEPTED); - } + } else { + mm_base_call_change_state (self, MM_CALL_STATE_ACTIVE, MM_CALL_STATE_REASON_ACCEPTED); mm_gdbus_call_complete_accept (MM_GDBUS_CALL (ctx->self), ctx->invocation); } - handle_accept_context_free (ctx); } @@ -216,7 +220,7 @@ handle_accept_auth_ready (MMBaseModem *modem, g_dbus_method_invocation_return_error (ctx->invocation, MM_CORE_ERROR, MM_CORE_ERROR_FAILED, - "This call was not ringing, cannot accept "); + "This call was not ringing, cannot accept"); handle_accept_context_free (ctx); return; } @@ -284,17 +288,13 @@ handle_hangup_ready (MMBaseCall *self, { GError *error = NULL; + /* we set it as terminated even if we got an error reported */ + mm_base_call_change_state (self, MM_CALL_STATE_TERMINATED, MM_CALL_STATE_REASON_TERMINATED); + if (!MM_BASE_CALL_GET_CLASS (self)->hangup_finish (self, res, &error)) g_dbus_method_invocation_take_error (ctx->invocation, error); - else { - /* Transition from Unknown->Dialing */ - if (mm_gdbus_call_get_state (MM_GDBUS_CALL (ctx->self)) != MM_CALL_STATE_TERMINATED || - mm_gdbus_call_get_state (MM_GDBUS_CALL (ctx->self)) != MM_CALL_STATE_UNKNOWN) { - /* Update state */ - mm_base_call_change_state (self, MM_CALL_STATE_TERMINATED, MM_CALL_STATE_REASON_TERMINATED); - } + else mm_gdbus_call_complete_hangup (MM_GDBUS_CALL (ctx->self), ctx->invocation); - } handle_hangup_context_free (ctx); } @@ -331,7 +331,7 @@ handle_hangup_auth_ready (MMBaseModem *modem, g_dbus_method_invocation_return_error (ctx->invocation, MM_CORE_ERROR, MM_CORE_ERROR_UNSUPPORTED, - "Hanguping call is not supported by this modem"); + "Hanging up call is not supported by this modem"); handle_hangup_context_free (ctx); return; } @@ -595,48 +595,16 @@ call_start_ready (MMBaseModem *modem, 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)) { - /* something is wrong, serial timeout could never occurs */ - } - - if (g_error_matches (error, MM_CONNECTION_ERROR, MM_CONNECTION_ERROR_NO_DIALTONE)) { - /* Update state */ - mm_base_call_change_state (self, MM_CALL_STATE_TERMINATED, MM_CALL_STATE_REASON_ERROR); - } - - if (g_error_matches (error, MM_CONNECTION_ERROR, MM_CONNECTION_ERROR_BUSY) || - g_error_matches (error, MM_CONNECTION_ERROR, MM_CONNECTION_ERROR_NO_ANSWER) || - g_error_matches (error, MM_CONNECTION_ERROR, MM_CONNECTION_ERROR_NO_CARRIER)) { - /* Update state */ - mm_base_call_change_state (self, MM_CALL_STATE_TERMINATED, MM_CALL_STATE_REASON_REFUSED_OR_BUSY); - } - - mm_dbg ("Couldn't start call : '%s'", error->message); - g_task_return_error (task, error); - g_object_unref (task); - return; - } /* check response for error */ - if (response && response[0]) { + if (response && response[0]) error = g_error_new (MM_CORE_ERROR, MM_CORE_ERROR_FAILED, - "Couldn't start the call: " - "Modem response '%s'", response); - /* Update state */ - mm_base_call_change_state (self, MM_CALL_STATE_TERMINATED, MM_CALL_STATE_REASON_REFUSED_OR_BUSY); - } else { - /* Update state */ - mm_base_call_change_state (self, MM_CALL_STATE_ACTIVE, MM_CALL_STATE_REASON_ACCEPTED); - } + "Couldn't start the call: Unhandled response '%s'", response); - if (error) { + if (error) g_task_return_error (task, error); - g_object_unref (task); - return; - } - - g_task_return_boolean (task, TRUE); + else + g_task_return_boolean (task, TRUE); g_object_unref (task); } @@ -657,9 +625,6 @@ call_start (MMBaseCall *self, FALSE, (GAsyncReadyCallback)call_start_ready, task); - - /* Update state */ - mm_base_call_change_state (self, MM_CALL_STATE_RINGING_OUT, MM_CALL_STATE_REASON_OUTGOING_STARTED); g_free (cmd); } @@ -692,14 +657,10 @@ call_accept_ready (MMBaseModem *modem, g_set_error (&error, MM_CORE_ERROR, MM_CORE_ERROR_FAILED, "Couldn't accept the call: Unhandled response '%s'", response); - if (error) { - mm_base_call_change_state (self, MM_CALL_STATE_TERMINATED, MM_CALL_STATE_REASON_ERROR); + if (error) g_task_return_error (task, error); - } else { - mm_base_call_change_state (self, MM_CALL_STATE_ACTIVE, MM_CALL_STATE_REASON_ACCEPTED); + else g_task_return_boolean (task, TRUE); - } - g_object_unref (task); } @@ -742,9 +703,6 @@ call_hangup_ready (MMBaseModem *modem, mm_base_modem_at_command_finish (modem, res, &error); - /* we set it as terminated even if we got an error reported */ - mm_base_call_change_state (self, MM_CALL_STATE_TERMINATED, MM_CALL_STATE_REASON_TERMINATED); - if (error) g_task_return_error (task, error); else |