Home | History | Annotate | Download | only in libril
      1 /* //device/libs/telephony/ril.cpp
      2 **
      3 ** Copyright 2006, The Android Open Source Project
      4 **
      5 ** Licensed under the Apache License, Version 2.0 (the "License");
      6 ** you may not use this file except in compliance with the License.
      7 ** You may obtain a copy of the License at
      8 **
      9 **     http://www.apache.org/licenses/LICENSE-2.0
     10 **
     11 ** Unless required by applicable law or agreed to in writing, software
     12 ** distributed under the License is distributed on an "AS IS" BASIS,
     13 ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     14 ** See the License for the specific language governing permissions and
     15 ** limitations under the License.
     16 */
     17 
     18 #define LOG_TAG "RILC"
     19 
     20 #include <hardware_legacy/power.h>
     21 #include <telephony/ril.h>
     22 #include <telephony/ril_cdma_sms.h>
     23 #include <cutils/sockets.h>
     24 #include <cutils/jstring.h>
     25 #include <telephony/record_stream.h>
     26 #include <utils/Log.h>
     27 #include <utils/SystemClock.h>
     28 #include <pthread.h>
     29 #include <binder/Parcel.h>
     30 #include <cutils/jstring.h>
     31 #include <sys/types.h>
     32 #include <sys/limits.h>
     33 #include <sys/system_properties.h>
     34 #include <pwd.h>
     35 #include <stdio.h>
     36 #include <stdlib.h>
     37 #include <stdarg.h>
     38 #include <string.h>
     39 #include <unistd.h>
     40 #include <fcntl.h>
     41 #include <time.h>
     42 #include <errno.h>
     43 #include <assert.h>
     44 #include <ctype.h>
     45 #include <sys/un.h>
     46 #include <assert.h>
     47 #include <netinet/in.h>
     48 #include <cutils/properties.h>
     49 #include <RilSapSocket.h>
     50 
     51 extern "C" void
     52 RIL_onRequestComplete(RIL_Token t, RIL_Errno e, void *response, size_t responselen);
     53 
     54 extern "C" void
     55 RIL_onRequestAck(RIL_Token t);
     56 namespace android {
     57 
     58 #define PHONE_PROCESS "radio"
     59 #define BLUETOOTH_PROCESS "bluetooth"
     60 
     61 #define SOCKET_NAME_RIL "rild"
     62 #define SOCKET2_NAME_RIL "rild2"
     63 #define SOCKET3_NAME_RIL "rild3"
     64 #define SOCKET4_NAME_RIL "rild4"
     65 
     66 #define SOCKET_NAME_RIL_DEBUG "rild-debug"
     67 
     68 #define ANDROID_WAKE_LOCK_NAME "radio-interface"
     69 
     70 #define ANDROID_WAKE_LOCK_SECS 0
     71 #define ANDROID_WAKE_LOCK_USECS 200000
     72 
     73 #define PROPERTY_RIL_IMPL "gsm.version.ril-impl"
     74 
     75 // match with constant in RIL.java
     76 #define MAX_COMMAND_BYTES (8 * 1024)
     77 
     78 // Basically: memset buffers that the client library
     79 // shouldn't be using anymore in an attempt to find
     80 // memory usage issues sooner.
     81 #define MEMSET_FREED 1
     82 
     83 #define NUM_ELEMS(a)     (sizeof (a) / sizeof (a)[0])
     84 
     85 #define MIN(a,b) ((a)<(b) ? (a) : (b))
     86 
     87 /* Constants for response types */
     88 #define RESPONSE_SOLICITED 0
     89 #define RESPONSE_UNSOLICITED 1
     90 #define RESPONSE_SOLICITED_ACK 2
     91 #define RESPONSE_SOLICITED_ACK_EXP 3
     92 #define RESPONSE_UNSOLICITED_ACK_EXP 4
     93 
     94 /* Negative values for private RIL errno's */
     95 #define RIL_ERRNO_INVALID_RESPONSE -1
     96 #define RIL_ERRNO_NO_MEMORY -12
     97 
     98 // request, response, and unsolicited msg print macro
     99 #define PRINTBUF_SIZE 8096
    100 
    101 // Enable verbose logging
    102 #define VDBG 0
    103 
    104 // Enable RILC log
    105 #define RILC_LOG 0
    106 
    107 #if RILC_LOG
    108     #define startRequest           sprintf(printBuf, "(")
    109     #define closeRequest           sprintf(printBuf, "%s)", printBuf)
    110     #define printRequest(token, req)           \
    111             RLOGD("[%04d]> %s %s", token, requestToString(req), printBuf)
    112 
    113     #define startResponse           sprintf(printBuf, "%s {", printBuf)
    114     #define closeResponse           sprintf(printBuf, "%s}", printBuf)
    115     #define printResponse           RLOGD("%s", printBuf)
    116 
    117     #define clearPrintBuf           printBuf[0] = 0
    118     #define removeLastChar          printBuf[strlen(printBuf)-1] = 0
    119     #define appendPrintBuf(x...)    snprintf(printBuf, PRINTBUF_SIZE, x)
    120 #else
    121     #define startRequest
    122     #define closeRequest
    123     #define printRequest(token, req)
    124     #define startResponse
    125     #define closeResponse
    126     #define printResponse
    127     #define clearPrintBuf
    128     #define removeLastChar
    129     #define appendPrintBuf(x...)
    130 #endif
    131 
    132 enum WakeType {DONT_WAKE, WAKE_PARTIAL};
    133 
    134 typedef struct {
    135     int requestNumber;
    136     void (*dispatchFunction) (Parcel &p, struct RequestInfo *pRI);
    137     int(*responseFunction) (Parcel &p, void *response, size_t responselen);
    138 } CommandInfo;
    139 
    140 typedef struct {
    141     int requestNumber;
    142     int (*responseFunction) (Parcel &p, void *response, size_t responselen);
    143     WakeType wakeType;
    144 } UnsolResponseInfo;
    145 
    146 typedef struct RequestInfo {
    147     int32_t token;      //this is not RIL_Token
    148     CommandInfo *pCI;
    149     struct RequestInfo *p_next;
    150     char cancelled;
    151     char local;         // responses to local commands do not go back to command process
    152     RIL_SOCKET_ID socket_id;
    153     int wasAckSent;    // Indicates whether an ack was sent earlier
    154 } RequestInfo;
    155 
    156 typedef struct UserCallbackInfo {
    157     RIL_TimedCallback p_callback;
    158     void *userParam;
    159     struct ril_event event;
    160     struct UserCallbackInfo *p_next;
    161 } UserCallbackInfo;
    162 
    163 extern "C" const char * requestToString(int request);
    164 extern "C" const char * failCauseToString(RIL_Errno);
    165 extern "C" const char * callStateToString(RIL_CallState);
    166 extern "C" const char * radioStateToString(RIL_RadioState);
    167 extern "C" const char * rilSocketIdToString(RIL_SOCKET_ID socket_id);
    168 
    169 extern "C"
    170 char rild[MAX_SOCKET_NAME_LENGTH] = SOCKET_NAME_RIL;
    171 /*******************************************************************/
    172 
    173 RIL_RadioFunctions s_callbacks = {0, NULL, NULL, NULL, NULL, NULL};
    174 static int s_registerCalled = 0;
    175 
    176 static pthread_t s_tid_dispatch;
    177 static pthread_t s_tid_reader;
    178 static int s_started = 0;
    179 
    180 static int s_fdDebug = -1;
    181 static int s_fdDebug_socket2 = -1;
    182 
    183 static int s_fdWakeupRead;
    184 static int s_fdWakeupWrite;
    185 
    186 int s_wakelock_count = 0;
    187 
    188 static struct ril_event s_commands_event;
    189 static struct ril_event s_wakeupfd_event;
    190 static struct ril_event s_listen_event;
    191 static SocketListenParam s_ril_param_socket;
    192 
    193 static pthread_mutex_t s_pendingRequestsMutex = PTHREAD_MUTEX_INITIALIZER;
    194 static pthread_mutex_t s_writeMutex = PTHREAD_MUTEX_INITIALIZER;
    195 static pthread_mutex_t s_wakeLockCountMutex = PTHREAD_MUTEX_INITIALIZER;
    196 static RequestInfo *s_pendingRequests = NULL;
    197 
    198 #if (SIM_COUNT >= 2)
    199 static struct ril_event s_commands_event_socket2;
    200 static struct ril_event s_listen_event_socket2;
    201 static SocketListenParam s_ril_param_socket2;
    202 
    203 static pthread_mutex_t s_pendingRequestsMutex_socket2  = PTHREAD_MUTEX_INITIALIZER;
    204 static pthread_mutex_t s_writeMutex_socket2            = PTHREAD_MUTEX_INITIALIZER;
    205 static RequestInfo *s_pendingRequests_socket2          = NULL;
    206 #endif
    207 
    208 #if (SIM_COUNT >= 3)
    209 static struct ril_event s_commands_event_socket3;
    210 static struct ril_event s_listen_event_socket3;
    211 static SocketListenParam s_ril_param_socket3;
    212 
    213 static pthread_mutex_t s_pendingRequestsMutex_socket3  = PTHREAD_MUTEX_INITIALIZER;
    214 static pthread_mutex_t s_writeMutex_socket3            = PTHREAD_MUTEX_INITIALIZER;
    215 static RequestInfo *s_pendingRequests_socket3          = NULL;
    216 #endif
    217 
    218 #if (SIM_COUNT >= 4)
    219 static struct ril_event s_commands_event_socket4;
    220 static struct ril_event s_listen_event_socket4;
    221 static SocketListenParam s_ril_param_socket4;
    222 
    223 static pthread_mutex_t s_pendingRequestsMutex_socket4  = PTHREAD_MUTEX_INITIALIZER;
    224 static pthread_mutex_t s_writeMutex_socket4            = PTHREAD_MUTEX_INITIALIZER;
    225 static RequestInfo *s_pendingRequests_socket4          = NULL;
    226 #endif
    227 
    228 static struct ril_event s_wake_timeout_event;
    229 static struct ril_event s_debug_event;
    230 
    231 
    232 static const struct timeval TIMEVAL_WAKE_TIMEOUT = {ANDROID_WAKE_LOCK_SECS,ANDROID_WAKE_LOCK_USECS};
    233 
    234 
    235 static pthread_mutex_t s_startupMutex = PTHREAD_MUTEX_INITIALIZER;
    236 static pthread_cond_t s_startupCond = PTHREAD_COND_INITIALIZER;
    237 
    238 static pthread_mutex_t s_dispatchMutex = PTHREAD_MUTEX_INITIALIZER;
    239 static pthread_cond_t s_dispatchCond = PTHREAD_COND_INITIALIZER;
    240 
    241 static RequestInfo *s_toDispatchHead = NULL;
    242 static RequestInfo *s_toDispatchTail = NULL;
    243 
    244 static UserCallbackInfo *s_last_wake_timeout_info = NULL;
    245 
    246 static void *s_lastNITZTimeData = NULL;
    247 static size_t s_lastNITZTimeDataSize;
    248 
    249 #if RILC_LOG
    250     static char printBuf[PRINTBUF_SIZE];
    251 #endif
    252 
    253 /*******************************************************************/
    254 static int sendResponse (Parcel &p, RIL_SOCKET_ID socket_id);
    255 
    256 static void dispatchVoid (Parcel& p, RequestInfo *pRI);
    257 static void dispatchString (Parcel& p, RequestInfo *pRI);
    258 static void dispatchStrings (Parcel& p, RequestInfo *pRI);
    259 static void dispatchInts (Parcel& p, RequestInfo *pRI);
    260 static void dispatchDial (Parcel& p, RequestInfo *pRI);
    261 static void dispatchSIM_IO (Parcel& p, RequestInfo *pRI);
    262 static void dispatchSIM_APDU (Parcel& p, RequestInfo *pRI);
    263 static void dispatchCallForward(Parcel& p, RequestInfo *pRI);
    264 static void dispatchRaw(Parcel& p, RequestInfo *pRI);
    265 static void dispatchSmsWrite (Parcel &p, RequestInfo *pRI);
    266 static void dispatchDataCall (Parcel& p, RequestInfo *pRI);
    267 static void dispatchVoiceRadioTech (Parcel& p, RequestInfo *pRI);
    268 static void dispatchSetInitialAttachApn (Parcel& p, RequestInfo *pRI);
    269 static void dispatchCdmaSubscriptionSource (Parcel& p, RequestInfo *pRI);
    270 
    271 static void dispatchCdmaSms(Parcel &p, RequestInfo *pRI);
    272 static void dispatchImsSms(Parcel &p, RequestInfo *pRI);
    273 static void dispatchImsCdmaSms(Parcel &p, RequestInfo *pRI, uint8_t retry, int32_t messageRef);
    274 static void dispatchImsGsmSms(Parcel &p, RequestInfo *pRI, uint8_t retry, int32_t messageRef);
    275 static void dispatchCdmaSmsAck(Parcel &p, RequestInfo *pRI);
    276 static void dispatchGsmBrSmsCnf(Parcel &p, RequestInfo *pRI);
    277 static void dispatchCdmaBrSmsCnf(Parcel &p, RequestInfo *pRI);
    278 static void dispatchRilCdmaSmsWriteArgs(Parcel &p, RequestInfo *pRI);
    279 static void dispatchNVReadItem(Parcel &p, RequestInfo *pRI);
    280 static void dispatchNVWriteItem(Parcel &p, RequestInfo *pRI);
    281 static void dispatchUiccSubscripton(Parcel &p, RequestInfo *pRI);
    282 static void dispatchSimAuthentication(Parcel &p, RequestInfo *pRI);
    283 static void dispatchDataProfile(Parcel &p, RequestInfo *pRI);
    284 static void dispatchRadioCapability(Parcel &p, RequestInfo *pRI);
    285 static void dispatchCarrierRestrictions(Parcel &p, RequestInfo *pRI);
    286 static int responseInts(Parcel &p, void *response, size_t responselen);
    287 static int responseFailCause(Parcel &p, void *response, size_t responselen);
    288 static int responseStrings(Parcel &p, void *response, size_t responselen);
    289 static int responseString(Parcel &p, void *response, size_t responselen);
    290 static int responseVoid(Parcel &p, void *response, size_t responselen);
    291 static int responseCallList(Parcel &p, void *response, size_t responselen);
    292 static int responseSMS(Parcel &p, void *response, size_t responselen);
    293 static int responseSIM_IO(Parcel &p, void *response, size_t responselen);
    294 static int responseCallForwards(Parcel &p, void *response, size_t responselen);
    295 static int responseDataCallList(Parcel &p, void *response, size_t responselen);
    296 static int responseSetupDataCall(Parcel &p, void *response, size_t responselen);
    297 static int responseRaw(Parcel &p, void *response, size_t responselen);
    298 static int responseSsn(Parcel &p, void *response, size_t responselen);
    299 static int responseSimStatus(Parcel &p, void *response, size_t responselen);
    300 static int responseGsmBrSmsCnf(Parcel &p, void *response, size_t responselen);
    301 static int responseCdmaBrSmsCnf(Parcel &p, void *response, size_t responselen);
    302 static int responseCdmaSms(Parcel &p, void *response, size_t responselen);
    303 static int responseCellList(Parcel &p, void *response, size_t responselen);
    304 static int responseCdmaInformationRecords(Parcel &p,void *response, size_t responselen);
    305 static int responseRilSignalStrength(Parcel &p,void *response, size_t responselen);
    306 static int responseCallRing(Parcel &p, void *response, size_t responselen);
    307 static int responseCdmaSignalInfoRecord(Parcel &p,void *response, size_t responselen);
    308 static int responseCdmaCallWaiting(Parcel &p,void *response, size_t responselen);
    309 static int responseSimRefresh(Parcel &p, void *response, size_t responselen);
    310 static int responseCellInfoList(Parcel &p, void *response, size_t responselen);
    311 static int responseHardwareConfig(Parcel &p, void *response, size_t responselen);
    312 static int responseDcRtInfo(Parcel &p, void *response, size_t responselen);
    313 static int responseRadioCapability(Parcel &p, void *response, size_t responselen);
    314 static int responseSSData(Parcel &p, void *response, size_t responselen);
    315 static int responseLceStatus(Parcel &p, void *response, size_t responselen);
    316 static int responseLceData(Parcel &p, void *response, size_t responselen);
    317 static int responseActivityData(Parcel &p, void *response, size_t responselen);
    318 static int responseCarrierRestrictions(Parcel &p, void *response, size_t responselen);
    319 static int responsePcoData(Parcel &p, void *response, size_t responselen);
    320 
    321 static int decodeVoiceRadioTechnology (RIL_RadioState radioState);
    322 static int decodeCdmaSubscriptionSource (RIL_RadioState radioState);
    323 static RIL_RadioState processRadioState(RIL_RadioState newRadioState);
    324 static void grabPartialWakeLock();
    325 static void releaseWakeLock();
    326 static void wakeTimeoutCallback(void *);
    327 
    328 static bool isServiceTypeCfQuery(RIL_SsServiceType serType, RIL_SsRequestType reqType);
    329 
    330 static bool isDebuggable();
    331 
    332 #ifdef RIL_SHLIB
    333 #if defined(ANDROID_MULTI_SIM)
    334 extern "C" void RIL_onUnsolicitedResponse(int unsolResponse, const void *data,
    335                                 size_t datalen, RIL_SOCKET_ID socket_id);
    336 #else
    337 extern "C" void RIL_onUnsolicitedResponse(int unsolResponse, const void *data,
    338                                 size_t datalen);
    339 #endif
    340 #endif
    341 
    342 #if defined(ANDROID_MULTI_SIM)
    343 #define RIL_UNSOL_RESPONSE(a, b, c, d) RIL_onUnsolicitedResponse((a), (b), (c), (d))
    344 #define CALL_ONREQUEST(a, b, c, d, e) s_callbacks.onRequest((a), (b), (c), (d), (e))
    345 #define CALL_ONSTATEREQUEST(a) s_callbacks.onStateRequest(a)
    346 #else
    347 #define RIL_UNSOL_RESPONSE(a, b, c, d) RIL_onUnsolicitedResponse((a), (b), (c))
    348 #define CALL_ONREQUEST(a, b, c, d, e) s_callbacks.onRequest((a), (b), (c), (d))
    349 #define CALL_ONSTATEREQUEST(a) s_callbacks.onStateRequest()
    350 #endif
    351 
    352 static UserCallbackInfo * internalRequestTimedCallback
    353     (RIL_TimedCallback callback, void *param,
    354         const struct timeval *relativeTime);
    355 
    356 /** Index == requestNumber */
    357 static CommandInfo s_commands[] = {
    358 #include "ril_commands.h"
    359 };
    360 
    361 static UnsolResponseInfo s_unsolResponses[] = {
    362 #include "ril_unsol_commands.h"
    363 };
    364 
    365 /* For older RILs that do not support new commands RIL_REQUEST_VOICE_RADIO_TECH and
    366    RIL_UNSOL_VOICE_RADIO_TECH_CHANGED messages, decode the voice radio tech from
    367    radio state message and store it. Every time there is a change in Radio State
    368    check to see if voice radio tech changes and notify telephony
    369  */
    370 int voiceRadioTech = -1;
    371 
    372 /* For older RILs that do not support new commands RIL_REQUEST_GET_CDMA_SUBSCRIPTION_SOURCE
    373    and RIL_UNSOL_CDMA_SUBSCRIPTION_SOURCE_CHANGED messages, decode the subscription
    374    source from radio state and store it. Every time there is a change in Radio State
    375    check to see if subscription source changed and notify telephony
    376  */
    377 int cdmaSubscriptionSource = -1;
    378 
    379 /* For older RILs that do not send RIL_UNSOL_RESPONSE_SIM_STATUS_CHANGED, decode the
    380    SIM/RUIM state from radio state and store it. Every time there is a change in Radio State,
    381    check to see if SIM/RUIM status changed and notify telephony
    382  */
    383 int simRuimStatus = -1;
    384 
    385 static char * RIL_getRilSocketName() {
    386     return rild;
    387 }
    388 
    389 extern "C"
    390 void RIL_setRilSocketName(const char * s) {
    391     strncpy(rild, s, MAX_SOCKET_NAME_LENGTH);
    392 }
    393 
    394 static char *
    395 strdupReadString(Parcel &p) {
    396     size_t stringlen;
    397     const char16_t *s16;
    398 
    399     s16 = p.readString16Inplace(&stringlen);
    400 
    401     return strndup16to8(s16, stringlen);
    402 }
    403 
    404 static status_t
    405 readStringFromParcelInplace(Parcel &p, char *str, size_t maxLen) {
    406     size_t s16Len;
    407     const char16_t *s16;
    408 
    409     s16 = p.readString16Inplace(&s16Len);
    410     if (s16 == NULL) {
    411         return NO_MEMORY;
    412     }
    413     size_t strLen = strnlen16to8(s16, s16Len);
    414     if ((strLen + 1) > maxLen) {
    415         return NO_MEMORY;
    416     }
    417     if (strncpy16to8(str, s16, strLen) == NULL) {
    418         return NO_MEMORY;
    419     } else {
    420         return NO_ERROR;
    421     }
    422 }
    423 
    424 static void writeStringToParcel(Parcel &p, const char *s) {
    425     char16_t *s16;
    426     size_t s16_len;
    427     s16 = strdup8to16(s, &s16_len);
    428     p.writeString16(s16, s16_len);
    429     free(s16);
    430 }
    431 
    432 
    433 static void
    434 memsetString (char *s) {
    435     if (s != NULL) {
    436         memset (s, 0, strlen(s));
    437     }
    438 }
    439 
    440 void   nullParcelReleaseFunction (const uint8_t* data, size_t dataSize,
    441                                     const size_t* objects, size_t objectsSize,
    442                                         void* cookie) {
    443     // do nothing -- the data reference lives longer than the Parcel object
    444 }
    445 
    446 /**
    447  * To be called from dispatch thread
    448  * Issue a single local request, ensuring that the response
    449  * is not sent back up to the command process
    450  */
    451 static void
    452 issueLocalRequest(int request, void *data, int len, RIL_SOCKET_ID socket_id) {
    453     RequestInfo *pRI;
    454     int ret;
    455     /* Hook for current context */
    456     /* pendingRequestsMutextHook refer to &s_pendingRequestsMutex */
    457     pthread_mutex_t* pendingRequestsMutexHook = &s_pendingRequestsMutex;
    458     /* pendingRequestsHook refer to &s_pendingRequests */
    459     RequestInfo**    pendingRequestsHook = &s_pendingRequests;
    460 
    461 #if (SIM_COUNT == 2)
    462     if (socket_id == RIL_SOCKET_2) {
    463         pendingRequestsMutexHook = &s_pendingRequestsMutex_socket2;
    464         pendingRequestsHook = &s_pendingRequests_socket2;
    465     }
    466 #endif
    467 
    468     pRI = (RequestInfo *)calloc(1, sizeof(RequestInfo));
    469     if (pRI == NULL) {
    470         RLOGE("Memory allocation failed for request %s", requestToString(request));
    471         return;
    472     }
    473 
    474     pRI->local = 1;
    475     pRI->token = 0xffffffff;        // token is not used in this context
    476     pRI->pCI = &(s_commands[request]);
    477     pRI->socket_id = socket_id;
    478 
    479     ret = pthread_mutex_lock(pendingRequestsMutexHook);
    480     assert (ret == 0);
    481 
    482     pRI->p_next = *pendingRequestsHook;
    483     *pendingRequestsHook = pRI;
    484 
    485     ret = pthread_mutex_unlock(pendingRequestsMutexHook);
    486     assert (ret == 0);
    487 
    488     RLOGD("C[locl]> %s", requestToString(request));
    489 
    490     CALL_ONREQUEST(request, data, len, pRI, pRI->socket_id);
    491 }
    492 
    493 
    494 
    495 static int
    496 processCommandBuffer(void *buffer, size_t buflen, RIL_SOCKET_ID socket_id) {
    497     Parcel p;
    498     status_t status;
    499     int32_t request;
    500     int32_t token;
    501     RequestInfo *pRI;
    502     int ret;
    503     /* Hook for current context */
    504     /* pendingRequestsMutextHook refer to &s_pendingRequestsMutex */
    505     pthread_mutex_t* pendingRequestsMutexHook = &s_pendingRequestsMutex;
    506     /* pendingRequestsHook refer to &s_pendingRequests */
    507     RequestInfo**    pendingRequestsHook = &s_pendingRequests;
    508 
    509     p.setData((uint8_t *) buffer, buflen);
    510 
    511     // status checked at end
    512     status = p.readInt32(&request);
    513     status = p.readInt32 (&token);
    514 
    515 #if (SIM_COUNT >= 2)
    516     if (socket_id == RIL_SOCKET_2) {
    517         pendingRequestsMutexHook = &s_pendingRequestsMutex_socket2;
    518         pendingRequestsHook = &s_pendingRequests_socket2;
    519     }
    520 #if (SIM_COUNT >= 3)
    521     else if (socket_id == RIL_SOCKET_3) {
    522         pendingRequestsMutexHook = &s_pendingRequestsMutex_socket3;
    523         pendingRequestsHook = &s_pendingRequests_socket3;
    524     }
    525 #endif
    526 #if (SIM_COUNT >= 4)
    527     else if (socket_id == RIL_SOCKET_4) {
    528         pendingRequestsMutexHook = &s_pendingRequestsMutex_socket4;
    529         pendingRequestsHook = &s_pendingRequests_socket4;
    530     }
    531 #endif
    532 #endif
    533 
    534     if (status != NO_ERROR) {
    535         RLOGE("invalid request block");
    536         return 0;
    537     }
    538 
    539     // Received an Ack for the previous result sent to RIL.java,
    540     // so release wakelock and exit
    541     if (request == RIL_RESPONSE_ACKNOWLEDGEMENT) {
    542         releaseWakeLock();
    543         return 0;
    544     }
    545 
    546     if (request < 1 || request >= (int32_t)NUM_ELEMS(s_commands)) {
    547         Parcel pErr;
    548         RLOGE("unsupported request code %d token %d", request, token);
    549         // FIXME this should perhaps return a response
    550         pErr.writeInt32 (RESPONSE_SOLICITED);
    551         pErr.writeInt32 (token);
    552         pErr.writeInt32 (RIL_E_GENERIC_FAILURE);
    553 
    554         sendResponse(pErr, socket_id);
    555         return 0;
    556     }
    557 
    558     pRI = (RequestInfo *)calloc(1, sizeof(RequestInfo));
    559     if (pRI == NULL) {
    560         RLOGE("Memory allocation failed for request %s", requestToString(request));
    561         return 0;
    562     }
    563 
    564     pRI->token = token;
    565     pRI->pCI = &(s_commands[request]);
    566     pRI->socket_id = socket_id;
    567 
    568     ret = pthread_mutex_lock(pendingRequestsMutexHook);
    569     assert (ret == 0);
    570 
    571     pRI->p_next = *pendingRequestsHook;
    572     *pendingRequestsHook = pRI;
    573 
    574     ret = pthread_mutex_unlock(pendingRequestsMutexHook);
    575     assert (ret == 0);
    576 
    577 /*    sLastDispatchedToken = token; */
    578 
    579     pRI->pCI->dispatchFunction(p, pRI);
    580 
    581     return 0;
    582 }
    583 
    584 static void
    585 invalidCommandBlock (RequestInfo *pRI) {
    586     RLOGE("invalid command block for token %d request %s",
    587                 pRI->token, requestToString(pRI->pCI->requestNumber));
    588 }
    589 
    590 /** Callee expects NULL */
    591 static void
    592 dispatchVoid (Parcel& p, RequestInfo *pRI) {
    593     clearPrintBuf;
    594     printRequest(pRI->token, pRI->pCI->requestNumber);
    595     CALL_ONREQUEST(pRI->pCI->requestNumber, NULL, 0, pRI, pRI->socket_id);
    596 }
    597 
    598 /** Callee expects const char * */
    599 static void
    600 dispatchString (Parcel& p, RequestInfo *pRI) {
    601     status_t status;
    602     size_t datalen;
    603     size_t stringlen;
    604     char *string8 = NULL;
    605 
    606     string8 = strdupReadString(p);
    607 
    608     startRequest;
    609     appendPrintBuf("%s%s", printBuf, string8);
    610     closeRequest;
    611     printRequest(pRI->token, pRI->pCI->requestNumber);
    612 
    613     CALL_ONREQUEST(pRI->pCI->requestNumber, string8,
    614                        sizeof(char *), pRI, pRI->socket_id);
    615 
    616 #ifdef MEMSET_FREED
    617     memsetString(string8);
    618 #endif
    619 
    620     free(string8);
    621     return;
    622 invalid:
    623     invalidCommandBlock(pRI);
    624     return;
    625 }
    626 
    627 /** Callee expects const char ** */
    628 static void
    629 dispatchStrings (Parcel &p, RequestInfo *pRI) {
    630     int32_t countStrings;
    631     status_t status;
    632     size_t datalen;
    633     char **pStrings;
    634 
    635     status = p.readInt32 (&countStrings);
    636 
    637     if (status != NO_ERROR) {
    638         goto invalid;
    639     }
    640 
    641     startRequest;
    642     if (countStrings == 0) {
    643         // just some non-null pointer
    644         pStrings = (char **)calloc(1, sizeof(char *));
    645         if (pStrings == NULL) {
    646             RLOGE("Memory allocation failed for request %s",
    647                     requestToString(pRI->pCI->requestNumber));
    648             closeRequest;
    649             return;
    650         }
    651 
    652         datalen = 0;
    653     } else if (countStrings < 0) {
    654         pStrings = NULL;
    655         datalen = 0;
    656     } else {
    657         datalen = sizeof(char *) * countStrings;
    658 
    659         pStrings = (char **)calloc(countStrings, sizeof(char *));
    660         if (pStrings == NULL) {
    661             RLOGE("Memory allocation failed for request %s",
    662                     requestToString(pRI->pCI->requestNumber));
    663             closeRequest;
    664             return;
    665         }
    666 
    667         for (int i = 0 ; i < countStrings ; i++) {
    668             pStrings[i] = strdupReadString(p);
    669             appendPrintBuf("%s%s,", printBuf, pStrings[i]);
    670         }
    671     }
    672     removeLastChar;
    673     closeRequest;
    674     printRequest(pRI->token, pRI->pCI->requestNumber);
    675 
    676     CALL_ONREQUEST(pRI->pCI->requestNumber, pStrings, datalen, pRI, pRI->socket_id);
    677 
    678     if (pStrings != NULL) {
    679         for (int i = 0 ; i < countStrings ; i++) {
    680 #ifdef MEMSET_FREED
    681             memsetString (pStrings[i]);
    682 #endif
    683             free(pStrings[i]);
    684         }
    685 
    686 #ifdef MEMSET_FREED
    687         memset(pStrings, 0, datalen);
    688 #endif
    689         free(pStrings);
    690     }
    691 
    692     return;
    693 invalid:
    694     invalidCommandBlock(pRI);
    695     return;
    696 }
    697 
    698 /** Callee expects const int * */
    699 static void
    700 dispatchInts (Parcel &p, RequestInfo *pRI) {
    701     int32_t count;
    702     status_t status;
    703     size_t datalen;
    704     int *pInts;
    705 
    706     status = p.readInt32 (&count);
    707 
    708     if (status != NO_ERROR || count <= 0) {
    709         goto invalid;
    710     }
    711 
    712     datalen = sizeof(int) * count;
    713     pInts = (int *)calloc(count, sizeof(int));
    714     if (pInts == NULL) {
    715         RLOGE("Memory allocation failed for request %s", requestToString(pRI->pCI->requestNumber));
    716         return;
    717     }
    718 
    719     startRequest;
    720     for (int i = 0 ; i < count ; i++) {
    721         int32_t t;
    722 
    723         status = p.readInt32(&t);
    724         pInts[i] = (int)t;
    725         appendPrintBuf("%s%d,", printBuf, t);
    726 
    727         if (status != NO_ERROR) {
    728             free(pInts);
    729             goto invalid;
    730         }
    731    }
    732    removeLastChar;
    733    closeRequest;
    734    printRequest(pRI->token, pRI->pCI->requestNumber);
    735 
    736    CALL_ONREQUEST(pRI->pCI->requestNumber, const_cast<int *>(pInts),
    737                        datalen, pRI, pRI->socket_id);
    738 
    739 #ifdef MEMSET_FREED
    740     memset(pInts, 0, datalen);
    741 #endif
    742     free(pInts);
    743     return;
    744 invalid:
    745     invalidCommandBlock(pRI);
    746     return;
    747 }
    748 
    749 
    750 /**
    751  * Callee expects const RIL_SMS_WriteArgs *
    752  * Payload is:
    753  *   int32_t status
    754  *   String pdu
    755  */
    756 static void
    757 dispatchSmsWrite (Parcel &p, RequestInfo *pRI) {
    758     RIL_SMS_WriteArgs args;
    759     int32_t t;
    760     status_t status;
    761 
    762     RLOGD("dispatchSmsWrite");
    763     memset (&args, 0, sizeof(args));
    764 
    765     status = p.readInt32(&t);
    766     args.status = (int)t;
    767 
    768     args.pdu = strdupReadString(p);
    769 
    770     if (status != NO_ERROR || args.pdu == NULL) {
    771         goto invalid;
    772     }
    773 
    774     args.smsc = strdupReadString(p);
    775 
    776     startRequest;
    777     appendPrintBuf("%s%d,%s,smsc=%s", printBuf, args.status,
    778         (char*)args.pdu,  (char*)args.smsc);
    779     closeRequest;
    780     printRequest(pRI->token, pRI->pCI->requestNumber);
    781 
    782     CALL_ONREQUEST(pRI->pCI->requestNumber, &args, sizeof(args), pRI, pRI->socket_id);
    783 
    784 #ifdef MEMSET_FREED
    785     memsetString (args.pdu);
    786 #endif
    787 
    788     free (args.pdu);
    789 
    790 #ifdef MEMSET_FREED
    791     memset(&args, 0, sizeof(args));
    792 #endif
    793 
    794     return;
    795 invalid:
    796     invalidCommandBlock(pRI);
    797     return;
    798 }
    799 
    800 /**
    801  * Callee expects const RIL_Dial *
    802  * Payload is:
    803  *   String address
    804  *   int32_t clir
    805  */
    806 static void
    807 dispatchDial (Parcel &p, RequestInfo *pRI) {
    808     RIL_Dial dial;
    809     RIL_UUS_Info uusInfo;
    810     int32_t sizeOfDial;
    811     int32_t t;
    812     int32_t uusPresent;
    813     status_t status;
    814 
    815     RLOGD("dispatchDial");
    816     memset (&dial, 0, sizeof(dial));
    817 
    818     dial.address = strdupReadString(p);
    819 
    820     status = p.readInt32(&t);
    821     dial.clir = (int)t;
    822 
    823     if (status != NO_ERROR || dial.address == NULL) {
    824         goto invalid;
    825     }
    826 
    827     if (s_callbacks.version < 3) { // Remove when partners upgrade to version 3
    828         uusPresent = 0;
    829         sizeOfDial = sizeof(dial) - sizeof(RIL_UUS_Info *);
    830     } else {
    831         status = p.readInt32(&uusPresent);
    832 
    833         if (status != NO_ERROR) {
    834             goto invalid;
    835         }
    836 
    837         if (uusPresent == 0) {
    838             dial.uusInfo = NULL;
    839         } else {
    840             int32_t len;
    841 
    842             memset(&uusInfo, 0, sizeof(RIL_UUS_Info));
    843 
    844             status = p.readInt32(&t);
    845             uusInfo.uusType = (RIL_UUS_Type) t;
    846 
    847             status = p.readInt32(&t);
    848             uusInfo.uusDcs = (RIL_UUS_DCS) t;
    849 
    850             status = p.readInt32(&len);
    851             if (status != NO_ERROR) {
    852                 goto invalid;
    853             }
    854 
    855             // The java code writes -1 for null arrays
    856             if (((int) len) == -1) {
    857                 uusInfo.uusData = NULL;
    858                 len = 0;
    859             } else {
    860                 uusInfo.uusData = (char*) p.readInplace(len);
    861             }
    862 
    863             uusInfo.uusLength = len;
    864             dial.uusInfo = &uusInfo;
    865         }
    866         sizeOfDial = sizeof(dial);
    867     }
    868 
    869     startRequest;
    870     appendPrintBuf("%snum=%s,clir=%d", printBuf, dial.address, dial.clir);
    871     if (uusPresent) {
    872         appendPrintBuf("%s,uusType=%d,uusDcs=%d,uusLen=%d", printBuf,
    873                 dial.uusInfo->uusType, dial.uusInfo->uusDcs,
    874                 dial.uusInfo->uusLength);
    875     }
    876     closeRequest;
    877     printRequest(pRI->token, pRI->pCI->requestNumber);
    878 
    879     CALL_ONREQUEST(pRI->pCI->requestNumber, &dial, sizeOfDial, pRI, pRI->socket_id);
    880 
    881 #ifdef MEMSET_FREED
    882     memsetString (dial.address);
    883 #endif
    884 
    885     free (dial.address);
    886 
    887 #ifdef MEMSET_FREED
    888     memset(&uusInfo, 0, sizeof(RIL_UUS_Info));
    889     memset(&dial, 0, sizeof(dial));
    890 #endif
    891 
    892     return;
    893 invalid:
    894     invalidCommandBlock(pRI);
    895     return;
    896 }
    897 
    898 /**
    899  * Callee expects const RIL_SIM_IO *
    900  * Payload is:
    901  *   int32_t command
    902  *   int32_t fileid
    903  *   String path
    904  *   int32_t p1, p2, p3
    905  *   String data
    906  *   String pin2
    907  *   String aidPtr
    908  */
    909 static void
    910 dispatchSIM_IO (Parcel &p, RequestInfo *pRI) {
    911     union RIL_SIM_IO {
    912         RIL_SIM_IO_v6 v6;
    913         RIL_SIM_IO_v5 v5;
    914     } simIO;
    915 
    916     int32_t t;
    917     int size;
    918     status_t status;
    919 
    920 #if VDBG
    921     RLOGD("dispatchSIM_IO");
    922 #endif
    923     memset (&simIO, 0, sizeof(simIO));
    924 
    925     // note we only check status at the end
    926 
    927     status = p.readInt32(&t);
    928     simIO.v6.command = (int)t;
    929 
    930     status = p.readInt32(&t);
    931     simIO.v6.fileid = (int)t;
    932 
    933     simIO.v6.path = strdupReadString(p);
    934 
    935     status = p.readInt32(&t);
    936     simIO.v6.p1 = (int)t;
    937 
    938     status = p.readInt32(&t);
    939     simIO.v6.p2 = (int)t;
    940 
    941     status = p.readInt32(&t);
    942     simIO.v6.p3 = (int)t;
    943 
    944     simIO.v6.data = strdupReadString(p);
    945     simIO.v6.pin2 = strdupReadString(p);
    946     simIO.v6.aidPtr = strdupReadString(p);
    947 
    948     startRequest;
    949     appendPrintBuf("%scmd=0x%X,efid=0x%X,path=%s,%d,%d,%d,%s,pin2=%s,aid=%s", printBuf,
    950         simIO.v6.command, simIO.v6.fileid, (char*)simIO.v6.path,
    951         simIO.v6.p1, simIO.v6.p2, simIO.v6.p3,
    952         (char*)simIO.v6.data,  (char*)simIO.v6.pin2, simIO.v6.aidPtr);
    953     closeRequest;
    954     printRequest(pRI->token, pRI->pCI->requestNumber);
    955 
    956     if (status != NO_ERROR) {
    957         goto invalid;
    958     }
    959 
    960     size = (s_callbacks.version < 6) ? sizeof(simIO.v5) : sizeof(simIO.v6);
    961     CALL_ONREQUEST(pRI->pCI->requestNumber, &simIO, size, pRI, pRI->socket_id);
    962 
    963 #ifdef MEMSET_FREED
    964     memsetString (simIO.v6.path);
    965     memsetString (simIO.v6.data);
    966     memsetString (simIO.v6.pin2);
    967     memsetString (simIO.v6.aidPtr);
    968 #endif
    969 
    970     free (simIO.v6.path);
    971     free (simIO.v6.data);
    972     free (simIO.v6.pin2);
    973     free (simIO.v6.aidPtr);
    974 
    975 #ifdef MEMSET_FREED
    976     memset(&simIO, 0, sizeof(simIO));
    977 #endif
    978 
    979     return;
    980 invalid:
    981     invalidCommandBlock(pRI);
    982     return;
    983 }
    984 
    985 /**
    986  * Callee expects const RIL_SIM_APDU *
    987  * Payload is:
    988  *   int32_t sessionid
    989  *   int32_t cla
    990  *   int32_t instruction
    991  *   int32_t p1, p2, p3
    992  *   String data
    993  */
    994 static void
    995 dispatchSIM_APDU (Parcel &p, RequestInfo *pRI) {
    996     int32_t t;
    997     status_t status;
    998     RIL_SIM_APDU apdu;
    999 
   1000 #if VDBG
   1001     RLOGD("dispatchSIM_APDU");
   1002 #endif
   1003     memset (&apdu, 0, sizeof(RIL_SIM_APDU));
   1004 
   1005     // Note we only check status at the end. Any single failure leads to
   1006     // subsequent reads filing.
   1007     status = p.readInt32(&t);
   1008     apdu.sessionid = (int)t;
   1009 
   1010     status = p.readInt32(&t);
   1011     apdu.cla = (int)t;
   1012 
   1013     status = p.readInt32(&t);
   1014     apdu.instruction = (int)t;
   1015 
   1016     status = p.readInt32(&t);
   1017     apdu.p1 = (int)t;
   1018 
   1019     status = p.readInt32(&t);
   1020     apdu.p2 = (int)t;
   1021 
   1022     status = p.readInt32(&t);
   1023     apdu.p3 = (int)t;
   1024 
   1025     apdu.data = strdupReadString(p);
   1026 
   1027     startRequest;
   1028     appendPrintBuf("%ssessionid=%d,cla=%d,ins=%d,p1=%d,p2=%d,p3=%d,data=%s",
   1029         printBuf, apdu.sessionid, apdu.cla, apdu.instruction, apdu.p1, apdu.p2,
   1030         apdu.p3, (char*)apdu.data);
   1031     closeRequest;
   1032     printRequest(pRI->token, pRI->pCI->requestNumber);
   1033 
   1034     if (status != NO_ERROR) {
   1035         goto invalid;
   1036     }
   1037 
   1038     CALL_ONREQUEST(pRI->pCI->requestNumber, &apdu, sizeof(RIL_SIM_APDU), pRI, pRI->socket_id);
   1039 
   1040 #ifdef MEMSET_FREED
   1041     memsetString(apdu.data);
   1042 #endif
   1043     free(apdu.data);
   1044 
   1045 #ifdef MEMSET_FREED
   1046     memset(&apdu, 0, sizeof(RIL_SIM_APDU));
   1047 #endif
   1048 
   1049     return;
   1050 invalid:
   1051     invalidCommandBlock(pRI);
   1052     return;
   1053 }
   1054 
   1055 
   1056 /**
   1057  * Callee expects const RIL_CallForwardInfo *
   1058  * Payload is:
   1059  *  int32_t status/action
   1060  *  int32_t reason
   1061  *  int32_t serviceCode
   1062  *  int32_t toa
   1063  *  String number  (0 length -> null)
   1064  *  int32_t timeSeconds
   1065  */
   1066 static void
   1067 dispatchCallForward(Parcel &p, RequestInfo *pRI) {
   1068     RIL_CallForwardInfo cff;
   1069     int32_t t;
   1070     status_t status;
   1071 
   1072     RLOGD("dispatchCallForward");
   1073     memset (&cff, 0, sizeof(cff));
   1074 
   1075     // note we only check status at the end
   1076 
   1077     status = p.readInt32(&t);
   1078     cff.status = (int)t;
   1079 
   1080     status = p.readInt32(&t);
   1081     cff.reason = (int)t;
   1082 
   1083     status = p.readInt32(&t);
   1084     cff.serviceClass = (int)t;
   1085 
   1086     status = p.readInt32(&t);
   1087     cff.toa = (int)t;
   1088 
   1089     cff.number = strdupReadString(p);
   1090 
   1091     status = p.readInt32(&t);
   1092     cff.timeSeconds = (int)t;
   1093 
   1094     if (status != NO_ERROR) {
   1095         goto invalid;
   1096     }
   1097 
   1098     // special case: number 0-length fields is null
   1099 
   1100     if (cff.number != NULL && strlen (cff.number) == 0) {
   1101         cff.number = NULL;
   1102     }
   1103 
   1104     startRequest;
   1105     appendPrintBuf("%sstat=%d,reason=%d,serv=%d,toa=%d,%s,tout=%d", printBuf,
   1106         cff.status, cff.reason, cff.serviceClass, cff.toa,
   1107         (char*)cff.number, cff.timeSeconds);
   1108     closeRequest;
   1109     printRequest(pRI->token, pRI->pCI->requestNumber);
   1110 
   1111     CALL_ONREQUEST(pRI->pCI->requestNumber, &cff, sizeof(cff), pRI, pRI->socket_id);
   1112 
   1113 #ifdef MEMSET_FREED
   1114     memsetString(cff.number);
   1115 #endif
   1116 
   1117     free (cff.number);
   1118 
   1119 #ifdef MEMSET_FREED
   1120     memset(&cff, 0, sizeof(cff));
   1121 #endif
   1122 
   1123     return;
   1124 invalid:
   1125     invalidCommandBlock(pRI);
   1126     return;
   1127 }
   1128 
   1129 
   1130 static void
   1131 dispatchRaw(Parcel &p, RequestInfo *pRI) {
   1132     int32_t len;
   1133     status_t status;
   1134     const void *data;
   1135 
   1136     status = p.readInt32(&len);
   1137 
   1138     if (status != NO_ERROR) {
   1139         goto invalid;
   1140     }
   1141 
   1142     // The java code writes -1 for null arrays
   1143     if (((int)len) == -1) {
   1144         data = NULL;
   1145         len = 0;
   1146     }
   1147 
   1148     data = p.readInplace(len);
   1149 
   1150     startRequest;
   1151     appendPrintBuf("%sraw_size=%d", printBuf, len);
   1152     closeRequest;
   1153     printRequest(pRI->token, pRI->pCI->requestNumber);
   1154 
   1155     CALL_ONREQUEST(pRI->pCI->requestNumber, const_cast<void *>(data), len, pRI, pRI->socket_id);
   1156 
   1157     return;
   1158 invalid:
   1159     invalidCommandBlock(pRI);
   1160     return;
   1161 }
   1162 
   1163 static status_t
   1164 constructCdmaSms(Parcel &p, RequestInfo *pRI, RIL_CDMA_SMS_Message& rcsm) {
   1165     int32_t  t;
   1166     uint8_t ut;
   1167     status_t status;
   1168     int32_t digitCount;
   1169     int digitLimit;
   1170 
   1171     memset(&rcsm, 0, sizeof(rcsm));
   1172 
   1173     status = p.readInt32(&t);
   1174     rcsm.uTeleserviceID = (int) t;
   1175 
   1176     status = p.read(&ut,sizeof(ut));
   1177     rcsm.bIsServicePresent = (uint8_t) ut;
   1178 
   1179     status = p.readInt32(&t);
   1180     rcsm.uServicecategory = (int) t;
   1181 
   1182     status = p.readInt32(&t);
   1183     rcsm.sAddress.digit_mode = (RIL_CDMA_SMS_DigitMode) t;
   1184 
   1185     status = p.readInt32(&t);
   1186     rcsm.sAddress.number_mode = (RIL_CDMA_SMS_NumberMode) t;
   1187 
   1188     status = p.readInt32(&t);
   1189     rcsm.sAddress.number_type = (RIL_CDMA_SMS_NumberType) t;
   1190 
   1191     status = p.readInt32(&t);
   1192     rcsm.sAddress.number_plan = (RIL_CDMA_SMS_NumberPlan) t;
   1193 
   1194     status = p.read(&ut,sizeof(ut));
   1195     rcsm.sAddress.number_of_digits= (uint8_t) ut;
   1196 
   1197     digitLimit= MIN((rcsm.sAddress.number_of_digits), RIL_CDMA_SMS_ADDRESS_MAX);
   1198     for(digitCount =0 ; digitCount < digitLimit; digitCount ++) {
   1199         status = p.read(&ut,sizeof(ut));
   1200         rcsm.sAddress.digits[digitCount] = (uint8_t) ut;
   1201     }
   1202 
   1203     status = p.readInt32(&t);
   1204     rcsm.sSubAddress.subaddressType = (RIL_CDMA_SMS_SubaddressType) t;
   1205 
   1206     status = p.read(&ut,sizeof(ut));
   1207     rcsm.sSubAddress.odd = (uint8_t) ut;
   1208 
   1209     status = p.read(&ut,sizeof(ut));
   1210     rcsm.sSubAddress.number_of_digits = (uint8_t) ut;
   1211 
   1212     digitLimit= MIN((rcsm.sSubAddress.number_of_digits), RIL_CDMA_SMS_SUBADDRESS_MAX);
   1213     for(digitCount =0 ; digitCount < digitLimit; digitCount ++) {
   1214         status = p.read(&ut,sizeof(ut));
   1215         rcsm.sSubAddress.digits[digitCount] = (uint8_t) ut;
   1216     }
   1217 
   1218     status = p.readInt32(&t);
   1219     rcsm.uBearerDataLen = (int) t;
   1220 
   1221     digitLimit= MIN((rcsm.uBearerDataLen), RIL_CDMA_SMS_BEARER_DATA_MAX);
   1222     for(digitCount =0 ; digitCount < digitLimit; digitCount ++) {
   1223         status = p.read(&ut, sizeof(ut));
   1224         rcsm.aBearerData[digitCount] = (uint8_t) ut;
   1225     }
   1226 
   1227     if (status != NO_ERROR) {
   1228         return status;
   1229     }
   1230 
   1231     startRequest;
   1232     appendPrintBuf("%suTeleserviceID=%d, bIsServicePresent=%d, uServicecategory=%d, \
   1233             sAddress.digit_mode=%d, sAddress.Number_mode=%d, sAddress.number_type=%d, ",
   1234             printBuf, rcsm.uTeleserviceID,rcsm.bIsServicePresent,rcsm.uServicecategory,
   1235             rcsm.sAddress.digit_mode, rcsm.sAddress.number_mode,rcsm.sAddress.number_type);
   1236     closeRequest;
   1237 
   1238     printRequest(pRI->token, pRI->pCI->requestNumber);
   1239 
   1240     return status;
   1241 }
   1242 
   1243 static void
   1244 dispatchCdmaSms(Parcel &p, RequestInfo *pRI) {
   1245     RIL_CDMA_SMS_Message rcsm;
   1246 
   1247     RLOGD("dispatchCdmaSms");
   1248     if (NO_ERROR != constructCdmaSms(p, pRI, rcsm)) {
   1249         goto invalid;
   1250     }
   1251 
   1252     CALL_ONREQUEST(pRI->pCI->requestNumber, &rcsm, sizeof(rcsm),pRI, pRI->socket_id);
   1253 
   1254 #ifdef MEMSET_FREED
   1255     memset(&rcsm, 0, sizeof(rcsm));
   1256 #endif
   1257 
   1258     return;
   1259 
   1260 invalid:
   1261     invalidCommandBlock(pRI);
   1262     return;
   1263 }
   1264 
   1265 static void
   1266 dispatchImsCdmaSms(Parcel &p, RequestInfo *pRI, uint8_t retry, int32_t messageRef) {
   1267     RIL_IMS_SMS_Message rism;
   1268     RIL_CDMA_SMS_Message rcsm;
   1269 
   1270     RLOGD("dispatchImsCdmaSms: retry=%d, messageRef=%d", retry, messageRef);
   1271 
   1272     if (NO_ERROR != constructCdmaSms(p, pRI, rcsm)) {
   1273         goto invalid;
   1274     }
   1275     memset(&rism, 0, sizeof(rism));
   1276     rism.tech = RADIO_TECH_3GPP2;
   1277     rism.retry = retry;
   1278     rism.messageRef = messageRef;
   1279     rism.message.cdmaMessage = &rcsm;
   1280 
   1281     CALL_ONREQUEST(pRI->pCI->requestNumber, &rism,
   1282             sizeof(RIL_RadioTechnologyFamily)+sizeof(uint8_t)+sizeof(int32_t)
   1283             +sizeof(rcsm),pRI, pRI->socket_id);
   1284 
   1285 #ifdef MEMSET_FREED
   1286     memset(&rcsm, 0, sizeof(rcsm));
   1287     memset(&rism, 0, sizeof(rism));
   1288 #endif
   1289 
   1290     return;
   1291 
   1292 invalid:
   1293     invalidCommandBlock(pRI);
   1294     return;
   1295 }
   1296 
   1297 static void
   1298 dispatchImsGsmSms(Parcel &p, RequestInfo *pRI, uint8_t retry, int32_t messageRef) {
   1299     RIL_IMS_SMS_Message rism;
   1300     int32_t countStrings;
   1301     status_t status;
   1302     size_t datalen;
   1303     char **pStrings;
   1304     RLOGD("dispatchImsGsmSms: retry=%d, messageRef=%d", retry, messageRef);
   1305 
   1306     status = p.readInt32 (&countStrings);
   1307 
   1308     if (status != NO_ERROR) {
   1309         goto invalid;
   1310     }
   1311 
   1312     memset(&rism, 0, sizeof(rism));
   1313     rism.tech = RADIO_TECH_3GPP;
   1314     rism.retry = retry;
   1315     rism.messageRef = messageRef;
   1316 
   1317     startRequest;
   1318     appendPrintBuf("%stech=%d, retry=%d, messageRef=%d, ", printBuf,
   1319                     (int)rism.tech, (int)rism.retry, rism.messageRef);
   1320     if (countStrings == 0) {
   1321         // just some non-null pointer
   1322         pStrings = (char **)calloc(1, sizeof(char *));
   1323         if (pStrings == NULL) {
   1324             RLOGE("Memory allocation failed for request %s",
   1325                     requestToString(pRI->pCI->requestNumber));
   1326             closeRequest;
   1327             return;
   1328         }
   1329 
   1330         datalen = 0;
   1331     } else if (countStrings < 0) {
   1332         pStrings = NULL;
   1333         datalen = 0;
   1334     } else {
   1335         if ((size_t)countStrings > (INT_MAX/sizeof(char *))) {
   1336             RLOGE("Invalid value of countStrings: \n");
   1337             closeRequest;
   1338             return;
   1339         }
   1340         datalen = sizeof(char *) * countStrings;
   1341 
   1342         pStrings = (char **)calloc(countStrings, sizeof(char *));
   1343         if (pStrings == NULL) {
   1344             RLOGE("Memory allocation failed for request %s",
   1345                     requestToString(pRI->pCI->requestNumber));
   1346             closeRequest;
   1347             return;
   1348         }
   1349 
   1350         for (int i = 0 ; i < countStrings ; i++) {
   1351             pStrings[i] = strdupReadString(p);
   1352             appendPrintBuf("%s%s,", printBuf, pStrings[i]);
   1353         }
   1354     }
   1355     removeLastChar;
   1356     closeRequest;
   1357     printRequest(pRI->token, pRI->pCI->requestNumber);
   1358 
   1359     rism.message.gsmMessage = pStrings;
   1360     CALL_ONREQUEST(pRI->pCI->requestNumber, &rism,
   1361             sizeof(RIL_RadioTechnologyFamily)+sizeof(uint8_t)+sizeof(int32_t)
   1362             +datalen, pRI, pRI->socket_id);
   1363 
   1364     if (pStrings != NULL) {
   1365         for (int i = 0 ; i < countStrings ; i++) {
   1366 #ifdef MEMSET_FREED
   1367             memsetString (pStrings[i]);
   1368 #endif
   1369             free(pStrings[i]);
   1370         }
   1371 
   1372 #ifdef MEMSET_FREED
   1373         memset(pStrings, 0, datalen);
   1374 #endif
   1375         free(pStrings);
   1376     }
   1377 
   1378 #ifdef MEMSET_FREED
   1379     memset(&rism, 0, sizeof(rism));
   1380 #endif
   1381     return;
   1382 invalid:
   1383     ALOGE("dispatchImsGsmSms invalid block");
   1384     invalidCommandBlock(pRI);
   1385     return;
   1386 }
   1387 
   1388 static void
   1389 dispatchImsSms(Parcel &p, RequestInfo *pRI) {
   1390     int32_t  t;
   1391     status_t status = p.readInt32(&t);
   1392     RIL_RadioTechnologyFamily format;
   1393     uint8_t retry;
   1394     int32_t messageRef;
   1395 
   1396     RLOGD("dispatchImsSms");
   1397     if (status != NO_ERROR) {
   1398         goto invalid;
   1399     }
   1400     format = (RIL_RadioTechnologyFamily) t;
   1401 
   1402     // read retry field
   1403     status = p.read(&retry,sizeof(retry));
   1404     if (status != NO_ERROR) {
   1405         goto invalid;
   1406     }
   1407     // read messageRef field
   1408     status = p.read(&messageRef,sizeof(messageRef));
   1409     if (status != NO_ERROR) {
   1410         goto invalid;
   1411     }
   1412 
   1413     if (RADIO_TECH_3GPP == format) {
   1414         dispatchImsGsmSms(p, pRI, retry, messageRef);
   1415     } else if (RADIO_TECH_3GPP2 == format) {
   1416         dispatchImsCdmaSms(p, pRI, retry, messageRef);
   1417     } else {
   1418         ALOGE("requestImsSendSMS invalid format value =%d", format);
   1419     }
   1420 
   1421     return;
   1422 
   1423 invalid:
   1424     invalidCommandBlock(pRI);
   1425     return;
   1426 }
   1427 
   1428 static void
   1429 dispatchCdmaSmsAck(Parcel &p, RequestInfo *pRI) {
   1430     RIL_CDMA_SMS_Ack rcsa;
   1431     int32_t  t;
   1432     status_t status;
   1433     int32_t digitCount;
   1434 
   1435     RLOGD("dispatchCdmaSmsAck");
   1436     memset(&rcsa, 0, sizeof(rcsa));
   1437 
   1438     status = p.readInt32(&t);
   1439     rcsa.uErrorClass = (RIL_CDMA_SMS_ErrorClass) t;
   1440 
   1441     status = p.readInt32(&t);
   1442     rcsa.uSMSCauseCode = (int) t;
   1443 
   1444     if (status != NO_ERROR) {
   1445         goto invalid;
   1446     }
   1447 
   1448     startRequest;
   1449     appendPrintBuf("%suErrorClass=%d, uTLStatus=%d, ",
   1450             printBuf, rcsa.uErrorClass, rcsa.uSMSCauseCode);
   1451     closeRequest;
   1452 
   1453     printRequest(pRI->token, pRI->pCI->requestNumber);
   1454 
   1455     CALL_ONREQUEST(pRI->pCI->requestNumber, &rcsa, sizeof(rcsa),pRI, pRI->socket_id);
   1456 
   1457 #ifdef MEMSET_FREED
   1458     memset(&rcsa, 0, sizeof(rcsa));
   1459 #endif
   1460 
   1461     return;
   1462 
   1463 invalid:
   1464     invalidCommandBlock(pRI);
   1465     return;
   1466 }
   1467 
   1468 static void
   1469 dispatchGsmBrSmsCnf(Parcel &p, RequestInfo *pRI) {
   1470     int32_t t;
   1471     status_t status;
   1472     int32_t num;
   1473 
   1474     status = p.readInt32(&num);
   1475     if (status != NO_ERROR) {
   1476         goto invalid;
   1477     }
   1478 
   1479     {
   1480         RIL_GSM_BroadcastSmsConfigInfo gsmBci[num];
   1481         RIL_GSM_BroadcastSmsConfigInfo *gsmBciPtrs[num];
   1482 
   1483         startRequest;
   1484         for (int i = 0 ; i < num ; i++ ) {
   1485             gsmBciPtrs[i] = &gsmBci[i];
   1486 
   1487             status = p.readInt32(&t);
   1488             gsmBci[i].fromServiceId = (int) t;
   1489 
   1490             status = p.readInt32(&t);
   1491             gsmBci[i].toServiceId = (int) t;
   1492 
   1493             status = p.readInt32(&t);
   1494             gsmBci[i].fromCodeScheme = (int) t;
   1495 
   1496             status = p.readInt32(&t);
   1497             gsmBci[i].toCodeScheme = (int) t;
   1498 
   1499             status = p.readInt32(&t);
   1500             gsmBci[i].selected = (uint8_t) t;
   1501 
   1502             appendPrintBuf("%s [%d: fromServiceId=%d, toServiceId =%d, \
   1503                   fromCodeScheme=%d, toCodeScheme=%d, selected =%d]", printBuf, i,
   1504                   gsmBci[i].fromServiceId, gsmBci[i].toServiceId,
   1505                   gsmBci[i].fromCodeScheme, gsmBci[i].toCodeScheme,
   1506                   gsmBci[i].selected);
   1507         }
   1508         closeRequest;
   1509 
   1510         if (status != NO_ERROR) {
   1511             goto invalid;
   1512         }
   1513 
   1514         CALL_ONREQUEST(pRI->pCI->requestNumber,
   1515                               gsmBciPtrs,
   1516                               num * sizeof(RIL_GSM_BroadcastSmsConfigInfo *),
   1517                               pRI, pRI->socket_id);
   1518 
   1519 #ifdef MEMSET_FREED
   1520         memset(gsmBci, 0, num * sizeof(RIL_GSM_BroadcastSmsConfigInfo));
   1521         memset(gsmBciPtrs, 0, num * sizeof(RIL_GSM_BroadcastSmsConfigInfo *));
   1522 #endif
   1523     }
   1524 
   1525     return;
   1526 
   1527 invalid:
   1528     invalidCommandBlock(pRI);
   1529     return;
   1530 }
   1531 
   1532 static void
   1533 dispatchCdmaBrSmsCnf(Parcel &p, RequestInfo *pRI) {
   1534     int32_t t;
   1535     status_t status;
   1536     int32_t num;
   1537 
   1538     status = p.readInt32(&num);
   1539     if (status != NO_ERROR) {
   1540         goto invalid;
   1541     }
   1542 
   1543     {
   1544         RIL_CDMA_BroadcastSmsConfigInfo cdmaBci[num];
   1545         RIL_CDMA_BroadcastSmsConfigInfo *cdmaBciPtrs[num];
   1546 
   1547         startRequest;
   1548         for (int i = 0 ; i < num ; i++ ) {
   1549             cdmaBciPtrs[i] = &cdmaBci[i];
   1550 
   1551             status = p.readInt32(&t);
   1552             cdmaBci[i].service_category = (int) t;
   1553 
   1554             status = p.readInt32(&t);
   1555             cdmaBci[i].language = (int) t;
   1556 
   1557             status = p.readInt32(&t);
   1558             cdmaBci[i].selected = (uint8_t) t;
   1559 
   1560             appendPrintBuf("%s [%d: service_category=%d, language =%d, \
   1561                   entries.bSelected =%d]", printBuf, i, cdmaBci[i].service_category,
   1562                   cdmaBci[i].language, cdmaBci[i].selected);
   1563         }
   1564         closeRequest;
   1565 
   1566         if (status != NO_ERROR) {
   1567             goto invalid;
   1568         }
   1569 
   1570         CALL_ONREQUEST(pRI->pCI->requestNumber,
   1571                               cdmaBciPtrs,
   1572                               num * sizeof(RIL_CDMA_BroadcastSmsConfigInfo *),
   1573                               pRI, pRI->socket_id);
   1574 
   1575 #ifdef MEMSET_FREED
   1576         memset(cdmaBci, 0, num * sizeof(RIL_CDMA_BroadcastSmsConfigInfo));
   1577         memset(cdmaBciPtrs, 0, num * sizeof(RIL_CDMA_BroadcastSmsConfigInfo *));
   1578 #endif
   1579     }
   1580 
   1581     return;
   1582 
   1583 invalid:
   1584     invalidCommandBlock(pRI);
   1585     return;
   1586 }
   1587 
   1588 static void dispatchRilCdmaSmsWriteArgs(Parcel &p, RequestInfo *pRI) {
   1589     RIL_CDMA_SMS_WriteArgs rcsw;
   1590     int32_t  t;
   1591     uint32_t ut;
   1592     uint8_t  uct;
   1593     status_t status;
   1594     int32_t  digitCount;
   1595     int32_t  digitLimit;
   1596 
   1597     memset(&rcsw, 0, sizeof(rcsw));
   1598 
   1599     status = p.readInt32(&t);
   1600     rcsw.status = t;
   1601 
   1602     status = p.readInt32(&t);
   1603     rcsw.message.uTeleserviceID = (int) t;
   1604 
   1605     status = p.read(&uct,sizeof(uct));
   1606     rcsw.message.bIsServicePresent = (uint8_t) uct;
   1607 
   1608     status = p.readInt32(&t);
   1609     rcsw.message.uServicecategory = (int) t;
   1610 
   1611     status = p.readInt32(&t);
   1612     rcsw.message.sAddress.digit_mode = (RIL_CDMA_SMS_DigitMode) t;
   1613 
   1614     status = p.readInt32(&t);
   1615     rcsw.message.sAddress.number_mode = (RIL_CDMA_SMS_NumberMode) t;
   1616 
   1617     status = p.readInt32(&t);
   1618     rcsw.message.sAddress.number_type = (RIL_CDMA_SMS_NumberType) t;
   1619 
   1620     status = p.readInt32(&t);
   1621     rcsw.message.sAddress.number_plan = (RIL_CDMA_SMS_NumberPlan) t;
   1622 
   1623     status = p.read(&uct,sizeof(uct));
   1624     rcsw.message.sAddress.number_of_digits = (uint8_t) uct;
   1625 
   1626     digitLimit = MIN((rcsw.message.sAddress.number_of_digits), RIL_CDMA_SMS_ADDRESS_MAX);
   1627 
   1628     for(digitCount = 0 ; digitCount < digitLimit; digitCount ++) {
   1629         status = p.read(&uct,sizeof(uct));
   1630         rcsw.message.sAddress.digits[digitCount] = (uint8_t) uct;
   1631     }
   1632 
   1633     status = p.readInt32(&t);
   1634     rcsw.message.sSubAddress.subaddressType = (RIL_CDMA_SMS_SubaddressType) t;
   1635 
   1636     status = p.read(&uct,sizeof(uct));
   1637     rcsw.message.sSubAddress.odd = (uint8_t) uct;
   1638 
   1639     status = p.read(&uct,sizeof(uct));
   1640     rcsw.message.sSubAddress.number_of_digits = (uint8_t) uct;
   1641 
   1642     digitLimit = MIN((rcsw.message.sSubAddress.number_of_digits), RIL_CDMA_SMS_SUBADDRESS_MAX);
   1643 
   1644     for(digitCount = 0 ; digitCount < digitLimit; digitCount ++) {
   1645         status = p.read(&uct,sizeof(uct));
   1646         rcsw.message.sSubAddress.digits[digitCount] = (uint8_t) uct;
   1647     }
   1648 
   1649     status = p.readInt32(&t);
   1650     rcsw.message.uBearerDataLen = (int) t;
   1651 
   1652     digitLimit = MIN((rcsw.message.uBearerDataLen), RIL_CDMA_SMS_BEARER_DATA_MAX);
   1653 
   1654     for(digitCount = 0 ; digitCount < digitLimit; digitCount ++) {
   1655         status = p.read(&uct, sizeof(uct));
   1656         rcsw.message.aBearerData[digitCount] = (uint8_t) uct;
   1657     }
   1658 
   1659     if (status != NO_ERROR) {
   1660         goto invalid;
   1661     }
   1662 
   1663     startRequest;
   1664     appendPrintBuf("%sstatus=%d, message.uTeleserviceID=%d, message.bIsServicePresent=%d, \
   1665             message.uServicecategory=%d, message.sAddress.digit_mode=%d, \
   1666             message.sAddress.number_mode=%d, \
   1667             message.sAddress.number_type=%d, ",
   1668             printBuf, rcsw.status, rcsw.message.uTeleserviceID, rcsw.message.bIsServicePresent,
   1669             rcsw.message.uServicecategory, rcsw.message.sAddress.digit_mode,
   1670             rcsw.message.sAddress.number_mode,
   1671             rcsw.message.sAddress.number_type);
   1672     closeRequest;
   1673 
   1674     printRequest(pRI->token, pRI->pCI->requestNumber);
   1675 
   1676     CALL_ONREQUEST(pRI->pCI->requestNumber, &rcsw, sizeof(rcsw),pRI, pRI->socket_id);
   1677 
   1678 #ifdef MEMSET_FREED
   1679     memset(&rcsw, 0, sizeof(rcsw));
   1680 #endif
   1681 
   1682     return;
   1683 
   1684 invalid:
   1685     invalidCommandBlock(pRI);
   1686     return;
   1687 
   1688 }
   1689 
   1690 // For backwards compatibility in RIL_REQUEST_SETUP_DATA_CALL.
   1691 // Version 4 of the RIL interface adds a new PDP type parameter to support
   1692 // IPv6 and dual-stack PDP contexts. When dealing with a previous version of
   1693 // RIL, remove the parameter from the request.
   1694 static void dispatchDataCall(Parcel& p, RequestInfo *pRI) {
   1695     // In RIL v3, REQUEST_SETUP_DATA_CALL takes 6 parameters.
   1696     const int numParamsRilV3 = 6;
   1697 
   1698     // The first bytes of the RIL parcel contain the request number and the
   1699     // serial number - see processCommandBuffer(). Copy them over too.
   1700     int pos = p.dataPosition();
   1701 
   1702     int numParams = p.readInt32();
   1703     if (s_callbacks.version < 4 && numParams > numParamsRilV3) {
   1704       Parcel p2;
   1705       p2.appendFrom(&p, 0, pos);
   1706       p2.writeInt32(numParamsRilV3);
   1707       for(int i = 0; i < numParamsRilV3; i++) {
   1708         p2.writeString16(p.readString16());
   1709       }
   1710       p2.setDataPosition(pos);
   1711       dispatchStrings(p2, pRI);
   1712     } else {
   1713       p.setDataPosition(pos);
   1714       dispatchStrings(p, pRI);
   1715     }
   1716 }
   1717 
   1718 // For backwards compatibility with RILs that dont support RIL_REQUEST_VOICE_RADIO_TECH.
   1719 // When all RILs handle this request, this function can be removed and
   1720 // the request can be sent directly to the RIL using dispatchVoid.
   1721 static void dispatchVoiceRadioTech(Parcel& p, RequestInfo *pRI) {
   1722     RIL_RadioState state = CALL_ONSTATEREQUEST((RIL_SOCKET_ID)pRI->socket_id);
   1723 
   1724     if ((RADIO_STATE_UNAVAILABLE == state) || (RADIO_STATE_OFF == state)) {
   1725         RIL_onRequestComplete(pRI, RIL_E_RADIO_NOT_AVAILABLE, NULL, 0);
   1726     }
   1727 
   1728     // RILs that support RADIO_STATE_ON should support this request.
   1729     if (RADIO_STATE_ON == state) {
   1730         dispatchVoid(p, pRI);
   1731         return;
   1732     }
   1733 
   1734     // For Older RILs, that do not support RADIO_STATE_ON, assume that they
   1735     // will not support this new request either and decode Voice Radio Technology
   1736     // from Radio State
   1737     voiceRadioTech = decodeVoiceRadioTechnology(state);
   1738 
   1739     if (voiceRadioTech < 0)
   1740         RIL_onRequestComplete(pRI, RIL_E_GENERIC_FAILURE, NULL, 0);
   1741     else
   1742         RIL_onRequestComplete(pRI, RIL_E_SUCCESS, &voiceRadioTech, sizeof(int));
   1743 }
   1744 
   1745 // For backwards compatibility in RIL_REQUEST_CDMA_GET_SUBSCRIPTION_SOURCE:.
   1746 // When all RILs handle this request, this function can be removed and
   1747 // the request can be sent directly to the RIL using dispatchVoid.
   1748 static void dispatchCdmaSubscriptionSource(Parcel& p, RequestInfo *pRI) {
   1749     RIL_RadioState state = CALL_ONSTATEREQUEST((RIL_SOCKET_ID)pRI->socket_id);
   1750 
   1751     if ((RADIO_STATE_UNAVAILABLE == state) || (RADIO_STATE_OFF == state)) {
   1752         RIL_onRequestComplete(pRI, RIL_E_RADIO_NOT_AVAILABLE, NULL, 0);
   1753     }
   1754 
   1755     // RILs that support RADIO_STATE_ON should support this request.
   1756     if (RADIO_STATE_ON == state) {
   1757         dispatchVoid(p, pRI);
   1758         return;
   1759     }
   1760 
   1761     // For Older RILs, that do not support RADIO_STATE_ON, assume that they
   1762     // will not support this new request either and decode CDMA Subscription Source
   1763     // from Radio State
   1764     cdmaSubscriptionSource = decodeCdmaSubscriptionSource(state);
   1765 
   1766     if (cdmaSubscriptionSource < 0)
   1767         RIL_onRequestComplete(pRI, RIL_E_GENERIC_FAILURE, NULL, 0);
   1768     else
   1769         RIL_onRequestComplete(pRI, RIL_E_SUCCESS, &cdmaSubscriptionSource, sizeof(int));
   1770 }
   1771 
   1772 static void dispatchSetInitialAttachApn(Parcel &p, RequestInfo *pRI)
   1773 {
   1774     RIL_InitialAttachApn pf;
   1775     int32_t  t;
   1776     status_t status;
   1777 
   1778     memset(&pf, 0, sizeof(pf));
   1779 
   1780     pf.apn = strdupReadString(p);
   1781     pf.protocol = strdupReadString(p);
   1782 
   1783     status = p.readInt32(&t);
   1784     pf.authtype = (int) t;
   1785 
   1786     pf.username = strdupReadString(p);
   1787     pf.password = strdupReadString(p);
   1788 
   1789     startRequest;
   1790     appendPrintBuf("%sapn=%s, protocol=%s, authtype=%d, username=%s, password=%s",
   1791             printBuf, pf.apn, pf.protocol, pf.authtype, pf.username, pf.password);
   1792     closeRequest;
   1793     printRequest(pRI->token, pRI->pCI->requestNumber);
   1794 
   1795     if (status != NO_ERROR) {
   1796         goto invalid;
   1797     }
   1798     CALL_ONREQUEST(pRI->pCI->requestNumber, &pf, sizeof(pf), pRI, pRI->socket_id);
   1799 
   1800 #ifdef MEMSET_FREED
   1801     memsetString(pf.apn);
   1802     memsetString(pf.protocol);
   1803     memsetString(pf.username);
   1804     memsetString(pf.password);
   1805 #endif
   1806 
   1807     free(pf.apn);
   1808     free(pf.protocol);
   1809     free(pf.username);
   1810     free(pf.password);
   1811 
   1812 #ifdef MEMSET_FREED
   1813     memset(&pf, 0, sizeof(pf));
   1814 #endif
   1815 
   1816     return;
   1817 invalid:
   1818     invalidCommandBlock(pRI);
   1819     return;
   1820 }
   1821 
   1822 static void dispatchNVReadItem(Parcel &p, RequestInfo *pRI) {
   1823     RIL_NV_ReadItem nvri;
   1824     int32_t  t;
   1825     status_t status;
   1826 
   1827     memset(&nvri, 0, sizeof(nvri));
   1828 
   1829     status = p.readInt32(&t);
   1830     nvri.itemID = (RIL_NV_Item) t;
   1831 
   1832     if (status != NO_ERROR) {
   1833         goto invalid;
   1834     }
   1835 
   1836     startRequest;
   1837     appendPrintBuf("%snvri.itemID=%d, ", printBuf, nvri.itemID);
   1838     closeRequest;
   1839 
   1840     printRequest(pRI->token, pRI->pCI->requestNumber);
   1841 
   1842     CALL_ONREQUEST(pRI->pCI->requestNumber, &nvri, sizeof(nvri), pRI, pRI->socket_id);
   1843 
   1844 #ifdef MEMSET_FREED
   1845     memset(&nvri, 0, sizeof(nvri));
   1846 #endif
   1847 
   1848     return;
   1849 
   1850 invalid:
   1851     invalidCommandBlock(pRI);
   1852     return;
   1853 }
   1854 
   1855 static void dispatchNVWriteItem(Parcel &p, RequestInfo *pRI) {
   1856     RIL_NV_WriteItem nvwi;
   1857     int32_t  t;
   1858     status_t status;
   1859 
   1860     memset(&nvwi, 0, sizeof(nvwi));
   1861 
   1862     status = p.readInt32(&t);
   1863     nvwi.itemID = (RIL_NV_Item) t;
   1864 
   1865     nvwi.value = strdupReadString(p);
   1866 
   1867     if (status != NO_ERROR || nvwi.value == NULL) {
   1868         goto invalid;
   1869     }
   1870 
   1871     startRequest;
   1872     appendPrintBuf("%snvwi.itemID=%d, value=%s, ", printBuf, nvwi.itemID,
   1873             nvwi.value);
   1874     closeRequest;
   1875 
   1876     printRequest(pRI->token, pRI->pCI->requestNumber);
   1877 
   1878     CALL_ONREQUEST(pRI->pCI->requestNumber, &nvwi, sizeof(nvwi), pRI, pRI->socket_id);
   1879 
   1880 #ifdef MEMSET_FREED
   1881     memsetString(nvwi.value);
   1882 #endif
   1883 
   1884     free(nvwi.value);
   1885 
   1886 #ifdef MEMSET_FREED
   1887     memset(&nvwi, 0, sizeof(nvwi));
   1888 #endif
   1889 
   1890     return;
   1891 
   1892 invalid:
   1893     invalidCommandBlock(pRI);
   1894     return;
   1895 }
   1896 
   1897 
   1898 static void dispatchUiccSubscripton(Parcel &p, RequestInfo *pRI) {
   1899     RIL_SelectUiccSub uicc_sub;
   1900     status_t status;
   1901     int32_t  t;
   1902     memset(&uicc_sub, 0, sizeof(uicc_sub));
   1903 
   1904     status = p.readInt32(&t);
   1905     if (status != NO_ERROR) {
   1906         goto invalid;
   1907     }
   1908     uicc_sub.slot = (int) t;
   1909 
   1910     status = p.readInt32(&t);
   1911     if (status != NO_ERROR) {
   1912         goto invalid;
   1913     }
   1914     uicc_sub.app_index = (int) t;
   1915 
   1916     status = p.readInt32(&t);
   1917     if (status != NO_ERROR) {
   1918         goto invalid;
   1919     }
   1920     uicc_sub.sub_type = (RIL_SubscriptionType) t;
   1921 
   1922     status = p.readInt32(&t);
   1923     if (status != NO_ERROR) {
   1924         goto invalid;
   1925     }
   1926     uicc_sub.act_status = (RIL_UiccSubActStatus) t;
   1927 
   1928     startRequest;
   1929     appendPrintBuf("slot=%d, app_index=%d, act_status = %d", uicc_sub.slot, uicc_sub.app_index,
   1930             uicc_sub.act_status);
   1931     RLOGD("dispatchUiccSubscription, slot=%d, app_index=%d, act_status = %d", uicc_sub.slot,
   1932             uicc_sub.app_index, uicc_sub.act_status);
   1933     closeRequest;
   1934     printRequest(pRI->token, pRI->pCI->requestNumber);
   1935 
   1936     CALL_ONREQUEST(pRI->pCI->requestNumber, &uicc_sub, sizeof(uicc_sub), pRI, pRI->socket_id);
   1937 
   1938 #ifdef MEMSET_FREED
   1939     memset(&uicc_sub, 0, sizeof(uicc_sub));
   1940 #endif
   1941     return;
   1942 
   1943 invalid:
   1944     invalidCommandBlock(pRI);
   1945     return;
   1946 }
   1947 
   1948 static void dispatchSimAuthentication(Parcel &p, RequestInfo *pRI)
   1949 {
   1950     RIL_SimAuthentication pf;
   1951     int32_t  t;
   1952     status_t status;
   1953 
   1954     memset(&pf, 0, sizeof(pf));
   1955 
   1956     status = p.readInt32(&t);
   1957     pf.authContext = (int) t;
   1958     pf.authData = strdupReadString(p);
   1959     pf.aid = strdupReadString(p);
   1960 
   1961     startRequest;
   1962     appendPrintBuf("authContext=%s, authData=%s, aid=%s", pf.authContext, pf.authData, pf.aid);
   1963     closeRequest;
   1964     printRequest(pRI->token, pRI->pCI->requestNumber);
   1965 
   1966     if (status != NO_ERROR) {
   1967         goto invalid;
   1968     }
   1969     CALL_ONREQUEST(pRI->pCI->requestNumber, &pf, sizeof(pf), pRI, pRI->socket_id);
   1970 
   1971 #ifdef MEMSET_FREED
   1972     memsetString(pf.authData);
   1973     memsetString(pf.aid);
   1974 #endif
   1975 
   1976     free(pf.authData);
   1977     free(pf.aid);
   1978 
   1979 #ifdef MEMSET_FREED
   1980     memset(&pf, 0, sizeof(pf));
   1981 #endif
   1982 
   1983     return;
   1984 invalid:
   1985     invalidCommandBlock(pRI);
   1986     return;
   1987 }
   1988 
   1989 static void dispatchDataProfile(Parcel &p, RequestInfo *pRI) {
   1990     int32_t t;
   1991     status_t status;
   1992     int32_t num;
   1993 
   1994     status = p.readInt32(&num);
   1995     if (status != NO_ERROR || num < 0) {
   1996         goto invalid;
   1997     }
   1998 
   1999     {
   2000         RIL_DataProfileInfo *dataProfiles =
   2001                 (RIL_DataProfileInfo *)calloc(num, sizeof(RIL_DataProfileInfo));
   2002         if (dataProfiles == NULL) {
   2003             RLOGE("Memory allocation failed for request %s",
   2004                     requestToString(pRI->pCI->requestNumber));
   2005             return;
   2006         }
   2007         RIL_DataProfileInfo **dataProfilePtrs =
   2008                 (RIL_DataProfileInfo **)calloc(num, sizeof(RIL_DataProfileInfo *));
   2009         if (dataProfilePtrs == NULL) {
   2010             RLOGE("Memory allocation failed for request %s",
   2011                     requestToString(pRI->pCI->requestNumber));
   2012             free(dataProfiles);
   2013             return;
   2014         }
   2015 
   2016         startRequest;
   2017         for (int i = 0 ; i < num ; i++ ) {
   2018             dataProfilePtrs[i] = &dataProfiles[i];
   2019 
   2020             status = p.readInt32(&t);
   2021             dataProfiles[i].profileId = (int) t;
   2022 
   2023             dataProfiles[i].apn = strdupReadString(p);
   2024             dataProfiles[i].protocol = strdupReadString(p);
   2025             status = p.readInt32(&t);
   2026             dataProfiles[i].authType = (int) t;
   2027 
   2028             dataProfiles[i].user = strdupReadString(p);
   2029             dataProfiles[i].password = strdupReadString(p);
   2030 
   2031             status = p.readInt32(&t);
   2032             dataProfiles[i].type = (int) t;
   2033 
   2034             status = p.readInt32(&t);
   2035             dataProfiles[i].maxConnsTime = (int) t;
   2036             status = p.readInt32(&t);
   2037             dataProfiles[i].maxConns = (int) t;
   2038             status = p.readInt32(&t);
   2039             dataProfiles[i].waitTime = (int) t;
   2040 
   2041             status = p.readInt32(&t);
   2042             dataProfiles[i].enabled = (int) t;
   2043 
   2044             appendPrintBuf("%s [%d: profileId=%d, apn =%s, protocol =%s, authType =%d, \
   2045                   user =%s, password =%s, type =%d, maxConnsTime =%d, maxConns =%d, \
   2046                   waitTime =%d, enabled =%d]", printBuf, i, dataProfiles[i].profileId,
   2047                   dataProfiles[i].apn, dataProfiles[i].protocol, dataProfiles[i].authType,
   2048                   dataProfiles[i].user, dataProfiles[i].password, dataProfiles[i].type,
   2049                   dataProfiles[i].maxConnsTime, dataProfiles[i].maxConns,
   2050                   dataProfiles[i].waitTime, dataProfiles[i].enabled);
   2051         }
   2052         closeRequest;
   2053         printRequest(pRI->token, pRI->pCI->requestNumber);
   2054 
   2055         if (status != NO_ERROR) {
   2056             free(dataProfiles);
   2057             free(dataProfilePtrs);
   2058             goto invalid;
   2059         }
   2060         CALL_ONREQUEST(pRI->pCI->requestNumber,
   2061                               dataProfilePtrs,
   2062                               num * sizeof(RIL_DataProfileInfo *),
   2063                               pRI, pRI->socket_id);
   2064 
   2065 #ifdef MEMSET_FREED
   2066         memset(dataProfiles, 0, num * sizeof(RIL_DataProfileInfo));
   2067         memset(dataProfilePtrs, 0, num * sizeof(RIL_DataProfileInfo *));
   2068 #endif
   2069         free(dataProfiles);
   2070         free(dataProfilePtrs);
   2071     }
   2072 
   2073     return;
   2074 
   2075 invalid:
   2076     invalidCommandBlock(pRI);
   2077     return;
   2078 }
   2079 
   2080 static void dispatchRadioCapability(Parcel &p, RequestInfo *pRI){
   2081     RIL_RadioCapability rc;
   2082     int32_t t;
   2083     status_t status;
   2084 
   2085     memset (&rc, 0, sizeof(RIL_RadioCapability));
   2086 
   2087     status = p.readInt32(&t);
   2088     rc.version = (int)t;
   2089     if (status != NO_ERROR) {
   2090         goto invalid;
   2091     }
   2092 
   2093     status = p.readInt32(&t);
   2094     rc.session= (int)t;
   2095     if (status != NO_ERROR) {
   2096         goto invalid;
   2097     }
   2098 
   2099     status = p.readInt32(&t);
   2100     rc.phase= (int)t;
   2101     if (status != NO_ERROR) {
   2102         goto invalid;
   2103     }
   2104 
   2105     status = p.readInt32(&t);
   2106     rc.rat = (int)t;
   2107     if (status != NO_ERROR) {
   2108         goto invalid;
   2109     }
   2110 
   2111     status = readStringFromParcelInplace(p, rc.logicalModemUuid, sizeof(rc.logicalModemUuid));
   2112     if (status != NO_ERROR) {
   2113         goto invalid;
   2114     }
   2115 
   2116     status = p.readInt32(&t);
   2117     rc.status = (int)t;
   2118 
   2119     if (status != NO_ERROR) {
   2120         goto invalid;
   2121     }
   2122 
   2123     startRequest;
   2124     appendPrintBuf("%s [version:%d, session:%d, phase:%d, rat:%d, \
   2125             logicalModemUuid:%s, status:%d", printBuf, rc.version, rc.session,
   2126             rc.phase, rc.rat, rc.logicalModemUuid, rc.session);
   2127 
   2128     closeRequest;
   2129     printRequest(pRI->token, pRI->pCI->requestNumber);
   2130 
   2131     CALL_ONREQUEST(pRI->pCI->requestNumber,
   2132                 &rc,
   2133                 sizeof(RIL_RadioCapability),
   2134                 pRI, pRI->socket_id);
   2135     return;
   2136 invalid:
   2137     invalidCommandBlock(pRI);
   2138     return;
   2139 }
   2140 
   2141 /**
   2142  * Callee expects const RIL_CarrierRestrictions *
   2143  */
   2144 static void dispatchCarrierRestrictions(Parcel &p, RequestInfo *pRI) {
   2145     RIL_CarrierRestrictions cr;
   2146     RIL_Carrier * allowed_carriers = NULL;
   2147     RIL_Carrier * excluded_carriers = NULL;
   2148     int32_t t;
   2149     status_t status;
   2150 
   2151     memset(&cr, 0, sizeof(RIL_CarrierRestrictions));
   2152 
   2153     if (s_callbacks.version < 14) {
   2154         RLOGE("Unsuppoted RIL version %d, min version expected %d",
   2155               s_callbacks.version, 14);
   2156         RIL_onRequestComplete(pRI, RIL_E_REQUEST_NOT_SUPPORTED, NULL, 0);
   2157         return;
   2158     }
   2159 
   2160     status = p.readInt32(&t);
   2161     if (status != NO_ERROR) {
   2162         goto invalid;
   2163     }
   2164     allowed_carriers = (RIL_Carrier *)calloc(t, sizeof(RIL_Carrier));
   2165     if (allowed_carriers == NULL) {
   2166         RLOGE("Memory allocation failed for request %s", requestToString(pRI->pCI->requestNumber));
   2167         goto exit;
   2168     }
   2169     cr.len_allowed_carriers = t;
   2170     cr.allowed_carriers = allowed_carriers;
   2171 
   2172     status = p.readInt32(&t);
   2173     if (status != NO_ERROR) {
   2174         goto invalid;
   2175     }
   2176     excluded_carriers = (RIL_Carrier *)calloc(t, sizeof(RIL_Carrier));
   2177     if (excluded_carriers == NULL) {
   2178         RLOGE("Memory allocation failed for request %s", requestToString(pRI->pCI->requestNumber));
   2179         goto exit;
   2180     }
   2181     cr.len_excluded_carriers = t;
   2182     cr.excluded_carriers = excluded_carriers;
   2183 
   2184     startRequest;
   2185     appendPrintBuf("%s len_allowed_carriers:%d, len_excluded_carriers:%d,",
   2186                    printBuf, cr.len_allowed_carriers, cr.len_excluded_carriers);
   2187 
   2188     appendPrintBuf("%s allowed_carriers:", printBuf);
   2189     for (int32_t i = 0; i < cr.len_allowed_carriers; i++) {
   2190         RIL_Carrier *p_cr = allowed_carriers + i;
   2191         p_cr->mcc = strdupReadString(p);
   2192         p_cr->mnc = strdupReadString(p);
   2193         status = p.readInt32(&t);
   2194         p_cr->match_type = static_cast<RIL_CarrierMatchType>(t);
   2195         if (status != NO_ERROR) {
   2196             goto invalid;
   2197         }
   2198         p_cr->match_data = strdupReadString(p);
   2199         appendPrintBuf("%s [%d mcc:%s, mnc:%s, match_type:%d, match_data:%s],",
   2200                        printBuf, i, p_cr->mcc, p_cr->mnc, p_cr->match_type, p_cr->match_data);
   2201     }
   2202 
   2203     for (int32_t i = 0; i < cr.len_excluded_carriers; i++) {
   2204         RIL_Carrier *p_cr = excluded_carriers + i;
   2205         p_cr->mcc = strdupReadString(p);
   2206         p_cr->mnc = strdupReadString(p);
   2207         status = p.readInt32(&t);
   2208         p_cr->match_type = static_cast<RIL_CarrierMatchType>(t);
   2209         if (status != NO_ERROR) {
   2210             goto invalid;
   2211         }
   2212         p_cr->match_data = strdupReadString(p);
   2213         appendPrintBuf("%s [%d mcc:%s, mnc:%s, match_type:%d, match_data:%s],",
   2214                        printBuf, i, p_cr->mcc, p_cr->mnc, p_cr->match_type, p_cr->match_data);
   2215     }
   2216 
   2217     closeRequest;
   2218     printRequest(pRI->token, pRI->pCI->requestNumber);
   2219 
   2220     CALL_ONREQUEST(pRI->pCI->requestNumber,
   2221                 &cr,
   2222                 sizeof(RIL_CarrierRestrictions),
   2223                 pRI, pRI->socket_id);
   2224 
   2225     goto exit;
   2226 
   2227 invalid:
   2228     invalidCommandBlock(pRI);
   2229     RIL_onRequestComplete(pRI, RIL_E_INVALID_ARGUMENTS, NULL, 0);
   2230 exit:
   2231     if (allowed_carriers != NULL) {
   2232         free(allowed_carriers);
   2233     }
   2234     if (excluded_carriers != NULL) {
   2235         free(excluded_carriers);
   2236     }
   2237     return;
   2238 }
   2239 
   2240 static int
   2241 blockingWrite(int fd, const void *buffer, size_t len) {
   2242     size_t writeOffset = 0;
   2243     const uint8_t *toWrite;
   2244 
   2245     toWrite = (const uint8_t *)buffer;
   2246 
   2247     while (writeOffset < len) {
   2248         ssize_t written;
   2249         do {
   2250             written = write (fd, toWrite + writeOffset,
   2251                                 len - writeOffset);
   2252         } while (written < 0 && ((errno == EINTR) || (errno == EAGAIN)));
   2253 
   2254         if (written >= 0) {
   2255             writeOffset += written;
   2256         } else {   // written < 0
   2257             RLOGE ("RIL Response: unexpected error on write errno:%d", errno);
   2258             close(fd);
   2259             return -1;
   2260         }
   2261     }
   2262 #if VDBG
   2263     RLOGE("RIL Response bytes written:%d", writeOffset);
   2264 #endif
   2265     return 0;
   2266 }
   2267 
   2268 static int
   2269 sendResponseRaw (const void *data, size_t dataSize, RIL_SOCKET_ID socket_id) {
   2270     int fd = s_ril_param_socket.fdCommand;
   2271     int ret;
   2272     uint32_t header;
   2273     pthread_mutex_t * writeMutexHook = &s_writeMutex;
   2274 
   2275 #if VDBG
   2276     RLOGE("Send Response to %s", rilSocketIdToString(socket_id));
   2277 #endif
   2278 
   2279 #if (SIM_COUNT >= 2)
   2280     if (socket_id == RIL_SOCKET_2) {
   2281         fd = s_ril_param_socket2.fdCommand;
   2282         writeMutexHook = &s_writeMutex_socket2;
   2283     }
   2284 #if (SIM_COUNT >= 3)
   2285     else if (socket_id == RIL_SOCKET_3) {
   2286         fd = s_ril_param_socket3.fdCommand;
   2287         writeMutexHook = &s_writeMutex_socket3;
   2288     }
   2289 #endif
   2290 #if (SIM_COUNT >= 4)
   2291     else if (socket_id == RIL_SOCKET_4) {
   2292         fd = s_ril_param_socket4.fdCommand;
   2293         writeMutexHook = &s_writeMutex_socket4;
   2294     }
   2295 #endif
   2296 #endif
   2297     if (fd < 0) {
   2298         return -1;
   2299     }
   2300 
   2301     if (dataSize > MAX_COMMAND_BYTES) {
   2302         RLOGE("RIL: packet larger than %u (%u)",
   2303                 MAX_COMMAND_BYTES, (unsigned int )dataSize);
   2304 
   2305         return -1;
   2306     }
   2307 
   2308     pthread_mutex_lock(writeMutexHook);
   2309 
   2310     header = htonl(dataSize);
   2311 
   2312     ret = blockingWrite(fd, (void *)&header, sizeof(header));
   2313 
   2314     if (ret < 0) {
   2315         pthread_mutex_unlock(writeMutexHook);
   2316         return ret;
   2317     }
   2318 
   2319     ret = blockingWrite(fd, data, dataSize);
   2320 
   2321     if (ret < 0) {
   2322         pthread_mutex_unlock(writeMutexHook);
   2323         return ret;
   2324     }
   2325 
   2326     pthread_mutex_unlock(writeMutexHook);
   2327 
   2328     return 0;
   2329 }
   2330 
   2331 static int
   2332 sendResponse (Parcel &p, RIL_SOCKET_ID socket_id) {
   2333     printResponse;
   2334     return sendResponseRaw(p.data(), p.dataSize(), socket_id);
   2335 }
   2336 
   2337 /** response is an int* pointing to an array of ints */
   2338 
   2339 static int
   2340 responseInts(Parcel &p, void *response, size_t responselen) {
   2341     int numInts;
   2342 
   2343     if (response == NULL && responselen != 0) {
   2344         RLOGE("invalid response: NULL");
   2345         return RIL_ERRNO_INVALID_RESPONSE;
   2346     }
   2347     if (responselen % sizeof(int) != 0) {
   2348         RLOGE("responseInts: invalid response length %d expected multiple of %d\n",
   2349             (int)responselen, (int)sizeof(int));
   2350         return RIL_ERRNO_INVALID_RESPONSE;
   2351     }
   2352 
   2353     int *p_int = (int *) response;
   2354 
   2355     numInts = responselen / sizeof(int);
   2356     p.writeInt32 (numInts);
   2357 
   2358     /* each int*/
   2359     startResponse;
   2360     for (int i = 0 ; i < numInts ; i++) {
   2361         appendPrintBuf("%s%d,", printBuf, p_int[i]);
   2362         p.writeInt32(p_int[i]);
   2363     }
   2364     removeLastChar;
   2365     closeResponse;
   2366 
   2367     return 0;
   2368 }
   2369 
   2370 // Response is an int or RIL_LastCallFailCauseInfo.
   2371 // Currently, only Shamu plans to use RIL_LastCallFailCauseInfo.
   2372 // TODO(yjl): Let all implementations use RIL_LastCallFailCauseInfo.
   2373 static int responseFailCause(Parcel &p, void *response, size_t responselen) {
   2374     if (response == NULL && responselen != 0) {
   2375         RLOGE("invalid response: NULL");
   2376         return RIL_ERRNO_INVALID_RESPONSE;
   2377     }
   2378 
   2379     if (responselen == sizeof(int)) {
   2380       startResponse;
   2381       int *p_int = (int *) response;
   2382       appendPrintBuf("%s%d,", printBuf, p_int[0]);
   2383       p.writeInt32(p_int[0]);
   2384       removeLastChar;
   2385       closeResponse;
   2386     } else if (responselen == sizeof(RIL_LastCallFailCauseInfo)) {
   2387       startResponse;
   2388       RIL_LastCallFailCauseInfo *p_fail_cause_info = (RIL_LastCallFailCauseInfo *) response;
   2389       appendPrintBuf("%s[cause_code=%d,vendor_cause=%s]", printBuf, p_fail_cause_info->cause_code,
   2390                      p_fail_cause_info->vendor_cause);
   2391       p.writeInt32(p_fail_cause_info->cause_code);
   2392       writeStringToParcel(p, p_fail_cause_info->vendor_cause);
   2393       removeLastChar;
   2394       closeResponse;
   2395     } else {
   2396       RLOGE("responseFailCause: invalid response length %d expected an int or "
   2397             "RIL_LastCallFailCauseInfo", (int)responselen);
   2398       return RIL_ERRNO_INVALID_RESPONSE;
   2399     }
   2400 
   2401     return 0;
   2402 }
   2403 
   2404 /** response is a char **, pointing to an array of char *'s
   2405     The parcel will begin with the version */
   2406 static int responseStringsWithVersion(int version, Parcel &p, void *response, size_t responselen) {
   2407     p.writeInt32(version);
   2408     return responseStrings(p, response, responselen);
   2409 }
   2410 
   2411 /** response is a char **, pointing to an array of char *'s */
   2412 static int responseStrings(Parcel &p, void *response, size_t responselen) {
   2413     int numStrings;
   2414 
   2415     if (response == NULL && responselen != 0) {
   2416         RLOGE("invalid response: NULL");
   2417         return RIL_ERRNO_INVALID_RESPONSE;
   2418     }
   2419     if (responselen % sizeof(char *) != 0) {
   2420         RLOGE("responseStrings: invalid response length %d expected multiple of %d\n",
   2421             (int)responselen, (int)sizeof(char *));
   2422         return RIL_ERRNO_INVALID_RESPONSE;
   2423     }
   2424 
   2425     if (response == NULL) {
   2426         p.writeInt32 (0);
   2427     } else {
   2428         char **p_cur = (char **) response;
   2429 
   2430         numStrings = responselen / sizeof(char *);
   2431         p.writeInt32 (numStrings);
   2432 
   2433         /* each string*/
   2434         startResponse;
   2435         for (int i = 0 ; i < numStrings ; i++) {
   2436             appendPrintBuf("%s%s,", printBuf, (char*)p_cur[i]);
   2437             writeStringToParcel (p, p_cur[i]);
   2438         }
   2439         removeLastChar;
   2440         closeResponse;
   2441     }
   2442     return 0;
   2443 }
   2444 
   2445 
   2446 /**
   2447  * NULL strings are accepted
   2448  * FIXME currently ignores responselen
   2449  */
   2450 static int responseString(Parcel &p, void *response, size_t responselen) {
   2451     /* one string only */
   2452     startResponse;
   2453     appendPrintBuf("%s%s", printBuf, (char*)response);
   2454     closeResponse;
   2455 
   2456     writeStringToParcel(p, (const char *)response);
   2457 
   2458     return 0;
   2459 }
   2460 
   2461 static int responseVoid(Parcel &p, void *response, size_t responselen) {
   2462     startResponse;
   2463     removeLastChar;
   2464     return 0;
   2465 }
   2466 
   2467 static int responseCallList(Parcel &p, void *response, size_t responselen) {
   2468     int num;
   2469 
   2470     if (response == NULL && responselen != 0) {
   2471         RLOGE("invalid response: NULL");
   2472         return RIL_ERRNO_INVALID_RESPONSE;
   2473     }
   2474 
   2475     if (responselen % sizeof (RIL_Call *) != 0) {
   2476         RLOGE("responseCallList: invalid response length %d expected multiple of %d\n",
   2477             (int)responselen, (int)sizeof (RIL_Call *));
   2478         return RIL_ERRNO_INVALID_RESPONSE;
   2479     }
   2480 
   2481     startResponse;
   2482     /* number of call info's */
   2483     num = responselen / sizeof(RIL_Call *);
   2484     p.writeInt32(num);
   2485 
   2486     for (int i = 0 ; i < num ; i++) {
   2487         RIL_Call *p_cur = ((RIL_Call **) response)[i];
   2488         /* each call info */
   2489         p.writeInt32(p_cur->state);
   2490         p.writeInt32(p_cur->index);
   2491         p.writeInt32(p_cur->toa);
   2492         p.writeInt32(p_cur->isMpty);
   2493         p.writeInt32(p_cur->isMT);
   2494         p.writeInt32(p_cur->als);
   2495         p.writeInt32(p_cur->isVoice);
   2496         p.writeInt32(p_cur->isVoicePrivacy);
   2497         writeStringToParcel(p, p_cur->number);
   2498         p.writeInt32(p_cur->numberPresentation);
   2499         writeStringToParcel(p, p_cur->name);
   2500         p.writeInt32(p_cur->namePresentation);
   2501         // Remove when partners upgrade to version 3
   2502         if ((s_callbacks.version < 3) || (p_cur->uusInfo == NULL || p_cur->uusInfo->uusData == NULL)) {
   2503             p.writeInt32(0); /* UUS Information is absent */
   2504         } else {
   2505             RIL_UUS_Info *uusInfo = p_cur->uusInfo;
   2506             p.writeInt32(1); /* UUS Information is present */
   2507             p.writeInt32(uusInfo->uusType);
   2508             p.writeInt32(uusInfo->uusDcs);
   2509             p.writeInt32(uusInfo->uusLength);
   2510             p.write(uusInfo->uusData, uusInfo->uusLength);
   2511         }
   2512         appendPrintBuf("%s[id=%d,%s,toa=%d,",
   2513             printBuf,
   2514             p_cur->index,
   2515             callStateToString(p_cur->state),
   2516             p_cur->toa);
   2517         appendPrintBuf("%s%s,%s,als=%d,%s,%s,",
   2518             printBuf,
   2519             (p_cur->isMpty)?"conf":"norm",
   2520             (p_cur->isMT)?"mt":"mo",
   2521             p_cur->als,
   2522             (p_cur->isVoice)?"voc":"nonvoc",
   2523             (p_cur->isVoicePrivacy)?"evp":"noevp");
   2524         appendPrintBuf("%s%s,cli=%d,name='%s',%d]",
   2525             printBuf,
   2526             p_cur->number,
   2527             p_cur->numberPresentation,
   2528             p_cur->name,
   2529             p_cur->namePresentation);
   2530     }
   2531     removeLastChar;
   2532     closeResponse;
   2533 
   2534     return 0;
   2535 }
   2536 
   2537 static int responseSMS(Parcel &p, void *response, size_t responselen) {
   2538     if (response == NULL) {
   2539         RLOGE("invalid response: NULL");
   2540         return RIL_ERRNO_INVALID_RESPONSE;
   2541     }
   2542 
   2543     if (responselen != sizeof (RIL_SMS_Response) ) {
   2544         RLOGE("invalid response length %d expected %d",
   2545                 (int)responselen, (int)sizeof (RIL_SMS_Response));
   2546         return RIL_ERRNO_INVALID_RESPONSE;
   2547     }
   2548 
   2549     RIL_SMS_Response *p_cur = (RIL_SMS_Response *) response;
   2550 
   2551     p.writeInt32(p_cur->messageRef);
   2552     writeStringToParcel(p, p_cur->ackPDU);
   2553     p.writeInt32(p_cur->errorCode);
   2554 
   2555     startResponse;
   2556     appendPrintBuf("%s%d,%s,%d", printBuf, p_cur->messageRef,
   2557         (char*)p_cur->ackPDU, p_cur->errorCode);
   2558     closeResponse;
   2559 
   2560     return 0;
   2561 }
   2562 
   2563 static int responseDataCallListV4(Parcel &p, void *response, size_t responselen)
   2564 {
   2565     if (response == NULL && responselen != 0) {
   2566         RLOGE("invalid response: NULL");
   2567         return RIL_ERRNO_INVALID_RESPONSE;
   2568     }
   2569 
   2570     if (responselen % sizeof(RIL_Data_Call_Response_v4) != 0) {
   2571         RLOGE("responseDataCallListV4: invalid response length %d expected multiple of %d",
   2572                 (int)responselen, (int)sizeof(RIL_Data_Call_Response_v4));
   2573         return RIL_ERRNO_INVALID_RESPONSE;
   2574     }
   2575 
   2576     // Write version
   2577     p.writeInt32(4);
   2578 
   2579     int num = responselen / sizeof(RIL_Data_Call_Response_v4);
   2580     p.writeInt32(num);
   2581 
   2582     RIL_Data_Call_Response_v4 *p_cur = (RIL_Data_Call_Response_v4 *) response;
   2583     startResponse;
   2584     int i;
   2585     for (i = 0; i < num; i++) {
   2586         p.writeInt32(p_cur[i].cid);
   2587         p.writeInt32(p_cur[i].active);
   2588         writeStringToParcel(p, p_cur[i].type);
   2589         // apn is not used, so don't send.
   2590         writeStringToParcel(p, p_cur[i].address);
   2591         appendPrintBuf("%s[cid=%d,%s,%s,%s],", printBuf,
   2592             p_cur[i].cid,
   2593             (p_cur[i].active==0)?"down":"up",
   2594             (char*)p_cur[i].type,
   2595             (char*)p_cur[i].address);
   2596     }
   2597     removeLastChar;
   2598     closeResponse;
   2599 
   2600     return 0;
   2601 }
   2602 
   2603 static int responseDataCallListV6(Parcel &p, void *response, size_t responselen)
   2604 {
   2605     if (response == NULL && responselen != 0) {
   2606         RLOGE("invalid response: NULL");
   2607         return RIL_ERRNO_INVALID_RESPONSE;
   2608     }
   2609 
   2610     if (responselen % sizeof(RIL_Data_Call_Response_v6) != 0) {
   2611         RLOGE("responseDataCallListV6: invalid response length %d expected multiple of %d",
   2612                 (int)responselen, (int)sizeof(RIL_Data_Call_Response_v6));
   2613         return RIL_ERRNO_INVALID_RESPONSE;
   2614     }
   2615 
   2616     // Write version
   2617     p.writeInt32(6);
   2618 
   2619     int num = responselen / sizeof(RIL_Data_Call_Response_v6);
   2620     p.writeInt32(num);
   2621 
   2622     RIL_Data_Call_Response_v6 *p_cur = (RIL_Data_Call_Response_v6 *) response;
   2623     startResponse;
   2624     int i;
   2625     for (i = 0; i < num; i++) {
   2626         p.writeInt32((int)p_cur[i].status);
   2627         p.writeInt32(p_cur[i].suggestedRetryTime);
   2628         p.writeInt32(p_cur[i].cid);
   2629         p.writeInt32(p_cur[i].active);
   2630         writeStringToParcel(p, p_cur[i].type);
   2631         writeStringToParcel(p, p_cur[i].ifname);
   2632         writeStringToParcel(p, p_cur[i].addresses);
   2633         writeStringToParcel(p, p_cur[i].dnses);
   2634         writeStringToParcel(p, p_cur[i].gateways);
   2635         appendPrintBuf("%s[status=%d,retry=%d,cid=%d,%s,%s,%s,%s,%s,%s],", printBuf,
   2636             p_cur[i].status,
   2637             p_cur[i].suggestedRetryTime,
   2638             p_cur[i].cid,
   2639             (p_cur[i].active==0)?"down":"up",
   2640             (char*)p_cur[i].type,
   2641             (char*)p_cur[i].ifname,
   2642             (char*)p_cur[i].addresses,
   2643             (char*)p_cur[i].dnses,
   2644             (char*)p_cur[i].gateways);
   2645     }
   2646     removeLastChar;
   2647     closeResponse;
   2648 
   2649     return 0;
   2650 }
   2651 
   2652 static int responseDataCallListV9(Parcel &p, void *response, size_t responselen)
   2653 {
   2654     if (response == NULL && responselen != 0) {
   2655         RLOGE("invalid response: NULL");
   2656         return RIL_ERRNO_INVALID_RESPONSE;
   2657     }
   2658 
   2659     if (responselen % sizeof(RIL_Data_Call_Response_v9) != 0) {
   2660         RLOGE("responseDataCallListV9: invalid response length %d expected multiple of %d",
   2661                 (int)responselen, (int)sizeof(RIL_Data_Call_Response_v9));
   2662         return RIL_ERRNO_INVALID_RESPONSE;
   2663     }
   2664 
   2665     // Write version
   2666     p.writeInt32(10);
   2667 
   2668     int num = responselen / sizeof(RIL_Data_Call_Response_v9);
   2669     p.writeInt32(num);
   2670 
   2671     RIL_Data_Call_Response_v9 *p_cur = (RIL_Data_Call_Response_v9 *) response;
   2672     startResponse;
   2673     int i;
   2674     for (i = 0; i < num; i++) {
   2675         p.writeInt32((int)p_cur[i].status);
   2676         p.writeInt32(p_cur[i].suggestedRetryTime);
   2677         p.writeInt32(p_cur[i].cid);
   2678         p.writeInt32(p_cur[i].active);
   2679         writeStringToParcel(p, p_cur[i].type);
   2680         writeStringToParcel(p, p_cur[i].ifname);
   2681         writeStringToParcel(p, p_cur[i].addresses);
   2682         writeStringToParcel(p, p_cur[i].dnses);
   2683         writeStringToParcel(p, p_cur[i].gateways);
   2684         writeStringToParcel(p, p_cur[i].pcscf);
   2685         appendPrintBuf("%s[status=%d,retry=%d,cid=%d,%s,%s,%s,%s,%s,%s,%s],", printBuf,
   2686             p_cur[i].status,
   2687             p_cur[i].suggestedRetryTime,
   2688             p_cur[i].cid,
   2689             (p_cur[i].active==0)?"down":"up",
   2690             (char*)p_cur[i].type,
   2691             (char*)p_cur[i].ifname,
   2692             (char*)p_cur[i].addresses,
   2693             (char*)p_cur[i].dnses,
   2694             (char*)p_cur[i].gateways,
   2695             (char*)p_cur[i].pcscf);
   2696     }
   2697     removeLastChar;
   2698     closeResponse;
   2699 
   2700     return 0;
   2701 }
   2702 
   2703 static int responseDataCallListV11(Parcel &p, void *response, size_t responselen) {
   2704     if (response == NULL && responselen != 0) {
   2705                 RLOGE("invalid response: NULL");
   2706                 return RIL_ERRNO_INVALID_RESPONSE;
   2707     }
   2708 
   2709     if (responselen % sizeof(RIL_Data_Call_Response_v11) != 0) {
   2710         RLOGE("invalid response length %d expected multiple of %d",
   2711         (int)responselen, (int)sizeof(RIL_Data_Call_Response_v11));
   2712         return RIL_ERRNO_INVALID_RESPONSE;
   2713     }
   2714 
   2715     // Write version
   2716     p.writeInt32(11);
   2717 
   2718     int num = responselen / sizeof(RIL_Data_Call_Response_v11);
   2719     p.writeInt32(num);
   2720 
   2721     RIL_Data_Call_Response_v11 *p_cur = (RIL_Data_Call_Response_v11 *) response;
   2722     startResponse;
   2723     int i;
   2724     for (i = 0; i < num; i++) {
   2725         p.writeInt32((int)p_cur[i].status);
   2726         p.writeInt32(p_cur[i].suggestedRetryTime);
   2727         p.writeInt32(p_cur[i].cid);
   2728         p.writeInt32(p_cur[i].active);
   2729         writeStringToParcel(p, p_cur[i].type);
   2730         writeStringToParcel(p, p_cur[i].ifname);
   2731         writeStringToParcel(p, p_cur[i].addresses);
   2732         writeStringToParcel(p, p_cur[i].dnses);
   2733         writeStringToParcel(p, p_cur[i].gateways);
   2734         writeStringToParcel(p, p_cur[i].pcscf);
   2735         p.writeInt32(p_cur[i].mtu);
   2736         appendPrintBuf("%s[status=%d,retry=%d,cid=%d,%s,%s,%s,%s,%s,%s,%s,mtu=%d],", printBuf,
   2737         p_cur[i].status,
   2738         p_cur[i].suggestedRetryTime,
   2739         p_cur[i].cid,
   2740         (p_cur[i].active==0)?"down":"up",
   2741         (char*)p_cur[i].type,
   2742         (char*)p_cur[i].ifname,
   2743         (char*)p_cur[i].addresses,
   2744         (char*)p_cur[i].dnses,
   2745         (char*)p_cur[i].gateways,
   2746         (char*)p_cur[i].pcscf,
   2747         p_cur[i].mtu);
   2748     }
   2749     removeLastChar;
   2750     closeResponse;
   2751 
   2752     return 0;
   2753 }
   2754 
   2755 static int responseDataCallList(Parcel &p, void *response, size_t responselen)
   2756 {
   2757     if (s_callbacks.version <= LAST_IMPRECISE_RIL_VERSION) {
   2758         if (s_callbacks.version < 5) {
   2759             RLOGD("responseDataCallList: v4");
   2760             return responseDataCallListV4(p, response, responselen);
   2761         } else if (responselen % sizeof(RIL_Data_Call_Response_v6) == 0) {
   2762             return responseDataCallListV6(p, response, responselen);
   2763         } else if (responselen % sizeof(RIL_Data_Call_Response_v9) == 0) {
   2764             return responseDataCallListV9(p, response, responselen);
   2765         } else {
   2766             return responseDataCallListV11(p, response, responselen);
   2767         }
   2768     } else { // RIL version >= 13
   2769         if (responselen % sizeof(RIL_Data_Call_Response_v11) != 0) {
   2770             RLOGE("Data structure expected is RIL_Data_Call_Response_v11");
   2771             if (!isDebuggable()) {
   2772                 return RIL_ERRNO_INVALID_RESPONSE;
   2773             } else {
   2774                 assert(0);
   2775             }
   2776         }
   2777         return responseDataCallListV11(p, response, responselen);
   2778     }
   2779 }
   2780 
   2781 static int responseSetupDataCall(Parcel &p, void *response, size_t responselen)
   2782 {
   2783     if (s_callbacks.version < 5) {
   2784         return responseStringsWithVersion(s_callbacks.version, p, response, responselen);
   2785     } else {
   2786         return responseDataCallList(p, response, responselen);
   2787     }
   2788 }
   2789 
   2790 static int responseRaw(Parcel &p, void *response, size_t responselen) {
   2791     if (response == NULL && responselen != 0) {
   2792         RLOGE("invalid response: NULL with responselen != 0");
   2793         return RIL_ERRNO_INVALID_RESPONSE;
   2794     }
   2795 
   2796     // The java code reads -1 size as null byte array
   2797     if (response == NULL) {
   2798         p.writeInt32(-1);
   2799     } else {
   2800         p.writeInt32(responselen);
   2801         p.write(response, responselen);
   2802     }
   2803 
   2804     return 0;
   2805 }
   2806 
   2807 
   2808 static int responseSIM_IO(Parcel &p, void *response, size_t responselen) {
   2809     if (response == NULL) {
   2810         RLOGE("invalid response: NULL");
   2811         return RIL_ERRNO_INVALID_RESPONSE;
   2812     }
   2813 
   2814     if (responselen != sizeof (RIL_SIM_IO_Response) ) {
   2815         RLOGE("invalid response length was %d expected %d",
   2816                 (int)responselen, (int)sizeof (RIL_SIM_IO_Response));
   2817         return RIL_ERRNO_INVALID_RESPONSE;
   2818     }
   2819 
   2820     RIL_SIM_IO_Response *p_cur = (RIL_SIM_IO_Response *) response;
   2821     p.writeInt32(p_cur->sw1);
   2822     p.writeInt32(p_cur->sw2);
   2823     writeStringToParcel(p, p_cur->simResponse);
   2824 
   2825     startResponse;
   2826     appendPrintBuf("%ssw1=0x%X,sw2=0x%X,%s", printBuf, p_cur->sw1, p_cur->sw2,
   2827         (char*)p_cur->simResponse);
   2828     closeResponse;
   2829 
   2830 
   2831     return 0;
   2832 }
   2833 
   2834 static int responseCallForwards(Parcel &p, void *response, size_t responselen) {
   2835     int num;
   2836 
   2837     if (response == NULL && responselen != 0) {
   2838         RLOGE("invalid response: NULL");
   2839         return RIL_ERRNO_INVALID_RESPONSE;
   2840     }
   2841 
   2842     if (responselen % sizeof(RIL_CallForwardInfo *) != 0) {
   2843         RLOGE("responseCallForwards: invalid response length %d expected multiple of %d",
   2844                 (int)responselen, (int)sizeof(RIL_CallForwardInfo *));
   2845         return RIL_ERRNO_INVALID_RESPONSE;
   2846     }
   2847 
   2848     /* number of call info's */
   2849     num = responselen / sizeof(RIL_CallForwardInfo *);
   2850     p.writeInt32(num);
   2851 
   2852     startResponse;
   2853     for (int i = 0 ; i < num ; i++) {
   2854         RIL_CallForwardInfo *p_cur = ((RIL_CallForwardInfo **) response)[i];
   2855 
   2856         p.writeInt32(p_cur->status);
   2857         p.writeInt32(p_cur->reason);
   2858         p.writeInt32(p_cur->serviceClass);
   2859         p.writeInt32(p_cur->toa);
   2860         writeStringToParcel(p, p_cur->number);
   2861         p.writeInt32(p_cur->timeSeconds);
   2862         appendPrintBuf("%s[%s,reason=%d,cls=%d,toa=%d,%s,tout=%d],", printBuf,
   2863             (p_cur->status==1)?"enable":"disable",
   2864             p_cur->reason, p_cur->serviceClass, p_cur->toa,
   2865             (char*)p_cur->number,
   2866             p_cur->timeSeconds);
   2867     }
   2868     removeLastChar;
   2869     closeResponse;
   2870 
   2871     return 0;
   2872 }
   2873 
   2874 static int responseSsn(Parcel &p, void *response, size_t responselen) {
   2875     if (response == NULL) {
   2876         RLOGE("invalid response: NULL");
   2877         return RIL_ERRNO_INVALID_RESPONSE;
   2878     }
   2879 
   2880     if (responselen != sizeof(RIL_SuppSvcNotification)) {
   2881         RLOGE("invalid response length was %d expected %d",
   2882                 (int)responselen, (int)sizeof (RIL_SuppSvcNotification));
   2883         return RIL_ERRNO_INVALID_RESPONSE;
   2884     }
   2885 
   2886     RIL_SuppSvcNotification *p_cur = (RIL_SuppSvcNotification *) response;
   2887     p.writeInt32(p_cur->notificationType);
   2888     p.writeInt32(p_cur->code);
   2889     p.writeInt32(p_cur->index);
   2890     p.writeInt32(p_cur->type);
   2891     writeStringToParcel(p, p_cur->number);
   2892 
   2893     startResponse;
   2894     appendPrintBuf("%s%s,code=%d,id=%d,type=%d,%s", printBuf,
   2895         (p_cur->notificationType==0)?"mo":"mt",
   2896          p_cur->code, p_cur->index, p_cur->type,
   2897         (char*)p_cur->number);
   2898     closeResponse;
   2899 
   2900     return 0;
   2901 }
   2902 
   2903 static int responseCellList(Parcel &p, void *response, size_t responselen) {
   2904     int num;
   2905 
   2906     if (response == NULL && responselen != 0) {
   2907         RLOGE("invalid response: NULL");
   2908         return RIL_ERRNO_INVALID_RESPONSE;
   2909     }
   2910 
   2911     if (responselen % sizeof (RIL_NeighboringCell *) != 0) {
   2912         RLOGE("responseCellList: invalid response length %d expected multiple of %d\n",
   2913             (int)responselen, (int)sizeof (RIL_NeighboringCell *));
   2914         return RIL_ERRNO_INVALID_RESPONSE;
   2915     }
   2916 
   2917     startResponse;
   2918     /* number of records */
   2919     num = responselen / sizeof(RIL_NeighboringCell *);
   2920     p.writeInt32(num);
   2921 
   2922     for (int i = 0 ; i < num ; i++) {
   2923         RIL_NeighboringCell *p_cur = ((RIL_NeighboringCell **) response)[i];
   2924 
   2925         p.writeInt32(p_cur->rssi);
   2926         writeStringToParcel (p, p_cur->cid);
   2927 
   2928         appendPrintBuf("%s[cid=%s,rssi=%d],", printBuf,
   2929             p_cur->cid, p_cur->rssi);
   2930     }
   2931     removeLastChar;
   2932     closeResponse;
   2933 
   2934     return 0;
   2935 }
   2936 
   2937 /**
   2938  * Marshall the signalInfoRecord into the parcel if it exists.
   2939  */
   2940 static void marshallSignalInfoRecord(Parcel &p,
   2941             RIL_CDMA_SignalInfoRecord &p_signalInfoRecord) {
   2942     p.writeInt32(p_signalInfoRecord.isPresent);
   2943     p.writeInt32(p_signalInfoRecord.signalType);
   2944     p.writeInt32(p_signalInfoRecord.alertPitch);
   2945     p.writeInt32(p_signalInfoRecord.signal);
   2946 }
   2947 
   2948 static int responseCdmaInformationRecords(Parcel &p,
   2949             void *response, size_t responselen) {
   2950     int num;
   2951     char* string8 = NULL;
   2952     int buffer_lenght;
   2953     RIL_CDMA_InformationRecord *infoRec;
   2954 
   2955     if (response == NULL && responselen != 0) {
   2956         RLOGE("invalid response: NULL");
   2957         return RIL_ERRNO_INVALID_RESPONSE;
   2958     }
   2959 
   2960     if (responselen != sizeof (RIL_CDMA_InformationRecords)) {
   2961         RLOGE("responseCdmaInformationRecords: invalid response length %d expected multiple of %d\n",
   2962             (int)responselen, (int)sizeof (RIL_CDMA_InformationRecords *));
   2963         return RIL_ERRNO_INVALID_RESPONSE;
   2964     }
   2965 
   2966     RIL_CDMA_InformationRecords *p_cur =
   2967                              (RIL_CDMA_InformationRecords *) response;
   2968     num = MIN(p_cur->numberOfInfoRecs, RIL_CDMA_MAX_NUMBER_OF_INFO_RECS);
   2969 
   2970     startResponse;
   2971     p.writeInt32(num);
   2972 
   2973     for (int i = 0 ; i < num ; i++) {
   2974         infoRec = &p_cur->infoRec[i];
   2975         p.writeInt32(infoRec->name);
   2976         switch (infoRec->name) {
   2977             case RIL_CDMA_DISPLAY_INFO_REC:
   2978             case RIL_CDMA_EXTENDED_DISPLAY_INFO_REC:
   2979                 if (infoRec->rec.display.alpha_len >
   2980                                          CDMA_ALPHA_INFO_BUFFER_LENGTH) {
   2981                     RLOGE("invalid display info response length %d \
   2982                           expected not more than %d\n",
   2983                          (int)infoRec->rec.display.alpha_len,
   2984                          CDMA_ALPHA_INFO_BUFFER_LENGTH);
   2985                     return RIL_ERRNO_INVALID_RESPONSE;
   2986                 }
   2987                 string8 = (char*) calloc(infoRec->rec.display.alpha_len + 1, sizeof(char));
   2988                 if (string8 == NULL) {
   2989                     RLOGE("Memory allocation failed for responseCdmaInformationRecords");
   2990                     closeRequest;
   2991                     return RIL_ERRNO_NO_MEMORY;
   2992                 }
   2993                 for (int i = 0 ; i < infoRec->rec.display.alpha_len ; i++) {
   2994                     string8[i] = infoRec->rec.display.alpha_buf[i];
   2995                 }
   2996                 string8[(int)infoRec->rec.display.alpha_len] = '\0';
   2997                 writeStringToParcel(p, (const char*)string8);
   2998                 free(string8);
   2999                 string8 = NULL;
   3000                 break;
   3001             case RIL_CDMA_CALLED_PARTY_NUMBER_INFO_REC:
   3002             case RIL_CDMA_CALLING_PARTY_NUMBER_INFO_REC:
   3003             case RIL_CDMA_CONNECTED_NUMBER_INFO_REC:
   3004                 if (infoRec->rec.number.len > CDMA_NUMBER_INFO_BUFFER_LENGTH) {
   3005                     RLOGE("invalid display info response length %d \
   3006                           expected not more than %d\n",
   3007                          (int)infoRec->rec.number.len,
   3008                          CDMA_NUMBER_INFO_BUFFER_LENGTH);
   3009                     return RIL_ERRNO_INVALID_RESPONSE;
   3010                 }
   3011                 string8 = (char*) calloc(infoRec->rec.number.len + 1, sizeof(char));
   3012                 if (string8 == NULL) {
   3013                     RLOGE("Memory allocation failed for responseCdmaInformationRecords");
   3014                     closeRequest;
   3015                     return RIL_ERRNO_NO_MEMORY;
   3016                 }
   3017                 for (int i = 0 ; i < infoRec->rec.number.len; i++) {
   3018                     string8[i] = infoRec->rec.number.buf[i];
   3019                 }
   3020                 string8[(int)infoRec->rec.number.len] = '\0';
   3021                 writeStringToParcel(p, (const char*)string8);
   3022                 free(string8);
   3023                 string8 = NULL;
   3024                 p.writeInt32(infoRec->rec.number.number_type);
   3025                 p.writeInt32(infoRec->rec.number.number_plan);
   3026                 p.writeInt32(infoRec->rec.number.pi);
   3027                 p.writeInt32(infoRec->rec.number.si);
   3028                 break;
   3029             case RIL_CDMA_SIGNAL_INFO_REC:
   3030                 p.writeInt32(infoRec->rec.signal.isPresent);
   3031                 p.writeInt32(infoRec->rec.signal.signalType);
   3032                 p.writeInt32(infoRec->rec.signal.alertPitch);
   3033                 p.writeInt32(infoRec->rec.signal.signal);
   3034 
   3035                 appendPrintBuf("%sisPresent=%X, signalType=%X, \
   3036                                 alertPitch=%X, signal=%X, ",
   3037                    printBuf, (int)infoRec->rec.signal.isPresent,
   3038                    (int)infoRec->rec.signal.signalType,
   3039                    (int)infoRec->rec.signal.alertPitch,
   3040                    (int)infoRec->rec.signal.signal);
   3041                 removeLastChar;
   3042                 break;
   3043             case RIL_CDMA_REDIRECTING_NUMBER_INFO_REC:
   3044                 if (infoRec->rec.redir.redirectingNumber.len >
   3045                                               CDMA_NUMBER_INFO_BUFFER_LENGTH) {
   3046                     RLOGE("invalid display info response length %d \
   3047                           expected not more than %d\n",
   3048                          (int)infoRec->rec.redir.redirectingNumber.len,
   3049                          CDMA_NUMBER_INFO_BUFFER_LENGTH);
   3050                     return RIL_ERRNO_INVALID_RESPONSE;
   3051                 }
   3052                 string8 = (char*) calloc(infoRec->rec.redir.redirectingNumber.len + 1,
   3053                         sizeof(char));
   3054                 if (string8 == NULL) {
   3055                     RLOGE("Memory allocation failed for responseCdmaInformationRecords");
   3056                     closeRequest;
   3057                     return RIL_ERRNO_NO_MEMORY;
   3058                 }
   3059                 for (int i = 0;
   3060                          i < infoRec->rec.redir.redirectingNumber.len;
   3061                          i++) {
   3062                     string8[i] = infoRec->rec.redir.redirectingNumber.buf[i];
   3063                 }
   3064                 string8[(int)infoRec->rec.redir.redirectingNumber.len] = '\0';
   3065                 writeStringToParcel(p, (const char*)string8);
   3066                 free(string8);
   3067                 string8 = NULL;
   3068                 p.writeInt32(infoRec->rec.redir.redirectingNumber.number_type);
   3069                 p.writeInt32(infoRec->rec.redir.redirectingNumber.number_plan);
   3070                 p.writeInt32(infoRec->rec.redir.redirectingNumber.pi);
   3071                 p.writeInt32(infoRec->rec.redir.redirectingNumber.si);
   3072                 p.writeInt32(infoRec->rec.redir.redirectingReason);
   3073                 break;
   3074             case RIL_CDMA_LINE_CONTROL_INFO_REC:
   3075                 p.writeInt32(infoRec->rec.lineCtrl.lineCtrlPolarityIncluded);
   3076                 p.writeInt32(infoRec->rec.lineCtrl.lineCtrlToggle);
   3077                 p.writeInt32(infoRec->rec.lineCtrl.lineCtrlReverse);
   3078                 p.writeInt32(infoRec->rec.lineCtrl.lineCtrlPowerDenial);
   3079 
   3080                 appendPrintBuf("%slineCtrlPolarityIncluded=%d, \
   3081                                 lineCtrlToggle=%d, lineCtrlReverse=%d, \
   3082                                 lineCtrlPowerDenial=%d, ", printBuf,
   3083                        (int)infoRec->rec.lineCtrl.lineCtrlPolarityIncluded,
   3084                        (int)infoRec->rec.lineCtrl.lineCtrlToggle,
   3085                        (int)infoRec->rec.lineCtrl.lineCtrlReverse,
   3086                        (int)infoRec->rec.lineCtrl.lineCtrlPowerDenial);
   3087                 removeLastChar;
   3088                 break;
   3089             case RIL_CDMA_T53_CLIR_INFO_REC:
   3090                 p.writeInt32((int)(infoRec->rec.clir.cause));
   3091 
   3092                 appendPrintBuf("%scause%d", printBuf, infoRec->rec.clir.cause);
   3093                 removeLastChar;
   3094                 break;
   3095             case RIL_CDMA_T53_AUDIO_CONTROL_INFO_REC:
   3096                 p.writeInt32(infoRec->rec.audioCtrl.upLink);
   3097                 p.writeInt32(infoRec->rec.audioCtrl.downLink);
   3098 
   3099                 appendPrintBuf("%supLink=%d, downLink=%d, ", printBuf,
   3100                         infoRec->rec.audioCtrl.upLink,
   3101                         infoRec->rec.audioCtrl.downLink);
   3102                 removeLastChar;
   3103                 break;
   3104             case RIL_CDMA_T53_RELEASE_INFO_REC:
   3105                 // TODO(Moto): See David Krause, he has the answer:)
   3106                 RLOGE("RIL_CDMA_T53_RELEASE_INFO_REC: return INVALID_RESPONSE");
   3107                 return RIL_ERRNO_INVALID_RESPONSE;
   3108             default:
   3109                 RLOGE("Incorrect name value");
   3110                 return RIL_ERRNO_INVALID_RESPONSE;
   3111         }
   3112     }
   3113     closeResponse;
   3114 
   3115     return 0;
   3116 }
   3117 
   3118 static void responseRilSignalStrengthV5(Parcel &p, RIL_SignalStrength_v10 *p_cur) {
   3119     p.writeInt32(p_cur->GW_SignalStrength.signalStrength);
   3120     p.writeInt32(p_cur->GW_SignalStrength.bitErrorRate);
   3121     p.writeInt32(p_cur->CDMA_SignalStrength.dbm);
   3122     p.writeInt32(p_cur->CDMA_SignalStrength.ecio);
   3123     p.writeInt32(p_cur->EVDO_SignalStrength.dbm);
   3124     p.writeInt32(p_cur->EVDO_SignalStrength.ecio);
   3125     p.writeInt32(p_cur->EVDO_SignalStrength.signalNoiseRatio);
   3126 }
   3127 
   3128 static void responseRilSignalStrengthV6Extra(Parcel &p, RIL_SignalStrength_v10 *p_cur) {
   3129     /*
   3130      * Fixup LTE for backwards compatibility
   3131      */
   3132     // signalStrength: -1 -> 99
   3133     if (p_cur->LTE_SignalStrength.signalStrength == -1) {
   3134         p_cur->LTE_SignalStrength.signalStrength = 99;
   3135     }
   3136     // rsrp: -1 -> INT_MAX all other negative value to positive.
   3137     // So remap here
   3138     if (p_cur->LTE_SignalStrength.rsrp == -1) {
   3139         p_cur->LTE_SignalStrength.rsrp = INT_MAX;
   3140     } else if (p_cur->LTE_SignalStrength.rsrp < -1) {
   3141         p_cur->LTE_SignalStrength.rsrp = -p_cur->LTE_SignalStrength.rsrp;
   3142     }
   3143     // rsrq: -1 -> INT_MAX
   3144     if (p_cur->LTE_SignalStrength.rsrq == -1) {
   3145         p_cur->LTE_SignalStrength.rsrq = INT_MAX;
   3146     }
   3147     // Not remapping rssnr is already using INT_MAX
   3148 
   3149     // cqi: -1 -> INT_MAX
   3150     if (p_cur->LTE_SignalStrength.cqi == -1) {
   3151         p_cur->LTE_SignalStrength.cqi = INT_MAX;
   3152     }
   3153 
   3154     p.writeInt32(p_cur->LTE_SignalStrength.signalStrength);
   3155     p.writeInt32(p_cur->LTE_SignalStrength.rsrp);
   3156     p.writeInt32(p_cur->LTE_SignalStrength.rsrq);
   3157     p.writeInt32(p_cur->LTE_SignalStrength.rssnr);
   3158     p.writeInt32(p_cur->LTE_SignalStrength.cqi);
   3159 }
   3160 
   3161 static void responseRilSignalStrengthV10(Parcel &p, RIL_SignalStrength_v10 *p_cur) {
   3162     responseRilSignalStrengthV5(p, p_cur);
   3163     responseRilSignalStrengthV6Extra(p, p_cur);
   3164     p.writeInt32(p_cur->TD_SCDMA_SignalStrength.rscp);
   3165 }
   3166 
   3167 static int responseRilSignalStrength(Parcel &p,
   3168                     void *response, size_t responselen) {
   3169     if (response == NULL && responselen != 0) {
   3170         RLOGE("invalid response: NULL");
   3171         return RIL_ERRNO_INVALID_RESPONSE;
   3172     }
   3173 
   3174     RIL_SignalStrength_v10 *p_cur;
   3175     if (s_callbacks.version <= LAST_IMPRECISE_RIL_VERSION) {
   3176         if (responselen >= sizeof (RIL_SignalStrength_v5)) {
   3177             p_cur = ((RIL_SignalStrength_v10 *) response);
   3178 
   3179             responseRilSignalStrengthV5(p, p_cur);
   3180 
   3181             if (responselen >= sizeof (RIL_SignalStrength_v6)) {
   3182                 responseRilSignalStrengthV6Extra(p, p_cur);
   3183                 if (responselen >= sizeof (RIL_SignalStrength_v10)) {
   3184                     p.writeInt32(p_cur->TD_SCDMA_SignalStrength.rscp);
   3185                 } else {
   3186                     p.writeInt32(INT_MAX);
   3187                 }
   3188             } else {
   3189                 p.writeInt32(99);
   3190                 p.writeInt32(INT_MAX);
   3191                 p.writeInt32(INT_MAX);
   3192                 p.writeInt32(INT_MAX);
   3193                 p.writeInt32(INT_MAX);
   3194                 p.writeInt32(INT_MAX);
   3195             }
   3196         } else {
   3197             RLOGE("invalid response length");
   3198             return RIL_ERRNO_INVALID_RESPONSE;
   3199         }
   3200     } else { // RIL version >= 13
   3201         if (responselen % sizeof(RIL_SignalStrength_v10) != 0) {
   3202             RLOGE("Data structure expected is RIL_SignalStrength_v10");
   3203             if (!isDebuggable()) {
   3204                 return RIL_ERRNO_INVALID_RESPONSE;
   3205             } else {
   3206                 assert(0);
   3207             }
   3208         }
   3209         p_cur = ((RIL_SignalStrength_v10 *) response);
   3210         responseRilSignalStrengthV10(p, p_cur);
   3211     }
   3212     startResponse;
   3213     appendPrintBuf("%s[signalStrength=%d,bitErrorRate=%d,\
   3214             CDMA_SS.dbm=%d,CDMA_SSecio=%d,\
   3215             EVDO_SS.dbm=%d,EVDO_SS.ecio=%d,\
   3216             EVDO_SS.signalNoiseRatio=%d,\
   3217             LTE_SS.signalStrength=%d,LTE_SS.rsrp=%d,LTE_SS.rsrq=%d,\
   3218             LTE_SS.rssnr=%d,LTE_SS.cqi=%d,TDSCDMA_SS.rscp=%d]",
   3219             printBuf,
   3220             p_cur->GW_SignalStrength.signalStrength,
   3221             p_cur->GW_SignalStrength.bitErrorRate,
   3222             p_cur->CDMA_SignalStrength.dbm,
   3223             p_cur->CDMA_SignalStrength.ecio,
   3224             p_cur->EVDO_SignalStrength.dbm,
   3225             p_cur->EVDO_SignalStrength.ecio,
   3226             p_cur->EVDO_SignalStrength.signalNoiseRatio,
   3227             p_cur->LTE_SignalStrength.signalStrength,
   3228             p_cur->LTE_SignalStrength.rsrp,
   3229             p_cur->LTE_SignalStrength.rsrq,
   3230             p_cur->LTE_SignalStrength.rssnr,
   3231             p_cur->LTE_SignalStrength.cqi,
   3232             p_cur->TD_SCDMA_SignalStrength.rscp);
   3233     closeResponse;
   3234     return 0;
   3235 }
   3236 
   3237 static int responseCallRing(Parcel &p, void *response, size_t responselen) {
   3238     if ((response == NULL) || (responselen == 0)) {
   3239         return responseVoid(p, response, responselen);
   3240     } else {
   3241         return responseCdmaSignalInfoRecord(p, response, responselen);
   3242     }
   3243 }
   3244 
   3245 static int responseCdmaSignalInfoRecord(Parcel &p, void *response, size_t responselen) {
   3246     if (response == NULL || responselen == 0) {
   3247         RLOGE("invalid response: NULL");
   3248         return RIL_ERRNO_INVALID_RESPONSE;
   3249     }
   3250 
   3251     if (responselen != sizeof (RIL_CDMA_SignalInfoRecord)) {
   3252         RLOGE("invalid response length %d expected sizeof (RIL_CDMA_SignalInfoRecord) of %d\n",
   3253             (int)responselen, (int)sizeof (RIL_CDMA_SignalInfoRecord));
   3254         return RIL_ERRNO_INVALID_RESPONSE;
   3255     }
   3256 
   3257     startResponse;
   3258 
   3259     RIL_CDMA_SignalInfoRecord *p_cur = ((RIL_CDMA_SignalInfoRecord *) response);
   3260     marshallSignalInfoRecord(p, *p_cur);
   3261 
   3262     appendPrintBuf("%s[isPresent=%d,signalType=%d,alertPitch=%d\
   3263               signal=%d]",
   3264               printBuf,
   3265               p_cur->isPresent,
   3266               p_cur->signalType,
   3267               p_cur->alertPitch,
   3268               p_cur->signal);
   3269 
   3270     closeResponse;
   3271     return 0;
   3272 }
   3273 
   3274 static int responseCdmaCallWaiting(Parcel &p, void *response,
   3275             size_t responselen) {
   3276     if (response == NULL && responselen != 0) {
   3277         RLOGE("invalid response: NULL");
   3278         return RIL_ERRNO_INVALID_RESPONSE;
   3279     }
   3280 
   3281     if (responselen < sizeof(RIL_CDMA_CallWaiting_v6)) {
   3282         RLOGW("Upgrade to ril version %d\n", RIL_VERSION);
   3283     }
   3284 
   3285     RIL_CDMA_CallWaiting_v6 *p_cur = ((RIL_CDMA_CallWaiting_v6 *) response);
   3286 
   3287     writeStringToParcel(p, p_cur->number);
   3288     p.writeInt32(p_cur->numberPresentation);
   3289     writeStringToParcel(p, p_cur->name);
   3290     marshallSignalInfoRecord(p, p_cur->signalInfoRecord);
   3291 
   3292     if (s_callbacks.version <= LAST_IMPRECISE_RIL_VERSION) {
   3293         if (responselen >= sizeof(RIL_CDMA_CallWaiting_v6)) {
   3294             p.writeInt32(p_cur->number_type);
   3295             p.writeInt32(p_cur->number_plan);
   3296         } else {
   3297             p.writeInt32(0);
   3298             p.writeInt32(0);
   3299         }
   3300     } else { // RIL version >= 13
   3301         if (responselen % sizeof(RIL_CDMA_CallWaiting_v6) != 0) {
   3302             RLOGE("Data structure expected is RIL_CDMA_CallWaiting_v6");
   3303             if (!isDebuggable()) {
   3304                 return RIL_ERRNO_INVALID_RESPONSE;
   3305             } else {
   3306                 assert(0);
   3307             }
   3308         }
   3309         p.writeInt32(p_cur->number_type);
   3310         p.writeInt32(p_cur->number_plan);
   3311     }
   3312 
   3313     startResponse;
   3314     appendPrintBuf("%snumber=%s,numberPresentation=%d, name=%s,\
   3315             signalInfoRecord[isPresent=%d,signalType=%d,alertPitch=%d\
   3316             signal=%d,number_type=%d,number_plan=%d]",
   3317             printBuf,
   3318             p_cur->number,
   3319             p_cur->numberPresentation,
   3320             p_cur->name,
   3321             p_cur->signalInfoRecord.isPresent,
   3322             p_cur->signalInfoRecord.signalType,
   3323             p_cur->signalInfoRecord.alertPitch,
   3324             p_cur->signalInfoRecord.signal,
   3325             p_cur->number_type,
   3326             p_cur->number_plan);
   3327     closeResponse;
   3328 
   3329     return 0;
   3330 }
   3331 
   3332 static void responseSimRefreshV7(Parcel &p, void *response) {
   3333       RIL_SimRefreshResponse_v7 *p_cur = ((RIL_SimRefreshResponse_v7 *) response);
   3334       p.writeInt32(p_cur->result);
   3335       p.writeInt32(p_cur->ef_id);
   3336       writeStringToParcel(p, p_cur->aid);
   3337 
   3338       appendPrintBuf("%sresult=%d, ef_id=%d, aid=%s",
   3339             printBuf,
   3340             p_cur->result,
   3341             p_cur->ef_id,
   3342             p_cur->aid);
   3343 
   3344 }
   3345 
   3346 static int responseSimRefresh(Parcel &p, void *response, size_t responselen) {
   3347     if (response == NULL && responselen != 0) {
   3348         RLOGE("responseSimRefresh: invalid response: NULL");
   3349         return RIL_ERRNO_INVALID_RESPONSE;
   3350     }
   3351 
   3352     startResponse;
   3353     if (s_callbacks.version <= LAST_IMPRECISE_RIL_VERSION) {
   3354         if (s_callbacks.version >= 7) {
   3355             responseSimRefreshV7(p, response);
   3356         } else {
   3357             int *p_cur = ((int *) response);
   3358             p.writeInt32(p_cur[0]);
   3359             p.writeInt32(p_cur[1]);
   3360             writeStringToParcel(p, NULL);
   3361 
   3362             appendPrintBuf("%sresult=%d, ef_id=%d",
   3363                     printBuf,
   3364                     p_cur[0],
   3365                     p_cur[1]);
   3366         }
   3367     } else { // RIL version >= 13
   3368         if (responselen % sizeof(RIL_SimRefreshResponse_v7) != 0) {
   3369             RLOGE("Data structure expected is RIL_SimRefreshResponse_v7");
   3370             if (!isDebuggable()) {
   3371                 return RIL_ERRNO_INVALID_RESPONSE;
   3372             } else {
   3373                 assert(0);
   3374             }
   3375         }
   3376         responseSimRefreshV7(p, response);
   3377 
   3378     }
   3379     closeResponse;
   3380 
   3381     return 0;
   3382 }
   3383 
   3384 static int responseCellInfoListV6(Parcel &p, void *response, size_t responselen) {
   3385     if (response == NULL && responselen != 0) {
   3386         RLOGE("invalid response: NULL");
   3387         return RIL_ERRNO_INVALID_RESPONSE;
   3388     }
   3389 
   3390     if (responselen % sizeof(RIL_CellInfo) != 0) {
   3391         RLOGE("responseCellInfoList: invalid response length %d expected multiple of %d",
   3392                 (int)responselen, (int)sizeof(RIL_CellInfo));
   3393         return RIL_ERRNO_INVALID_RESPONSE;
   3394     }
   3395 
   3396     int num = responselen / sizeof(RIL_CellInfo);
   3397     p.writeInt32(num);
   3398 
   3399     RIL_CellInfo *p_cur = (RIL_CellInfo *) response;
   3400     startResponse;
   3401     int i;
   3402     for (i = 0; i < num; i++) {
   3403         p.writeInt32((int)p_cur->cellInfoType);
   3404         p.writeInt32(p_cur->registered);
   3405         p.writeInt32(p_cur->timeStampType);
   3406         p.writeInt64(p_cur->timeStamp);
   3407         switch(p_cur->cellInfoType) {
   3408             case RIL_CELL_INFO_TYPE_GSM: {
   3409                 p.writeInt32(p_cur->CellInfo.gsm.cellIdentityGsm.mcc);
   3410                 p.writeInt32(p_cur->CellInfo.gsm.cellIdentityGsm.mnc);
   3411                 p.writeInt32(p_cur->CellInfo.gsm.cellIdentityGsm.lac);
   3412                 p.writeInt32(p_cur->CellInfo.gsm.cellIdentityGsm.cid);
   3413                 p.writeInt32(p_cur->CellInfo.gsm.signalStrengthGsm.signalStrength);
   3414                 p.writeInt32(p_cur->CellInfo.gsm.signalStrengthGsm.bitErrorRate);
   3415                 break;
   3416             }
   3417             case RIL_CELL_INFO_TYPE_WCDMA: {
   3418                 p.writeInt32(p_cur->CellInfo.wcdma.cellIdentityWcdma.mcc);
   3419                 p.writeInt32(p_cur->CellInfo.wcdma.cellIdentityWcdma.mnc);
   3420                 p.writeInt32(p_cur->CellInfo.wcdma.cellIdentityWcdma.lac);
   3421                 p.writeInt32(p_cur->CellInfo.wcdma.cellIdentityWcdma.cid);
   3422                 p.writeInt32(p_cur->CellInfo.wcdma.cellIdentityWcdma.psc);
   3423                 p.writeInt32(p_cur->CellInfo.wcdma.signalStrengthWcdma.signalStrength);
   3424                 p.writeInt32(p_cur->CellInfo.wcdma.signalStrengthWcdma.bitErrorRate);
   3425                 break;
   3426             }
   3427             case RIL_CELL_INFO_TYPE_CDMA: {
   3428                 p.writeInt32(p_cur->CellInfo.cdma.cellIdentityCdma.networkId);
   3429                 p.writeInt32(p_cur->CellInfo.cdma.cellIdentityCdma.systemId);
   3430                 p.writeInt32(p_cur->CellInfo.cdma.cellIdentityCdma.basestationId);
   3431                 p.writeInt32(p_cur->CellInfo.cdma.cellIdentityCdma.longitude);
   3432                 p.writeInt32(p_cur->CellInfo.cdma.cellIdentityCdma.latitude);
   3433 
   3434                 p.writeInt32(p_cur->CellInfo.cdma.signalStrengthCdma.dbm);
   3435                 p.writeInt32(p_cur->CellInfo.cdma.signalStrengthCdma.ecio);
   3436                 p.writeInt32(p_cur->CellInfo.cdma.signalStrengthEvdo.dbm);
   3437                 p.writeInt32(p_cur->CellInfo.cdma.signalStrengthEvdo.ecio);
   3438                 p.writeInt32(p_cur->CellInfo.cdma.signalStrengthEvdo.signalNoiseRatio);
   3439                 break;
   3440             }
   3441             case RIL_CELL_INFO_TYPE_LTE: {
   3442                 p.writeInt32(p_cur->CellInfo.lte.cellIdentityLte.mcc);
   3443                 p.writeInt32(p_cur->CellInfo.lte.cellIdentityLte.mnc);
   3444                 p.writeInt32(p_cur->CellInfo.lte.cellIdentityLte.ci);
   3445                 p.writeInt32(p_cur->CellInfo.lte.cellIdentityLte.pci);
   3446                 p.writeInt32(p_cur->CellInfo.lte.cellIdentityLte.tac);
   3447 
   3448                 p.writeInt32(p_cur->CellInfo.lte.signalStrengthLte.signalStrength);
   3449                 p.writeInt32(p_cur->CellInfo.lte.signalStrengthLte.rsrp);
   3450                 p.writeInt32(p_cur->CellInfo.lte.signalStrengthLte.rsrq);
   3451                 p.writeInt32(p_cur->CellInfo.lte.signalStrengthLte.rssnr);
   3452                 p.writeInt32(p_cur->CellInfo.lte.signalStrengthLte.cqi);
   3453                 p.writeInt32(p_cur->CellInfo.lte.signalStrengthLte.timingAdvance);
   3454                 break;
   3455             }
   3456             case RIL_CELL_INFO_TYPE_TD_SCDMA: {
   3457                 p.writeInt32(p_cur->CellInfo.tdscdma.cellIdentityTdscdma.mcc);
   3458                 p.writeInt32(p_cur->CellInfo.tdscdma.cellIdentityTdscdma.mnc);
   3459                 p.writeInt32(p_cur->CellInfo.tdscdma.cellIdentityTdscdma.lac);
   3460                 p.writeInt32(p_cur->CellInfo.tdscdma.cellIdentityTdscdma.cid);
   3461                 p.writeInt32(p_cur->CellInfo.tdscdma.cellIdentityTdscdma.cpid);
   3462                 p.writeInt32(p_cur->CellInfo.tdscdma.signalStrengthTdscdma.rscp);
   3463                 break;
   3464             }
   3465         }
   3466         p_cur += 1;
   3467     }
   3468     removeLastChar;
   3469     closeResponse;
   3470 
   3471     return 0;
   3472 }
   3473 
   3474 static int responseCellInfoListV12(Parcel &p, void *response, size_t responselen) {
   3475     if (response == NULL && responselen != 0) {
   3476         RLOGE("invalid response: NULL");
   3477         return RIL_ERRNO_INVALID_RESPONSE;
   3478     }
   3479 
   3480     if (responselen % sizeof(RIL_CellInfo_v12) != 0) {
   3481         RLOGE("responseCellInfoList: invalid response length %d expected multiple of %d",
   3482                 (int)responselen, (int)sizeof(RIL_CellInfo_v12));
   3483         return RIL_ERRNO_INVALID_RESPONSE;
   3484     }
   3485 
   3486     int num = responselen / sizeof(RIL_CellInfo_v12);
   3487     p.writeInt32(num);
   3488 
   3489     RIL_CellInfo_v12 *p_cur = (RIL_CellInfo_v12 *) response;
   3490     startResponse;
   3491     int i;
   3492     for (i = 0; i < num; i++) {
   3493         p.writeInt32((int)p_cur->cellInfoType);
   3494         p.writeInt32(p_cur->registered);
   3495         p.writeInt32(p_cur->timeStampType);
   3496         p.writeInt64(p_cur->timeStamp);
   3497         switch(p_cur->cellInfoType) {
   3498             case RIL_CELL_INFO_TYPE_GSM: {
   3499                 p.writeInt32(p_cur->CellInfo.gsm.cellIdentityGsm.mcc);
   3500                 p.writeInt32(p_cur->CellInfo.gsm.cellIdentityGsm.mnc);
   3501                 p.writeInt32(p_cur->CellInfo.gsm.cellIdentityGsm.lac);
   3502                 p.writeInt32(p_cur->CellInfo.gsm.cellIdentityGsm.cid);
   3503                 p.writeInt32(p_cur->CellInfo.gsm.cellIdentityGsm.arfcn);
   3504                 p.writeInt32(p_cur->CellInfo.gsm.cellIdentityGsm.bsic);
   3505                 p.writeInt32(p_cur->CellInfo.gsm.signalStrengthGsm.signalStrength);
   3506                 p.writeInt32(p_cur->CellInfo.gsm.signalStrengthGsm.bitErrorRate);
   3507                 p.writeInt32(p_cur->CellInfo.gsm.signalStrengthGsm.timingAdvance);
   3508                 break;
   3509             }
   3510             case RIL_CELL_INFO_TYPE_WCDMA: {
   3511                 p.writeInt32(p_cur->CellInfo.wcdma.cellIdentityWcdma.mcc);
   3512                 p.writeInt32(p_cur->CellInfo.wcdma.cellIdentityWcdma.mnc);
   3513                 p.writeInt32(p_cur->CellInfo.wcdma.cellIdentityWcdma.lac);
   3514                 p.writeInt32(p_cur->CellInfo.wcdma.cellIdentityWcdma.cid);
   3515                 p.writeInt32(p_cur->CellInfo.wcdma.cellIdentityWcdma.psc);
   3516                 p.writeInt32(p_cur->CellInfo.wcdma.cellIdentityWcdma.uarfcn);
   3517                 p.writeInt32(p_cur->CellInfo.wcdma.signalStrengthWcdma.signalStrength);
   3518                 p.writeInt32(p_cur->CellInfo.wcdma.signalStrengthWcdma.bitErrorRate);
   3519                 break;
   3520             }
   3521             case RIL_CELL_INFO_TYPE_CDMA: {
   3522                 p.writeInt32(p_cur->CellInfo.cdma.cellIdentityCdma.networkId);
   3523                 p.writeInt32(p_cur->CellInfo.cdma.cellIdentityCdma.systemId);
   3524                 p.writeInt32(p_cur->CellInfo.cdma.cellIdentityCdma.basestationId);
   3525                 p.writeInt32(p_cur->CellInfo.cdma.cellIdentityCdma.longitude);
   3526                 p.writeInt32(p_cur->CellInfo.cdma.cellIdentityCdma.latitude);
   3527 
   3528                 p.writeInt32(p_cur->CellInfo.cdma.signalStrengthCdma.dbm);
   3529                 p.writeInt32(p_cur->CellInfo.cdma.signalStrengthCdma.ecio);
   3530                 p.writeInt32(p_cur->CellInfo.cdma.signalStrengthEvdo.dbm);
   3531                 p.writeInt32(p_cur->CellInfo.cdma.signalStrengthEvdo.ecio);
   3532                 p.writeInt32(p_cur->CellInfo.cdma.signalStrengthEvdo.signalNoiseRatio);
   3533                 break;
   3534             }
   3535             case RIL_CELL_INFO_TYPE_LTE: {
   3536                 p.writeInt32(p_cur->CellInfo.lte.cellIdentityLte.mcc);
   3537                 p.writeInt32(p_cur->CellInfo.lte.cellIdentityLte.mnc);
   3538                 p.writeInt32(p_cur->CellInfo.lte.cellIdentityLte.ci);
   3539                 p.writeInt32(p_cur->CellInfo.lte.cellIdentityLte.pci);
   3540                 p.writeInt32(p_cur->CellInfo.lte.cellIdentityLte.tac);
   3541                 p.writeInt32(p_cur->CellInfo.lte.cellIdentityLte.earfcn);
   3542 
   3543                 p.writeInt32(p_cur->CellInfo.lte.signalStrengthLte.signalStrength);
   3544                 p.writeInt32(p_cur->CellInfo.lte.signalStrengthLte.rsrp);
   3545                 p.writeInt32(p_cur->CellInfo.lte.signalStrengthLte.rsrq);
   3546                 p.writeInt32(p_cur->CellInfo.lte.signalStrengthLte.rssnr);
   3547                 p.writeInt32(p_cur->CellInfo.lte.signalStrengthLte.cqi);
   3548                 p.writeInt32(p_cur->CellInfo.lte.signalStrengthLte.timingAdvance);
   3549                 break;
   3550             }
   3551             case RIL_CELL_INFO_TYPE_TD_SCDMA: {
   3552                 p.writeInt32(p_cur->CellInfo.tdscdma.cellIdentityTdscdma.mcc);
   3553                 p.writeInt32(p_cur->CellInfo.tdscdma.cellIdentityTdscdma.mnc);
   3554                 p.writeInt32(p_cur->CellInfo.tdscdma.cellIdentityTdscdma.lac);
   3555                 p.writeInt32(p_cur->CellInfo.tdscdma.cellIdentityTdscdma.cid);
   3556                 p.writeInt32(p_cur->CellInfo.tdscdma.cellIdentityTdscdma.cpid);
   3557                 p.writeInt32(p_cur->CellInfo.tdscdma.signalStrengthTdscdma.rscp);
   3558                 break;
   3559             }
   3560         }
   3561         p_cur += 1;
   3562     }
   3563     removeLastChar;
   3564     closeResponse;
   3565     return 0;
   3566 }
   3567 
   3568 static int responseCellInfoList(Parcel &p, void *response, size_t responselen)
   3569 {
   3570     if (s_callbacks.version <= LAST_IMPRECISE_RIL_VERSION) {
   3571         if (s_callbacks.version < 12) {
   3572             RLOGD("responseCellInfoList: v6");
   3573             return responseCellInfoListV6(p, response, responselen);
   3574         } else {
   3575             RLOGD("responseCellInfoList: v12");
   3576             return responseCellInfoListV12(p, response, responselen);
   3577         }
   3578     } else { // RIL version >= 13
   3579         if (responselen % sizeof(RIL_CellInfo_v12) != 0) {
   3580             RLOGE("Data structure expected is RIL_CellInfo_v12");
   3581             if (!isDebuggable()) {
   3582                 return RIL_ERRNO_INVALID_RESPONSE;
   3583             } else {
   3584                 assert(0);
   3585             }
   3586         }
   3587         return responseCellInfoListV12(p, response, responselen);
   3588     }
   3589 
   3590     return 0;
   3591 }
   3592 
   3593 static int responseHardwareConfig(Parcel &p, void *response, size_t responselen)
   3594 {
   3595    if (response == NULL && responselen != 0) {
   3596        RLOGE("invalid response: NULL");
   3597        return RIL_ERRNO_INVALID_RESPONSE;
   3598    }
   3599 
   3600    if (responselen % sizeof(RIL_HardwareConfig) != 0) {
   3601        RLOGE("responseHardwareConfig: invalid response length %d expected multiple of %d",
   3602           (int)responselen, (int)sizeof(RIL_HardwareConfig));
   3603        return RIL_ERRNO_INVALID_RESPONSE;
   3604    }
   3605 
   3606    int num = responselen / sizeof(RIL_HardwareConfig);
   3607    int i;
   3608    RIL_HardwareConfig *p_cur = (RIL_HardwareConfig *) response;
   3609 
   3610    p.writeInt32(num);
   3611 
   3612    startResponse;
   3613    for (i = 0; i < num; i++) {
   3614       switch (p_cur[i].type) {
   3615          case RIL_HARDWARE_CONFIG_MODEM: {
   3616             writeStringToParcel(p, p_cur[i].uuid);
   3617             p.writeInt32((int)p_cur[i].state);
   3618             p.writeInt32(p_cur[i].cfg.modem.rat);
   3619             p.writeInt32(p_cur[i].cfg.modem.maxVoice);
   3620             p.writeInt32(p_cur[i].cfg.modem.maxData);
   3621             p.writeInt32(p_cur[i].cfg.modem.maxStandby);
   3622 
   3623             appendPrintBuf("%s modem: uuid=%s,state=%d,rat=%08x,maxV=%d,maxD=%d,maxS=%d", printBuf,
   3624                p_cur[i].uuid, (int)p_cur[i].state, p_cur[i].cfg.modem.rat,
   3625                p_cur[i].cfg.modem.maxVoice, p_cur[i].cfg.modem.maxData, p_cur[i].cfg.modem.maxStandby);
   3626             break;
   3627          }
   3628          case RIL_HARDWARE_CONFIG_SIM: {
   3629             writeStringToParcel(p, p_cur[i].uuid);
   3630             p.writeInt32((int)p_cur[i].state);
   3631             writeStringToParcel(p, p_cur[i].cfg.sim.modemUuid);
   3632 
   3633             appendPrintBuf("%s sim: uuid=%s,state=%d,modem-uuid=%s", printBuf,
   3634                p_cur[i].uuid, (int)p_cur[i].state, p_cur[i].cfg.sim.modemUuid);
   3635             break;
   3636          }
   3637       }
   3638    }
   3639    removeLastChar;
   3640    closeResponse;
   3641    return 0;
   3642 }
   3643 
   3644 static int responseRadioCapability(Parcel &p, void *response, size_t responselen) {
   3645     if (response == NULL) {
   3646         RLOGE("invalid response: NULL");
   3647         return RIL_ERRNO_INVALID_RESPONSE;
   3648     }
   3649 
   3650     if (responselen != sizeof (RIL_RadioCapability) ) {
   3651         RLOGE("invalid response length was %d expected %d",
   3652                 (int)responselen, (int)sizeof (RIL_SIM_IO_Response));
   3653         return RIL_ERRNO_INVALID_RESPONSE;
   3654     }
   3655 
   3656     RIL_RadioCapability *p_cur = (RIL_RadioCapability *) response;
   3657     p.writeInt32(p_cur->version);
   3658     p.writeInt32(p_cur->session);
   3659     p.writeInt32(p_cur->phase);
   3660     p.writeInt32(p_cur->rat);
   3661     writeStringToParcel(p, p_cur->logicalModemUuid);
   3662     p.writeInt32(p_cur->status);
   3663 
   3664     startResponse;
   3665     appendPrintBuf("%s[version=%d,session=%d,phase=%d,\
   3666             rat=%s,logicalModemUuid=%s,status=%d]",
   3667             printBuf,
   3668             p_cur->version,
   3669             p_cur->session,
   3670             p_cur->phase,
   3671             p_cur->rat,
   3672             p_cur->logicalModemUuid,
   3673             p_cur->status);
   3674     closeResponse;
   3675     return 0;
   3676 }
   3677 
   3678 static int responseSSData(Parcel &p, void *response, size_t responselen) {
   3679     RLOGD("In responseSSData");
   3680     int num;
   3681 
   3682     if (response == NULL && responselen != 0) {
   3683         RLOGE("invalid response length was %d expected %d",
   3684                 (int)responselen, (int)sizeof (RIL_SIM_IO_Response));
   3685         return RIL_ERRNO_INVALID_RESPONSE;
   3686     }
   3687 
   3688     if (responselen != sizeof(RIL_StkCcUnsolSsResponse)) {
   3689         RLOGE("invalid response length %d, expected %d",
   3690                (int)responselen, (int)sizeof(RIL_StkCcUnsolSsResponse));
   3691         return RIL_ERRNO_INVALID_RESPONSE;
   3692     }
   3693 
   3694     startResponse;
   3695     RIL_StkCcUnsolSsResponse *p_cur = (RIL_StkCcUnsolSsResponse *) response;
   3696     p.writeInt32(p_cur->serviceType);
   3697     p.writeInt32(p_cur->requestType);
   3698     p.writeInt32(p_cur->teleserviceType);
   3699     p.writeInt32(p_cur->serviceClass);
   3700     p.writeInt32(p_cur->result);
   3701 
   3702     if (isServiceTypeCfQuery(p_cur->serviceType, p_cur->requestType)) {
   3703         RLOGD("responseSSData CF type, num of Cf elements %d", p_cur->cfData.numValidIndexes);
   3704         if (p_cur->cfData.numValidIndexes > NUM_SERVICE_CLASSES) {
   3705             RLOGE("numValidIndexes is greater than max value %d, "
   3706                   "truncating it to max value", NUM_SERVICE_CLASSES);
   3707             p_cur->cfData.numValidIndexes = NUM_SERVICE_CLASSES;
   3708         }
   3709         /* number of call info's */
   3710         p.writeInt32(p_cur->cfData.numValidIndexes);
   3711 
   3712         for (int i = 0; i < p_cur->cfData.numValidIndexes; i++) {
   3713              RIL_CallForwardInfo cf = p_cur->cfData.cfInfo[i];
   3714 
   3715              p.writeInt32(cf.status);
   3716              p.writeInt32(cf.reason);
   3717              p.writeInt32(cf.serviceClass);
   3718              p.writeInt32(cf.toa);
   3719              writeStringToParcel(p, cf.number);
   3720              p.writeInt32(cf.timeSeconds);
   3721              appendPrintBuf("%s[%s,reason=%d,cls=%d,toa=%d,%s,tout=%d],", printBuf,
   3722                  (cf.status==1)?"enable":"disable", cf.reason, cf.serviceClass, cf.toa,
   3723                   (char*)cf.number, cf.timeSeconds);
   3724              RLOGD("Data: %d,reason=%d,cls=%d,toa=%d,num=%s,tout=%d],", cf.status,
   3725                   cf.reason, cf.serviceClass, cf.toa, (char*)cf.number, cf.timeSeconds);
   3726         }
   3727     } else {
   3728         p.writeInt32 (SS_INFO_MAX);
   3729 
   3730         /* each int*/
   3731         for (int i = 0; i < SS_INFO_MAX; i++) {
   3732              appendPrintBuf("%s%d,", printBuf, p_cur->ssInfo[i]);
   3733              RLOGD("Data: %d",p_cur->ssInfo[i]);
   3734              p.writeInt32(p_cur->ssInfo[i]);
   3735         }
   3736     }
   3737     removeLastChar;
   3738     closeResponse;
   3739 
   3740     return 0;
   3741 }
   3742 
   3743 static bool isServiceTypeCfQuery(RIL_SsServiceType serType, RIL_SsRequestType reqType) {
   3744     if ((reqType == SS_INTERROGATION) &&
   3745         (serType == SS_CFU ||
   3746          serType == SS_CF_BUSY ||
   3747          serType == SS_CF_NO_REPLY ||
   3748          serType == SS_CF_NOT_REACHABLE ||
   3749          serType == SS_CF_ALL ||
   3750          serType == SS_CF_ALL_CONDITIONAL)) {
   3751         return true;
   3752     }
   3753     return false;
   3754 }
   3755 
   3756 static void triggerEvLoop() {
   3757     int ret;
   3758     if (!pthread_equal(pthread_self(), s_tid_dispatch)) {
   3759         /* trigger event loop to wakeup. No reason to do this,
   3760          * if we're in the event loop thread */
   3761          do {
   3762             ret = write (s_fdWakeupWrite, " ", 1);
   3763          } while (ret < 0 && errno == EINTR);
   3764     }
   3765 }
   3766 
   3767 static void rilEventAddWakeup(struct ril_event *ev) {
   3768     ril_event_add(ev);
   3769     triggerEvLoop();
   3770 }
   3771 
   3772 static void sendSimStatusAppInfo(Parcel &p, int num_apps, RIL_AppStatus appStatus[]) {
   3773         p.writeInt32(num_apps);
   3774         startResponse;
   3775         for (int i = 0; i < num_apps; i++) {
   3776             p.writeInt32(appStatus[i].app_type);
   3777             p.writeInt32(appStatus[i].app_state);
   3778             p.writeInt32(appStatus[i].perso_substate);
   3779             writeStringToParcel(p, (const char*)(appStatus[i].aid_ptr));
   3780             writeStringToParcel(p, (const char*)
   3781                                           (appStatus[i].app_label_ptr));
   3782             p.writeInt32(appStatus[i].pin1_replaced);
   3783             p.writeInt32(appStatus[i].pin1);
   3784             p.writeInt32(appStatus[i].pin2);
   3785             appendPrintBuf("%s[app_type=%d,app_state=%d,perso_substate=%d,\
   3786                     aid_ptr=%s,app_label_ptr=%s,pin1_replaced=%d,pin1=%d,pin2=%d],",
   3787                     printBuf,
   3788                     appStatus[i].app_type,
   3789                     appStatus[i].app_state,
   3790                     appStatus[i].perso_substate,
   3791                     appStatus[i].aid_ptr,
   3792                     appStatus[i].app_label_ptr,
   3793                     appStatus[i].pin1_replaced,
   3794                     appStatus[i].pin1,
   3795                     appStatus[i].pin2);
   3796         }
   3797         closeResponse;
   3798 }
   3799 
   3800 static void responseSimStatusV5(Parcel &p, void *response) {
   3801     RIL_CardStatus_v5 *p_cur = ((RIL_CardStatus_v5 *) response);
   3802 
   3803     p.writeInt32(p_cur->card_state);
   3804     p.writeInt32(p_cur->universal_pin_state);
   3805     p.writeInt32(p_cur->gsm_umts_subscription_app_index);
   3806     p.writeInt32(p_cur->cdma_subscription_app_index);
   3807 
   3808     sendSimStatusAppInfo(p, p_cur->num_applications, p_cur->applications);
   3809 }
   3810 
   3811 static void responseSimStatusV6(Parcel &p, void *response) {
   3812     RIL_CardStatus_v6 *p_cur = ((RIL_CardStatus_v6 *) response);
   3813 
   3814     p.writeInt32(p_cur->card_state);
   3815     p.writeInt32(p_cur->universal_pin_state);
   3816     p.writeInt32(p_cur->gsm_umts_subscription_app_index);
   3817     p.writeInt32(p_cur->cdma_subscription_app_index);
   3818     p.writeInt32(p_cur->ims_subscription_app_index);
   3819 
   3820     sendSimStatusAppInfo(p, p_cur->num_applications, p_cur->applications);
   3821 }
   3822 
   3823 static int responseSimStatus(Parcel &p, void *response, size_t responselen) {
   3824     int i;
   3825 
   3826     if (response == NULL && responselen != 0) {
   3827         RLOGE("invalid response: NULL");
   3828         return RIL_ERRNO_INVALID_RESPONSE;
   3829     }
   3830 
   3831     if (s_callbacks.version <= LAST_IMPRECISE_RIL_VERSION) {
   3832         if (responselen == sizeof (RIL_CardStatus_v6)) {
   3833             responseSimStatusV6(p, response);
   3834         } else if (responselen == sizeof (RIL_CardStatus_v5)) {
   3835             responseSimStatusV5(p, response);
   3836         } else {
   3837             RLOGE("responseSimStatus: A RilCardStatus_v6 or _v5 expected\n");
   3838             return RIL_ERRNO_INVALID_RESPONSE;
   3839         }
   3840     } else { // RIL version >= 13
   3841         if (responselen % sizeof(RIL_CardStatus_v6) != 0) {
   3842             RLOGE("Data structure expected is RIL_CardStatus_v6");
   3843             if (!isDebuggable()) {
   3844                 return RIL_ERRNO_INVALID_RESPONSE;
   3845             } else {
   3846                 assert(0);
   3847             }
   3848         }
   3849         responseSimStatusV6(p, response);
   3850     }
   3851 
   3852     return 0;
   3853 }
   3854 
   3855 static int responseGsmBrSmsCnf(Parcel &p, void *response, size_t responselen) {
   3856     int num = responselen / sizeof(RIL_GSM_BroadcastSmsConfigInfo *);
   3857     p.writeInt32(num);
   3858 
   3859     startResponse;
   3860     RIL_GSM_BroadcastSmsConfigInfo **p_cur =
   3861                 (RIL_GSM_BroadcastSmsConfigInfo **) response;
   3862     for (int i = 0; i < num; i++) {
   3863         p.writeInt32(p_cur[i]->fromServiceId);
   3864         p.writeInt32(p_cur[i]->toServiceId);
   3865         p.writeInt32(p_cur[i]->fromCodeScheme);
   3866         p.writeInt32(p_cur[i]->toCodeScheme);
   3867         p.writeInt32(p_cur[i]->selected);
   3868 
   3869         appendPrintBuf("%s [%d: fromServiceId=%d, toServiceId=%d, \
   3870                 fromCodeScheme=%d, toCodeScheme=%d, selected =%d]",
   3871                 printBuf, i, p_cur[i]->fromServiceId, p_cur[i]->toServiceId,
   3872                 p_cur[i]->fromCodeScheme, p_cur[i]->toCodeScheme,
   3873                 p_cur[i]->selected);
   3874     }
   3875     closeResponse;
   3876 
   3877     return 0;
   3878 }
   3879 
   3880 static int responseCdmaBrSmsCnf(Parcel &p, void *response, size_t responselen) {
   3881     RIL_CDMA_BroadcastSmsConfigInfo **p_cur =
   3882                (RIL_CDMA_BroadcastSmsConfigInfo **) response;
   3883 
   3884     int num = responselen / sizeof (RIL_CDMA_BroadcastSmsConfigInfo *);
   3885     p.writeInt32(num);
   3886 
   3887     startResponse;
   3888     for (int i = 0 ; i < num ; i++ ) {
   3889         p.writeInt32(p_cur[i]->service_category);
   3890         p.writeInt32(p_cur[i]->language);
   3891         p.writeInt32(p_cur[i]->selected);
   3892 
   3893         appendPrintBuf("%s [%d: srvice_category=%d, language =%d, \
   3894               selected =%d], ",
   3895               printBuf, i, p_cur[i]->service_category, p_cur[i]->language,
   3896               p_cur[i]->selected);
   3897     }
   3898     closeResponse;
   3899 
   3900     return 0;
   3901 }
   3902 
   3903 static int responseCdmaSms(Parcel &p, void *response, size_t responselen) {
   3904     int num;
   3905     int digitCount;
   3906     int digitLimit;
   3907     uint8_t uct;
   3908     void* dest;
   3909 
   3910     RLOGD("Inside responseCdmaSms");
   3911 
   3912     if (response == NULL && responselen != 0) {
   3913         RLOGE("invalid response: NULL");
   3914         return RIL_ERRNO_INVALID_RESPONSE;
   3915     }
   3916 
   3917     if (responselen != sizeof(RIL_CDMA_SMS_Message)) {
   3918         RLOGE("invalid response length was %d expected %d",
   3919                 (int)responselen, (int)sizeof(RIL_CDMA_SMS_Message));
   3920         return RIL_ERRNO_INVALID_RESPONSE;
   3921     }
   3922 
   3923     RIL_CDMA_SMS_Message *p_cur = (RIL_CDMA_SMS_Message *) response;
   3924     p.writeInt32(p_cur->uTeleserviceID);
   3925     p.write(&(p_cur->bIsServicePresent),sizeof(uct));
   3926     p.writeInt32(p_cur->uServicecategory);
   3927     p.writeInt32(p_cur->sAddress.digit_mode);
   3928     p.writeInt32(p_cur->sAddress.number_mode);
   3929     p.writeInt32(p_cur->sAddress.number_type);
   3930     p.writeInt32(p_cur->sAddress.number_plan);
   3931     p.write(&(p_cur->sAddress.number_of_digits), sizeof(uct));
   3932     digitLimit= MIN((p_cur->sAddress.number_of_digits), RIL_CDMA_SMS_ADDRESS_MAX);
   3933     for(digitCount =0 ; digitCount < digitLimit; digitCount ++) {
   3934         p.write(&(p_cur->sAddress.digits[digitCount]),sizeof(uct));
   3935     }
   3936 
   3937     p.writeInt32(p_cur->sSubAddress.subaddressType);
   3938     p.write(&(p_cur->sSubAddress.odd),sizeof(uct));
   3939     p.write(&(p_cur->sSubAddress.number_of_digits),sizeof(uct));
   3940     digitLimit= MIN((p_cur->sSubAddress.number_of_digits), RIL_CDMA_SMS_SUBADDRESS_MAX);
   3941     for(digitCount =0 ; digitCount < digitLimit; digitCount ++) {
   3942         p.write(&(p_cur->sSubAddress.digits[digitCount]),sizeof(uct));
   3943     }
   3944 
   3945     digitLimit= MIN((p_cur->uBearerDataLen), RIL_CDMA_SMS_BEARER_DATA_MAX);
   3946     p.writeInt32(p_cur->uBearerDataLen);
   3947     for(digitCount =0 ; digitCount < digitLimit; digitCount ++) {
   3948        p.write(&(p_cur->aBearerData[digitCount]), sizeof(uct));
   3949     }
   3950 
   3951     startResponse;
   3952     appendPrintBuf("%suTeleserviceID=%d, bIsServicePresent=%d, uServicecategory=%d, \
   3953             sAddress.digit_mode=%d, sAddress.number_mode=%d, sAddress.number_type=%d, ",
   3954             printBuf, p_cur->uTeleserviceID,p_cur->bIsServicePresent,p_cur->uServicecategory,
   3955             p_cur->sAddress.digit_mode, p_cur->sAddress.number_mode,p_cur->sAddress.number_type);
   3956     closeResponse;
   3957 
   3958     return 0;
   3959 }
   3960 
   3961 static int responseDcRtInfo(Parcel &p, void *response, size_t responselen)
   3962 {
   3963     int num = responselen / sizeof(RIL_DcRtInfo);
   3964     if ((responselen % sizeof(RIL_DcRtInfo) != 0) || (num != 1)) {
   3965         RLOGE("responseDcRtInfo: invalid response length %d expected multiple of %d",
   3966                 (int)responselen, (int)sizeof(RIL_DcRtInfo));
   3967         return RIL_ERRNO_INVALID_RESPONSE;
   3968     }
   3969 
   3970     startResponse;
   3971     RIL_DcRtInfo *pDcRtInfo = (RIL_DcRtInfo *)response;
   3972     p.writeInt64(pDcRtInfo->time);
   3973     p.writeInt32(pDcRtInfo->powerState);
   3974     appendPrintBuf("%s[time=%d,powerState=%d]", printBuf,
   3975         pDcRtInfo->time,
   3976         pDcRtInfo->powerState);
   3977     closeResponse;
   3978 
   3979     return 0;
   3980 }
   3981 
   3982 static int responseLceStatus(Parcel &p, void *response, size_t responselen) {
   3983   if (response == NULL || responselen != sizeof(RIL_LceStatusInfo)) {
   3984     if (response == NULL) {
   3985       RLOGE("invalid response: NULL");
   3986     }
   3987     else {
   3988       RLOGE("responseLceStatus: invalid response length %u expecting len: %u",
   3989             (unsigned)sizeof(RIL_LceStatusInfo), (unsigned)responselen);
   3990     }
   3991     return RIL_ERRNO_INVALID_RESPONSE;
   3992   }
   3993 
   3994   RIL_LceStatusInfo *p_cur = (RIL_LceStatusInfo *)response;
   3995   p.write((void *)p_cur, 1);  // p_cur->lce_status takes one byte.
   3996   p.writeInt32(p_cur->actual_interval_ms);
   3997 
   3998   startResponse;
   3999   appendPrintBuf("LCE Status: %d, actual_interval_ms: %d",
   4000                  p_cur->lce_status, p_cur->actual_interval_ms);
   4001   closeResponse;
   4002 
   4003   return 0;
   4004 }
   4005 
   4006 static int responseLceData(Parcel &p, void *response, size_t responselen) {
   4007   if (response == NULL || responselen != sizeof(RIL_LceDataInfo)) {
   4008     if (response == NULL) {
   4009       RLOGE("invalid response: NULL");
   4010     }
   4011     else {
   4012       RLOGE("responseLceData: invalid response length %u expecting len: %u",
   4013             (unsigned)sizeof(RIL_LceDataInfo), (unsigned)responselen);
   4014     }
   4015     return RIL_ERRNO_INVALID_RESPONSE;
   4016   }
   4017 
   4018   RIL_LceDataInfo *p_cur = (RIL_LceDataInfo *)response;
   4019   p.writeInt32(p_cur->last_hop_capacity_kbps);
   4020 
   4021   /* p_cur->confidence_level and p_cur->lce_suspended take 1 byte each.*/
   4022   p.write((void *)&(p_cur->confidence_level), 1);
   4023   p.write((void *)&(p_cur->lce_suspended), 1);
   4024 
   4025   startResponse;
   4026   appendPrintBuf("LCE info received: capacity %d confidence level %d \
   4027                   and suspended %d",
   4028                   p_cur->last_hop_capacity_kbps, p_cur->confidence_level,
   4029                   p_cur->lce_suspended);
   4030   closeResponse;
   4031 
   4032   return 0;
   4033 }
   4034 
   4035 static int responseActivityData(Parcel &p, void *response, size_t responselen) {
   4036   if (response == NULL || responselen != sizeof(RIL_ActivityStatsInfo)) {
   4037     if (response == NULL) {
   4038       RLOGE("invalid response: NULL");
   4039     }
   4040     else {
   4041       RLOGE("responseActivityData: invalid response length %u expecting len: %u",
   4042             (unsigned)sizeof(RIL_ActivityStatsInfo), (unsigned)responselen);
   4043     }
   4044     return RIL_ERRNO_INVALID_RESPONSE;
   4045   }
   4046 
   4047   RIL_ActivityStatsInfo *p_cur = (RIL_ActivityStatsInfo *)response;
   4048   p.writeInt32(p_cur->sleep_mode_time_ms);
   4049   p.writeInt32(p_cur->idle_mode_time_ms);
   4050   for(int i = 0; i < RIL_NUM_TX_POWER_LEVELS; i++) {
   4051     p.writeInt32(p_cur->tx_mode_time_ms[i]);
   4052   }
   4053   p.writeInt32(p_cur->rx_mode_time_ms);
   4054 
   4055   startResponse;
   4056   appendPrintBuf("Modem activity info received: sleep_mode_time_ms %d idle_mode_time_ms %d \
   4057                   tx_mode_time_ms %d %d %d %d %d and rx_mode_time_ms %d",
   4058                   p_cur->sleep_mode_time_ms, p_cur->idle_mode_time_ms, p_cur->tx_mode_time_ms[0],
   4059                   p_cur->tx_mode_time_ms[1], p_cur->tx_mode_time_ms[2], p_cur->tx_mode_time_ms[3],
   4060                   p_cur->tx_mode_time_ms[4], p_cur->rx_mode_time_ms);
   4061    closeResponse;
   4062 
   4063   return 0;
   4064 }
   4065 
   4066 static int responseCarrierRestrictions(Parcel &p, void *response, size_t responselen) {
   4067   if (response == NULL) {
   4068     RLOGE("invalid response: NULL");
   4069     return RIL_ERRNO_INVALID_RESPONSE;
   4070   }
   4071   if (responselen != sizeof(RIL_CarrierRestrictions)) {
   4072     RLOGE("responseCarrierRestrictions: invalid response length %u expecting len: %u",
   4073           (unsigned)responselen, (unsigned)sizeof(RIL_CarrierRestrictions));
   4074     return RIL_ERRNO_INVALID_RESPONSE;
   4075   }
   4076 
   4077   RIL_CarrierRestrictions *p_cr = (RIL_CarrierRestrictions *)response;
   4078   startResponse;
   4079 
   4080   p.writeInt32(p_cr->len_allowed_carriers);
   4081   p.writeInt32(p_cr->len_excluded_carriers);
   4082   appendPrintBuf(" %s len_allowed_carriers: %d, len_excluded_carriers: %d,", printBuf,
   4083                  p_cr->len_allowed_carriers,p_cr->len_excluded_carriers);
   4084 
   4085   appendPrintBuf(" %s allowed_carriers:", printBuf);
   4086   for(int32_t i = 0; i < p_cr->len_allowed_carriers; i++) {
   4087     RIL_Carrier *carrier = p_cr->allowed_carriers + i;
   4088     writeStringToParcel(p, carrier->mcc);
   4089     writeStringToParcel(p, carrier->mnc);
   4090     p.writeInt32(carrier->match_type);
   4091     writeStringToParcel(p, carrier->match_data);
   4092     appendPrintBuf(" %s [%d mcc: %s, mnc: %s, match_type: %d, match_data: %s],", printBuf,
   4093                    i, carrier->mcc, carrier->mnc, carrier->match_type, carrier->match_data);
   4094   }
   4095 
   4096   appendPrintBuf(" %s excluded_carriers:", printBuf);
   4097   for(int32_t i = 0; i < p_cr->len_excluded_carriers; i++) {
   4098     RIL_Carrier *carrier = p_cr->excluded_carriers + i;
   4099     writeStringToParcel(p, carrier->mcc);
   4100     writeStringToParcel(p, carrier->mnc);
   4101     p.writeInt32(carrier->match_type);
   4102     writeStringToParcel(p, carrier->match_data);
   4103     appendPrintBuf(" %s [%d mcc: %s, mnc: %s, match_type: %d, match_data: %s],", printBuf,
   4104                    i, carrier->mcc, carrier->mnc, carrier->match_type, carrier->match_data);
   4105   }
   4106 
   4107   closeResponse;
   4108 
   4109   return 0;
   4110 }
   4111 
   4112 static int responsePcoData(Parcel &p, void *response, size_t responselen) {
   4113   if (response == NULL) {
   4114     RLOGE("responsePcoData: invalid NULL response");
   4115     return RIL_ERRNO_INVALID_RESPONSE;
   4116   }
   4117   if (responselen != sizeof(RIL_PCO_Data)) {
   4118     RLOGE("responsePcoData: invalid response length %u, expecting %u",
   4119           (unsigned)responselen, (unsigned)sizeof(RIL_PCO_Data));
   4120     return RIL_ERRNO_INVALID_RESPONSE;
   4121   }
   4122 
   4123   RIL_PCO_Data *p_cur = (RIL_PCO_Data *)response;
   4124   p.writeInt32(p_cur->cid);
   4125   writeStringToParcel(p, p_cur->bearer_proto);
   4126   p.writeInt32(p_cur->pco_id);
   4127   p.writeInt32(p_cur->contents_length);
   4128   p.write(p_cur->contents, p_cur->contents_length);
   4129 
   4130   startResponse;
   4131       appendPrintBuf("PCO data received: cid %d, id %d, length %d",
   4132                      p_cur->cid, p_cur->pco_id, p_cur->contents_length);
   4133   closeResponse;
   4134 
   4135   return 0;
   4136 }
   4137 
   4138 /**
   4139  * A write on the wakeup fd is done just to pop us out of select()
   4140  * We empty the buffer here and then ril_event will reset the timers on the
   4141  * way back down
   4142  */
   4143 static void processWakeupCallback(int fd, short flags, void *param) {
   4144     char buff[16];
   4145     int ret;
   4146 
   4147     RLOGV("processWakeupCallback");
   4148 
   4149     /* empty our wakeup socket out */
   4150     do {
   4151         ret = read(s_fdWakeupRead, &buff, sizeof(buff));
   4152     } while (ret > 0 || (ret < 0 && errno == EINTR));
   4153 }
   4154 
   4155 static void onCommandsSocketClosed(RIL_SOCKET_ID socket_id) {
   4156     int ret;
   4157     RequestInfo *p_cur;
   4158     /* Hook for current context
   4159        pendingRequestsMutextHook refer to &s_pendingRequestsMutex */
   4160     pthread_mutex_t * pendingRequestsMutexHook = &s_pendingRequestsMutex;
   4161     /* pendingRequestsHook refer to &s_pendingRequests */
   4162     RequestInfo **    pendingRequestsHook = &s_pendingRequests;
   4163 
   4164 #if (SIM_COUNT >= 2)
   4165     if (socket_id == RIL_SOCKET_2) {
   4166         pendingRequestsMutexHook = &s_pendingRequestsMutex_socket2;
   4167         pendingRequestsHook = &s_pendingRequests_socket2;
   4168     }
   4169 #if (SIM_COUNT >= 3)
   4170     else if (socket_id == RIL_SOCKET_3) {
   4171         pendingRequestsMutexHook = &s_pendingRequestsMutex_socket3;
   4172         pendingRequestsHook = &s_pendingRequests_socket3;
   4173     }
   4174 #endif
   4175 #if (SIM_COUNT >= 4)
   4176     else if (socket_id == RIL_SOCKET_4) {
   4177         pendingRequestsMutexHook = &s_pendingRequestsMutex_socket4;
   4178         pendingRequestsHook = &s_pendingRequests_socket4;
   4179     }
   4180 #endif
   4181 #endif
   4182     /* mark pending requests as "cancelled" so we dont report responses */
   4183     ret = pthread_mutex_lock(pendingRequestsMutexHook);
   4184     assert (ret == 0);
   4185 
   4186     p_cur = *pendingRequestsHook;
   4187 
   4188     for (p_cur = *pendingRequestsHook
   4189             ; p_cur != NULL
   4190             ; p_cur  = p_cur->p_next
   4191     ) {
   4192         p_cur->cancelled = 1;
   4193     }
   4194 
   4195     ret = pthread_mutex_unlock(pendingRequestsMutexHook);
   4196     assert (ret == 0);
   4197 }
   4198 
   4199 static void processCommandsCallback(int fd, short flags, void *param) {
   4200     RecordStream *p_rs;
   4201     void *p_record;
   4202     size_t recordlen;
   4203     int ret;
   4204     SocketListenParam *p_info = (SocketListenParam *)param;
   4205 
   4206     assert(fd == p_info->fdCommand);
   4207 
   4208     p_rs = p_info->p_rs;
   4209 
   4210     for (;;) {
   4211         /* loop until EAGAIN/EINTR, end of stream, or other error */
   4212         ret = record_stream_get_next(p_rs, &p_record, &recordlen);
   4213 
   4214         if (ret == 0 && p_record == NULL) {
   4215             /* end-of-stream */
   4216             break;
   4217         } else if (ret < 0) {
   4218             break;
   4219         } else if (ret == 0) { /* && p_record != NULL */
   4220             processCommandBuffer(p_record, recordlen, p_info->socket_id);
   4221         }
   4222     }
   4223 
   4224     if (ret == 0 || !(errno == EAGAIN || errno == EINTR)) {
   4225         /* fatal error or end-of-stream */
   4226         if (ret != 0) {
   4227             RLOGE("error on reading command socket errno:%d\n", errno);
   4228         } else {
   4229             RLOGW("EOS.  Closing command socket.");
   4230         }
   4231 
   4232         close(fd);
   4233         p_info->fdCommand = -1;
   4234 
   4235         ril_event_del(p_info->commands_event);
   4236 
   4237         record_stream_free(p_rs);
   4238 
   4239         /* start listening for new connections again */
   4240         rilEventAddWakeup(&s_listen_event);
   4241 
   4242         onCommandsSocketClosed(p_info->socket_id);
   4243     }
   4244 }
   4245 
   4246 
   4247 static void onNewCommandConnect(RIL_SOCKET_ID socket_id) {
   4248     // Inform we are connected and the ril version
   4249     int rilVer = s_callbacks.version;
   4250     RIL_UNSOL_RESPONSE(RIL_UNSOL_RIL_CONNECTED,
   4251                                     &rilVer, sizeof(rilVer), socket_id);
   4252 
   4253     // implicit radio state changed
   4254     RIL_UNSOL_RESPONSE(RIL_UNSOL_RESPONSE_RADIO_STATE_CHANGED,
   4255                                     NULL, 0, socket_id);
   4256 
   4257     // Send last NITZ time data, in case it was missed
   4258     if (s_lastNITZTimeData != NULL) {
   4259         sendResponseRaw(s_lastNITZTimeData, s_lastNITZTimeDataSize, socket_id);
   4260 
   4261         free(s_lastNITZTimeData);
   4262         s_lastNITZTimeData = NULL;
   4263     }
   4264 
   4265     // Get version string
   4266     if (s_callbacks.getVersion != NULL) {
   4267         const char *version;
   4268         version = s_callbacks.getVersion();
   4269         RLOGI("RIL Daemon version: %s\n", version);
   4270 
   4271         property_set(PROPERTY_RIL_IMPL, version);
   4272     } else {
   4273         RLOGI("RIL Daemon version: unavailable\n");
   4274         property_set(PROPERTY_RIL_IMPL, "unavailable");
   4275     }
   4276 
   4277 }
   4278 
   4279 static void listenCallback (int fd, short flags, void *param) {
   4280     int ret;
   4281     int err;
   4282     int is_phone_socket;
   4283     int fdCommand = -1;
   4284     const char* processName;
   4285     RecordStream *p_rs;
   4286     MySocketListenParam* listenParam;
   4287     RilSocket *sapSocket = NULL;
   4288     socketClient *sClient = NULL;
   4289 
   4290     SocketListenParam *p_info = (SocketListenParam *)param;
   4291 
   4292     if(RIL_SAP_SOCKET == p_info->type) {
   4293         listenParam = (MySocketListenParam *)param;
   4294         sapSocket = listenParam->socket;
   4295     }
   4296 
   4297     struct sockaddr_un peeraddr;
   4298     socklen_t socklen = sizeof (peeraddr);
   4299 
   4300     struct ucred creds;
   4301     socklen_t szCreds = sizeof(creds);
   4302 
   4303     struct passwd *pwd = NULL;
   4304 
   4305     if(NULL == sapSocket) {
   4306         assert (*p_info->fdCommand < 0);
   4307         assert (fd == *p_info->fdListen);
   4308         processName = PHONE_PROCESS;
   4309     } else {
   4310         assert (sapSocket->commandFd < 0);
   4311         assert (fd == sapSocket->listenFd);
   4312         processName = BLUETOOTH_PROCESS;
   4313     }
   4314 
   4315 
   4316     fdCommand = accept(fd, (sockaddr *) &peeraddr, &socklen);
   4317 
   4318     if (fdCommand < 0 ) {
   4319         RLOGE("Error on accept() errno:%d", errno);
   4320         /* start listening for new connections again */
   4321         if(NULL == sapSocket) {
   4322             rilEventAddWakeup(p_info->listen_event);
   4323         } else {
   4324             rilEventAddWakeup(sapSocket->getListenEvent());
   4325         }
   4326         return;
   4327     }
   4328 
   4329     /* check the credential of the other side and only accept socket from
   4330      * phone process
   4331      */
   4332     errno = 0;
   4333     is_phone_socket = 0;
   4334 
   4335     err = getsockopt(fdCommand, SOL_SOCKET, SO_PEERCRED, &creds, &szCreds);
   4336 
   4337     if (err == 0 && szCreds > 0) {
   4338         errno = 0;
   4339         pwd = getpwuid(creds.uid);
   4340         if (pwd != NULL) {
   4341             if (strcmp(pwd->pw_name, processName) == 0) {
   4342                 is_phone_socket = 1;
   4343             } else {
   4344                 RLOGE("RILD can't accept socket from process %s", pwd->pw_name);
   4345             }
   4346         } else {
   4347             RLOGE("Error on getpwuid() errno: %d", errno);
   4348         }
   4349     } else {
   4350         RLOGD("Error on getsockopt() errno: %d", errno);
   4351     }
   4352 
   4353     if (!is_phone_socket) {
   4354         RLOGE("RILD must accept socket from %s", processName);
   4355 
   4356         close(fdCommand);
   4357         fdCommand = -1;
   4358 
   4359         if(NULL == sapSocket) {
   4360             onCommandsSocketClosed(p_info->socket_id);
   4361 
   4362             /* start listening for new connections again */
   4363             rilEventAddWakeup(p_info->listen_event);
   4364         } else {
   4365             sapSocket->onCommandsSocketClosed();
   4366 
   4367             /* start listening for new connections again */
   4368             rilEventAddWakeup(sapSocket->getListenEvent());
   4369         }
   4370 
   4371         return;
   4372     }
   4373 
   4374     ret = fcntl(fdCommand, F_SETFL, O_NONBLOCK);
   4375 
   4376     if (ret < 0) {
   4377         RLOGE ("Error setting O_NONBLOCK errno:%d", errno);
   4378     }
   4379 
   4380     if(NULL == sapSocket) {
   4381         RLOGI("libril: new connection to %s", rilSocketIdToString(p_info->socket_id));
   4382 
   4383         p_info->fdCommand = fdCommand;
   4384         p_rs = record_stream_new(p_info->fdCommand, MAX_COMMAND_BYTES);
   4385         p_info->p_rs = p_rs;
   4386 
   4387         ril_event_set (p_info->commands_event, p_info->fdCommand, 1,
   4388         p_info->processCommandsCallback, p_info);
   4389         rilEventAddWakeup (p_info->commands_event);
   4390 
   4391         onNewCommandConnect(p_info->socket_id);
   4392     } else {
   4393         RLOGI("libril: new connection");
   4394 
   4395         sapSocket->setCommandFd(fdCommand);
   4396         p_rs = record_stream_new(sapSocket->getCommandFd(), MAX_COMMAND_BYTES);
   4397         sClient = new socketClient(sapSocket,p_rs);
   4398         ril_event_set (sapSocket->getCallbackEvent(), sapSocket->getCommandFd(), 1,
   4399         sapSocket->getCommandCb(), sClient);
   4400 
   4401         rilEventAddWakeup(sapSocket->getCallbackEvent());
   4402         sapSocket->onNewCommandConnect();
   4403     }
   4404 }
   4405 
   4406 static void freeDebugCallbackArgs(int number, char **args) {
   4407     for (int i = 0; i < number; i++) {
   4408         if (args[i] != NULL) {
   4409             free(args[i]);
   4410         }
   4411     }
   4412     free(args);
   4413 }
   4414 
   4415 static void debugCallback (int fd, short flags, void *param) {
   4416     int acceptFD, option;
   4417     struct sockaddr_un peeraddr;
   4418     socklen_t socklen = sizeof (peeraddr);
   4419     int data;
   4420     unsigned int qxdm_data[6];
   4421     const char *deactData[1] = {"1"};
   4422     char *actData[1];
   4423     RIL_Dial dialData;
   4424     int hangupData[1] = {1};
   4425     int number;
   4426     char **args;
   4427     RIL_SOCKET_ID socket_id = RIL_SOCKET_1;
   4428     int sim_id = 0;
   4429 
   4430     RLOGI("debugCallback for socket %s", rilSocketIdToString(socket_id));
   4431 
   4432     acceptFD = accept (fd,  (sockaddr *) &peeraddr, &socklen);
   4433 
   4434     if (acceptFD < 0) {
   4435         RLOGE ("error accepting on debug port: %d\n", errno);
   4436         return;
   4437     }
   4438 
   4439     if (recv(acceptFD, &number, sizeof(int), 0) != sizeof(int)) {
   4440         RLOGE ("error reading on socket: number of Args: \n");
   4441         close(acceptFD);
   4442         return;
   4443     }
   4444 
   4445     if (number < 0) {
   4446         RLOGE ("Invalid number of arguments: \n");
   4447         close(acceptFD);
   4448         return;
   4449     }
   4450 
   4451     args = (char **) calloc(number, sizeof(char*));
   4452     if (args == NULL) {
   4453         RLOGE("Memory allocation failed for debug args");
   4454         close(acceptFD);
   4455         return;
   4456     }
   4457 
   4458     for (int i = 0; i < number; i++) {
   4459         int len;
   4460         if (recv(acceptFD, &len, sizeof(int), 0) != sizeof(int)) {
   4461             RLOGE ("error reading on socket: Len of Args: \n");
   4462             freeDebugCallbackArgs(i, args);
   4463             close(acceptFD);
   4464             return;
   4465         }
   4466         if (len == INT_MAX || len < 0) {
   4467             RLOGE("Invalid value of len: \n");
   4468             freeDebugCallbackArgs(i, args);
   4469             close(acceptFD);
   4470             return;
   4471         }
   4472 
   4473         // +1 for null-term
   4474         args[i] = (char *) calloc(len + 1, sizeof(char));
   4475         if (args[i] == NULL) {
   4476             RLOGE("Memory allocation failed for debug args");
   4477             freeDebugCallbackArgs(i, args);
   4478             close(acceptFD);
   4479             return;
   4480         }
   4481         if (recv(acceptFD, args[i], sizeof(char) * len, 0)
   4482             != (int)sizeof(char) * len) {
   4483             RLOGE ("error reading on socket: Args[%d] \n", i);
   4484             freeDebugCallbackArgs(i, args);
   4485             close(acceptFD);
   4486             return;
   4487         }
   4488         char * buf = args[i];
   4489         buf[len] = 0;
   4490         if ((i+1) == number) {
   4491             /* The last argument should be sim id 0(SIM1)~3(SIM4) */
   4492             sim_id = atoi(args[i]);
   4493             switch (sim_id) {
   4494                 case 0:
   4495                     socket_id = RIL_SOCKET_1;
   4496                     break;
   4497             #if (SIM_COUNT >= 2)
   4498                 case 1:
   4499                     socket_id = RIL_SOCKET_2;
   4500                     break;
   4501             #endif
   4502             #if (SIM_COUNT >= 3)
   4503                 case 2:
   4504                     socket_id = RIL_SOCKET_3;
   4505                     break;
   4506             #endif
   4507             #if (SIM_COUNT >= 4)
   4508                 case 3:
   4509                     socket_id = RIL_SOCKET_4;
   4510                     break;
   4511             #endif
   4512                 default:
   4513                     socket_id = RIL_SOCKET_1;
   4514                     break;
   4515             }
   4516         }
   4517     }
   4518 
   4519     switch (atoi(args[0])) {
   4520         case 0:
   4521             RLOGI ("Connection on debug port: issuing reset.");
   4522             issueLocalRequest(RIL_REQUEST_RESET_RADIO, NULL, 0, socket_id);
   4523             break;
   4524         case 1:
   4525             RLOGI ("Connection on debug port: issuing radio power off.");
   4526             data = 0;
   4527             issueLocalRequest(RIL_REQUEST_RADIO_POWER, &data, sizeof(int), socket_id);
   4528             // Close the socket
   4529             if (socket_id == RIL_SOCKET_1 && s_ril_param_socket.fdCommand > 0) {
   4530                 close(s_ril_param_socket.fdCommand);
   4531                 s_ril_param_socket.fdCommand = -1;
   4532             }
   4533         #if (SIM_COUNT == 2)
   4534             else if (socket_id == RIL_SOCKET_2 && s_ril_param_socket2.fdCommand > 0) {
   4535                 close(s_ril_param_socket2.fdCommand);
   4536                 s_ril_param_socket2.fdCommand = -1;
   4537             }
   4538         #endif
   4539             break;
   4540         case 2:
   4541             RLOGI ("Debug port: issuing unsolicited voice network change.");
   4542             RIL_UNSOL_RESPONSE(RIL_UNSOL_RESPONSE_VOICE_NETWORK_STATE_CHANGED, NULL, 0, socket_id);
   4543             break;
   4544         case 3:
   4545             RLOGI ("Debug port: QXDM log enable.");
   4546             qxdm_data[0] = 65536;     // head.func_tag
   4547             qxdm_data[1] = 16;        // head.len
   4548             qxdm_data[2] = 1;         // mode: 1 for 'start logging'
   4549             qxdm_data[3] = 32;        // log_file_size: 32megabytes
   4550             qxdm_data[4] = 0;         // log_mask
   4551             qxdm_data[5] = 8;         // log_max_fileindex
   4552             issueLocalRequest(RIL_REQUEST_OEM_HOOK_RAW, qxdm_data,
   4553                               6 * sizeof(int), socket_id);
   4554             break;
   4555         case 4:
   4556             RLOGI ("Debug port: QXDM log disable.");
   4557             qxdm_data[0] = 65536;
   4558             qxdm_data[1] = 16;
   4559             qxdm_data[2] = 0;          // mode: 0 for 'stop logging'
   4560             qxdm_data[3] = 32;
   4561             qxdm_data[4] = 0;
   4562             qxdm_data[5] = 8;
   4563             issueLocalRequest(RIL_REQUEST_OEM_HOOK_RAW, qxdm_data,
   4564                               6 * sizeof(int), socket_id);
   4565             break;
   4566         case 5:
   4567             RLOGI("Debug port: Radio On");
   4568             data = 1;
   4569             issueLocalRequest(RIL_REQUEST_RADIO_POWER, &data, sizeof(int), socket_id);
   4570             sleep(2);
   4571             // Set network selection automatic.
   4572             issueLocalRequest(RIL_REQUEST_SET_NETWORK_SELECTION_AUTOMATIC, NULL, 0, socket_id);
   4573             break;
   4574         case 6:
   4575             RLOGI("Debug port: Setup Data Call, Apn :%s\n", args[1]);
   4576             actData[0] = args[1];
   4577             issueLocalRequest(RIL_REQUEST_SETUP_DATA_CALL, &actData,
   4578                               sizeof(actData), socket_id);
   4579             break;
   4580         case 7:
   4581             RLOGI("Debug port: Deactivate Data Call");
   4582             issueLocalRequest(RIL_REQUEST_DEACTIVATE_DATA_CALL, &deactData,
   4583                               sizeof(deactData), socket_id);
   4584             break;
   4585         case 8:
   4586             RLOGI("Debug port: Dial Call");
   4587             dialData.clir = 0;
   4588             dialData.address = args[1];
   4589             issueLocalRequest(RIL_REQUEST_DIAL, &dialData, sizeof(dialData), socket_id);
   4590             break;
   4591         case 9:
   4592             RLOGI("Debug port: Answer Call");
   4593             issueLocalRequest(RIL_REQUEST_ANSWER, NULL, 0, socket_id);
   4594             break;
   4595         case 10:
   4596             RLOGI("Debug port: End Call");
   4597             issueLocalRequest(RIL_REQUEST_HANGUP, &hangupData,
   4598                               sizeof(hangupData), socket_id);
   4599             break;
   4600         default:
   4601             RLOGE ("Invalid request");
   4602             break;
   4603     }
   4604     freeDebugCallbackArgs(number, args);
   4605     close(acceptFD);
   4606 }
   4607 
   4608 
   4609 static void userTimerCallback (int fd, short flags, void *param) {
   4610     UserCallbackInfo *p_info;
   4611 
   4612     p_info = (UserCallbackInfo *)param;
   4613 
   4614     p_info->p_callback(p_info->userParam);
   4615 
   4616 
   4617     // FIXME generalize this...there should be a cancel mechanism
   4618     if (s_last_wake_timeout_info != NULL && s_last_wake_timeout_info == p_info) {
   4619         s_last_wake_timeout_info = NULL;
   4620     }
   4621 
   4622     free(p_info);
   4623 }
   4624 
   4625 
   4626 static void *
   4627 eventLoop(void *param) {
   4628     int ret;
   4629     int filedes[2];
   4630 
   4631     ril_event_init();
   4632 
   4633     pthread_mutex_lock(&s_startupMutex);
   4634 
   4635     s_started = 1;
   4636     pthread_cond_broadcast(&s_startupCond);
   4637 
   4638     pthread_mutex_unlock(&s_startupMutex);
   4639 
   4640     ret = pipe(filedes);
   4641 
   4642     if (ret < 0) {
   4643         RLOGE("Error in pipe() errno:%d", errno);
   4644         return NULL;
   4645     }
   4646 
   4647     s_fdWakeupRead = filedes[0];
   4648     s_fdWakeupWrite = filedes[1];
   4649 
   4650     fcntl(s_fdWakeupRead, F_SETFL, O_NONBLOCK);
   4651 
   4652     ril_event_set (&s_wakeupfd_event, s_fdWakeupRead, true,
   4653                 processWakeupCallback, NULL);
   4654 
   4655     rilEventAddWakeup (&s_wakeupfd_event);
   4656 
   4657     // Only returns on error
   4658     ril_event_loop();
   4659     RLOGE ("error in event_loop_base errno:%d", errno);
   4660     // kill self to restart on error
   4661     kill(0, SIGKILL);
   4662 
   4663     return NULL;
   4664 }
   4665 
   4666 extern "C" void
   4667 RIL_startEventLoop(void) {
   4668     /* spin up eventLoop thread and wait for it to get started */
   4669     s_started = 0;
   4670     pthread_mutex_lock(&s_startupMutex);
   4671 
   4672     pthread_attr_t attr;
   4673     pthread_attr_init(&attr);
   4674     pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
   4675 
   4676     int result = pthread_create(&s_tid_dispatch, &attr, eventLoop, NULL);
   4677     if (result != 0) {
   4678         RLOGE("Failed to create dispatch thread: %s", strerror(result));
   4679         goto done;
   4680     }
   4681 
   4682     while (s_started == 0) {
   4683         pthread_cond_wait(&s_startupCond, &s_startupMutex);
   4684     }
   4685 
   4686 done:
   4687     pthread_mutex_unlock(&s_startupMutex);
   4688 }
   4689 
   4690 // Used for testing purpose only.
   4691 extern "C" void RIL_setcallbacks (const RIL_RadioFunctions *callbacks) {
   4692     memcpy(&s_callbacks, callbacks, sizeof (RIL_RadioFunctions));
   4693 }
   4694 
   4695 static void startListen(RIL_SOCKET_ID socket_id, SocketListenParam* socket_listen_p) {
   4696     int fdListen = -1;
   4697     int ret;
   4698     char socket_name[10];
   4699 
   4700     memset(socket_name, 0, sizeof(char)*10);
   4701 
   4702     switch(socket_id) {
   4703         case RIL_SOCKET_1:
   4704             strncpy(socket_name, RIL_getRilSocketName(), 9);
   4705             break;
   4706     #if (SIM_COUNT >= 2)
   4707         case RIL_SOCKET_2:
   4708             strncpy(socket_name, SOCKET2_NAME_RIL, 9);
   4709             break;
   4710     #endif
   4711     #if (SIM_COUNT >= 3)
   4712         case RIL_SOCKET_3:
   4713             strncpy(socket_name, SOCKET3_NAME_RIL, 9);
   4714             break;
   4715     #endif
   4716     #if (SIM_COUNT >= 4)
   4717         case RIL_SOCKET_4:
   4718             strncpy(socket_name, SOCKET4_NAME_RIL, 9);
   4719             break;
   4720     #endif
   4721         default:
   4722             RLOGE("Socket id is wrong!!");
   4723             return;
   4724     }
   4725 
   4726     RLOGI("Start to listen %s", rilSocketIdToString(socket_id));
   4727 
   4728     fdListen = android_get_control_socket(socket_name);
   4729     if (fdListen < 0) {
   4730         RLOGE("Failed to get socket %s", socket_name);
   4731         exit(-1);
   4732     }
   4733 
   4734     ret = listen(fdListen, 4);
   4735 
   4736     if (ret < 0) {
   4737         RLOGE("Failed to listen on control socket '%d': %s",
   4738              fdListen, strerror(errno));
   4739         exit(-1);
   4740     }
   4741     socket_listen_p->fdListen = fdListen;
   4742 
   4743     /* note: non-persistent so we can accept only one connection at a time */
   4744     ril_event_set (socket_listen_p->listen_event, fdListen, false,
   4745                 listenCallback, socket_listen_p);
   4746 
   4747     rilEventAddWakeup (socket_listen_p->listen_event);
   4748 }
   4749 
   4750 extern "C" void
   4751 RIL_register (const RIL_RadioFunctions *callbacks) {
   4752     int ret;
   4753     int flags;
   4754 
   4755     RLOGI("SIM_COUNT: %d", SIM_COUNT);
   4756 
   4757     if (callbacks == NULL) {
   4758         RLOGE("RIL_register: RIL_RadioFunctions * null");
   4759         return;
   4760     }
   4761     if (callbacks->version < RIL_VERSION_MIN) {
   4762         RLOGE("RIL_register: version %d is to old, min version is %d",
   4763              callbacks->version, RIL_VERSION_MIN);
   4764         return;
   4765     }
   4766 
   4767     RLOGE("RIL_register: RIL version %d", callbacks->version);
   4768 
   4769     if (s_registerCalled > 0) {
   4770         RLOGE("RIL_register has been called more than once. "
   4771                 "Subsequent call ignored");
   4772         return;
   4773     }
   4774 
   4775     memcpy(&s_callbacks, callbacks, sizeof (RIL_RadioFunctions));
   4776 
   4777     /* Initialize socket1 parameters */
   4778     s_ril_param_socket = {
   4779                         RIL_SOCKET_1,             /* socket_id */
   4780                         -1,                       /* fdListen */
   4781                         -1,                       /* fdCommand */
   4782                         PHONE_PROCESS,            /* processName */
   4783                         &s_commands_event,        /* commands_event */
   4784                         &s_listen_event,          /* listen_event */
   4785                         processCommandsCallback,  /* processCommandsCallback */
   4786                         NULL,                     /* p_rs */
   4787                         RIL_TELEPHONY_SOCKET      /* type */
   4788                         };
   4789 
   4790 #if (SIM_COUNT >= 2)
   4791     s_ril_param_socket2 = {
   4792                         RIL_SOCKET_2,               /* socket_id */
   4793                         -1,                         /* fdListen */
   4794                         -1,                         /* fdCommand */
   4795                         PHONE_PROCESS,              /* processName */
   4796                         &s_commands_event_socket2,  /* commands_event */
   4797                         &s_listen_event_socket2,    /* listen_event */
   4798                         processCommandsCallback,    /* processCommandsCallback */
   4799                         NULL,                       /* p_rs */
   4800                         RIL_TELEPHONY_SOCKET        /* type */
   4801                         };
   4802 #endif
   4803 
   4804 #if (SIM_COUNT >= 3)
   4805     s_ril_param_socket3 = {
   4806                         RIL_SOCKET_3,               /* socket_id */
   4807                         -1,                         /* fdListen */
   4808                         -1,                         /* fdCommand */
   4809                         PHONE_PROCESS,              /* processName */
   4810                         &s_commands_event_socket3,  /* commands_event */
   4811                         &s_listen_event_socket3,    /* listen_event */
   4812                         processCommandsCallback,    /* processCommandsCallback */
   4813                         NULL,                       /* p_rs */
   4814                         RIL_TELEPHONY_SOCKET        /* type */
   4815                         };
   4816 #endif
   4817 
   4818 #if (SIM_COUNT >= 4)
   4819     s_ril_param_socket4 = {
   4820                         RIL_SOCKET_4,               /* socket_id */
   4821                         -1,                         /* fdListen */
   4822                         -1,                         /* fdCommand */
   4823                         PHONE_PROCESS,              /* processName */
   4824                         &s_commands_event_socket4,  /* commands_event */
   4825                         &s_listen_event_socket4,    /* listen_event */
   4826                         processCommandsCallback,    /* processCommandsCallback */
   4827                         NULL,                       /* p_rs */
   4828                         RIL_TELEPHONY_SOCKET        /* type */
   4829                         };
   4830 #endif
   4831 
   4832 
   4833     s_registerCalled = 1;
   4834 
   4835     RLOGI("s_registerCalled flag set, %d", s_started);
   4836     // Little self-check
   4837 
   4838     for (int i = 0; i < (int)NUM_ELEMS(s_commands); i++) {
   4839         assert(i == s_commands[i].requestNumber);
   4840     }
   4841 
   4842     for (int i = 0; i < (int)NUM_ELEMS(s_unsolResponses); i++) {
   4843         assert(i + RIL_UNSOL_RESPONSE_BASE
   4844                 == s_unsolResponses[i].requestNumber);
   4845     }
   4846 
   4847     // New rild impl calls RIL_startEventLoop() first
   4848     // old standalone impl wants it here.
   4849 
   4850     if (s_started == 0) {
   4851         RIL_startEventLoop();
   4852     }
   4853 
   4854     // start listen socket1
   4855     startListen(RIL_SOCKET_1, &s_ril_param_socket);
   4856 
   4857 #if (SIM_COUNT >= 2)
   4858     // start listen socket2
   4859     startListen(RIL_SOCKET_2, &s_ril_param_socket2);
   4860 #endif /* (SIM_COUNT == 2) */
   4861 
   4862 #if (SIM_COUNT >= 3)
   4863     // start listen socket3
   4864     startListen(RIL_SOCKET_3, &s_ril_param_socket3);
   4865 #endif /* (SIM_COUNT == 3) */
   4866 
   4867 #if (SIM_COUNT >= 4)
   4868     // start listen socket4
   4869     startListen(RIL_SOCKET_4, &s_ril_param_socket4);
   4870 #endif /* (SIM_COUNT == 4) */
   4871 
   4872 
   4873 #if 1
   4874     // start debug interface socket
   4875 
   4876     char *inst = NULL;
   4877     if (strlen(RIL_getRilSocketName()) >= strlen(SOCKET_NAME_RIL)) {
   4878         inst = RIL_getRilSocketName() + strlen(SOCKET_NAME_RIL);
   4879     }
   4880 
   4881     char rildebug[MAX_DEBUG_SOCKET_NAME_LENGTH] = SOCKET_NAME_RIL_DEBUG;
   4882     if (inst != NULL) {
   4883         strlcat(rildebug, inst, MAX_DEBUG_SOCKET_NAME_LENGTH);
   4884     }
   4885 
   4886     s_fdDebug = android_get_control_socket(rildebug);
   4887     if (s_fdDebug < 0) {
   4888         RLOGE("Failed to get socket : %s errno:%d", rildebug, errno);
   4889         exit(-1);
   4890     }
   4891 
   4892     ret = listen(s_fdDebug, 4);
   4893 
   4894     if (ret < 0) {
   4895         RLOGE("Failed to listen on ril debug socket '%d': %s",
   4896              s_fdDebug, strerror(errno));
   4897         exit(-1);
   4898     }
   4899 
   4900     ril_event_set (&s_debug_event, s_fdDebug, true,
   4901                 debugCallback, NULL);
   4902 
   4903     rilEventAddWakeup (&s_debug_event);
   4904 #endif
   4905 
   4906 }
   4907 
   4908 extern "C" void
   4909 RIL_register_socket (RIL_RadioFunctions *(*Init)(const struct RIL_Env *, int, char **),RIL_SOCKET_TYPE socketType, int argc, char **argv) {
   4910 
   4911     RIL_RadioFunctions* UimFuncs = NULL;
   4912 
   4913     if(Init) {
   4914         UimFuncs = Init(&RilSapSocket::uimRilEnv, argc, argv);
   4915 
   4916         switch(socketType) {
   4917             case RIL_SAP_SOCKET:
   4918                 RilSapSocket::initSapSocket("sap_uim_socket1", UimFuncs);
   4919 
   4920 #if (SIM_COUNT >= 2)
   4921                 RilSapSocket::initSapSocket("sap_uim_socket2", UimFuncs);
   4922 #endif
   4923 
   4924 #if (SIM_COUNT >= 3)
   4925                 RilSapSocket::initSapSocket("sap_uim_socket3", UimFuncs);
   4926 #endif
   4927 
   4928 #if (SIM_COUNT >= 4)
   4929                 RilSapSocket::initSapSocket("sap_uim_socket4", UimFuncs);
   4930 #endif
   4931                 break;
   4932             default:;
   4933         }
   4934     }
   4935 }
   4936 
   4937 // Check and remove RequestInfo if its a response and not just ack sent back
   4938 static int
   4939 checkAndDequeueRequestInfoIfAck(struct RequestInfo *pRI, bool isAck) {
   4940     int ret = 0;
   4941     /* Hook for current context
   4942        pendingRequestsMutextHook refer to &s_pendingRequestsMutex */
   4943     pthread_mutex_t* pendingRequestsMutexHook = &s_pendingRequestsMutex;
   4944     /* pendingRequestsHook refer to &s_pendingRequests */
   4945     RequestInfo ** pendingRequestsHook = &s_pendingRequests;
   4946 
   4947     if (pRI == NULL) {
   4948         return 0;
   4949     }
   4950 
   4951 #if (SIM_COUNT >= 2)
   4952     if (pRI->socket_id == RIL_SOCKET_2) {
   4953         pendingRequestsMutexHook = &s_pendingRequestsMutex_socket2;
   4954         pendingRequestsHook = &s_pendingRequests_socket2;
   4955     }
   4956 #if (SIM_COUNT >= 3)
   4957         if (pRI->socket_id == RIL_SOCKET_3) {
   4958             pendingRequestsMutexHook = &s_pendingRequestsMutex_socket3;
   4959             pendingRequestsHook = &s_pendingRequests_socket3;
   4960         }
   4961 #endif
   4962 #if (SIM_COUNT >= 4)
   4963     if (pRI->socket_id == RIL_SOCKET_4) {
   4964         pendingRequestsMutexHook = &s_pendingRequestsMutex_socket4;
   4965         pendingRequestsHook = &s_pendingRequests_socket4;
   4966     }
   4967 #endif
   4968 #endif
   4969     pthread_mutex_lock(pendingRequestsMutexHook);
   4970 
   4971     for(RequestInfo **ppCur = pendingRequestsHook
   4972         ; *ppCur != NULL
   4973         ; ppCur = &((*ppCur)->p_next)
   4974     ) {
   4975         if (pRI == *ppCur) {
   4976             ret = 1;
   4977             if (isAck) { // Async ack
   4978                 if (pRI->wasAckSent == 1) {
   4979                     RLOGD("Ack was already sent for %s", requestToString(pRI->pCI->requestNumber));
   4980                 } else {
   4981                     pRI->wasAckSent = 1;
   4982                 }
   4983             } else {
   4984                 *ppCur = (*ppCur)->p_next;
   4985             }
   4986             break;
   4987         }
   4988     }
   4989 
   4990     pthread_mutex_unlock(pendingRequestsMutexHook);
   4991 
   4992     return ret;
   4993 }
   4994 
   4995 static int findFd(int socket_id) {
   4996     int fd = s_ril_param_socket.fdCommand;
   4997 #if (SIM_COUNT >= 2)
   4998     if (socket_id == RIL_SOCKET_2) {
   4999         fd = s_ril_param_socket2.fdCommand;
   5000     }
   5001 #if (SIM_COUNT >= 3)
   5002     if (socket_id == RIL_SOCKET_3) {
   5003         fd = s_ril_param_socket3.fdCommand;
   5004     }
   5005 #endif
   5006 #if (SIM_COUNT >= 4)
   5007     if (socket_id == RIL_SOCKET_4) {
   5008         fd = s_ril_param_socket4.fdCommand;
   5009     }
   5010 #endif
   5011 #endif
   5012     return fd;
   5013 }
   5014 
   5015 extern "C" void
   5016 RIL_onRequestAck(RIL_Token t) {
   5017     RequestInfo *pRI;
   5018     int ret, fd;
   5019 
   5020     size_t errorOffset;
   5021     RIL_SOCKET_ID socket_id = RIL_SOCKET_1;
   5022 
   5023     pRI = (RequestInfo *)t;
   5024 
   5025     if (!checkAndDequeueRequestInfoIfAck(pRI, true)) {
   5026         RLOGE ("RIL_onRequestAck: invalid RIL_Token");
   5027         return;
   5028     }
   5029 
   5030     socket_id = pRI->socket_id;
   5031     fd = findFd(socket_id);
   5032 
   5033 #if VDBG
   5034     RLOGD("Request Ack, %s", rilSocketIdToString(socket_id));
   5035 #endif
   5036 
   5037     appendPrintBuf("Ack [%04d]< %s", pRI->token, requestToString(pRI->pCI->requestNumber));
   5038 
   5039     if (pRI->cancelled == 0) {
   5040         Parcel p;
   5041 
   5042         p.writeInt32 (RESPONSE_SOLICITED_ACK);
   5043         p.writeInt32 (pRI->token);
   5044 
   5045         if (fd < 0) {
   5046             RLOGD ("RIL onRequestComplete: Command channel closed");
   5047         }
   5048 
   5049         sendResponse(p, socket_id);
   5050     }
   5051 }
   5052 
   5053 extern "C" void
   5054 RIL_onRequestComplete(RIL_Token t, RIL_Errno e, void *response, size_t responselen) {
   5055     RequestInfo *pRI;
   5056     int ret;
   5057     int fd;
   5058     size_t errorOffset;
   5059     RIL_SOCKET_ID socket_id = RIL_SOCKET_1;
   5060 
   5061     pRI = (RequestInfo *)t;
   5062 
   5063     if (!checkAndDequeueRequestInfoIfAck(pRI, false)) {
   5064         RLOGE ("RIL_onRequestComplete: invalid RIL_Token");
   5065         return;
   5066     }
   5067 
   5068     socket_id = pRI->socket_id;
   5069     fd = findFd(socket_id);
   5070 
   5071 #if VDBG
   5072     RLOGD("RequestComplete, %s", rilSocketIdToString(socket_id));
   5073 #endif
   5074 
   5075     if (pRI->local > 0) {
   5076         // Locally issued command...void only!
   5077         // response does not go back up the command socket
   5078         RLOGD("C[locl]< %s", requestToString(pRI->pCI->requestNumber));
   5079 
   5080         goto done;
   5081     }
   5082 
   5083     appendPrintBuf("[%04d]< %s",
   5084         pRI->token, requestToString(pRI->pCI->requestNumber));
   5085 
   5086     if (pRI->cancelled == 0) {
   5087         Parcel p;
   5088 
   5089         if (s_callbacks.version >= 13 && pRI->wasAckSent == 1) {
   5090             // If ack was already sent, then this call is an asynchronous response. So we need to
   5091             // send id indicating that we expect an ack from RIL.java as we acquire wakelock here.
   5092             p.writeInt32 (RESPONSE_SOLICITED_ACK_EXP);
   5093             grabPartialWakeLock();
   5094         } else {
   5095             p.writeInt32 (RESPONSE_SOLICITED);
   5096         }
   5097         p.writeInt32 (pRI->token);
   5098         errorOffset = p.dataPosition();
   5099 
   5100         p.writeInt32 (e);
   5101 
   5102         if (response != NULL) {
   5103             // there is a response payload, no matter success or not.
   5104             ret = pRI->pCI->responseFunction(p, response, responselen);
   5105 
   5106             /* if an error occurred, rewind and mark it */
   5107             if (ret != 0) {
   5108                 RLOGE ("responseFunction error, ret %d", ret);
   5109                 p.setDataPosition(errorOffset);
   5110                 p.writeInt32 (ret);
   5111             }
   5112         }
   5113 
   5114         if (e != RIL_E_SUCCESS) {
   5115             appendPrintBuf("%s fails by %s", printBuf, failCauseToString(e));
   5116         }
   5117 
   5118         if (fd < 0) {
   5119             RLOGD ("RIL onRequestComplete: Command channel closed");
   5120         }
   5121         sendResponse(p, socket_id);
   5122     }
   5123 
   5124 done:
   5125     free(pRI);
   5126 }
   5127 
   5128 static void
   5129 grabPartialWakeLock() {
   5130     if (s_callbacks.version >= 13) {
   5131         int ret;
   5132         ret = pthread_mutex_lock(&s_wakeLockCountMutex);
   5133         assert(ret == 0);
   5134         acquire_wake_lock(PARTIAL_WAKE_LOCK, ANDROID_WAKE_LOCK_NAME);
   5135 
   5136         UserCallbackInfo *p_info =
   5137                 internalRequestTimedCallback(wakeTimeoutCallback, NULL, &TIMEVAL_WAKE_TIMEOUT);
   5138         if (p_info == NULL) {
   5139             release_wake_lock(ANDROID_WAKE_LOCK_NAME);
   5140         } else {
   5141             s_wakelock_count++;
   5142             if (s_last_wake_timeout_info != NULL) {
   5143                 s_last_wake_timeout_info->userParam = (void *)1;
   5144             }
   5145             s_last_wake_timeout_info = p_info;
   5146         }
   5147         ret = pthread_mutex_unlock(&s_wakeLockCountMutex);
   5148         assert(ret == 0);
   5149     } else {
   5150         acquire_wake_lock(PARTIAL_WAKE_LOCK, ANDROID_WAKE_LOCK_NAME);
   5151     }
   5152 }
   5153 
   5154 static void
   5155 releaseWakeLock() {
   5156     if (s_callbacks.version >= 13) {
   5157         int ret;
   5158         ret = pthread_mutex_lock(&s_wakeLockCountMutex);
   5159         assert(ret == 0);
   5160 
   5161         if (s_wakelock_count > 1) {
   5162             s_wakelock_count--;
   5163         } else {
   5164             s_wakelock_count = 0;
   5165             release_wake_lock(ANDROID_WAKE_LOCK_NAME);
   5166             if (s_last_wake_timeout_info != NULL) {
   5167                 s_last_wake_timeout_info->userParam = (void *)1;
   5168             }
   5169         }
   5170 
   5171         ret = pthread_mutex_unlock(&s_wakeLockCountMutex);
   5172         assert(ret == 0);
   5173     } else {
   5174         release_wake_lock(ANDROID_WAKE_LOCK_NAME);
   5175     }
   5176 }
   5177 
   5178 /**
   5179  * Timer callback to put us back to sleep before the default timeout
   5180  */
   5181 static void
   5182 wakeTimeoutCallback (void *param) {
   5183     // We're using "param != NULL" as a cancellation mechanism
   5184     if (s_callbacks.version >= 13) {
   5185         if (param == NULL) {
   5186             int ret;
   5187             ret = pthread_mutex_lock(&s_wakeLockCountMutex);
   5188             assert(ret == 0);
   5189             s_wakelock_count = 0;
   5190             release_wake_lock(ANDROID_WAKE_LOCK_NAME);
   5191             ret = pthread_mutex_unlock(&s_wakeLockCountMutex);
   5192             assert(ret == 0);
   5193         }
   5194     } else {
   5195         if (param == NULL) {
   5196             releaseWakeLock();
   5197         }
   5198     }
   5199 }
   5200 
   5201 static int
   5202 decodeVoiceRadioTechnology (RIL_RadioState radioState) {
   5203     switch (radioState) {
   5204         case RADIO_STATE_SIM_NOT_READY:
   5205         case RADIO_STATE_SIM_LOCKED_OR_ABSENT:
   5206         case RADIO_STATE_SIM_READY:
   5207             return RADIO_TECH_UMTS;
   5208 
   5209         case RADIO_STATE_RUIM_NOT_READY:
   5210         case RADIO_STATE_RUIM_READY:
   5211         case RADIO_STATE_RUIM_LOCKED_OR_ABSENT:
   5212         case RADIO_STATE_NV_NOT_READY:
   5213         case RADIO_STATE_NV_READY:
   5214             return RADIO_TECH_1xRTT;
   5215 
   5216         default:
   5217             RLOGD("decodeVoiceRadioTechnology: Invoked with incorrect RadioState");
   5218             return -1;
   5219     }
   5220 }
   5221 
   5222 static int
   5223 decodeCdmaSubscriptionSource (RIL_RadioState radioState) {
   5224     switch (radioState) {
   5225         case RADIO_STATE_SIM_NOT_READY:
   5226         case RADIO_STATE_SIM_LOCKED_OR_ABSENT:
   5227         case RADIO_STATE_SIM_READY:
   5228         case RADIO_STATE_RUIM_NOT_READY:
   5229         case RADIO_STATE_RUIM_READY:
   5230         case RADIO_STATE_RUIM_LOCKED_OR_ABSENT:
   5231             return CDMA_SUBSCRIPTION_SOURCE_RUIM_SIM;
   5232 
   5233         case RADIO_STATE_NV_NOT_READY:
   5234         case RADIO_STATE_NV_READY:
   5235             return CDMA_SUBSCRIPTION_SOURCE_NV;
   5236 
   5237         default:
   5238             RLOGD("decodeCdmaSubscriptionSource: Invoked with incorrect RadioState");
   5239             return -1;
   5240     }
   5241 }
   5242 
   5243 static int
   5244 decodeSimStatus (RIL_RadioState radioState) {
   5245    switch (radioState) {
   5246        case RADIO_STATE_SIM_NOT_READY:
   5247        case RADIO_STATE_RUIM_NOT_READY:
   5248        case RADIO_STATE_NV_NOT_READY:
   5249        case RADIO_STATE_NV_READY:
   5250            return -1;
   5251        case RADIO_STATE_SIM_LOCKED_OR_ABSENT:
   5252        case RADIO_STATE_SIM_READY:
   5253        case RADIO_STATE_RUIM_READY:
   5254        case RADIO_STATE_RUIM_LOCKED_OR_ABSENT:
   5255            return radioState;
   5256        default:
   5257            RLOGD("decodeSimStatus: Invoked with incorrect RadioState");
   5258            return -1;
   5259    }
   5260 }
   5261 
   5262 static bool is3gpp2(int radioTech) {
   5263     switch (radioTech) {
   5264         case RADIO_TECH_IS95A:
   5265         case RADIO_TECH_IS95B:
   5266         case RADIO_TECH_1xRTT:
   5267         case RADIO_TECH_EVDO_0:
   5268         case RADIO_TECH_EVDO_A:
   5269         case RADIO_TECH_EVDO_B:
   5270         case RADIO_TECH_EHRPD:
   5271             return true;
   5272         default:
   5273             return false;
   5274     }
   5275 }
   5276 
   5277 /* If RIL sends SIM states or RUIM states, store the voice radio
   5278  * technology and subscription source information so that they can be
   5279  * returned when telephony framework requests them
   5280  */
   5281 static RIL_RadioState
   5282 processRadioState(RIL_RadioState newRadioState, RIL_SOCKET_ID socket_id) {
   5283 
   5284     if((newRadioState > RADIO_STATE_UNAVAILABLE) && (newRadioState < RADIO_STATE_ON)) {
   5285         int newVoiceRadioTech;
   5286         int newCdmaSubscriptionSource;
   5287         int newSimStatus;
   5288 
   5289         /* This is old RIL. Decode Subscription source and Voice Radio Technology
   5290            from Radio State and send change notifications if there has been a change */
   5291         newVoiceRadioTech = decodeVoiceRadioTechnology(newRadioState);
   5292         if(newVoiceRadioTech != voiceRadioTech) {
   5293             voiceRadioTech = newVoiceRadioTech;
   5294             RIL_UNSOL_RESPONSE(RIL_UNSOL_VOICE_RADIO_TECH_CHANGED,
   5295                         &voiceRadioTech, sizeof(voiceRadioTech), socket_id);
   5296         }
   5297         if(is3gpp2(newVoiceRadioTech)) {
   5298             newCdmaSubscriptionSource = decodeCdmaSubscriptionSource(newRadioState);
   5299             if(newCdmaSubscriptionSource != cdmaSubscriptionSource) {
   5300                 cdmaSubscriptionSource = newCdmaSubscriptionSource;
   5301                 RIL_UNSOL_RESPONSE(RIL_UNSOL_CDMA_SUBSCRIPTION_SOURCE_CHANGED,
   5302                         &cdmaSubscriptionSource, sizeof(cdmaSubscriptionSource), socket_id);
   5303             }
   5304         }
   5305         newSimStatus = decodeSimStatus(newRadioState);
   5306         if(newSimStatus != simRuimStatus) {
   5307             simRuimStatus = newSimStatus;
   5308             RIL_UNSOL_RESPONSE(RIL_UNSOL_RESPONSE_SIM_STATUS_CHANGED, NULL, 0, socket_id);
   5309         }
   5310 
   5311         /* Send RADIO_ON to telephony */
   5312         newRadioState = RADIO_STATE_ON;
   5313     }
   5314 
   5315     return newRadioState;
   5316 }
   5317 
   5318 
   5319 #if defined(ANDROID_MULTI_SIM)
   5320 extern "C"
   5321 void RIL_onUnsolicitedResponse(int unsolResponse, const void *data,
   5322                                 size_t datalen, RIL_SOCKET_ID socket_id)
   5323 #else
   5324 extern "C"
   5325 void RIL_onUnsolicitedResponse(int unsolResponse, const void *data,
   5326                                 size_t datalen)
   5327 #endif
   5328 {
   5329     int unsolResponseIndex;
   5330     int ret;
   5331     int64_t timeReceived = 0;
   5332     bool shouldScheduleTimeout = false;
   5333     RIL_RadioState newState;
   5334     RIL_SOCKET_ID soc_id = RIL_SOCKET_1;
   5335 
   5336 #if defined(ANDROID_MULTI_SIM)
   5337     soc_id = socket_id;
   5338 #endif
   5339 
   5340 
   5341     if (s_registerCalled == 0) {
   5342         // Ignore RIL_onUnsolicitedResponse before RIL_register
   5343         RLOGW("RIL_onUnsolicitedResponse called before RIL_register");
   5344         return;
   5345     }
   5346 
   5347     unsolResponseIndex = unsolResponse - RIL_UNSOL_RESPONSE_BASE;
   5348 
   5349     if ((unsolResponseIndex < 0)
   5350         || (unsolResponseIndex >= (int32_t)NUM_ELEMS(s_unsolResponses))) {
   5351         RLOGE("unsupported unsolicited response code %d", unsolResponse);
   5352         return;
   5353     }
   5354 
   5355     // Grab a wake lock if needed for this reponse,
   5356     // as we exit we'll either release it immediately
   5357     // or set a timer to release it later.
   5358     switch (s_unsolResponses[unsolResponseIndex].wakeType) {
   5359         case WAKE_PARTIAL:
   5360             grabPartialWakeLock();
   5361             shouldScheduleTimeout = true;
   5362         break;
   5363 
   5364         case DONT_WAKE:
   5365         default:
   5366             // No wake lock is grabed so don't set timeout
   5367             shouldScheduleTimeout = false;
   5368             break;
   5369     }
   5370 
   5371     // Mark the time this was received, doing this
   5372     // after grabing the wakelock incase getting
   5373     // the elapsedRealTime might cause us to goto
   5374     // sleep.
   5375     if (unsolResponse == RIL_UNSOL_NITZ_TIME_RECEIVED) {
   5376         timeReceived = elapsedRealtime();
   5377     }
   5378 
   5379     appendPrintBuf("[UNSL]< %s", requestToString(unsolResponse));
   5380 
   5381     Parcel p;
   5382     if (s_callbacks.version >= 13
   5383                 && s_unsolResponses[unsolResponseIndex].wakeType == WAKE_PARTIAL) {
   5384         p.writeInt32 (RESPONSE_UNSOLICITED_ACK_EXP);
   5385     } else {
   5386         p.writeInt32 (RESPONSE_UNSOLICITED);
   5387     }
   5388     p.writeInt32 (unsolResponse);
   5389 
   5390     ret = s_unsolResponses[unsolResponseIndex]
   5391                 .responseFunction(p, const_cast<void*>(data), datalen);
   5392     if (ret != 0) {
   5393         // Problem with the response. Don't continue;
   5394         goto error_exit;
   5395     }
   5396 
   5397     // some things get more payload
   5398     switch(unsolResponse) {
   5399         case RIL_UNSOL_RESPONSE_RADIO_STATE_CHANGED:
   5400             newState = processRadioState(CALL_ONSTATEREQUEST(soc_id), soc_id);
   5401             p.writeInt32(newState);
   5402             appendPrintBuf("%s {%s}", printBuf,
   5403                 radioStateToString(CALL_ONSTATEREQUEST(soc_id)));
   5404         break;
   5405 
   5406 
   5407         case RIL_UNSOL_NITZ_TIME_RECEIVED:
   5408             // Store the time that this was received so the
   5409             // handler of this message can account for
   5410             // the time it takes to arrive and process. In
   5411             // particular the system has been known to sleep
   5412             // before this message can be processed.
   5413             p.writeInt64(timeReceived);
   5414         break;
   5415     }
   5416 
   5417     if (s_callbacks.version < 13) {
   5418         if (shouldScheduleTimeout) {
   5419             UserCallbackInfo *p_info = internalRequestTimedCallback(wakeTimeoutCallback, NULL,
   5420                     &TIMEVAL_WAKE_TIMEOUT);
   5421 
   5422             if (p_info == NULL) {
   5423                 goto error_exit;
   5424             } else {
   5425                 // Cancel the previous request
   5426                 if (s_last_wake_timeout_info != NULL) {
   5427                     s_last_wake_timeout_info->userParam = (void *)1;
   5428                 }
   5429                 s_last_wake_timeout_info = p_info;
   5430             }
   5431         }
   5432     }
   5433 
   5434 #if VDBG
   5435     RLOGI("%s UNSOLICITED: %s length:%d", rilSocketIdToString(soc_id), requestToString(unsolResponse), p.dataSize());
   5436 #endif
   5437     ret = sendResponse(p, soc_id);
   5438     if (ret != 0 && unsolResponse == RIL_UNSOL_NITZ_TIME_RECEIVED) {
   5439 
   5440         // Unfortunately, NITZ time is not poll/update like everything
   5441         // else in the system. So, if the upstream client isn't connected,
   5442         // keep a copy of the last NITZ response (with receive time noted
   5443         // above) around so we can deliver it when it is connected
   5444 
   5445         if (s_lastNITZTimeData != NULL) {
   5446             free (s_lastNITZTimeData);
   5447             s_lastNITZTimeData = NULL;
   5448         }
   5449 
   5450         s_lastNITZTimeData = calloc(p.dataSize(), 1);
   5451         if (s_lastNITZTimeData == NULL) {
   5452              RLOGE("Memory allocation failed in RIL_onUnsolicitedResponse");
   5453              goto error_exit;
   5454         }
   5455         s_lastNITZTimeDataSize = p.dataSize();
   5456         memcpy(s_lastNITZTimeData, p.data(), p.dataSize());
   5457     }
   5458 
   5459     // Normal exit
   5460     return;
   5461 
   5462 error_exit:
   5463     if (shouldScheduleTimeout) {
   5464         releaseWakeLock();
   5465     }
   5466 }
   5467 
   5468 /** FIXME generalize this if you track UserCAllbackInfo, clear it
   5469     when the callback occurs
   5470 */
   5471 static UserCallbackInfo *
   5472 internalRequestTimedCallback (RIL_TimedCallback callback, void *param,
   5473                                 const struct timeval *relativeTime)
   5474 {
   5475     struct timeval myRelativeTime;
   5476     UserCallbackInfo *p_info;
   5477 
   5478     p_info = (UserCallbackInfo *) calloc(1, sizeof(UserCallbackInfo));
   5479     if (p_info == NULL) {
   5480         RLOGE("Memory allocation failed in internalRequestTimedCallback");
   5481         return p_info;
   5482 
   5483     }
   5484 
   5485     p_info->p_callback = callback;
   5486     p_info->userParam = param;
   5487 
   5488     if (relativeTime == NULL) {
   5489         /* treat null parameter as a 0 relative time */
   5490         memset (&myRelativeTime, 0, sizeof(myRelativeTime));
   5491     } else {
   5492         /* FIXME I think event_add's tv param is really const anyway */
   5493         memcpy (&myRelativeTime, relativeTime, sizeof(myRelativeTime));
   5494     }
   5495 
   5496     ril_event_set(&(p_info->event), -1, false, userTimerCallback, p_info);
   5497 
   5498     ril_timer_add(&(p_info->event), &myRelativeTime);
   5499 
   5500     triggerEvLoop();
   5501     return p_info;
   5502 }
   5503 
   5504 
   5505 extern "C" void
   5506 RIL_requestTimedCallback (RIL_TimedCallback callback, void *param,
   5507                                 const struct timeval *relativeTime) {
   5508     internalRequestTimedCallback (callback, param, relativeTime);
   5509 }
   5510 
   5511 const char *
   5512 failCauseToString(RIL_Errno e) {
   5513     switch(e) {
   5514         case RIL_E_SUCCESS: return "E_SUCCESS";
   5515         case RIL_E_RADIO_NOT_AVAILABLE: return "E_RADIO_NOT_AVAILABLE";
   5516         case RIL_E_GENERIC_FAILURE: return "E_GENERIC_FAILURE";
   5517         case RIL_E_PASSWORD_INCORRECT: return "E_PASSWORD_INCORRECT";
   5518         case RIL_E_SIM_PIN2: return "E_SIM_PIN2";
   5519         case RIL_E_SIM_PUK2: return "E_SIM_PUK2";
   5520         case RIL_E_REQUEST_NOT_SUPPORTED: return "E_REQUEST_NOT_SUPPORTED";
   5521         case RIL_E_CANCELLED: return "E_CANCELLED";
   5522         case RIL_E_OP_NOT_ALLOWED_DURING_VOICE_CALL: return "E_OP_NOT_ALLOWED_DURING_VOICE_CALL";
   5523         case RIL_E_OP_NOT_ALLOWED_BEFORE_REG_TO_NW: return "E_OP_NOT_ALLOWED_BEFORE_REG_TO_NW";
   5524         case RIL_E_SMS_SEND_FAIL_RETRY: return "E_SMS_SEND_FAIL_RETRY";
   5525         case RIL_E_SIM_ABSENT:return "E_SIM_ABSENT";
   5526         case RIL_E_ILLEGAL_SIM_OR_ME:return "E_ILLEGAL_SIM_OR_ME";
   5527 #ifdef FEATURE_MULTIMODE_ANDROID
   5528         case RIL_E_SUBSCRIPTION_NOT_AVAILABLE:return "E_SUBSCRIPTION_NOT_AVAILABLE";
   5529         case RIL_E_MODE_NOT_SUPPORTED:return "E_MODE_NOT_SUPPORTED";
   5530 #endif
   5531         case RIL_E_FDN_CHECK_FAILURE: return "E_FDN_CHECK_FAILURE";
   5532         case RIL_E_MISSING_RESOURCE: return "E_MISSING_RESOURCE";
   5533         case RIL_E_NO_SUCH_ELEMENT: return "E_NO_SUCH_ELEMENT";
   5534         case RIL_E_DIAL_MODIFIED_TO_USSD: return "E_DIAL_MODIFIED_TO_USSD";
   5535         case RIL_E_DIAL_MODIFIED_TO_SS: return "E_DIAL_MODIFIED_TO_SS";
   5536         case RIL_E_DIAL_MODIFIED_TO_DIAL: return "E_DIAL_MODIFIED_TO_DIAL";
   5537         case RIL_E_USSD_MODIFIED_TO_DIAL: return "E_USSD_MODIFIED_TO_DIAL";
   5538         case RIL_E_USSD_MODIFIED_TO_SS: return "E_USSD_MODIFIED_TO_SS";
   5539         case RIL_E_USSD_MODIFIED_TO_USSD: return "E_USSD_MODIFIED_TO_USSD";
   5540         case RIL_E_SS_MODIFIED_TO_DIAL: return "E_SS_MODIFIED_TO_DIAL";
   5541         case RIL_E_SS_MODIFIED_TO_USSD: return "E_SS_MODIFIED_TO_USSD";
   5542         case RIL_E_SUBSCRIPTION_NOT_SUPPORTED: return "E_SUBSCRIPTION_NOT_SUPPORTED";
   5543         case RIL_E_SS_MODIFIED_TO_SS: return "E_SS_MODIFIED_TO_SS";
   5544         case RIL_E_LCE_NOT_SUPPORTED: return "E_LCE_NOT_SUPPORTED";
   5545         case RIL_E_NO_MEMORY: return "E_NO_MEMORY";
   5546         case RIL_E_INTERNAL_ERR: return "E_INTERNAL_ERR";
   5547         case RIL_E_SYSTEM_ERR: return "E_SYSTEM_ERR";
   5548         case RIL_E_MODEM_ERR: return "E_MODEM_ERR";
   5549         case RIL_E_INVALID_STATE: return "E_INVALID_STATE";
   5550         case RIL_E_NO_RESOURCES: return "E_NO_RESOURCES";
   5551         case RIL_E_SIM_ERR: return "E_SIM_ERR";
   5552         case RIL_E_INVALID_ARGUMENTS: return "E_INVALID_ARGUMENTS";
   5553         case RIL_E_INVALID_SIM_STATE: return "E_INVALID_SIM_STATE";
   5554         case RIL_E_INVALID_MODEM_STATE: return "E_INVALID_MODEM_STATE";
   5555         case RIL_E_INVALID_CALL_ID: return "E_INVALID_CALL_ID";
   5556         case RIL_E_NO_SMS_TO_ACK: return "E_NO_SMS_TO_ACK";
   5557         case RIL_E_NETWORK_ERR: return "E_NETWORK_ERR";
   5558         case RIL_E_REQUEST_RATE_LIMITED: return "E_REQUEST_RATE_LIMITED";
   5559         case RIL_E_SIM_BUSY: return "E_SIM_BUSY";
   5560         case RIL_E_SIM_FULL: return "E_SIM_FULL";
   5561         case RIL_E_NETWORK_REJECT: return "E_NETWORK_REJECT";
   5562         case RIL_E_OPERATION_NOT_ALLOWED: return "E_OPERATION_NOT_ALLOWED";
   5563         case RIL_E_EMPTY_RECORD: "E_EMPTY_RECORD";
   5564         case RIL_E_INVALID_SMS_FORMAT: return "E_INVALID_SMS_FORMAT";
   5565         case RIL_E_ENCODING_ERR: return "E_ENCODING_ERR";
   5566         case RIL_E_INVALID_SMSC_ADDRESS: return "E_INVALID_SMSC_ADDRESS";
   5567         case RIL_E_NO_SUCH_ENTRY: return "E_NO_SUCH_ENTRY";
   5568         case RIL_E_NETWORK_NOT_READY: return "E_NETWORK_NOT_READY";
   5569         case RIL_E_NOT_PROVISIONED: return "E_NOT_PROVISIONED";
   5570         case RIL_E_NO_SUBSCRIPTION: return "E_NO_SUBSCRIPTION";
   5571         case RIL_E_NO_NETWORK_FOUND: return "E_NO_NETWORK_FOUND";
   5572         case RIL_E_DEVICE_IN_USE: return "E_DEVICE_IN_USE";
   5573         case RIL_E_ABORTED: return "E_ABORTED";
   5574         case RIL_E_OEM_ERROR_1: return "E_OEM_ERROR_1";
   5575         case RIL_E_OEM_ERROR_2: return "E_OEM_ERROR_2";
   5576         case RIL_E_OEM_ERROR_3: return "E_OEM_ERROR_3";
   5577         case RIL_E_OEM_ERROR_4: return "E_OEM_ERROR_4";
   5578         case RIL_E_OEM_ERROR_5: return "E_OEM_ERROR_5";
   5579         case RIL_E_OEM_ERROR_6: return "E_OEM_ERROR_6";
   5580         case RIL_E_OEM_ERROR_7: return "E_OEM_ERROR_7";
   5581         case RIL_E_OEM_ERROR_8: return "E_OEM_ERROR_8";
   5582         case RIL_E_OEM_ERROR_9: return "E_OEM_ERROR_9";
   5583         case RIL_E_OEM_ERROR_10: return "E_OEM_ERROR_10";
   5584         case RIL_E_OEM_ERROR_11: return "E_OEM_ERROR_11";
   5585         case RIL_E_OEM_ERROR_12: return "E_OEM_ERROR_12";
   5586         case RIL_E_OEM_ERROR_13: return "E_OEM_ERROR_13";
   5587         case RIL_E_OEM_ERROR_14: return "E_OEM_ERROR_14";
   5588         case RIL_E_OEM_ERROR_15: return "E_OEM_ERROR_15";
   5589         case RIL_E_OEM_ERROR_16: return "E_OEM_ERROR_16";
   5590         case RIL_E_OEM_ERROR_17: return "E_OEM_ERROR_17";
   5591         case RIL_E_OEM_ERROR_18: return "E_OEM_ERROR_18";
   5592         case RIL_E_OEM_ERROR_19: return "E_OEM_ERROR_19";
   5593         case RIL_E_OEM_ERROR_20: return "E_OEM_ERROR_20";
   5594         case RIL_E_OEM_ERROR_21: return "E_OEM_ERROR_21";
   5595         case RIL_E_OEM_ERROR_22: return "E_OEM_ERROR_22";
   5596         case RIL_E_OEM_ERROR_23: return "E_OEM_ERROR_23";
   5597         case RIL_E_OEM_ERROR_24: return "E_OEM_ERROR_24";
   5598         case RIL_E_OEM_ERROR_25: return "E_OEM_ERROR_25";
   5599         default: return "<unknown error>";
   5600     }
   5601 }
   5602 
   5603 const char *
   5604 radioStateToString(RIL_RadioState s) {
   5605     switch(s) {
   5606         case RADIO_STATE_OFF: return "RADIO_OFF";
   5607         case RADIO_STATE_UNAVAILABLE: return "RADIO_UNAVAILABLE";
   5608         case RADIO_STATE_SIM_NOT_READY: return "RADIO_SIM_NOT_READY";
   5609         case RADIO_STATE_SIM_LOCKED_OR_ABSENT: return "RADIO_SIM_LOCKED_OR_ABSENT";
   5610         case RADIO_STATE_SIM_READY: return "RADIO_SIM_READY";
   5611         case RADIO_STATE_RUIM_NOT_READY:return"RADIO_RUIM_NOT_READY";
   5612         case RADIO_STATE_RUIM_READY:return"RADIO_RUIM_READY";
   5613         case RADIO_STATE_RUIM_LOCKED_OR_ABSENT:return"RADIO_RUIM_LOCKED_OR_ABSENT";
   5614         case RADIO_STATE_NV_NOT_READY:return"RADIO_NV_NOT_READY";
   5615         case RADIO_STATE_NV_READY:return"RADIO_NV_READY";
   5616         case RADIO_STATE_ON:return"RADIO_ON";
   5617         default: return "<unknown state>";
   5618     }
   5619 }
   5620 
   5621 const char *
   5622 callStateToString(RIL_CallState s) {
   5623     switch(s) {
   5624         case RIL_CALL_ACTIVE : return "ACTIVE";
   5625         case RIL_CALL_HOLDING: return "HOLDING";
   5626         case RIL_CALL_DIALING: return "DIALING";
   5627         case RIL_CALL_ALERTING: return "ALERTING";
   5628         case RIL_CALL_INCOMING: return "INCOMING";
   5629         case RIL_CALL_WAITING: return "WAITING";
   5630         default: return "<unknown state>";
   5631     }
   5632 }
   5633 
   5634 const char *
   5635 requestToString(int request) {
   5636 /*
   5637  cat libs/telephony/ril_commands.h \
   5638  | egrep "^ *{RIL_" \
   5639  | sed -re 's/\{RIL_([^,]+),[^,]+,([^}]+).+/case RIL_\1: return "\1";/'
   5640 
   5641 
   5642  cat libs/telephony/ril_unsol_commands.h \
   5643  | egrep "^ *{RIL_" \
   5644  | sed -re 's/\{RIL_([^,]+),([^}]+).+/case RIL_\1: return "\1";/'
   5645 
   5646 */
   5647     switch(request) {
   5648         case RIL_REQUEST_GET_SIM_STATUS: return "GET_SIM_STATUS";
   5649         case RIL_REQUEST_ENTER_SIM_PIN: return "ENTER_SIM_PIN";
   5650         case RIL_REQUEST_ENTER_SIM_PUK: return "ENTER_SIM_PUK";
   5651         case RIL_REQUEST_ENTER_SIM_PIN2: return "ENTER_SIM_PIN2";
   5652         case RIL_REQUEST_ENTER_SIM_PUK2: return "ENTER_SIM_PUK2";
   5653         case RIL_REQUEST_CHANGE_SIM_PIN: return "CHANGE_SIM_PIN";
   5654         case RIL_REQUEST_CHANGE_SIM_PIN2: return "CHANGE_SIM_PIN2";
   5655         case RIL_REQUEST_ENTER_NETWORK_DEPERSONALIZATION: return "ENTER_NETWORK_DEPERSONALIZATION";
   5656         case RIL_REQUEST_GET_CURRENT_CALLS: return "GET_CURRENT_CALLS";
   5657         case RIL_REQUEST_DIAL: return "DIAL";
   5658         case RIL_REQUEST_GET_IMSI: return "GET_IMSI";
   5659         case RIL_REQUEST_HANGUP: return "HANGUP";
   5660         case RIL_REQUEST_HANGUP_WAITING_OR_BACKGROUND: return "HANGUP_WAITING_OR_BACKGROUND";
   5661         case RIL_REQUEST_HANGUP_FOREGROUND_RESUME_BACKGROUND: return "HANGUP_FOREGROUND_RESUME_BACKGROUND";
   5662         case RIL_REQUEST_SWITCH_WAITING_OR_HOLDING_AND_ACTIVE: return "SWITCH_WAITING_OR_HOLDING_AND_ACTIVE";
   5663         case RIL_REQUEST_CONFERENCE: return "CONFERENCE";
   5664         case RIL_REQUEST_UDUB: return "UDUB";
   5665         case RIL_REQUEST_LAST_CALL_FAIL_CAUSE: return "LAST_CALL_FAIL_CAUSE";
   5666         case RIL_REQUEST_SIGNAL_STRENGTH: return "SIGNAL_STRENGTH";
   5667         case RIL_REQUEST_VOICE_REGISTRATION_STATE: return "VOICE_REGISTRATION_STATE";
   5668         case RIL_REQUEST_DATA_REGISTRATION_STATE: return "DATA_REGISTRATION_STATE";
   5669         case RIL_REQUEST_OPERATOR: return "OPERATOR";
   5670         case RIL_REQUEST_RADIO_POWER: return "RADIO_POWER";
   5671         case RIL_REQUEST_DTMF: return "DTMF";
   5672         case RIL_REQUEST_SEND_SMS: return "SEND_SMS";
   5673         case RIL_REQUEST_SEND_SMS_EXPECT_MORE: return "SEND_SMS_EXPECT_MORE";
   5674         case RIL_REQUEST_SETUP_DATA_CALL: return "SETUP_DATA_CALL";
   5675         case RIL_REQUEST_SIM_IO: return "SIM_IO";
   5676         case RIL_REQUEST_SEND_USSD: return "SEND_USSD";
   5677         case RIL_REQUEST_CANCEL_USSD: return "CANCEL_USSD";
   5678         case RIL_REQUEST_GET_CLIR: return "GET_CLIR";
   5679         case RIL_REQUEST_SET_CLIR: return "SET_CLIR";
   5680         case RIL_REQUEST_QUERY_CALL_FORWARD_STATUS: return "QUERY_CALL_FORWARD_STATUS";
   5681         case RIL_REQUEST_SET_CALL_FORWARD: return "SET_CALL_FORWARD";
   5682         case RIL_REQUEST_QUERY_CALL_WAITING: return "QUERY_CALL_WAITING";
   5683         case RIL_REQUEST_SET_CALL_WAITING: return "SET_CALL_WAITING";
   5684         case RIL_REQUEST_SMS_ACKNOWLEDGE: return "SMS_ACKNOWLEDGE";
   5685         case RIL_REQUEST_GET_IMEI: return "GET_IMEI";
   5686         case RIL_REQUEST_GET_IMEISV: return "GET_IMEISV";
   5687         case RIL_REQUEST_ANSWER: return "ANSWER";
   5688         case RIL_REQUEST_DEACTIVATE_DATA_CALL: return "DEACTIVATE_DATA_CALL";
   5689         case RIL_REQUEST_QUERY_FACILITY_LOCK: return "QUERY_FACILITY_LOCK";
   5690         case RIL_REQUEST_SET_FACILITY_LOCK: return "SET_FACILITY_LOCK";
   5691         case RIL_REQUEST_CHANGE_BARRING_PASSWORD: return "CHANGE_BARRING_PASSWORD";
   5692         case RIL_REQUEST_QUERY_NETWORK_SELECTION_MODE: return "QUERY_NETWORK_SELECTION_MODE";
   5693         case RIL_REQUEST_SET_NETWORK_SELECTION_AUTOMATIC: return "SET_NETWORK_SELECTION_AUTOMATIC";
   5694         case RIL_REQUEST_SET_NETWORK_SELECTION_MANUAL: return "SET_NETWORK_SELECTION_MANUAL";
   5695         case RIL_REQUEST_QUERY_AVAILABLE_NETWORKS : return "QUERY_AVAILABLE_NETWORKS ";
   5696         case RIL_REQUEST_DTMF_START: return "DTMF_START";
   5697         case RIL_REQUEST_DTMF_STOP: return "DTMF_STOP";
   5698         case RIL_REQUEST_BASEBAND_VERSION: return "BASEBAND_VERSION";
   5699         case RIL_REQUEST_SEPARATE_CONNECTION: return "SEPARATE_CONNECTION";
   5700         case RIL_REQUEST_SET_PREFERRED_NETWORK_TYPE: return "SET_PREFERRED_NETWORK_TYPE";
   5701         case RIL_REQUEST_GET_PREFERRED_NETWORK_TYPE: return "GET_PREFERRED_NETWORK_TYPE";
   5702         case RIL_REQUEST_GET_NEIGHBORING_CELL_IDS: return "GET_NEIGHBORING_CELL_IDS";
   5703         case RIL_REQUEST_SET_MUTE: return "SET_MUTE";
   5704         case RIL_REQUEST_GET_MUTE: return "GET_MUTE";
   5705         case RIL_REQUEST_QUERY_CLIP: return "QUERY_CLIP";
   5706         case RIL_REQUEST_LAST_DATA_CALL_FAIL_CAUSE: return "LAST_DATA_CALL_FAIL_CAUSE";
   5707         case RIL_REQUEST_DATA_CALL_LIST: return "DATA_CALL_LIST";
   5708         case RIL_REQUEST_NV_RESET_CONFIG: return "NV_RESET_CONFIG";
   5709         case RIL_REQUEST_RESET_RADIO: return "RESET_RADIO";
   5710         case RIL_REQUEST_OEM_HOOK_RAW: return "OEM_HOOK_RAW";
   5711         case RIL_REQUEST_OEM_HOOK_STRINGS: return "OEM_HOOK_STRINGS";
   5712         case RIL_REQUEST_SET_BAND_MODE: return "SET_BAND_MODE";
   5713         case RIL_REQUEST_QUERY_AVAILABLE_BAND_MODE: return "QUERY_AVAILABLE_BAND_MODE";
   5714         case RIL_REQUEST_STK_GET_PROFILE: return "STK_GET_PROFILE";
   5715         case RIL_REQUEST_STK_SET_PROFILE: return "STK_SET_PROFILE";
   5716         case RIL_REQUEST_STK_SEND_ENVELOPE_COMMAND: return "STK_SEND_ENVELOPE_COMMAND";
   5717         case RIL_REQUEST_STK_SEND_TERMINAL_RESPONSE: return "STK_SEND_TERMINAL_RESPONSE";
   5718         case RIL_REQUEST_STK_HANDLE_CALL_SETUP_REQUESTED_FROM_SIM: return "STK_HANDLE_CALL_SETUP_REQUESTED_FROM_SIM";
   5719         case RIL_REQUEST_SCREEN_STATE: return "SCREEN_STATE";
   5720         case RIL_REQUEST_EXPLICIT_CALL_TRANSFER: return "EXPLICIT_CALL_TRANSFER";
   5721         case RIL_REQUEST_SET_LOCATION_UPDATES: return "SET_LOCATION_UPDATES";
   5722         case RIL_REQUEST_CDMA_SET_SUBSCRIPTION_SOURCE:return"CDMA_SET_SUBSCRIPTION_SOURCE";
   5723         case RIL_REQUEST_CDMA_SET_ROAMING_PREFERENCE:return"CDMA_SET_ROAMING_PREFERENCE";
   5724         case RIL_REQUEST_CDMA_QUERY_ROAMING_PREFERENCE:return"CDMA_QUERY_ROAMING_PREFERENCE";
   5725         case RIL_REQUEST_SET_TTY_MODE:return"SET_TTY_MODE";
   5726         case RIL_REQUEST_QUERY_TTY_MODE:return"QUERY_TTY_MODE";
   5727         case RIL_REQUEST_CDMA_SET_PREFERRED_VOICE_PRIVACY_MODE:return"CDMA_SET_PREFERRED_VOICE_PRIVACY_MODE";
   5728         case RIL_REQUEST_CDMA_QUERY_PREFERRED_VOICE_PRIVACY_MODE:return"CDMA_QUERY_PREFERRED_VOICE_PRIVACY_MODE";
   5729         case RIL_REQUEST_CDMA_FLASH:return"CDMA_FLASH";
   5730         case RIL_REQUEST_CDMA_BURST_DTMF:return"CDMA_BURST_DTMF";
   5731         case RIL_REQUEST_CDMA_SEND_SMS:return"CDMA_SEND_SMS";
   5732         case RIL_REQUEST_CDMA_SMS_ACKNOWLEDGE:return"CDMA_SMS_ACKNOWLEDGE";
   5733         case RIL_REQUEST_GSM_GET_BROADCAST_SMS_CONFIG:return"GSM_GET_BROADCAST_SMS_CONFIG";
   5734         case RIL_REQUEST_GSM_SET_BROADCAST_SMS_CONFIG:return"GSM_SET_BROADCAST_SMS_CONFIG";
   5735         case RIL_REQUEST_CDMA_GET_BROADCAST_SMS_CONFIG:return "CDMA_GET_BROADCAST_SMS_CONFIG";
   5736         case RIL_REQUEST_CDMA_SET_BROADCAST_SMS_CONFIG:return "CDMA_SET_BROADCAST_SMS_CONFIG";
   5737         case RIL_REQUEST_CDMA_SMS_BROADCAST_ACTIVATION:return "CDMA_SMS_BROADCAST_ACTIVATION";
   5738         case RIL_REQUEST_CDMA_VALIDATE_AND_WRITE_AKEY: return"CDMA_VALIDATE_AND_WRITE_AKEY";
   5739         case RIL_REQUEST_CDMA_SUBSCRIPTION: return"CDMA_SUBSCRIPTION";
   5740         case RIL_REQUEST_CDMA_WRITE_SMS_TO_RUIM: return "CDMA_WRITE_SMS_TO_RUIM";
   5741         case RIL_REQUEST_CDMA_DELETE_SMS_ON_RUIM: return "CDMA_DELETE_SMS_ON_RUIM";
   5742         case RIL_REQUEST_DEVICE_IDENTITY: return "DEVICE_IDENTITY";
   5743         case RIL_REQUEST_EXIT_EMERGENCY_CALLBACK_MODE: return "EXIT_EMERGENCY_CALLBACK_MODE";
   5744         case RIL_REQUEST_GET_SMSC_ADDRESS: return "GET_SMSC_ADDRESS";
   5745         case RIL_REQUEST_SET_SMSC_ADDRESS: return "SET_SMSC_ADDRESS";
   5746         case RIL_REQUEST_REPORT_SMS_MEMORY_STATUS: return "REPORT_SMS_MEMORY_STATUS";
   5747         case RIL_REQUEST_REPORT_STK_SERVICE_IS_RUNNING: return "REPORT_STK_SERVICE_IS_RUNNING";
   5748         case RIL_REQUEST_CDMA_GET_SUBSCRIPTION_SOURCE: return "CDMA_GET_SUBSCRIPTION_SOURCE";
   5749         case RIL_REQUEST_ISIM_AUTHENTICATION: return "ISIM_AUTHENTICATION";
   5750         case RIL_REQUEST_ACKNOWLEDGE_INCOMING_GSM_SMS_WITH_PDU: return "RIL_REQUEST_ACKNOWLEDGE_INCOMING_GSM_SMS_WITH_PDU";
   5751         case RIL_REQUEST_STK_SEND_ENVELOPE_WITH_STATUS: return "RIL_REQUEST_STK_SEND_ENVELOPE_WITH_STATUS";
   5752         case RIL_REQUEST_VOICE_RADIO_TECH: return "VOICE_RADIO_TECH";
   5753         case RIL_REQUEST_WRITE_SMS_TO_SIM: return "WRITE_SMS_TO_SIM";
   5754         case RIL_REQUEST_GET_CELL_INFO_LIST: return"GET_CELL_INFO_LIST";
   5755         case RIL_REQUEST_SET_UNSOL_CELL_INFO_LIST_RATE: return"SET_UNSOL_CELL_INFO_LIST_RATE";
   5756         case RIL_REQUEST_SET_INITIAL_ATTACH_APN: return "RIL_REQUEST_SET_INITIAL_ATTACH_APN";
   5757         case RIL_REQUEST_IMS_REGISTRATION_STATE: return "IMS_REGISTRATION_STATE";
   5758         case RIL_REQUEST_IMS_SEND_SMS: return "IMS_SEND_SMS";
   5759         case RIL_REQUEST_SIM_TRANSMIT_APDU_BASIC: return "SIM_TRANSMIT_APDU_BASIC";
   5760         case RIL_REQUEST_SIM_OPEN_CHANNEL: return "SIM_OPEN_CHANNEL";
   5761         case RIL_REQUEST_SIM_CLOSE_CHANNEL: return "SIM_CLOSE_CHANNEL";
   5762         case RIL_REQUEST_SIM_TRANSMIT_APDU_CHANNEL: return "SIM_TRANSMIT_APDU_CHANNEL";
   5763         case RIL_REQUEST_GET_RADIO_CAPABILITY: return "RIL_REQUEST_GET_RADIO_CAPABILITY";
   5764         case RIL_REQUEST_SET_RADIO_CAPABILITY: return "RIL_REQUEST_SET_RADIO_CAPABILITY";
   5765         case RIL_REQUEST_SET_UICC_SUBSCRIPTION: return "SET_UICC_SUBSCRIPTION";
   5766         case RIL_REQUEST_ALLOW_DATA: return "ALLOW_DATA";
   5767         case RIL_REQUEST_GET_HARDWARE_CONFIG: return "GET_HARDWARE_CONFIG";
   5768         case RIL_REQUEST_SIM_AUTHENTICATION: return "SIM_AUTHENTICATION";
   5769         case RIL_REQUEST_GET_DC_RT_INFO: return "GET_DC_RT_INFO";
   5770         case RIL_REQUEST_SET_DC_RT_INFO_RATE: return "SET_DC_RT_INFO_RATE";
   5771         case RIL_REQUEST_SET_DATA_PROFILE: return "SET_DATA_PROFILE";
   5772         case RIL_REQUEST_SET_CARRIER_RESTRICTIONS: return "SET_CARRIER_RESTRICTIONS";
   5773         case RIL_REQUEST_GET_CARRIER_RESTRICTIONS: return "GET_CARRIER_RESTRICTIONS";
   5774         case RIL_UNSOL_RESPONSE_RADIO_STATE_CHANGED: return "UNSOL_RESPONSE_RADIO_STATE_CHANGED";
   5775         case RIL_UNSOL_RESPONSE_CALL_STATE_CHANGED: return "UNSOL_RESPONSE_CALL_STATE_CHANGED";
   5776         case RIL_UNSOL_RESPONSE_VOICE_NETWORK_STATE_CHANGED: return "UNSOL_RESPONSE_VOICE_NETWORK_STATE_CHANGED";
   5777         case RIL_UNSOL_RESPONSE_NEW_SMS: return "UNSOL_RESPONSE_NEW_SMS";
   5778         case RIL_UNSOL_RESPONSE_NEW_SMS_STATUS_REPORT: return "UNSOL_RESPONSE_NEW_SMS_STATUS_REPORT";
   5779         case RIL_UNSOL_RESPONSE_NEW_SMS_ON_SIM: return "UNSOL_RESPONSE_NEW_SMS_ON_SIM";
   5780         case RIL_UNSOL_ON_USSD: return "UNSOL_ON_USSD";
   5781         case RIL_UNSOL_ON_USSD_REQUEST: return "UNSOL_ON_USSD_REQUEST(obsolete)";
   5782         case RIL_UNSOL_NITZ_TIME_RECEIVED: return "UNSOL_NITZ_TIME_RECEIVED";
   5783         case RIL_UNSOL_SIGNAL_STRENGTH: return "UNSOL_SIGNAL_STRENGTH";
   5784         case RIL_UNSOL_SUPP_SVC_NOTIFICATION: return "UNSOL_SUPP_SVC_NOTIFICATION";
   5785         case RIL_UNSOL_STK_SESSION_END: return "UNSOL_STK_SESSION_END";
   5786         case RIL_UNSOL_STK_PROACTIVE_COMMAND: return "UNSOL_STK_PROACTIVE_COMMAND";
   5787         case RIL_UNSOL_STK_EVENT_NOTIFY: return "UNSOL_STK_EVENT_NOTIFY";
   5788         case RIL_UNSOL_STK_CALL_SETUP: return "UNSOL_STK_CALL_SETUP";
   5789         case RIL_UNSOL_SIM_SMS_STORAGE_FULL: return "UNSOL_SIM_SMS_STORAGE_FUL";
   5790         case RIL_UNSOL_SIM_REFRESH: return "UNSOL_SIM_REFRESH";
   5791         case RIL_UNSOL_DATA_CALL_LIST_CHANGED: return "UNSOL_DATA_CALL_LIST_CHANGED";
   5792         case RIL_UNSOL_CALL_RING: return "UNSOL_CALL_RING";
   5793         case RIL_UNSOL_RESPONSE_SIM_STATUS_CHANGED: return "UNSOL_RESPONSE_SIM_STATUS_CHANGED";
   5794         case RIL_UNSOL_RESPONSE_CDMA_NEW_SMS: return "UNSOL_NEW_CDMA_SMS";
   5795         case RIL_UNSOL_RESPONSE_NEW_BROADCAST_SMS: return "UNSOL_NEW_BROADCAST_SMS";
   5796         case RIL_UNSOL_CDMA_RUIM_SMS_STORAGE_FULL: return "UNSOL_CDMA_RUIM_SMS_STORAGE_FULL";
   5797         case RIL_UNSOL_RESTRICTED_STATE_CHANGED: return "UNSOL_RESTRICTED_STATE_CHANGED";
   5798         case RIL_UNSOL_ENTER_EMERGENCY_CALLBACK_MODE: return "UNSOL_ENTER_EMERGENCY_CALLBACK_MODE";
   5799         case RIL_UNSOL_CDMA_CALL_WAITING: return "UNSOL_CDMA_CALL_WAITING";
   5800         case RIL_UNSOL_CDMA_OTA_PROVISION_STATUS: return "UNSOL_CDMA_OTA_PROVISION_STATUS";
   5801         case RIL_UNSOL_CDMA_INFO_REC: return "UNSOL_CDMA_INFO_REC";
   5802         case RIL_UNSOL_OEM_HOOK_RAW: return "UNSOL_OEM_HOOK_RAW";
   5803         case RIL_UNSOL_RINGBACK_TONE: return "UNSOL_RINGBACK_TONE";
   5804         case RIL_UNSOL_RESEND_INCALL_MUTE: return "UNSOL_RESEND_INCALL_MUTE";
   5805         case RIL_UNSOL_CDMA_SUBSCRIPTION_SOURCE_CHANGED: return "UNSOL_CDMA_SUBSCRIPTION_SOURCE_CHANGED";
   5806         case RIL_UNSOL_CDMA_PRL_CHANGED: return "UNSOL_CDMA_PRL_CHANGED";
   5807         case RIL_UNSOL_EXIT_EMERGENCY_CALLBACK_MODE: return "UNSOL_EXIT_EMERGENCY_CALLBACK_MODE";
   5808         case RIL_UNSOL_RIL_CONNECTED: return "UNSOL_RIL_CONNECTED";
   5809         case RIL_UNSOL_VOICE_RADIO_TECH_CHANGED: return "UNSOL_VOICE_RADIO_TECH_CHANGED";
   5810         case RIL_UNSOL_CELL_INFO_LIST: return "UNSOL_CELL_INFO_LIST";
   5811         case RIL_UNSOL_RESPONSE_IMS_NETWORK_STATE_CHANGED: return "RESPONSE_IMS_NETWORK_STATE_CHANGED";
   5812         case RIL_UNSOL_UICC_SUBSCRIPTION_STATUS_CHANGED: return "UNSOL_UICC_SUBSCRIPTION_STATUS_CHANGED";
   5813         case RIL_UNSOL_SRVCC_STATE_NOTIFY: return "UNSOL_SRVCC_STATE_NOTIFY";
   5814         case RIL_UNSOL_HARDWARE_CONFIG_CHANGED: return "HARDWARE_CONFIG_CHANGED";
   5815         case RIL_UNSOL_DC_RT_INFO_CHANGED: return "UNSOL_DC_RT_INFO_CHANGED";
   5816         case RIL_REQUEST_SHUTDOWN: return "SHUTDOWN";
   5817         case RIL_UNSOL_RADIO_CAPABILITY: return "RIL_UNSOL_RADIO_CAPABILITY";
   5818         case RIL_RESPONSE_ACKNOWLEDGEMENT: return "RIL_RESPONSE_ACKNOWLEDGEMENT";
   5819         case RIL_UNSOL_PCO_DATA: return "RIL_UNSOL_PCO_DATA";
   5820         default: return "<unknown request>";
   5821     }
   5822 }
   5823 
   5824 const char *
   5825 rilSocketIdToString(RIL_SOCKET_ID socket_id)
   5826 {
   5827     switch(socket_id) {
   5828         case RIL_SOCKET_1:
   5829             return "RIL_SOCKET_1";
   5830 #if (SIM_COUNT >= 2)
   5831         case RIL_SOCKET_2:
   5832             return "RIL_SOCKET_2";
   5833 #endif
   5834 #if (SIM_COUNT >= 3)
   5835         case RIL_SOCKET_3:
   5836             return "RIL_SOCKET_3";
   5837 #endif
   5838 #if (SIM_COUNT >= 4)
   5839         case RIL_SOCKET_4:
   5840             return "RIL_SOCKET_4";
   5841 #endif
   5842         default:
   5843             return "not a valid RIL";
   5844     }
   5845 }
   5846 
   5847 /*
   5848  * Returns true for a debuggable build.
   5849  */
   5850 static bool isDebuggable() {
   5851     char debuggable[PROP_VALUE_MAX];
   5852     property_get("ro.debuggable", debuggable, "0");
   5853     if (strcmp(debuggable, "1") == 0) {
   5854         return true;
   5855     }
   5856     return false;
   5857 }
   5858 
   5859 } /* namespace android */
   5860 
   5861 void rilEventAddWakeup_helper(struct ril_event *ev) {
   5862     android::rilEventAddWakeup(ev);
   5863 }
   5864 
   5865 void listenCallback_helper(int fd, short flags, void *param) {
   5866     android::listenCallback(fd, flags, param);
   5867 }
   5868 
   5869 int blockingWrite_helper(int fd, void *buffer, size_t len) {
   5870     return android::blockingWrite(fd, buffer, len);
   5871 }
   5872