summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlexander Hofbauer <alex@derhofbauer.at>2010-11-22 15:38:04 +0100
committertbalden <illespal@gmail.com>2012-07-21 16:12:41 +0200
commite20b1a875c15037a268b9513576479da806daec0 (patch)
tree7728c0f34be934c39fe1811542a6acec82cc68b0
parent025ef9596fd3636c075658191c847f6f172ab305 (diff)
downloadandroid_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.mk3
-rw-r--r--libril/ril.cpp32
-rw-r--r--libril/ril_commands.h2
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},