Advertisement
Jack2

ril.cpp

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