Fix: Invalid call state transition

When an active and a waiting call exist, and the active is released the
waiting call becomes incoming.  This wasn't properly handled by the
generic at driver.
This commit is contained in:
Denis Kenzior 2009-10-23 13:56:26 -05:00
parent fa10070bf9
commit 0faa8b3c42
1 changed files with 16 additions and 0 deletions

View File

@ -727,6 +727,11 @@ static void ring_notify(GAtResult *result, gpointer user_data)
dump_response("ring_notify", TRUE, result);
/* See comment in CRING */
if (g_slist_find_custom(vd->calls, GINT_TO_POINTER(5),
call_compare_by_status))
return;
/* RING can repeat, ignore if we already have an incoming call */
if (g_slist_find_custom(vd->calls, GINT_TO_POINTER(4),
call_compare_by_status))
@ -755,6 +760,17 @@ static void cring_notify(GAtResult *result, gpointer user_data)
dump_response("cring_notify", TRUE, result);
/* Handle the following situation:
* Active Call + Waiting Call. Active Call is Released. The Waiting
* call becomes Incoming and RING/CRING indications are signaled.
* Sometimes these arrive before we managed to poll CLCC to find about
* the stage change. If this happens, simply ignore the RING/CRING
* when a waiting call exists (cannot have waiting + incoming in GSM)
*/
if (g_slist_find_custom(vd->calls, GINT_TO_POINTER(5),
call_compare_by_status))
return;
/* CRING can repeat, ignore if we already have an incoming call */
if (g_slist_find_custom(vd->calls, GINT_TO_POINTER(4),
call_compare_by_status))