From bbc2eecd6fca1c601326b08d021e0e7ff5519544 Mon Sep 17 00:00:00 2001 From: Zhenhua Zhang Date: Wed, 18 Nov 2009 14:55:15 +0800 Subject: [PATCH] Fix: Poll CLCC to replace the code in call_held=1 When using CHLD=2x in multiparty call, call_held is 1 and we should not swap all active->held. So we cannot save this pull in private chat. --- drivers/hfpmodem/voicecall.c | 50 ++++++-------------------------------------- 1 file changed, 6 insertions(+), 44 deletions(-) diff --git a/drivers/hfpmodem/voicecall.c b/drivers/hfpmodem/voicecall.c index 3591b74..52cdfd7 100644 --- a/drivers/hfpmodem/voicecall.c +++ b/drivers/hfpmodem/voicecall.c @@ -60,7 +60,6 @@ struct voicecall_data { int cind_val[HFP_INDICATOR_LAST]; unsigned int id_list; unsigned int local_release; - ofono_bool_t ignore_callheld_1; }; struct release_id_req { @@ -322,8 +321,6 @@ static void atd_cb(gboolean ok, GAtResult *result, gpointer user_data) call->status = CALL_STATUS_HELD; ofono_voicecall_notify(vc, call); - - vd->ignore_callheld_1 = TRUE; } call = create_call(vd, 0, 0, CALL_STATUS_DIALING, NULL, type, validity); @@ -839,15 +836,6 @@ static void ciev_callheld_notify(struct ofono_voicecall *vc, struct ofono_call *call; unsigned int callheld = vd->cind_val[HFP_INDICATOR_CALLHELD]; - /* When ATD is sent when another call is active, we will receive - * callheld=1, then callsetup=2. We have already placed active - * calls on hold in atd_cb, so ignore the callheld in this case - */ - if (vd->ignore_callheld_1 == TRUE && value == 1) { - vd->ignore_callheld_1 = FALSE; - goto out; - } - switch (value) { case 0: /* We have to poll here, we have no idea whether the call was @@ -859,38 +847,13 @@ static void ciev_callheld_notify(struct ofono_voicecall *vc, break; case 1: - { - GSList *waiting; - - waiting = g_slist_find_custom(vd->calls, - GINT_TO_POINTER(CALL_STATUS_WAITING), - at_util_call_compare_by_status); - - for (l = vd->calls; l; l = l->next) { - call = l->data; - - if (waiting) { - if (call->status == CALL_STATUS_WAITING) { - call->status = CALL_STATUS_ACTIVE; - ofono_voicecall_notify(vc, call); - } else if (call->status == CALL_STATUS_ACTIVE) { - call->status = CALL_STATUS_HELD; - ofono_voicecall_notify(vc, call); - } - } else { - if (call->status == CALL_STATUS_ACTIVE) { - call->status = CALL_STATUS_HELD; - ofono_voicecall_notify(vc, call); - } else if (call->status == CALL_STATUS_HELD) { - call->status = CALL_STATUS_ACTIVE; - ofono_voicecall_notify(vc, call); - } - } - } - + /* We have to poll here, we have no idea whether the call was + * accepted by CHLD=1 or swapped by CHLD=2 or one call was + * chosed for private chat by CHLD=2x + */ + g_at_chat_send(vd->chat, "AT+CLCC", clcc_prefix, + clcc_poll_cb, vc, NULL); break; - } - case 2: if (callheld == 0) { for (l = vd->calls; l; l = l->next) { @@ -907,7 +870,6 @@ static void ciev_callheld_notify(struct ofono_voicecall *vc, release_with_status(vc, CALL_STATUS_ACTIVE); } -out: vd->cind_val[HFP_INDICATOR_CALLHELD] = value; } -- 2.7.4