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 
     22 #include <telephony/ril.h>
     23 #include <telephony/ril_cdma_sms.h>
     24 #include <cutils/sockets.h>
     25 #include <cutils/jstring.h>
     26 #include <telephony/record_stream.h>
     27 #include <utils/Log.h>
     28 #include <utils/SystemClock.h>
     29 #include <pthread.h>
     30 #include <binder/Parcel.h>
     31 #include <cutils/jstring.h>
     32 
     33 #include <sys/types.h>
     34 #include <sys/limits.h>
     35 #include <pwd.h>
     36 
     37 #include <stdio.h>
     38 #include <stdlib.h>
     39 #include <stdarg.h>
     40 #include <string.h>
     41 #include <unistd.h>
     42 #include <fcntl.h>
     43 #include <time.h>
     44 #include <errno.h>
     45 #include <assert.h>
     46 #include <ctype.h>
     47 #include <alloca.h>
     48 #include <sys/un.h>
     49 #include <assert.h>
     50 #include <netinet/in.h>
     51 #include <cutils/properties.h>
     52 
     53 #include <ril_event.h>
     54 
     55 namespace android {
     56 
     57 #define PHONE_PROCESS "radio"
     58 
     59 #define SOCKET_NAME_RIL "rild"
     60 #define SOCKET_NAME_RIL_DEBUG "rild-debug"
     61 
     62 #define ANDROID_WAKE_LOCK_NAME "radio-interface"
     63 
     64 
     65 #define PROPERTY_RIL_IMPL "gsm.version.ril-impl"
     66 
     67 // match with constant in RIL.java
     68 #define MAX_COMMAND_BYTES (8 * 1024)
     69 
     70 // Basically: memset buffers that the client library
     71 // shouldn't be using anymore in an attempt to find
     72 // memory usage issues sooner.
     73 #define MEMSET_FREED 1
     74 
     75 #define NUM_ELEMS(a)     (sizeof (a) / sizeof (a)[0])
     76 
     77 #define MIN(a,b) ((a)<(b) ? (a) : (b))
     78 
     79 /* Constants for response types */
     80 #define RESPONSE_SOLICITED 0
     81 #define RESPONSE_UNSOLICITED 1
     82 
     83 /* Negative values for private RIL errno's */
     84 #define RIL_ERRNO_INVALID_RESPONSE -1
     85 
     86 // request, response, and unsolicited msg print macro
     87 #define PRINTBUF_SIZE 8096
     88 
     89 // Enable RILC log
     90 #define RILC_LOG 0
     91 
     92 #if RILC_LOG
     93     #define startRequest           sprintf(printBuf, "(")
     94     #define closeRequest           sprintf(printBuf, "%s)", printBuf)
     95     #define printRequest(token, req)           \
     96             RLOGD("[%04d]> %s %s", token, requestToString(req), printBuf)
     97 
     98     #define startResponse           sprintf(printBuf, "%s {", printBuf)
     99     #define closeResponse           sprintf(printBuf, "%s}", printBuf)
    100     #define printResponse           RLOGD("%s", printBuf)
    101 
    102     #define clearPrintBuf           printBuf[0] = 0
    103     #define removeLastChar          printBuf[strlen(printBuf)-1] = 0
    104     #define appendPrintBuf(x...)    sprintf(printBuf, x)
    105 #else
    106     #define startRequest
    107     #define closeRequest
    108     #define printRequest(token, req)
    109     #define startResponse
    110     #define closeResponse
    111     #define printResponse
    112     #define clearPrintBuf
    113     #define removeLastChar
    114     #define appendPrintBuf(x...)
    115 #endif
    116 
    117 enum WakeType {DONT_WAKE, WAKE_PARTIAL};
    118 
    119 typedef struct {
    120     int requestNumber;
    121     void (*dispatchFunction) (Parcel &p, struct RequestInfo *pRI);
    122     int(*responseFunction) (Parcel &p, void *response, size_t responselen);
    123 } CommandInfo;
    124 
    125 typedef struct {
    126     int requestNumber;
    127     int (*responseFunction) (Parcel &p, void *response, size_t responselen);
    128     WakeType wakeType;
    129 } UnsolResponseInfo;
    130 
    131 typedef struct RequestInfo {
    132     int32_t token;      //this is not RIL_Token
    133     CommandInfo *pCI;
    134     struct RequestInfo *p_next;
    135     char cancelled;
    136     char local;         // responses to local commands do not go back to command process
    137 } RequestInfo;
    138 
    139 typedef struct UserCallbackInfo {
    140     RIL_TimedCallback p_callback;
    141     void *userParam;
    142     struct ril_event event;
    143     struct UserCallbackInfo *p_next;
    144 } UserCallbackInfo;
    145 
    146 
    147 /*******************************************************************/
    148 
    149 RIL_RadioFunctions s_callbacks = {0, NULL, NULL, NULL, NULL, NULL};
    150 static int s_registerCalled = 0;
    151 
    152 static pthread_t s_tid_dispatch;
    153 static pthread_t s_tid_reader;
    154 static int s_started = 0;
    155 
    156 static int s_fdListen = -1;
    157 static int s_fdCommand = -1;
    158 static int s_fdDebug = -1;
    159 
    160 static int s_fdWakeupRead;
    161 static int s_fdWakeupWrite;
    162 
    163 static struct ril_event s_commands_event;
    164 static struct ril_event s_wakeupfd_event;
    165 static struct ril_event s_listen_event;
    166 static struct ril_event s_wake_timeout_event;
    167 static struct ril_event s_debug_event;
    168 
    169 
    170 static const struct timeval TIMEVAL_WAKE_TIMEOUT = {1,0};
    171 
    172 static pthread_mutex_t s_pendingRequestsMutex = PTHREAD_MUTEX_INITIALIZER;
    173 static pthread_mutex_t s_writeMutex = PTHREAD_MUTEX_INITIALIZER;
    174 static pthread_mutex_t s_startupMutex = PTHREAD_MUTEX_INITIALIZER;
    175 static pthread_cond_t s_startupCond = PTHREAD_COND_INITIALIZER;
    176 
    177 static pthread_mutex_t s_dispatchMutex = PTHREAD_MUTEX_INITIALIZER;
    178 static pthread_cond_t s_dispatchCond = PTHREAD_COND_INITIALIZER;
    179 
    180 static RequestInfo *s_pendingRequests = NULL;
    181 
    182 static RequestInfo *s_toDispatchHead = NULL;
    183 static RequestInfo *s_toDispatchTail = NULL;
    184 
    185 static UserCallbackInfo *s_last_wake_timeout_info = NULL;
    186 
    187 static void *s_lastNITZTimeData = NULL;
    188 static size_t s_lastNITZTimeDataSize;
    189 
    190 #if RILC_LOG
    191     static char printBuf[PRINTBUF_SIZE];
    192 #endif
    193 
    194 /*******************************************************************/
    195 
    196 static void dispatchVoid (Parcel& p, RequestInfo *pRI);
    197 static void dispatchString (Parcel& p, RequestInfo *pRI);
    198 static void dispatchStrings (Parcel& p, RequestInfo *pRI);
    199 static void dispatchInts (Parcel& p, RequestInfo *pRI);
    200 static void dispatchDial (Parcel& p, RequestInfo *pRI);
    201 static void dispatchSIM_IO (Parcel& p, RequestInfo *pRI);
    202 static void dispatchCallForward(Parcel& p, RequestInfo *pRI);
    203 static void dispatchRaw(Parcel& p, RequestInfo *pRI);
    204 static void dispatchSmsWrite (Parcel &p, RequestInfo *pRI);
    205 static void dispatchDataCall (Parcel& p, RequestInfo *pRI);
    206 static void dispatchVoiceRadioTech (Parcel& p, RequestInfo *pRI);
    207 static void dispatchSetInitialAttachApn (Parcel& p, RequestInfo *pRI);
    208 static void dispatchCdmaSubscriptionSource (Parcel& p, RequestInfo *pRI);
    209 
    210 static void dispatchCdmaSms(Parcel &p, RequestInfo *pRI);
    211 static void dispatchImsSms(Parcel &p, RequestInfo *pRI);
    212 static void dispatchImsCdmaSms(Parcel &p, RequestInfo *pRI, uint8_t retry, int32_t messageRef);
    213 static void dispatchImsGsmSms(Parcel &p, RequestInfo *pRI, uint8_t retry, int32_t messageRef);
    214 static void dispatchCdmaSmsAck(Parcel &p, RequestInfo *pRI);
    215 static void dispatchGsmBrSmsCnf(Parcel &p, RequestInfo *pRI);
    216 static void dispatchCdmaBrSmsCnf(Parcel &p, RequestInfo *pRI);
    217 static void dispatchRilCdmaSmsWriteArgs(Parcel &p, RequestInfo *pRI);
    218 static int responseInts(Parcel &p, void *response, size_t responselen);
    219 static int responseStrings(Parcel &p, void *response, size_t responselen);
    220 static int responseString(Parcel &p, void *response, size_t responselen);
    221 static int responseVoid(Parcel &p, void *response, size_t responselen);
    222 static int responseCallList(Parcel &p, void *response, size_t responselen);
    223 static int responseSMS(Parcel &p, void *response, size_t responselen);
    224 static int responseSIM_IO(Parcel &p, void *response, size_t responselen);
    225 static int responseCallForwards(Parcel &p, void *response, size_t responselen);
    226 static int responseDataCallList(Parcel &p, void *response, size_t responselen);
    227 static int responseSetupDataCall(Parcel &p, void *response, size_t responselen);
    228 static int responseRaw(Parcel &p, void *response, size_t responselen);
    229 static int responseSsn(Parcel &p, void *response, size_t responselen);
    230 static int responseSimStatus(Parcel &p, void *response, size_t responselen);
    231 static int responseGsmBrSmsCnf(Parcel &p, void *response, size_t responselen);
    232 static int responseCdmaBrSmsCnf(Parcel &p, void *response, size_t responselen);
    233 static int responseCdmaSms(Parcel &p, void *response, size_t responselen);
    234 static int responseCellList(Parcel &p, void *response, size_t responselen);
    235 static int responseCdmaInformationRecords(Parcel &p,void *response, size_t responselen);
    236 static int responseRilSignalStrength(Parcel &p,void *response, size_t responselen);
    237 static int responseCallRing(Parcel &p, void *response, size_t responselen);
    238 static int responseCdmaSignalInfoRecord(Parcel &p,void *response, size_t responselen);
    239 static int responseCdmaCallWaiting(Parcel &p,void *response, size_t responselen);
    240 static int responseSimRefresh(Parcel &p, void *response, size_t responselen);
    241 static int responseCellInfoList(Parcel &p, void *response, size_t responselen);
    242 
    243 static int decodeVoiceRadioTechnology (RIL_RadioState radioState);
    244 static int decodeCdmaSubscriptionSource (RIL_RadioState radioState);
    245 static RIL_RadioState processRadioState(RIL_RadioState newRadioState);
    246 
    247 extern "C" const char * requestToString(int request);
    248 extern "C" const char * failCauseToString(RIL_Errno);
    249 extern "C" const char * callStateToString(RIL_CallState);
    250 extern "C" const char * radioStateToString(RIL_RadioState);
    251 
    252 #ifdef RIL_SHLIB
    253 extern "C" void RIL_onUnsolicitedResponse(int unsolResponse, void *data,
    254                                 size_t datalen);
    255 #endif
    256 
    257 static UserCallbackInfo * internalRequestTimedCallback
    258     (RIL_TimedCallback callback, void *param,
    259         const struct timeval *relativeTime);
    260 
    261 /** Index == requestNumber */
    262 static CommandInfo s_commands[] = {
    263 #include "ril_commands.h"
    264 };
    265 
    266 static UnsolResponseInfo s_unsolResponses[] = {
    267 #include "ril_unsol_commands.h"
    268 };
    269 
    270 /* For older RILs that do not support new commands RIL_REQUEST_VOICE_RADIO_TECH and
    271    RIL_UNSOL_VOICE_RADIO_TECH_CHANGED messages, decode the voice radio tech from
    272    radio state message and store it. Every time there is a change in Radio State
    273    check to see if voice radio tech changes and notify telephony
    274  */
    275 int voiceRadioTech = -1;
    276 
    277 /* For older RILs that do not support new commands RIL_REQUEST_GET_CDMA_SUBSCRIPTION_SOURCE
    278    and RIL_UNSOL_CDMA_SUBSCRIPTION_SOURCE_CHANGED messages, decode the subscription
    279    source from radio state and store it. Every time there is a change in Radio State
    280    check to see if subscription source changed and notify telephony
    281  */
    282 int cdmaSubscriptionSource = -1;
    283 
    284 /* For older RILs that do not send RIL_UNSOL_RESPONSE_SIM_STATUS_CHANGED, decode the
    285    SIM/RUIM state from radio state and store it. Every time there is a change in Radio State,
    286    check to see if SIM/RUIM status changed and notify telephony
    287  */
    288 int simRuimStatus = -1;
    289 
    290 static char *
    291 strdupReadString(Parcel &p) {
    292     size_t stringlen;
    293     const char16_t *s16;
    294 
    295     s16 = p.readString16Inplace(&stringlen);
    296 
    297     return strndup16to8(s16, stringlen);
    298 }
    299 
    300 static void writeStringToParcel(Parcel &p, const char *s) {
    301     char16_t *s16;
    302     size_t s16_len;
    303     s16 = strdup8to16(s, &s16_len);
    304     p.writeString16(s16, s16_len);
    305     free(s16);
    306 }
    307 
    308 
    309 static void
    310 memsetString (char *s) {
    311     if (s != NULL) {
    312         memset (s, 0, strlen(s));
    313     }
    314 }
    315 
    316 void   nullParcelReleaseFunction (const uint8_t* data, size_t dataSize,
    317                                     const size_t* objects, size_t objectsSize,
    318                                         void* cookie) {
    319     // do nothing -- the data reference lives longer than the Parcel object
    320 }
    321 
    322 /**
    323  * To be called from dispatch thread
    324  * Issue a single local request, ensuring that the response
    325  * is not sent back up to the command process
    326  */
    327 static void
    328 issueLocalRequest(int request, void *data, int len) {
    329     RequestInfo *pRI;
    330     int ret;
    331 
    332     pRI = (RequestInfo *)calloc(1, sizeof(RequestInfo));
    333 
    334     pRI->local = 1;
    335     pRI->token = 0xffffffff;        // token is not used in this context
    336     pRI->pCI = &(s_commands[request]);
    337 
    338     ret = pthread_mutex_lock(&s_pendingRequestsMutex);
    339     assert (ret == 0);
    340 
    341     pRI->p_next = s_pendingRequests;
    342     s_pendingRequests = pRI;
    343 
    344     ret = pthread_mutex_unlock(&s_pendingRequestsMutex);
    345     assert (ret == 0);
    346 
    347     RLOGD("C[locl]> %s", requestToString(request));
    348 
    349     s_callbacks.onRequest(request, data, len, pRI);
    350 }
    351 
    352 
    353 
    354 static int
    355 processCommandBuffer(void *buffer, size_t buflen) {
    356     Parcel p;
    357     status_t status;
    358     int32_t request;
    359     int32_t token;
    360     RequestInfo *pRI;
    361     int ret;
    362 
    363     p.setData((uint8_t *) buffer, buflen);
    364 
    365     // status checked at end
    366     status = p.readInt32(&request);
    367     status = p.readInt32 (&token);
    368 
    369     if (status != NO_ERROR) {
    370         RLOGE("invalid request block");
    371         return 0;
    372     }
    373 
    374     if (request < 1 || request >= (int32_t)NUM_ELEMS(s_commands)) {
    375         RLOGE("unsupported request code %d token %d", request, token);
    376         // FIXME this should perhaps return a response
    377         return 0;
    378     }
    379 
    380 
    381     pRI = (RequestInfo *)calloc(1, sizeof(RequestInfo));
    382 
    383     pRI->token = token;
    384     pRI->pCI = &(s_commands[request]);
    385 
    386     ret = pthread_mutex_lock(&s_pendingRequestsMutex);
    387     assert (ret == 0);
    388 
    389     pRI->p_next = s_pendingRequests;
    390     s_pendingRequests = pRI;
    391 
    392     ret = pthread_mutex_unlock(&s_pendingRequestsMutex);
    393     assert (ret == 0);
    394 
    395 /*    sLastDispatchedToken = token; */
    396 
    397     pRI->pCI->dispatchFunction(p, pRI);
    398 
    399     return 0;
    400 }
    401 
    402 static void
    403 invalidCommandBlock (RequestInfo *pRI) {
    404     RLOGE("invalid command block for token %d request %s",
    405                 pRI->token, requestToString(pRI->pCI->requestNumber));
    406 }
    407 
    408 /** Callee expects NULL */
    409 static void
    410 dispatchVoid (Parcel& p, RequestInfo *pRI) {
    411     clearPrintBuf;
    412     printRequest(pRI->token, pRI->pCI->requestNumber);
    413     s_callbacks.onRequest(pRI->pCI->requestNumber, NULL, 0, pRI);
    414 }
    415 
    416 /** Callee expects const char * */
    417 static void
    418 dispatchString (Parcel& p, RequestInfo *pRI) {
    419     status_t status;
    420     size_t datalen;
    421     size_t stringlen;
    422     char *string8 = NULL;
    423 
    424     string8 = strdupReadString(p);
    425 
    426     startRequest;
    427     appendPrintBuf("%s%s", printBuf, string8);
    428     closeRequest;
    429     printRequest(pRI->token, pRI->pCI->requestNumber);
    430 
    431     s_callbacks.onRequest(pRI->pCI->requestNumber, string8,
    432                        sizeof(char *), pRI);
    433 
    434 #ifdef MEMSET_FREED
    435     memsetString(string8);
    436 #endif
    437 
    438     free(string8);
    439     return;
    440 invalid:
    441     invalidCommandBlock(pRI);
    442     return;
    443 }
    444 
    445 /** Callee expects const char ** */
    446 static void
    447 dispatchStrings (Parcel &p, RequestInfo *pRI) {
    448     int32_t countStrings;
    449     status_t status;
    450     size_t datalen;
    451     char **pStrings;
    452 
    453     status = p.readInt32 (&countStrings);
    454 
    455     if (status != NO_ERROR) {
    456         goto invalid;
    457     }
    458 
    459     startRequest;
    460     if (countStrings == 0) {
    461         // just some non-null pointer
    462         pStrings = (char **)alloca(sizeof(char *));
    463         datalen = 0;
    464     } else if (((int)countStrings) == -1) {
    465         pStrings = NULL;
    466         datalen = 0;
    467     } else {
    468         datalen = sizeof(char *) * countStrings;
    469 
    470         pStrings = (char **)alloca(datalen);
    471 
    472         for (int i = 0 ; i < countStrings ; i++) {
    473             pStrings[i] = strdupReadString(p);
    474             appendPrintBuf("%s%s,", printBuf, pStrings[i]);
    475         }
    476     }
    477     removeLastChar;
    478     closeRequest;
    479     printRequest(pRI->token, pRI->pCI->requestNumber);
    480 
    481     s_callbacks.onRequest(pRI->pCI->requestNumber, pStrings, datalen, pRI);
    482 
    483     if (pStrings != NULL) {
    484         for (int i = 0 ; i < countStrings ; i++) {
    485 #ifdef MEMSET_FREED
    486             memsetString (pStrings[i]);
    487 #endif
    488             free(pStrings[i]);
    489         }
    490 
    491 #ifdef MEMSET_FREED
    492         memset(pStrings, 0, datalen);
    493 #endif
    494     }
    495 
    496     return;
    497 invalid:
    498     invalidCommandBlock(pRI);
    499     return;
    500 }
    501 
    502 /** Callee expects const int * */
    503 static void
    504 dispatchInts (Parcel &p, RequestInfo *pRI) {
    505     int32_t count;
    506     status_t status;
    507     size_t datalen;
    508     int *pInts;
    509 
    510     status = p.readInt32 (&count);
    511 
    512     if (status != NO_ERROR || count == 0) {
    513         goto invalid;
    514     }
    515 
    516     datalen = sizeof(int) * count;
    517     pInts = (int *)alloca(datalen);
    518 
    519     startRequest;
    520     for (int i = 0 ; i < count ; i++) {
    521         int32_t t;
    522 
    523         status = p.readInt32(&t);
    524         pInts[i] = (int)t;
    525         appendPrintBuf("%s%d,", printBuf, t);
    526 
    527         if (status != NO_ERROR) {
    528             goto invalid;
    529         }
    530    }
    531    removeLastChar;
    532    closeRequest;
    533    printRequest(pRI->token, pRI->pCI->requestNumber);
    534 
    535    s_callbacks.onRequest(pRI->pCI->requestNumber, const_cast<int *>(pInts),
    536                        datalen, pRI);
    537 
    538 #ifdef MEMSET_FREED
    539     memset(pInts, 0, datalen);
    540 #endif
    541 
    542     return;
    543 invalid:
    544     invalidCommandBlock(pRI);
    545     return;
    546 }
    547 
    548 
    549 /**
    550  * Callee expects const RIL_SMS_WriteArgs *
    551  * Payload is:
    552  *   int32_t status
    553  *   String pdu
    554  */
    555 static void
    556 dispatchSmsWrite (Parcel &p, RequestInfo *pRI) {
    557     RIL_SMS_WriteArgs args;
    558     int32_t t;
    559     status_t status;
    560 
    561     memset (&args, 0, sizeof(args));
    562 
    563     status = p.readInt32(&t);
    564     args.status = (int)t;
    565 
    566     args.pdu = strdupReadString(p);
    567 
    568     if (status != NO_ERROR || args.pdu == NULL) {
    569         goto invalid;
    570     }
    571 
    572     args.smsc = strdupReadString(p);
    573 
    574     startRequest;
    575     appendPrintBuf("%s%d,%s,smsc=%s", printBuf, args.status,
    576         (char*)args.pdu,  (char*)args.smsc);
    577     closeRequest;
    578     printRequest(pRI->token, pRI->pCI->requestNumber);
    579 
    580     s_callbacks.onRequest(pRI->pCI->requestNumber, &args, sizeof(args), pRI);
    581 
    582 #ifdef MEMSET_FREED
    583     memsetString (args.pdu);
    584 #endif
    585 
    586     free (args.pdu);
    587 
    588 #ifdef MEMSET_FREED
    589     memset(&args, 0, sizeof(args));
    590 #endif
    591 
    592     return;
    593 invalid:
    594     invalidCommandBlock(pRI);
    595     return;
    596 }
    597 
    598 /**
    599  * Callee expects const RIL_Dial *
    600  * Payload is:
    601  *   String address
    602  *   int32_t clir
    603  */
    604 static void
    605 dispatchDial (Parcel &p, RequestInfo *pRI) {
    606     RIL_Dial dial;
    607     RIL_UUS_Info uusInfo;
    608     int32_t sizeOfDial;
    609     int32_t t;
    610     int32_t uusPresent;
    611     status_t status;
    612 
    613     memset (&dial, 0, sizeof(dial));
    614 
    615     dial.address = strdupReadString(p);
    616 
    617     status = p.readInt32(&t);
    618     dial.clir = (int)t;
    619 
    620     if (status != NO_ERROR || dial.address == NULL) {
    621         goto invalid;
    622     }
    623 
    624     if (s_callbacks.version < 3) { // Remove when partners upgrade to version 3
    625         uusPresent = 0;
    626         sizeOfDial = sizeof(dial) - sizeof(RIL_UUS_Info *);
    627     } else {
    628         status = p.readInt32(&uusPresent);
    629 
    630         if (status != NO_ERROR) {
    631             goto invalid;
    632         }
    633 
    634         if (uusPresent == 0) {
    635             dial.uusInfo = NULL;
    636         } else {
    637             int32_t len;
    638 
    639             memset(&uusInfo, 0, sizeof(RIL_UUS_Info));
    640 
    641             status = p.readInt32(&t);
    642             uusInfo.uusType = (RIL_UUS_Type) t;
    643 
    644             status = p.readInt32(&t);
    645             uusInfo.uusDcs = (RIL_UUS_DCS) t;
    646 
    647             status = p.readInt32(&len);
    648             if (status != NO_ERROR) {
    649                 goto invalid;
    650             }
    651 
    652             // The java code writes -1 for null arrays
    653             if (((int) len) == -1) {
    654                 uusInfo.uusData = NULL;
    655                 len = 0;
    656             } else {
    657                 uusInfo.uusData = (char*) p.readInplace(len);
    658             }
    659 
    660             uusInfo.uusLength = len;
    661             dial.uusInfo = &uusInfo;
    662         }
    663         sizeOfDial = sizeof(dial);
    664     }
    665 
    666     startRequest;
    667     appendPrintBuf("%snum=%s,clir=%d", printBuf, dial.address, dial.clir);
    668     if (uusPresent) {
    669         appendPrintBuf("%s,uusType=%d,uusDcs=%d,uusLen=%d", printBuf,
    670                 dial.uusInfo->uusType, dial.uusInfo->uusDcs,
    671                 dial.uusInfo->uusLength);
    672     }
    673     closeRequest;
    674     printRequest(pRI->token, pRI->pCI->requestNumber);
    675 
    676     s_callbacks.onRequest(pRI->pCI->requestNumber, &dial, sizeOfDial, pRI);
    677 
    678 #ifdef MEMSET_FREED
    679     memsetString (dial.address);
    680 #endif
    681 
    682     free (dial.address);
    683 
    684 #ifdef MEMSET_FREED
    685     memset(&uusInfo, 0, sizeof(RIL_UUS_Info));
    686     memset(&dial, 0, sizeof(dial));
    687 #endif
    688 
    689     return;
    690 invalid:
    691     invalidCommandBlock(pRI);
    692     return;
    693 }
    694 
    695 /**
    696  * Callee expects const RIL_SIM_IO *
    697  * Payload is:
    698  *   int32_t command
    699  *   int32_t fileid
    700  *   String path
    701  *   int32_t p1, p2, p3
    702  *   String data
    703  *   String pin2
    704  *   String aidPtr
    705  */
    706 static void
    707 dispatchSIM_IO (Parcel &p, RequestInfo *pRI) {
    708     union RIL_SIM_IO {
    709         RIL_SIM_IO_v6 v6;
    710         RIL_SIM_IO_v5 v5;
    711     } simIO;
    712 
    713     int32_t t;
    714     int size;
    715     status_t status;
    716 
    717     memset (&simIO, 0, sizeof(simIO));
    718 
    719     // note we only check status at the end
    720 
    721     status = p.readInt32(&t);
    722     simIO.v6.command = (int)t;
    723 
    724     status = p.readInt32(&t);
    725     simIO.v6.fileid = (int)t;
    726 
    727     simIO.v6.path = strdupReadString(p);
    728 
    729     status = p.readInt32(&t);
    730     simIO.v6.p1 = (int)t;
    731 
    732     status = p.readInt32(&t);
    733     simIO.v6.p2 = (int)t;
    734 
    735     status = p.readInt32(&t);
    736     simIO.v6.p3 = (int)t;
    737 
    738     simIO.v6.data = strdupReadString(p);
    739     simIO.v6.pin2 = strdupReadString(p);
    740     simIO.v6.aidPtr = strdupReadString(p);
    741 
    742     startRequest;
    743     appendPrintBuf("%scmd=0x%X,efid=0x%X,path=%s,%d,%d,%d,%s,pin2=%s,aid=%s", printBuf,
    744         simIO.v6.command, simIO.v6.fileid, (char*)simIO.v6.path,
    745         simIO.v6.p1, simIO.v6.p2, simIO.v6.p3,
    746         (char*)simIO.v6.data,  (char*)simIO.v6.pin2, simIO.v6.aidPtr);
    747     closeRequest;
    748     printRequest(pRI->token, pRI->pCI->requestNumber);
    749 
    750     if (status != NO_ERROR) {
    751         goto invalid;
    752     }
    753 
    754     size = (s_callbacks.version < 6) ? sizeof(simIO.v5) : sizeof(simIO.v6);
    755     s_callbacks.onRequest(pRI->pCI->requestNumber, &simIO, size, pRI);
    756 
    757 #ifdef MEMSET_FREED
    758     memsetString (simIO.v6.path);
    759     memsetString (simIO.v6.data);
    760     memsetString (simIO.v6.pin2);
    761     memsetString (simIO.v6.aidPtr);
    762 #endif
    763 
    764     free (simIO.v6.path);
    765     free (simIO.v6.data);
    766     free (simIO.v6.pin2);
    767     free (simIO.v6.aidPtr);
    768 
    769 #ifdef MEMSET_FREED
    770     memset(&simIO, 0, sizeof(simIO));
    771 #endif
    772 
    773     return;
    774 invalid:
    775     invalidCommandBlock(pRI);
    776     return;
    777 }
    778 
    779 /**
    780  * Callee expects const RIL_CallForwardInfo *
    781  * Payload is:
    782  *  int32_t status/action
    783  *  int32_t reason
    784  *  int32_t serviceCode
    785  *  int32_t toa
    786  *  String number  (0 length -> null)
    787  *  int32_t timeSeconds
    788  */
    789 static void
    790 dispatchCallForward(Parcel &p, RequestInfo *pRI) {
    791     RIL_CallForwardInfo cff;
    792     int32_t t;
    793     status_t status;
    794 
    795     memset (&cff, 0, sizeof(cff));
    796 
    797     // note we only check status at the end
    798 
    799     status = p.readInt32(&t);
    800     cff.status = (int)t;
    801 
    802     status = p.readInt32(&t);
    803     cff.reason = (int)t;
    804 
    805     status = p.readInt32(&t);
    806     cff.serviceClass = (int)t;
    807 
    808     status = p.readInt32(&t);
    809     cff.toa = (int)t;
    810 
    811     cff.number = strdupReadString(p);
    812 
    813     status = p.readInt32(&t);
    814     cff.timeSeconds = (int)t;
    815 
    816     if (status != NO_ERROR) {
    817         goto invalid;
    818     }
    819 
    820     // special case: number 0-length fields is null
    821 
    822     if (cff.number != NULL && strlen (cff.number) == 0) {
    823         cff.number = NULL;
    824     }
    825 
    826     startRequest;
    827     appendPrintBuf("%sstat=%d,reason=%d,serv=%d,toa=%d,%s,tout=%d", printBuf,
    828         cff.status, cff.reason, cff.serviceClass, cff.toa,
    829         (char*)cff.number, cff.timeSeconds);
    830     closeRequest;
    831     printRequest(pRI->token, pRI->pCI->requestNumber);
    832 
    833     s_callbacks.onRequest(pRI->pCI->requestNumber, &cff, sizeof(cff), pRI);
    834 
    835 #ifdef MEMSET_FREED
    836     memsetString(cff.number);
    837 #endif
    838 
    839     free (cff.number);
    840 
    841 #ifdef MEMSET_FREED
    842     memset(&cff, 0, sizeof(cff));
    843 #endif
    844 
    845     return;
    846 invalid:
    847     invalidCommandBlock(pRI);
    848     return;
    849 }
    850 
    851 
    852 static void
    853 dispatchRaw(Parcel &p, RequestInfo *pRI) {
    854     int32_t len;
    855     status_t status;
    856     const void *data;
    857 
    858     status = p.readInt32(&len);
    859 
    860     if (status != NO_ERROR) {
    861         goto invalid;
    862     }
    863 
    864     // The java code writes -1 for null arrays
    865     if (((int)len) == -1) {
    866         data = NULL;
    867         len = 0;
    868     }
    869 
    870     data = p.readInplace(len);
    871 
    872     startRequest;
    873     appendPrintBuf("%sraw_size=%d", printBuf, len);
    874     closeRequest;
    875     printRequest(pRI->token, pRI->pCI->requestNumber);
    876 
    877     s_callbacks.onRequest(pRI->pCI->requestNumber, const_cast<void *>(data), len, pRI);
    878 
    879     return;
    880 invalid:
    881     invalidCommandBlock(pRI);
    882     return;
    883 }
    884 
    885 static status_t
    886 constructCdmaSms(Parcel &p, RequestInfo *pRI, RIL_CDMA_SMS_Message& rcsm) {
    887     int32_t  t;
    888     uint8_t ut;
    889     status_t status;
    890     int32_t digitCount;
    891     int digitLimit;
    892 
    893     memset(&rcsm, 0, sizeof(rcsm));
    894 
    895     status = p.readInt32(&t);
    896     rcsm.uTeleserviceID = (int) t;
    897 
    898     status = p.read(&ut,sizeof(ut));
    899     rcsm.bIsServicePresent = (uint8_t) ut;
    900 
    901     status = p.readInt32(&t);
    902     rcsm.uServicecategory = (int) t;
    903 
    904     status = p.readInt32(&t);
    905     rcsm.sAddress.digit_mode = (RIL_CDMA_SMS_DigitMode) t;
    906 
    907     status = p.readInt32(&t);
    908     rcsm.sAddress.number_mode = (RIL_CDMA_SMS_NumberMode) t;
    909 
    910     status = p.readInt32(&t);
    911     rcsm.sAddress.number_type = (RIL_CDMA_SMS_NumberType) t;
    912 
    913     status = p.readInt32(&t);
    914     rcsm.sAddress.number_plan = (RIL_CDMA_SMS_NumberPlan) t;
    915 
    916     status = p.read(&ut,sizeof(ut));
    917     rcsm.sAddress.number_of_digits= (uint8_t) ut;
    918 
    919     digitLimit= MIN((rcsm.sAddress.number_of_digits), RIL_CDMA_SMS_ADDRESS_MAX);
    920     for(digitCount =0 ; digitCount < digitLimit; digitCount ++) {
    921         status = p.read(&ut,sizeof(ut));
    922         rcsm.sAddress.digits[digitCount] = (uint8_t) ut;
    923     }
    924 
    925     status = p.readInt32(&t);
    926     rcsm.sSubAddress.subaddressType = (RIL_CDMA_SMS_SubaddressType) t;
    927 
    928     status = p.read(&ut,sizeof(ut));
    929     rcsm.sSubAddress.odd = (uint8_t) ut;
    930 
    931     status = p.read(&ut,sizeof(ut));
    932     rcsm.sSubAddress.number_of_digits = (uint8_t) ut;
    933 
    934     digitLimit= MIN((rcsm.sSubAddress.number_of_digits), RIL_CDMA_SMS_SUBADDRESS_MAX);
    935     for(digitCount =0 ; digitCount < digitLimit; digitCount ++) {
    936         status = p.read(&ut,sizeof(ut));
    937         rcsm.sSubAddress.digits[digitCount] = (uint8_t) ut;
    938     }
    939 
    940     status = p.readInt32(&t);
    941     rcsm.uBearerDataLen = (int) t;
    942 
    943     digitLimit= MIN((rcsm.uBearerDataLen), RIL_CDMA_SMS_BEARER_DATA_MAX);
    944     for(digitCount =0 ; digitCount < digitLimit; digitCount ++) {
    945         status = p.read(&ut, sizeof(ut));
    946         rcsm.aBearerData[digitCount] = (uint8_t) ut;
    947     }
    948 
    949     if (status != NO_ERROR) {
    950         return status;
    951     }
    952 
    953     startRequest;
    954     appendPrintBuf("%suTeleserviceID=%d, bIsServicePresent=%d, uServicecategory=%d, \
    955             sAddress.digit_mode=%d, sAddress.Number_mode=%d, sAddress.number_type=%d, ",
    956             printBuf, rcsm.uTeleserviceID,rcsm.bIsServicePresent,rcsm.uServicecategory,
    957             rcsm.sAddress.digit_mode, rcsm.sAddress.number_mode,rcsm.sAddress.number_type);
    958     closeRequest;
    959 
    960     printRequest(pRI->token, pRI->pCI->requestNumber);
    961 
    962     return status;
    963 }
    964 
    965 static void
    966 dispatchCdmaSms(Parcel &p, RequestInfo *pRI) {
    967     RIL_CDMA_SMS_Message rcsm;
    968 
    969     ALOGD("dispatchCdmaSms");
    970     if (NO_ERROR != constructCdmaSms(p, pRI, rcsm)) {
    971         goto invalid;
    972     }
    973 
    974     s_callbacks.onRequest(pRI->pCI->requestNumber, &rcsm, sizeof(rcsm),pRI);
    975 
    976 #ifdef MEMSET_FREED
    977     memset(&rcsm, 0, sizeof(rcsm));
    978 #endif
    979 
    980     return;
    981 
    982 invalid:
    983     invalidCommandBlock(pRI);
    984     return;
    985 }
    986 
    987 static void
    988 dispatchImsCdmaSms(Parcel &p, RequestInfo *pRI, uint8_t retry, int32_t messageRef) {
    989     RIL_IMS_SMS_Message rism;
    990     RIL_CDMA_SMS_Message rcsm;
    991 
    992     ALOGD("dispatchImsCdmaSms: retry=%d, messageRef=%d", retry, messageRef);
    993 
    994     if (NO_ERROR != constructCdmaSms(p, pRI, rcsm)) {
    995         goto invalid;
    996     }
    997     memset(&rism, 0, sizeof(rism));
    998     rism.tech = RADIO_TECH_3GPP2;
    999     rism.retry = retry;
   1000     rism.messageRef = messageRef;
   1001     rism.message.cdmaMessage = &rcsm;
   1002 
   1003     s_callbacks.onRequest(pRI->pCI->requestNumber, &rism,
   1004             sizeof(RIL_RadioTechnologyFamily)+sizeof(uint8_t)+sizeof(int32_t)
   1005             +sizeof(rcsm),pRI);
   1006 
   1007 #ifdef MEMSET_FREED
   1008     memset(&rcsm, 0, sizeof(rcsm));
   1009     memset(&rism, 0, sizeof(rism));
   1010 #endif
   1011 
   1012     return;
   1013 
   1014 invalid:
   1015     invalidCommandBlock(pRI);
   1016     return;
   1017 }
   1018 
   1019 static void
   1020 dispatchImsGsmSms(Parcel &p, RequestInfo *pRI, uint8_t retry, int32_t messageRef) {
   1021     RIL_IMS_SMS_Message rism;
   1022     int32_t countStrings;
   1023     status_t status;
   1024     size_t datalen;
   1025     char **pStrings;
   1026     ALOGD("dispatchImsGsmSms: retry=%d, messageRef=%d", retry, messageRef);
   1027 
   1028     status = p.readInt32 (&countStrings);
   1029 
   1030     if (status != NO_ERROR) {
   1031         goto invalid;
   1032     }
   1033 
   1034     memset(&rism, 0, sizeof(rism));
   1035     rism.tech = RADIO_TECH_3GPP;
   1036     rism.retry = retry;
   1037     rism.messageRef = messageRef;
   1038 
   1039     startRequest;
   1040     appendPrintBuf("%sformat=%d,", printBuf, rism.format);
   1041     if (countStrings == 0) {
   1042         // just some non-null pointer
   1043         pStrings = (char **)alloca(sizeof(char *));
   1044         datalen = 0;
   1045     } else if (((int)countStrings) == -1) {
   1046         pStrings = NULL;
   1047         datalen = 0;
   1048     } else {
   1049         datalen = sizeof(char *) * countStrings;
   1050 
   1051         pStrings = (char **)alloca(datalen);
   1052 
   1053         for (int i = 0 ; i < countStrings ; i++) {
   1054             pStrings[i] = strdupReadString(p);
   1055             appendPrintBuf("%s%s,", printBuf, pStrings[i]);
   1056         }
   1057     }
   1058     removeLastChar;
   1059     closeRequest;
   1060     printRequest(pRI->token, pRI->pCI->requestNumber);
   1061 
   1062     rism.message.gsmMessage = pStrings;
   1063     s_callbacks.onRequest(pRI->pCI->requestNumber, &rism,
   1064             sizeof(RIL_RadioTechnologyFamily)+sizeof(uint8_t)+sizeof(int32_t)
   1065             +datalen, pRI);
   1066 
   1067     if (pStrings != NULL) {
   1068         for (int i = 0 ; i < countStrings ; i++) {
   1069 #ifdef MEMSET_FREED
   1070             memsetString (pStrings[i]);
   1071 #endif
   1072             free(pStrings[i]);
   1073         }
   1074 
   1075 #ifdef MEMSET_FREED
   1076         memset(pStrings, 0, datalen);
   1077 #endif
   1078     }
   1079 
   1080 #ifdef MEMSET_FREED
   1081     memset(&rism, 0, sizeof(rism));
   1082 #endif
   1083     return;
   1084 invalid:
   1085     ALOGE("dispatchImsGsmSms invalid block");
   1086     invalidCommandBlock(pRI);
   1087     return;
   1088 }
   1089 
   1090 static void
   1091 dispatchImsSms(Parcel &p, RequestInfo *pRI) {
   1092     int32_t  t;
   1093     status_t status = p.readInt32(&t);
   1094     RIL_RadioTechnologyFamily format;
   1095     uint8_t retry;
   1096     int32_t messageRef;
   1097 
   1098     ALOGD("dispatchImsSms");
   1099     if (status != NO_ERROR) {
   1100         goto invalid;
   1101     }
   1102     format = (RIL_RadioTechnologyFamily) t;
   1103 
   1104     // read retry field
   1105     status = p.read(&retry,sizeof(retry));
   1106     if (status != NO_ERROR) {
   1107         goto invalid;
   1108     }
   1109     // read messageRef field
   1110     status = p.read(&messageRef,sizeof(messageRef));
   1111     if (status != NO_ERROR) {
   1112         goto invalid;
   1113     }
   1114 
   1115     if (RADIO_TECH_3GPP == format) {
   1116         dispatchImsGsmSms(p, pRI, retry, messageRef);
   1117     } else if (RADIO_TECH_3GPP2 == format) {
   1118         dispatchImsCdmaSms(p, pRI, retry, messageRef);
   1119     } else {
   1120         ALOGE("requestImsSendSMS invalid format value =%d", format);
   1121     }
   1122 
   1123     return;
   1124 
   1125 invalid:
   1126     invalidCommandBlock(pRI);
   1127     return;
   1128 }
   1129 
   1130 static void
   1131 dispatchCdmaSmsAck(Parcel &p, RequestInfo *pRI) {
   1132     RIL_CDMA_SMS_Ack rcsa;
   1133     int32_t  t;
   1134     status_t status;
   1135     int32_t digitCount;
   1136 
   1137     memset(&rcsa, 0, sizeof(rcsa));
   1138 
   1139     status = p.readInt32(&t);
   1140     rcsa.uErrorClass = (RIL_CDMA_SMS_ErrorClass) t;
   1141 
   1142     status = p.readInt32(&t);
   1143     rcsa.uSMSCauseCode = (int) t;
   1144 
   1145     if (status != NO_ERROR) {
   1146         goto invalid;
   1147     }
   1148 
   1149     startRequest;
   1150     appendPrintBuf("%suErrorClass=%d, uTLStatus=%d, ",
   1151             printBuf, rcsa.uErrorClass, rcsa.uSMSCauseCode);
   1152     closeRequest;
   1153 
   1154     printRequest(pRI->token, pRI->pCI->requestNumber);
   1155 
   1156     s_callbacks.onRequest(pRI->pCI->requestNumber, &rcsa, sizeof(rcsa),pRI);
   1157 
   1158 #ifdef MEMSET_FREED
   1159     memset(&rcsa, 0, sizeof(rcsa));
   1160 #endif
   1161 
   1162     return;
   1163 
   1164 invalid:
   1165     invalidCommandBlock(pRI);
   1166     return;
   1167 }
   1168 
   1169 static void
   1170 dispatchGsmBrSmsCnf(Parcel &p, RequestInfo *pRI) {
   1171     int32_t t;
   1172     status_t status;
   1173     int32_t num;
   1174 
   1175     status = p.readInt32(&num);
   1176     if (status != NO_ERROR) {
   1177         goto invalid;
   1178     }
   1179 
   1180     {
   1181         RIL_GSM_BroadcastSmsConfigInfo gsmBci[num];
   1182         RIL_GSM_BroadcastSmsConfigInfo *gsmBciPtrs[num];
   1183 
   1184         startRequest;
   1185         for (int i = 0 ; i < num ; i++ ) {
   1186             gsmBciPtrs[i] = &gsmBci[i];
   1187 
   1188             status = p.readInt32(&t);
   1189             gsmBci[i].fromServiceId = (int) t;
   1190 
   1191             status = p.readInt32(&t);
   1192             gsmBci[i].toServiceId = (int) t;
   1193 
   1194             status = p.readInt32(&t);
   1195             gsmBci[i].fromCodeScheme = (int) t;
   1196 
   1197             status = p.readInt32(&t);
   1198             gsmBci[i].toCodeScheme = (int) t;
   1199 
   1200             status = p.readInt32(&t);
   1201             gsmBci[i].selected = (uint8_t) t;
   1202 
   1203             appendPrintBuf("%s [%d: fromServiceId=%d, toServiceId =%d, \
   1204                   fromCodeScheme=%d, toCodeScheme=%d, selected =%d]", printBuf, i,
   1205                   gsmBci[i].fromServiceId, gsmBci[i].toServiceId,
   1206                   gsmBci[i].fromCodeScheme, gsmBci[i].toCodeScheme,
   1207                   gsmBci[i].selected);
   1208         }
   1209         closeRequest;
   1210 
   1211         if (status != NO_ERROR) {
   1212             goto invalid;
   1213         }
   1214 
   1215         s_callbacks.onRequest(pRI->pCI->requestNumber,
   1216                               gsmBciPtrs,
   1217                               num * sizeof(RIL_GSM_BroadcastSmsConfigInfo *),
   1218                               pRI);
   1219 
   1220 #ifdef MEMSET_FREED
   1221         memset(gsmBci, 0, num * sizeof(RIL_GSM_BroadcastSmsConfigInfo));
   1222         memset(gsmBciPtrs, 0, num * sizeof(RIL_GSM_BroadcastSmsConfigInfo *));
   1223 #endif
   1224     }
   1225 
   1226     return;
   1227 
   1228 invalid:
   1229     invalidCommandBlock(pRI);
   1230     return;
   1231 }
   1232 
   1233 static void
   1234 dispatchCdmaBrSmsCnf(Parcel &p, RequestInfo *pRI) {
   1235     int32_t t;
   1236     status_t status;
   1237     int32_t num;
   1238 
   1239     status = p.readInt32(&num);
   1240     if (status != NO_ERROR) {
   1241         goto invalid;
   1242     }
   1243 
   1244     {
   1245         RIL_CDMA_BroadcastSmsConfigInfo cdmaBci[num];
   1246         RIL_CDMA_BroadcastSmsConfigInfo *cdmaBciPtrs[num];
   1247 
   1248         startRequest;
   1249         for (int i = 0 ; i < num ; i++ ) {
   1250             cdmaBciPtrs[i] = &cdmaBci[i];
   1251 
   1252             status = p.readInt32(&t);
   1253             cdmaBci[i].service_category = (int) t;
   1254 
   1255             status = p.readInt32(&t);
   1256             cdmaBci[i].language = (int) t;
   1257 
   1258             status = p.readInt32(&t);
   1259             cdmaBci[i].selected = (uint8_t) t;
   1260 
   1261             appendPrintBuf("%s [%d: service_category=%d, language =%d, \
   1262                   entries.bSelected =%d]", printBuf, i, cdmaBci[i].service_category,
   1263                   cdmaBci[i].language, cdmaBci[i].selected);
   1264         }
   1265         closeRequest;
   1266 
   1267         if (status != NO_ERROR) {
   1268             goto invalid;
   1269         }
   1270 
   1271         s_callbacks.onRequest(pRI->pCI->requestNumber,
   1272                               cdmaBciPtrs,
   1273                               num * sizeof(RIL_CDMA_BroadcastSmsConfigInfo *),
   1274                               pRI);
   1275 
   1276 #ifdef MEMSET_FREED
   1277         memset(cdmaBci, 0, num * sizeof(RIL_CDMA_BroadcastSmsConfigInfo));
   1278         memset(cdmaBciPtrs, 0, num * sizeof(RIL_CDMA_BroadcastSmsConfigInfo *));
   1279 #endif
   1280     }
   1281 
   1282     return;
   1283 
   1284 invalid:
   1285     invalidCommandBlock(pRI);
   1286     return;
   1287 }
   1288 
   1289 static void dispatchRilCdmaSmsWriteArgs(Parcel &p, RequestInfo *pRI) {
   1290     RIL_CDMA_SMS_WriteArgs rcsw;
   1291     int32_t  t;
   1292     uint32_t ut;
   1293     uint8_t  uct;
   1294     status_t status;
   1295     int32_t  digitCount;
   1296 
   1297     memset(&rcsw, 0, sizeof(rcsw));
   1298 
   1299     status = p.readInt32(&t);
   1300     rcsw.status = t;
   1301 
   1302     status = p.readInt32(&t);
   1303     rcsw.message.uTeleserviceID = (int) t;
   1304 
   1305     status = p.read(&uct,sizeof(uct));
   1306     rcsw.message.bIsServicePresent = (uint8_t) uct;
   1307 
   1308     status = p.readInt32(&t);
   1309     rcsw.message.uServicecategory = (int) t;
   1310 
   1311     status = p.readInt32(&t);
   1312     rcsw.message.sAddress.digit_mode = (RIL_CDMA_SMS_DigitMode) t;
   1313 
   1314     status = p.readInt32(&t);
   1315     rcsw.message.sAddress.number_mode = (RIL_CDMA_SMS_NumberMode) t;
   1316 
   1317     status = p.readInt32(&t);
   1318     rcsw.message.sAddress.number_type = (RIL_CDMA_SMS_NumberType) t;
   1319 
   1320     status = p.readInt32(&t);
   1321     rcsw.message.sAddress.number_plan = (RIL_CDMA_SMS_NumberPlan) t;
   1322 
   1323     status = p.read(&uct,sizeof(uct));
   1324     rcsw.message.sAddress.number_of_digits = (uint8_t) uct;
   1325 
   1326     for(digitCount = 0 ; digitCount < RIL_CDMA_SMS_ADDRESS_MAX; digitCount ++) {
   1327         status = p.read(&uct,sizeof(uct));
   1328         rcsw.message.sAddress.digits[digitCount] = (uint8_t) uct;
   1329     }
   1330 
   1331     status = p.readInt32(&t);
   1332     rcsw.message.sSubAddress.subaddressType = (RIL_CDMA_SMS_SubaddressType) t;
   1333 
   1334     status = p.read(&uct,sizeof(uct));
   1335     rcsw.message.sSubAddress.odd = (uint8_t) uct;
   1336 
   1337     status = p.read(&uct,sizeof(uct));
   1338     rcsw.message.sSubAddress.number_of_digits = (uint8_t) uct;
   1339 
   1340     for(digitCount = 0 ; digitCount < RIL_CDMA_SMS_SUBADDRESS_MAX; digitCount ++) {
   1341         status = p.read(&uct,sizeof(uct));
   1342         rcsw.message.sSubAddress.digits[digitCount] = (uint8_t) uct;
   1343     }
   1344 
   1345     status = p.readInt32(&t);
   1346     rcsw.message.uBearerDataLen = (int) t;
   1347 
   1348     for(digitCount = 0 ; digitCount < RIL_CDMA_SMS_BEARER_DATA_MAX; digitCount ++) {
   1349         status = p.read(&uct, sizeof(uct));
   1350         rcsw.message.aBearerData[digitCount] = (uint8_t) uct;
   1351     }
   1352 
   1353     if (status != NO_ERROR) {
   1354         goto invalid;
   1355     }
   1356 
   1357     startRequest;
   1358     appendPrintBuf("%sstatus=%d, message.uTeleserviceID=%d, message.bIsServicePresent=%d, \
   1359             message.uServicecategory=%d, message.sAddress.digit_mode=%d, \
   1360             message.sAddress.number_mode=%d, \
   1361             message.sAddress.number_type=%d, ",
   1362             printBuf, rcsw.status, rcsw.message.uTeleserviceID, rcsw.message.bIsServicePresent,
   1363             rcsw.message.uServicecategory, rcsw.message.sAddress.digit_mode,
   1364             rcsw.message.sAddress.number_mode,
   1365             rcsw.message.sAddress.number_type);
   1366     closeRequest;
   1367 
   1368     printRequest(pRI->token, pRI->pCI->requestNumber);
   1369 
   1370     s_callbacks.onRequest(pRI->pCI->requestNumber, &rcsw, sizeof(rcsw),pRI);
   1371 
   1372 #ifdef MEMSET_FREED
   1373     memset(&rcsw, 0, sizeof(rcsw));
   1374 #endif
   1375 
   1376     return;
   1377 
   1378 invalid:
   1379     invalidCommandBlock(pRI);
   1380     return;
   1381 
   1382 }
   1383 
   1384 // For backwards compatibility in RIL_REQUEST_SETUP_DATA_CALL.
   1385 // Version 4 of the RIL interface adds a new PDP type parameter to support
   1386 // IPv6 and dual-stack PDP contexts. When dealing with a previous version of
   1387 // RIL, remove the parameter from the request.
   1388 static void dispatchDataCall(Parcel& p, RequestInfo *pRI) {
   1389     // In RIL v3, REQUEST_SETUP_DATA_CALL takes 6 parameters.
   1390     const int numParamsRilV3 = 6;
   1391 
   1392     // The first bytes of the RIL parcel contain the request number and the
   1393     // serial number - see processCommandBuffer(). Copy them over too.
   1394     int pos = p.dataPosition();
   1395 
   1396     int numParams = p.readInt32();
   1397     if (s_callbacks.version < 4 && numParams > numParamsRilV3) {
   1398       Parcel p2;
   1399       p2.appendFrom(&p, 0, pos);
   1400       p2.writeInt32(numParamsRilV3);
   1401       for(int i = 0; i < numParamsRilV3; i++) {
   1402         p2.writeString16(p.readString16());
   1403       }
   1404       p2.setDataPosition(pos);
   1405       dispatchStrings(p2, pRI);
   1406     } else {
   1407       p.setDataPosition(pos);
   1408       dispatchStrings(p, pRI);
   1409     }
   1410 }
   1411 
   1412 // For backwards compatibility with RILs that dont support RIL_REQUEST_VOICE_RADIO_TECH.
   1413 // When all RILs handle this request, this function can be removed and
   1414 // the request can be sent directly to the RIL using dispatchVoid.
   1415 static void dispatchVoiceRadioTech(Parcel& p, RequestInfo *pRI) {
   1416     RIL_RadioState state = s_callbacks.onStateRequest();
   1417 
   1418     if ((RADIO_STATE_UNAVAILABLE == state) || (RADIO_STATE_OFF == state)) {
   1419         RIL_onRequestComplete(pRI, RIL_E_RADIO_NOT_AVAILABLE, NULL, 0);
   1420     }
   1421 
   1422     // RILs that support RADIO_STATE_ON should support this request.
   1423     if (RADIO_STATE_ON == state) {
   1424         dispatchVoid(p, pRI);
   1425         return;
   1426     }
   1427 
   1428     // For Older RILs, that do not support RADIO_STATE_ON, assume that they
   1429     // will not support this new request either and decode Voice Radio Technology
   1430     // from Radio State
   1431     voiceRadioTech = decodeVoiceRadioTechnology(state);
   1432 
   1433     if (voiceRadioTech < 0)
   1434         RIL_onRequestComplete(pRI, RIL_E_GENERIC_FAILURE, NULL, 0);
   1435     else
   1436         RIL_onRequestComplete(pRI, RIL_E_SUCCESS, &voiceRadioTech, sizeof(int));
   1437 }
   1438 
   1439 // For backwards compatibility in RIL_REQUEST_CDMA_GET_SUBSCRIPTION_SOURCE:.
   1440 // When all RILs handle this request, this function can be removed and
   1441 // the request can be sent directly to the RIL using dispatchVoid.
   1442 static void dispatchCdmaSubscriptionSource(Parcel& p, RequestInfo *pRI) {
   1443     RIL_RadioState state = s_callbacks.onStateRequest();
   1444 
   1445     if ((RADIO_STATE_UNAVAILABLE == state) || (RADIO_STATE_OFF == state)) {
   1446         RIL_onRequestComplete(pRI, RIL_E_RADIO_NOT_AVAILABLE, NULL, 0);
   1447     }
   1448 
   1449     // RILs that support RADIO_STATE_ON should support this request.
   1450     if (RADIO_STATE_ON == state) {
   1451         dispatchVoid(p, pRI);
   1452         return;
   1453     }
   1454 
   1455     // For Older RILs, that do not support RADIO_STATE_ON, assume that they
   1456     // will not support this new request either and decode CDMA Subscription Source
   1457     // from Radio State
   1458     cdmaSubscriptionSource = decodeCdmaSubscriptionSource(state);
   1459 
   1460     if (cdmaSubscriptionSource < 0)
   1461         RIL_onRequestComplete(pRI, RIL_E_GENERIC_FAILURE, NULL, 0);
   1462     else
   1463         RIL_onRequestComplete(pRI, RIL_E_SUCCESS, &cdmaSubscriptionSource, sizeof(int));
   1464 }
   1465 
   1466 static void dispatchSetInitialAttachApn(Parcel &p, RequestInfo *pRI)
   1467 {
   1468     RIL_InitialAttachApn pf;
   1469     int32_t  t;
   1470     status_t status;
   1471 
   1472     memset(&pf, 0, sizeof(pf));
   1473 
   1474     pf.apn = strdupReadString(p);
   1475     pf.protocol = strdupReadString(p);
   1476 
   1477     status = p.readInt32(&t);
   1478     pf.authtype = (int) t;
   1479 
   1480     pf.username = strdupReadString(p);
   1481     pf.password = strdupReadString(p);
   1482 
   1483     startRequest;
   1484     appendPrintBuf("%sapn=%s, protocol=%s, auth_type=%d, username=%s, password=%s",
   1485             printBuf, pf.apn, pf.protocol, pf.auth_type, pf.username, pf.password);
   1486     closeRequest;
   1487     printRequest(pRI->token, pRI->pCI->requestNumber);
   1488 
   1489     if (status != NO_ERROR) {
   1490         goto invalid;
   1491     }
   1492     s_callbacks.onRequest(pRI->pCI->requestNumber, &pf, sizeof(pf), pRI);
   1493 
   1494 #ifdef MEMSET_FREED
   1495     memsetString(pf.apn);
   1496     memsetString(pf.protocol);
   1497     memsetString(pf.username);
   1498     memsetString(pf.password);
   1499 #endif
   1500 
   1501     free(pf.apn);
   1502     free(pf.protocol);
   1503     free(pf.username);
   1504     free(pf.password);
   1505 
   1506 #ifdef MEMSET_FREED
   1507     memset(&pf, 0, sizeof(pf));
   1508 #endif
   1509 
   1510     return;
   1511 invalid:
   1512     invalidCommandBlock(pRI);
   1513     return;
   1514 }
   1515 
   1516 static int
   1517 blockingWrite(int fd, const void *buffer, size_t len) {
   1518     size_t writeOffset = 0;
   1519     const uint8_t *toWrite;
   1520 
   1521     toWrite = (const uint8_t *)buffer;
   1522 
   1523     while (writeOffset < len) {
   1524         ssize_t written;
   1525         do {
   1526             written = write (fd, toWrite + writeOffset,
   1527                                 len - writeOffset);
   1528         } while (written < 0 && ((errno == EINTR) || (errno == EAGAIN)));
   1529 
   1530         if (written >= 0) {
   1531             writeOffset += written;
   1532         } else {   // written < 0
   1533             RLOGE ("RIL Response: unexpected error on write errno:%d", errno);
   1534             close(fd);
   1535             return -1;
   1536         }
   1537     }
   1538 
   1539     return 0;
   1540 }
   1541 
   1542 static int
   1543 sendResponseRaw (const void *data, size_t dataSize) {
   1544     int fd = s_fdCommand;
   1545     int ret;
   1546     uint32_t header;
   1547 
   1548     if (s_fdCommand < 0) {
   1549         return -1;
   1550     }
   1551 
   1552     if (dataSize > MAX_COMMAND_BYTES) {
   1553         RLOGE("RIL: packet larger than %u (%u)",
   1554                 MAX_COMMAND_BYTES, (unsigned int )dataSize);
   1555 
   1556         return -1;
   1557     }
   1558 
   1559     pthread_mutex_lock(&s_writeMutex);
   1560 
   1561     header = htonl(dataSize);
   1562 
   1563     ret = blockingWrite(fd, (void *)&header, sizeof(header));
   1564 
   1565     if (ret < 0) {
   1566         pthread_mutex_unlock(&s_writeMutex);
   1567         return ret;
   1568     }
   1569 
   1570     ret = blockingWrite(fd, data, dataSize);
   1571 
   1572     if (ret < 0) {
   1573         pthread_mutex_unlock(&s_writeMutex);
   1574         return ret;
   1575     }
   1576 
   1577     pthread_mutex_unlock(&s_writeMutex);
   1578 
   1579     return 0;
   1580 }
   1581 
   1582 static int
   1583 sendResponse (Parcel &p) {
   1584     printResponse;
   1585     return sendResponseRaw(p.data(), p.dataSize());
   1586 }
   1587 
   1588 /** response is an int* pointing to an array of ints*/
   1589 
   1590 static int
   1591 responseInts(Parcel &p, void *response, size_t responselen) {
   1592     int numInts;
   1593 
   1594     if (response == NULL && responselen != 0) {
   1595         RLOGE("invalid response: NULL");
   1596         return RIL_ERRNO_INVALID_RESPONSE;
   1597     }
   1598     if (responselen % sizeof(int) != 0) {
   1599         RLOGE("invalid response length %d expected multiple of %d\n",
   1600             (int)responselen, (int)sizeof(int));
   1601         return RIL_ERRNO_INVALID_RESPONSE;
   1602     }
   1603 
   1604     int *p_int = (int *) response;
   1605 
   1606     numInts = responselen / sizeof(int *);
   1607     p.writeInt32 (numInts);
   1608 
   1609     /* each int*/
   1610     startResponse;
   1611     for (int i = 0 ; i < numInts ; i++) {
   1612         appendPrintBuf("%s%d,", printBuf, p_int[i]);
   1613         p.writeInt32(p_int[i]);
   1614     }
   1615     removeLastChar;
   1616     closeResponse;
   1617 
   1618     return 0;
   1619 }
   1620 
   1621 /** response is a char **, pointing to an array of char *'s
   1622     The parcel will begin with the version */
   1623 static int responseStringsWithVersion(int version, Parcel &p, void *response, size_t responselen) {
   1624     p.writeInt32(version);
   1625     return responseStrings(p, response, responselen);
   1626 }
   1627 
   1628 /** response is a char **, pointing to an array of char *'s */
   1629 static int responseStrings(Parcel &p, void *response, size_t responselen) {
   1630     int numStrings;
   1631 
   1632     if (response == NULL && responselen != 0) {
   1633         RLOGE("invalid response: NULL");
   1634         return RIL_ERRNO_INVALID_RESPONSE;
   1635     }
   1636     if (responselen % sizeof(char *) != 0) {
   1637         RLOGE("invalid response length %d expected multiple of %d\n",
   1638             (int)responselen, (int)sizeof(char *));
   1639         return RIL_ERRNO_INVALID_RESPONSE;
   1640     }
   1641 
   1642     if (response == NULL) {
   1643         p.writeInt32 (0);
   1644     } else {
   1645         char **p_cur = (char **) response;
   1646 
   1647         numStrings = responselen / sizeof(char *);
   1648         p.writeInt32 (numStrings);
   1649 
   1650         /* each string*/
   1651         startResponse;
   1652         for (int i = 0 ; i < numStrings ; i++) {
   1653             appendPrintBuf("%s%s,", printBuf, (char*)p_cur[i]);
   1654             writeStringToParcel (p, p_cur[i]);
   1655         }
   1656         removeLastChar;
   1657         closeResponse;
   1658     }
   1659     return 0;
   1660 }
   1661 
   1662 
   1663 /**
   1664  * NULL strings are accepted
   1665  * FIXME currently ignores responselen
   1666  */
   1667 static int responseString(Parcel &p, void *response, size_t responselen) {
   1668     /* one string only */
   1669     startResponse;
   1670     appendPrintBuf("%s%s", printBuf, (char*)response);
   1671     closeResponse;
   1672 
   1673     writeStringToParcel(p, (const char *)response);
   1674 
   1675     return 0;
   1676 }
   1677 
   1678 static int responseVoid(Parcel &p, void *response, size_t responselen) {
   1679     startResponse;
   1680     removeLastChar;
   1681     return 0;
   1682 }
   1683 
   1684 static int responseCallList(Parcel &p, void *response, size_t responselen) {
   1685     int num;
   1686 
   1687     if (response == NULL && responselen != 0) {
   1688         RLOGE("invalid response: NULL");
   1689         return RIL_ERRNO_INVALID_RESPONSE;
   1690     }
   1691 
   1692     if (responselen % sizeof (RIL_Call *) != 0) {
   1693         RLOGE("invalid response length %d expected multiple of %d\n",
   1694             (int)responselen, (int)sizeof (RIL_Call *));
   1695         return RIL_ERRNO_INVALID_RESPONSE;
   1696     }
   1697 
   1698     startResponse;
   1699     /* number of call info's */
   1700     num = responselen / sizeof(RIL_Call *);
   1701     p.writeInt32(num);
   1702 
   1703     for (int i = 0 ; i < num ; i++) {
   1704         RIL_Call *p_cur = ((RIL_Call **) response)[i];
   1705         /* each call info */
   1706         p.writeInt32(p_cur->state);
   1707         p.writeInt32(p_cur->index);
   1708         p.writeInt32(p_cur->toa);
   1709         p.writeInt32(p_cur->isMpty);
   1710         p.writeInt32(p_cur->isMT);
   1711         p.writeInt32(p_cur->als);
   1712         p.writeInt32(p_cur->isVoice);
   1713         p.writeInt32(p_cur->isVoicePrivacy);
   1714         writeStringToParcel(p, p_cur->number);
   1715         p.writeInt32(p_cur->numberPresentation);
   1716         writeStringToParcel(p, p_cur->name);
   1717         p.writeInt32(p_cur->namePresentation);
   1718         // Remove when partners upgrade to version 3
   1719         if ((s_callbacks.version < 3) || (p_cur->uusInfo == NULL || p_cur->uusInfo->uusData == NULL)) {
   1720             p.writeInt32(0); /* UUS Information is absent */
   1721         } else {
   1722             RIL_UUS_Info *uusInfo = p_cur->uusInfo;
   1723             p.writeInt32(1); /* UUS Information is present */
   1724             p.writeInt32(uusInfo->uusType);
   1725             p.writeInt32(uusInfo->uusDcs);
   1726             p.writeInt32(uusInfo->uusLength);
   1727             p.write(uusInfo->uusData, uusInfo->uusLength);
   1728         }
   1729         appendPrintBuf("%s[id=%d,%s,toa=%d,",
   1730             printBuf,
   1731             p_cur->index,
   1732             callStateToString(p_cur->state),
   1733             p_cur->toa);
   1734         appendPrintBuf("%s%s,%s,als=%d,%s,%s,",
   1735             printBuf,
   1736             (p_cur->isMpty)?"conf":"norm",
   1737             (p_cur->isMT)?"mt":"mo",
   1738             p_cur->als,
   1739             (p_cur->isVoice)?"voc":"nonvoc",
   1740             (p_cur->isVoicePrivacy)?"evp":"noevp");
   1741         appendPrintBuf("%s%s,cli=%d,name='%s',%d]",
   1742             printBuf,
   1743             p_cur->number,
   1744             p_cur->numberPresentation,
   1745             p_cur->name,
   1746             p_cur->namePresentation);
   1747     }
   1748     removeLastChar;
   1749     closeResponse;
   1750 
   1751     return 0;
   1752 }
   1753 
   1754 static int responseSMS(Parcel &p, void *response, size_t responselen) {
   1755     if (response == NULL) {
   1756         RLOGE("invalid response: NULL");
   1757         return RIL_ERRNO_INVALID_RESPONSE;
   1758     }
   1759 
   1760     if (responselen != sizeof (RIL_SMS_Response) ) {
   1761         RLOGE("invalid response length %d expected %d",
   1762                 (int)responselen, (int)sizeof (RIL_SMS_Response));
   1763         return RIL_ERRNO_INVALID_RESPONSE;
   1764     }
   1765 
   1766     RIL_SMS_Response *p_cur = (RIL_SMS_Response *) response;
   1767 
   1768     p.writeInt32(p_cur->messageRef);
   1769     writeStringToParcel(p, p_cur->ackPDU);
   1770     p.writeInt32(p_cur->errorCode);
   1771 
   1772     startResponse;
   1773     appendPrintBuf("%s%d,%s,%d", printBuf, p_cur->messageRef,
   1774         (char*)p_cur->ackPDU, p_cur->errorCode);
   1775     closeResponse;
   1776 
   1777     return 0;
   1778 }
   1779 
   1780 static int responseDataCallListV4(Parcel &p, void *response, size_t responselen)
   1781 {
   1782     if (response == NULL && responselen != 0) {
   1783         RLOGE("invalid response: NULL");
   1784         return RIL_ERRNO_INVALID_RESPONSE;
   1785     }
   1786 
   1787     if (responselen % sizeof(RIL_Data_Call_Response_v4) != 0) {
   1788         RLOGE("invalid response length %d expected multiple of %d",
   1789                 (int)responselen, (int)sizeof(RIL_Data_Call_Response_v4));
   1790         return RIL_ERRNO_INVALID_RESPONSE;
   1791     }
   1792 
   1793     int num = responselen / sizeof(RIL_Data_Call_Response_v4);
   1794     p.writeInt32(num);
   1795 
   1796     RIL_Data_Call_Response_v4 *p_cur = (RIL_Data_Call_Response_v4 *) response;
   1797     startResponse;
   1798     int i;
   1799     for (i = 0; i < num; i++) {
   1800         p.writeInt32(p_cur[i].cid);
   1801         p.writeInt32(p_cur[i].active);
   1802         writeStringToParcel(p, p_cur[i].type);
   1803         // apn is not used, so don't send.
   1804         writeStringToParcel(p, p_cur[i].address);
   1805         appendPrintBuf("%s[cid=%d,%s,%s,%s],", printBuf,
   1806             p_cur[i].cid,
   1807             (p_cur[i].active==0)?"down":"up",
   1808             (char*)p_cur[i].type,
   1809             (char*)p_cur[i].address);
   1810     }
   1811     removeLastChar;
   1812     closeResponse;
   1813 
   1814     return 0;
   1815 }
   1816 
   1817 static int responseDataCallList(Parcel &p, void *response, size_t responselen)
   1818 {
   1819     // Write version
   1820     p.writeInt32(s_callbacks.version);
   1821 
   1822     if (s_callbacks.version < 5) {
   1823         return responseDataCallListV4(p, response, responselen);
   1824     } else {
   1825         if (response == NULL && responselen != 0) {
   1826             RLOGE("invalid response: NULL");
   1827             return RIL_ERRNO_INVALID_RESPONSE;
   1828         }
   1829 
   1830         if (responselen % sizeof(RIL_Data_Call_Response_v6) != 0) {
   1831             RLOGE("invalid response length %d expected multiple of %d",
   1832                     (int)responselen, (int)sizeof(RIL_Data_Call_Response_v6));
   1833             return RIL_ERRNO_INVALID_RESPONSE;
   1834         }
   1835 
   1836         int num = responselen / sizeof(RIL_Data_Call_Response_v6);
   1837         p.writeInt32(num);
   1838 
   1839         RIL_Data_Call_Response_v6 *p_cur = (RIL_Data_Call_Response_v6 *) response;
   1840         startResponse;
   1841         int i;
   1842         for (i = 0; i < num; i++) {
   1843             p.writeInt32((int)p_cur[i].status);
   1844             p.writeInt32(p_cur[i].suggestedRetryTime);
   1845             p.writeInt32(p_cur[i].cid);
   1846             p.writeInt32(p_cur[i].active);
   1847             writeStringToParcel(p, p_cur[i].type);
   1848             writeStringToParcel(p, p_cur[i].ifname);
   1849             writeStringToParcel(p, p_cur[i].addresses);
   1850             writeStringToParcel(p, p_cur[i].dnses);
   1851             writeStringToParcel(p, p_cur[i].gateways);
   1852             appendPrintBuf("%s[status=%d,retry=%d,cid=%d,%s,%s,%s,%s,%s,%s],", printBuf,
   1853                 p_cur[i].status,
   1854                 p_cur[i].suggestedRetryTime,
   1855                 p_cur[i].cid,
   1856                 (p_cur[i].active==0)?"down":"up",
   1857                 (char*)p_cur[i].type,
   1858                 (char*)p_cur[i].ifname,
   1859                 (char*)p_cur[i].addresses,
   1860                 (char*)p_cur[i].dnses,
   1861                 (char*)p_cur[i].gateways);
   1862         }
   1863         removeLastChar;
   1864         closeResponse;
   1865     }
   1866 
   1867     return 0;
   1868 }
   1869 
   1870 static int responseSetupDataCall(Parcel &p, void *response, size_t responselen)
   1871 {
   1872     if (s_callbacks.version < 5) {
   1873         return responseStringsWithVersion(s_callbacks.version, p, response, responselen);
   1874     } else {
   1875         return responseDataCallList(p, response, responselen);
   1876     }
   1877 }
   1878 
   1879 static int responseRaw(Parcel &p, void *response, size_t responselen) {
   1880     if (response == NULL && responselen != 0) {
   1881         RLOGE("invalid response: NULL with responselen != 0");
   1882         return RIL_ERRNO_INVALID_RESPONSE;
   1883     }
   1884 
   1885     // The java code reads -1 size as null byte array
   1886     if (response == NULL) {
   1887         p.writeInt32(-1);
   1888     } else {
   1889         p.writeInt32(responselen);
   1890         p.write(response, responselen);
   1891     }
   1892 
   1893     return 0;
   1894 }
   1895 
   1896 
   1897 static int responseSIM_IO(Parcel &p, void *response, size_t responselen) {
   1898     if (response == NULL) {
   1899         RLOGE("invalid response: NULL");
   1900         return RIL_ERRNO_INVALID_RESPONSE;
   1901     }
   1902 
   1903     if (responselen != sizeof (RIL_SIM_IO_Response) ) {
   1904         RLOGE("invalid response length was %d expected %d",
   1905                 (int)responselen, (int)sizeof (RIL_SIM_IO_Response));
   1906         return RIL_ERRNO_INVALID_RESPONSE;
   1907     }
   1908 
   1909     RIL_SIM_IO_Response *p_cur = (RIL_SIM_IO_Response *) response;
   1910     p.writeInt32(p_cur->sw1);
   1911     p.writeInt32(p_cur->sw2);
   1912     writeStringToParcel(p, p_cur->simResponse);
   1913 
   1914     startResponse;
   1915     appendPrintBuf("%ssw1=0x%X,sw2=0x%X,%s", printBuf, p_cur->sw1, p_cur->sw2,
   1916         (char*)p_cur->simResponse);
   1917     closeResponse;
   1918 
   1919 
   1920     return 0;
   1921 }
   1922 
   1923 static int responseCallForwards(Parcel &p, void *response, size_t responselen) {
   1924     int num;
   1925 
   1926     if (response == NULL && responselen != 0) {
   1927         RLOGE("invalid response: NULL");
   1928         return RIL_ERRNO_INVALID_RESPONSE;
   1929     }
   1930 
   1931     if (responselen % sizeof(RIL_CallForwardInfo *) != 0) {
   1932         RLOGE("invalid response length %d expected multiple of %d",
   1933                 (int)responselen, (int)sizeof(RIL_CallForwardInfo *));
   1934         return RIL_ERRNO_INVALID_RESPONSE;
   1935     }
   1936 
   1937     /* number of call info's */
   1938     num = responselen / sizeof(RIL_CallForwardInfo *);
   1939     p.writeInt32(num);
   1940 
   1941     startResponse;
   1942     for (int i = 0 ; i < num ; i++) {
   1943         RIL_CallForwardInfo *p_cur = ((RIL_CallForwardInfo **) response)[i];
   1944 
   1945         p.writeInt32(p_cur->status);
   1946         p.writeInt32(p_cur->reason);
   1947         p.writeInt32(p_cur->serviceClass);
   1948         p.writeInt32(p_cur->toa);
   1949         writeStringToParcel(p, p_cur->number);
   1950         p.writeInt32(p_cur->timeSeconds);
   1951         appendPrintBuf("%s[%s,reason=%d,cls=%d,toa=%d,%s,tout=%d],", printBuf,
   1952             (p_cur->status==1)?"enable":"disable",
   1953             p_cur->reason, p_cur->serviceClass, p_cur->toa,
   1954             (char*)p_cur->number,
   1955             p_cur->timeSeconds);
   1956     }
   1957     removeLastChar;
   1958     closeResponse;
   1959 
   1960     return 0;
   1961 }
   1962 
   1963 static int responseSsn(Parcel &p, void *response, size_t responselen) {
   1964     if (response == NULL) {
   1965         RLOGE("invalid response: NULL");
   1966         return RIL_ERRNO_INVALID_RESPONSE;
   1967     }
   1968 
   1969     if (responselen != sizeof(RIL_SuppSvcNotification)) {
   1970         RLOGE("invalid response length was %d expected %d",
   1971                 (int)responselen, (int)sizeof (RIL_SuppSvcNotification));
   1972         return RIL_ERRNO_INVALID_RESPONSE;
   1973     }
   1974 
   1975     RIL_SuppSvcNotification *p_cur = (RIL_SuppSvcNotification *) response;
   1976     p.writeInt32(p_cur->notificationType);
   1977     p.writeInt32(p_cur->code);
   1978     p.writeInt32(p_cur->index);
   1979     p.writeInt32(p_cur->type);
   1980     writeStringToParcel(p, p_cur->number);
   1981 
   1982     startResponse;
   1983     appendPrintBuf("%s%s,code=%d,id=%d,type=%d,%s", printBuf,
   1984         (p_cur->notificationType==0)?"mo":"mt",
   1985          p_cur->code, p_cur->index, p_cur->type,
   1986         (char*)p_cur->number);
   1987     closeResponse;
   1988 
   1989     return 0;
   1990 }
   1991 
   1992 static int responseCellList(Parcel &p, void *response, size_t responselen) {
   1993     int num;
   1994 
   1995     if (response == NULL && responselen != 0) {
   1996         RLOGE("invalid response: NULL");
   1997         return RIL_ERRNO_INVALID_RESPONSE;
   1998     }
   1999 
   2000     if (responselen % sizeof (RIL_NeighboringCell *) != 0) {
   2001         RLOGE("invalid response length %d expected multiple of %d\n",
   2002             (int)responselen, (int)sizeof (RIL_NeighboringCell *));
   2003         return RIL_ERRNO_INVALID_RESPONSE;
   2004     }
   2005 
   2006     startResponse;
   2007     /* number of records */
   2008     num = responselen / sizeof(RIL_NeighboringCell *);
   2009     p.writeInt32(num);
   2010 
   2011     for (int i = 0 ; i < num ; i++) {
   2012         RIL_NeighboringCell *p_cur = ((RIL_NeighboringCell **) response)[i];
   2013 
   2014         p.writeInt32(p_cur->rssi);
   2015         writeStringToParcel (p, p_cur->cid);
   2016 
   2017         appendPrintBuf("%s[cid=%s,rssi=%d],", printBuf,
   2018             p_cur->cid, p_cur->rssi);
   2019     }
   2020     removeLastChar;
   2021     closeResponse;
   2022 
   2023     return 0;
   2024 }
   2025 
   2026 /**
   2027  * Marshall the signalInfoRecord into the parcel if it exists.
   2028  */
   2029 static void marshallSignalInfoRecord(Parcel &p,
   2030             RIL_CDMA_SignalInfoRecord &p_signalInfoRecord) {
   2031     p.writeInt32(p_signalInfoRecord.isPresent);
   2032     p.writeInt32(p_signalInfoRecord.signalType);
   2033     p.writeInt32(p_signalInfoRecord.alertPitch);
   2034     p.writeInt32(p_signalInfoRecord.signal);
   2035 }
   2036 
   2037 static int responseCdmaInformationRecords(Parcel &p,
   2038             void *response, size_t responselen) {
   2039     int num;
   2040     char* string8 = NULL;
   2041     int buffer_lenght;
   2042     RIL_CDMA_InformationRecord *infoRec;
   2043 
   2044     if (response == NULL && responselen != 0) {
   2045         RLOGE("invalid response: NULL");
   2046         return RIL_ERRNO_INVALID_RESPONSE;
   2047     }
   2048 
   2049     if (responselen != sizeof (RIL_CDMA_InformationRecords)) {
   2050         RLOGE("invalid response length %d expected multiple of %d\n",
   2051             (int)responselen, (int)sizeof (RIL_CDMA_InformationRecords *));
   2052         return RIL_ERRNO_INVALID_RESPONSE;
   2053     }
   2054 
   2055     RIL_CDMA_InformationRecords *p_cur =
   2056                              (RIL_CDMA_InformationRecords *) response;
   2057     num = MIN(p_cur->numberOfInfoRecs, RIL_CDMA_MAX_NUMBER_OF_INFO_RECS);
   2058 
   2059     startResponse;
   2060     p.writeInt32(num);
   2061 
   2062     for (int i = 0 ; i < num ; i++) {
   2063         infoRec = &p_cur->infoRec[i];
   2064         p.writeInt32(infoRec->name);
   2065         switch (infoRec->name) {
   2066             case RIL_CDMA_DISPLAY_INFO_REC:
   2067             case RIL_CDMA_EXTENDED_DISPLAY_INFO_REC:
   2068                 if (infoRec->rec.display.alpha_len >
   2069                                          CDMA_ALPHA_INFO_BUFFER_LENGTH) {
   2070                     RLOGE("invalid display info response length %d \
   2071                           expected not more than %d\n",
   2072                          (int)infoRec->rec.display.alpha_len,
   2073                          CDMA_ALPHA_INFO_BUFFER_LENGTH);
   2074                     return RIL_ERRNO_INVALID_RESPONSE;
   2075                 }
   2076                 string8 = (char*) malloc((infoRec->rec.display.alpha_len + 1)
   2077                                                              * sizeof(char) );
   2078                 for (int i = 0 ; i < infoRec->rec.display.alpha_len ; i++) {
   2079                     string8[i] = infoRec->rec.display.alpha_buf[i];
   2080                 }
   2081                 string8[(int)infoRec->rec.display.alpha_len] = '\0';
   2082                 writeStringToParcel(p, (const char*)string8);
   2083                 free(string8);
   2084                 string8 = NULL;
   2085                 break;
   2086             case RIL_CDMA_CALLED_PARTY_NUMBER_INFO_REC:
   2087             case RIL_CDMA_CALLING_PARTY_NUMBER_INFO_REC:
   2088             case RIL_CDMA_CONNECTED_NUMBER_INFO_REC:
   2089                 if (infoRec->rec.number.len > CDMA_NUMBER_INFO_BUFFER_LENGTH) {
   2090                     RLOGE("invalid display info response length %d \
   2091                           expected not more than %d\n",
   2092                          (int)infoRec->rec.number.len,
   2093                          CDMA_NUMBER_INFO_BUFFER_LENGTH);
   2094                     return RIL_ERRNO_INVALID_RESPONSE;
   2095                 }
   2096                 string8 = (char*) malloc((infoRec->rec.number.len + 1)
   2097                                                              * sizeof(char) );
   2098                 for (int i = 0 ; i < infoRec->rec.number.len; i++) {
   2099                     string8[i] = infoRec->rec.number.buf[i];
   2100                 }
   2101                 string8[(int)infoRec->rec.number.len] = '\0';
   2102                 writeStringToParcel(p, (const char*)string8);
   2103                 free(string8);
   2104                 string8 = NULL;
   2105                 p.writeInt32(infoRec->rec.number.number_type);
   2106                 p.writeInt32(infoRec->rec.number.number_plan);
   2107                 p.writeInt32(infoRec->rec.number.pi);
   2108                 p.writeInt32(infoRec->rec.number.si);
   2109                 break;
   2110             case RIL_CDMA_SIGNAL_INFO_REC:
   2111                 p.writeInt32(infoRec->rec.signal.isPresent);
   2112                 p.writeInt32(infoRec->rec.signal.signalType);
   2113                 p.writeInt32(infoRec->rec.signal.alertPitch);
   2114                 p.writeInt32(infoRec->rec.signal.signal);
   2115 
   2116                 appendPrintBuf("%sisPresent=%X, signalType=%X, \
   2117                                 alertPitch=%X, signal=%X, ",
   2118                    printBuf, (int)infoRec->rec.signal.isPresent,
   2119                    (int)infoRec->rec.signal.signalType,
   2120                    (int)infoRec->rec.signal.alertPitch,
   2121                    (int)infoRec->rec.signal.signal);
   2122                 removeLastChar;
   2123                 break;
   2124             case RIL_CDMA_REDIRECTING_NUMBER_INFO_REC:
   2125                 if (infoRec->rec.redir.redirectingNumber.len >
   2126                                               CDMA_NUMBER_INFO_BUFFER_LENGTH) {
   2127                     RLOGE("invalid display info response length %d \
   2128                           expected not more than %d\n",
   2129                          (int)infoRec->rec.redir.redirectingNumber.len,
   2130                          CDMA_NUMBER_INFO_BUFFER_LENGTH);
   2131                     return RIL_ERRNO_INVALID_RESPONSE;
   2132                 }
   2133                 string8 = (char*) malloc((infoRec->rec.redir.redirectingNumber
   2134                                           .len + 1) * sizeof(char) );
   2135                 for (int i = 0;
   2136                          i < infoRec->rec.redir.redirectingNumber.len;
   2137                          i++) {
   2138                     string8[i] = infoRec->rec.redir.redirectingNumber.buf[i];
   2139                 }
   2140                 string8[(int)infoRec->rec.redir.redirectingNumber.len] = '\0';
   2141                 writeStringToParcel(p, (const char*)string8);
   2142                 free(string8);
   2143                 string8 = NULL;
   2144                 p.writeInt32(infoRec->rec.redir.redirectingNumber.number_type);
   2145                 p.writeInt32(infoRec->rec.redir.redirectingNumber.number_plan);
   2146                 p.writeInt32(infoRec->rec.redir.redirectingNumber.pi);
   2147                 p.writeInt32(infoRec->rec.redir.redirectingNumber.si);
   2148                 p.writeInt32(infoRec->rec.redir.redirectingReason);
   2149                 break;
   2150             case RIL_CDMA_LINE_CONTROL_INFO_REC:
   2151                 p.writeInt32(infoRec->rec.lineCtrl.lineCtrlPolarityIncluded);
   2152                 p.writeInt32(infoRec->rec.lineCtrl.lineCtrlToggle);
   2153                 p.writeInt32(infoRec->rec.lineCtrl.lineCtrlReverse);
   2154                 p.writeInt32(infoRec->rec.lineCtrl.lineCtrlPowerDenial);
   2155 
   2156                 appendPrintBuf("%slineCtrlPolarityIncluded=%d, \
   2157                                 lineCtrlToggle=%d, lineCtrlReverse=%d, \
   2158                                 lineCtrlPowerDenial=%d, ", printBuf,
   2159                        (int)infoRec->rec.lineCtrl.lineCtrlPolarityIncluded,
   2160                        (int)infoRec->rec.lineCtrl.lineCtrlToggle,
   2161                        (int)infoRec->rec.lineCtrl.lineCtrlReverse,
   2162                        (int)infoRec->rec.lineCtrl.lineCtrlPowerDenial);
   2163                 removeLastChar;
   2164                 break;
   2165             case RIL_CDMA_T53_CLIR_INFO_REC:
   2166                 p.writeInt32((int)(infoRec->rec.clir.cause));
   2167 
   2168                 appendPrintBuf("%scause%d", printBuf, infoRec->rec.clir.cause);
   2169                 removeLastChar;
   2170                 break;
   2171             case RIL_CDMA_T53_AUDIO_CONTROL_INFO_REC:
   2172                 p.writeInt32(infoRec->rec.audioCtrl.upLink);
   2173                 p.writeInt32(infoRec->rec.audioCtrl.downLink);
   2174 
   2175                 appendPrintBuf("%supLink=%d, downLink=%d, ", printBuf,
   2176                         infoRec->rec.audioCtrl.upLink,
   2177                         infoRec->rec.audioCtrl.downLink);
   2178                 removeLastChar;
   2179                 break;
   2180             case RIL_CDMA_T53_RELEASE_INFO_REC:
   2181                 // TODO(Moto): See David Krause, he has the answer:)
   2182                 RLOGE("RIL_CDMA_T53_RELEASE_INFO_REC: return INVALID_RESPONSE");
   2183                 return RIL_ERRNO_INVALID_RESPONSE;
   2184             default:
   2185                 RLOGE("Incorrect name value");
   2186                 return RIL_ERRNO_INVALID_RESPONSE;
   2187         }
   2188     }
   2189     closeResponse;
   2190 
   2191     return 0;
   2192 }
   2193 
   2194 static int responseRilSignalStrength(Parcel &p,
   2195                     void *response, size_t responselen) {
   2196     if (response == NULL && responselen != 0) {
   2197         RLOGE("invalid response: NULL");
   2198         return RIL_ERRNO_INVALID_RESPONSE;
   2199     }
   2200 
   2201     if (responselen >= sizeof (RIL_SignalStrength_v5)) {
   2202         RIL_SignalStrength_v6 *p_cur = ((RIL_SignalStrength_v6 *) response);
   2203 
   2204         p.writeInt32(p_cur->GW_SignalStrength.signalStrength);
   2205         p.writeInt32(p_cur->GW_SignalStrength.bitErrorRate);
   2206         p.writeInt32(p_cur->CDMA_SignalStrength.dbm);
   2207         p.writeInt32(p_cur->CDMA_SignalStrength.ecio);
   2208         p.writeInt32(p_cur->EVDO_SignalStrength.dbm);
   2209         p.writeInt32(p_cur->EVDO_SignalStrength.ecio);
   2210         p.writeInt32(p_cur->EVDO_SignalStrength.signalNoiseRatio);
   2211         if (responselen >= sizeof (RIL_SignalStrength_v6)) {
   2212             /*
   2213              * Fixup LTE for backwards compatibility
   2214              */
   2215             if (s_callbacks.version <= 6) {
   2216                 // signalStrength: -1 -> 99
   2217                 if (p_cur->LTE_SignalStrength.signalStrength == -1) {
   2218                     p_cur->LTE_SignalStrength.signalStrength = 99;
   2219                 }
   2220                 // rsrp: -1 -> INT_MAX all other negative value to positive.
   2221                 // So remap here
   2222                 if (p_cur->LTE_SignalStrength.rsrp == -1) {
   2223                     p_cur->LTE_SignalStrength.rsrp = INT_MAX;
   2224                 } else if (p_cur->LTE_SignalStrength.rsrp < -1) {
   2225                     p_cur->LTE_SignalStrength.rsrp = -p_cur->LTE_SignalStrength.rsrp;
   2226                 }
   2227                 // rsrq: -1 -> INT_MAX
   2228                 if (p_cur->LTE_SignalStrength.rsrq == -1) {
   2229                     p_cur->LTE_SignalStrength.rsrq = INT_MAX;
   2230                 }
   2231                 // Not remapping rssnr is already using INT_MAX
   2232 
   2233                 // cqi: -1 -> INT_MAX
   2234                 if (p_cur->LTE_SignalStrength.cqi == -1) {
   2235                     p_cur->LTE_SignalStrength.cqi = INT_MAX;
   2236                 }
   2237             }
   2238             p.writeInt32(p_cur->LTE_SignalStrength.signalStrength);
   2239             p.writeInt32(p_cur->LTE_SignalStrength.rsrp);
   2240             p.writeInt32(p_cur->LTE_SignalStrength.rsrq);
   2241             p.writeInt32(p_cur->LTE_SignalStrength.rssnr);
   2242             p.writeInt32(p_cur->LTE_SignalStrength.cqi);
   2243         } else {
   2244             p.writeInt32(99);
   2245             p.writeInt32(INT_MAX);
   2246             p.writeInt32(INT_MAX);
   2247             p.writeInt32(INT_MAX);
   2248             p.writeInt32(INT_MAX);
   2249         }
   2250 
   2251         startResponse;
   2252         appendPrintBuf("%s[signalStrength=%d,bitErrorRate=%d,\
   2253                 CDMA_SS.dbm=%d,CDMA_SSecio=%d,\
   2254                 EVDO_SS.dbm=%d,EVDO_SS.ecio=%d,\
   2255                 EVDO_SS.signalNoiseRatio=%d,\
   2256                 LTE_SS.signalStrength=%d,LTE_SS.rsrp=%d,LTE_SS.rsrq=%d,\
   2257                 LTE_SS.rssnr=%d,LTE_SS.cqi=%d]",
   2258                 printBuf,
   2259                 p_cur->GW_SignalStrength.signalStrength,
   2260                 p_cur->GW_SignalStrength.bitErrorRate,
   2261                 p_cur->CDMA_SignalStrength.dbm,
   2262                 p_cur->CDMA_SignalStrength.ecio,
   2263                 p_cur->EVDO_SignalStrength.dbm,
   2264                 p_cur->EVDO_SignalStrength.ecio,
   2265                 p_cur->EVDO_SignalStrength.signalNoiseRatio,
   2266                 p_cur->LTE_SignalStrength.signalStrength,
   2267                 p_cur->LTE_SignalStrength.rsrp,
   2268                 p_cur->LTE_SignalStrength.rsrq,
   2269                 p_cur->LTE_SignalStrength.rssnr,
   2270                 p_cur->LTE_SignalStrength.cqi);
   2271         closeResponse;
   2272 
   2273     } else {
   2274         RLOGE("invalid response length");
   2275         return RIL_ERRNO_INVALID_RESPONSE;
   2276     }
   2277 
   2278     return 0;
   2279 }
   2280 
   2281 static int responseCallRing(Parcel &p, void *response, size_t responselen) {
   2282     if ((response == NULL) || (responselen == 0)) {
   2283         return responseVoid(p, response, responselen);
   2284     } else {
   2285         return responseCdmaSignalInfoRecord(p, response, responselen);
   2286     }
   2287 }
   2288 
   2289 static int responseCdmaSignalInfoRecord(Parcel &p, void *response, size_t responselen) {
   2290     if (response == NULL || responselen == 0) {
   2291         RLOGE("invalid response: NULL");
   2292         return RIL_ERRNO_INVALID_RESPONSE;
   2293     }
   2294 
   2295     if (responselen != sizeof (RIL_CDMA_SignalInfoRecord)) {
   2296         RLOGE("invalid response length %d expected sizeof (RIL_CDMA_SignalInfoRecord) of %d\n",
   2297             (int)responselen, (int)sizeof (RIL_CDMA_SignalInfoRecord));
   2298         return RIL_ERRNO_INVALID_RESPONSE;
   2299     }
   2300 
   2301     startResponse;
   2302 
   2303     RIL_CDMA_SignalInfoRecord *p_cur = ((RIL_CDMA_SignalInfoRecord *) response);
   2304     marshallSignalInfoRecord(p, *p_cur);
   2305 
   2306     appendPrintBuf("%s[isPresent=%d,signalType=%d,alertPitch=%d\
   2307               signal=%d]",
   2308               printBuf,
   2309               p_cur->isPresent,
   2310               p_cur->signalType,
   2311               p_cur->alertPitch,
   2312               p_cur->signal);
   2313 
   2314     closeResponse;
   2315     return 0;
   2316 }
   2317 
   2318 static int responseCdmaCallWaiting(Parcel &p, void *response,
   2319             size_t responselen) {
   2320     if (response == NULL && responselen != 0) {
   2321         RLOGE("invalid response: NULL");
   2322         return RIL_ERRNO_INVALID_RESPONSE;
   2323     }
   2324 
   2325     if (responselen < sizeof(RIL_CDMA_CallWaiting_v6)) {
   2326         RLOGW("Upgrade to ril version %d\n", RIL_VERSION);
   2327     }
   2328 
   2329     RIL_CDMA_CallWaiting_v6 *p_cur = ((RIL_CDMA_CallWaiting_v6 *) response);
   2330 
   2331     writeStringToParcel(p, p_cur->number);
   2332     p.writeInt32(p_cur->numberPresentation);
   2333     writeStringToParcel(p, p_cur->name);
   2334     marshallSignalInfoRecord(p, p_cur->signalInfoRecord);
   2335 
   2336     if (responselen >= sizeof(RIL_CDMA_CallWaiting_v6)) {
   2337         p.writeInt32(p_cur->number_type);
   2338         p.writeInt32(p_cur->number_plan);
   2339     } else {
   2340         p.writeInt32(0);
   2341         p.writeInt32(0);
   2342     }
   2343 
   2344     startResponse;
   2345     appendPrintBuf("%snumber=%s,numberPresentation=%d, name=%s,\
   2346             signalInfoRecord[isPresent=%d,signalType=%d,alertPitch=%d\
   2347             signal=%d,number_type=%d,number_plan=%d]",
   2348             printBuf,
   2349             p_cur->number,
   2350             p_cur->numberPresentation,
   2351             p_cur->name,
   2352             p_cur->signalInfoRecord.isPresent,
   2353             p_cur->signalInfoRecord.signalType,
   2354             p_cur->signalInfoRecord.alertPitch,
   2355             p_cur->signalInfoRecord.signal,
   2356             p_cur->number_type,
   2357             p_cur->number_plan);
   2358     closeResponse;
   2359 
   2360     return 0;
   2361 }
   2362 
   2363 static int responseSimRefresh(Parcel &p, void *response, size_t responselen) {
   2364     if (response == NULL && responselen != 0) {
   2365         RLOGE("responseSimRefresh: invalid response: NULL");
   2366         return RIL_ERRNO_INVALID_RESPONSE;
   2367     }
   2368 
   2369     startResponse;
   2370     if (s_callbacks.version == 7) {
   2371         RIL_SimRefreshResponse_v7 *p_cur = ((RIL_SimRefreshResponse_v7 *) response);
   2372         p.writeInt32(p_cur->result);
   2373         p.writeInt32(p_cur->ef_id);
   2374         writeStringToParcel(p, p_cur->aid);
   2375 
   2376         appendPrintBuf("%sresult=%d, ef_id=%d, aid=%s",
   2377                 printBuf,
   2378                 p_cur->result,
   2379                 p_cur->ef_id,
   2380                 p_cur->aid);
   2381     } else {
   2382         int *p_cur = ((int *) response);
   2383         p.writeInt32(p_cur[0]);
   2384         p.writeInt32(p_cur[1]);
   2385         writeStringToParcel(p, NULL);
   2386 
   2387         appendPrintBuf("%sresult=%d, ef_id=%d",
   2388                 printBuf,
   2389                 p_cur[0],
   2390                 p_cur[1]);
   2391     }
   2392     closeResponse;
   2393 
   2394     return 0;
   2395 }
   2396 
   2397 static int responseCellInfoList(Parcel &p, void *response, size_t responselen)
   2398 {
   2399     if (response == NULL && responselen != 0) {
   2400         RLOGE("invalid response: NULL");
   2401         return RIL_ERRNO_INVALID_RESPONSE;
   2402     }
   2403 
   2404     if (responselen % sizeof(RIL_CellInfo) != 0) {
   2405         RLOGE("invalid response length %d expected multiple of %d",
   2406                 (int)responselen, (int)sizeof(RIL_CellInfo));
   2407         return RIL_ERRNO_INVALID_RESPONSE;
   2408     }
   2409 
   2410     int num = responselen / sizeof(RIL_CellInfo);
   2411     p.writeInt32(num);
   2412 
   2413     RIL_CellInfo *p_cur = (RIL_CellInfo *) response;
   2414     startResponse;
   2415     int i;
   2416     for (i = 0; i < num; i++) {
   2417         appendPrintBuf("%s[%d: type=%d,registered=%d,timeStampType=%d,timeStamp=%lld", printBuf, i,
   2418             p_cur->cellInfoType, p_cur->registered, p_cur->timeStampType, p_cur->timeStamp);
   2419         p.writeInt32((int)p_cur->cellInfoType);
   2420         p.writeInt32(p_cur->registered);
   2421         p.writeInt32(p_cur->timeStampType);
   2422         p.writeInt64(p_cur->timeStamp);
   2423         switch(p_cur->cellInfoType) {
   2424             case RIL_CELL_INFO_TYPE_GSM: {
   2425                 appendPrintBuf("%s GSM id: mcc=%d,mnc=%d,lac=%d,cid=%d,", printBuf,
   2426                     p_cur->CellInfo.gsm.cellIdentityGsm.mcc,
   2427                     p_cur->CellInfo.gsm.cellIdentityGsm.mnc,
   2428                     p_cur->CellInfo.gsm.cellIdentityGsm.lac,
   2429                     p_cur->CellInfo.gsm.cellIdentityGsm.cid);
   2430                 appendPrintBuf("%s gsmSS: ss=%d,ber=%d],", printBuf,
   2431                     p_cur->CellInfo.gsm.signalStrengthGsm.signalStrength,
   2432                     p_cur->CellInfo.gsm.signalStrengthGsm.bitErrorRate);
   2433 
   2434                 p.writeInt32(p_cur->CellInfo.gsm.cellIdentityGsm.mcc);
   2435                 p.writeInt32(p_cur->CellInfo.gsm.cellIdentityGsm.mnc);
   2436                 p.writeInt32(p_cur->CellInfo.gsm.cellIdentityGsm.lac);
   2437                 p.writeInt32(p_cur->CellInfo.gsm.cellIdentityGsm.cid);
   2438                 p.writeInt32(p_cur->CellInfo.gsm.signalStrengthGsm.signalStrength);
   2439                 p.writeInt32(p_cur->CellInfo.gsm.signalStrengthGsm.bitErrorRate);
   2440                 break;
   2441             }
   2442             case RIL_CELL_INFO_TYPE_WCDMA: {
   2443                 appendPrintBuf("%s WCDMA id: mcc=%d,mnc=%d,lac=%d,cid=%d,psc=%d,", printBuf,
   2444                     p_cur->CellInfo.wcdma.cellIdentityWcdma.mcc,
   2445                     p_cur->CellInfo.wcdma.cellIdentityWcdma.mnc,
   2446                     p_cur->CellInfo.wcdma.cellIdentityWcdma.lac,
   2447                     p_cur->CellInfo.wcdma.cellIdentityWcdma.cid,
   2448                     p_cur->CellInfo.wcdma.cellIdentityWcdma.psc);
   2449                 appendPrintBuf("%s wcdmaSS: ss=%d,ber=%d],", printBuf,
   2450                     p_cur->CellInfo.wcdma.signalStrengthWcdma.signalStrength,
   2451                     p_cur->CellInfo.wcdma.signalStrengthWcdma.bitErrorRate);
   2452 
   2453                 p.writeInt32(p_cur->CellInfo.wcdma.cellIdentityWcdma.mcc);
   2454                 p.writeInt32(p_cur->CellInfo.wcdma.cellIdentityWcdma.mnc);
   2455                 p.writeInt32(p_cur->CellInfo.wcdma.cellIdentityWcdma.lac);
   2456                 p.writeInt32(p_cur->CellInfo.wcdma.cellIdentityWcdma.cid);
   2457                 p.writeInt32(p_cur->CellInfo.wcdma.cellIdentityWcdma.psc);
   2458                 p.writeInt32(p_cur->CellInfo.wcdma.signalStrengthWcdma.signalStrength);
   2459                 p.writeInt32(p_cur->CellInfo.wcdma.signalStrengthWcdma.bitErrorRate);
   2460                 break;
   2461             }
   2462             case RIL_CELL_INFO_TYPE_CDMA: {
   2463                 appendPrintBuf("%s CDMA id: nId=%d,sId=%d,bsId=%d,long=%d,lat=%d", printBuf,
   2464                     p_cur->CellInfo.cdma.cellIdentityCdma.networkId,
   2465                     p_cur->CellInfo.cdma.cellIdentityCdma.systemId,
   2466                     p_cur->CellInfo.cdma.cellIdentityCdma.basestationId,
   2467                     p_cur->CellInfo.cdma.cellIdentityCdma.longitude,
   2468                     p_cur->CellInfo.cdma.cellIdentityCdma.latitude);
   2469 
   2470                 p.writeInt32(p_cur->CellInfo.cdma.cellIdentityCdma.networkId);
   2471                 p.writeInt32(p_cur->CellInfo.cdma.cellIdentityCdma.systemId);
   2472                 p.writeInt32(p_cur->CellInfo.cdma.cellIdentityCdma.basestationId);
   2473                 p.writeInt32(p_cur->CellInfo.cdma.cellIdentityCdma.longitude);
   2474                 p.writeInt32(p_cur->CellInfo.cdma.cellIdentityCdma.latitude);
   2475 
   2476                 appendPrintBuf("%s cdmaSS: dbm=%d ecio=%d evdoSS: dbm=%d,ecio=%d,snr=%d", printBuf,
   2477                     p_cur->CellInfo.cdma.signalStrengthCdma.dbm,
   2478                     p_cur->CellInfo.cdma.signalStrengthCdma.ecio,
   2479                     p_cur->CellInfo.cdma.signalStrengthEvdo.dbm,
   2480                     p_cur->CellInfo.cdma.signalStrengthEvdo.ecio,
   2481                     p_cur->CellInfo.cdma.signalStrengthEvdo.signalNoiseRatio);
   2482 
   2483                 p.writeInt32(p_cur->CellInfo.cdma.signalStrengthCdma.dbm);
   2484                 p.writeInt32(p_cur->CellInfo.cdma.signalStrengthCdma.ecio);
   2485                 p.writeInt32(p_cur->CellInfo.cdma.signalStrengthEvdo.dbm);
   2486                 p.writeInt32(p_cur->CellInfo.cdma.signalStrengthEvdo.ecio);
   2487                 p.writeInt32(p_cur->CellInfo.cdma.signalStrengthEvdo.signalNoiseRatio);
   2488                 break;
   2489             }
   2490             case RIL_CELL_INFO_TYPE_LTE: {
   2491                 appendPrintBuf("%s LTE id: mcc=%d,mnc=%d,ci=%d,pci=%d,tac=%d", printBuf,
   2492                     p_cur->CellInfo.lte.cellIdentityLte.mcc,
   2493                     p_cur->CellInfo.lte.cellIdentityLte.mnc,
   2494                     p_cur->CellInfo.lte.cellIdentityLte.ci,
   2495                     p_cur->CellInfo.lte.cellIdentityLte.pci,
   2496                     p_cur->CellInfo.lte.cellIdentityLte.tac);
   2497 
   2498                 p.writeInt32(p_cur->CellInfo.lte.cellIdentityLte.mcc);
   2499                 p.writeInt32(p_cur->CellInfo.lte.cellIdentityLte.mnc);
   2500                 p.writeInt32(p_cur->CellInfo.lte.cellIdentityLte.ci);
   2501                 p.writeInt32(p_cur->CellInfo.lte.cellIdentityLte.pci);
   2502                 p.writeInt32(p_cur->CellInfo.lte.cellIdentityLte.tac);
   2503 
   2504                 appendPrintBuf("%s lteSS: ss=%d,rsrp=%d,rsrq=%d,rssnr=%d,cqi=%d,ta=%d", printBuf,
   2505                     p_cur->CellInfo.lte.signalStrengthLte.signalStrength,
   2506                     p_cur->CellInfo.lte.signalStrengthLte.rsrp,
   2507                     p_cur->CellInfo.lte.signalStrengthLte.rsrq,
   2508                     p_cur->CellInfo.lte.signalStrengthLte.rssnr,
   2509                     p_cur->CellInfo.lte.signalStrengthLte.cqi,
   2510                     p_cur->CellInfo.lte.signalStrengthLte.timingAdvance);
   2511                 p.writeInt32(p_cur->CellInfo.lte.signalStrengthLte.signalStrength);
   2512                 p.writeInt32(p_cur->CellInfo.lte.signalStrengthLte.rsrp);
   2513                 p.writeInt32(p_cur->CellInfo.lte.signalStrengthLte.rsrq);
   2514                 p.writeInt32(p_cur->CellInfo.lte.signalStrengthLte.rssnr);
   2515                 p.writeInt32(p_cur->CellInfo.lte.signalStrengthLte.cqi);
   2516                 p.writeInt32(p_cur->CellInfo.lte.signalStrengthLte.timingAdvance);
   2517                 break;
   2518             }
   2519         }
   2520         p_cur += 1;
   2521     }
   2522     removeLastChar;
   2523     closeResponse;
   2524 
   2525     return 0;
   2526 }
   2527 
   2528 static void triggerEvLoop() {
   2529     int ret;
   2530     if (!pthread_equal(pthread_self(), s_tid_dispatch)) {
   2531         /* trigger event loop to wakeup. No reason to do this,
   2532          * if we're in the event loop thread */
   2533          do {
   2534             ret = write (s_fdWakeupWrite, " ", 1);
   2535          } while (ret < 0 && errno == EINTR);
   2536     }
   2537 }
   2538 
   2539 static void rilEventAddWakeup(struct ril_event *ev) {
   2540     ril_event_add(ev);
   2541     triggerEvLoop();
   2542 }
   2543 
   2544 static void sendSimStatusAppInfo(Parcel &p, int num_apps, RIL_AppStatus appStatus[]) {
   2545         p.writeInt32(num_apps);
   2546         startResponse;
   2547         for (int i = 0; i < num_apps; i++) {
   2548             p.writeInt32(appStatus[i].app_type);
   2549             p.writeInt32(appStatus[i].app_state);
   2550             p.writeInt32(appStatus[i].perso_substate);
   2551             writeStringToParcel(p, (const char*)(appStatus[i].aid_ptr));
   2552             writeStringToParcel(p, (const char*)
   2553                                           (appStatus[i].app_label_ptr));
   2554             p.writeInt32(appStatus[i].pin1_replaced);
   2555             p.writeInt32(appStatus[i].pin1);
   2556             p.writeInt32(appStatus[i].pin2);
   2557             appendPrintBuf("%s[app_type=%d,app_state=%d,perso_substate=%d,\
   2558                     aid_ptr=%s,app_label_ptr=%s,pin1_replaced=%d,pin1=%d,pin2=%d],",
   2559                     printBuf,
   2560                     appStatus[i].app_type,
   2561                     appStatus[i].app_state,
   2562                     appStatus[i].perso_substate,
   2563                     appStatus[i].aid_ptr,
   2564                     appStatus[i].app_label_ptr,
   2565                     appStatus[i].pin1_replaced,
   2566                     appStatus[i].pin1,
   2567                     appStatus[i].pin2);
   2568         }
   2569         closeResponse;
   2570 }
   2571 
   2572 static int responseSimStatus(Parcel &p, void *response, size_t responselen) {
   2573     int i;
   2574 
   2575     if (response == NULL && responselen != 0) {
   2576         RLOGE("invalid response: NULL");
   2577         return RIL_ERRNO_INVALID_RESPONSE;
   2578     }
   2579 
   2580     if (responselen == sizeof (RIL_CardStatus_v6)) {
   2581         RIL_CardStatus_v6 *p_cur = ((RIL_CardStatus_v6 *) response);
   2582 
   2583         p.writeInt32(p_cur->card_state);
   2584         p.writeInt32(p_cur->universal_pin_state);
   2585         p.writeInt32(p_cur->gsm_umts_subscription_app_index);
   2586         p.writeInt32(p_cur->cdma_subscription_app_index);
   2587         p.writeInt32(p_cur->ims_subscription_app_index);
   2588 
   2589         sendSimStatusAppInfo(p, p_cur->num_applications, p_cur->applications);
   2590     } else if (responselen == sizeof (RIL_CardStatus_v5)) {
   2591         RIL_CardStatus_v5 *p_cur = ((RIL_CardStatus_v5 *) response);
   2592 
   2593         p.writeInt32(p_cur->card_state);
   2594         p.writeInt32(p_cur->universal_pin_state);
   2595         p.writeInt32(p_cur->gsm_umts_subscription_app_index);
   2596         p.writeInt32(p_cur->cdma_subscription_app_index);
   2597         p.writeInt32(-1);
   2598 
   2599         sendSimStatusAppInfo(p, p_cur->num_applications, p_cur->applications);
   2600     } else {
   2601         RLOGE("responseSimStatus: A RilCardStatus_v6 or _v5 expected\n");
   2602         return RIL_ERRNO_INVALID_RESPONSE;
   2603     }
   2604 
   2605     return 0;
   2606 }
   2607 
   2608 static int responseGsmBrSmsCnf(Parcel &p, void *response, size_t responselen) {
   2609     int num = responselen / sizeof(RIL_GSM_BroadcastSmsConfigInfo *);
   2610     p.writeInt32(num);
   2611 
   2612     startResponse;
   2613     RIL_GSM_BroadcastSmsConfigInfo **p_cur =
   2614                 (RIL_GSM_BroadcastSmsConfigInfo **) response;
   2615     for (int i = 0; i < num; i++) {
   2616         p.writeInt32(p_cur[i]->fromServiceId);
   2617         p.writeInt32(p_cur[i]->toServiceId);
   2618         p.writeInt32(p_cur[i]->fromCodeScheme);
   2619         p.writeInt32(p_cur[i]->toCodeScheme);
   2620         p.writeInt32(p_cur[i]->selected);
   2621 
   2622         appendPrintBuf("%s [%d: fromServiceId=%d, toServiceId=%d, \
   2623                 fromCodeScheme=%d, toCodeScheme=%d, selected =%d]",
   2624                 printBuf, i, p_cur[i]->fromServiceId, p_cur[i]->toServiceId,
   2625                 p_cur[i]->fromCodeScheme, p_cur[i]->toCodeScheme,
   2626                 p_cur[i]->selected);
   2627     }
   2628     closeResponse;
   2629 
   2630     return 0;
   2631 }
   2632 
   2633 static int responseCdmaBrSmsCnf(Parcel &p, void *response, size_t responselen) {
   2634     RIL_CDMA_BroadcastSmsConfigInfo **p_cur =
   2635                (RIL_CDMA_BroadcastSmsConfigInfo **) response;
   2636 
   2637     int num = responselen / sizeof (RIL_CDMA_BroadcastSmsConfigInfo *);
   2638     p.writeInt32(num);
   2639 
   2640     startResponse;
   2641     for (int i = 0 ; i < num ; i++ ) {
   2642         p.writeInt32(p_cur[i]->service_category);
   2643         p.writeInt32(p_cur[i]->language);
   2644         p.writeInt32(p_cur[i]->selected);
   2645 
   2646         appendPrintBuf("%s [%d: srvice_category=%d, language =%d, \
   2647               selected =%d], ",
   2648               printBuf, i, p_cur[i]->service_category, p_cur[i]->language,
   2649               p_cur[i]->selected);
   2650     }
   2651     closeResponse;
   2652 
   2653     return 0;
   2654 }
   2655 
   2656 static int responseCdmaSms(Parcel &p, void *response, size_t responselen) {
   2657     int num;
   2658     int digitCount;
   2659     int digitLimit;
   2660     uint8_t uct;
   2661     void* dest;
   2662 
   2663     RLOGD("Inside responseCdmaSms");
   2664 
   2665     if (response == NULL && responselen != 0) {
   2666         RLOGE("invalid response: NULL");
   2667         return RIL_ERRNO_INVALID_RESPONSE;
   2668     }
   2669 
   2670     if (responselen != sizeof(RIL_CDMA_SMS_Message)) {
   2671         RLOGE("invalid response length was %d expected %d",
   2672                 (int)responselen, (int)sizeof(RIL_CDMA_SMS_Message));
   2673         return RIL_ERRNO_INVALID_RESPONSE;
   2674     }
   2675 
   2676     RIL_CDMA_SMS_Message *p_cur = (RIL_CDMA_SMS_Message *) response;
   2677     p.writeInt32(p_cur->uTeleserviceID);
   2678     p.write(&(p_cur->bIsServicePresent),sizeof(uct));
   2679     p.writeInt32(p_cur->uServicecategory);
   2680     p.writeInt32(p_cur->sAddress.digit_mode);
   2681     p.writeInt32(p_cur->sAddress.number_mode);
   2682     p.writeInt32(p_cur->sAddress.number_type);
   2683     p.writeInt32(p_cur->sAddress.number_plan);
   2684     p.write(&(p_cur->sAddress.number_of_digits), sizeof(uct));
   2685     digitLimit= MIN((p_cur->sAddress.number_of_digits), RIL_CDMA_SMS_ADDRESS_MAX);
   2686     for(digitCount =0 ; digitCount < digitLimit; digitCount ++) {
   2687         p.write(&(p_cur->sAddress.digits[digitCount]),sizeof(uct));
   2688     }
   2689 
   2690     p.writeInt32(p_cur->sSubAddress.subaddressType);
   2691     p.write(&(p_cur->sSubAddress.odd),sizeof(uct));
   2692     p.write(&(p_cur->sSubAddress.number_of_digits),sizeof(uct));
   2693     digitLimit= MIN((p_cur->sSubAddress.number_of_digits), RIL_CDMA_SMS_SUBADDRESS_MAX);
   2694     for(digitCount =0 ; digitCount < digitLimit; digitCount ++) {
   2695         p.write(&(p_cur->sSubAddress.digits[digitCount]),sizeof(uct));
   2696     }
   2697 
   2698     digitLimit= MIN((p_cur->uBearerDataLen), RIL_CDMA_SMS_BEARER_DATA_MAX);
   2699     p.writeInt32(p_cur->uBearerDataLen);
   2700     for(digitCount =0 ; digitCount < digitLimit; digitCount ++) {
   2701        p.write(&(p_cur->aBearerData[digitCount]), sizeof(uct));
   2702     }
   2703 
   2704     startResponse;
   2705     appendPrintBuf("%suTeleserviceID=%d, bIsServicePresent=%d, uServicecategory=%d, \
   2706             sAddress.digit_mode=%d, sAddress.number_mode=%d, sAddress.number_type=%d, ",
   2707             printBuf, p_cur->uTeleserviceID,p_cur->bIsServicePresent,p_cur->uServicecategory,
   2708             p_cur->sAddress.digit_mode, p_cur->sAddress.number_mode,p_cur->sAddress.number_type);
   2709     closeResponse;
   2710 
   2711     return 0;
   2712 }
   2713 
   2714 /**
   2715  * A write on the wakeup fd is done just to pop us out of select()
   2716  * We empty the buffer here and then ril_event will reset the timers on the
   2717  * way back down
   2718  */
   2719 static void processWakeupCallback(int fd, short flags, void *param) {
   2720     char buff[16];
   2721     int ret;
   2722 
   2723     RLOGV("processWakeupCallback");
   2724 
   2725     /* empty our wakeup socket out */
   2726     do {
   2727         ret = read(s_fdWakeupRead, &buff, sizeof(buff));
   2728     } while (ret > 0 || (ret < 0 && errno == EINTR));
   2729 }
   2730 
   2731 static void onCommandsSocketClosed() {
   2732     int ret;
   2733     RequestInfo *p_cur;
   2734 
   2735     /* mark pending requests as "cancelled" so we dont report responses */
   2736 
   2737     ret = pthread_mutex_lock(&s_pendingRequestsMutex);
   2738     assert (ret == 0);
   2739 
   2740     p_cur = s_pendingRequests;
   2741 
   2742     for (p_cur = s_pendingRequests
   2743             ; p_cur != NULL
   2744             ; p_cur  = p_cur->p_next
   2745     ) {
   2746         p_cur->cancelled = 1;
   2747     }
   2748 
   2749     ret = pthread_mutex_unlock(&s_pendingRequestsMutex);
   2750     assert (ret == 0);
   2751 }
   2752 
   2753 static void processCommandsCallback(int fd, short flags, void *param) {
   2754     RecordStream *p_rs;
   2755     void *p_record;
   2756     size_t recordlen;
   2757     int ret;
   2758 
   2759     assert(fd == s_fdCommand);
   2760 
   2761     p_rs = (RecordStream *)param;
   2762 
   2763     for (;;) {
   2764         /* loop until EAGAIN/EINTR, end of stream, or other error */
   2765         ret = record_stream_get_next(p_rs, &p_record, &recordlen);
   2766 
   2767         if (ret == 0 && p_record == NULL) {
   2768             /* end-of-stream */
   2769             break;
   2770         } else if (ret < 0) {
   2771             break;
   2772         } else if (ret == 0) { /* && p_record != NULL */
   2773             processCommandBuffer(p_record, recordlen);
   2774         }
   2775     }
   2776 
   2777     if (ret == 0 || !(errno == EAGAIN || errno == EINTR)) {
   2778         /* fatal error or end-of-stream */
   2779         if (ret != 0) {
   2780             RLOGE("error on reading command socket errno:%d\n", errno);
   2781         } else {
   2782             RLOGW("EOS.  Closing command socket.");
   2783         }
   2784 
   2785         close(s_fdCommand);
   2786         s_fdCommand = -1;
   2787 
   2788         ril_event_del(&s_commands_event);
   2789 
   2790         record_stream_free(p_rs);
   2791 
   2792         /* start listening for new connections again */
   2793         rilEventAddWakeup(&s_listen_event);
   2794 
   2795         onCommandsSocketClosed();
   2796     }
   2797 }
   2798 
   2799 
   2800 static void onNewCommandConnect() {
   2801     // Inform we are connected and the ril version
   2802     int rilVer = s_callbacks.version;
   2803     RIL_onUnsolicitedResponse(RIL_UNSOL_RIL_CONNECTED,
   2804                                     &rilVer, sizeof(rilVer));
   2805 
   2806     // implicit radio state changed
   2807     RIL_onUnsolicitedResponse(RIL_UNSOL_RESPONSE_RADIO_STATE_CHANGED,
   2808                                     NULL, 0);
   2809 
   2810     // Send last NITZ time data, in case it was missed
   2811     if (s_lastNITZTimeData != NULL) {
   2812         sendResponseRaw(s_lastNITZTimeData, s_lastNITZTimeDataSize);
   2813 
   2814         free(s_lastNITZTimeData);
   2815         s_lastNITZTimeData = NULL;
   2816     }
   2817 
   2818     // Get version string
   2819     if (s_callbacks.getVersion != NULL) {
   2820         const char *version;
   2821         version = s_callbacks.getVersion();
   2822         RLOGI("RIL Daemon version: %s\n", version);
   2823 
   2824         property_set(PROPERTY_RIL_IMPL, version);
   2825     } else {
   2826         RLOGI("RIL Daemon version: unavailable\n");
   2827         property_set(PROPERTY_RIL_IMPL, "unavailable");
   2828     }
   2829 
   2830 }
   2831 
   2832 static void listenCallback (int fd, short flags, void *param) {
   2833     int ret;
   2834     int err;
   2835     int is_phone_socket;
   2836     RecordStream *p_rs;
   2837 
   2838     struct sockaddr_un peeraddr;
   2839     socklen_t socklen = sizeof (peeraddr);
   2840 
   2841     struct ucred creds;
   2842     socklen_t szCreds = sizeof(creds);
   2843 
   2844     struct passwd *pwd = NULL;
   2845 
   2846     assert (s_fdCommand < 0);
   2847     assert (fd == s_fdListen);
   2848 
   2849     s_fdCommand = accept(s_fdListen, (sockaddr *) &peeraddr, &socklen);
   2850 
   2851     if (s_fdCommand < 0 ) {
   2852         RLOGE("Error on accept() errno:%d", errno);
   2853         /* start listening for new connections again */
   2854         rilEventAddWakeup(&s_listen_event);
   2855 	      return;
   2856     }
   2857 
   2858     /* check the credential of the other side and only accept socket from
   2859      * phone process
   2860      */
   2861     errno = 0;
   2862     is_phone_socket = 0;
   2863 
   2864     err = getsockopt(s_fdCommand, SOL_SOCKET, SO_PEERCRED, &creds, &szCreds);
   2865 
   2866     if (err == 0 && szCreds > 0) {
   2867         errno = 0;
   2868         pwd = getpwuid(creds.uid);
   2869         if (pwd != NULL) {
   2870             if (strcmp(pwd->pw_name, PHONE_PROCESS) == 0) {
   2871                 is_phone_socket = 1;
   2872             } else {
   2873                 RLOGE("RILD can't accept socket from process %s", pwd->pw_name);
   2874             }
   2875         } else {
   2876             RLOGE("Error on getpwuid() errno: %d", errno);
   2877         }
   2878     } else {
   2879         RLOGD("Error on getsockopt() errno: %d", errno);
   2880     }
   2881 
   2882     if ( !is_phone_socket ) {
   2883       RLOGE("RILD must accept socket from %s", PHONE_PROCESS);
   2884 
   2885       close(s_fdCommand);
   2886       s_fdCommand = -1;
   2887 
   2888       onCommandsSocketClosed();
   2889 
   2890       /* start listening for new connections again */
   2891       rilEventAddWakeup(&s_listen_event);
   2892 
   2893       return;
   2894     }
   2895 
   2896     ret = fcntl(s_fdCommand, F_SETFL, O_NONBLOCK);
   2897 
   2898     if (ret < 0) {
   2899         RLOGE ("Error setting O_NONBLOCK errno:%d", errno);
   2900     }
   2901 
   2902     RLOGI("libril: new connection");
   2903 
   2904     p_rs = record_stream_new(s_fdCommand, MAX_COMMAND_BYTES);
   2905 
   2906     ril_event_set (&s_commands_event, s_fdCommand, 1,
   2907         processCommandsCallback, p_rs);
   2908 
   2909     rilEventAddWakeup (&s_commands_event);
   2910 
   2911     onNewCommandConnect();
   2912 }
   2913 
   2914 static void freeDebugCallbackArgs(int number, char **args) {
   2915     for (int i = 0; i < number; i++) {
   2916         if (args[i] != NULL) {
   2917             free(args[i]);
   2918         }
   2919     }
   2920     free(args);
   2921 }
   2922 
   2923 static void debugCallback (int fd, short flags, void *param) {
   2924     int acceptFD, option;
   2925     struct sockaddr_un peeraddr;
   2926     socklen_t socklen = sizeof (peeraddr);
   2927     int data;
   2928     unsigned int qxdm_data[6];
   2929     const char *deactData[1] = {"1"};
   2930     char *actData[1];
   2931     RIL_Dial dialData;
   2932     int hangupData[1] = {1};
   2933     int number;
   2934     char **args;
   2935 
   2936     acceptFD = accept (fd,  (sockaddr *) &peeraddr, &socklen);
   2937 
   2938     if (acceptFD < 0) {
   2939         RLOGE ("error accepting on debug port: %d\n", errno);
   2940         return;
   2941     }
   2942 
   2943     if (recv(acceptFD, &number, sizeof(int), 0) != sizeof(int)) {
   2944         RLOGE ("error reading on socket: number of Args: \n");
   2945         return;
   2946     }
   2947     args = (char **) malloc(sizeof(char*) * number);
   2948 
   2949     for (int i = 0; i < number; i++) {
   2950         int len;
   2951         if (recv(acceptFD, &len, sizeof(int), 0) != sizeof(int)) {
   2952             RLOGE ("error reading on socket: Len of Args: \n");
   2953             freeDebugCallbackArgs(i, args);
   2954             return;
   2955         }
   2956         // +1 for null-term
   2957         args[i] = (char *) malloc((sizeof(char) * len) + 1);
   2958         if (recv(acceptFD, args[i], sizeof(char) * len, 0)
   2959             != (int)sizeof(char) * len) {
   2960             RLOGE ("error reading on socket: Args[%d] \n", i);
   2961             freeDebugCallbackArgs(i, args);
   2962             return;
   2963         }
   2964         char * buf = args[i];
   2965         buf[len] = 0;
   2966     }
   2967 
   2968     switch (atoi(args[0])) {
   2969         case 0:
   2970             RLOGI ("Connection on debug port: issuing reset.");
   2971             issueLocalRequest(RIL_REQUEST_RESET_RADIO, NULL, 0);
   2972             break;
   2973         case 1:
   2974             RLOGI ("Connection on debug port: issuing radio power off.");
   2975             data = 0;
   2976             issueLocalRequest(RIL_REQUEST_RADIO_POWER, &data, sizeof(int));
   2977             // Close the socket
   2978             close(s_fdCommand);
   2979             s_fdCommand = -1;
   2980             break;
   2981         case 2:
   2982             RLOGI ("Debug port: issuing unsolicited voice network change.");
   2983             RIL_onUnsolicitedResponse(RIL_UNSOL_RESPONSE_VOICE_NETWORK_STATE_CHANGED,
   2984                                       NULL, 0);
   2985             break;
   2986         case 3:
   2987             RLOGI ("Debug port: QXDM log enable.");
   2988             qxdm_data[0] = 65536;     // head.func_tag
   2989             qxdm_data[1] = 16;        // head.len
   2990             qxdm_data[2] = 1;         // mode: 1 for 'start logging'
   2991             qxdm_data[3] = 32;        // log_file_size: 32megabytes
   2992             qxdm_data[4] = 0;         // log_mask
   2993             qxdm_data[5] = 8;         // log_max_fileindex
   2994             issueLocalRequest(RIL_REQUEST_OEM_HOOK_RAW, qxdm_data,
   2995                               6 * sizeof(int));
   2996             break;
   2997         case 4:
   2998             RLOGI ("Debug port: QXDM log disable.");
   2999             qxdm_data[0] = 65536;
   3000             qxdm_data[1] = 16;
   3001             qxdm_data[2] = 0;          // mode: 0 for 'stop logging'
   3002             qxdm_data[3] = 32;
   3003             qxdm_data[4] = 0;
   3004             qxdm_data[5] = 8;
   3005             issueLocalRequest(RIL_REQUEST_OEM_HOOK_RAW, qxdm_data,
   3006                               6 * sizeof(int));
   3007             break;
   3008         case 5:
   3009             RLOGI("Debug port: Radio On");
   3010             data = 1;
   3011             issueLocalRequest(RIL_REQUEST_RADIO_POWER, &data, sizeof(int));
   3012             sleep(2);
   3013             // Set network selection automatic.
   3014             issueLocalRequest(RIL_REQUEST_SET_NETWORK_SELECTION_AUTOMATIC, NULL, 0);
   3015             break;
   3016         case 6:
   3017             RLOGI("Debug port: Setup Data Call, Apn :%s\n", args[1]);
   3018             actData[0] = args[1];
   3019             issueLocalRequest(RIL_REQUEST_SETUP_DATA_CALL, &actData,
   3020                               sizeof(actData));
   3021             break;
   3022         case 7:
   3023             RLOGI("Debug port: Deactivate Data Call");
   3024             issueLocalRequest(RIL_REQUEST_DEACTIVATE_DATA_CALL, &deactData,
   3025                               sizeof(deactData));
   3026             break;
   3027         case 8:
   3028             RLOGI("Debug port: Dial Call");
   3029             dialData.clir = 0;
   3030             dialData.address = args[1];
   3031             issueLocalRequest(RIL_REQUEST_DIAL, &dialData, sizeof(dialData));
   3032             break;
   3033         case 9:
   3034             RLOGI("Debug port: Answer Call");
   3035             issueLocalRequest(RIL_REQUEST_ANSWER, NULL, 0);
   3036             break;
   3037         case 10:
   3038             RLOGI("Debug port: End Call");
   3039             issueLocalRequest(RIL_REQUEST_HANGUP, &hangupData,
   3040                               sizeof(hangupData));
   3041             break;
   3042         default:
   3043             RLOGE ("Invalid request");
   3044             break;
   3045     }
   3046     freeDebugCallbackArgs(number, args);
   3047     close(acceptFD);
   3048 }
   3049 
   3050 
   3051 static void userTimerCallback (int fd, short flags, void *param) {
   3052     UserCallbackInfo *p_info;
   3053 
   3054     p_info = (UserCallbackInfo *)param;
   3055 
   3056     p_info->p_callback(p_info->userParam);
   3057 
   3058 
   3059     // FIXME generalize this...there should be a cancel mechanism
   3060     if (s_last_wake_timeout_info != NULL && s_last_wake_timeout_info == p_info) {
   3061         s_last_wake_timeout_info = NULL;
   3062     }
   3063 
   3064     free(p_info);
   3065 }
   3066 
   3067 
   3068 static void *
   3069 eventLoop(void *param) {
   3070     int ret;
   3071     int filedes[2];
   3072 
   3073     ril_event_init();
   3074 
   3075     pthread_mutex_lock(&s_startupMutex);
   3076 
   3077     s_started = 1;
   3078     pthread_cond_broadcast(&s_startupCond);
   3079 
   3080     pthread_mutex_unlock(&s_startupMutex);
   3081 
   3082     ret = pipe(filedes);
   3083 
   3084     if (ret < 0) {
   3085         RLOGE("Error in pipe() errno:%d", errno);
   3086         return NULL;
   3087     }
   3088 
   3089     s_fdWakeupRead = filedes[0];
   3090     s_fdWakeupWrite = filedes[1];
   3091 
   3092     fcntl(s_fdWakeupRead, F_SETFL, O_NONBLOCK);
   3093 
   3094     ril_event_set (&s_wakeupfd_event, s_fdWakeupRead, true,
   3095                 processWakeupCallback, NULL);
   3096 
   3097     rilEventAddWakeup (&s_wakeupfd_event);
   3098 
   3099     // Only returns on error
   3100     ril_event_loop();
   3101     RLOGE ("error in event_loop_base errno:%d", errno);
   3102     // kill self to restart on error
   3103     kill(0, SIGKILL);
   3104 
   3105     return NULL;
   3106 }
   3107 
   3108 extern "C" void
   3109 RIL_startEventLoop(void) {
   3110     int ret;
   3111     pthread_attr_t attr;
   3112 
   3113     /* spin up eventLoop thread and wait for it to get started */
   3114     s_started = 0;
   3115     pthread_mutex_lock(&s_startupMutex);
   3116 
   3117     pthread_attr_init (&attr);
   3118     pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
   3119     ret = pthread_create(&s_tid_dispatch, &attr, eventLoop, NULL);
   3120 
   3121     while (s_started == 0) {
   3122         pthread_cond_wait(&s_startupCond, &s_startupMutex);
   3123     }
   3124 
   3125     pthread_mutex_unlock(&s_startupMutex);
   3126 
   3127     if (ret < 0) {
   3128         RLOGE("Failed to create dispatch thread errno:%d", errno);
   3129         return;
   3130     }
   3131 }
   3132 
   3133 // Used for testing purpose only.
   3134 extern "C" void RIL_setcallbacks (const RIL_RadioFunctions *callbacks) {
   3135     memcpy(&s_callbacks, callbacks, sizeof (RIL_RadioFunctions));
   3136 }
   3137 
   3138 extern "C" void
   3139 RIL_register (const RIL_RadioFunctions *callbacks) {
   3140     int ret;
   3141     int flags;
   3142 
   3143     if (callbacks == NULL) {
   3144         RLOGE("RIL_register: RIL_RadioFunctions * null");
   3145         return;
   3146     }
   3147     if (callbacks->version < RIL_VERSION_MIN) {
   3148         RLOGE("RIL_register: version %d is to old, min version is %d",
   3149              callbacks->version, RIL_VERSION_MIN);
   3150         return;
   3151     }
   3152     if (callbacks->version > RIL_VERSION) {
   3153         RLOGE("RIL_register: version %d is too new, max version is %d",
   3154              callbacks->version, RIL_VERSION);
   3155         return;
   3156     }
   3157     RLOGE("RIL_register: RIL version %d", callbacks->version);
   3158 
   3159     if (s_registerCalled > 0) {
   3160         RLOGE("RIL_register has been called more than once. "
   3161                 "Subsequent call ignored");
   3162         return;
   3163     }
   3164 
   3165     memcpy(&s_callbacks, callbacks, sizeof (RIL_RadioFunctions));
   3166 
   3167     s_registerCalled = 1;
   3168 
   3169     // Little self-check
   3170 
   3171     for (int i = 0; i < (int)NUM_ELEMS(s_commands); i++) {
   3172         assert(i == s_commands[i].requestNumber);
   3173     }
   3174 
   3175     for (int i = 0; i < (int)NUM_ELEMS(s_unsolResponses); i++) {
   3176         assert(i + RIL_UNSOL_RESPONSE_BASE
   3177                 == s_unsolResponses[i].requestNumber);
   3178     }
   3179 
   3180     // New rild impl calls RIL_startEventLoop() first
   3181     // old standalone impl wants it here.
   3182 
   3183     if (s_started == 0) {
   3184         RIL_startEventLoop();
   3185     }
   3186 
   3187     // start listen socket
   3188 
   3189 #if 0
   3190     ret = socket_local_server (SOCKET_NAME_RIL,
   3191             ANDROID_SOCKET_NAMESPACE_ABSTRACT, SOCK_STREAM);
   3192 
   3193     if (ret < 0) {
   3194         RLOGE("Unable to bind socket errno:%d", errno);
   3195         exit (-1);
   3196     }
   3197     s_fdListen = ret;
   3198 
   3199 #else
   3200     s_fdListen = android_get_control_socket(SOCKET_NAME_RIL);
   3201     if (s_fdListen < 0) {
   3202         RLOGE("Failed to get socket '" SOCKET_NAME_RIL "'");
   3203         exit(-1);
   3204     }
   3205 
   3206     ret = listen(s_fdListen, 4);
   3207 
   3208     if (ret < 0) {
   3209         RLOGE("Failed to listen on control socket '%d': %s",
   3210              s_fdListen, strerror(errno));
   3211         exit(-1);
   3212     }
   3213 #endif
   3214 
   3215 
   3216     /* note: non-persistent so we can accept only one connection at a time */
   3217     ril_event_set (&s_listen_event, s_fdListen, false,
   3218                 listenCallback, NULL);
   3219 
   3220     rilEventAddWakeup (&s_listen_event);
   3221 
   3222 #if 1
   3223     // start debug interface socket
   3224 
   3225     s_fdDebug = android_get_control_socket(SOCKET_NAME_RIL_DEBUG);
   3226     if (s_fdDebug < 0) {
   3227         RLOGE("Failed to get socket '" SOCKET_NAME_RIL_DEBUG "' errno:%d", errno);
   3228         exit(-1);
   3229     }
   3230 
   3231     ret = listen(s_fdDebug, 4);
   3232 
   3233     if (ret < 0) {
   3234         RLOGE("Failed to listen on ril debug socket '%d': %s",
   3235              s_fdDebug, strerror(errno));
   3236         exit(-1);
   3237     }
   3238 
   3239     ril_event_set (&s_debug_event, s_fdDebug, true,
   3240                 debugCallback, NULL);
   3241 
   3242     rilEventAddWakeup (&s_debug_event);
   3243 #endif
   3244 
   3245 }
   3246 
   3247 static int
   3248 checkAndDequeueRequestInfo(struct RequestInfo *pRI) {
   3249     int ret = 0;
   3250 
   3251     if (pRI == NULL) {
   3252         return 0;
   3253     }
   3254 
   3255     pthread_mutex_lock(&s_pendingRequestsMutex);
   3256 
   3257     for(RequestInfo **ppCur = &s_pendingRequests
   3258         ; *ppCur != NULL
   3259         ; ppCur = &((*ppCur)->p_next)
   3260     ) {
   3261         if (pRI == *ppCur) {
   3262             ret = 1;
   3263 
   3264             *ppCur = (*ppCur)->p_next;
   3265             break;
   3266         }
   3267     }
   3268 
   3269     pthread_mutex_unlock(&s_pendingRequestsMutex);
   3270 
   3271     return ret;
   3272 }
   3273 
   3274 
   3275 extern "C" void
   3276 RIL_onRequestComplete(RIL_Token t, RIL_Errno e, void *response, size_t responselen) {
   3277     RequestInfo *pRI;
   3278     int ret;
   3279     size_t errorOffset;
   3280 
   3281     pRI = (RequestInfo *)t;
   3282 
   3283     if (!checkAndDequeueRequestInfo(pRI)) {
   3284         RLOGE ("RIL_onRequestComplete: invalid RIL_Token");
   3285         return;
   3286     }
   3287 
   3288     if (pRI->local > 0) {
   3289         // Locally issued command...void only!
   3290         // response does not go back up the command socket
   3291         RLOGD("C[locl]< %s", requestToString(pRI->pCI->requestNumber));
   3292 
   3293         goto done;
   3294     }
   3295 
   3296     appendPrintBuf("[%04d]< %s",
   3297         pRI->token, requestToString(pRI->pCI->requestNumber));
   3298 
   3299     if (pRI->cancelled == 0) {
   3300         Parcel p;
   3301 
   3302         p.writeInt32 (RESPONSE_SOLICITED);
   3303         p.writeInt32 (pRI->token);
   3304         errorOffset = p.dataPosition();
   3305 
   3306         p.writeInt32 (e);
   3307 
   3308         if (response != NULL) {
   3309             // there is a response payload, no matter success or not.
   3310             ret = pRI->pCI->responseFunction(p, response, responselen);
   3311 
   3312             /* if an error occurred, rewind and mark it */
   3313             if (ret != 0) {
   3314                 p.setDataPosition(errorOffset);
   3315                 p.writeInt32 (ret);
   3316             }
   3317         }
   3318 
   3319         if (e != RIL_E_SUCCESS) {
   3320             appendPrintBuf("%s fails by %s", printBuf, failCauseToString(e));
   3321         }
   3322 
   3323         if (s_fdCommand < 0) {
   3324             RLOGD ("RIL onRequestComplete: Command channel closed");
   3325         }
   3326         sendResponse(p);
   3327     }
   3328 
   3329 done:
   3330     free(pRI);
   3331 }
   3332 
   3333 
   3334 static void
   3335 grabPartialWakeLock() {
   3336     acquire_wake_lock(PARTIAL_WAKE_LOCK, ANDROID_WAKE_LOCK_NAME);
   3337 }
   3338 
   3339 static void
   3340 releaseWakeLock() {
   3341     release_wake_lock(ANDROID_WAKE_LOCK_NAME);
   3342 }
   3343 
   3344 /**
   3345  * Timer callback to put us back to sleep before the default timeout
   3346  */
   3347 static void
   3348 wakeTimeoutCallback (void *param) {
   3349     // We're using "param != NULL" as a cancellation mechanism
   3350     if (param == NULL) {
   3351         //RLOGD("wakeTimeout: releasing wake lock");
   3352 
   3353         releaseWakeLock();
   3354     } else {
   3355         //RLOGD("wakeTimeout: releasing wake lock CANCELLED");
   3356     }
   3357 }
   3358 
   3359 static int
   3360 decodeVoiceRadioTechnology (RIL_RadioState radioState) {
   3361     switch (radioState) {
   3362         case RADIO_STATE_SIM_NOT_READY:
   3363         case RADIO_STATE_SIM_LOCKED_OR_ABSENT:
   3364         case RADIO_STATE_SIM_READY:
   3365             return RADIO_TECH_UMTS;
   3366 
   3367         case RADIO_STATE_RUIM_NOT_READY:
   3368         case RADIO_STATE_RUIM_READY:
   3369         case RADIO_STATE_RUIM_LOCKED_OR_ABSENT:
   3370         case RADIO_STATE_NV_NOT_READY:
   3371         case RADIO_STATE_NV_READY:
   3372             return RADIO_TECH_1xRTT;
   3373 
   3374         default:
   3375             RLOGD("decodeVoiceRadioTechnology: Invoked with incorrect RadioState");
   3376             return -1;
   3377     }
   3378 }
   3379 
   3380 static int
   3381 decodeCdmaSubscriptionSource (RIL_RadioState radioState) {
   3382     switch (radioState) {
   3383         case RADIO_STATE_SIM_NOT_READY:
   3384         case RADIO_STATE_SIM_LOCKED_OR_ABSENT:
   3385         case RADIO_STATE_SIM_READY:
   3386         case RADIO_STATE_RUIM_NOT_READY:
   3387         case RADIO_STATE_RUIM_READY:
   3388         case RADIO_STATE_RUIM_LOCKED_OR_ABSENT:
   3389             return CDMA_SUBSCRIPTION_SOURCE_RUIM_SIM;
   3390 
   3391         case RADIO_STATE_NV_NOT_READY:
   3392         case RADIO_STATE_NV_READY:
   3393             return CDMA_SUBSCRIPTION_SOURCE_NV;
   3394 
   3395         default:
   3396             RLOGD("decodeCdmaSubscriptionSource: Invoked with incorrect RadioState");
   3397             return -1;
   3398     }
   3399 }
   3400 
   3401 static int
   3402 decodeSimStatus (RIL_RadioState radioState) {
   3403    switch (radioState) {
   3404        case RADIO_STATE_SIM_NOT_READY:
   3405        case RADIO_STATE_RUIM_NOT_READY:
   3406        case RADIO_STATE_NV_NOT_READY:
   3407        case RADIO_STATE_NV_READY:
   3408            return -1;
   3409        case RADIO_STATE_SIM_LOCKED_OR_ABSENT:
   3410        case RADIO_STATE_SIM_READY:
   3411        case RADIO_STATE_RUIM_READY:
   3412        case RADIO_STATE_RUIM_LOCKED_OR_ABSENT:
   3413            return radioState;
   3414        default:
   3415            RLOGD("decodeSimStatus: Invoked with incorrect RadioState");
   3416            return -1;
   3417    }
   3418 }
   3419 
   3420 static bool is3gpp2(int radioTech) {
   3421     switch (radioTech) {
   3422         case RADIO_TECH_IS95A:
   3423         case RADIO_TECH_IS95B:
   3424         case RADIO_TECH_1xRTT:
   3425         case RADIO_TECH_EVDO_0:
   3426         case RADIO_TECH_EVDO_A:
   3427         case RADIO_TECH_EVDO_B:
   3428         case RADIO_TECH_EHRPD:
   3429             return true;
   3430         default:
   3431             return false;
   3432     }
   3433 }
   3434 
   3435 /* If RIL sends SIM states or RUIM states, store the voice radio
   3436  * technology and subscription source information so that they can be
   3437  * returned when telephony framework requests them
   3438  */
   3439 static RIL_RadioState
   3440 processRadioState(RIL_RadioState newRadioState) {
   3441 
   3442     if((newRadioState > RADIO_STATE_UNAVAILABLE) && (newRadioState < RADIO_STATE_ON)) {
   3443         int newVoiceRadioTech;
   3444         int newCdmaSubscriptionSource;
   3445         int newSimStatus;
   3446 
   3447         /* This is old RIL. Decode Subscription source and Voice Radio Technology
   3448            from Radio State and send change notifications if there has been a change */
   3449         newVoiceRadioTech = decodeVoiceRadioTechnology(newRadioState);
   3450         if(newVoiceRadioTech != voiceRadioTech) {
   3451             voiceRadioTech = newVoiceRadioTech;
   3452             RIL_onUnsolicitedResponse (RIL_UNSOL_VOICE_RADIO_TECH_CHANGED,
   3453                         &voiceRadioTech, sizeof(voiceRadioTech));
   3454         }
   3455         if(is3gpp2(newVoiceRadioTech)) {
   3456             newCdmaSubscriptionSource = decodeCdmaSubscriptionSource(newRadioState);
   3457             if(newCdmaSubscriptionSource != cdmaSubscriptionSource) {
   3458                 cdmaSubscriptionSource = newCdmaSubscriptionSource;
   3459                 RIL_onUnsolicitedResponse (RIL_UNSOL_CDMA_SUBSCRIPTION_SOURCE_CHANGED,
   3460                         &cdmaSubscriptionSource, sizeof(cdmaSubscriptionSource));
   3461             }
   3462         }
   3463         newSimStatus = decodeSimStatus(newRadioState);
   3464         if(newSimStatus != simRuimStatus) {
   3465             simRuimStatus = newSimStatus;
   3466             RIL_onUnsolicitedResponse(RIL_UNSOL_RESPONSE_SIM_STATUS_CHANGED, NULL, 0);
   3467         }
   3468 
   3469         /* Send RADIO_ON to telephony */
   3470         newRadioState = RADIO_STATE_ON;
   3471     }
   3472 
   3473     return newRadioState;
   3474 }
   3475 
   3476 extern "C"
   3477 void RIL_onUnsolicitedResponse(int unsolResponse, void *data,
   3478                                 size_t datalen)
   3479 {
   3480     int unsolResponseIndex;
   3481     int ret;
   3482     int64_t timeReceived = 0;
   3483     bool shouldScheduleTimeout = false;
   3484     RIL_RadioState newState;
   3485 
   3486     if (s_registerCalled == 0) {
   3487         // Ignore RIL_onUnsolicitedResponse before RIL_register
   3488         RLOGW("RIL_onUnsolicitedResponse called before RIL_register");
   3489         return;
   3490     }
   3491 
   3492     unsolResponseIndex = unsolResponse - RIL_UNSOL_RESPONSE_BASE;
   3493 
   3494     if ((unsolResponseIndex < 0)
   3495         || (unsolResponseIndex >= (int32_t)NUM_ELEMS(s_unsolResponses))) {
   3496         RLOGE("unsupported unsolicited response code %d", unsolResponse);
   3497         return;
   3498     }
   3499 
   3500     // Grab a wake lock if needed for this reponse,
   3501     // as we exit we'll either release it immediately
   3502     // or set a timer to release it later.
   3503     switch (s_unsolResponses[unsolResponseIndex].wakeType) {
   3504         case WAKE_PARTIAL:
   3505             grabPartialWakeLock();
   3506             shouldScheduleTimeout = true;
   3507         break;
   3508 
   3509         case DONT_WAKE:
   3510         default:
   3511             // No wake lock is grabed so don't set timeout
   3512             shouldScheduleTimeout = false;
   3513             break;
   3514     }
   3515 
   3516     // Mark the time this was received, doing this
   3517     // after grabing the wakelock incase getting
   3518     // the elapsedRealTime might cause us to goto
   3519     // sleep.
   3520     if (unsolResponse == RIL_UNSOL_NITZ_TIME_RECEIVED) {
   3521         timeReceived = elapsedRealtime();
   3522     }
   3523 
   3524     appendPrintBuf("[UNSL]< %s", requestToString(unsolResponse));
   3525 
   3526     Parcel p;
   3527 
   3528     p.writeInt32 (RESPONSE_UNSOLICITED);
   3529     p.writeInt32 (unsolResponse);
   3530 
   3531     ret = s_unsolResponses[unsolResponseIndex]
   3532                 .responseFunction(p, data, datalen);
   3533     if (ret != 0) {
   3534         // Problem with the response. Don't continue;
   3535         goto error_exit;
   3536     }
   3537 
   3538     // some things get more payload
   3539     switch(unsolResponse) {
   3540         case RIL_UNSOL_RESPONSE_RADIO_STATE_CHANGED:
   3541             newState = processRadioState(s_callbacks.onStateRequest());
   3542             p.writeInt32(newState);
   3543             appendPrintBuf("%s {%s}", printBuf,
   3544                 radioStateToString(s_callbacks.onStateRequest()));
   3545         break;
   3546 
   3547 
   3548         case RIL_UNSOL_NITZ_TIME_RECEIVED:
   3549             // Store the time that this was received so the
   3550             // handler of this message can account for
   3551             // the time it takes to arrive and process. In
   3552             // particular the system has been known to sleep
   3553             // before this message can be processed.
   3554             p.writeInt64(timeReceived);
   3555         break;
   3556     }
   3557 
   3558     ret = sendResponse(p);
   3559     if (ret != 0 && unsolResponse == RIL_UNSOL_NITZ_TIME_RECEIVED) {
   3560 
   3561         // Unfortunately, NITZ time is not poll/update like everything
   3562         // else in the system. So, if the upstream client isn't connected,
   3563         // keep a copy of the last NITZ response (with receive time noted
   3564         // above) around so we can deliver it when it is connected
   3565 
   3566         if (s_lastNITZTimeData != NULL) {
   3567             free (s_lastNITZTimeData);
   3568             s_lastNITZTimeData = NULL;
   3569         }
   3570 
   3571         s_lastNITZTimeData = malloc(p.dataSize());
   3572         s_lastNITZTimeDataSize = p.dataSize();
   3573         memcpy(s_lastNITZTimeData, p.data(), p.dataSize());
   3574     }
   3575 
   3576     // For now, we automatically go back to sleep after TIMEVAL_WAKE_TIMEOUT
   3577     // FIXME The java code should handshake here to release wake lock
   3578 
   3579     if (shouldScheduleTimeout) {
   3580         // Cancel the previous request
   3581         if (s_last_wake_timeout_info != NULL) {
   3582             s_last_wake_timeout_info->userParam = (void *)1;
   3583         }
   3584 
   3585         s_last_wake_timeout_info
   3586             = internalRequestTimedCallback(wakeTimeoutCallback, NULL,
   3587                                             &TIMEVAL_WAKE_TIMEOUT);
   3588     }
   3589 
   3590     // Normal exit
   3591     return;
   3592 
   3593 error_exit:
   3594     if (shouldScheduleTimeout) {
   3595         releaseWakeLock();
   3596     }
   3597 }
   3598 
   3599 /** FIXME generalize this if you track UserCAllbackInfo, clear it
   3600     when the callback occurs
   3601 */
   3602 static UserCallbackInfo *
   3603 internalRequestTimedCallback (RIL_TimedCallback callback, void *param,
   3604                                 const struct timeval *relativeTime)
   3605 {
   3606     struct timeval myRelativeTime;
   3607     UserCallbackInfo *p_info;
   3608 
   3609     p_info = (UserCallbackInfo *) malloc (sizeof(UserCallbackInfo));
   3610 
   3611     p_info->p_callback = callback;
   3612     p_info->userParam = param;
   3613 
   3614     if (relativeTime == NULL) {
   3615         /* treat null parameter as a 0 relative time */
   3616         memset (&myRelativeTime, 0, sizeof(myRelativeTime));
   3617     } else {
   3618         /* FIXME I think event_add's tv param is really const anyway */
   3619         memcpy (&myRelativeTime, relativeTime, sizeof(myRelativeTime));
   3620     }
   3621 
   3622     ril_event_set(&(p_info->event), -1, false, userTimerCallback, p_info);
   3623 
   3624     ril_timer_add(&(p_info->event), &myRelativeTime);
   3625 
   3626     triggerEvLoop();
   3627     return p_info;
   3628 }
   3629 
   3630 
   3631 extern "C" void
   3632 RIL_requestTimedCallback (RIL_TimedCallback callback, void *param,
   3633                                 const struct timeval *relativeTime) {
   3634     internalRequestTimedCallback (callback, param, relativeTime);
   3635 }
   3636 
   3637 const char *
   3638 failCauseToString(RIL_Errno e) {
   3639     switch(e) {
   3640         case RIL_E_SUCCESS: return "E_SUCCESS";
   3641         case RIL_E_RADIO_NOT_AVAILABLE: return "E_RADIO_NOT_AVAILABLE";
   3642         case RIL_E_GENERIC_FAILURE: return "E_GENERIC_FAILURE";
   3643         case RIL_E_PASSWORD_INCORRECT: return "E_PASSWORD_INCORRECT";
   3644         case RIL_E_SIM_PIN2: return "E_SIM_PIN2";
   3645         case RIL_E_SIM_PUK2: return "E_SIM_PUK2";
   3646         case RIL_E_REQUEST_NOT_SUPPORTED: return "E_REQUEST_NOT_SUPPORTED";
   3647         case RIL_E_CANCELLED: return "E_CANCELLED";
   3648         case RIL_E_OP_NOT_ALLOWED_DURING_VOICE_CALL: return "E_OP_NOT_ALLOWED_DURING_VOICE_CALL";
   3649         case RIL_E_OP_NOT_ALLOWED_BEFORE_REG_TO_NW: return "E_OP_NOT_ALLOWED_BEFORE_REG_TO_NW";
   3650         case RIL_E_SMS_SEND_FAIL_RETRY: return "E_SMS_SEND_FAIL_RETRY";
   3651         case RIL_E_SIM_ABSENT:return "E_SIM_ABSENT";
   3652         case RIL_E_ILLEGAL_SIM_OR_ME:return "E_ILLEGAL_SIM_OR_ME";
   3653 #ifdef FEATURE_MULTIMODE_ANDROID
   3654         case RIL_E_SUBSCRIPTION_NOT_AVAILABLE:return "E_SUBSCRIPTION_NOT_AVAILABLE";
   3655         case RIL_E_MODE_NOT_SUPPORTED:return "E_MODE_NOT_SUPPORTED";
   3656 #endif
   3657         default: return "<unknown error>";
   3658     }
   3659 }
   3660 
   3661 const char *
   3662 radioStateToString(RIL_RadioState s) {
   3663     switch(s) {
   3664         case RADIO_STATE_OFF: return "RADIO_OFF";
   3665         case RADIO_STATE_UNAVAILABLE: return "RADIO_UNAVAILABLE";
   3666         case RADIO_STATE_SIM_NOT_READY: return "RADIO_SIM_NOT_READY";
   3667         case RADIO_STATE_SIM_LOCKED_OR_ABSENT: return "RADIO_SIM_LOCKED_OR_ABSENT";
   3668         case RADIO_STATE_SIM_READY: return "RADIO_SIM_READY";
   3669         case RADIO_STATE_RUIM_NOT_READY:return"RADIO_RUIM_NOT_READY";
   3670         case RADIO_STATE_RUIM_READY:return"RADIO_RUIM_READY";
   3671         case RADIO_STATE_RUIM_LOCKED_OR_ABSENT:return"RADIO_RUIM_LOCKED_OR_ABSENT";
   3672         case RADIO_STATE_NV_NOT_READY:return"RADIO_NV_NOT_READY";
   3673         case RADIO_STATE_NV_READY:return"RADIO_NV_READY";
   3674         case RADIO_STATE_ON:return"RADIO_ON";
   3675         default: return "<unknown state>";
   3676     }
   3677 }
   3678 
   3679 const char *
   3680 callStateToString(RIL_CallState s) {
   3681     switch(s) {
   3682         case RIL_CALL_ACTIVE : return "ACTIVE";
   3683         case RIL_CALL_HOLDING: return "HOLDING";
   3684         case RIL_CALL_DIALING: return "DIALING";
   3685         case RIL_CALL_ALERTING: return "ALERTING";
   3686         case RIL_CALL_INCOMING: return "INCOMING";
   3687         case RIL_CALL_WAITING: return "WAITING";
   3688         default: return "<unknown state>";
   3689     }
   3690 }
   3691 
   3692 const char *
   3693 requestToString(int request) {
   3694 /*
   3695  cat libs/telephony/ril_commands.h \
   3696  | egrep "^ *{RIL_" \
   3697  | sed -re 's/\{RIL_([^,]+),[^,]+,([^}]+).+/case RIL_\1: return "\1";/'
   3698 
   3699 
   3700  cat libs/telephony/ril_unsol_commands.h \
   3701  | egrep "^ *{RIL_" \
   3702  | sed -re 's/\{RIL_([^,]+),([^}]+).+/case RIL_\1: return "\1";/'
   3703 
   3704 */
   3705     switch(request) {
   3706         case RIL_REQUEST_GET_SIM_STATUS: return "GET_SIM_STATUS";
   3707         case RIL_REQUEST_ENTER_SIM_PIN: return "ENTER_SIM_PIN";
   3708         case RIL_REQUEST_ENTER_SIM_PUK: return "ENTER_SIM_PUK";
   3709         case RIL_REQUEST_ENTER_SIM_PIN2: return "ENTER_SIM_PIN2";
   3710         case RIL_REQUEST_ENTER_SIM_PUK2: return "ENTER_SIM_PUK2";
   3711         case RIL_REQUEST_CHANGE_SIM_PIN: return "CHANGE_SIM_PIN";
   3712         case RIL_REQUEST_CHANGE_SIM_PIN2: return "CHANGE_SIM_PIN2";
   3713         case RIL_REQUEST_ENTER_NETWORK_DEPERSONALIZATION: return "ENTER_NETWORK_DEPERSONALIZATION";
   3714         case RIL_REQUEST_GET_CURRENT_CALLS: return "GET_CURRENT_CALLS";
   3715         case RIL_REQUEST_DIAL: return "DIAL";
   3716         case RIL_REQUEST_GET_IMSI: return "GET_IMSI";
   3717         case RIL_REQUEST_HANGUP: return "HANGUP";
   3718         case RIL_REQUEST_HANGUP_WAITING_OR_BACKGROUND: return "HANGUP_WAITING_OR_BACKGROUND";
   3719         case RIL_REQUEST_HANGUP_FOREGROUND_RESUME_BACKGROUND: return "HANGUP_FOREGROUND_RESUME_BACKGROUND";
   3720         case RIL_REQUEST_SWITCH_WAITING_OR_HOLDING_AND_ACTIVE: return "SWITCH_WAITING_OR_HOLDING_AND_ACTIVE";
   3721         case RIL_REQUEST_CONFERENCE: return "CONFERENCE";
   3722         case RIL_REQUEST_UDUB: return "UDUB";
   3723         case RIL_REQUEST_LAST_CALL_FAIL_CAUSE: return "LAST_CALL_FAIL_CAUSE";
   3724         case RIL_REQUEST_SIGNAL_STRENGTH: return "SIGNAL_STRENGTH";
   3725         case RIL_REQUEST_VOICE_REGISTRATION_STATE: return "VOICE_REGISTRATION_STATE";
   3726         case RIL_REQUEST_DATA_REGISTRATION_STATE: return "DATA_REGISTRATION_STATE";
   3727         case RIL_REQUEST_OPERATOR: return "OPERATOR";
   3728         case RIL_REQUEST_RADIO_POWER: return "RADIO_POWER";
   3729         case RIL_REQUEST_DTMF: return "DTMF";
   3730         case RIL_REQUEST_SEND_SMS: return "SEND_SMS";
   3731         case RIL_REQUEST_SEND_SMS_EXPECT_MORE: return "SEND_SMS_EXPECT_MORE";
   3732         case RIL_REQUEST_SETUP_DATA_CALL: return "SETUP_DATA_CALL";
   3733         case RIL_REQUEST_SIM_IO: return "SIM_IO";
   3734         case RIL_REQUEST_SEND_USSD: return "SEND_USSD";
   3735         case RIL_REQUEST_CANCEL_USSD: return "CANCEL_USSD";
   3736         case RIL_REQUEST_GET_CLIR: return "GET_CLIR";
   3737         case RIL_REQUEST_SET_CLIR: return "SET_CLIR";
   3738         case RIL_REQUEST_QUERY_CALL_FORWARD_STATUS: return "QUERY_CALL_FORWARD_STATUS";
   3739         case RIL_REQUEST_SET_CALL_FORWARD: return "SET_CALL_FORWARD";
   3740         case RIL_REQUEST_QUERY_CALL_WAITING: return "QUERY_CALL_WAITING";
   3741         case RIL_REQUEST_SET_CALL_WAITING: return "SET_CALL_WAITING";
   3742         case RIL_REQUEST_SMS_ACKNOWLEDGE: return "SMS_ACKNOWLEDGE";
   3743         case RIL_REQUEST_GET_IMEI: return "GET_IMEI";
   3744         case RIL_REQUEST_GET_IMEISV: return "GET_IMEISV";
   3745         case RIL_REQUEST_ANSWER: return "ANSWER";
   3746         case RIL_REQUEST_DEACTIVATE_DATA_CALL: return "DEACTIVATE_DATA_CALL";
   3747         case RIL_REQUEST_QUERY_FACILITY_LOCK: return "QUERY_FACILITY_LOCK";
   3748         case RIL_REQUEST_SET_FACILITY_LOCK: return "SET_FACILITY_LOCK";
   3749         case RIL_REQUEST_CHANGE_BARRING_PASSWORD: return "CHANGE_BARRING_PASSWORD";
   3750         case RIL_REQUEST_QUERY_NETWORK_SELECTION_MODE: return "QUERY_NETWORK_SELECTION_MODE";
   3751         case RIL_REQUEST_SET_NETWORK_SELECTION_AUTOMATIC: return "SET_NETWORK_SELECTION_AUTOMATIC";
   3752         case RIL_REQUEST_SET_NETWORK_SELECTION_MANUAL: return "SET_NETWORK_SELECTION_MANUAL";
   3753         case RIL_REQUEST_QUERY_AVAILABLE_NETWORKS : return "QUERY_AVAILABLE_NETWORKS ";
   3754         case RIL_REQUEST_DTMF_START: return "DTMF_START";
   3755         case RIL_REQUEST_DTMF_STOP: return "DTMF_STOP";
   3756         case RIL_REQUEST_BASEBAND_VERSION: return "BASEBAND_VERSION";
   3757         case RIL_REQUEST_SEPARATE_CONNECTION: return "SEPARATE_CONNECTION";
   3758         case RIL_REQUEST_SET_PREFERRED_NETWORK_TYPE: return "SET_PREFERRED_NETWORK_TYPE";
   3759         case RIL_REQUEST_GET_PREFERRED_NETWORK_TYPE: return "GET_PREFERRED_NETWORK_TYPE";
   3760         case RIL_REQUEST_GET_NEIGHBORING_CELL_IDS: return "GET_NEIGHBORING_CELL_IDS";
   3761         case RIL_REQUEST_SET_MUTE: return "SET_MUTE";
   3762         case RIL_REQUEST_GET_MUTE: return "GET_MUTE";
   3763         case RIL_REQUEST_QUERY_CLIP: return "QUERY_CLIP";
   3764         case RIL_REQUEST_LAST_DATA_CALL_FAIL_CAUSE: return "LAST_DATA_CALL_FAIL_CAUSE";
   3765         case RIL_REQUEST_DATA_CALL_LIST: return "DATA_CALL_LIST";
   3766         case RIL_REQUEST_RESET_RADIO: return "RESET_RADIO";
   3767         case RIL_REQUEST_OEM_HOOK_RAW: return "OEM_HOOK_RAW";
   3768         case RIL_REQUEST_OEM_HOOK_STRINGS: return "OEM_HOOK_STRINGS";
   3769         case RIL_REQUEST_SET_BAND_MODE: return "SET_BAND_MODE";
   3770         case RIL_REQUEST_QUERY_AVAILABLE_BAND_MODE: return "QUERY_AVAILABLE_BAND_MODE";
   3771         case RIL_REQUEST_STK_GET_PROFILE: return "STK_GET_PROFILE";
   3772         case RIL_REQUEST_STK_SET_PROFILE: return "STK_SET_PROFILE";
   3773         case RIL_REQUEST_STK_SEND_ENVELOPE_COMMAND: return "STK_SEND_ENVELOPE_COMMAND";
   3774         case RIL_REQUEST_STK_SEND_TERMINAL_RESPONSE: return "STK_SEND_TERMINAL_RESPONSE";
   3775         case RIL_REQUEST_STK_HANDLE_CALL_SETUP_REQUESTED_FROM_SIM: return "STK_HANDLE_CALL_SETUP_REQUESTED_FROM_SIM";
   3776         case RIL_REQUEST_SCREEN_STATE: return "SCREEN_STATE";
   3777         case RIL_REQUEST_EXPLICIT_CALL_TRANSFER: return "EXPLICIT_CALL_TRANSFER";
   3778         case RIL_REQUEST_SET_LOCATION_UPDATES: return "SET_LOCATION_UPDATES";
   3779         case RIL_REQUEST_CDMA_SET_SUBSCRIPTION_SOURCE:return"CDMA_SET_SUBSCRIPTION_SOURCE";
   3780         case RIL_REQUEST_CDMA_SET_ROAMING_PREFERENCE:return"CDMA_SET_ROAMING_PREFERENCE";
   3781         case RIL_REQUEST_CDMA_QUERY_ROAMING_PREFERENCE:return"CDMA_QUERY_ROAMING_PREFERENCE";
   3782         case RIL_REQUEST_SET_TTY_MODE:return"SET_TTY_MODE";
   3783         case RIL_REQUEST_QUERY_TTY_MODE:return"QUERY_TTY_MODE";
   3784         case RIL_REQUEST_CDMA_SET_PREFERRED_VOICE_PRIVACY_MODE:return"CDMA_SET_PREFERRED_VOICE_PRIVACY_MODE";
   3785         case RIL_REQUEST_CDMA_QUERY_PREFERRED_VOICE_PRIVACY_MODE:return"CDMA_QUERY_PREFERRED_VOICE_PRIVACY_MODE";
   3786         case RIL_REQUEST_CDMA_FLASH:return"CDMA_FLASH";
   3787         case RIL_REQUEST_CDMA_BURST_DTMF:return"CDMA_BURST_DTMF";
   3788         case RIL_REQUEST_CDMA_SEND_SMS:return"CDMA_SEND_SMS";
   3789         case RIL_REQUEST_CDMA_SMS_ACKNOWLEDGE:return"CDMA_SMS_ACKNOWLEDGE";
   3790         case RIL_REQUEST_GSM_GET_BROADCAST_SMS_CONFIG:return"GSM_GET_BROADCAST_SMS_CONFIG";
   3791         case RIL_REQUEST_GSM_SET_BROADCAST_SMS_CONFIG:return"GSM_SET_BROADCAST_SMS_CONFIG";
   3792         case RIL_REQUEST_CDMA_GET_BROADCAST_SMS_CONFIG:return "CDMA_GET_BROADCAST_SMS_CONFIG";
   3793         case RIL_REQUEST_CDMA_SET_BROADCAST_SMS_CONFIG:return "CDMA_SET_BROADCAST_SMS_CONFIG";
   3794         case RIL_REQUEST_CDMA_SMS_BROADCAST_ACTIVATION:return "CDMA_SMS_BROADCAST_ACTIVATION";
   3795         case RIL_REQUEST_CDMA_VALIDATE_AND_WRITE_AKEY: return"CDMA_VALIDATE_AND_WRITE_AKEY";
   3796         case RIL_REQUEST_CDMA_SUBSCRIPTION: return"CDMA_SUBSCRIPTION";
   3797         case RIL_REQUEST_CDMA_WRITE_SMS_TO_RUIM: return "CDMA_WRITE_SMS_TO_RUIM";
   3798         case RIL_REQUEST_CDMA_DELETE_SMS_ON_RUIM: return "CDMA_DELETE_SMS_ON_RUIM";
   3799         case RIL_REQUEST_DEVICE_IDENTITY: return "DEVICE_IDENTITY";
   3800         case RIL_REQUEST_EXIT_EMERGENCY_CALLBACK_MODE: return "EXIT_EMERGENCY_CALLBACK_MODE";
   3801         case RIL_REQUEST_GET_SMSC_ADDRESS: return "GET_SMSC_ADDRESS";
   3802         case RIL_REQUEST_SET_SMSC_ADDRESS: return "SET_SMSC_ADDRESS";
   3803         case RIL_REQUEST_REPORT_SMS_MEMORY_STATUS: return "REPORT_SMS_MEMORY_STATUS";
   3804         case RIL_REQUEST_REPORT_STK_SERVICE_IS_RUNNING: return "REPORT_STK_SERVICE_IS_RUNNING";
   3805         case RIL_REQUEST_CDMA_GET_SUBSCRIPTION_SOURCE: return "CDMA_GET_SUBSCRIPTION_SOURCE";
   3806         case RIL_REQUEST_ISIM_AUTHENTICATION: return "ISIM_AUTHENTICATION";
   3807         case RIL_REQUEST_ACKNOWLEDGE_INCOMING_GSM_SMS_WITH_PDU: return "RIL_REQUEST_ACKNOWLEDGE_INCOMING_GSM_SMS_WITH_PDU";
   3808         case RIL_REQUEST_STK_SEND_ENVELOPE_WITH_STATUS: return "RIL_REQUEST_STK_SEND_ENVELOPE_WITH_STATUS";
   3809         case RIL_REQUEST_VOICE_RADIO_TECH: return "VOICE_RADIO_TECH";
   3810         case RIL_REQUEST_GET_CELL_INFO_LIST: return"GET_CELL_INFO_LIST";
   3811         case RIL_REQUEST_SET_UNSOL_CELL_INFO_LIST_RATE: return"SET_UNSOL_CELL_INFO_LIST_RATE";
   3812         case RIL_REQUEST_SET_INITIAL_ATTACH_APN: return "RIL_REQUEST_SET_INITIAL_ATTACH_APN";
   3813         case RIL_REQUEST_IMS_REGISTRATION_STATE: return "IMS_REGISTRATION_STATE";
   3814         case RIL_REQUEST_IMS_SEND_SMS: return "IMS_SEND_SMS";
   3815         case RIL_UNSOL_RESPONSE_RADIO_STATE_CHANGED: return "UNSOL_RESPONSE_RADIO_STATE_CHANGED";
   3816         case RIL_UNSOL_RESPONSE_CALL_STATE_CHANGED: return "UNSOL_RESPONSE_CALL_STATE_CHANGED";
   3817         case RIL_UNSOL_RESPONSE_VOICE_NETWORK_STATE_CHANGED: return "UNSOL_RESPONSE_VOICE_NETWORK_STATE_CHANGED";
   3818         case RIL_UNSOL_RESPONSE_NEW_SMS: return "UNSOL_RESPONSE_NEW_SMS";
   3819         case RIL_UNSOL_RESPONSE_NEW_SMS_STATUS_REPORT: return "UNSOL_RESPONSE_NEW_SMS_STATUS_REPORT";
   3820         case RIL_UNSOL_RESPONSE_NEW_SMS_ON_SIM: return "UNSOL_RESPONSE_NEW_SMS_ON_SIM";
   3821         case RIL_UNSOL_ON_USSD: return "UNSOL_ON_USSD";
   3822         case RIL_UNSOL_ON_USSD_REQUEST: return "UNSOL_ON_USSD_REQUEST(obsolete)";
   3823         case RIL_UNSOL_NITZ_TIME_RECEIVED: return "UNSOL_NITZ_TIME_RECEIVED";
   3824         case RIL_UNSOL_SIGNAL_STRENGTH: return "UNSOL_SIGNAL_STRENGTH";
   3825         case RIL_UNSOL_STK_SESSION_END: return "UNSOL_STK_SESSION_END";
   3826         case RIL_UNSOL_STK_PROACTIVE_COMMAND: return "UNSOL_STK_PROACTIVE_COMMAND";
   3827         case RIL_UNSOL_STK_EVENT_NOTIFY: return "UNSOL_STK_EVENT_NOTIFY";
   3828         case RIL_UNSOL_STK_CALL_SETUP: return "UNSOL_STK_CALL_SETUP";
   3829         case RIL_UNSOL_SIM_SMS_STORAGE_FULL: return "UNSOL_SIM_SMS_STORAGE_FUL";
   3830         case RIL_UNSOL_SIM_REFRESH: return "UNSOL_SIM_REFRESH";
   3831         case RIL_UNSOL_DATA_CALL_LIST_CHANGED: return "UNSOL_DATA_CALL_LIST_CHANGED";
   3832         case RIL_UNSOL_CALL_RING: return "UNSOL_CALL_RING";
   3833         case RIL_UNSOL_RESPONSE_SIM_STATUS_CHANGED: return "UNSOL_RESPONSE_SIM_STATUS_CHANGED";
   3834         case RIL_UNSOL_RESPONSE_CDMA_NEW_SMS: return "UNSOL_NEW_CDMA_SMS";
   3835         case RIL_UNSOL_RESPONSE_NEW_BROADCAST_SMS: return "UNSOL_NEW_BROADCAST_SMS";
   3836         case RIL_UNSOL_CDMA_RUIM_SMS_STORAGE_FULL: return "UNSOL_CDMA_RUIM_SMS_STORAGE_FULL";
   3837         case RIL_UNSOL_RESTRICTED_STATE_CHANGED: return "UNSOL_RESTRICTED_STATE_CHANGED";
   3838         case RIL_UNSOL_ENTER_EMERGENCY_CALLBACK_MODE: return "UNSOL_ENTER_EMERGENCY_CALLBACK_MODE";
   3839         case RIL_UNSOL_CDMA_CALL_WAITING: return "UNSOL_CDMA_CALL_WAITING";
   3840         case RIL_UNSOL_CDMA_OTA_PROVISION_STATUS: return "UNSOL_CDMA_OTA_PROVISION_STATUS";
   3841         case RIL_UNSOL_CDMA_INFO_REC: return "UNSOL_CDMA_INFO_REC";
   3842         case RIL_UNSOL_OEM_HOOK_RAW: return "UNSOL_OEM_HOOK_RAW";
   3843         case RIL_UNSOL_RINGBACK_TONE: return "UNSOL_RINGBACK_TONE";
   3844         case RIL_UNSOL_RESEND_INCALL_MUTE: return "UNSOL_RESEND_INCALL_MUTE";
   3845         case RIL_UNSOL_CDMA_SUBSCRIPTION_SOURCE_CHANGED: return "UNSOL_CDMA_SUBSCRIPTION_SOURCE_CHANGED";
   3846         case RIL_UNSOL_CDMA_PRL_CHANGED: return "UNSOL_CDMA_PRL_CHANGED";
   3847         case RIL_UNSOL_EXIT_EMERGENCY_CALLBACK_MODE: return "UNSOL_EXIT_EMERGENCY_CALLBACK_MODE";
   3848         case RIL_UNSOL_RIL_CONNECTED: return "UNSOL_RIL_CONNECTED";
   3849         case RIL_UNSOL_VOICE_RADIO_TECH_CHANGED: return "UNSOL_VOICE_RADIO_TECH_CHANGED";
   3850         case RIL_UNSOL_CELL_INFO_LIST: return "UNSOL_CELL_INFO_LIST";
   3851         case RIL_UNSOL_RESPONSE_IMS_NETWORK_STATE_CHANGED: return "RESPONSE_IMS_NETWORK_STATE_CHANGED";
   3852         default: return "<unknown request>";
   3853     }
   3854 }
   3855 
   3856 } /* namespace android */
   3857