emulator: Improve SLC establishment logic
authorDenis Kenzior <denkenz@gmail.com>
Fri, 17 Jan 2014 20:37:41 +0000 (14:37 -0600)
committerDenis Kenzior <denkenz@gmail.com>
Mon, 20 Oct 2014 18:40:27 +0000 (13:40 -0500)
src/emulator.c
src/ofono.h
src/voicecall.c

index 70505b5cabd8d4b32ff56c9f0400e63c8908a5e3..6171525e30f15920558fc94e0a10f288cb0da949 100644 (file)
@@ -636,7 +636,8 @@ done:
 
                g_at_server_send_final(server, G_AT_SERVER_RESULT_OK);
 
-               em->slc = TRUE;
+               __ofono_emulator_slc_condition(em,
+                                       OFONO_EMULATOR_SLC_CONDITION_CMER);
                break;
        }
 
@@ -1266,3 +1267,31 @@ void __ofono_emulator_set_indicator_forced(struct ofono_emulator *em,
                        ind->deferred = TRUE;
        }
 }
+
+void __ofono_emulator_slc_condition(struct ofono_emulator *em,
+                                       enum ofono_emulator_slc_condition cond)
+{
+       if (em->slc == TRUE)
+               return;
+
+       switch (cond) {
+       case OFONO_EMULATOR_SLC_CONDITION_CMER:
+               if ((em->r_features & HFP_HF_FEATURE_3WAY) &&
+                               (em->l_features & HFP_AG_FEATURE_3WAY))
+                       return;
+               /* Fall Through */
+
+       case OFONO_EMULATOR_SLC_CONDITION_CHLD:
+               if ((em->r_features & HFP_HF_FEATURE_HF_INDICATORS) &&
+                               (em->l_features & HFP_HF_FEATURE_HF_INDICATORS))
+                       return;
+               /* Fall Through */
+
+       case OFONO_EMULATOR_SLC_CONDITION_BIND:
+               ofono_info("SLC reached");
+               em->slc = TRUE;
+
+       default:
+               break;
+       }
+}
index c34232991e584a456d2d855072ccafaeef3850c5..bfcb58f5f3cf43a1b66fc576d1e2ceb522ce75ca 100644 (file)
@@ -505,8 +505,17 @@ void __ofono_gprs_provision_free_settings(
                                int count);
 
 #include <ofono/emulator.h>
+
+enum ofono_emulator_slc_condition {
+       OFONO_EMULATOR_SLC_CONDITION_CMER,
+       OFONO_EMULATOR_SLC_CONDITION_CHLD,
+       OFONO_EMULATOR_SLC_CONDITION_BIND,
+};
+
 void __ofono_emulator_set_indicator_forced(struct ofono_emulator *em,
                                                const char *name, int value);
+void __ofono_emulator_slc_condition(struct ofono_emulator *em,
+                                       enum ofono_emulator_slc_condition cond);
 
 #include <ofono/gnss.h>
 #include <ofono/cdma-sms.h>
index d11a4cd60f870c0cc2bee79eaafa6c4551c960db..550b79b404f605b9570e771c7754b51c52cfbabb 100644 (file)
@@ -3304,6 +3304,10 @@ static void emulator_chld_cb(struct ofono_emulator *em,
 
                ofono_emulator_send_info(em, buf, TRUE);
                result.type = OFONO_ERROR_TYPE_NO_ERROR;
+
+               __ofono_emulator_slc_condition(em,
+                                       OFONO_EMULATOR_SLC_CONDITION_CHLD);
+
                break;
 
        case OFONO_EMULATOR_REQUEST_TYPE_QUERY: