From f7c75aa4e0f637ea009517c53c82d792a4dcfe60 Mon Sep 17 00:00:00 2001 From: Martin Bouchet Date: Sun, 24 Sep 2017 04:51:55 -0300 Subject: [PATCH] libril: fix network operator search The number of mQANElements should be defined in the system prop ro.ril.telephony.mqanelements Change-Id: Ie5bb8ba80c5ac93b7502da3b1bb3d2b4404ecd5e --- ril/libril/ril_service.cpp | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/ril/libril/ril_service.cpp b/ril/libril/ril_service.cpp index 949ee30..f36ceb3 100644 --- a/ril/libril/ril_service.cpp +++ b/ril/libril/ril_service.cpp @@ -25,6 +25,7 @@ #include #include #include +#include #define INVALID_HEX_CHAR 16 @@ -3700,6 +3701,10 @@ int radio::getOperatorResponse(int slotId, #if VDBG RLOGD("getOperatorResponse: serial %d", serial); #endif + int mqanelements; + char value[PROPERTY_VALUE_MAX]; + property_get("ro.ril.telephony.mqanelements", value, "4"); + mqanelements = atoi(value); if (radioService[slotId]->mRadioResponse != NULL) { RadioResponseInfo responseInfo = {}; @@ -3708,14 +3713,14 @@ int radio::getOperatorResponse(int slotId, hidl_string shortName; hidl_string numeric; int numStrings = responseLen / sizeof(char *); - if (response == NULL || numStrings != 3) { + if (response == NULL || numStrings != mqanelements - 2) { RLOGE("getOperatorResponse Invalid response: NULL"); if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE; } else { char **resp = (char **) response; longName = convertCharPtrToHidlString(resp[0]); - shortName = convertCharPtrToHidlString(resp[1]); + shortName = convertCharPtrToHidlString(resp[0]); numeric = convertCharPtrToHidlString(resp[2]); } Return retStatus = radioService[slotId]->mRadioResponse->getOperatorResponse( @@ -4344,22 +4349,26 @@ int radio::getAvailableNetworksResponse(int slotId, #if VDBG RLOGD("getAvailableNetworksResponse: serial %d", serial); #endif + int mqanelements; + char value[PROPERTY_VALUE_MAX]; + property_get("ro.ril.telephony.mqanelements", value, "4"); + mqanelements = atoi(value); if (radioService[slotId]->mRadioResponse != NULL) { RadioResponseInfo responseInfo = {}; populateResponseInfo(responseInfo, serial, responseType, e); hidl_vec networks; if ((response == NULL && responseLen != 0) - || responseLen % (4 * sizeof(char *))!= 0) { + || responseLen % (mqanelements * sizeof(char *))!= 0) { RLOGE("getAvailableNetworksResponse Invalid response: NULL"); if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE; } else { char **resp = (char **) response; int numStrings = responseLen / sizeof(char *); - networks.resize(numStrings/4); - for (int i = 0, j = 0; i < numStrings; i = i + 4, j++) { + networks.resize(numStrings/mqanelements); + for (int i = 0, j = 0; i < numStrings; i = i + mqanelements, j++) { networks[j].alphaLong = convertCharPtrToHidlString(resp[i]); - networks[j].alphaShort = convertCharPtrToHidlString(resp[i + 1]); + networks[j].alphaShort = convertCharPtrToHidlString(resp[i]); networks[j].operatorNumeric = convertCharPtrToHidlString(resp[i + 2]); int status = convertOperatorStatusToInt(resp[i + 3]); if (status == -1) { -- 2.20.1