From 40fae5fcbae32a37ae974245008359435e70a91f Mon Sep 17 00:00:00 2001 From: Riccardo Vangelisti Date: Thu, 7 May 2015 17:16:29 +0200 Subject: base-call: refactoring of error handling when call starts --- src/mm-base-call.c | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) (limited to 'src') 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); -- cgit v1.2.3-70-g09d2