Fix: Don't double-swap calls when 3-way dialing
authorDenis Kenzior <denkenz@gmail.com>
Mon, 16 Nov 2009 17:23:48 +0000 (11:23 -0600)
committerDenis Kenzior <denkenz@gmail.com>
Mon, 16 Nov 2009 17:23:48 +0000 (11:23 -0600)
drivers/hfpmodem/voicecall.c

index 2caf8ab..323893b 100644 (file)
@@ -60,6 +60,7 @@ 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 {
@@ -321,6 +322,8 @@ 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);
@@ -847,6 +850,15 @@ 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
@@ -906,6 +918,7 @@ static void ciev_callheld_notify(struct ofono_voicecall *vc,
                        release_with_status(vc, CALL_STATUS_ACTIVE);
        }
 
+out:
        vd->cind_val[HFP_INDICATOR_CALLHELD] = value;
 }