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