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