diff options
author | Alexander Hofbauer <alex@derhofbauer.at> | 2010-11-22 15:38:04 +0100 |
---|---|---|
committer | tbalden <illespal@gmail.com> | 2012-07-21 16:12:41 +0200 |
commit | e20b1a875c15037a268b9513576479da806daec0 (patch) | |
tree | 7728c0f34be934c39fe1811542a6acec82cc68b0 | |
parent | 025ef9596fd3636c075658191c847f6f172ab305 (diff) | |
download | android_hardware_ril-e20b1a875c15037a268b9513576479da806daec0.tar.gz android_hardware_ril-e20b1a875c15037a268b9513576479da806daec0.tar.bz2 android_hardware_ril-e20b1a875c15037a268b9513576479da806daec0.zip |
Handle newer libhtc_ril.so releases
Querying available networks returns five strings per network instead of
four which breaks that functionality in RILJ. This fix most likely
appiles to every library since Hero.
Disabled per default, define BOARD_USE_NEW_LIBRIL_HTC if you are
building with libhtc_ril.so libraries version 2 and above.
Change-Id: If14c6d9253a50b35461fcc8aed587cc89af18ee2
Conflicts:
libril/ril.cpp
-rw-r--r-- | libril/Android.mk | 3 | ||||
-rw-r--r-- | libril/ril.cpp | 32 | ||||
-rw-r--r-- | libril/ril_commands.h | 2 |
3 files changed, 35 insertions, 2 deletions
diff --git a/libril/Android.mk b/libril/Android.mk index d1f3475..fed7534 100644 --- a/libril/Android.mk +++ b/libril/Android.mk @@ -16,6 +16,9 @@ LOCAL_SHARED_LIBRARIES := \ libhardware_legacy LOCAL_CFLAGS := +ifdef BOARD_USE_NEW_LIBRIL_HTC + LOCAL_CFLAGS += -DNEW_LIBRIL_HTC +endif LOCAL_MODULE:= libril diff --git a/libril/ril.cpp b/libril/ril.cpp index 89ccc1a..f594b8d 100644 --- a/libril/ril.cpp +++ b/libril/ril.cpp @@ -212,6 +212,8 @@ static void dispatchCdmaBrSmsCnf(Parcel &p, RequestInfo *pRI); static void dispatchRilCdmaSmsWriteArgs(Parcel &p, RequestInfo *pRI); static int responseInts(Parcel &p, void *response, size_t responselen); static int responseStrings(Parcel &p, void *response, size_t responselen); +static int responseStringsNetworks(Parcel &p, void *response, size_t responselen); +static int responseStrings(Parcel &p, void *response, size_t responselen, bool network_search); static int responseString(Parcel &p, void *response, size_t responselen); static int responseVoid(Parcel &p, void *response, size_t responselen); static int responseCallList(Parcel &p, void *response, size_t responselen); @@ -1404,6 +1406,7 @@ responseInts(Parcel &p, void *response, size_t responselen) { return 0; } + /** response is a char **, pointing to an array of char *'s The parcel will begin with the version */ static int responseStringsWithVersion(int version, Parcel &p, void *response, size_t responselen) { @@ -1413,6 +1416,15 @@ static int responseStringsWithVersion(int version, Parcel &p, void *response, si /** response is a char **, pointing to an array of char *'s */ static int responseStrings(Parcel &p, void *response, size_t responselen) { + return responseStrings(p, response, responselen, false); +} + +static int responseStringsNetworks(Parcel &p, void *response, size_t responselen) { + return responseStrings(p, response, responselen, true); +} + +/** response is a char **, pointing to an array of char *'s */ +static int responseStrings(Parcel &p, void *response, size_t responselen, bool network_search) { int numStrings; if (response == NULL && responselen != 0) { @@ -1431,11 +1443,29 @@ static int responseStrings(Parcel &p, void *response, size_t responselen) { char **p_cur = (char **) response; numStrings = responselen / sizeof(char *); +#ifdef NEW_LIBRIL_HTC + if (network_search == true) { + // we only want four entries for each network + p.writeInt32 (numStrings - (numStrings / 5)); + } else { + p.writeInt32 (numStrings); + } + int sCount = 0; +#else p.writeInt32 (numStrings); +#endif /* each string*/ startResponse; for (int i = 0 ; i < numStrings ; i++) { +#ifdef NEW_LIBRIL_HTC + sCount++; + // ignore the fifth string that is returned by newer HTC libhtc_ril.so. + if (network_search == true && sCount % 5 == 0) { + sCount = 0; + continue; + } +#endif appendPrintBuf("%s%s,", printBuf, (char*)p_cur[i]); writeStringToParcel (p, p_cur[i]); } @@ -2478,7 +2508,7 @@ static void listenCallback (int fd, short flags, void *param) { ALOGE("Error on accept() errno:%d", errno); /* start listening for new connections again */ rilEventAddWakeup(&s_listen_event); - return; + return; } /* check the credential of the other side and only accept socket from diff --git a/libril/ril_commands.h b/libril/ril_commands.h index 069ee75..96f06ba 100644 --- a/libril/ril_commands.h +++ b/libril/ril_commands.h @@ -62,7 +62,7 @@ {RIL_REQUEST_QUERY_NETWORK_SELECTION_MODE, dispatchVoid, responseInts}, {RIL_REQUEST_SET_NETWORK_SELECTION_AUTOMATIC, dispatchVoid, responseVoid}, {RIL_REQUEST_SET_NETWORK_SELECTION_MANUAL, dispatchString, responseVoid}, - {RIL_REQUEST_QUERY_AVAILABLE_NETWORKS , dispatchVoid, responseStrings}, + {RIL_REQUEST_QUERY_AVAILABLE_NETWORKS , dispatchVoid, responseStringsNetworks}, {RIL_REQUEST_DTMF_START, dispatchString, responseVoid}, {RIL_REQUEST_DTMF_STOP, dispatchVoid, responseVoid}, {RIL_REQUEST_BASEBAND_VERSION, dispatchVoid, responseString}, |