diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/mm-base-call.c | 24 |
1 files changed, 17 insertions, 7 deletions
diff --git a/src/mm-base-call.c b/src/mm-base-call.c index d6e49922..bc4f0311 100644 --- a/src/mm-base-call.c +++ b/src/mm-base-call.c @@ -495,13 +495,25 @@ call_start_ready (MMBaseModem *modem, 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_simple_async_result_take_error (ctx->result, error); - call_start_context_complete_and_free (ctx); - return; + /* 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(ctx->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(ctx->self, MM_CALL_STATE_TERMINATED, MM_CALL_STATE_REASON_REFUSED_OR_BUSY); } mm_dbg ("Couldn't start call : '%s'", error->message); - g_error_free (error); + g_simple_async_result_take_error (ctx->result, error); + call_start_context_complete_and_free (ctx); return; } @@ -510,15 +522,13 @@ call_start_ready (MMBaseModem *modem, g_set_error (&error, MM_CORE_ERROR, MM_CORE_ERROR_FAILED, "Couldn't start the call: " "Modem response '%s'", response); - /* Update state */ mm_base_call_change_state(ctx->self, MM_CALL_STATE_TERMINATED, MM_CALL_STATE_REASON_REFUSED_OR_BUSY); } else { - /* Update state */ mm_base_call_change_state(ctx->self, MM_CALL_STATE_ACTIVE, MM_CALL_STATE_REASON_ACCEPTED); } - + if (error) { g_simple_async_result_take_error (ctx->result, error); call_start_context_complete_and_free (ctx); |