1 /*
2 * Copyright (c) 2016 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17 #define LOG_TAG "RILC"
18
19 #include <android/hardware/radio/1.1/IRadio.h>
20 #include <android/hardware/radio/1.1/IRadioResponse.h>
21 #include <android/hardware/radio/1.1/IRadioIndication.h>
22 #include <android/hardware/radio/1.1/types.h>
23
24 #include <hwbinder/IPCThreadState.h>
25 #include <hwbinder/ProcessState.h>
26 #include <telephony/ril.h>
27 #include <telephony/ril_mnc.h>
28 #include <telephony/ril_mcc.h>
29 #include <ril_service.h>
30 #include <hidl/HidlTransportSupport.h>
31 #include <utils/SystemClock.h>
32 #include <inttypes.h>
33
34 #define INVALID_HEX_CHAR 16
35
36 using namespace android::hardware::radio;
37 using namespace android::hardware::radio::V1_0;
38 using ::android::hardware::configureRpcThreadpool;
39 using ::android::hardware::joinRpcThreadpool;
40 using ::android::hardware::Return;
41 using ::android::hardware::hidl_string;
42 using ::android::hardware::hidl_vec;
43 using ::android::hardware::hidl_array;
44 using ::android::hardware::Void;
45 using android::CommandInfo;
46 using android::RequestInfo;
47 using android::requestToString;
48 using android::sp;
49
50 #define BOOL_TO_INT(x) (x ? 1 : 0)
51 #define ATOI_NULL_HANDLED(x) (x ? atoi(x) : -1)
52 #define ATOI_NULL_HANDLED_DEF(x, defaultVal) (x ? atoi(x) : defaultVal)
53
54 #if defined(ANDROID_MULTI_SIM)
55 #define CALL_ONREQUEST(a, b, c, d, e) \
56 s_vendorFunctions->onRequest((a), (b), (c), (d), ((RIL_SOCKET_ID)(e)))
57 #define CALL_ONSTATEREQUEST(a) s_vendorFunctions->onStateRequest((RIL_SOCKET_ID)(a))
58 #else
59 #define CALL_ONREQUEST(a, b, c, d, e) s_vendorFunctions->onRequest((a), (b), (c), (d))
60 #define CALL_ONSTATEREQUEST(a) s_vendorFunctions->onStateRequest()
61 #endif
62
63 RIL_RadioFunctions *s_vendorFunctions = NULL;
64 static CommandInfo *s_commands;
65
66 struct RadioImpl;
67
68 #if (SIM_COUNT >= 2)
69 sp<RadioImpl> radioService[SIM_COUNT];
70 int64_t nitzTimeReceived[SIM_COUNT];
71 // counter used for synchronization. It is incremented every time response callbacks are updated.
72 volatile int32_t mCounterRadio[SIM_COUNT];
73 #else
74 sp<RadioImpl> radioService[1];
75 int64_t nitzTimeReceived[1];
76 // counter used for synchronization. It is incremented every time response callbacks are updated.
77 volatile int32_t mCounterRadio[1];
78 #endif
79
80 static pthread_rwlock_t radioServiceRwlock = PTHREAD_RWLOCK_INITIALIZER;
81
82 #if (SIM_COUNT >= 2)
83 static pthread_rwlock_t radioServiceRwlock2 = PTHREAD_RWLOCK_INITIALIZER;
84 #if (SIM_COUNT >= 3)
85 static pthread_rwlock_t radioServiceRwlock3 = PTHREAD_RWLOCK_INITIALIZER;
86 #if (SIM_COUNT >= 4)
87 static pthread_rwlock_t radioServiceRwlock4 = PTHREAD_RWLOCK_INITIALIZER;
88 #endif
89 #endif
90 #endif
91
92 void convertRilHardwareConfigListToHal(void *response, size_t responseLen,
93 hidl_vec<HardwareConfig>& records);
94
95 void convertRilRadioCapabilityToHal(void *response, size_t responseLen, RadioCapability& rc);
96
97 void convertRilLceDataInfoToHal(void *response, size_t responseLen, LceDataInfo& lce);
98
99 void convertRilSignalStrengthToHal(void *response, size_t responseLen,
100 SignalStrength& signalStrength);
101
102 void convertRilDataCallToHal(RIL_Data_Call_Response_v11 *dcResponse,
103 SetupDataCallResult& dcResult);
104
105 void convertRilDataCallListToHal(void *response, size_t responseLen,
106 hidl_vec<SetupDataCallResult>& dcResultList);
107
108 void convertRilCellInfoListToHal(void *response, size_t responseLen, hidl_vec<CellInfo>& records);
109
110 struct RadioImpl : public V1_1::IRadio {
111 int32_t mSlotId;
112 sp<IRadioResponse> mRadioResponse;
113 sp<IRadioIndication> mRadioIndication;
114 sp<V1_1::IRadioResponse> mRadioResponseV1_1;
115 sp<V1_1::IRadioIndication> mRadioIndicationV1_1;
116
117 Return<void> setResponseFunctions(
118 const ::android::sp<IRadioResponse>& radioResponse,
119 const ::android::sp<IRadioIndication>& radioIndication);
120
121 Return<void> getIccCardStatus(int32_t serial);
122
123 Return<void> supplyIccPinForApp(int32_t serial, const hidl_string& pin,
124 const hidl_string& aid);
125
126 Return<void> supplyIccPukForApp(int32_t serial, const hidl_string& puk,
127 const hidl_string& pin, const hidl_string& aid);
128
129 Return<void> supplyIccPin2ForApp(int32_t serial,
130 const hidl_string& pin2,
131 const hidl_string& aid);
132
133 Return<void> supplyIccPuk2ForApp(int32_t serial, const hidl_string& puk2,
134 const hidl_string& pin2, const hidl_string& aid);
135
136 Return<void> changeIccPinForApp(int32_t serial, const hidl_string& oldPin,
137 const hidl_string& newPin, const hidl_string& aid);
138
139 Return<void> changeIccPin2ForApp(int32_t serial, const hidl_string& oldPin2,
140 const hidl_string& newPin2, const hidl_string& aid);
141
142 Return<void> supplyNetworkDepersonalization(int32_t serial, const hidl_string& netPin);
143
144 Return<void> getCurrentCalls(int32_t serial);
145
146 Return<void> dial(int32_t serial, const Dial& dialInfo);
147
148 Return<void> getImsiForApp(int32_t serial,
149 const ::android::hardware::hidl_string& aid);
150
151 Return<void> hangup(int32_t serial, int32_t gsmIndex);
152
153 Return<void> hangupWaitingOrBackground(int32_t serial);
154
155 Return<void> hangupForegroundResumeBackground(int32_t serial);
156
157 Return<void> switchWaitingOrHoldingAndActive(int32_t serial);
158
159 Return<void> conference(int32_t serial);
160
161 Return<void> rejectCall(int32_t serial);
162
163 Return<void> getLastCallFailCause(int32_t serial);
164
165 Return<void> getSignalStrength(int32_t serial);
166
167 Return<void> getVoiceRegistrationState(int32_t serial);
168
169 Return<void> getDataRegistrationState(int32_t serial);
170
171 Return<void> getOperator(int32_t serial);
172
173 Return<void> setRadioPower(int32_t serial, bool on);
174
175 Return<void> sendDtmf(int32_t serial,
176 const ::android::hardware::hidl_string& s);
177
178 Return<void> sendSms(int32_t serial, const GsmSmsMessage& message);
179
180 Return<void> sendSMSExpectMore(int32_t serial, const GsmSmsMessage& message);
181
182 Return<void> setupDataCall(int32_t serial,
183 RadioTechnology radioTechnology,
184 const DataProfileInfo& profileInfo,
185 bool modemCognitive,
186 bool roamingAllowed,
187 bool isRoaming);
188
189 Return<void> iccIOForApp(int32_t serial,
190 const IccIo& iccIo);
191
192 Return<void> sendUssd(int32_t serial,
193 const ::android::hardware::hidl_string& ussd);
194
195 Return<void> cancelPendingUssd(int32_t serial);
196
197 Return<void> getClir(int32_t serial);
198
199 Return<void> setClir(int32_t serial, int32_t status);
200
201 Return<void> getCallForwardStatus(int32_t serial,
202 const CallForwardInfo& callInfo);
203
204 Return<void> setCallForward(int32_t serial,
205 const CallForwardInfo& callInfo);
206
207 Return<void> getCallWaiting(int32_t serial, int32_t serviceClass);
208
209 Return<void> setCallWaiting(int32_t serial, bool enable, int32_t serviceClass);
210
211 Return<void> acknowledgeLastIncomingGsmSms(int32_t serial,
212 bool success, SmsAcknowledgeFailCause cause);
213
214 Return<void> acceptCall(int32_t serial);
215
216 Return<void> deactivateDataCall(int32_t serial,
217 int32_t cid, bool reasonRadioShutDown);
218
219 Return<void> getFacilityLockForApp(int32_t serial,
220 const ::android::hardware::hidl_string& facility,
221 const ::android::hardware::hidl_string& password,
222 int32_t serviceClass,
223 const ::android::hardware::hidl_string& appId);
224
225 Return<void> setFacilityLockForApp(int32_t serial,
226 const ::android::hardware::hidl_string& facility,
227 bool lockState,
228 const ::android::hardware::hidl_string& password,
229 int32_t serviceClass,
230 const ::android::hardware::hidl_string& appId);
231
232 Return<void> setBarringPassword(int32_t serial,
233 const ::android::hardware::hidl_string& facility,
234 const ::android::hardware::hidl_string& oldPassword,
235 const ::android::hardware::hidl_string& newPassword);
236
237 Return<void> getNetworkSelectionMode(int32_t serial);
238
239 Return<void> setNetworkSelectionModeAutomatic(int32_t serial);
240
241 Return<void> setNetworkSelectionModeManual(int32_t serial,
242 const ::android::hardware::hidl_string& operatorNumeric);
243
244 Return<void> getAvailableNetworks(int32_t serial);
245
246 Return<void> startNetworkScan(int32_t serial, const V1_1::NetworkScanRequest& request);
247
248 Return<void> stopNetworkScan(int32_t serial);
249
250 Return<void> startDtmf(int32_t serial,
251 const ::android::hardware::hidl_string& s);
252
253 Return<void> stopDtmf(int32_t serial);
254
255 Return<void> getBasebandVersion(int32_t serial);
256
257 Return<void> separateConnection(int32_t serial, int32_t gsmIndex);
258
259 Return<void> setMute(int32_t serial, bool enable);
260
261 Return<void> getMute(int32_t serial);
262
263 Return<void> getClip(int32_t serial);
264
265 Return<void> getDataCallList(int32_t serial);
266
267 Return<void> setSuppServiceNotifications(int32_t serial, bool enable);
268
269 Return<void> writeSmsToSim(int32_t serial,
270 const SmsWriteArgs& smsWriteArgs);
271
272 Return<void> deleteSmsOnSim(int32_t serial, int32_t index);
273
274 Return<void> setBandMode(int32_t serial, RadioBandMode mode);
275
276 Return<void> getAvailableBandModes(int32_t serial);
277
278 Return<void> sendEnvelope(int32_t serial,
279 const ::android::hardware::hidl_string& command);
280
281 Return<void> sendTerminalResponseToSim(int32_t serial,
282 const ::android::hardware::hidl_string& commandResponse);
283
284 Return<void> handleStkCallSetupRequestFromSim(int32_t serial, bool accept);
285
286 Return<void> explicitCallTransfer(int32_t serial);
287
288 Return<void> setPreferredNetworkType(int32_t serial, PreferredNetworkType nwType);
289
290 Return<void> getPreferredNetworkType(int32_t serial);
291
292 Return<void> getNeighboringCids(int32_t serial);
293
294 Return<void> setLocationUpdates(int32_t serial, bool enable);
295
296 Return<void> setCdmaSubscriptionSource(int32_t serial,
297 CdmaSubscriptionSource cdmaSub);
298
299 Return<void> setCdmaRoamingPreference(int32_t serial, CdmaRoamingType type);
300
301 Return<void> getCdmaRoamingPreference(int32_t serial);
302
303 Return<void> setTTYMode(int32_t serial, TtyMode mode);
304
305 Return<void> getTTYMode(int32_t serial);
306
307 Return<void> setPreferredVoicePrivacy(int32_t serial, bool enable);
308
309 Return<void> getPreferredVoicePrivacy(int32_t serial);
310
311 Return<void> sendCDMAFeatureCode(int32_t serial,
312 const ::android::hardware::hidl_string& featureCode);
313
314 Return<void> sendBurstDtmf(int32_t serial,
315 const ::android::hardware::hidl_string& dtmf,
316 int32_t on,
317 int32_t off);
318
319 Return<void> sendCdmaSms(int32_t serial, const CdmaSmsMessage& sms);
320
321 Return<void> acknowledgeLastIncomingCdmaSms(int32_t serial,
322 const CdmaSmsAck& smsAck);
323
324 Return<void> getGsmBroadcastConfig(int32_t serial);
325
326 Return<void> setGsmBroadcastConfig(int32_t serial,
327 const hidl_vec<GsmBroadcastSmsConfigInfo>& configInfo);
328
329 Return<void> setGsmBroadcastActivation(int32_t serial, bool activate);
330
331 Return<void> getCdmaBroadcastConfig(int32_t serial);
332
333 Return<void> setCdmaBroadcastConfig(int32_t serial,
334 const hidl_vec<CdmaBroadcastSmsConfigInfo>& configInfo);
335
336 Return<void> setCdmaBroadcastActivation(int32_t serial, bool activate);
337
338 Return<void> getCDMASubscription(int32_t serial);
339
340 Return<void> writeSmsToRuim(int32_t serial, const CdmaSmsWriteArgs& cdmaSms);
341
342 Return<void> deleteSmsOnRuim(int32_t serial, int32_t index);
343
344 Return<void> getDeviceIdentity(int32_t serial);
345
346 Return<void> exitEmergencyCallbackMode(int32_t serial);
347
348 Return<void> getSmscAddress(int32_t serial);
349
350 Return<void> setSmscAddress(int32_t serial,
351 const ::android::hardware::hidl_string& smsc);
352
353 Return<void> reportSmsMemoryStatus(int32_t serial, bool available);
354
355 Return<void> reportStkServiceIsRunning(int32_t serial);
356
357 Return<void> getCdmaSubscriptionSource(int32_t serial);
358
359 Return<void> requestIsimAuthentication(int32_t serial,
360 const ::android::hardware::hidl_string& challenge);
361
362 Return<void> acknowledgeIncomingGsmSmsWithPdu(int32_t serial,
363 bool success,
364 const ::android::hardware::hidl_string& ackPdu);
365
366 Return<void> sendEnvelopeWithStatus(int32_t serial,
367 const ::android::hardware::hidl_string& contents);
368
369 Return<void> getVoiceRadioTechnology(int32_t serial);
370
371 Return<void> getCellInfoList(int32_t serial);
372
373 Return<void> setCellInfoListRate(int32_t serial, int32_t rate);
374
375 Return<void> setInitialAttachApn(int32_t serial, const DataProfileInfo& dataProfileInfo,
376 bool modemCognitive, bool isRoaming);
377
378 Return<void> getImsRegistrationState(int32_t serial);
379
380 Return<void> sendImsSms(int32_t serial, const ImsSmsMessage& message);
381
382 Return<void> iccTransmitApduBasicChannel(int32_t serial, const SimApdu& message);
383
384 Return<void> iccOpenLogicalChannel(int32_t serial,
385 const ::android::hardware::hidl_string& aid, int32_t p2);
386
387 Return<void> iccCloseLogicalChannel(int32_t serial, int32_t channelId);
388
389 Return<void> iccTransmitApduLogicalChannel(int32_t serial, const SimApdu& message);
390
391 Return<void> nvReadItem(int32_t serial, NvItem itemId);
392
393 Return<void> nvWriteItem(int32_t serial, const NvWriteItem& item);
394
395 Return<void> nvWriteCdmaPrl(int32_t serial,
396 const ::android::hardware::hidl_vec<uint8_t>& prl);
397
398 Return<void> nvResetConfig(int32_t serial, ResetNvType resetType);
399
400 Return<void> setUiccSubscription(int32_t serial, const SelectUiccSub& uiccSub);
401
402 Return<void> setDataAllowed(int32_t serial, bool allow);
403
404 Return<void> getHardwareConfig(int32_t serial);
405
406 Return<void> requestIccSimAuthentication(int32_t serial,
407 int32_t authContext,
408 const ::android::hardware::hidl_string& authData,
409 const ::android::hardware::hidl_string& aid);
410
411 Return<void> setDataProfile(int32_t serial,
412 const ::android::hardware::hidl_vec<DataProfileInfo>& profiles, bool isRoaming);
413
414 Return<void> requestShutdown(int32_t serial);
415
416 Return<void> getRadioCapability(int32_t serial);
417
418 Return<void> setRadioCapability(int32_t serial, const RadioCapability& rc);
419
420 Return<void> startLceService(int32_t serial, int32_t reportInterval, bool pullMode);
421
422 Return<void> stopLceService(int32_t serial);
423
424 Return<void> pullLceData(int32_t serial);
425
426 Return<void> getModemActivityInfo(int32_t serial);
427
428 Return<void> setAllowedCarriers(int32_t serial,
429 bool allAllowed,
430 const CarrierRestrictions& carriers);
431
432 Return<void> getAllowedCarriers(int32_t serial);
433
434 Return<void> sendDeviceState(int32_t serial, DeviceStateType deviceStateType, bool state);
435
436 Return<void> setIndicationFilter(int32_t serial, int32_t indicationFilter);
437
438 Return<void> startKeepalive(int32_t serial, const V1_1::KeepaliveRequest& keepalive);
439
440 Return<void> stopKeepalive(int32_t serial, int32_t sessionHandle);
441
442 Return<void> setSimCardPower(int32_t serial, bool powerUp);
443 Return<void> setSimCardPower_1_1(int32_t serial,
444 const V1_1::CardPowerState state);
445
446 Return<void> responseAcknowledgement();
447
448 Return<void> setCarrierInfoForImsiEncryption(int32_t serial,
449 const V1_1::ImsiEncryptionInfo& message);
450
451 void checkReturnStatus(Return<void>& ret);
452 };
453
memsetAndFreeStrings(int numPointers,...)454 void memsetAndFreeStrings(int numPointers, ...) {
455 va_list ap;
456 va_start(ap, numPointers);
457 for (int i = 0; i < numPointers; i++) {
458 char *ptr = va_arg(ap, char *);
459 if (ptr) {
460 #ifdef MEMSET_FREED
461 #define MAX_STRING_LENGTH 4096
462 memset(ptr, 0, strnlen(ptr, MAX_STRING_LENGTH));
463 #endif
464 free(ptr);
465 }
466 }
467 va_end(ap);
468 }
469
sendErrorResponse(RequestInfo * pRI,RIL_Errno err)470 void sendErrorResponse(RequestInfo *pRI, RIL_Errno err) {
471 pRI->pCI->responseFunction((int) pRI->socket_id,
472 (int) RadioResponseType::SOLICITED, pRI->token, err, NULL, 0);
473 }
474
475 /**
476 * Copies over src to dest. If memory allocation fails, responseFunction() is called for the
477 * request with error RIL_E_NO_MEMORY. The size() method is used to determine the size of the
478 * destination buffer into which the HIDL string is copied. If there is a discrepancy between
479 * the string length reported by the size() method, and the length of the string returned by
480 * the c_str() method, the function will return false indicating a failure.
481 *
482 * Returns true on success, and false on failure.
483 */
copyHidlStringToRil(char ** dest,const hidl_string & src,RequestInfo * pRI,bool allowEmpty)484 bool copyHidlStringToRil(char **dest, const hidl_string &src, RequestInfo *pRI, bool allowEmpty) {
485 size_t len = src.size();
486 if (len == 0 && !allowEmpty) {
487 *dest = NULL;
488 return true;
489 }
490 *dest = (char *) calloc(len + 1, sizeof(char));
491 if (*dest == NULL) {
492 RLOGE("Memory allocation failed for request %s", requestToString(pRI->pCI->requestNumber));
493 sendErrorResponse(pRI, RIL_E_NO_MEMORY);
494 return false;
495 }
496 if (strlcpy(*dest, src.c_str(), len + 1) >= (len + 1)) {
497 RLOGE("Copy of the HIDL string has been truncated, as "
498 "the string length reported by size() does not "
499 "match the length of string returned by c_str().");
500 free(*dest);
501 *dest = NULL;
502 sendErrorResponse(pRI, RIL_E_INTERNAL_ERR);
503 return false;
504 }
505 return true;
506 }
507
copyHidlStringToRil(char ** dest,const hidl_string & src,RequestInfo * pRI)508 bool copyHidlStringToRil(char **dest, const hidl_string &src, RequestInfo *pRI) {
509 return copyHidlStringToRil(dest, src, pRI, false);
510 }
511
convertCharPtrToHidlString(const char * ptr)512 hidl_string convertCharPtrToHidlString(const char *ptr) {
513 hidl_string ret;
514 if (ptr != NULL) {
515 // TODO: replace this with strnlen
516 ret.setToExternal(ptr, strlen(ptr));
517 }
518 return ret;
519 }
520
dispatchVoid(int serial,int slotId,int request)521 bool dispatchVoid(int serial, int slotId, int request) {
522 RequestInfo *pRI = android::addRequestToList(serial, slotId, request);
523 if (pRI == NULL) {
524 return false;
525 }
526 CALL_ONREQUEST(request, NULL, 0, pRI, slotId);
527 return true;
528 }
529
dispatchString(int serial,int slotId,int request,const char * str)530 bool dispatchString(int serial, int slotId, int request, const char * str) {
531 RequestInfo *pRI = android::addRequestToList(serial, slotId, request);
532 if (pRI == NULL) {
533 return false;
534 }
535
536 char *pString;
537 if (!copyHidlStringToRil(&pString, str, pRI)) {
538 return false;
539 }
540
541 CALL_ONREQUEST(request, pString, sizeof(char *), pRI, slotId);
542
543 memsetAndFreeStrings(1, pString);
544 return true;
545 }
546
dispatchStrings(int serial,int slotId,int request,bool allowEmpty,int countStrings,...)547 bool dispatchStrings(int serial, int slotId, int request, bool allowEmpty, int countStrings, ...) {
548 RequestInfo *pRI = android::addRequestToList(serial, slotId, request);
549 if (pRI == NULL) {
550 return false;
551 }
552
553 char **pStrings;
554 pStrings = (char **)calloc(countStrings, sizeof(char *));
555 if (pStrings == NULL) {
556 RLOGE("Memory allocation failed for request %s", requestToString(request));
557 sendErrorResponse(pRI, RIL_E_NO_MEMORY);
558 return false;
559 }
560 va_list ap;
561 va_start(ap, countStrings);
562 for (int i = 0; i < countStrings; i++) {
563 const char* str = va_arg(ap, const char *);
564 if (!copyHidlStringToRil(&pStrings[i], hidl_string(str), pRI, allowEmpty)) {
565 va_end(ap);
566 for (int j = 0; j < i; j++) {
567 memsetAndFreeStrings(1, pStrings[j]);
568 }
569 free(pStrings);
570 return false;
571 }
572 }
573 va_end(ap);
574
575 CALL_ONREQUEST(request, pStrings, countStrings * sizeof(char *), pRI, slotId);
576
577 if (pStrings != NULL) {
578 for (int i = 0 ; i < countStrings ; i++) {
579 memsetAndFreeStrings(1, pStrings[i]);
580 }
581
582 #ifdef MEMSET_FREED
583 memset(pStrings, 0, countStrings * sizeof(char *));
584 #endif
585 free(pStrings);
586 }
587 return true;
588 }
589
dispatchStrings(int serial,int slotId,int request,const hidl_vec<hidl_string> & data)590 bool dispatchStrings(int serial, int slotId, int request, const hidl_vec<hidl_string>& data) {
591 RequestInfo *pRI = android::addRequestToList(serial, slotId, request);
592 if (pRI == NULL) {
593 return false;
594 }
595
596 int countStrings = data.size();
597 char **pStrings;
598 pStrings = (char **)calloc(countStrings, sizeof(char *));
599 if (pStrings == NULL) {
600 RLOGE("Memory allocation failed for request %s", requestToString(request));
601 sendErrorResponse(pRI, RIL_E_NO_MEMORY);
602 return false;
603 }
604
605 for (int i = 0; i < countStrings; i++) {
606 if (!copyHidlStringToRil(&pStrings[i], data[i], pRI)) {
607 for (int j = 0; j < i; j++) {
608 memsetAndFreeStrings(1, pStrings[j]);
609 }
610 free(pStrings);
611 return false;
612 }
613 }
614
615 CALL_ONREQUEST(request, pStrings, countStrings * sizeof(char *), pRI, slotId);
616
617 if (pStrings != NULL) {
618 for (int i = 0 ; i < countStrings ; i++) {
619 memsetAndFreeStrings(1, pStrings[i]);
620 }
621
622 #ifdef MEMSET_FREED
623 memset(pStrings, 0, countStrings * sizeof(char *));
624 #endif
625 free(pStrings);
626 }
627 return true;
628 }
629
dispatchInts(int serial,int slotId,int request,int countInts,...)630 bool dispatchInts(int serial, int slotId, int request, int countInts, ...) {
631 RequestInfo *pRI = android::addRequestToList(serial, slotId, request);
632 if (pRI == NULL) {
633 return false;
634 }
635
636 int *pInts = (int *)calloc(countInts, sizeof(int));
637
638 if (pInts == NULL) {
639 RLOGE("Memory allocation failed for request %s", requestToString(request));
640 sendErrorResponse(pRI, RIL_E_NO_MEMORY);
641 return false;
642 }
643 va_list ap;
644 va_start(ap, countInts);
645 for (int i = 0; i < countInts; i++) {
646 pInts[i] = va_arg(ap, int);
647 }
648 va_end(ap);
649
650 CALL_ONREQUEST(request, pInts, countInts * sizeof(int), pRI, slotId);
651
652 if (pInts != NULL) {
653 #ifdef MEMSET_FREED
654 memset(pInts, 0, countInts * sizeof(int));
655 #endif
656 free(pInts);
657 }
658 return true;
659 }
660
dispatchCallForwardStatus(int serial,int slotId,int request,const CallForwardInfo & callInfo)661 bool dispatchCallForwardStatus(int serial, int slotId, int request,
662 const CallForwardInfo& callInfo) {
663 RequestInfo *pRI = android::addRequestToList(serial, slotId, request);
664 if (pRI == NULL) {
665 return false;
666 }
667
668 RIL_CallForwardInfo cf;
669 cf.status = (int) callInfo.status;
670 cf.reason = callInfo.reason;
671 cf.serviceClass = callInfo.serviceClass;
672 cf.toa = callInfo.toa;
673 cf.timeSeconds = callInfo.timeSeconds;
674
675 if (!copyHidlStringToRil(&cf.number, callInfo.number, pRI)) {
676 return false;
677 }
678
679 CALL_ONREQUEST(request, &cf, sizeof(cf), pRI, slotId);
680
681 memsetAndFreeStrings(1, cf.number);
682
683 return true;
684 }
685
dispatchRaw(int serial,int slotId,int request,const hidl_vec<uint8_t> & rawBytes)686 bool dispatchRaw(int serial, int slotId, int request, const hidl_vec<uint8_t>& rawBytes) {
687 RequestInfo *pRI = android::addRequestToList(serial, slotId, request);
688 if (pRI == NULL) {
689 return false;
690 }
691
692 const uint8_t *uData = rawBytes.data();
693
694 CALL_ONREQUEST(request, (void *) uData, rawBytes.size(), pRI, slotId);
695
696 return true;
697 }
698
dispatchIccApdu(int serial,int slotId,int request,const SimApdu & message)699 bool dispatchIccApdu(int serial, int slotId, int request, const SimApdu& message) {
700 RequestInfo *pRI = android::addRequestToList(serial, slotId, request);
701 if (pRI == NULL) {
702 return false;
703 }
704
705 RIL_SIM_APDU apdu = {};
706
707 apdu.sessionid = message.sessionId;
708 apdu.cla = message.cla;
709 apdu.instruction = message.instruction;
710 apdu.p1 = message.p1;
711 apdu.p2 = message.p2;
712 apdu.p3 = message.p3;
713
714 if (!copyHidlStringToRil(&apdu.data, message.data, pRI)) {
715 return false;
716 }
717
718 CALL_ONREQUEST(request, &apdu, sizeof(apdu), pRI, slotId);
719
720 memsetAndFreeStrings(1, apdu.data);
721
722 return true;
723 }
724
checkReturnStatus(int32_t slotId,Return<void> & ret,bool isRadioService)725 void checkReturnStatus(int32_t slotId, Return<void>& ret, bool isRadioService) {
726 if (ret.isOk() == false) {
727 RLOGE("checkReturnStatus: unable to call response/indication callback");
728 // Remote process hosting the callbacks must be dead. Reset the callback objects;
729 // there's no other recovery to be done here. When the client process is back up, it will
730 // call setResponseFunctions()
731
732 // Caller should already hold rdlock, release that first
733 // note the current counter to avoid overwriting updates made by another thread before
734 // write lock is acquired.
735 int counter = mCounterRadio[slotId];
736 pthread_rwlock_t *radioServiceRwlockPtr = radio::getRadioServiceRwlock(slotId);
737 int ret = pthread_rwlock_unlock(radioServiceRwlockPtr);
738 assert(ret == 0);
739
740 // acquire wrlock
741 ret = pthread_rwlock_wrlock(radioServiceRwlockPtr);
742 assert(ret == 0);
743
744 // make sure the counter value has not changed
745 if (counter == mCounterRadio[slotId]) {
746 radioService[slotId]->mRadioResponse = NULL;
747 radioService[slotId]->mRadioIndication = NULL;
748 radioService[slotId]->mRadioResponseV1_1 = NULL;
749 radioService[slotId]->mRadioIndicationV1_1 = NULL;
750 mCounterRadio[slotId]++;
751 } else {
752 RLOGE("checkReturnStatus: not resetting responseFunctions as they likely "
753 "got updated on another thread");
754 }
755
756 // release wrlock
757 ret = pthread_rwlock_unlock(radioServiceRwlockPtr);
758 assert(ret == 0);
759
760 // Reacquire rdlock
761 ret = pthread_rwlock_rdlock(radioServiceRwlockPtr);
762 assert(ret == 0);
763 }
764 }
765
checkReturnStatus(Return<void> & ret)766 void RadioImpl::checkReturnStatus(Return<void>& ret) {
767 ::checkReturnStatus(mSlotId, ret, true);
768 }
769
setResponseFunctions(const::android::sp<IRadioResponse> & radioResponseParam,const::android::sp<IRadioIndication> & radioIndicationParam)770 Return<void> RadioImpl::setResponseFunctions(
771 const ::android::sp<IRadioResponse>& radioResponseParam,
772 const ::android::sp<IRadioIndication>& radioIndicationParam) {
773 RLOGD("setResponseFunctions");
774
775 pthread_rwlock_t *radioServiceRwlockPtr = radio::getRadioServiceRwlock(mSlotId);
776 int ret = pthread_rwlock_wrlock(radioServiceRwlockPtr);
777 assert(ret == 0);
778
779 mRadioResponse = radioResponseParam;
780 mRadioIndication = radioIndicationParam;
781 mRadioResponseV1_1 = V1_1::IRadioResponse::castFrom(mRadioResponse).withDefault(nullptr);
782 mRadioIndicationV1_1 = V1_1::IRadioIndication::castFrom(mRadioIndication).withDefault(nullptr);
783 if (mRadioResponseV1_1 == nullptr || mRadioIndicationV1_1 == nullptr) {
784 mRadioResponseV1_1 = nullptr;
785 mRadioIndicationV1_1 = nullptr;
786 }
787
788 mCounterRadio[mSlotId]++;
789
790 ret = pthread_rwlock_unlock(radioServiceRwlockPtr);
791 assert(ret == 0);
792
793 // client is connected. Send initial indications.
794 android::onNewCommandConnect((RIL_SOCKET_ID) mSlotId);
795
796 return Void();
797 }
798
getIccCardStatus(int32_t serial)799 Return<void> RadioImpl::getIccCardStatus(int32_t serial) {
800 #if VDBG
801 RLOGD("getIccCardStatus: serial %d", serial);
802 #endif
803 dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_SIM_STATUS);
804 return Void();
805 }
806
supplyIccPinForApp(int32_t serial,const hidl_string & pin,const hidl_string & aid)807 Return<void> RadioImpl::supplyIccPinForApp(int32_t serial, const hidl_string& pin,
808 const hidl_string& aid) {
809 #if VDBG
810 RLOGD("supplyIccPinForApp: serial %d", serial);
811 #endif
812 dispatchStrings(serial, mSlotId, RIL_REQUEST_ENTER_SIM_PIN, true,
813 2, pin.c_str(), aid.c_str());
814 return Void();
815 }
816
supplyIccPukForApp(int32_t serial,const hidl_string & puk,const hidl_string & pin,const hidl_string & aid)817 Return<void> RadioImpl::supplyIccPukForApp(int32_t serial, const hidl_string& puk,
818 const hidl_string& pin, const hidl_string& aid) {
819 #if VDBG
820 RLOGD("supplyIccPukForApp: serial %d", serial);
821 #endif
822 dispatchStrings(serial, mSlotId, RIL_REQUEST_ENTER_SIM_PUK, true,
823 3, puk.c_str(), pin.c_str(), aid.c_str());
824 return Void();
825 }
826
supplyIccPin2ForApp(int32_t serial,const hidl_string & pin2,const hidl_string & aid)827 Return<void> RadioImpl::supplyIccPin2ForApp(int32_t serial, const hidl_string& pin2,
828 const hidl_string& aid) {
829 #if VDBG
830 RLOGD("supplyIccPin2ForApp: serial %d", serial);
831 #endif
832 dispatchStrings(serial, mSlotId, RIL_REQUEST_ENTER_SIM_PIN2, true,
833 2, pin2.c_str(), aid.c_str());
834 return Void();
835 }
836
supplyIccPuk2ForApp(int32_t serial,const hidl_string & puk2,const hidl_string & pin2,const hidl_string & aid)837 Return<void> RadioImpl::supplyIccPuk2ForApp(int32_t serial, const hidl_string& puk2,
838 const hidl_string& pin2, const hidl_string& aid) {
839 #if VDBG
840 RLOGD("supplyIccPuk2ForApp: serial %d", serial);
841 #endif
842 dispatchStrings(serial, mSlotId, RIL_REQUEST_ENTER_SIM_PUK2, true,
843 3, puk2.c_str(), pin2.c_str(), aid.c_str());
844 return Void();
845 }
846
changeIccPinForApp(int32_t serial,const hidl_string & oldPin,const hidl_string & newPin,const hidl_string & aid)847 Return<void> RadioImpl::changeIccPinForApp(int32_t serial, const hidl_string& oldPin,
848 const hidl_string& newPin, const hidl_string& aid) {
849 #if VDBG
850 RLOGD("changeIccPinForApp: serial %d", serial);
851 #endif
852 dispatchStrings(serial, mSlotId, RIL_REQUEST_CHANGE_SIM_PIN, true,
853 3, oldPin.c_str(), newPin.c_str(), aid.c_str());
854 return Void();
855 }
856
changeIccPin2ForApp(int32_t serial,const hidl_string & oldPin2,const hidl_string & newPin2,const hidl_string & aid)857 Return<void> RadioImpl::changeIccPin2ForApp(int32_t serial, const hidl_string& oldPin2,
858 const hidl_string& newPin2, const hidl_string& aid) {
859 #if VDBG
860 RLOGD("changeIccPin2ForApp: serial %d", serial);
861 #endif
862 dispatchStrings(serial, mSlotId, RIL_REQUEST_CHANGE_SIM_PIN2, true,
863 3, oldPin2.c_str(), newPin2.c_str(), aid.c_str());
864 return Void();
865 }
866
supplyNetworkDepersonalization(int32_t serial,const hidl_string & netPin)867 Return<void> RadioImpl::supplyNetworkDepersonalization(int32_t serial,
868 const hidl_string& netPin) {
869 #if VDBG
870 RLOGD("supplyNetworkDepersonalization: serial %d", serial);
871 #endif
872 dispatchStrings(serial, mSlotId, RIL_REQUEST_ENTER_NETWORK_DEPERSONALIZATION, true,
873 1, netPin.c_str());
874 return Void();
875 }
876
getCurrentCalls(int32_t serial)877 Return<void> RadioImpl::getCurrentCalls(int32_t serial) {
878 #if VDBG
879 RLOGD("getCurrentCalls: serial %d", serial);
880 #endif
881 dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_CURRENT_CALLS);
882 return Void();
883 }
884
dial(int32_t serial,const Dial & dialInfo)885 Return<void> RadioImpl::dial(int32_t serial, const Dial& dialInfo) {
886 #if VDBG
887 RLOGD("dial: serial %d", serial);
888 #endif
889 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_DIAL);
890 if (pRI == NULL) {
891 return Void();
892 }
893 RIL_Dial dial = {};
894 RIL_UUS_Info uusInfo = {};
895 int32_t sizeOfDial = sizeof(dial);
896
897 if (!copyHidlStringToRil(&dial.address, dialInfo.address, pRI)) {
898 return Void();
899 }
900 dial.clir = (int) dialInfo.clir;
901
902 if (dialInfo.uusInfo.size() != 0) {
903 uusInfo.uusType = (RIL_UUS_Type) dialInfo.uusInfo[0].uusType;
904 uusInfo.uusDcs = (RIL_UUS_DCS) dialInfo.uusInfo[0].uusDcs;
905
906 if (dialInfo.uusInfo[0].uusData.size() == 0) {
907 uusInfo.uusData = NULL;
908 uusInfo.uusLength = 0;
909 } else {
910 if (!copyHidlStringToRil(&uusInfo.uusData, dialInfo.uusInfo[0].uusData, pRI)) {
911 memsetAndFreeStrings(1, dial.address);
912 return Void();
913 }
914 uusInfo.uusLength = dialInfo.uusInfo[0].uusData.size();
915 }
916
917 dial.uusInfo = &uusInfo;
918 }
919
920 CALL_ONREQUEST(RIL_REQUEST_DIAL, &dial, sizeOfDial, pRI, mSlotId);
921
922 memsetAndFreeStrings(2, dial.address, uusInfo.uusData);
923
924 return Void();
925 }
926
getImsiForApp(int32_t serial,const hidl_string & aid)927 Return<void> RadioImpl::getImsiForApp(int32_t serial, const hidl_string& aid) {
928 #if VDBG
929 RLOGD("getImsiForApp: serial %d", serial);
930 #endif
931 dispatchStrings(serial, mSlotId, RIL_REQUEST_GET_IMSI, false,
932 1, aid.c_str());
933 return Void();
934 }
935
hangup(int32_t serial,int32_t gsmIndex)936 Return<void> RadioImpl::hangup(int32_t serial, int32_t gsmIndex) {
937 #if VDBG
938 RLOGD("hangup: serial %d", serial);
939 #endif
940 dispatchInts(serial, mSlotId, RIL_REQUEST_HANGUP, 1, gsmIndex);
941 return Void();
942 }
943
hangupWaitingOrBackground(int32_t serial)944 Return<void> RadioImpl::hangupWaitingOrBackground(int32_t serial) {
945 #if VDBG
946 RLOGD("hangupWaitingOrBackground: serial %d", serial);
947 #endif
948 dispatchVoid(serial, mSlotId, RIL_REQUEST_HANGUP_WAITING_OR_BACKGROUND);
949 return Void();
950 }
951
hangupForegroundResumeBackground(int32_t serial)952 Return<void> RadioImpl::hangupForegroundResumeBackground(int32_t serial) {
953 #if VDBG
954 RLOGD("hangupForegroundResumeBackground: serial %d", serial);
955 #endif
956 dispatchVoid(serial, mSlotId, RIL_REQUEST_HANGUP_FOREGROUND_RESUME_BACKGROUND);
957 return Void();
958 }
959
switchWaitingOrHoldingAndActive(int32_t serial)960 Return<void> RadioImpl::switchWaitingOrHoldingAndActive(int32_t serial) {
961 #if VDBG
962 RLOGD("switchWaitingOrHoldingAndActive: serial %d", serial);
963 #endif
964 dispatchVoid(serial, mSlotId, RIL_REQUEST_SWITCH_WAITING_OR_HOLDING_AND_ACTIVE);
965 return Void();
966 }
967
conference(int32_t serial)968 Return<void> RadioImpl::conference(int32_t serial) {
969 #if VDBG
970 RLOGD("conference: serial %d", serial);
971 #endif
972 dispatchVoid(serial, mSlotId, RIL_REQUEST_CONFERENCE);
973 return Void();
974 }
975
rejectCall(int32_t serial)976 Return<void> RadioImpl::rejectCall(int32_t serial) {
977 #if VDBG
978 RLOGD("rejectCall: serial %d", serial);
979 #endif
980 dispatchVoid(serial, mSlotId, RIL_REQUEST_UDUB);
981 return Void();
982 }
983
getLastCallFailCause(int32_t serial)984 Return<void> RadioImpl::getLastCallFailCause(int32_t serial) {
985 #if VDBG
986 RLOGD("getLastCallFailCause: serial %d", serial);
987 #endif
988 dispatchVoid(serial, mSlotId, RIL_REQUEST_LAST_CALL_FAIL_CAUSE);
989 return Void();
990 }
991
getSignalStrength(int32_t serial)992 Return<void> RadioImpl::getSignalStrength(int32_t serial) {
993 #if VDBG
994 RLOGD("getSignalStrength: serial %d", serial);
995 #endif
996 dispatchVoid(serial, mSlotId, RIL_REQUEST_SIGNAL_STRENGTH);
997 return Void();
998 }
999
getVoiceRegistrationState(int32_t serial)1000 Return<void> RadioImpl::getVoiceRegistrationState(int32_t serial) {
1001 #if VDBG
1002 RLOGD("getVoiceRegistrationState: serial %d", serial);
1003 #endif
1004 dispatchVoid(serial, mSlotId, RIL_REQUEST_VOICE_REGISTRATION_STATE);
1005 return Void();
1006 }
1007
getDataRegistrationState(int32_t serial)1008 Return<void> RadioImpl::getDataRegistrationState(int32_t serial) {
1009 #if VDBG
1010 RLOGD("getDataRegistrationState: serial %d", serial);
1011 #endif
1012 dispatchVoid(serial, mSlotId, RIL_REQUEST_DATA_REGISTRATION_STATE);
1013 return Void();
1014 }
1015
getOperator(int32_t serial)1016 Return<void> RadioImpl::getOperator(int32_t serial) {
1017 #if VDBG
1018 RLOGD("getOperator: serial %d", serial);
1019 #endif
1020 dispatchVoid(serial, mSlotId, RIL_REQUEST_OPERATOR);
1021 return Void();
1022 }
1023
setRadioPower(int32_t serial,bool on)1024 Return<void> RadioImpl::setRadioPower(int32_t serial, bool on) {
1025 RLOGD("setRadioPower: serial %d on %d", serial, on);
1026 dispatchInts(serial, mSlotId, RIL_REQUEST_RADIO_POWER, 1, BOOL_TO_INT(on));
1027 return Void();
1028 }
1029
sendDtmf(int32_t serial,const hidl_string & s)1030 Return<void> RadioImpl::sendDtmf(int32_t serial, const hidl_string& s) {
1031 #if VDBG
1032 RLOGD("sendDtmf: serial %d", serial);
1033 #endif
1034 dispatchString(serial, mSlotId, RIL_REQUEST_DTMF, s.c_str());
1035 return Void();
1036 }
1037
sendSms(int32_t serial,const GsmSmsMessage & message)1038 Return<void> RadioImpl::sendSms(int32_t serial, const GsmSmsMessage& message) {
1039 #if VDBG
1040 RLOGD("sendSms: serial %d", serial);
1041 #endif
1042 dispatchStrings(serial, mSlotId, RIL_REQUEST_SEND_SMS, false,
1043 2, message.smscPdu.c_str(), message.pdu.c_str());
1044 return Void();
1045 }
1046
sendSMSExpectMore(int32_t serial,const GsmSmsMessage & message)1047 Return<void> RadioImpl::sendSMSExpectMore(int32_t serial, const GsmSmsMessage& message) {
1048 #if VDBG
1049 RLOGD("sendSMSExpectMore: serial %d", serial);
1050 #endif
1051 dispatchStrings(serial, mSlotId, RIL_REQUEST_SEND_SMS_EXPECT_MORE, false,
1052 2, message.smscPdu.c_str(), message.pdu.c_str());
1053 return Void();
1054 }
1055
convertMvnoTypeToString(MvnoType type,char * & str)1056 static bool convertMvnoTypeToString(MvnoType type, char *&str) {
1057 switch (type) {
1058 case MvnoType::IMSI:
1059 str = (char *)"imsi";
1060 return true;
1061 case MvnoType::GID:
1062 str = (char *)"gid";
1063 return true;
1064 case MvnoType::SPN:
1065 str = (char *)"spn";
1066 return true;
1067 case MvnoType::NONE:
1068 str = (char *)"";
1069 return true;
1070 }
1071 return false;
1072 }
1073
setupDataCall(int32_t serial,RadioTechnology radioTechnology,const DataProfileInfo & dataProfileInfo,bool modemCognitive,bool roamingAllowed,bool isRoaming)1074 Return<void> RadioImpl::setupDataCall(int32_t serial, RadioTechnology radioTechnology,
1075 const DataProfileInfo& dataProfileInfo, bool modemCognitive,
1076 bool roamingAllowed, bool isRoaming) {
1077
1078 #if VDBG
1079 RLOGD("setupDataCall: serial %d", serial);
1080 #endif
1081
1082 if (s_vendorFunctions->version >= 4 && s_vendorFunctions->version <= 14) {
1083 const hidl_string &protocol =
1084 (isRoaming ? dataProfileInfo.roamingProtocol : dataProfileInfo.protocol);
1085 dispatchStrings(serial, mSlotId, RIL_REQUEST_SETUP_DATA_CALL, true, 7,
1086 std::to_string((int) radioTechnology + 2).c_str(),
1087 std::to_string((int) dataProfileInfo.profileId).c_str(),
1088 dataProfileInfo.apn.c_str(),
1089 dataProfileInfo.user.c_str(),
1090 dataProfileInfo.password.c_str(),
1091 std::to_string((int) dataProfileInfo.authType).c_str(),
1092 protocol.c_str());
1093 } else if (s_vendorFunctions->version >= 15) {
1094 char *mvnoTypeStr = NULL;
1095 if (!convertMvnoTypeToString(dataProfileInfo.mvnoType, mvnoTypeStr)) {
1096 RequestInfo *pRI = android::addRequestToList(serial, mSlotId,
1097 RIL_REQUEST_SETUP_DATA_CALL);
1098 if (pRI != NULL) {
1099 sendErrorResponse(pRI, RIL_E_INVALID_ARGUMENTS);
1100 }
1101 return Void();
1102 }
1103 dispatchStrings(serial, mSlotId, RIL_REQUEST_SETUP_DATA_CALL, true, 15,
1104 std::to_string((int) radioTechnology + 2).c_str(),
1105 std::to_string((int) dataProfileInfo.profileId).c_str(),
1106 dataProfileInfo.apn.c_str(),
1107 dataProfileInfo.user.c_str(),
1108 dataProfileInfo.password.c_str(),
1109 std::to_string((int) dataProfileInfo.authType).c_str(),
1110 dataProfileInfo.protocol.c_str(),
1111 dataProfileInfo.roamingProtocol.c_str(),
1112 std::to_string(dataProfileInfo.supportedApnTypesBitmap).c_str(),
1113 std::to_string(dataProfileInfo.bearerBitmap).c_str(),
1114 modemCognitive ? "1" : "0",
1115 std::to_string(dataProfileInfo.mtu).c_str(),
1116 mvnoTypeStr,
1117 dataProfileInfo.mvnoMatchData.c_str(),
1118 roamingAllowed ? "1" : "0");
1119 } else {
1120 RLOGE("Unsupported RIL version %d, min version expected 4", s_vendorFunctions->version);
1121 RequestInfo *pRI = android::addRequestToList(serial, mSlotId,
1122 RIL_REQUEST_SETUP_DATA_CALL);
1123 if (pRI != NULL) {
1124 sendErrorResponse(pRI, RIL_E_REQUEST_NOT_SUPPORTED);
1125 }
1126 }
1127 return Void();
1128 }
1129
iccIOForApp(int32_t serial,const IccIo & iccIo)1130 Return<void> RadioImpl::iccIOForApp(int32_t serial, const IccIo& iccIo) {
1131 #if VDBG
1132 RLOGD("iccIOForApp: serial %d", serial);
1133 #endif
1134 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_SIM_IO);
1135 if (pRI == NULL) {
1136 return Void();
1137 }
1138
1139 RIL_SIM_IO_v6 rilIccIo = {};
1140 rilIccIo.command = iccIo.command;
1141 rilIccIo.fileid = iccIo.fileId;
1142 if (!copyHidlStringToRil(&rilIccIo.path, iccIo.path, pRI)) {
1143 return Void();
1144 }
1145
1146 rilIccIo.p1 = iccIo.p1;
1147 rilIccIo.p2 = iccIo.p2;
1148 rilIccIo.p3 = iccIo.p3;
1149
1150 if (!copyHidlStringToRil(&rilIccIo.data, iccIo.data, pRI)) {
1151 memsetAndFreeStrings(1, rilIccIo.path);
1152 return Void();
1153 }
1154
1155 if (!copyHidlStringToRil(&rilIccIo.pin2, iccIo.pin2, pRI)) {
1156 memsetAndFreeStrings(2, rilIccIo.path, rilIccIo.data);
1157 return Void();
1158 }
1159
1160 if (!copyHidlStringToRil(&rilIccIo.aidPtr, iccIo.aid, pRI)) {
1161 memsetAndFreeStrings(3, rilIccIo.path, rilIccIo.data, rilIccIo.pin2);
1162 return Void();
1163 }
1164
1165 CALL_ONREQUEST(RIL_REQUEST_SIM_IO, &rilIccIo, sizeof(rilIccIo), pRI, mSlotId);
1166
1167 memsetAndFreeStrings(4, rilIccIo.path, rilIccIo.data, rilIccIo.pin2, rilIccIo.aidPtr);
1168
1169 return Void();
1170 }
1171
sendUssd(int32_t serial,const hidl_string & ussd)1172 Return<void> RadioImpl::sendUssd(int32_t serial, const hidl_string& ussd) {
1173 #if VDBG
1174 RLOGD("sendUssd: serial %d", serial);
1175 #endif
1176 dispatchString(serial, mSlotId, RIL_REQUEST_SEND_USSD, ussd.c_str());
1177 return Void();
1178 }
1179
cancelPendingUssd(int32_t serial)1180 Return<void> RadioImpl::cancelPendingUssd(int32_t serial) {
1181 #if VDBG
1182 RLOGD("cancelPendingUssd: serial %d", serial);
1183 #endif
1184 dispatchVoid(serial, mSlotId, RIL_REQUEST_CANCEL_USSD);
1185 return Void();
1186 }
1187
getClir(int32_t serial)1188 Return<void> RadioImpl::getClir(int32_t serial) {
1189 #if VDBG
1190 RLOGD("getClir: serial %d", serial);
1191 #endif
1192 dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_CLIR);
1193 return Void();
1194 }
1195
setClir(int32_t serial,int32_t status)1196 Return<void> RadioImpl::setClir(int32_t serial, int32_t status) {
1197 #if VDBG
1198 RLOGD("setClir: serial %d", serial);
1199 #endif
1200 dispatchInts(serial, mSlotId, RIL_REQUEST_SET_CLIR, 1, status);
1201 return Void();
1202 }
1203
getCallForwardStatus(int32_t serial,const CallForwardInfo & callInfo)1204 Return<void> RadioImpl::getCallForwardStatus(int32_t serial, const CallForwardInfo& callInfo) {
1205 #if VDBG
1206 RLOGD("getCallForwardStatus: serial %d", serial);
1207 #endif
1208 dispatchCallForwardStatus(serial, mSlotId, RIL_REQUEST_QUERY_CALL_FORWARD_STATUS,
1209 callInfo);
1210 return Void();
1211 }
1212
setCallForward(int32_t serial,const CallForwardInfo & callInfo)1213 Return<void> RadioImpl::setCallForward(int32_t serial, const CallForwardInfo& callInfo) {
1214 #if VDBG
1215 RLOGD("setCallForward: serial %d", serial);
1216 #endif
1217 dispatchCallForwardStatus(serial, mSlotId, RIL_REQUEST_SET_CALL_FORWARD,
1218 callInfo);
1219 return Void();
1220 }
1221
getCallWaiting(int32_t serial,int32_t serviceClass)1222 Return<void> RadioImpl::getCallWaiting(int32_t serial, int32_t serviceClass) {
1223 #if VDBG
1224 RLOGD("getCallWaiting: serial %d", serial);
1225 #endif
1226 dispatchInts(serial, mSlotId, RIL_REQUEST_QUERY_CALL_WAITING, 1, serviceClass);
1227 return Void();
1228 }
1229
setCallWaiting(int32_t serial,bool enable,int32_t serviceClass)1230 Return<void> RadioImpl::setCallWaiting(int32_t serial, bool enable, int32_t serviceClass) {
1231 #if VDBG
1232 RLOGD("setCallWaiting: serial %d", serial);
1233 #endif
1234 dispatchInts(serial, mSlotId, RIL_REQUEST_SET_CALL_WAITING, 2, BOOL_TO_INT(enable),
1235 serviceClass);
1236 return Void();
1237 }
1238
acknowledgeLastIncomingGsmSms(int32_t serial,bool success,SmsAcknowledgeFailCause cause)1239 Return<void> RadioImpl::acknowledgeLastIncomingGsmSms(int32_t serial,
1240 bool success, SmsAcknowledgeFailCause cause) {
1241 #if VDBG
1242 RLOGD("acknowledgeLastIncomingGsmSms: serial %d", serial);
1243 #endif
1244 dispatchInts(serial, mSlotId, RIL_REQUEST_SMS_ACKNOWLEDGE, 2, BOOL_TO_INT(success),
1245 cause);
1246 return Void();
1247 }
1248
acceptCall(int32_t serial)1249 Return<void> RadioImpl::acceptCall(int32_t serial) {
1250 #if VDBG
1251 RLOGD("acceptCall: serial %d", serial);
1252 #endif
1253 dispatchVoid(serial, mSlotId, RIL_REQUEST_ANSWER);
1254 return Void();
1255 }
1256
deactivateDataCall(int32_t serial,int32_t cid,bool reasonRadioShutDown)1257 Return<void> RadioImpl::deactivateDataCall(int32_t serial,
1258 int32_t cid, bool reasonRadioShutDown) {
1259 #if VDBG
1260 RLOGD("deactivateDataCall: serial %d", serial);
1261 #endif
1262 dispatchStrings(serial, mSlotId, RIL_REQUEST_DEACTIVATE_DATA_CALL, false,
1263 2, (std::to_string(cid)).c_str(), reasonRadioShutDown ? "1" : "0");
1264 return Void();
1265 }
1266
getFacilityLockForApp(int32_t serial,const hidl_string & facility,const hidl_string & password,int32_t serviceClass,const hidl_string & appId)1267 Return<void> RadioImpl::getFacilityLockForApp(int32_t serial, const hidl_string& facility,
1268 const hidl_string& password, int32_t serviceClass,
1269 const hidl_string& appId) {
1270 #if VDBG
1271 RLOGD("getFacilityLockForApp: serial %d", serial);
1272 #endif
1273 dispatchStrings(serial, mSlotId, RIL_REQUEST_QUERY_FACILITY_LOCK, true,
1274 4, facility.c_str(), password.c_str(),
1275 (std::to_string(serviceClass)).c_str(), appId.c_str());
1276 return Void();
1277 }
1278
setFacilityLockForApp(int32_t serial,const hidl_string & facility,bool lockState,const hidl_string & password,int32_t serviceClass,const hidl_string & appId)1279 Return<void> RadioImpl::setFacilityLockForApp(int32_t serial, const hidl_string& facility,
1280 bool lockState, const hidl_string& password,
1281 int32_t serviceClass, const hidl_string& appId) {
1282 #if VDBG
1283 RLOGD("setFacilityLockForApp: serial %d", serial);
1284 #endif
1285 dispatchStrings(serial, mSlotId, RIL_REQUEST_SET_FACILITY_LOCK, true,
1286 5, facility.c_str(), lockState ? "1" : "0", password.c_str(),
1287 (std::to_string(serviceClass)).c_str(), appId.c_str() );
1288 return Void();
1289 }
1290
setBarringPassword(int32_t serial,const hidl_string & facility,const hidl_string & oldPassword,const hidl_string & newPassword)1291 Return<void> RadioImpl::setBarringPassword(int32_t serial, const hidl_string& facility,
1292 const hidl_string& oldPassword,
1293 const hidl_string& newPassword) {
1294 #if VDBG
1295 RLOGD("setBarringPassword: serial %d", serial);
1296 #endif
1297 dispatchStrings(serial, mSlotId, RIL_REQUEST_CHANGE_BARRING_PASSWORD, true,
1298 3, facility.c_str(), oldPassword.c_str(), newPassword.c_str());
1299 return Void();
1300 }
1301
getNetworkSelectionMode(int32_t serial)1302 Return<void> RadioImpl::getNetworkSelectionMode(int32_t serial) {
1303 #if VDBG
1304 RLOGD("getNetworkSelectionMode: serial %d", serial);
1305 #endif
1306 dispatchVoid(serial, mSlotId, RIL_REQUEST_QUERY_NETWORK_SELECTION_MODE);
1307 return Void();
1308 }
1309
setNetworkSelectionModeAutomatic(int32_t serial)1310 Return<void> RadioImpl::setNetworkSelectionModeAutomatic(int32_t serial) {
1311 #if VDBG
1312 RLOGD("setNetworkSelectionModeAutomatic: serial %d", serial);
1313 #endif
1314 dispatchVoid(serial, mSlotId, RIL_REQUEST_SET_NETWORK_SELECTION_AUTOMATIC);
1315 return Void();
1316 }
1317
setNetworkSelectionModeManual(int32_t serial,const hidl_string & operatorNumeric)1318 Return<void> RadioImpl::setNetworkSelectionModeManual(int32_t serial,
1319 const hidl_string& operatorNumeric) {
1320 #if VDBG
1321 RLOGD("setNetworkSelectionModeManual: serial %d", serial);
1322 #endif
1323 dispatchString(serial, mSlotId, RIL_REQUEST_SET_NETWORK_SELECTION_MANUAL,
1324 operatorNumeric.c_str());
1325 return Void();
1326 }
1327
getAvailableNetworks(int32_t serial)1328 Return<void> RadioImpl::getAvailableNetworks(int32_t serial) {
1329 #if VDBG
1330 RLOGD("getAvailableNetworks: serial %d", serial);
1331 #endif
1332 dispatchVoid(serial, mSlotId, RIL_REQUEST_QUERY_AVAILABLE_NETWORKS);
1333 return Void();
1334 }
1335
startNetworkScan(int32_t serial,const V1_1::NetworkScanRequest & request)1336 Return<void> RadioImpl::startNetworkScan(int32_t serial, const V1_1::NetworkScanRequest& request) {
1337 #if VDBG
1338 RLOGD("startNetworkScan: serial %d", serial);
1339 #endif
1340
1341 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_START_NETWORK_SCAN);
1342 if (pRI == NULL) {
1343 return Void();
1344 }
1345
1346 if (request.specifiers.size() > MAX_RADIO_ACCESS_NETWORKS) {
1347 sendErrorResponse(pRI, RIL_E_INVALID_ARGUMENTS);
1348 return Void();
1349 }
1350
1351 RIL_NetworkScanRequest scan_request = {};
1352
1353 scan_request.type = (RIL_ScanType) request.type;
1354 scan_request.interval = request.interval;
1355 scan_request.specifiers_length = request.specifiers.size();
1356 for (size_t i = 0; i < request.specifiers.size(); ++i) {
1357 if (request.specifiers[i].geranBands.size() > MAX_BANDS ||
1358 request.specifiers[i].utranBands.size() > MAX_BANDS ||
1359 request.specifiers[i].eutranBands.size() > MAX_BANDS ||
1360 request.specifiers[i].channels.size() > MAX_CHANNELS) {
1361 sendErrorResponse(pRI, RIL_E_INVALID_ARGUMENTS);
1362 return Void();
1363 }
1364 const V1_1::RadioAccessSpecifier& ras_from =
1365 request.specifiers[i];
1366 RIL_RadioAccessSpecifier& ras_to = scan_request.specifiers[i];
1367
1368 ras_to.radio_access_network = (RIL_RadioAccessNetworks) ras_from.radioAccessNetwork;
1369 ras_to.channels_length = ras_from.channels.size();
1370
1371 std::copy(ras_from.channels.begin(), ras_from.channels.end(), ras_to.channels);
1372 const std::vector<uint32_t> * bands = nullptr;
1373 switch (request.specifiers[i].radioAccessNetwork) {
1374 case V1_1::RadioAccessNetworks::GERAN:
1375 ras_to.bands_length = ras_from.geranBands.size();
1376 bands = (std::vector<uint32_t> *) &ras_from.geranBands;
1377 break;
1378 case V1_1::RadioAccessNetworks::UTRAN:
1379 ras_to.bands_length = ras_from.utranBands.size();
1380 bands = (std::vector<uint32_t> *) &ras_from.utranBands;
1381 break;
1382 case V1_1::RadioAccessNetworks::EUTRAN:
1383 ras_to.bands_length = ras_from.eutranBands.size();
1384 bands = (std::vector<uint32_t> *) &ras_from.eutranBands;
1385 break;
1386 default:
1387 sendErrorResponse(pRI, RIL_E_INVALID_ARGUMENTS);
1388 return Void();
1389 }
1390 // safe to copy to geran_bands because it's a union member
1391 for (size_t idx = 0; idx < ras_to.bands_length; ++idx) {
1392 ras_to.bands.geran_bands[idx] = (RIL_GeranBands) (*bands)[idx];
1393 }
1394 }
1395
1396 CALL_ONREQUEST(RIL_REQUEST_START_NETWORK_SCAN, &scan_request, sizeof(scan_request), pRI,
1397 mSlotId);
1398
1399 return Void();
1400 }
1401
stopNetworkScan(int32_t serial)1402 Return<void> RadioImpl::stopNetworkScan(int32_t serial) {
1403 #if VDBG
1404 RLOGD("stopNetworkScan: serial %d", serial);
1405 #endif
1406 dispatchVoid(serial, mSlotId, RIL_REQUEST_STOP_NETWORK_SCAN);
1407 return Void();
1408 }
1409
startDtmf(int32_t serial,const hidl_string & s)1410 Return<void> RadioImpl::startDtmf(int32_t serial, const hidl_string& s) {
1411 #if VDBG
1412 RLOGD("startDtmf: serial %d", serial);
1413 #endif
1414 dispatchString(serial, mSlotId, RIL_REQUEST_DTMF_START,
1415 s.c_str());
1416 return Void();
1417 }
1418
stopDtmf(int32_t serial)1419 Return<void> RadioImpl::stopDtmf(int32_t serial) {
1420 #if VDBG
1421 RLOGD("stopDtmf: serial %d", serial);
1422 #endif
1423 dispatchVoid(serial, mSlotId, RIL_REQUEST_DTMF_STOP);
1424 return Void();
1425 }
1426
getBasebandVersion(int32_t serial)1427 Return<void> RadioImpl::getBasebandVersion(int32_t serial) {
1428 #if VDBG
1429 RLOGD("getBasebandVersion: serial %d", serial);
1430 #endif
1431 dispatchVoid(serial, mSlotId, RIL_REQUEST_BASEBAND_VERSION);
1432 return Void();
1433 }
1434
separateConnection(int32_t serial,int32_t gsmIndex)1435 Return<void> RadioImpl::separateConnection(int32_t serial, int32_t gsmIndex) {
1436 #if VDBG
1437 RLOGD("separateConnection: serial %d", serial);
1438 #endif
1439 dispatchInts(serial, mSlotId, RIL_REQUEST_SEPARATE_CONNECTION, 1, gsmIndex);
1440 return Void();
1441 }
1442
setMute(int32_t serial,bool enable)1443 Return<void> RadioImpl::setMute(int32_t serial, bool enable) {
1444 #if VDBG
1445 RLOGD("setMute: serial %d", serial);
1446 #endif
1447 dispatchInts(serial, mSlotId, RIL_REQUEST_SET_MUTE, 1, BOOL_TO_INT(enable));
1448 return Void();
1449 }
1450
getMute(int32_t serial)1451 Return<void> RadioImpl::getMute(int32_t serial) {
1452 #if VDBG
1453 RLOGD("getMute: serial %d", serial);
1454 #endif
1455 dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_MUTE);
1456 return Void();
1457 }
1458
getClip(int32_t serial)1459 Return<void> RadioImpl::getClip(int32_t serial) {
1460 #if VDBG
1461 RLOGD("getClip: serial %d", serial);
1462 #endif
1463 dispatchVoid(serial, mSlotId, RIL_REQUEST_QUERY_CLIP);
1464 return Void();
1465 }
1466
getDataCallList(int32_t serial)1467 Return<void> RadioImpl::getDataCallList(int32_t serial) {
1468 #if VDBG
1469 RLOGD("getDataCallList: serial %d", serial);
1470 #endif
1471 dispatchVoid(serial, mSlotId, RIL_REQUEST_DATA_CALL_LIST);
1472 return Void();
1473 }
1474
setSuppServiceNotifications(int32_t serial,bool enable)1475 Return<void> RadioImpl::setSuppServiceNotifications(int32_t serial, bool enable) {
1476 #if VDBG
1477 RLOGD("setSuppServiceNotifications: serial %d", serial);
1478 #endif
1479 dispatchInts(serial, mSlotId, RIL_REQUEST_SET_SUPP_SVC_NOTIFICATION, 1,
1480 BOOL_TO_INT(enable));
1481 return Void();
1482 }
1483
writeSmsToSim(int32_t serial,const SmsWriteArgs & smsWriteArgs)1484 Return<void> RadioImpl::writeSmsToSim(int32_t serial, const SmsWriteArgs& smsWriteArgs) {
1485 #if VDBG
1486 RLOGD("writeSmsToSim: serial %d", serial);
1487 #endif
1488 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_WRITE_SMS_TO_SIM);
1489 if (pRI == NULL) {
1490 return Void();
1491 }
1492
1493 RIL_SMS_WriteArgs args;
1494 args.status = (int) smsWriteArgs.status;
1495
1496 if (!copyHidlStringToRil(&args.pdu, smsWriteArgs.pdu, pRI)) {
1497 return Void();
1498 }
1499
1500 if (!copyHidlStringToRil(&args.smsc, smsWriteArgs.smsc, pRI)) {
1501 memsetAndFreeStrings(1, args.pdu);
1502 return Void();
1503 }
1504
1505 CALL_ONREQUEST(RIL_REQUEST_WRITE_SMS_TO_SIM, &args, sizeof(args), pRI, mSlotId);
1506
1507 memsetAndFreeStrings(2, args.smsc, args.pdu);
1508
1509 return Void();
1510 }
1511
deleteSmsOnSim(int32_t serial,int32_t index)1512 Return<void> RadioImpl::deleteSmsOnSim(int32_t serial, int32_t index) {
1513 #if VDBG
1514 RLOGD("deleteSmsOnSim: serial %d", serial);
1515 #endif
1516 dispatchInts(serial, mSlotId, RIL_REQUEST_DELETE_SMS_ON_SIM, 1, index);
1517 return Void();
1518 }
1519
setBandMode(int32_t serial,RadioBandMode mode)1520 Return<void> RadioImpl::setBandMode(int32_t serial, RadioBandMode mode) {
1521 #if VDBG
1522 RLOGD("setBandMode: serial %d", serial);
1523 #endif
1524 dispatchInts(serial, mSlotId, RIL_REQUEST_SET_BAND_MODE, 1, mode);
1525 return Void();
1526 }
1527
getAvailableBandModes(int32_t serial)1528 Return<void> RadioImpl::getAvailableBandModes(int32_t serial) {
1529 #if VDBG
1530 RLOGD("getAvailableBandModes: serial %d", serial);
1531 #endif
1532 dispatchVoid(serial, mSlotId, RIL_REQUEST_QUERY_AVAILABLE_BAND_MODE);
1533 return Void();
1534 }
1535
sendEnvelope(int32_t serial,const hidl_string & command)1536 Return<void> RadioImpl::sendEnvelope(int32_t serial, const hidl_string& command) {
1537 #if VDBG
1538 RLOGD("sendEnvelope: serial %d", serial);
1539 #endif
1540 dispatchString(serial, mSlotId, RIL_REQUEST_STK_SEND_ENVELOPE_COMMAND,
1541 command.c_str());
1542 return Void();
1543 }
1544
sendTerminalResponseToSim(int32_t serial,const hidl_string & commandResponse)1545 Return<void> RadioImpl::sendTerminalResponseToSim(int32_t serial,
1546 const hidl_string& commandResponse) {
1547 #if VDBG
1548 RLOGD("sendTerminalResponseToSim: serial %d", serial);
1549 #endif
1550 dispatchString(serial, mSlotId, RIL_REQUEST_STK_SEND_TERMINAL_RESPONSE,
1551 commandResponse.c_str());
1552 return Void();
1553 }
1554
handleStkCallSetupRequestFromSim(int32_t serial,bool accept)1555 Return<void> RadioImpl::handleStkCallSetupRequestFromSim(int32_t serial, bool accept) {
1556 #if VDBG
1557 RLOGD("handleStkCallSetupRequestFromSim: serial %d", serial);
1558 #endif
1559 dispatchInts(serial, mSlotId, RIL_REQUEST_STK_HANDLE_CALL_SETUP_REQUESTED_FROM_SIM,
1560 1, BOOL_TO_INT(accept));
1561 return Void();
1562 }
1563
explicitCallTransfer(int32_t serial)1564 Return<void> RadioImpl::explicitCallTransfer(int32_t serial) {
1565 #if VDBG
1566 RLOGD("explicitCallTransfer: serial %d", serial);
1567 #endif
1568 dispatchVoid(serial, mSlotId, RIL_REQUEST_EXPLICIT_CALL_TRANSFER);
1569 return Void();
1570 }
1571
setPreferredNetworkType(int32_t serial,PreferredNetworkType nwType)1572 Return<void> RadioImpl::setPreferredNetworkType(int32_t serial, PreferredNetworkType nwType) {
1573 #if VDBG
1574 RLOGD("setPreferredNetworkType: serial %d", serial);
1575 #endif
1576 dispatchInts(serial, mSlotId, RIL_REQUEST_SET_PREFERRED_NETWORK_TYPE, 1, nwType);
1577 return Void();
1578 }
1579
getPreferredNetworkType(int32_t serial)1580 Return<void> RadioImpl::getPreferredNetworkType(int32_t serial) {
1581 #if VDBG
1582 RLOGD("getPreferredNetworkType: serial %d", serial);
1583 #endif
1584 dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_PREFERRED_NETWORK_TYPE);
1585 return Void();
1586 }
1587
getNeighboringCids(int32_t serial)1588 Return<void> RadioImpl::getNeighboringCids(int32_t serial) {
1589 #if VDBG
1590 RLOGD("getNeighboringCids: serial %d", serial);
1591 #endif
1592 dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_NEIGHBORING_CELL_IDS);
1593 return Void();
1594 }
1595
setLocationUpdates(int32_t serial,bool enable)1596 Return<void> RadioImpl::setLocationUpdates(int32_t serial, bool enable) {
1597 #if VDBG
1598 RLOGD("setLocationUpdates: serial %d", serial);
1599 #endif
1600 dispatchInts(serial, mSlotId, RIL_REQUEST_SET_LOCATION_UPDATES, 1, BOOL_TO_INT(enable));
1601 return Void();
1602 }
1603
setCdmaSubscriptionSource(int32_t serial,CdmaSubscriptionSource cdmaSub)1604 Return<void> RadioImpl::setCdmaSubscriptionSource(int32_t serial, CdmaSubscriptionSource cdmaSub) {
1605 #if VDBG
1606 RLOGD("setCdmaSubscriptionSource: serial %d", serial);
1607 #endif
1608 dispatchInts(serial, mSlotId, RIL_REQUEST_CDMA_SET_SUBSCRIPTION_SOURCE, 1, cdmaSub);
1609 return Void();
1610 }
1611
setCdmaRoamingPreference(int32_t serial,CdmaRoamingType type)1612 Return<void> RadioImpl::setCdmaRoamingPreference(int32_t serial, CdmaRoamingType type) {
1613 #if VDBG
1614 RLOGD("setCdmaRoamingPreference: serial %d", serial);
1615 #endif
1616 dispatchInts(serial, mSlotId, RIL_REQUEST_CDMA_SET_ROAMING_PREFERENCE, 1, type);
1617 return Void();
1618 }
1619
getCdmaRoamingPreference(int32_t serial)1620 Return<void> RadioImpl::getCdmaRoamingPreference(int32_t serial) {
1621 #if VDBG
1622 RLOGD("getCdmaRoamingPreference: serial %d", serial);
1623 #endif
1624 dispatchVoid(serial, mSlotId, RIL_REQUEST_CDMA_QUERY_ROAMING_PREFERENCE);
1625 return Void();
1626 }
1627
setTTYMode(int32_t serial,TtyMode mode)1628 Return<void> RadioImpl::setTTYMode(int32_t serial, TtyMode mode) {
1629 #if VDBG
1630 RLOGD("setTTYMode: serial %d", serial);
1631 #endif
1632 dispatchInts(serial, mSlotId, RIL_REQUEST_SET_TTY_MODE, 1, mode);
1633 return Void();
1634 }
1635
getTTYMode(int32_t serial)1636 Return<void> RadioImpl::getTTYMode(int32_t serial) {
1637 #if VDBG
1638 RLOGD("getTTYMode: serial %d", serial);
1639 #endif
1640 dispatchVoid(serial, mSlotId, RIL_REQUEST_QUERY_TTY_MODE);
1641 return Void();
1642 }
1643
setPreferredVoicePrivacy(int32_t serial,bool enable)1644 Return<void> RadioImpl::setPreferredVoicePrivacy(int32_t serial, bool enable) {
1645 #if VDBG
1646 RLOGD("setPreferredVoicePrivacy: serial %d", serial);
1647 #endif
1648 dispatchInts(serial, mSlotId, RIL_REQUEST_CDMA_SET_PREFERRED_VOICE_PRIVACY_MODE,
1649 1, BOOL_TO_INT(enable));
1650 return Void();
1651 }
1652
getPreferredVoicePrivacy(int32_t serial)1653 Return<void> RadioImpl::getPreferredVoicePrivacy(int32_t serial) {
1654 #if VDBG
1655 RLOGD("getPreferredVoicePrivacy: serial %d", serial);
1656 #endif
1657 dispatchVoid(serial, mSlotId, RIL_REQUEST_CDMA_QUERY_PREFERRED_VOICE_PRIVACY_MODE);
1658 return Void();
1659 }
1660
sendCDMAFeatureCode(int32_t serial,const hidl_string & featureCode)1661 Return<void> RadioImpl::sendCDMAFeatureCode(int32_t serial, const hidl_string& featureCode) {
1662 #if VDBG
1663 RLOGD("sendCDMAFeatureCode: serial %d", serial);
1664 #endif
1665 dispatchString(serial, mSlotId, RIL_REQUEST_CDMA_FLASH,
1666 featureCode.c_str());
1667 return Void();
1668 }
1669
sendBurstDtmf(int32_t serial,const hidl_string & dtmf,int32_t on,int32_t off)1670 Return<void> RadioImpl::sendBurstDtmf(int32_t serial, const hidl_string& dtmf, int32_t on,
1671 int32_t off) {
1672 #if VDBG
1673 RLOGD("sendBurstDtmf: serial %d", serial);
1674 #endif
1675 dispatchStrings(serial, mSlotId, RIL_REQUEST_CDMA_BURST_DTMF, false,
1676 3, dtmf.c_str(), (std::to_string(on)).c_str(),
1677 (std::to_string(off)).c_str());
1678 return Void();
1679 }
1680
constructCdmaSms(RIL_CDMA_SMS_Message & rcsm,const CdmaSmsMessage & sms)1681 void constructCdmaSms(RIL_CDMA_SMS_Message &rcsm, const CdmaSmsMessage& sms) {
1682 rcsm.uTeleserviceID = sms.teleserviceId;
1683 rcsm.bIsServicePresent = BOOL_TO_INT(sms.isServicePresent);
1684 rcsm.uServicecategory = sms.serviceCategory;
1685 rcsm.sAddress.digit_mode = (RIL_CDMA_SMS_DigitMode) sms.address.digitMode;
1686 rcsm.sAddress.number_mode = (RIL_CDMA_SMS_NumberMode) sms.address.numberMode;
1687 rcsm.sAddress.number_type = (RIL_CDMA_SMS_NumberType) sms.address.numberType;
1688 rcsm.sAddress.number_plan = (RIL_CDMA_SMS_NumberPlan) sms.address.numberPlan;
1689
1690 rcsm.sAddress.number_of_digits = sms.address.digits.size();
1691 int digitLimit= MIN((rcsm.sAddress.number_of_digits), RIL_CDMA_SMS_ADDRESS_MAX);
1692 for (int i = 0; i < digitLimit; i++) {
1693 rcsm.sAddress.digits[i] = sms.address.digits[i];
1694 }
1695
1696 rcsm.sSubAddress.subaddressType = (RIL_CDMA_SMS_SubaddressType) sms.subAddress.subaddressType;
1697 rcsm.sSubAddress.odd = BOOL_TO_INT(sms.subAddress.odd);
1698
1699 rcsm.sSubAddress.number_of_digits = sms.subAddress.digits.size();
1700 digitLimit= MIN((rcsm.sSubAddress.number_of_digits), RIL_CDMA_SMS_SUBADDRESS_MAX);
1701 for (int i = 0; i < digitLimit; i++) {
1702 rcsm.sSubAddress.digits[i] = sms.subAddress.digits[i];
1703 }
1704
1705 rcsm.uBearerDataLen = sms.bearerData.size();
1706 digitLimit= MIN((rcsm.uBearerDataLen), RIL_CDMA_SMS_BEARER_DATA_MAX);
1707 for (int i = 0; i < digitLimit; i++) {
1708 rcsm.aBearerData[i] = sms.bearerData[i];
1709 }
1710 }
1711
sendCdmaSms(int32_t serial,const CdmaSmsMessage & sms)1712 Return<void> RadioImpl::sendCdmaSms(int32_t serial, const CdmaSmsMessage& sms) {
1713 #if VDBG
1714 RLOGD("sendCdmaSms: serial %d", serial);
1715 #endif
1716 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_CDMA_SEND_SMS);
1717 if (pRI == NULL) {
1718 return Void();
1719 }
1720
1721 RIL_CDMA_SMS_Message rcsm = {};
1722 constructCdmaSms(rcsm, sms);
1723
1724 CALL_ONREQUEST(pRI->pCI->requestNumber, &rcsm, sizeof(rcsm), pRI, mSlotId);
1725 return Void();
1726 }
1727
acknowledgeLastIncomingCdmaSms(int32_t serial,const CdmaSmsAck & smsAck)1728 Return<void> RadioImpl::acknowledgeLastIncomingCdmaSms(int32_t serial, const CdmaSmsAck& smsAck) {
1729 #if VDBG
1730 RLOGD("acknowledgeLastIncomingCdmaSms: serial %d", serial);
1731 #endif
1732 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_CDMA_SMS_ACKNOWLEDGE);
1733 if (pRI == NULL) {
1734 return Void();
1735 }
1736
1737 RIL_CDMA_SMS_Ack rcsa = {};
1738
1739 rcsa.uErrorClass = (RIL_CDMA_SMS_ErrorClass) smsAck.errorClass;
1740 rcsa.uSMSCauseCode = smsAck.smsCauseCode;
1741
1742 CALL_ONREQUEST(pRI->pCI->requestNumber, &rcsa, sizeof(rcsa), pRI, mSlotId);
1743 return Void();
1744 }
1745
getGsmBroadcastConfig(int32_t serial)1746 Return<void> RadioImpl::getGsmBroadcastConfig(int32_t serial) {
1747 #if VDBG
1748 RLOGD("getGsmBroadcastConfig: serial %d", serial);
1749 #endif
1750 dispatchVoid(serial, mSlotId, RIL_REQUEST_GSM_GET_BROADCAST_SMS_CONFIG);
1751 return Void();
1752 }
1753
setGsmBroadcastConfig(int32_t serial,const hidl_vec<GsmBroadcastSmsConfigInfo> & configInfo)1754 Return<void> RadioImpl::setGsmBroadcastConfig(int32_t serial,
1755 const hidl_vec<GsmBroadcastSmsConfigInfo>&
1756 configInfo) {
1757 #if VDBG
1758 RLOGD("setGsmBroadcastConfig: serial %d", serial);
1759 #endif
1760 RequestInfo *pRI = android::addRequestToList(serial, mSlotId,
1761 RIL_REQUEST_GSM_SET_BROADCAST_SMS_CONFIG);
1762 if (pRI == NULL) {
1763 return Void();
1764 }
1765
1766 uint32_t num = configInfo.size();
1767 if (num > MAX_BROADCAST_SMS_CONFIG_INFO) {
1768 RLOGE("setGsmBroadcastConfig: Invalid configInfo length %s",
1769 requestToString(pRI->pCI->requestNumber));
1770 sendErrorResponse(pRI, RIL_E_INVALID_ARGUMENTS);
1771 return Void();
1772 }
1773 auto gsmBci = new RIL_GSM_BroadcastSmsConfigInfo[num];
1774 if (gsmBci == nullptr) {
1775 sendErrorResponse(pRI, RIL_E_NO_MEMORY);
1776 return Void();
1777 }
1778 std::vector<RIL_GSM_BroadcastSmsConfigInfo*> gsmBciPtrs(num);
1779
1780 for (uint32_t i = 0 ; i < num ; i++ ) {
1781 gsmBciPtrs[i] = &gsmBci[i];
1782 gsmBci[i].fromServiceId = configInfo[i].fromServiceId;
1783 gsmBci[i].toServiceId = configInfo[i].toServiceId;
1784 gsmBci[i].fromCodeScheme = configInfo[i].fromCodeScheme;
1785 gsmBci[i].toCodeScheme = configInfo[i].toCodeScheme;
1786 gsmBci[i].selected = BOOL_TO_INT(configInfo[i].selected);
1787 }
1788
1789 CALL_ONREQUEST(pRI->pCI->requestNumber, gsmBciPtrs.data(),
1790 num * sizeof(RIL_GSM_BroadcastSmsConfigInfo *), pRI, mSlotId);
1791
1792 delete []gsmBci;
1793 return Void();
1794 }
1795
setGsmBroadcastActivation(int32_t serial,bool activate)1796 Return<void> RadioImpl::setGsmBroadcastActivation(int32_t serial, bool activate) {
1797 #if VDBG
1798 RLOGD("setGsmBroadcastActivation: serial %d", serial);
1799 #endif
1800 dispatchInts(serial, mSlotId, RIL_REQUEST_GSM_SMS_BROADCAST_ACTIVATION,
1801 1, BOOL_TO_INT(!activate));
1802 return Void();
1803 }
1804
getCdmaBroadcastConfig(int32_t serial)1805 Return<void> RadioImpl::getCdmaBroadcastConfig(int32_t serial) {
1806 #if VDBG
1807 RLOGD("getCdmaBroadcastConfig: serial %d", serial);
1808 #endif
1809 dispatchVoid(serial, mSlotId, RIL_REQUEST_CDMA_GET_BROADCAST_SMS_CONFIG);
1810 return Void();
1811 }
1812
setCdmaBroadcastConfig(int32_t serial,const hidl_vec<CdmaBroadcastSmsConfigInfo> & configInfo)1813 Return<void> RadioImpl::setCdmaBroadcastConfig(int32_t serial,
1814 const hidl_vec<CdmaBroadcastSmsConfigInfo>&
1815 configInfo) {
1816 #if VDBG
1817 RLOGD("setCdmaBroadcastConfig: serial %d", serial);
1818 #endif
1819 RequestInfo *pRI = android::addRequestToList(serial, mSlotId,
1820 RIL_REQUEST_CDMA_SET_BROADCAST_SMS_CONFIG);
1821 if (pRI == NULL) {
1822 return Void();
1823 }
1824
1825 uint32_t num = configInfo.size();
1826 if (num > MAX_BROADCAST_SMS_CONFIG_INFO) {
1827 RLOGE("setCdmaBroadcastConfig: Invalid configInfo length %s",
1828 requestToString(pRI->pCI->requestNumber));
1829 sendErrorResponse(pRI, RIL_E_INVALID_ARGUMENTS);
1830 return Void();
1831 }
1832 auto cdmaBci = new RIL_CDMA_BroadcastSmsConfigInfo[num];
1833 if (cdmaBci == nullptr) {
1834 sendErrorResponse(pRI, RIL_E_NO_MEMORY);
1835 return Void();
1836 }
1837 std::vector<RIL_CDMA_BroadcastSmsConfigInfo*> cdmaBciPtrs(num);
1838 for (uint32_t i = 0 ; i < num ; i++ ) {
1839 cdmaBciPtrs[i] = &cdmaBci[i];
1840 cdmaBci[i].service_category = configInfo[i].serviceCategory;
1841 cdmaBci[i].language = configInfo[i].language;
1842 cdmaBci[i].selected = BOOL_TO_INT(configInfo[i].selected);
1843 }
1844
1845 CALL_ONREQUEST(pRI->pCI->requestNumber, cdmaBciPtrs.data(),
1846 num * sizeof(RIL_CDMA_BroadcastSmsConfigInfo *), pRI, mSlotId);
1847
1848 delete []cdmaBci;
1849 return Void();
1850 }
1851
setCdmaBroadcastActivation(int32_t serial,bool activate)1852 Return<void> RadioImpl::setCdmaBroadcastActivation(int32_t serial, bool activate) {
1853 #if VDBG
1854 RLOGD("setCdmaBroadcastActivation: serial %d", serial);
1855 #endif
1856 dispatchInts(serial, mSlotId, RIL_REQUEST_CDMA_SMS_BROADCAST_ACTIVATION,
1857 1, BOOL_TO_INT(!activate));
1858 return Void();
1859 }
1860
getCDMASubscription(int32_t serial)1861 Return<void> RadioImpl::getCDMASubscription(int32_t serial) {
1862 #if VDBG
1863 RLOGD("getCDMASubscription: serial %d", serial);
1864 #endif
1865 dispatchVoid(serial, mSlotId, RIL_REQUEST_CDMA_SUBSCRIPTION);
1866 return Void();
1867 }
1868
writeSmsToRuim(int32_t serial,const CdmaSmsWriteArgs & cdmaSms)1869 Return<void> RadioImpl::writeSmsToRuim(int32_t serial, const CdmaSmsWriteArgs& cdmaSms) {
1870 #if VDBG
1871 RLOGD("writeSmsToRuim: serial %d", serial);
1872 #endif
1873 RequestInfo *pRI = android::addRequestToList(serial, mSlotId,
1874 RIL_REQUEST_CDMA_WRITE_SMS_TO_RUIM);
1875 if (pRI == NULL) {
1876 return Void();
1877 }
1878
1879 RIL_CDMA_SMS_WriteArgs rcsw = {};
1880 rcsw.status = (int) cdmaSms.status;
1881 constructCdmaSms(rcsw.message, cdmaSms.message);
1882
1883 CALL_ONREQUEST(pRI->pCI->requestNumber, &rcsw, sizeof(rcsw), pRI, mSlotId);
1884 return Void();
1885 }
1886
deleteSmsOnRuim(int32_t serial,int32_t index)1887 Return<void> RadioImpl::deleteSmsOnRuim(int32_t serial, int32_t index) {
1888 #if VDBG
1889 RLOGD("deleteSmsOnRuim: serial %d", serial);
1890 #endif
1891 dispatchInts(serial, mSlotId, RIL_REQUEST_CDMA_DELETE_SMS_ON_RUIM, 1, index);
1892 return Void();
1893 }
1894
getDeviceIdentity(int32_t serial)1895 Return<void> RadioImpl::getDeviceIdentity(int32_t serial) {
1896 #if VDBG
1897 RLOGD("getDeviceIdentity: serial %d", serial);
1898 #endif
1899 dispatchVoid(serial, mSlotId, RIL_REQUEST_DEVICE_IDENTITY);
1900 return Void();
1901 }
1902
exitEmergencyCallbackMode(int32_t serial)1903 Return<void> RadioImpl::exitEmergencyCallbackMode(int32_t serial) {
1904 #if VDBG
1905 RLOGD("exitEmergencyCallbackMode: serial %d", serial);
1906 #endif
1907 dispatchVoid(serial, mSlotId, RIL_REQUEST_EXIT_EMERGENCY_CALLBACK_MODE);
1908 return Void();
1909 }
1910
getSmscAddress(int32_t serial)1911 Return<void> RadioImpl::getSmscAddress(int32_t serial) {
1912 #if VDBG
1913 RLOGD("getSmscAddress: serial %d", serial);
1914 #endif
1915 dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_SMSC_ADDRESS);
1916 return Void();
1917 }
1918
setSmscAddress(int32_t serial,const hidl_string & smsc)1919 Return<void> RadioImpl::setSmscAddress(int32_t serial, const hidl_string& smsc) {
1920 #if VDBG
1921 RLOGD("setSmscAddress: serial %d", serial);
1922 #endif
1923 dispatchString(serial, mSlotId, RIL_REQUEST_SET_SMSC_ADDRESS,
1924 smsc.c_str());
1925 return Void();
1926 }
1927
reportSmsMemoryStatus(int32_t serial,bool available)1928 Return<void> RadioImpl::reportSmsMemoryStatus(int32_t serial, bool available) {
1929 #if VDBG
1930 RLOGD("reportSmsMemoryStatus: serial %d", serial);
1931 #endif
1932 dispatchInts(serial, mSlotId, RIL_REQUEST_REPORT_SMS_MEMORY_STATUS, 1,
1933 BOOL_TO_INT(available));
1934 return Void();
1935 }
1936
reportStkServiceIsRunning(int32_t serial)1937 Return<void> RadioImpl::reportStkServiceIsRunning(int32_t serial) {
1938 #if VDBG
1939 RLOGD("reportStkServiceIsRunning: serial %d", serial);
1940 #endif
1941 dispatchVoid(serial, mSlotId, RIL_REQUEST_REPORT_STK_SERVICE_IS_RUNNING);
1942 return Void();
1943 }
1944
getCdmaSubscriptionSource(int32_t serial)1945 Return<void> RadioImpl::getCdmaSubscriptionSource(int32_t serial) {
1946 #if VDBG
1947 RLOGD("getCdmaSubscriptionSource: serial %d", serial);
1948 #endif
1949 dispatchVoid(serial, mSlotId, RIL_REQUEST_CDMA_GET_SUBSCRIPTION_SOURCE);
1950 return Void();
1951 }
1952
requestIsimAuthentication(int32_t serial,const hidl_string & challenge)1953 Return<void> RadioImpl::requestIsimAuthentication(int32_t serial, const hidl_string& challenge) {
1954 #if VDBG
1955 RLOGD("requestIsimAuthentication: serial %d", serial);
1956 #endif
1957 dispatchString(serial, mSlotId, RIL_REQUEST_ISIM_AUTHENTICATION,
1958 challenge.c_str());
1959 return Void();
1960 }
1961
acknowledgeIncomingGsmSmsWithPdu(int32_t serial,bool success,const hidl_string & ackPdu)1962 Return<void> RadioImpl::acknowledgeIncomingGsmSmsWithPdu(int32_t serial, bool success,
1963 const hidl_string& ackPdu) {
1964 #if VDBG
1965 RLOGD("acknowledgeIncomingGsmSmsWithPdu: serial %d", serial);
1966 #endif
1967 dispatchStrings(serial, mSlotId, RIL_REQUEST_ACKNOWLEDGE_INCOMING_GSM_SMS_WITH_PDU, false,
1968 2, success ? "1" : "0", ackPdu.c_str());
1969 return Void();
1970 }
1971
sendEnvelopeWithStatus(int32_t serial,const hidl_string & contents)1972 Return<void> RadioImpl::sendEnvelopeWithStatus(int32_t serial, const hidl_string& contents) {
1973 #if VDBG
1974 RLOGD("sendEnvelopeWithStatus: serial %d", serial);
1975 #endif
1976 dispatchString(serial, mSlotId, RIL_REQUEST_STK_SEND_ENVELOPE_WITH_STATUS,
1977 contents.c_str());
1978 return Void();
1979 }
1980
getVoiceRadioTechnology(int32_t serial)1981 Return<void> RadioImpl::getVoiceRadioTechnology(int32_t serial) {
1982 #if VDBG
1983 RLOGD("getVoiceRadioTechnology: serial %d", serial);
1984 #endif
1985 dispatchVoid(serial, mSlotId, RIL_REQUEST_VOICE_RADIO_TECH);
1986 return Void();
1987 }
1988
getCellInfoList(int32_t serial)1989 Return<void> RadioImpl::getCellInfoList(int32_t serial) {
1990 #if VDBG
1991 RLOGD("getCellInfoList: serial %d", serial);
1992 #endif
1993 dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_CELL_INFO_LIST);
1994 return Void();
1995 }
1996
setCellInfoListRate(int32_t serial,int32_t rate)1997 Return<void> RadioImpl::setCellInfoListRate(int32_t serial, int32_t rate) {
1998 #if VDBG
1999 RLOGD("setCellInfoListRate: serial %d", serial);
2000 #endif
2001 dispatchInts(serial, mSlotId, RIL_REQUEST_SET_UNSOL_CELL_INFO_LIST_RATE, 1, rate);
2002 return Void();
2003 }
2004
setInitialAttachApn(int32_t serial,const DataProfileInfo & dataProfileInfo,bool modemCognitive,bool isRoaming)2005 Return<void> RadioImpl::setInitialAttachApn(int32_t serial, const DataProfileInfo& dataProfileInfo,
2006 bool modemCognitive, bool isRoaming) {
2007 #if VDBG
2008 RLOGD("setInitialAttachApn: serial %d", serial);
2009 #endif
2010 RequestInfo *pRI = android::addRequestToList(serial, mSlotId,
2011 RIL_REQUEST_SET_INITIAL_ATTACH_APN);
2012 if (pRI == NULL) {
2013 return Void();
2014 }
2015
2016 if (s_vendorFunctions->version <= 14) {
2017 RIL_InitialAttachApn iaa = {};
2018
2019 if (!copyHidlStringToRil(&iaa.apn, dataProfileInfo.apn, pRI, true)) {
2020 return Void();
2021 }
2022
2023 const hidl_string &protocol =
2024 (isRoaming ? dataProfileInfo.roamingProtocol : dataProfileInfo.protocol);
2025
2026 if (!copyHidlStringToRil(&iaa.protocol, protocol, pRI)) {
2027 memsetAndFreeStrings(1, iaa.apn);
2028 return Void();
2029 }
2030 iaa.authtype = (int) dataProfileInfo.authType;
2031 if (!copyHidlStringToRil(&iaa.username, dataProfileInfo.user, pRI)) {
2032 memsetAndFreeStrings(2, iaa.apn, iaa.protocol);
2033 return Void();
2034 }
2035 if (!copyHidlStringToRil(&iaa.password, dataProfileInfo.password, pRI)) {
2036 memsetAndFreeStrings(3, iaa.apn, iaa.protocol, iaa.username);
2037 return Void();
2038 }
2039
2040 CALL_ONREQUEST(RIL_REQUEST_SET_INITIAL_ATTACH_APN, &iaa, sizeof(iaa), pRI, mSlotId);
2041
2042 memsetAndFreeStrings(4, iaa.apn, iaa.protocol, iaa.username, iaa.password);
2043 } else {
2044 RIL_InitialAttachApn_v15 iaa = {};
2045
2046 if (!copyHidlStringToRil(&iaa.apn, dataProfileInfo.apn, pRI, true)) {
2047 return Void();
2048 }
2049
2050 if (!copyHidlStringToRil(&iaa.protocol, dataProfileInfo.protocol, pRI)) {
2051 memsetAndFreeStrings(1, iaa.apn);
2052 return Void();
2053 }
2054 if (!copyHidlStringToRil(&iaa.roamingProtocol, dataProfileInfo.roamingProtocol, pRI)) {
2055 memsetAndFreeStrings(2, iaa.apn, iaa.protocol);
2056 return Void();
2057 }
2058 iaa.authtype = (int) dataProfileInfo.authType;
2059 if (!copyHidlStringToRil(&iaa.username, dataProfileInfo.user, pRI)) {
2060 memsetAndFreeStrings(3, iaa.apn, iaa.protocol, iaa.roamingProtocol);
2061 return Void();
2062 }
2063 if (!copyHidlStringToRil(&iaa.password, dataProfileInfo.password, pRI)) {
2064 memsetAndFreeStrings(4, iaa.apn, iaa.protocol, iaa.roamingProtocol, iaa.username);
2065 return Void();
2066 }
2067 iaa.supportedTypesBitmask = dataProfileInfo.supportedApnTypesBitmap;
2068 iaa.bearerBitmask = dataProfileInfo.bearerBitmap;
2069 iaa.modemCognitive = BOOL_TO_INT(modemCognitive);
2070 iaa.mtu = dataProfileInfo.mtu;
2071
2072 if (!convertMvnoTypeToString(dataProfileInfo.mvnoType, iaa.mvnoType)) {
2073 sendErrorResponse(pRI, RIL_E_INVALID_ARGUMENTS);
2074 memsetAndFreeStrings(5, iaa.apn, iaa.protocol, iaa.roamingProtocol, iaa.username,
2075 iaa.password);
2076 return Void();
2077 }
2078
2079 if (!copyHidlStringToRil(&iaa.mvnoMatchData, dataProfileInfo.mvnoMatchData, pRI)) {
2080 memsetAndFreeStrings(5, iaa.apn, iaa.protocol, iaa.roamingProtocol, iaa.username,
2081 iaa.password);
2082 return Void();
2083 }
2084
2085 CALL_ONREQUEST(RIL_REQUEST_SET_INITIAL_ATTACH_APN, &iaa, sizeof(iaa), pRI, mSlotId);
2086
2087 memsetAndFreeStrings(6, iaa.apn, iaa.protocol, iaa.roamingProtocol, iaa.username,
2088 iaa.password, iaa.mvnoMatchData);
2089 }
2090
2091 return Void();
2092 }
2093
getImsRegistrationState(int32_t serial)2094 Return<void> RadioImpl::getImsRegistrationState(int32_t serial) {
2095 #if VDBG
2096 RLOGD("getImsRegistrationState: serial %d", serial);
2097 #endif
2098 dispatchVoid(serial, mSlotId, RIL_REQUEST_IMS_REGISTRATION_STATE);
2099 return Void();
2100 }
2101
dispatchImsGsmSms(const ImsSmsMessage & message,RequestInfo * pRI)2102 bool dispatchImsGsmSms(const ImsSmsMessage& message, RequestInfo *pRI) {
2103 RIL_IMS_SMS_Message rism = {};
2104 char **pStrings;
2105 int countStrings = 2;
2106 int dataLen = sizeof(char *) * countStrings;
2107
2108 rism.tech = RADIO_TECH_3GPP;
2109 rism.retry = BOOL_TO_INT(message.retry);
2110 rism.messageRef = message.messageRef;
2111
2112 if (message.gsmMessage.size() != 1) {
2113 RLOGE("dispatchImsGsmSms: Invalid len %s", requestToString(pRI->pCI->requestNumber));
2114 sendErrorResponse(pRI, RIL_E_INVALID_ARGUMENTS);
2115 return false;
2116 }
2117
2118 pStrings = (char **)calloc(countStrings, sizeof(char *));
2119 if (pStrings == NULL) {
2120 RLOGE("dispatchImsGsmSms: Memory allocation failed for request %s",
2121 requestToString(pRI->pCI->requestNumber));
2122 sendErrorResponse(pRI, RIL_E_NO_MEMORY);
2123 return false;
2124 }
2125
2126 if (!copyHidlStringToRil(&pStrings[0], message.gsmMessage[0].smscPdu, pRI)) {
2127 #ifdef MEMSET_FREED
2128 memset(pStrings, 0, dataLen);
2129 #endif
2130 free(pStrings);
2131 return false;
2132 }
2133
2134 if (!copyHidlStringToRil(&pStrings[1], message.gsmMessage[0].pdu, pRI)) {
2135 memsetAndFreeStrings(1, pStrings[0]);
2136 #ifdef MEMSET_FREED
2137 memset(pStrings, 0, dataLen);
2138 #endif
2139 free(pStrings);
2140 return false;
2141 }
2142
2143 rism.message.gsmMessage = pStrings;
2144 CALL_ONREQUEST(pRI->pCI->requestNumber, &rism, sizeof(RIL_RadioTechnologyFamily) +
2145 sizeof(uint8_t) + sizeof(int32_t) + dataLen, pRI, pRI->socket_id);
2146
2147 for (int i = 0 ; i < countStrings ; i++) {
2148 memsetAndFreeStrings(1, pStrings[i]);
2149 }
2150
2151 #ifdef MEMSET_FREED
2152 memset(pStrings, 0, dataLen);
2153 #endif
2154 free(pStrings);
2155
2156 return true;
2157 }
2158
2159 struct ImsCdmaSms {
2160 RIL_IMS_SMS_Message imsSms;
2161 RIL_CDMA_SMS_Message cdmaSms;
2162 };
2163
dispatchImsCdmaSms(const ImsSmsMessage & message,RequestInfo * pRI)2164 bool dispatchImsCdmaSms(const ImsSmsMessage& message, RequestInfo *pRI) {
2165 ImsCdmaSms temp = {};
2166
2167 if (message.cdmaMessage.size() != 1) {
2168 RLOGE("dispatchImsCdmaSms: Invalid len %s", requestToString(pRI->pCI->requestNumber));
2169 sendErrorResponse(pRI, RIL_E_INVALID_ARGUMENTS);
2170 return false;
2171 }
2172
2173 temp.imsSms.tech = RADIO_TECH_3GPP2;
2174 temp.imsSms.retry = BOOL_TO_INT(message.retry);
2175 temp.imsSms.messageRef = message.messageRef;
2176 temp.imsSms.message.cdmaMessage = &temp.cdmaSms;
2177
2178 constructCdmaSms(temp.cdmaSms, message.cdmaMessage[0]);
2179
2180 // Vendor code expects payload length to include actual msg payload
2181 // (sizeof(RIL_CDMA_SMS_Message)) instead of (RIL_CDMA_SMS_Message *) + size of other fields in
2182 // RIL_IMS_SMS_Message
2183 int payloadLen = sizeof(RIL_RadioTechnologyFamily) + sizeof(uint8_t) + sizeof(int32_t)
2184 + sizeof(RIL_CDMA_SMS_Message);
2185
2186 CALL_ONREQUEST(pRI->pCI->requestNumber, &temp.imsSms, payloadLen, pRI, pRI->socket_id);
2187
2188 return true;
2189 }
2190
sendImsSms(int32_t serial,const ImsSmsMessage & message)2191 Return<void> RadioImpl::sendImsSms(int32_t serial, const ImsSmsMessage& message) {
2192 #if VDBG
2193 RLOGD("sendImsSms: serial %d", serial);
2194 #endif
2195 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_IMS_SEND_SMS);
2196 if (pRI == NULL) {
2197 return Void();
2198 }
2199
2200 if (RadioTechnologyFamily::THREE_GPP == message.tech) {
2201 dispatchImsGsmSms(message, pRI);
2202 } else if (RadioTechnologyFamily::THREE_GPP2 == message.tech) {
2203 dispatchImsCdmaSms(message, pRI);
2204 } else {
2205 RLOGE("sendImsSms: Invalid radio tech %s",
2206 requestToString(pRI->pCI->requestNumber));
2207 sendErrorResponse(pRI, RIL_E_INVALID_ARGUMENTS);
2208 }
2209 return Void();
2210 }
2211
iccTransmitApduBasicChannel(int32_t serial,const SimApdu & message)2212 Return<void> RadioImpl::iccTransmitApduBasicChannel(int32_t serial, const SimApdu& message) {
2213 #if VDBG
2214 RLOGD("iccTransmitApduBasicChannel: serial %d", serial);
2215 #endif
2216 dispatchIccApdu(serial, mSlotId, RIL_REQUEST_SIM_TRANSMIT_APDU_BASIC, message);
2217 return Void();
2218 }
2219
iccOpenLogicalChannel(int32_t serial,const hidl_string & aid,int32_t p2)2220 Return<void> RadioImpl::iccOpenLogicalChannel(int32_t serial, const hidl_string& aid, int32_t p2) {
2221 #if VDBG
2222 RLOGD("iccOpenLogicalChannel: serial %d", serial);
2223 #endif
2224 if (s_vendorFunctions->version < 15) {
2225 dispatchString(serial, mSlotId, RIL_REQUEST_SIM_OPEN_CHANNEL, aid.c_str());
2226 } else {
2227 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_SIM_OPEN_CHANNEL);
2228 if (pRI == NULL) {
2229 return Void();
2230 }
2231
2232 RIL_OpenChannelParams params = {};
2233
2234 params.p2 = p2;
2235
2236 if (!copyHidlStringToRil(¶ms.aidPtr, aid, pRI)) {
2237 return Void();
2238 }
2239
2240 CALL_ONREQUEST(pRI->pCI->requestNumber, ¶ms, sizeof(params), pRI, mSlotId);
2241
2242 memsetAndFreeStrings(1, params.aidPtr);
2243 }
2244 return Void();
2245 }
2246
iccCloseLogicalChannel(int32_t serial,int32_t channelId)2247 Return<void> RadioImpl::iccCloseLogicalChannel(int32_t serial, int32_t channelId) {
2248 #if VDBG
2249 RLOGD("iccCloseLogicalChannel: serial %d", serial);
2250 #endif
2251 dispatchInts(serial, mSlotId, RIL_REQUEST_SIM_CLOSE_CHANNEL, 1, channelId);
2252 return Void();
2253 }
2254
iccTransmitApduLogicalChannel(int32_t serial,const SimApdu & message)2255 Return<void> RadioImpl::iccTransmitApduLogicalChannel(int32_t serial, const SimApdu& message) {
2256 #if VDBG
2257 RLOGD("iccTransmitApduLogicalChannel: serial %d", serial);
2258 #endif
2259 dispatchIccApdu(serial, mSlotId, RIL_REQUEST_SIM_TRANSMIT_APDU_CHANNEL, message);
2260 return Void();
2261 }
2262
nvReadItem(int32_t serial,NvItem itemId)2263 Return<void> RadioImpl::nvReadItem(int32_t serial, NvItem itemId) {
2264 #if VDBG
2265 RLOGD("nvReadItem: serial %d", serial);
2266 #endif
2267 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_NV_READ_ITEM);
2268 if (pRI == NULL) {
2269 return Void();
2270 }
2271
2272 RIL_NV_ReadItem nvri = {};
2273 nvri.itemID = (RIL_NV_Item) itemId;
2274
2275 CALL_ONREQUEST(pRI->pCI->requestNumber, &nvri, sizeof(nvri), pRI, mSlotId);
2276 return Void();
2277 }
2278
nvWriteItem(int32_t serial,const NvWriteItem & item)2279 Return<void> RadioImpl::nvWriteItem(int32_t serial, const NvWriteItem& item) {
2280 #if VDBG
2281 RLOGD("nvWriteItem: serial %d", serial);
2282 #endif
2283 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_NV_WRITE_ITEM);
2284 if (pRI == NULL) {
2285 return Void();
2286 }
2287
2288 RIL_NV_WriteItem nvwi = {};
2289
2290 nvwi.itemID = (RIL_NV_Item) item.itemId;
2291
2292 if (!copyHidlStringToRil(&nvwi.value, item.value, pRI)) {
2293 return Void();
2294 }
2295
2296 CALL_ONREQUEST(pRI->pCI->requestNumber, &nvwi, sizeof(nvwi), pRI, mSlotId);
2297
2298 memsetAndFreeStrings(1, nvwi.value);
2299 return Void();
2300 }
2301
nvWriteCdmaPrl(int32_t serial,const hidl_vec<uint8_t> & prl)2302 Return<void> RadioImpl::nvWriteCdmaPrl(int32_t serial, const hidl_vec<uint8_t>& prl) {
2303 #if VDBG
2304 RLOGD("nvWriteCdmaPrl: serial %d", serial);
2305 #endif
2306 dispatchRaw(serial, mSlotId, RIL_REQUEST_NV_WRITE_CDMA_PRL, prl);
2307 return Void();
2308 }
2309
nvResetConfig(int32_t serial,ResetNvType resetType)2310 Return<void> RadioImpl::nvResetConfig(int32_t serial, ResetNvType resetType) {
2311 int rilResetType = -1;
2312 #if VDBG
2313 RLOGD("nvResetConfig: serial %d", serial);
2314 #endif
2315 /* Convert ResetNvType to RIL.h values
2316 * RIL_REQUEST_NV_RESET_CONFIG
2317 * 1 - reload all NV items
2318 * 2 - erase NV reset (SCRTN)
2319 * 3 - factory reset (RTN)
2320 */
2321 switch(resetType) {
2322 case ResetNvType::RELOAD:
2323 rilResetType = 1;
2324 break;
2325 case ResetNvType::ERASE:
2326 rilResetType = 2;
2327 break;
2328 case ResetNvType::FACTORY_RESET:
2329 rilResetType = 3;
2330 break;
2331 }
2332 dispatchInts(serial, mSlotId, RIL_REQUEST_NV_RESET_CONFIG, 1, rilResetType);
2333 return Void();
2334 }
2335
setUiccSubscription(int32_t serial,const SelectUiccSub & uiccSub)2336 Return<void> RadioImpl::setUiccSubscription(int32_t serial, const SelectUiccSub& uiccSub) {
2337 #if VDBG
2338 RLOGD("setUiccSubscription: serial %d", serial);
2339 #endif
2340 RequestInfo *pRI = android::addRequestToList(serial, mSlotId,
2341 RIL_REQUEST_SET_UICC_SUBSCRIPTION);
2342 if (pRI == NULL) {
2343 return Void();
2344 }
2345
2346 RIL_SelectUiccSub rilUiccSub = {};
2347
2348 rilUiccSub.slot = uiccSub.slot;
2349 rilUiccSub.app_index = uiccSub.appIndex;
2350 rilUiccSub.sub_type = (RIL_SubscriptionType) uiccSub.subType;
2351 rilUiccSub.act_status = (RIL_UiccSubActStatus) uiccSub.actStatus;
2352
2353 CALL_ONREQUEST(pRI->pCI->requestNumber, &rilUiccSub, sizeof(rilUiccSub), pRI, mSlotId);
2354 return Void();
2355 }
2356
setDataAllowed(int32_t serial,bool allow)2357 Return<void> RadioImpl::setDataAllowed(int32_t serial, bool allow) {
2358 #if VDBG
2359 RLOGD("setDataAllowed: serial %d", serial);
2360 #endif
2361 dispatchInts(serial, mSlotId, RIL_REQUEST_ALLOW_DATA, 1, BOOL_TO_INT(allow));
2362 return Void();
2363 }
2364
getHardwareConfig(int32_t serial)2365 Return<void> RadioImpl::getHardwareConfig(int32_t serial) {
2366 #if VDBG
2367 RLOGD("getHardwareConfig: serial %d", serial);
2368 #endif
2369 dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_HARDWARE_CONFIG);
2370 return Void();
2371 }
2372
requestIccSimAuthentication(int32_t serial,int32_t authContext,const hidl_string & authData,const hidl_string & aid)2373 Return<void> RadioImpl::requestIccSimAuthentication(int32_t serial, int32_t authContext,
2374 const hidl_string& authData, const hidl_string& aid) {
2375 #if VDBG
2376 RLOGD("requestIccSimAuthentication: serial %d", serial);
2377 #endif
2378 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_SIM_AUTHENTICATION);
2379 if (pRI == NULL) {
2380 return Void();
2381 }
2382
2383 RIL_SimAuthentication pf = {};
2384
2385 pf.authContext = authContext;
2386
2387 if (!copyHidlStringToRil(&pf.authData, authData, pRI)) {
2388 return Void();
2389 }
2390
2391 if (!copyHidlStringToRil(&pf.aid, aid, pRI)) {
2392 memsetAndFreeStrings(1, pf.authData);
2393 return Void();
2394 }
2395
2396 CALL_ONREQUEST(pRI->pCI->requestNumber, &pf, sizeof(pf), pRI, mSlotId);
2397
2398 memsetAndFreeStrings(2, pf.authData, pf.aid);
2399 return Void();
2400 }
2401
2402 /**
2403 * @param numProfiles number of data profile
2404 * @param dataProfiles the pointer to the actual data profiles. The acceptable type is
2405 RIL_DataProfileInfo or RIL_DataProfileInfo_v15.
2406 * @param dataProfilePtrs the pointer to the pointers that point to each data profile structure
2407 * @param numfields number of string-type member in the data profile structure
2408 * @param ... the variadic parameters are pointers to each string-type member
2409 **/
2410 template <typename T>
freeSetDataProfileData(int numProfiles,T * dataProfiles,T ** dataProfilePtrs,int numfields,...)2411 void freeSetDataProfileData(int numProfiles, T *dataProfiles, T **dataProfilePtrs,
2412 int numfields, ...) {
2413 va_list args;
2414 va_start(args, numfields);
2415
2416 // Iterate through each string-type field that need to be free.
2417 for (int i = 0; i < numfields; i++) {
2418 // Iterate through each data profile and free that specific string-type field.
2419 // The type 'char *T::*' is a type of pointer to a 'char *' member inside T structure.
2420 char *T::*ptr = va_arg(args, char *T::*);
2421 for (int j = 0; j < numProfiles; j++) {
2422 memsetAndFreeStrings(1, dataProfiles[j].*ptr);
2423 }
2424 }
2425
2426 va_end(args);
2427
2428 #ifdef MEMSET_FREED
2429 memset(dataProfiles, 0, numProfiles * sizeof(T));
2430 memset(dataProfilePtrs, 0, numProfiles * sizeof(T *));
2431 #endif
2432 free(dataProfiles);
2433 free(dataProfilePtrs);
2434 }
2435
setDataProfile(int32_t serial,const hidl_vec<DataProfileInfo> & profiles,bool isRoaming)2436 Return<void> RadioImpl::setDataProfile(int32_t serial, const hidl_vec<DataProfileInfo>& profiles,
2437 bool isRoaming) {
2438 #if VDBG
2439 RLOGD("setDataProfile: serial %d", serial);
2440 #endif
2441 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_SET_DATA_PROFILE);
2442 if (pRI == NULL) {
2443 return Void();
2444 }
2445
2446 size_t num = profiles.size();
2447 bool success = false;
2448
2449 if (s_vendorFunctions->version <= 14) {
2450
2451 RIL_DataProfileInfo *dataProfiles =
2452 (RIL_DataProfileInfo *) calloc(num, sizeof(RIL_DataProfileInfo));
2453
2454 if (dataProfiles == NULL) {
2455 RLOGE("Memory allocation failed for request %s",
2456 requestToString(pRI->pCI->requestNumber));
2457 sendErrorResponse(pRI, RIL_E_NO_MEMORY);
2458 return Void();
2459 }
2460
2461 RIL_DataProfileInfo **dataProfilePtrs =
2462 (RIL_DataProfileInfo **) calloc(num, sizeof(RIL_DataProfileInfo *));
2463 if (dataProfilePtrs == NULL) {
2464 RLOGE("Memory allocation failed for request %s",
2465 requestToString(pRI->pCI->requestNumber));
2466 free(dataProfiles);
2467 sendErrorResponse(pRI, RIL_E_NO_MEMORY);
2468 return Void();
2469 }
2470
2471 for (size_t i = 0; i < num; i++) {
2472 dataProfilePtrs[i] = &dataProfiles[i];
2473
2474 success = copyHidlStringToRil(&dataProfiles[i].apn, profiles[i].apn, pRI, true);
2475
2476 const hidl_string &protocol =
2477 (isRoaming ? profiles[i].roamingProtocol : profiles[i].protocol);
2478
2479 if (success && !copyHidlStringToRil(&dataProfiles[i].protocol, protocol, pRI, true)) {
2480 success = false;
2481 }
2482
2483 if (success && !copyHidlStringToRil(&dataProfiles[i].user, profiles[i].user, pRI,
2484 true)) {
2485 success = false;
2486 }
2487 if (success && !copyHidlStringToRil(&dataProfiles[i].password, profiles[i].password,
2488 pRI, true)) {
2489 success = false;
2490 }
2491
2492 if (!success) {
2493 freeSetDataProfileData(num, dataProfiles, dataProfilePtrs, 4,
2494 &RIL_DataProfileInfo::apn, &RIL_DataProfileInfo::protocol,
2495 &RIL_DataProfileInfo::user, &RIL_DataProfileInfo::password);
2496 return Void();
2497 }
2498
2499 dataProfiles[i].profileId = (RIL_DataProfile) profiles[i].profileId;
2500 dataProfiles[i].authType = (int) profiles[i].authType;
2501 dataProfiles[i].type = (int) profiles[i].type;
2502 dataProfiles[i].maxConnsTime = profiles[i].maxConnsTime;
2503 dataProfiles[i].maxConns = profiles[i].maxConns;
2504 dataProfiles[i].waitTime = profiles[i].waitTime;
2505 dataProfiles[i].enabled = BOOL_TO_INT(profiles[i].enabled);
2506 }
2507
2508 CALL_ONREQUEST(RIL_REQUEST_SET_DATA_PROFILE, dataProfilePtrs,
2509 num * sizeof(RIL_DataProfileInfo *), pRI, mSlotId);
2510
2511 freeSetDataProfileData(num, dataProfiles, dataProfilePtrs, 4,
2512 &RIL_DataProfileInfo::apn, &RIL_DataProfileInfo::protocol,
2513 &RIL_DataProfileInfo::user, &RIL_DataProfileInfo::password);
2514 } else {
2515 RIL_DataProfileInfo_v15 *dataProfiles =
2516 (RIL_DataProfileInfo_v15 *) calloc(num, sizeof(RIL_DataProfileInfo_v15));
2517
2518 if (dataProfiles == NULL) {
2519 RLOGE("Memory allocation failed for request %s",
2520 requestToString(pRI->pCI->requestNumber));
2521 sendErrorResponse(pRI, RIL_E_NO_MEMORY);
2522 return Void();
2523 }
2524
2525 RIL_DataProfileInfo_v15 **dataProfilePtrs =
2526 (RIL_DataProfileInfo_v15 **) calloc(num, sizeof(RIL_DataProfileInfo_v15 *));
2527 if (dataProfilePtrs == NULL) {
2528 RLOGE("Memory allocation failed for request %s",
2529 requestToString(pRI->pCI->requestNumber));
2530 free(dataProfiles);
2531 sendErrorResponse(pRI, RIL_E_NO_MEMORY);
2532 return Void();
2533 }
2534
2535 for (size_t i = 0; i < num; i++) {
2536 dataProfilePtrs[i] = &dataProfiles[i];
2537
2538 success = copyHidlStringToRil(&dataProfiles[i].apn, profiles[i].apn, pRI, true);
2539 if (success && !copyHidlStringToRil(&dataProfiles[i].protocol, profiles[i].protocol,
2540 pRI)) {
2541 success = false;
2542 }
2543 if (success && !copyHidlStringToRil(&dataProfiles[i].roamingProtocol,
2544 profiles[i].roamingProtocol, pRI, true)) {
2545 success = false;
2546 }
2547 if (success && !copyHidlStringToRil(&dataProfiles[i].user, profiles[i].user, pRI,
2548 true)) {
2549 success = false;
2550 }
2551 if (success && !copyHidlStringToRil(&dataProfiles[i].password, profiles[i].password,
2552 pRI, true)) {
2553 success = false;
2554 }
2555 if (success && !copyHidlStringToRil(&dataProfiles[i].mvnoMatchData,
2556 profiles[i].mvnoMatchData, pRI, true)) {
2557 success = false;
2558 }
2559
2560 if (success && !convertMvnoTypeToString(profiles[i].mvnoType,
2561 dataProfiles[i].mvnoType)) {
2562 sendErrorResponse(pRI, RIL_E_INVALID_ARGUMENTS);
2563 success = false;
2564 }
2565
2566 if (!success) {
2567 freeSetDataProfileData(num, dataProfiles, dataProfilePtrs, 6,
2568 &RIL_DataProfileInfo_v15::apn, &RIL_DataProfileInfo_v15::protocol,
2569 &RIL_DataProfileInfo_v15::roamingProtocol, &RIL_DataProfileInfo_v15::user,
2570 &RIL_DataProfileInfo_v15::password, &RIL_DataProfileInfo_v15::mvnoMatchData);
2571 return Void();
2572 }
2573
2574 dataProfiles[i].profileId = (RIL_DataProfile) profiles[i].profileId;
2575 dataProfiles[i].authType = (int) profiles[i].authType;
2576 dataProfiles[i].type = (int) profiles[i].type;
2577 dataProfiles[i].maxConnsTime = profiles[i].maxConnsTime;
2578 dataProfiles[i].maxConns = profiles[i].maxConns;
2579 dataProfiles[i].waitTime = profiles[i].waitTime;
2580 dataProfiles[i].enabled = BOOL_TO_INT(profiles[i].enabled);
2581 dataProfiles[i].supportedTypesBitmask = profiles[i].supportedApnTypesBitmap;
2582 dataProfiles[i].bearerBitmask = profiles[i].bearerBitmap;
2583 dataProfiles[i].mtu = profiles[i].mtu;
2584 }
2585
2586 CALL_ONREQUEST(RIL_REQUEST_SET_DATA_PROFILE, dataProfilePtrs,
2587 num * sizeof(RIL_DataProfileInfo_v15 *), pRI, mSlotId);
2588
2589 freeSetDataProfileData(num, dataProfiles, dataProfilePtrs, 6,
2590 &RIL_DataProfileInfo_v15::apn, &RIL_DataProfileInfo_v15::protocol,
2591 &RIL_DataProfileInfo_v15::roamingProtocol, &RIL_DataProfileInfo_v15::user,
2592 &RIL_DataProfileInfo_v15::password, &RIL_DataProfileInfo_v15::mvnoMatchData);
2593 }
2594
2595 return Void();
2596 }
2597
requestShutdown(int32_t serial)2598 Return<void> RadioImpl::requestShutdown(int32_t serial) {
2599 #if VDBG
2600 RLOGD("requestShutdown: serial %d", serial);
2601 #endif
2602 dispatchVoid(serial, mSlotId, RIL_REQUEST_SHUTDOWN);
2603 return Void();
2604 }
2605
getRadioCapability(int32_t serial)2606 Return<void> RadioImpl::getRadioCapability(int32_t serial) {
2607 #if VDBG
2608 RLOGD("getRadioCapability: serial %d", serial);
2609 #endif
2610 dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_RADIO_CAPABILITY);
2611 return Void();
2612 }
2613
setRadioCapability(int32_t serial,const RadioCapability & rc)2614 Return<void> RadioImpl::setRadioCapability(int32_t serial, const RadioCapability& rc) {
2615 #if VDBG
2616 RLOGD("setRadioCapability: serial %d", serial);
2617 #endif
2618 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_SET_RADIO_CAPABILITY);
2619 if (pRI == NULL) {
2620 return Void();
2621 }
2622
2623 RIL_RadioCapability rilRc = {};
2624
2625 // TODO : set rilRc.version using HIDL version ?
2626 rilRc.session = rc.session;
2627 rilRc.phase = (int) rc.phase;
2628 rilRc.rat = (int) rc.raf;
2629 rilRc.status = (int) rc.status;
2630 strlcpy(rilRc.logicalModemUuid, rc.logicalModemUuid.c_str(), sizeof(rilRc.logicalModemUuid));
2631
2632 CALL_ONREQUEST(pRI->pCI->requestNumber, &rilRc, sizeof(rilRc), pRI, mSlotId);
2633
2634 return Void();
2635 }
2636
startLceService(int32_t serial,int32_t reportInterval,bool pullMode)2637 Return<void> RadioImpl::startLceService(int32_t serial, int32_t reportInterval, bool pullMode) {
2638 #if VDBG
2639 RLOGD("startLceService: serial %d", serial);
2640 #endif
2641 dispatchInts(serial, mSlotId, RIL_REQUEST_START_LCE, 2, reportInterval,
2642 BOOL_TO_INT(pullMode));
2643 return Void();
2644 }
2645
stopLceService(int32_t serial)2646 Return<void> RadioImpl::stopLceService(int32_t serial) {
2647 #if VDBG
2648 RLOGD("stopLceService: serial %d", serial);
2649 #endif
2650 dispatchVoid(serial, mSlotId, RIL_REQUEST_STOP_LCE);
2651 return Void();
2652 }
2653
pullLceData(int32_t serial)2654 Return<void> RadioImpl::pullLceData(int32_t serial) {
2655 #if VDBG
2656 RLOGD("pullLceData: serial %d", serial);
2657 #endif
2658 dispatchVoid(serial, mSlotId, RIL_REQUEST_PULL_LCEDATA);
2659 return Void();
2660 }
2661
getModemActivityInfo(int32_t serial)2662 Return<void> RadioImpl::getModemActivityInfo(int32_t serial) {
2663 #if VDBG
2664 RLOGD("getModemActivityInfo: serial %d", serial);
2665 #endif
2666 dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_ACTIVITY_INFO);
2667 return Void();
2668 }
2669
setAllowedCarriers(int32_t serial,bool allAllowed,const CarrierRestrictions & carriers)2670 Return<void> RadioImpl::setAllowedCarriers(int32_t serial, bool allAllowed,
2671 const CarrierRestrictions& carriers) {
2672 #if VDBG
2673 RLOGD("setAllowedCarriers: serial %d", serial);
2674 #endif
2675 RequestInfo *pRI = android::addRequestToList(serial, mSlotId,
2676 RIL_REQUEST_SET_CARRIER_RESTRICTIONS);
2677 if (pRI == NULL) {
2678 return Void();
2679 }
2680
2681 RIL_CarrierRestrictions cr = {};
2682 RIL_Carrier *allowedCarriers = NULL;
2683 RIL_Carrier *excludedCarriers = NULL;
2684
2685 cr.len_allowed_carriers = carriers.allowedCarriers.size();
2686 allowedCarriers = (RIL_Carrier *)calloc(cr.len_allowed_carriers, sizeof(RIL_Carrier));
2687 if (allowedCarriers == NULL) {
2688 RLOGE("setAllowedCarriers: Memory allocation failed for request %s",
2689 requestToString(pRI->pCI->requestNumber));
2690 sendErrorResponse(pRI, RIL_E_NO_MEMORY);
2691 return Void();
2692 }
2693 cr.allowed_carriers = allowedCarriers;
2694
2695 cr.len_excluded_carriers = carriers.excludedCarriers.size();
2696 excludedCarriers = (RIL_Carrier *)calloc(cr.len_excluded_carriers, sizeof(RIL_Carrier));
2697 if (excludedCarriers == NULL) {
2698 RLOGE("setAllowedCarriers: Memory allocation failed for request %s",
2699 requestToString(pRI->pCI->requestNumber));
2700 sendErrorResponse(pRI, RIL_E_NO_MEMORY);
2701 #ifdef MEMSET_FREED
2702 memset(allowedCarriers, 0, cr.len_allowed_carriers * sizeof(RIL_Carrier));
2703 #endif
2704 free(allowedCarriers);
2705 return Void();
2706 }
2707 cr.excluded_carriers = excludedCarriers;
2708
2709 for (int i = 0; i < cr.len_allowed_carriers; i++) {
2710 allowedCarriers[i].mcc = carriers.allowedCarriers[i].mcc.c_str();
2711 allowedCarriers[i].mnc = carriers.allowedCarriers[i].mnc.c_str();
2712 allowedCarriers[i].match_type = (RIL_CarrierMatchType) carriers.allowedCarriers[i].matchType;
2713 allowedCarriers[i].match_data = carriers.allowedCarriers[i].matchData.c_str();
2714 }
2715
2716 for (int i = 0; i < cr.len_excluded_carriers; i++) {
2717 excludedCarriers[i].mcc = carriers.excludedCarriers[i].mcc.c_str();
2718 excludedCarriers[i].mnc = carriers.excludedCarriers[i].mnc.c_str();
2719 excludedCarriers[i].match_type =
2720 (RIL_CarrierMatchType) carriers.excludedCarriers[i].matchType;
2721 excludedCarriers[i].match_data = carriers.excludedCarriers[i].matchData.c_str();
2722 }
2723
2724 CALL_ONREQUEST(pRI->pCI->requestNumber, &cr, sizeof(RIL_CarrierRestrictions), pRI, mSlotId);
2725
2726 #ifdef MEMSET_FREED
2727 memset(allowedCarriers, 0, cr.len_allowed_carriers * sizeof(RIL_Carrier));
2728 memset(excludedCarriers, 0, cr.len_excluded_carriers * sizeof(RIL_Carrier));
2729 #endif
2730 free(allowedCarriers);
2731 free(excludedCarriers);
2732 return Void();
2733 }
2734
getAllowedCarriers(int32_t serial)2735 Return<void> RadioImpl::getAllowedCarriers(int32_t serial) {
2736 #if VDBG
2737 RLOGD("getAllowedCarriers: serial %d", serial);
2738 #endif
2739 dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_CARRIER_RESTRICTIONS);
2740 return Void();
2741 }
2742
sendDeviceState(int32_t serial,DeviceStateType deviceStateType,bool state)2743 Return<void> RadioImpl::sendDeviceState(int32_t serial, DeviceStateType deviceStateType,
2744 bool state) {
2745 #if VDBG
2746 RLOGD("sendDeviceState: serial %d", serial);
2747 #endif
2748 if (s_vendorFunctions->version < 15) {
2749 if (deviceStateType == DeviceStateType::LOW_DATA_EXPECTED) {
2750 RLOGD("sendDeviceState: calling screen state %d", BOOL_TO_INT(!state));
2751 dispatchInts(serial, mSlotId, RIL_REQUEST_SCREEN_STATE, 1, BOOL_TO_INT(!state));
2752 } else {
2753 RequestInfo *pRI = android::addRequestToList(serial, mSlotId,
2754 RIL_REQUEST_SEND_DEVICE_STATE);
2755 sendErrorResponse(pRI, RIL_E_REQUEST_NOT_SUPPORTED);
2756 }
2757 return Void();
2758 }
2759 dispatchInts(serial, mSlotId, RIL_REQUEST_SEND_DEVICE_STATE, 2, (int) deviceStateType,
2760 BOOL_TO_INT(state));
2761 return Void();
2762 }
2763
setIndicationFilter(int32_t serial,int32_t indicationFilter)2764 Return<void> RadioImpl::setIndicationFilter(int32_t serial, int32_t indicationFilter) {
2765 #if VDBG
2766 RLOGD("setIndicationFilter: serial %d", serial);
2767 #endif
2768 if (s_vendorFunctions->version < 15) {
2769 RequestInfo *pRI = android::addRequestToList(serial, mSlotId,
2770 RIL_REQUEST_SET_UNSOLICITED_RESPONSE_FILTER);
2771 sendErrorResponse(pRI, RIL_E_REQUEST_NOT_SUPPORTED);
2772 return Void();
2773 }
2774 dispatchInts(serial, mSlotId, RIL_REQUEST_SET_UNSOLICITED_RESPONSE_FILTER, 1, indicationFilter);
2775 return Void();
2776 }
2777
setSimCardPower(int32_t serial,bool powerUp)2778 Return<void> RadioImpl::setSimCardPower(int32_t serial, bool powerUp) {
2779 #if VDBG
2780 RLOGD("setSimCardPower: serial %d", serial);
2781 #endif
2782 dispatchInts(serial, mSlotId, RIL_REQUEST_SET_SIM_CARD_POWER, 1, BOOL_TO_INT(powerUp));
2783 return Void();
2784 }
2785
setSimCardPower_1_1(int32_t serial,const V1_1::CardPowerState state)2786 Return<void> RadioImpl::setSimCardPower_1_1(int32_t serial, const V1_1::CardPowerState state) {
2787 #if VDBG
2788 RLOGD("setSimCardPower_1_1: serial %d state %d", serial, state);
2789 #endif
2790 dispatchInts(serial, mSlotId, RIL_REQUEST_SET_SIM_CARD_POWER, 1, state);
2791 return Void();
2792 }
2793
setCarrierInfoForImsiEncryption(int32_t serial,const V1_1::ImsiEncryptionInfo & data)2794 Return<void> RadioImpl::setCarrierInfoForImsiEncryption(int32_t serial,
2795 const V1_1::ImsiEncryptionInfo& data) {
2796 #if VDBG
2797 RLOGD("setCarrierInfoForImsiEncryption: serial %d", serial);
2798 #endif
2799 RequestInfo *pRI = android::addRequestToList(
2800 serial, mSlotId, RIL_REQUEST_SET_CARRIER_INFO_IMSI_ENCRYPTION);
2801 if (pRI == NULL) {
2802 return Void();
2803 }
2804
2805 RIL_CarrierInfoForImsiEncryption imsiEncryption = {};
2806
2807 if (!copyHidlStringToRil(&imsiEncryption.mnc, data.mnc, pRI)) {
2808 return Void();
2809 }
2810 if (!copyHidlStringToRil(&imsiEncryption.mcc, data.mcc, pRI)) {
2811 memsetAndFreeStrings(1, imsiEncryption.mnc);
2812 return Void();
2813 }
2814 if (!copyHidlStringToRil(&imsiEncryption.keyIdentifier, data.keyIdentifier, pRI)) {
2815 memsetAndFreeStrings(2, imsiEncryption.mnc, imsiEncryption.mcc);
2816 return Void();
2817 }
2818 imsiEncryption.carrierKeyLength = data.carrierKey.size();
2819 imsiEncryption.carrierKey = new uint8_t[imsiEncryption.carrierKeyLength];
2820 memcpy(imsiEncryption.carrierKey, data.carrierKey.data(), imsiEncryption.carrierKeyLength);
2821 imsiEncryption.expirationTime = data.expirationTime;
2822 CALL_ONREQUEST(pRI->pCI->requestNumber, &imsiEncryption,
2823 sizeof(RIL_CarrierInfoForImsiEncryption), pRI, mSlotId);
2824 delete(imsiEncryption.carrierKey);
2825 return Void();
2826 }
2827
startKeepalive(int32_t serial,const V1_1::KeepaliveRequest & keepalive)2828 Return<void> RadioImpl::startKeepalive(int32_t serial, const V1_1::KeepaliveRequest& keepalive) {
2829 #if VDBG
2830 RLOGD("%s(): %d", __FUNCTION__, serial);
2831 #endif
2832 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_START_KEEPALIVE);
2833 if (pRI == NULL) {
2834 return Void();
2835 }
2836
2837 RIL_KeepaliveRequest kaReq = {};
2838
2839 kaReq.type = static_cast<RIL_KeepaliveType>(keepalive.type);
2840 switch(kaReq.type) {
2841 case NATT_IPV4:
2842 if (keepalive.sourceAddress.size() != 4 ||
2843 keepalive.destinationAddress.size() != 4) {
2844 RLOGE("Invalid address for keepalive!");
2845 sendErrorResponse(pRI, RIL_E_INVALID_ARGUMENTS);
2846 return Void();
2847 }
2848 break;
2849 case NATT_IPV6:
2850 if (keepalive.sourceAddress.size() != 16 ||
2851 keepalive.destinationAddress.size() != 16) {
2852 RLOGE("Invalid address for keepalive!");
2853 sendErrorResponse(pRI, RIL_E_INVALID_ARGUMENTS);
2854 return Void();
2855 }
2856 break;
2857 default:
2858 RLOGE("Unknown packet keepalive type!");
2859 sendErrorResponse(pRI, RIL_E_INVALID_ARGUMENTS);
2860 return Void();
2861 }
2862
2863 ::memcpy(kaReq.sourceAddress, keepalive.sourceAddress.data(), keepalive.sourceAddress.size());
2864 kaReq.sourcePort = keepalive.sourcePort;
2865
2866 ::memcpy(kaReq.destinationAddress,
2867 keepalive.destinationAddress.data(), keepalive.destinationAddress.size());
2868 kaReq.destinationPort = keepalive.destinationPort;
2869
2870 kaReq.maxKeepaliveIntervalMillis = keepalive.maxKeepaliveIntervalMillis;
2871 kaReq.cid = keepalive.cid; // This is the context ID of the data call
2872
2873 CALL_ONREQUEST(pRI->pCI->requestNumber, &kaReq, sizeof(RIL_KeepaliveRequest), pRI, mSlotId);
2874 return Void();
2875 }
2876
stopKeepalive(int32_t serial,int32_t sessionHandle)2877 Return<void> RadioImpl::stopKeepalive(int32_t serial, int32_t sessionHandle) {
2878 #if VDBG
2879 RLOGD("%s(): %d", __FUNCTION__, serial);
2880 #endif
2881 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_STOP_KEEPALIVE);
2882 if (pRI == NULL) {
2883 return Void();
2884 }
2885
2886 CALL_ONREQUEST(pRI->pCI->requestNumber, &sessionHandle, sizeof(uint32_t), pRI, mSlotId);
2887 return Void();
2888 }
2889
responseAcknowledgement()2890 Return<void> RadioImpl::responseAcknowledgement() {
2891 android::releaseWakeLock();
2892 return Void();
2893 }
2894
2895 /***************************************************************************************************
2896 * RESPONSE FUNCTIONS
2897 * Functions above are used for requests going from framework to vendor code. The ones below are
2898 * responses for those requests coming back from the vendor code.
2899 **************************************************************************************************/
2900
acknowledgeRequest(int slotId,int serial)2901 void radio::acknowledgeRequest(int slotId, int serial) {
2902 if (radioService[slotId]->mRadioResponse != NULL) {
2903 Return<void> retStatus = radioService[slotId]->mRadioResponse->acknowledgeRequest(serial);
2904 radioService[slotId]->checkReturnStatus(retStatus);
2905 } else {
2906 RLOGE("acknowledgeRequest: radioService[%d]->mRadioResponse == NULL", slotId);
2907 }
2908 }
2909
populateResponseInfo(RadioResponseInfo & responseInfo,int serial,int responseType,RIL_Errno e)2910 void populateResponseInfo(RadioResponseInfo& responseInfo, int serial, int responseType,
2911 RIL_Errno e) {
2912 responseInfo.serial = serial;
2913 switch (responseType) {
2914 case RESPONSE_SOLICITED:
2915 responseInfo.type = RadioResponseType::SOLICITED;
2916 break;
2917 case RESPONSE_SOLICITED_ACK_EXP:
2918 responseInfo.type = RadioResponseType::SOLICITED_ACK_EXP;
2919 break;
2920 }
2921 responseInfo.error = (RadioError) e;
2922 }
2923
responseIntOrEmpty(RadioResponseInfo & responseInfo,int serial,int responseType,RIL_Errno e,void * response,size_t responseLen)2924 int responseIntOrEmpty(RadioResponseInfo& responseInfo, int serial, int responseType, RIL_Errno e,
2925 void *response, size_t responseLen) {
2926 populateResponseInfo(responseInfo, serial, responseType, e);
2927 int ret = -1;
2928
2929 if (response == NULL && responseLen == 0) {
2930 // Earlier RILs did not send a response for some cases although the interface
2931 // expected an integer as response. Do not return error if response is empty. Instead
2932 // Return -1 in those cases to maintain backward compatibility.
2933 } else if (response == NULL || responseLen != sizeof(int)) {
2934 RLOGE("responseIntOrEmpty: Invalid response");
2935 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
2936 } else {
2937 int *p_int = (int *) response;
2938 ret = p_int[0];
2939 }
2940 return ret;
2941 }
2942
responseInt(RadioResponseInfo & responseInfo,int serial,int responseType,RIL_Errno e,void * response,size_t responseLen)2943 int responseInt(RadioResponseInfo& responseInfo, int serial, int responseType, RIL_Errno e,
2944 void *response, size_t responseLen) {
2945 populateResponseInfo(responseInfo, serial, responseType, e);
2946 int ret = -1;
2947
2948 if (response == NULL || responseLen != sizeof(int)) {
2949 RLOGE("responseInt: Invalid response");
2950 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
2951 } else {
2952 int *p_int = (int *) response;
2953 ret = p_int[0];
2954 }
2955 return ret;
2956 }
2957
getIccCardStatusResponse(int slotId,int responseType,int serial,RIL_Errno e,void * response,size_t responseLen)2958 int radio::getIccCardStatusResponse(int slotId,
2959 int responseType, int serial, RIL_Errno e,
2960 void *response, size_t responseLen) {
2961 if (radioService[slotId]->mRadioResponse != NULL) {
2962 RadioResponseInfo responseInfo = {};
2963 populateResponseInfo(responseInfo, serial, responseType, e);
2964 CardStatus cardStatus = {CardState::ABSENT, PinState::UNKNOWN, -1, -1, -1, {}};
2965 RIL_CardStatus_v6 *p_cur = ((RIL_CardStatus_v6 *) response);
2966 if (response == NULL || responseLen != sizeof(RIL_CardStatus_v6)
2967 || p_cur->gsm_umts_subscription_app_index >= p_cur->num_applications
2968 || p_cur->cdma_subscription_app_index >= p_cur->num_applications
2969 || p_cur->ims_subscription_app_index >= p_cur->num_applications) {
2970 RLOGE("getIccCardStatusResponse: Invalid response");
2971 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
2972 } else {
2973 cardStatus.cardState = (CardState) p_cur->card_state;
2974 cardStatus.universalPinState = (PinState) p_cur->universal_pin_state;
2975 cardStatus.gsmUmtsSubscriptionAppIndex = p_cur->gsm_umts_subscription_app_index;
2976 cardStatus.cdmaSubscriptionAppIndex = p_cur->cdma_subscription_app_index;
2977 cardStatus.imsSubscriptionAppIndex = p_cur->ims_subscription_app_index;
2978
2979 RIL_AppStatus *rilAppStatus = p_cur->applications;
2980 cardStatus.applications.resize(p_cur->num_applications);
2981 AppStatus *appStatus = cardStatus.applications.data();
2982 #if VDBG
2983 RLOGD("getIccCardStatusResponse: num_applications %d", p_cur->num_applications);
2984 #endif
2985 for (int i = 0; i < p_cur->num_applications; i++) {
2986 appStatus[i].appType = (AppType) rilAppStatus[i].app_type;
2987 appStatus[i].appState = (AppState) rilAppStatus[i].app_state;
2988 appStatus[i].persoSubstate = (PersoSubstate) rilAppStatus[i].perso_substate;
2989 appStatus[i].aidPtr = convertCharPtrToHidlString(rilAppStatus[i].aid_ptr);
2990 appStatus[i].appLabelPtr = convertCharPtrToHidlString(
2991 rilAppStatus[i].app_label_ptr);
2992 appStatus[i].pin1Replaced = rilAppStatus[i].pin1_replaced;
2993 appStatus[i].pin1 = (PinState) rilAppStatus[i].pin1;
2994 appStatus[i].pin2 = (PinState) rilAppStatus[i].pin2;
2995 }
2996 }
2997
2998 Return<void> retStatus = radioService[slotId]->mRadioResponse->
2999 getIccCardStatusResponse(responseInfo, cardStatus);
3000 radioService[slotId]->checkReturnStatus(retStatus);
3001 } else {
3002 RLOGE("getIccCardStatusResponse: radioService[%d]->mRadioResponse == NULL", slotId);
3003 }
3004
3005 return 0;
3006 }
3007
supplyIccPinForAppResponse(int slotId,int responseType,int serial,RIL_Errno e,void * response,size_t responseLen)3008 int radio::supplyIccPinForAppResponse(int slotId,
3009 int responseType, int serial, RIL_Errno e,
3010 void *response, size_t responseLen) {
3011 #if VDBG
3012 RLOGD("supplyIccPinForAppResponse: serial %d", serial);
3013 #endif
3014
3015 if (radioService[slotId]->mRadioResponse != NULL) {
3016 RadioResponseInfo responseInfo = {};
3017 int ret = responseIntOrEmpty(responseInfo, serial, responseType, e, response, responseLen);
3018 Return<void> retStatus = radioService[slotId]->mRadioResponse->
3019 supplyIccPinForAppResponse(responseInfo, ret);
3020 RLOGE("supplyIccPinForAppResponse: amit ret %d", ret);
3021 radioService[slotId]->checkReturnStatus(retStatus);
3022 } else {
3023 RLOGE("supplyIccPinForAppResponse: radioService[%d]->mRadioResponse == NULL",
3024 slotId);
3025 }
3026
3027 return 0;
3028 }
3029
supplyIccPukForAppResponse(int slotId,int responseType,int serial,RIL_Errno e,void * response,size_t responseLen)3030 int radio::supplyIccPukForAppResponse(int slotId,
3031 int responseType, int serial, RIL_Errno e,
3032 void *response, size_t responseLen) {
3033 #if VDBG
3034 RLOGD("supplyIccPukForAppResponse: serial %d", serial);
3035 #endif
3036
3037 if (radioService[slotId]->mRadioResponse != NULL) {
3038 RadioResponseInfo responseInfo = {};
3039 int ret = responseIntOrEmpty(responseInfo, serial, responseType, e, response, responseLen);
3040 Return<void> retStatus = radioService[slotId]->mRadioResponse->supplyIccPukForAppResponse(
3041 responseInfo, ret);
3042 radioService[slotId]->checkReturnStatus(retStatus);
3043 } else {
3044 RLOGE("supplyIccPukForAppResponse: radioService[%d]->mRadioResponse == NULL",
3045 slotId);
3046 }
3047
3048 return 0;
3049 }
3050
supplyIccPin2ForAppResponse(int slotId,int responseType,int serial,RIL_Errno e,void * response,size_t responseLen)3051 int radio::supplyIccPin2ForAppResponse(int slotId,
3052 int responseType, int serial, RIL_Errno e,
3053 void *response, size_t responseLen) {
3054 #if VDBG
3055 RLOGD("supplyIccPin2ForAppResponse: serial %d", serial);
3056 #endif
3057
3058 if (radioService[slotId]->mRadioResponse != NULL) {
3059 RadioResponseInfo responseInfo = {};
3060 int ret = responseIntOrEmpty(responseInfo, serial, responseType, e, response, responseLen);
3061 Return<void> retStatus = radioService[slotId]->mRadioResponse->
3062 supplyIccPin2ForAppResponse(responseInfo, ret);
3063 radioService[slotId]->checkReturnStatus(retStatus);
3064 } else {
3065 RLOGE("supplyIccPin2ForAppResponse: radioService[%d]->mRadioResponse == NULL",
3066 slotId);
3067 }
3068
3069 return 0;
3070 }
3071
supplyIccPuk2ForAppResponse(int slotId,int responseType,int serial,RIL_Errno e,void * response,size_t responseLen)3072 int radio::supplyIccPuk2ForAppResponse(int slotId,
3073 int responseType, int serial, RIL_Errno e,
3074 void *response, size_t responseLen) {
3075 #if VDBG
3076 RLOGD("supplyIccPuk2ForAppResponse: serial %d", serial);
3077 #endif
3078
3079 if (radioService[slotId]->mRadioResponse != NULL) {
3080 RadioResponseInfo responseInfo = {};
3081 int ret = responseIntOrEmpty(responseInfo, serial, responseType, e, response, responseLen);
3082 Return<void> retStatus = radioService[slotId]->mRadioResponse->
3083 supplyIccPuk2ForAppResponse(responseInfo, ret);
3084 radioService[slotId]->checkReturnStatus(retStatus);
3085 } else {
3086 RLOGE("supplyIccPuk2ForAppResponse: radioService[%d]->mRadioResponse == NULL",
3087 slotId);
3088 }
3089
3090 return 0;
3091 }
3092
changeIccPinForAppResponse(int slotId,int responseType,int serial,RIL_Errno e,void * response,size_t responseLen)3093 int radio::changeIccPinForAppResponse(int slotId,
3094 int responseType, int serial, RIL_Errno e,
3095 void *response, size_t responseLen) {
3096 #if VDBG
3097 RLOGD("changeIccPinForAppResponse: serial %d", serial);
3098 #endif
3099
3100 if (radioService[slotId]->mRadioResponse != NULL) {
3101 RadioResponseInfo responseInfo = {};
3102 int ret = responseIntOrEmpty(responseInfo, serial, responseType, e, response, responseLen);
3103 Return<void> retStatus = radioService[slotId]->mRadioResponse->
3104 changeIccPinForAppResponse(responseInfo, ret);
3105 radioService[slotId]->checkReturnStatus(retStatus);
3106 } else {
3107 RLOGE("changeIccPinForAppResponse: radioService[%d]->mRadioResponse == NULL",
3108 slotId);
3109 }
3110
3111 return 0;
3112 }
3113
changeIccPin2ForAppResponse(int slotId,int responseType,int serial,RIL_Errno e,void * response,size_t responseLen)3114 int radio::changeIccPin2ForAppResponse(int slotId,
3115 int responseType, int serial, RIL_Errno e,
3116 void *response, size_t responseLen) {
3117 #if VDBG
3118 RLOGD("changeIccPin2ForAppResponse: serial %d", serial);
3119 #endif
3120
3121 if (radioService[slotId]->mRadioResponse != NULL) {
3122 RadioResponseInfo responseInfo = {};
3123 int ret = responseIntOrEmpty(responseInfo, serial, responseType, e, response, responseLen);
3124 Return<void> retStatus = radioService[slotId]->mRadioResponse->
3125 changeIccPin2ForAppResponse(responseInfo, ret);
3126 radioService[slotId]->checkReturnStatus(retStatus);
3127 } else {
3128 RLOGE("changeIccPin2ForAppResponse: radioService[%d]->mRadioResponse == NULL",
3129 slotId);
3130 }
3131
3132 return 0;
3133 }
3134
supplyNetworkDepersonalizationResponse(int slotId,int responseType,int serial,RIL_Errno e,void * response,size_t responseLen)3135 int radio::supplyNetworkDepersonalizationResponse(int slotId,
3136 int responseType, int serial, RIL_Errno e,
3137 void *response, size_t responseLen) {
3138 #if VDBG
3139 RLOGD("supplyNetworkDepersonalizationResponse: serial %d", serial);
3140 #endif
3141
3142 if (radioService[slotId]->mRadioResponse != NULL) {
3143 RadioResponseInfo responseInfo = {};
3144 int ret = responseIntOrEmpty(responseInfo, serial, responseType, e, response, responseLen);
3145 Return<void> retStatus = radioService[slotId]->mRadioResponse->
3146 supplyNetworkDepersonalizationResponse(responseInfo, ret);
3147 radioService[slotId]->checkReturnStatus(retStatus);
3148 } else {
3149 RLOGE("supplyNetworkDepersonalizationResponse: radioService[%d]->mRadioResponse == "
3150 "NULL", slotId);
3151 }
3152
3153 return 0;
3154 }
3155
getCurrentCallsResponse(int slotId,int responseType,int serial,RIL_Errno e,void * response,size_t responseLen)3156 int radio::getCurrentCallsResponse(int slotId,
3157 int responseType, int serial, RIL_Errno e,
3158 void *response, size_t responseLen) {
3159 #if VDBG
3160 RLOGD("getCurrentCallsResponse: serial %d", serial);
3161 #endif
3162
3163 if (radioService[slotId]->mRadioResponse != NULL) {
3164 RadioResponseInfo responseInfo = {};
3165 populateResponseInfo(responseInfo, serial, responseType, e);
3166
3167 hidl_vec<Call> calls;
3168 if ((response == NULL && responseLen != 0)
3169 || (responseLen % sizeof(RIL_Call *)) != 0) {
3170 RLOGE("getCurrentCallsResponse: Invalid response");
3171 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
3172 } else {
3173 int num = responseLen / sizeof(RIL_Call *);
3174 calls.resize(num);
3175
3176 for (int i = 0 ; i < num ; i++) {
3177 RIL_Call *p_cur = ((RIL_Call **) response)[i];
3178 /* each call info */
3179 calls[i].state = (CallState) p_cur->state;
3180 calls[i].index = p_cur->index;
3181 calls[i].toa = p_cur->toa;
3182 calls[i].isMpty = p_cur->isMpty;
3183 calls[i].isMT = p_cur->isMT;
3184 calls[i].als = p_cur->als;
3185 calls[i].isVoice = p_cur->isVoice;
3186 calls[i].isVoicePrivacy = p_cur->isVoicePrivacy;
3187 calls[i].number = convertCharPtrToHidlString(p_cur->number);
3188 calls[i].numberPresentation = (CallPresentation) p_cur->numberPresentation;
3189 calls[i].name = convertCharPtrToHidlString(p_cur->name);
3190 calls[i].namePresentation = (CallPresentation) p_cur->namePresentation;
3191 if (p_cur->uusInfo != NULL && p_cur->uusInfo->uusData != NULL) {
3192 RIL_UUS_Info *uusInfo = p_cur->uusInfo;
3193 calls[i].uusInfo.resize(1);
3194 calls[i].uusInfo[0].uusType = (UusType) uusInfo->uusType;
3195 calls[i].uusInfo[0].uusDcs = (UusDcs) uusInfo->uusDcs;
3196 // convert uusInfo->uusData to a null-terminated string
3197 char *nullTermStr = strndup(uusInfo->uusData, uusInfo->uusLength);
3198 calls[i].uusInfo[0].uusData = nullTermStr;
3199 free(nullTermStr);
3200 }
3201 }
3202 }
3203
3204 Return<void> retStatus = radioService[slotId]->mRadioResponse->
3205 getCurrentCallsResponse(responseInfo, calls);
3206 radioService[slotId]->checkReturnStatus(retStatus);
3207 } else {
3208 RLOGE("getCurrentCallsResponse: radioService[%d]->mRadioResponse == NULL", slotId);
3209 }
3210
3211 return 0;
3212 }
3213
dialResponse(int slotId,int responseType,int serial,RIL_Errno e,void * response,size_t responseLen)3214 int radio::dialResponse(int slotId,
3215 int responseType, int serial, RIL_Errno e, void *response,
3216 size_t responseLen) {
3217 #if VDBG
3218 RLOGD("dialResponse: serial %d", serial);
3219 #endif
3220
3221 if (radioService[slotId]->mRadioResponse != NULL) {
3222 RadioResponseInfo responseInfo = {};
3223 populateResponseInfo(responseInfo, serial, responseType, e);
3224 Return<void> retStatus = radioService[slotId]->mRadioResponse->dialResponse(responseInfo);
3225 radioService[slotId]->checkReturnStatus(retStatus);
3226 } else {
3227 RLOGE("dialResponse: radioService[%d]->mRadioResponse == NULL", slotId);
3228 }
3229
3230 return 0;
3231 }
3232
getIMSIForAppResponse(int slotId,int responseType,int serial,RIL_Errno e,void * response,size_t responseLen)3233 int radio::getIMSIForAppResponse(int slotId,
3234 int responseType, int serial, RIL_Errno e, void *response,
3235 size_t responseLen) {
3236 #if VDBG
3237 RLOGD("getIMSIForAppResponse: serial %d", serial);
3238 #endif
3239
3240 if (radioService[slotId]->mRadioResponse != NULL) {
3241 RadioResponseInfo responseInfo = {};
3242 populateResponseInfo(responseInfo, serial, responseType, e);
3243 Return<void> retStatus = radioService[slotId]->mRadioResponse->getIMSIForAppResponse(
3244 responseInfo, convertCharPtrToHidlString((char *) response));
3245 radioService[slotId]->checkReturnStatus(retStatus);
3246 } else {
3247 RLOGE("getIMSIForAppResponse: radioService[%d]->mRadioResponse == NULL",
3248 slotId);
3249 }
3250
3251 return 0;
3252 }
3253
hangupConnectionResponse(int slotId,int responseType,int serial,RIL_Errno e,void * response,size_t responseLen)3254 int radio::hangupConnectionResponse(int slotId,
3255 int responseType, int serial, RIL_Errno e,
3256 void *response, size_t responseLen) {
3257 #if VDBG
3258 RLOGD("hangupConnectionResponse: serial %d", serial);
3259 #endif
3260
3261 if (radioService[slotId]->mRadioResponse != NULL) {
3262 RadioResponseInfo responseInfo = {};
3263 populateResponseInfo(responseInfo, serial, responseType, e);
3264 Return<void> retStatus = radioService[slotId]->mRadioResponse->hangupConnectionResponse(
3265 responseInfo);
3266 radioService[slotId]->checkReturnStatus(retStatus);
3267 } else {
3268 RLOGE("hangupConnectionResponse: radioService[%d]->mRadioResponse == NULL",
3269 slotId);
3270 }
3271
3272 return 0;
3273 }
3274
hangupWaitingOrBackgroundResponse(int slotId,int responseType,int serial,RIL_Errno e,void * response,size_t responseLen)3275 int radio::hangupWaitingOrBackgroundResponse(int slotId,
3276 int responseType, int serial, RIL_Errno e,
3277 void *response, size_t responseLen) {
3278 #if VDBG
3279 RLOGD("hangupWaitingOrBackgroundResponse: serial %d", serial);
3280 #endif
3281
3282 if (radioService[slotId]->mRadioResponse != NULL) {
3283 RadioResponseInfo responseInfo = {};
3284 populateResponseInfo(responseInfo, serial, responseType, e);
3285 Return<void> retStatus =
3286 radioService[slotId]->mRadioResponse->hangupWaitingOrBackgroundResponse(
3287 responseInfo);
3288 radioService[slotId]->checkReturnStatus(retStatus);
3289 } else {
3290 RLOGE("hangupWaitingOrBackgroundResponse: radioService[%d]->mRadioResponse == NULL",
3291 slotId);
3292 }
3293
3294 return 0;
3295 }
3296
hangupForegroundResumeBackgroundResponse(int slotId,int responseType,int serial,RIL_Errno e,void * response,size_t responseLen)3297 int radio::hangupForegroundResumeBackgroundResponse(int slotId, int responseType, int serial,
3298 RIL_Errno e, void *response,
3299 size_t responseLen) {
3300 #if VDBG
3301 RLOGD("hangupWaitingOrBackgroundResponse: serial %d", serial);
3302 #endif
3303
3304 if (radioService[slotId]->mRadioResponse != NULL) {
3305 RadioResponseInfo responseInfo = {};
3306 populateResponseInfo(responseInfo, serial, responseType, e);
3307 Return<void> retStatus =
3308 radioService[slotId]->mRadioResponse->hangupWaitingOrBackgroundResponse(
3309 responseInfo);
3310 radioService[slotId]->checkReturnStatus(retStatus);
3311 } else {
3312 RLOGE("hangupWaitingOrBackgroundResponse: radioService[%d]->mRadioResponse == NULL",
3313 slotId);
3314 }
3315
3316 return 0;
3317 }
3318
switchWaitingOrHoldingAndActiveResponse(int slotId,int responseType,int serial,RIL_Errno e,void * response,size_t responseLen)3319 int radio::switchWaitingOrHoldingAndActiveResponse(int slotId, int responseType, int serial,
3320 RIL_Errno e, void *response,
3321 size_t responseLen) {
3322 #if VDBG
3323 RLOGD("switchWaitingOrHoldingAndActiveResponse: serial %d", serial);
3324 #endif
3325
3326 if (radioService[slotId]->mRadioResponse != NULL) {
3327 RadioResponseInfo responseInfo = {};
3328 populateResponseInfo(responseInfo, serial, responseType, e);
3329 Return<void> retStatus =
3330 radioService[slotId]->mRadioResponse->switchWaitingOrHoldingAndActiveResponse(
3331 responseInfo);
3332 radioService[slotId]->checkReturnStatus(retStatus);
3333 } else {
3334 RLOGE("switchWaitingOrHoldingAndActiveResponse: radioService[%d]->mRadioResponse "
3335 "== NULL", slotId);
3336 }
3337
3338 return 0;
3339 }
3340
conferenceResponse(int slotId,int responseType,int serial,RIL_Errno e,void * response,size_t responseLen)3341 int radio::conferenceResponse(int slotId, int responseType,
3342 int serial, RIL_Errno e, void *response, size_t responseLen) {
3343 #if VDBG
3344 RLOGD("conferenceResponse: serial %d", serial);
3345 #endif
3346
3347 if (radioService[slotId]->mRadioResponse != NULL) {
3348 RadioResponseInfo responseInfo = {};
3349 populateResponseInfo(responseInfo, serial, responseType, e);
3350 Return<void> retStatus = radioService[slotId]->mRadioResponse->conferenceResponse(
3351 responseInfo);
3352 radioService[slotId]->checkReturnStatus(retStatus);
3353 } else {
3354 RLOGE("conferenceResponse: radioService[%d]->mRadioResponse == NULL",
3355 slotId);
3356 }
3357
3358 return 0;
3359 }
3360
rejectCallResponse(int slotId,int responseType,int serial,RIL_Errno e,void * response,size_t responseLen)3361 int radio::rejectCallResponse(int slotId, int responseType,
3362 int serial, RIL_Errno e, void *response, size_t responseLen) {
3363 #if VDBG
3364 RLOGD("rejectCallResponse: serial %d", serial);
3365 #endif
3366
3367 if (radioService[slotId]->mRadioResponse != NULL) {
3368 RadioResponseInfo responseInfo = {};
3369 populateResponseInfo(responseInfo, serial, responseType, e);
3370 Return<void> retStatus = radioService[slotId]->mRadioResponse->rejectCallResponse(
3371 responseInfo);
3372 radioService[slotId]->checkReturnStatus(retStatus);
3373 } else {
3374 RLOGE("rejectCallResponse: radioService[%d]->mRadioResponse == NULL",
3375 slotId);
3376 }
3377
3378 return 0;
3379 }
3380
getLastCallFailCauseResponse(int slotId,int responseType,int serial,RIL_Errno e,void * response,size_t responseLen)3381 int radio::getLastCallFailCauseResponse(int slotId,
3382 int responseType, int serial, RIL_Errno e, void *response,
3383 size_t responseLen) {
3384 #if VDBG
3385 RLOGD("getLastCallFailCauseResponse: serial %d", serial);
3386 #endif
3387
3388 if (radioService[slotId]->mRadioResponse != NULL) {
3389 RadioResponseInfo responseInfo = {};
3390 populateResponseInfo(responseInfo, serial, responseType, e);
3391
3392 LastCallFailCauseInfo info = {};
3393 info.vendorCause = hidl_string();
3394 if (response == NULL) {
3395 RLOGE("getCurrentCallsResponse Invalid response: NULL");
3396 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
3397 } else if (responseLen == sizeof(int)) {
3398 int *pInt = (int *) response;
3399 info.causeCode = (LastCallFailCause) pInt[0];
3400 } else if (responseLen == sizeof(RIL_LastCallFailCauseInfo)) {
3401 RIL_LastCallFailCauseInfo *pFailCauseInfo = (RIL_LastCallFailCauseInfo *) response;
3402 info.causeCode = (LastCallFailCause) pFailCauseInfo->cause_code;
3403 info.vendorCause = convertCharPtrToHidlString(pFailCauseInfo->vendor_cause);
3404 } else {
3405 RLOGE("getCurrentCallsResponse Invalid response: NULL");
3406 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
3407 }
3408
3409 Return<void> retStatus = radioService[slotId]->mRadioResponse->getLastCallFailCauseResponse(
3410 responseInfo, info);
3411 radioService[slotId]->checkReturnStatus(retStatus);
3412 } else {
3413 RLOGE("getLastCallFailCauseResponse: radioService[%d]->mRadioResponse == NULL",
3414 slotId);
3415 }
3416
3417 return 0;
3418 }
3419
getSignalStrengthResponse(int slotId,int responseType,int serial,RIL_Errno e,void * response,size_t responseLen)3420 int radio::getSignalStrengthResponse(int slotId,
3421 int responseType, int serial, RIL_Errno e,
3422 void *response, size_t responseLen) {
3423 #if VDBG
3424 RLOGD("getSignalStrengthResponse: serial %d", serial);
3425 #endif
3426
3427 if (radioService[slotId]->mRadioResponse != NULL) {
3428 RadioResponseInfo responseInfo = {};
3429 populateResponseInfo(responseInfo, serial, responseType, e);
3430 SignalStrength signalStrength = {};
3431 if (response == NULL || responseLen != sizeof(RIL_SignalStrength_v10)) {
3432 RLOGE("getSignalStrengthResponse: Invalid response");
3433 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
3434 } else {
3435 convertRilSignalStrengthToHal(response, responseLen, signalStrength);
3436 }
3437
3438 Return<void> retStatus = radioService[slotId]->mRadioResponse->getSignalStrengthResponse(
3439 responseInfo, signalStrength);
3440 radioService[slotId]->checkReturnStatus(retStatus);
3441 } else {
3442 RLOGE("getSignalStrengthResponse: radioService[%d]->mRadioResponse == NULL",
3443 slotId);
3444 }
3445
3446 return 0;
3447 }
3448
getCellInfoTypeRadioTechnology(char * rat)3449 RIL_CellInfoType getCellInfoTypeRadioTechnology(char *rat) {
3450 if (rat == NULL) {
3451 return RIL_CELL_INFO_TYPE_NONE;
3452 }
3453
3454 int radioTech = atoi(rat);
3455
3456 switch(radioTech) {
3457
3458 case RADIO_TECH_GPRS:
3459 case RADIO_TECH_EDGE:
3460 case RADIO_TECH_GSM: {
3461 return RIL_CELL_INFO_TYPE_GSM;
3462 }
3463
3464 case RADIO_TECH_UMTS:
3465 case RADIO_TECH_HSDPA:
3466 case RADIO_TECH_HSUPA:
3467 case RADIO_TECH_HSPA:
3468 case RADIO_TECH_HSPAP: {
3469 return RIL_CELL_INFO_TYPE_WCDMA;
3470 }
3471
3472 case RADIO_TECH_IS95A:
3473 case RADIO_TECH_IS95B:
3474 case RADIO_TECH_1xRTT:
3475 case RADIO_TECH_EVDO_0:
3476 case RADIO_TECH_EVDO_A:
3477 case RADIO_TECH_EVDO_B:
3478 case RADIO_TECH_EHRPD: {
3479 return RIL_CELL_INFO_TYPE_CDMA;
3480 }
3481
3482 case RADIO_TECH_LTE:
3483 case RADIO_TECH_LTE_CA: {
3484 return RIL_CELL_INFO_TYPE_LTE;
3485 }
3486
3487 case RADIO_TECH_TD_SCDMA: {
3488 return RIL_CELL_INFO_TYPE_TD_SCDMA;
3489 }
3490
3491 default: {
3492 break;
3493 }
3494 }
3495
3496 return RIL_CELL_INFO_TYPE_NONE;
3497
3498 }
3499
fillCellIdentityResponse(CellIdentity & cellIdentity,RIL_CellIdentity_v16 & rilCellIdentity)3500 void fillCellIdentityResponse(CellIdentity &cellIdentity, RIL_CellIdentity_v16 &rilCellIdentity) {
3501
3502 cellIdentity.cellIdentityGsm.resize(0);
3503 cellIdentity.cellIdentityWcdma.resize(0);
3504 cellIdentity.cellIdentityCdma.resize(0);
3505 cellIdentity.cellIdentityTdscdma.resize(0);
3506 cellIdentity.cellIdentityLte.resize(0);
3507 cellIdentity.cellInfoType = (CellInfoType)rilCellIdentity.cellInfoType;
3508 switch(rilCellIdentity.cellInfoType) {
3509
3510 case RIL_CELL_INFO_TYPE_GSM: {
3511 cellIdentity.cellIdentityGsm.resize(1);
3512 cellIdentity.cellIdentityGsm[0].mcc =
3513 ril::util::mcc::decode(rilCellIdentity.cellIdentityGsm.mcc);
3514 cellIdentity.cellIdentityGsm[0].mnc =
3515 ril::util::mnc::decode(rilCellIdentity.cellIdentityGsm.mnc);
3516
3517 if (cellIdentity.cellIdentityGsm[0].mcc == "-1") {
3518 cellIdentity.cellIdentityGsm[0].mcc = "";
3519 }
3520
3521 cellIdentity.cellIdentityGsm[0].lac = rilCellIdentity.cellIdentityGsm.lac;
3522 cellIdentity.cellIdentityGsm[0].cid = rilCellIdentity.cellIdentityGsm.cid;
3523 cellIdentity.cellIdentityGsm[0].arfcn = rilCellIdentity.cellIdentityGsm.arfcn;
3524 cellIdentity.cellIdentityGsm[0].bsic = rilCellIdentity.cellIdentityGsm.bsic;
3525 break;
3526 }
3527
3528 case RIL_CELL_INFO_TYPE_WCDMA: {
3529 cellIdentity.cellIdentityWcdma.resize(1);
3530 cellIdentity.cellIdentityWcdma[0].mcc =
3531 ril::util::mcc::decode(rilCellIdentity.cellIdentityWcdma.mcc);
3532 cellIdentity.cellIdentityWcdma[0].mnc =
3533 ril::util::mnc::decode(rilCellIdentity.cellIdentityWcdma.mnc);
3534
3535 if (cellIdentity.cellIdentityWcdma[0].mcc == "-1") {
3536 cellIdentity.cellIdentityWcdma[0].mcc = "";
3537 }
3538
3539 cellIdentity.cellIdentityWcdma[0].lac = rilCellIdentity.cellIdentityWcdma.lac;
3540 cellIdentity.cellIdentityWcdma[0].cid = rilCellIdentity.cellIdentityWcdma.cid;
3541 cellIdentity.cellIdentityWcdma[0].psc = rilCellIdentity.cellIdentityWcdma.psc;
3542 cellIdentity.cellIdentityWcdma[0].uarfcn = rilCellIdentity.cellIdentityWcdma.uarfcn;
3543 break;
3544 }
3545
3546 case RIL_CELL_INFO_TYPE_CDMA: {
3547 cellIdentity.cellIdentityCdma.resize(1);
3548 cellIdentity.cellIdentityCdma[0].networkId = rilCellIdentity.cellIdentityCdma.networkId;
3549 cellIdentity.cellIdentityCdma[0].systemId = rilCellIdentity.cellIdentityCdma.systemId;
3550 cellIdentity.cellIdentityCdma[0].baseStationId =
3551 rilCellIdentity.cellIdentityCdma.basestationId;
3552 cellIdentity.cellIdentityCdma[0].longitude = rilCellIdentity.cellIdentityCdma.longitude;
3553 cellIdentity.cellIdentityCdma[0].latitude = rilCellIdentity.cellIdentityCdma.latitude;
3554 break;
3555 }
3556
3557 case RIL_CELL_INFO_TYPE_LTE: {
3558 cellIdentity.cellIdentityLte.resize(1);
3559 cellIdentity.cellIdentityLte[0].mcc =
3560 ril::util::mcc::decode(rilCellIdentity.cellIdentityLte.mcc);
3561 cellIdentity.cellIdentityLte[0].mnc =
3562 ril::util::mnc::decode(rilCellIdentity.cellIdentityLte.mnc);
3563
3564 if (cellIdentity.cellIdentityLte[0].mcc == "-1") {
3565 cellIdentity.cellIdentityLte[0].mcc = "";
3566 }
3567
3568 cellIdentity.cellIdentityLte[0].ci = rilCellIdentity.cellIdentityLte.ci;
3569 cellIdentity.cellIdentityLte[0].pci = rilCellIdentity.cellIdentityLte.pci;
3570 cellIdentity.cellIdentityLte[0].tac = rilCellIdentity.cellIdentityLte.tac;
3571 cellIdentity.cellIdentityLte[0].earfcn = rilCellIdentity.cellIdentityLte.earfcn;
3572 break;
3573 }
3574
3575 case RIL_CELL_INFO_TYPE_TD_SCDMA: {
3576 cellIdentity.cellIdentityTdscdma.resize(1);
3577 cellIdentity.cellIdentityTdscdma[0].mcc =
3578 ril::util::mcc::decode(rilCellIdentity.cellIdentityTdscdma.mcc);
3579 cellIdentity.cellIdentityTdscdma[0].mnc =
3580 ril::util::mnc::decode(rilCellIdentity.cellIdentityTdscdma.mnc);
3581
3582 if (cellIdentity.cellIdentityTdscdma[0].mcc == "-1") {
3583 cellIdentity.cellIdentityTdscdma[0].mcc = "";
3584 }
3585
3586 cellIdentity.cellIdentityTdscdma[0].lac = rilCellIdentity.cellIdentityTdscdma.lac;
3587 cellIdentity.cellIdentityTdscdma[0].cid = rilCellIdentity.cellIdentityTdscdma.cid;
3588 cellIdentity.cellIdentityTdscdma[0].cpid = rilCellIdentity.cellIdentityTdscdma.cpid;
3589 break;
3590 }
3591
3592 default: {
3593 break;
3594 }
3595 }
3596 }
3597
convertResponseStringEntryToInt(char ** response,int index,int numStrings)3598 int convertResponseStringEntryToInt(char **response, int index, int numStrings) {
3599 if ((response != NULL) && (numStrings > index) && (response[index] != NULL)) {
3600 return atoi(response[index]);
3601 }
3602
3603 return -1;
3604 }
3605
convertResponseHexStringEntryToInt(char ** response,int index,int numStrings)3606 int convertResponseHexStringEntryToInt(char **response, int index, int numStrings) {
3607 const int hexBase = 16;
3608 if ((response != NULL) && (numStrings > index) && (response[index] != NULL)) {
3609 return strtol(response[index], NULL, hexBase);
3610 }
3611
3612 return -1;
3613 }
3614
3615 /* Fill Cell Identity info from Voice Registration State Response.
3616 * This fucntion is applicable only for RIL Version < 15.
3617 * Response is a "char **".
3618 * First and Second entries are in hex string format
3619 * and rest are integers represented in ascii format. */
fillCellIdentityFromVoiceRegStateResponseString(CellIdentity & cellIdentity,int numStrings,char ** response)3620 void fillCellIdentityFromVoiceRegStateResponseString(CellIdentity &cellIdentity,
3621 int numStrings, char** response) {
3622
3623 RIL_CellIdentity_v16 rilCellIdentity;
3624 memset(&rilCellIdentity, -1, sizeof(RIL_CellIdentity_v16));
3625
3626 rilCellIdentity.cellInfoType = getCellInfoTypeRadioTechnology(response[3]);
3627 switch(rilCellIdentity.cellInfoType) {
3628
3629 case RIL_CELL_INFO_TYPE_GSM: {
3630 /* valid LAC are hexstrings in the range 0x0000 - 0xffff */
3631 rilCellIdentity.cellIdentityGsm.lac =
3632 convertResponseHexStringEntryToInt(response, 1, numStrings);
3633
3634 /* valid CID are hexstrings in the range 0x00000000 - 0xffffffff */
3635 rilCellIdentity.cellIdentityGsm.cid =
3636 convertResponseHexStringEntryToInt(response, 2, numStrings);
3637 break;
3638 }
3639
3640 case RIL_CELL_INFO_TYPE_WCDMA: {
3641 /* valid LAC are hexstrings in the range 0x0000 - 0xffff */
3642 rilCellIdentity.cellIdentityWcdma.lac =
3643 convertResponseHexStringEntryToInt(response, 1, numStrings);
3644
3645 /* valid CID are hexstrings in the range 0x00000000 - 0xffffffff */
3646 rilCellIdentity.cellIdentityWcdma.cid =
3647 convertResponseHexStringEntryToInt(response, 2, numStrings);
3648 rilCellIdentity.cellIdentityWcdma.psc =
3649 convertResponseStringEntryToInt(response, 14, numStrings);
3650 break;
3651 }
3652
3653 case RIL_CELL_INFO_TYPE_TD_SCDMA:{
3654 /* valid LAC are hexstrings in the range 0x0000 - 0xffff */
3655 rilCellIdentity.cellIdentityTdscdma.lac =
3656 convertResponseHexStringEntryToInt(response, 1, numStrings);
3657
3658 /* valid CID are hexstrings in the range 0x00000000 - 0xffffffff */
3659 rilCellIdentity.cellIdentityTdscdma.cid =
3660 convertResponseHexStringEntryToInt(response, 2, numStrings);
3661 break;
3662 }
3663
3664 case RIL_CELL_INFO_TYPE_CDMA:{
3665 rilCellIdentity.cellIdentityCdma.basestationId =
3666 convertResponseStringEntryToInt(response, 4, numStrings);
3667 /* Order of Lat. and Long. swapped between RIL and HIDL interface versions. */
3668 rilCellIdentity.cellIdentityCdma.latitude =
3669 convertResponseStringEntryToInt(response, 5, numStrings);
3670 rilCellIdentity.cellIdentityCdma.longitude =
3671 convertResponseStringEntryToInt(response, 6, numStrings);
3672 rilCellIdentity.cellIdentityCdma.systemId =
3673 convertResponseStringEntryToInt(response, 8, numStrings);
3674 rilCellIdentity.cellIdentityCdma.networkId =
3675 convertResponseStringEntryToInt(response, 9, numStrings);
3676 break;
3677 }
3678
3679 case RIL_CELL_INFO_TYPE_LTE:{
3680 /* valid TAC are hexstrings in the range 0x0000 - 0xffff */
3681 rilCellIdentity.cellIdentityLte.tac =
3682 convertResponseHexStringEntryToInt(response, 1, numStrings);
3683
3684 /* valid CID are hexstrings in the range 0x00000000 - 0xffffffff */
3685 rilCellIdentity.cellIdentityLte.ci =
3686 convertResponseHexStringEntryToInt(response, 2, numStrings);
3687 break;
3688 }
3689
3690 default: {
3691 break;
3692 }
3693 }
3694
3695 fillCellIdentityResponse(cellIdentity, rilCellIdentity);
3696 }
3697
3698 /* Fill Cell Identity info from Data Registration State Response.
3699 * This fucntion is applicable only for RIL Version < 15.
3700 * Response is a "char **".
3701 * First and Second entries are in hex string format
3702 * and rest are integers represented in ascii format. */
fillCellIdentityFromDataRegStateResponseString(CellIdentity & cellIdentity,int numStrings,char ** response)3703 void fillCellIdentityFromDataRegStateResponseString(CellIdentity &cellIdentity,
3704 int numStrings, char** response) {
3705
3706 RIL_CellIdentity_v16 rilCellIdentity;
3707 memset(&rilCellIdentity, -1, sizeof(RIL_CellIdentity_v16));
3708
3709 rilCellIdentity.cellInfoType = getCellInfoTypeRadioTechnology(response[3]);
3710 switch(rilCellIdentity.cellInfoType) {
3711 case RIL_CELL_INFO_TYPE_GSM: {
3712 /* valid LAC are hexstrings in the range 0x0000 - 0xffff */
3713 rilCellIdentity.cellIdentityGsm.lac =
3714 convertResponseHexStringEntryToInt(response, 1, numStrings);
3715
3716 /* valid CID are hexstrings in the range 0x00000000 - 0xffffffff */
3717 rilCellIdentity.cellIdentityGsm.cid =
3718 convertResponseHexStringEntryToInt(response, 2, numStrings);
3719
3720 if (numStrings >= 13) {
3721 rilCellIdentity.cellIdentityGsm.mcc =
3722 convertResponseStringEntryToInt(response, 11, numStrings);
3723
3724 rilCellIdentity.cellIdentityGsm.mnc =
3725 convertResponseStringEntryToInt(response, 12, numStrings);
3726 }
3727 break;
3728 }
3729 case RIL_CELL_INFO_TYPE_WCDMA: {
3730 /* valid LAC are hexstrings in the range 0x0000 - 0xffff */
3731 rilCellIdentity.cellIdentityWcdma.lac =
3732 convertResponseHexStringEntryToInt(response, 1, numStrings);
3733
3734 /* valid CID are hexstrings in the range 0x00000000 - 0xffffffff */
3735 rilCellIdentity.cellIdentityWcdma.cid =
3736 convertResponseHexStringEntryToInt(response, 2, numStrings);
3737
3738 if (numStrings >= 13) {
3739 rilCellIdentity.cellIdentityWcdma.mcc =
3740 convertResponseStringEntryToInt(response, 11, numStrings);
3741
3742 rilCellIdentity.cellIdentityWcdma.mnc =
3743 convertResponseStringEntryToInt(response, 12, numStrings);
3744 }
3745 break;
3746 }
3747 case RIL_CELL_INFO_TYPE_TD_SCDMA:{
3748 /* valid LAC are hexstrings in the range 0x0000 - 0xffff */
3749 rilCellIdentity.cellIdentityTdscdma.lac =
3750 convertResponseHexStringEntryToInt(response, 1, numStrings);
3751
3752 /* valid CID are hexstrings in the range 0x00000000 - 0xffffffff */
3753 rilCellIdentity.cellIdentityTdscdma.cid =
3754 convertResponseHexStringEntryToInt(response, 2, numStrings);
3755
3756 if (numStrings >= 13) {
3757 rilCellIdentity.cellIdentityTdscdma.mcc =
3758 convertResponseStringEntryToInt(response, 11, numStrings);
3759
3760 rilCellIdentity.cellIdentityTdscdma.mnc =
3761 convertResponseStringEntryToInt(response, 12, numStrings);
3762 }
3763 break;
3764 }
3765 case RIL_CELL_INFO_TYPE_LTE: {
3766 rilCellIdentity.cellIdentityLte.tac =
3767 convertResponseStringEntryToInt(response, 6, numStrings);
3768 rilCellIdentity.cellIdentityLte.pci =
3769 convertResponseStringEntryToInt(response, 7, numStrings);
3770 rilCellIdentity.cellIdentityLte.ci =
3771 convertResponseStringEntryToInt(response, 8, numStrings);
3772
3773 if (numStrings >= 13) {
3774 rilCellIdentity.cellIdentityLte.mcc =
3775 convertResponseStringEntryToInt(response, 11, numStrings);
3776
3777 rilCellIdentity.cellIdentityLte.mnc =
3778 convertResponseStringEntryToInt(response, 12, numStrings);
3779 }
3780 break;
3781 }
3782 default: {
3783 break;
3784 }
3785 }
3786
3787 fillCellIdentityResponse(cellIdentity, rilCellIdentity);
3788 }
3789
getVoiceRegistrationStateResponse(int slotId,int responseType,int serial,RIL_Errno e,void * response,size_t responseLen)3790 int radio::getVoiceRegistrationStateResponse(int slotId,
3791 int responseType, int serial, RIL_Errno e,
3792 void *response, size_t responseLen) {
3793 #if VDBG
3794 RLOGD("getVoiceRegistrationStateResponse: serial %d", serial);
3795 #endif
3796
3797 if (radioService[slotId]->mRadioResponse != NULL) {
3798 RadioResponseInfo responseInfo = {};
3799 populateResponseInfo(responseInfo, serial, responseType, e);
3800
3801 VoiceRegStateResult voiceRegResponse = {};
3802 int numStrings = responseLen / sizeof(char *);
3803 if (response == NULL) {
3804 RLOGE("getVoiceRegistrationStateResponse Invalid response: NULL");
3805 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
3806 } else if (s_vendorFunctions->version <= 14) {
3807 if (numStrings != 15) {
3808 RLOGE("getVoiceRegistrationStateResponse Invalid response: NULL");
3809 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
3810 } else {
3811 char **resp = (char **) response;
3812 voiceRegResponse.regState = (RegState) ATOI_NULL_HANDLED_DEF(resp[0], 4);
3813 voiceRegResponse.rat = ATOI_NULL_HANDLED(resp[3]);
3814 voiceRegResponse.cssSupported = ATOI_NULL_HANDLED_DEF(resp[7], 0);
3815 voiceRegResponse.roamingIndicator = ATOI_NULL_HANDLED(resp[10]);
3816 voiceRegResponse.systemIsInPrl = ATOI_NULL_HANDLED_DEF(resp[11], 0);
3817 voiceRegResponse.defaultRoamingIndicator = ATOI_NULL_HANDLED_DEF(resp[12], 0);
3818 voiceRegResponse.reasonForDenial = ATOI_NULL_HANDLED_DEF(resp[13], 0);
3819 fillCellIdentityFromVoiceRegStateResponseString(voiceRegResponse.cellIdentity,
3820 numStrings, resp);
3821 }
3822 } else {
3823 RIL_VoiceRegistrationStateResponse *voiceRegState =
3824 (RIL_VoiceRegistrationStateResponse *)response;
3825
3826 if (responseLen != sizeof(RIL_VoiceRegistrationStateResponse)) {
3827 RLOGE("getVoiceRegistrationStateResponse Invalid response: NULL");
3828 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
3829 } else {
3830 voiceRegResponse.regState = (RegState) voiceRegState->regState;
3831 voiceRegResponse.rat = voiceRegState->rat;;
3832 voiceRegResponse.cssSupported = voiceRegState->cssSupported;
3833 voiceRegResponse.roamingIndicator = voiceRegState->roamingIndicator;
3834 voiceRegResponse.systemIsInPrl = voiceRegState->systemIsInPrl;
3835 voiceRegResponse.defaultRoamingIndicator = voiceRegState->defaultRoamingIndicator;
3836 voiceRegResponse.reasonForDenial = voiceRegState->reasonForDenial;
3837 fillCellIdentityResponse(voiceRegResponse.cellIdentity,
3838 voiceRegState->cellIdentity);
3839 }
3840 }
3841
3842 Return<void> retStatus =
3843 radioService[slotId]->mRadioResponse->getVoiceRegistrationStateResponse(
3844 responseInfo, voiceRegResponse);
3845 radioService[slotId]->checkReturnStatus(retStatus);
3846 } else {
3847 RLOGE("getVoiceRegistrationStateResponse: radioService[%d]->mRadioResponse == NULL",
3848 slotId);
3849 }
3850
3851 return 0;
3852 }
3853
getDataRegistrationStateResponse(int slotId,int responseType,int serial,RIL_Errno e,void * response,size_t responseLen)3854 int radio::getDataRegistrationStateResponse(int slotId,
3855 int responseType, int serial, RIL_Errno e,
3856 void *response, size_t responseLen) {
3857 #if VDBG
3858 RLOGD("getDataRegistrationStateResponse: serial %d", serial);
3859 #endif
3860
3861 if (radioService[slotId]->mRadioResponse != NULL) {
3862 RadioResponseInfo responseInfo = {};
3863 populateResponseInfo(responseInfo, serial, responseType, e);
3864 DataRegStateResult dataRegResponse = {};
3865 if (response == NULL) {
3866 RLOGE("getDataRegistrationStateResponse Invalid response: NULL");
3867 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
3868 } else if (s_vendorFunctions->version <= 14) {
3869 int numStrings = responseLen / sizeof(char *);
3870 if ((numStrings != 6) && (numStrings != 11) && (numStrings != 13)) {
3871 RLOGE("getDataRegistrationStateResponse Invalid response: NULL");
3872 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
3873 } else {
3874 char **resp = (char **) response;
3875 dataRegResponse.regState = (RegState) ATOI_NULL_HANDLED_DEF(resp[0], 4);
3876 dataRegResponse.rat = ATOI_NULL_HANDLED_DEF(resp[3], 0);
3877 dataRegResponse.reasonDataDenied = ATOI_NULL_HANDLED(resp[4]);
3878 dataRegResponse.maxDataCalls = ATOI_NULL_HANDLED_DEF(resp[5], 1);
3879 fillCellIdentityFromDataRegStateResponseString(dataRegResponse.cellIdentity,
3880 numStrings, resp);
3881 }
3882 } else {
3883 RIL_DataRegistrationStateResponse *dataRegState =
3884 (RIL_DataRegistrationStateResponse *)response;
3885
3886 if (responseLen != sizeof(RIL_DataRegistrationStateResponse)) {
3887 RLOGE("getDataRegistrationStateResponse Invalid response: NULL");
3888 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
3889 } else {
3890 dataRegResponse.regState = (RegState) dataRegState->regState;
3891 dataRegResponse.rat = dataRegState->rat;;
3892 dataRegResponse.reasonDataDenied = dataRegState->reasonDataDenied;
3893 dataRegResponse.maxDataCalls = dataRegState->maxDataCalls;
3894 fillCellIdentityResponse(dataRegResponse.cellIdentity, dataRegState->cellIdentity);
3895 }
3896 }
3897
3898 Return<void> retStatus =
3899 radioService[slotId]->mRadioResponse->getDataRegistrationStateResponse(responseInfo,
3900 dataRegResponse);
3901 radioService[slotId]->checkReturnStatus(retStatus);
3902 } else {
3903 RLOGE("getDataRegistrationStateResponse: radioService[%d]->mRadioResponse == NULL",
3904 slotId);
3905 }
3906
3907 return 0;
3908 }
3909
getOperatorResponse(int slotId,int responseType,int serial,RIL_Errno e,void * response,size_t responseLen)3910 int radio::getOperatorResponse(int slotId,
3911 int responseType, int serial, RIL_Errno e, void *response,
3912 size_t responseLen) {
3913 #if VDBG
3914 RLOGD("getOperatorResponse: serial %d", serial);
3915 #endif
3916
3917 if (radioService[slotId]->mRadioResponse != NULL) {
3918 RadioResponseInfo responseInfo = {};
3919 populateResponseInfo(responseInfo, serial, responseType, e);
3920 hidl_string longName;
3921 hidl_string shortName;
3922 hidl_string numeric;
3923 int numStrings = responseLen / sizeof(char *);
3924 if (response == NULL || numStrings != 3) {
3925 RLOGE("getOperatorResponse Invalid response: NULL");
3926 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
3927
3928 } else {
3929 char **resp = (char **) response;
3930 longName = convertCharPtrToHidlString(resp[0]);
3931 shortName = convertCharPtrToHidlString(resp[1]);
3932 numeric = convertCharPtrToHidlString(resp[2]);
3933 }
3934 Return<void> retStatus = radioService[slotId]->mRadioResponse->getOperatorResponse(
3935 responseInfo, longName, shortName, numeric);
3936 radioService[slotId]->checkReturnStatus(retStatus);
3937 } else {
3938 RLOGE("getOperatorResponse: radioService[%d]->mRadioResponse == NULL",
3939 slotId);
3940 }
3941
3942 return 0;
3943 }
3944
setRadioPowerResponse(int slotId,int responseType,int serial,RIL_Errno e,void * response,size_t responseLen)3945 int radio::setRadioPowerResponse(int slotId,
3946 int responseType, int serial, RIL_Errno e, void *response,
3947 size_t responseLen) {
3948 RLOGD("setRadioPowerResponse: serial %d", serial);
3949
3950 if (radioService[slotId]->mRadioResponse != NULL) {
3951 RadioResponseInfo responseInfo = {};
3952 populateResponseInfo(responseInfo, serial, responseType, e);
3953 Return<void> retStatus = radioService[slotId]->mRadioResponse->setRadioPowerResponse(
3954 responseInfo);
3955 radioService[slotId]->checkReturnStatus(retStatus);
3956 } else {
3957 RLOGE("setRadioPowerResponse: radioService[%d]->mRadioResponse == NULL",
3958 slotId);
3959 }
3960
3961 return 0;
3962 }
3963
sendDtmfResponse(int slotId,int responseType,int serial,RIL_Errno e,void * response,size_t responseLen)3964 int radio::sendDtmfResponse(int slotId,
3965 int responseType, int serial, RIL_Errno e, void *response,
3966 size_t responseLen) {
3967 #if VDBG
3968 RLOGD("sendDtmfResponse: serial %d", serial);
3969 #endif
3970
3971 if (radioService[slotId]->mRadioResponse != NULL) {
3972 RadioResponseInfo responseInfo = {};
3973 populateResponseInfo(responseInfo, serial, responseType, e);
3974 Return<void> retStatus = radioService[slotId]->mRadioResponse->sendDtmfResponse(
3975 responseInfo);
3976 radioService[slotId]->checkReturnStatus(retStatus);
3977 } else {
3978 RLOGE("sendDtmfResponse: radioService[%d]->mRadioResponse == NULL",
3979 slotId);
3980 }
3981
3982 return 0;
3983 }
3984
makeSendSmsResult(RadioResponseInfo & responseInfo,int serial,int responseType,RIL_Errno e,void * response,size_t responseLen)3985 SendSmsResult makeSendSmsResult(RadioResponseInfo& responseInfo, int serial, int responseType,
3986 RIL_Errno e, void *response, size_t responseLen) {
3987 populateResponseInfo(responseInfo, serial, responseType, e);
3988 SendSmsResult result = {};
3989
3990 if (response == NULL || responseLen != sizeof(RIL_SMS_Response)) {
3991 RLOGE("Invalid response: NULL");
3992 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
3993 result.ackPDU = hidl_string();
3994 } else {
3995 RIL_SMS_Response *resp = (RIL_SMS_Response *) response;
3996 result.messageRef = resp->messageRef;
3997 result.ackPDU = convertCharPtrToHidlString(resp->ackPDU);
3998 result.errorCode = resp->errorCode;
3999 }
4000 return result;
4001 }
4002
sendSmsResponse(int slotId,int responseType,int serial,RIL_Errno e,void * response,size_t responseLen)4003 int radio::sendSmsResponse(int slotId,
4004 int responseType, int serial, RIL_Errno e, void *response,
4005 size_t responseLen) {
4006 #if VDBG
4007 RLOGD("sendSmsResponse: serial %d", serial);
4008 #endif
4009
4010 if (radioService[slotId]->mRadioResponse != NULL) {
4011 RadioResponseInfo responseInfo = {};
4012 SendSmsResult result = makeSendSmsResult(responseInfo, serial, responseType, e, response,
4013 responseLen);
4014
4015 Return<void> retStatus = radioService[slotId]->mRadioResponse->sendSmsResponse(responseInfo,
4016 result);
4017 radioService[slotId]->checkReturnStatus(retStatus);
4018 } else {
4019 RLOGE("sendSmsResponse: radioService[%d]->mRadioResponse == NULL", slotId);
4020 }
4021
4022 return 0;
4023 }
4024
sendSMSExpectMoreResponse(int slotId,int responseType,int serial,RIL_Errno e,void * response,size_t responseLen)4025 int radio::sendSMSExpectMoreResponse(int slotId,
4026 int responseType, int serial, RIL_Errno e, void *response,
4027 size_t responseLen) {
4028 #if VDBG
4029 RLOGD("sendSMSExpectMoreResponse: serial %d", serial);
4030 #endif
4031
4032 if (radioService[slotId]->mRadioResponse != NULL) {
4033 RadioResponseInfo responseInfo = {};
4034 SendSmsResult result = makeSendSmsResult(responseInfo, serial, responseType, e, response,
4035 responseLen);
4036
4037 Return<void> retStatus = radioService[slotId]->mRadioResponse->sendSMSExpectMoreResponse(
4038 responseInfo, result);
4039 radioService[slotId]->checkReturnStatus(retStatus);
4040 } else {
4041 RLOGE("sendSMSExpectMoreResponse: radioService[%d]->mRadioResponse == NULL", slotId);
4042 }
4043
4044 return 0;
4045 }
4046
setupDataCallResponse(int slotId,int responseType,int serial,RIL_Errno e,void * response,size_t responseLen)4047 int radio::setupDataCallResponse(int slotId,
4048 int responseType, int serial, RIL_Errno e, void *response,
4049 size_t responseLen) {
4050 #if VDBG
4051 RLOGD("setupDataCallResponse: serial %d", serial);
4052 #endif
4053
4054 if (radioService[slotId]->mRadioResponse != NULL) {
4055 RadioResponseInfo responseInfo = {};
4056 populateResponseInfo(responseInfo, serial, responseType, e);
4057
4058 SetupDataCallResult result = {};
4059 if (response == NULL || (responseLen % sizeof(RIL_Data_Call_Response_v11)) != 0) {
4060 if (response != NULL) {
4061 RLOGE("setupDataCallResponse: Invalid response");
4062 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
4063 }
4064 result.status = DataCallFailCause::ERROR_UNSPECIFIED;
4065 result.type = hidl_string();
4066 result.ifname = hidl_string();
4067 result.addresses = hidl_string();
4068 result.dnses = hidl_string();
4069 result.gateways = hidl_string();
4070 result.pcscf = hidl_string();
4071 } else {
4072 convertRilDataCallToHal((RIL_Data_Call_Response_v11 *) response, result);
4073 }
4074
4075 Return<void> retStatus = radioService[slotId]->mRadioResponse->setupDataCallResponse(
4076 responseInfo, result);
4077 radioService[slotId]->checkReturnStatus(retStatus);
4078 } else {
4079 RLOGE("setupDataCallResponse: radioService[%d]->mRadioResponse == NULL", slotId);
4080 }
4081
4082 return 0;
4083 }
4084
responseIccIo(RadioResponseInfo & responseInfo,int serial,int responseType,RIL_Errno e,void * response,size_t responseLen)4085 IccIoResult responseIccIo(RadioResponseInfo& responseInfo, int serial, int responseType,
4086 RIL_Errno e, void *response, size_t responseLen) {
4087 populateResponseInfo(responseInfo, serial, responseType, e);
4088 IccIoResult result = {};
4089
4090 if (response == NULL || responseLen != sizeof(RIL_SIM_IO_Response)) {
4091 RLOGE("Invalid response: NULL");
4092 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
4093 result.simResponse = hidl_string();
4094 } else {
4095 RIL_SIM_IO_Response *resp = (RIL_SIM_IO_Response *) response;
4096 result.sw1 = resp->sw1;
4097 result.sw2 = resp->sw2;
4098 result.simResponse = convertCharPtrToHidlString(resp->simResponse);
4099 }
4100 return result;
4101 }
4102
iccIOForAppResponse(int slotId,int responseType,int serial,RIL_Errno e,void * response,size_t responseLen)4103 int radio::iccIOForAppResponse(int slotId,
4104 int responseType, int serial, RIL_Errno e, void *response,
4105 size_t responseLen) {
4106 #if VDBG
4107 RLOGD("iccIOForAppResponse: serial %d", serial);
4108 #endif
4109
4110 if (radioService[slotId]->mRadioResponse != NULL) {
4111 RadioResponseInfo responseInfo = {};
4112 IccIoResult result = responseIccIo(responseInfo, serial, responseType, e, response,
4113 responseLen);
4114
4115 Return<void> retStatus = radioService[slotId]->mRadioResponse->iccIOForAppResponse(
4116 responseInfo, result);
4117 radioService[slotId]->checkReturnStatus(retStatus);
4118 } else {
4119 RLOGE("iccIOForAppResponse: radioService[%d]->mRadioResponse == NULL", slotId);
4120 }
4121
4122 return 0;
4123 }
4124
sendUssdResponse(int slotId,int responseType,int serial,RIL_Errno e,void * response,size_t responseLen)4125 int radio::sendUssdResponse(int slotId,
4126 int responseType, int serial, RIL_Errno e, void *response,
4127 size_t responseLen) {
4128 #if VDBG
4129 RLOGD("sendUssdResponse: serial %d", serial);
4130 #endif
4131
4132 if (radioService[slotId]->mRadioResponse != NULL) {
4133 RadioResponseInfo responseInfo = {};
4134 populateResponseInfo(responseInfo, serial, responseType, e);
4135 Return<void> retStatus = radioService[slotId]->mRadioResponse->sendUssdResponse(
4136 responseInfo);
4137 radioService[slotId]->checkReturnStatus(retStatus);
4138 } else {
4139 RLOGE("sendUssdResponse: radioService[%d]->mRadioResponse == NULL",
4140 slotId);
4141 }
4142
4143 return 0;
4144 }
4145
cancelPendingUssdResponse(int slotId,int responseType,int serial,RIL_Errno e,void * response,size_t responseLen)4146 int radio::cancelPendingUssdResponse(int slotId,
4147 int responseType, int serial, RIL_Errno e, void *response,
4148 size_t responseLen) {
4149 #if VDBG
4150 RLOGD("cancelPendingUssdResponse: serial %d", serial);
4151 #endif
4152
4153 if (radioService[slotId]->mRadioResponse != NULL) {
4154 RadioResponseInfo responseInfo = {};
4155 populateResponseInfo(responseInfo, serial, responseType, e);
4156 Return<void> retStatus = radioService[slotId]->mRadioResponse->cancelPendingUssdResponse(
4157 responseInfo);
4158 radioService[slotId]->checkReturnStatus(retStatus);
4159 } else {
4160 RLOGE("cancelPendingUssdResponse: radioService[%d]->mRadioResponse == NULL",
4161 slotId);
4162 }
4163
4164 return 0;
4165 }
4166
getClirResponse(int slotId,int responseType,int serial,RIL_Errno e,void * response,size_t responseLen)4167 int radio::getClirResponse(int slotId,
4168 int responseType, int serial, RIL_Errno e, void *response,
4169 size_t responseLen) {
4170 #if VDBG
4171 RLOGD("getClirResponse: serial %d", serial);
4172 #endif
4173
4174 if (radioService[slotId]->mRadioResponse != NULL) {
4175 RadioResponseInfo responseInfo = {};
4176 populateResponseInfo(responseInfo, serial, responseType, e);
4177 int n = -1, m = -1;
4178 int numInts = responseLen / sizeof(int);
4179 if (response == NULL || numInts != 2) {
4180 RLOGE("getClirResponse Invalid response: NULL");
4181 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
4182 } else {
4183 int *pInt = (int *) response;
4184 n = pInt[0];
4185 m = pInt[1];
4186 }
4187 Return<void> retStatus = radioService[slotId]->mRadioResponse->getClirResponse(responseInfo,
4188 n, m);
4189 radioService[slotId]->checkReturnStatus(retStatus);
4190 } else {
4191 RLOGE("getClirResponse: radioService[%d]->mRadioResponse == NULL", slotId);
4192 }
4193
4194 return 0;
4195 }
4196
setClirResponse(int slotId,int responseType,int serial,RIL_Errno e,void * response,size_t responseLen)4197 int radio::setClirResponse(int slotId,
4198 int responseType, int serial, RIL_Errno e, void *response,
4199 size_t responseLen) {
4200 #if VDBG
4201 RLOGD("setClirResponse: serial %d", serial);
4202 #endif
4203
4204 if (radioService[slotId]->mRadioResponse != NULL) {
4205 RadioResponseInfo responseInfo = {};
4206 populateResponseInfo(responseInfo, serial, responseType, e);
4207 Return<void> retStatus = radioService[slotId]->mRadioResponse->setClirResponse(
4208 responseInfo);
4209 radioService[slotId]->checkReturnStatus(retStatus);
4210 } else {
4211 RLOGE("setClirResponse: radioService[%d]->mRadioResponse == NULL", slotId);
4212 }
4213
4214 return 0;
4215 }
4216
getCallForwardStatusResponse(int slotId,int responseType,int serial,RIL_Errno e,void * response,size_t responseLen)4217 int radio::getCallForwardStatusResponse(int slotId,
4218 int responseType, int serial, RIL_Errno e,
4219 void *response, size_t responseLen) {
4220 #if VDBG
4221 RLOGD("getCallForwardStatusResponse: serial %d", serial);
4222 #endif
4223
4224 if (radioService[slotId]->mRadioResponse != NULL) {
4225 RadioResponseInfo responseInfo = {};
4226 populateResponseInfo(responseInfo, serial, responseType, e);
4227 hidl_vec<CallForwardInfo> callForwardInfos;
4228
4229 if ((response == NULL && responseLen != 0)
4230 || responseLen % sizeof(RIL_CallForwardInfo *) != 0) {
4231 RLOGE("getCallForwardStatusResponse Invalid response: NULL");
4232 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
4233 } else {
4234 int num = responseLen / sizeof(RIL_CallForwardInfo *);
4235 callForwardInfos.resize(num);
4236 for (int i = 0 ; i < num; i++) {
4237 RIL_CallForwardInfo *resp = ((RIL_CallForwardInfo **) response)[i];
4238 callForwardInfos[i].status = (CallForwardInfoStatus) resp->status;
4239 callForwardInfos[i].reason = resp->reason;
4240 callForwardInfos[i].serviceClass = resp->serviceClass;
4241 callForwardInfos[i].toa = resp->toa;
4242 callForwardInfos[i].number = convertCharPtrToHidlString(resp->number);
4243 callForwardInfos[i].timeSeconds = resp->timeSeconds;
4244 }
4245 }
4246
4247 Return<void> retStatus = radioService[slotId]->mRadioResponse->getCallForwardStatusResponse(
4248 responseInfo, callForwardInfos);
4249 radioService[slotId]->checkReturnStatus(retStatus);
4250 } else {
4251 RLOGE("getCallForwardStatusResponse: radioService[%d]->mRadioResponse == NULL",
4252 slotId);
4253 }
4254
4255 return 0;
4256 }
4257
setCallForwardResponse(int slotId,int responseType,int serial,RIL_Errno e,void * response,size_t responseLen)4258 int radio::setCallForwardResponse(int slotId,
4259 int responseType, int serial, RIL_Errno e, void *response,
4260 size_t responseLen) {
4261 #if VDBG
4262 RLOGD("setCallForwardResponse: serial %d", serial);
4263 #endif
4264
4265 if (radioService[slotId]->mRadioResponse != NULL) {
4266 RadioResponseInfo responseInfo = {};
4267 populateResponseInfo(responseInfo, serial, responseType, e);
4268 Return<void> retStatus = radioService[slotId]->mRadioResponse->setCallForwardResponse(
4269 responseInfo);
4270 radioService[slotId]->checkReturnStatus(retStatus);
4271 } else {
4272 RLOGE("setCallForwardResponse: radioService[%d]->mRadioResponse == NULL", slotId);
4273 }
4274
4275 return 0;
4276 }
4277
getCallWaitingResponse(int slotId,int responseType,int serial,RIL_Errno e,void * response,size_t responseLen)4278 int radio::getCallWaitingResponse(int slotId,
4279 int responseType, int serial, RIL_Errno e, void *response,
4280 size_t responseLen) {
4281 #if VDBG
4282 RLOGD("getCallWaitingResponse: serial %d", serial);
4283 #endif
4284
4285 if (radioService[slotId]->mRadioResponse != NULL) {
4286 RadioResponseInfo responseInfo = {};
4287 populateResponseInfo(responseInfo, serial, responseType, e);
4288 bool enable = false;
4289 int serviceClass = -1;
4290 int numInts = responseLen / sizeof(int);
4291 if (response == NULL || numInts != 2) {
4292 RLOGE("getCallWaitingResponse Invalid response: NULL");
4293 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
4294 } else {
4295 int *pInt = (int *) response;
4296 enable = pInt[0] == 1 ? true : false;
4297 serviceClass = pInt[1];
4298 }
4299 Return<void> retStatus = radioService[slotId]->mRadioResponse->getCallWaitingResponse(
4300 responseInfo, enable, serviceClass);
4301 radioService[slotId]->checkReturnStatus(retStatus);
4302 } else {
4303 RLOGE("getCallWaitingResponse: radioService[%d]->mRadioResponse == NULL", slotId);
4304 }
4305
4306 return 0;
4307 }
4308
setCallWaitingResponse(int slotId,int responseType,int serial,RIL_Errno e,void * response,size_t responseLen)4309 int radio::setCallWaitingResponse(int slotId,
4310 int responseType, int serial, RIL_Errno e, void *response,
4311 size_t responseLen) {
4312 #if VDBG
4313 RLOGD("setCallWaitingResponse: serial %d", serial);
4314 #endif
4315
4316 if (radioService[slotId]->mRadioResponse != NULL) {
4317 RadioResponseInfo responseInfo = {};
4318 populateResponseInfo(responseInfo, serial, responseType, e);
4319 Return<void> retStatus = radioService[slotId]->mRadioResponse->setCallWaitingResponse(
4320 responseInfo);
4321 radioService[slotId]->checkReturnStatus(retStatus);
4322 } else {
4323 RLOGE("setCallWaitingResponse: radioService[%d]->mRadioResponse == NULL", slotId);
4324 }
4325
4326 return 0;
4327 }
4328
acknowledgeLastIncomingGsmSmsResponse(int slotId,int responseType,int serial,RIL_Errno e,void * response,size_t responseLen)4329 int radio::acknowledgeLastIncomingGsmSmsResponse(int slotId,
4330 int responseType, int serial, RIL_Errno e,
4331 void *response, size_t responseLen) {
4332 #if VDBG
4333 RLOGD("acknowledgeLastIncomingGsmSmsResponse: serial %d", serial);
4334 #endif
4335
4336 if (radioService[slotId]->mRadioResponse != NULL) {
4337 RadioResponseInfo responseInfo = {};
4338 populateResponseInfo(responseInfo, serial, responseType, e);
4339 Return<void> retStatus =
4340 radioService[slotId]->mRadioResponse->acknowledgeLastIncomingGsmSmsResponse(
4341 responseInfo);
4342 radioService[slotId]->checkReturnStatus(retStatus);
4343 } else {
4344 RLOGE("acknowledgeLastIncomingGsmSmsResponse: radioService[%d]->mRadioResponse "
4345 "== NULL", slotId);
4346 }
4347
4348 return 0;
4349 }
4350
acceptCallResponse(int slotId,int responseType,int serial,RIL_Errno e,void * response,size_t responseLen)4351 int radio::acceptCallResponse(int slotId,
4352 int responseType, int serial, RIL_Errno e,
4353 void *response, size_t responseLen) {
4354 #if VDBG
4355 RLOGD("acceptCallResponse: serial %d", serial);
4356 #endif
4357
4358 if (radioService[slotId]->mRadioResponse != NULL) {
4359 RadioResponseInfo responseInfo = {};
4360 populateResponseInfo(responseInfo, serial, responseType, e);
4361 Return<void> retStatus = radioService[slotId]->mRadioResponse->acceptCallResponse(
4362 responseInfo);
4363 radioService[slotId]->checkReturnStatus(retStatus);
4364 } else {
4365 RLOGE("acceptCallResponse: radioService[%d]->mRadioResponse == NULL",
4366 slotId);
4367 }
4368
4369 return 0;
4370 }
4371
deactivateDataCallResponse(int slotId,int responseType,int serial,RIL_Errno e,void * response,size_t responseLen)4372 int radio::deactivateDataCallResponse(int slotId,
4373 int responseType, int serial, RIL_Errno e,
4374 void *response, size_t responseLen) {
4375 #if VDBG
4376 RLOGD("deactivateDataCallResponse: serial %d", serial);
4377 #endif
4378
4379 if (radioService[slotId]->mRadioResponse != NULL) {
4380 RadioResponseInfo responseInfo = {};
4381 populateResponseInfo(responseInfo, serial, responseType, e);
4382 Return<void> retStatus = radioService[slotId]->mRadioResponse->deactivateDataCallResponse(
4383 responseInfo);
4384 radioService[slotId]->checkReturnStatus(retStatus);
4385 } else {
4386 RLOGE("deactivateDataCallResponse: radioService[%d]->mRadioResponse == NULL",
4387 slotId);
4388 }
4389
4390 return 0;
4391 }
4392
getFacilityLockForAppResponse(int slotId,int responseType,int serial,RIL_Errno e,void * response,size_t responseLen)4393 int radio::getFacilityLockForAppResponse(int slotId,
4394 int responseType, int serial, RIL_Errno e,
4395 void *response, size_t responseLen) {
4396 #if VDBG
4397 RLOGD("getFacilityLockForAppResponse: serial %d", serial);
4398 #endif
4399
4400 if (radioService[slotId]->mRadioResponse != NULL) {
4401 RadioResponseInfo responseInfo = {};
4402 int ret = responseInt(responseInfo, serial, responseType, e, response, responseLen);
4403 Return<void> retStatus = radioService[slotId]->mRadioResponse->
4404 getFacilityLockForAppResponse(responseInfo, ret);
4405 radioService[slotId]->checkReturnStatus(retStatus);
4406 } else {
4407 RLOGE("getFacilityLockForAppResponse: radioService[%d]->mRadioResponse == NULL",
4408 slotId);
4409 }
4410
4411 return 0;
4412 }
4413
setFacilityLockForAppResponse(int slotId,int responseType,int serial,RIL_Errno e,void * response,size_t responseLen)4414 int radio::setFacilityLockForAppResponse(int slotId,
4415 int responseType, int serial, RIL_Errno e,
4416 void *response, size_t responseLen) {
4417 #if VDBG
4418 RLOGD("setFacilityLockForAppResponse: serial %d", serial);
4419 #endif
4420
4421 if (radioService[slotId]->mRadioResponse != NULL) {
4422 RadioResponseInfo responseInfo = {};
4423 int ret = responseIntOrEmpty(responseInfo, serial, responseType, e, response, responseLen);
4424 Return<void> retStatus
4425 = radioService[slotId]->mRadioResponse->setFacilityLockForAppResponse(responseInfo,
4426 ret);
4427 radioService[slotId]->checkReturnStatus(retStatus);
4428 } else {
4429 RLOGE("setFacilityLockForAppResponse: radioService[%d]->mRadioResponse == NULL",
4430 slotId);
4431 }
4432
4433 return 0;
4434 }
4435
setBarringPasswordResponse(int slotId,int responseType,int serial,RIL_Errno e,void * response,size_t responseLen)4436 int radio::setBarringPasswordResponse(int slotId,
4437 int responseType, int serial, RIL_Errno e,
4438 void *response, size_t responseLen) {
4439 #if VDBG
4440 RLOGD("acceptCallResponse: serial %d", serial);
4441 #endif
4442
4443 if (radioService[slotId]->mRadioResponse != NULL) {
4444 RadioResponseInfo responseInfo = {};
4445 populateResponseInfo(responseInfo, serial, responseType, e);
4446 Return<void> retStatus
4447 = radioService[slotId]->mRadioResponse->setBarringPasswordResponse(responseInfo);
4448 radioService[slotId]->checkReturnStatus(retStatus);
4449 } else {
4450 RLOGE("setBarringPasswordResponse: radioService[%d]->mRadioResponse == NULL",
4451 slotId);
4452 }
4453
4454 return 0;
4455 }
4456
getNetworkSelectionModeResponse(int slotId,int responseType,int serial,RIL_Errno e,void * response,size_t responseLen)4457 int radio::getNetworkSelectionModeResponse(int slotId,
4458 int responseType, int serial, RIL_Errno e, void *response,
4459 size_t responseLen) {
4460 #if VDBG
4461 RLOGD("getNetworkSelectionModeResponse: serial %d", serial);
4462 #endif
4463
4464 if (radioService[slotId]->mRadioResponse != NULL) {
4465 RadioResponseInfo responseInfo = {};
4466 populateResponseInfo(responseInfo, serial, responseType, e);
4467 bool manual = false;
4468 if (response == NULL || responseLen != sizeof(int)) {
4469 RLOGE("getNetworkSelectionModeResponse Invalid response: NULL");
4470 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
4471 } else {
4472 int *pInt = (int *) response;
4473 manual = pInt[0] == 1 ? true : false;
4474 }
4475 Return<void> retStatus
4476 = radioService[slotId]->mRadioResponse->getNetworkSelectionModeResponse(
4477 responseInfo,
4478 manual);
4479 radioService[slotId]->checkReturnStatus(retStatus);
4480 } else {
4481 RLOGE("getNetworkSelectionModeResponse: radioService[%d]->mRadioResponse == NULL",
4482 slotId);
4483 }
4484
4485 return 0;
4486 }
4487
setNetworkSelectionModeAutomaticResponse(int slotId,int responseType,int serial,RIL_Errno e,void * response,size_t responseLen)4488 int radio::setNetworkSelectionModeAutomaticResponse(int slotId, int responseType, int serial,
4489 RIL_Errno e, void *response,
4490 size_t responseLen) {
4491 #if VDBG
4492 RLOGD("setNetworkSelectionModeAutomaticResponse: serial %d", serial);
4493 #endif
4494
4495 if (radioService[slotId]->mRadioResponse != NULL) {
4496 RadioResponseInfo responseInfo = {};
4497 populateResponseInfo(responseInfo, serial, responseType, e);
4498 Return<void> retStatus
4499 = radioService[slotId]->mRadioResponse->setNetworkSelectionModeAutomaticResponse(
4500 responseInfo);
4501 radioService[slotId]->checkReturnStatus(retStatus);
4502 } else {
4503 RLOGE("setNetworkSelectionModeAutomaticResponse: radioService[%d]->mRadioResponse "
4504 "== NULL", slotId);
4505 }
4506
4507 return 0;
4508 }
4509
setNetworkSelectionModeManualResponse(int slotId,int responseType,int serial,RIL_Errno e,void * response,size_t responseLen)4510 int radio::setNetworkSelectionModeManualResponse(int slotId,
4511 int responseType, int serial, RIL_Errno e,
4512 void *response, size_t responseLen) {
4513 #if VDBG
4514 RLOGD("setNetworkSelectionModeManualResponse: serial %d", serial);
4515 #endif
4516
4517 if (radioService[slotId]->mRadioResponse != NULL) {
4518 RadioResponseInfo responseInfo = {};
4519 populateResponseInfo(responseInfo, serial, responseType, e);
4520 Return<void> retStatus
4521 = radioService[slotId]->mRadioResponse->setNetworkSelectionModeManualResponse(
4522 responseInfo);
4523 radioService[slotId]->checkReturnStatus(retStatus);
4524 } else {
4525 RLOGE("acceptCallResponse: radioService[%d]->setNetworkSelectionModeManualResponse "
4526 "== NULL", slotId);
4527 }
4528
4529 return 0;
4530 }
4531
convertOperatorStatusToInt(const char * str)4532 int convertOperatorStatusToInt(const char *str) {
4533 if (strncmp("unknown", str, 9) == 0) {
4534 return (int) OperatorStatus::UNKNOWN;
4535 } else if (strncmp("available", str, 9) == 0) {
4536 return (int) OperatorStatus::AVAILABLE;
4537 } else if (strncmp("current", str, 9) == 0) {
4538 return (int) OperatorStatus::CURRENT;
4539 } else if (strncmp("forbidden", str, 9) == 0) {
4540 return (int) OperatorStatus::FORBIDDEN;
4541 } else {
4542 return -1;
4543 }
4544 }
4545
getAvailableNetworksResponse(int slotId,int responseType,int serial,RIL_Errno e,void * response,size_t responseLen)4546 int radio::getAvailableNetworksResponse(int slotId,
4547 int responseType, int serial, RIL_Errno e, void *response,
4548 size_t responseLen) {
4549 #if VDBG
4550 RLOGD("getAvailableNetworksResponse: serial %d", serial);
4551 #endif
4552
4553 if (radioService[slotId]->mRadioResponse != NULL) {
4554 RadioResponseInfo responseInfo = {};
4555 populateResponseInfo(responseInfo, serial, responseType, e);
4556 hidl_vec<OperatorInfo> networks;
4557 if ((response == NULL && responseLen != 0)
4558 || responseLen % (4 * sizeof(char *))!= 0) {
4559 RLOGE("getAvailableNetworksResponse Invalid response: NULL");
4560 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
4561 } else {
4562 char **resp = (char **) response;
4563 int numStrings = responseLen / sizeof(char *);
4564 networks.resize(numStrings/4);
4565 for (int i = 0, j = 0; i < numStrings; i = i + 4, j++) {
4566 networks[j].alphaLong = convertCharPtrToHidlString(resp[i]);
4567 networks[j].alphaShort = convertCharPtrToHidlString(resp[i + 1]);
4568 networks[j].operatorNumeric = convertCharPtrToHidlString(resp[i + 2]);
4569 int status = convertOperatorStatusToInt(resp[i + 3]);
4570 if (status == -1) {
4571 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
4572 } else {
4573 networks[j].status = (OperatorStatus) status;
4574 }
4575 }
4576 }
4577 Return<void> retStatus
4578 = radioService[slotId]->mRadioResponse->getAvailableNetworksResponse(responseInfo,
4579 networks);
4580 radioService[slotId]->checkReturnStatus(retStatus);
4581 } else {
4582 RLOGE("getAvailableNetworksResponse: radioService[%d]->mRadioResponse == NULL",
4583 slotId);
4584 }
4585
4586 return 0;
4587 }
4588
startDtmfResponse(int slotId,int responseType,int serial,RIL_Errno e,void * response,size_t responseLen)4589 int radio::startDtmfResponse(int slotId,
4590 int responseType, int serial, RIL_Errno e,
4591 void *response, size_t responseLen) {
4592 #if VDBG
4593 RLOGD("startDtmfResponse: serial %d", serial);
4594 #endif
4595
4596 if (radioService[slotId]->mRadioResponse != NULL) {
4597 RadioResponseInfo responseInfo = {};
4598 populateResponseInfo(responseInfo, serial, responseType, e);
4599 Return<void> retStatus
4600 = radioService[slotId]->mRadioResponse->startDtmfResponse(responseInfo);
4601 radioService[slotId]->checkReturnStatus(retStatus);
4602 } else {
4603 RLOGE("startDtmfResponse: radioService[%d]->mRadioResponse == NULL", slotId);
4604 }
4605
4606 return 0;
4607 }
4608
stopDtmfResponse(int slotId,int responseType,int serial,RIL_Errno e,void * response,size_t responseLen)4609 int radio::stopDtmfResponse(int slotId,
4610 int responseType, int serial, RIL_Errno e,
4611 void *response, size_t responseLen) {
4612 #if VDBG
4613 RLOGD("stopDtmfResponse: serial %d", serial);
4614 #endif
4615
4616 if (radioService[slotId]->mRadioResponse != NULL) {
4617 RadioResponseInfo responseInfo = {};
4618 populateResponseInfo(responseInfo, serial, responseType, e);
4619 Return<void> retStatus
4620 = radioService[slotId]->mRadioResponse->stopDtmfResponse(responseInfo);
4621 radioService[slotId]->checkReturnStatus(retStatus);
4622 } else {
4623 RLOGE("stopDtmfResponse: radioService[%d]->mRadioResponse == NULL", slotId);
4624 }
4625
4626 return 0;
4627 }
4628
getBasebandVersionResponse(int slotId,int responseType,int serial,RIL_Errno e,void * response,size_t responseLen)4629 int radio::getBasebandVersionResponse(int slotId,
4630 int responseType, int serial, RIL_Errno e,
4631 void *response, size_t responseLen) {
4632 #if VDBG
4633 RLOGD("getBasebandVersionResponse: serial %d", serial);
4634 #endif
4635
4636 if (radioService[slotId]->mRadioResponse != NULL) {
4637 RadioResponseInfo responseInfo = {};
4638 populateResponseInfo(responseInfo, serial, responseType, e);
4639 Return<void> retStatus
4640 = radioService[slotId]->mRadioResponse->getBasebandVersionResponse(responseInfo,
4641 convertCharPtrToHidlString((char *) response));
4642 radioService[slotId]->checkReturnStatus(retStatus);
4643 } else {
4644 RLOGE("getBasebandVersionResponse: radioService[%d]->mRadioResponse == NULL", slotId);
4645 }
4646
4647 return 0;
4648 }
4649
separateConnectionResponse(int slotId,int responseType,int serial,RIL_Errno e,void * response,size_t responseLen)4650 int radio::separateConnectionResponse(int slotId,
4651 int responseType, int serial, RIL_Errno e,
4652 void *response, size_t responseLen) {
4653 #if VDBG
4654 RLOGD("separateConnectionResponse: serial %d", serial);
4655 #endif
4656
4657 if (radioService[slotId]->mRadioResponse != NULL) {
4658 RadioResponseInfo responseInfo = {};
4659 populateResponseInfo(responseInfo, serial, responseType, e);
4660 Return<void> retStatus
4661 = radioService[slotId]->mRadioResponse->separateConnectionResponse(responseInfo);
4662 radioService[slotId]->checkReturnStatus(retStatus);
4663 } else {
4664 RLOGE("separateConnectionResponse: radioService[%d]->mRadioResponse == NULL",
4665 slotId);
4666 }
4667
4668 return 0;
4669 }
4670
setMuteResponse(int slotId,int responseType,int serial,RIL_Errno e,void * response,size_t responseLen)4671 int radio::setMuteResponse(int slotId,
4672 int responseType, int serial, RIL_Errno e,
4673 void *response, size_t responseLen) {
4674 #if VDBG
4675 RLOGD("setMuteResponse: serial %d", serial);
4676 #endif
4677
4678 if (radioService[slotId]->mRadioResponse != NULL) {
4679 RadioResponseInfo responseInfo = {};
4680 populateResponseInfo(responseInfo, serial, responseType, e);
4681 Return<void> retStatus
4682 = radioService[slotId]->mRadioResponse->setMuteResponse(responseInfo);
4683 radioService[slotId]->checkReturnStatus(retStatus);
4684 } else {
4685 RLOGE("setMuteResponse: radioService[%d]->mRadioResponse == NULL", slotId);
4686 }
4687
4688 return 0;
4689 }
4690
getMuteResponse(int slotId,int responseType,int serial,RIL_Errno e,void * response,size_t responseLen)4691 int radio::getMuteResponse(int slotId,
4692 int responseType, int serial, RIL_Errno e, void *response,
4693 size_t responseLen) {
4694 #if VDBG
4695 RLOGD("getMuteResponse: serial %d", serial);
4696 #endif
4697
4698 if (radioService[slotId]->mRadioResponse != NULL) {
4699 RadioResponseInfo responseInfo = {};
4700 populateResponseInfo(responseInfo, serial, responseType, e);
4701 bool enable = false;
4702 if (response == NULL || responseLen != sizeof(int)) {
4703 RLOGE("getMuteResponse Invalid response: NULL");
4704 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
4705 } else {
4706 int *pInt = (int *) response;
4707 enable = pInt[0] == 1 ? true : false;
4708 }
4709 Return<void> retStatus = radioService[slotId]->mRadioResponse->getMuteResponse(responseInfo,
4710 enable);
4711 radioService[slotId]->checkReturnStatus(retStatus);
4712 } else {
4713 RLOGE("getMuteResponse: radioService[%d]->mRadioResponse == NULL", slotId);
4714 }
4715
4716 return 0;
4717 }
4718
getClipResponse(int slotId,int responseType,int serial,RIL_Errno e,void * response,size_t responseLen)4719 int radio::getClipResponse(int slotId,
4720 int responseType, int serial, RIL_Errno e,
4721 void *response, size_t responseLen) {
4722 #if VDBG
4723 RLOGD("getClipResponse: serial %d", serial);
4724 #endif
4725
4726 if (radioService[slotId]->mRadioResponse != NULL) {
4727 RadioResponseInfo responseInfo = {};
4728 int ret = responseInt(responseInfo, serial, responseType, e, response, responseLen);
4729 Return<void> retStatus = radioService[slotId]->mRadioResponse->getClipResponse(responseInfo,
4730 (ClipStatus) ret);
4731 radioService[slotId]->checkReturnStatus(retStatus);
4732 } else {
4733 RLOGE("getClipResponse: radioService[%d]->mRadioResponse == NULL", slotId);
4734 }
4735
4736 return 0;
4737 }
4738
getDataCallListResponse(int slotId,int responseType,int serial,RIL_Errno e,void * response,size_t responseLen)4739 int radio::getDataCallListResponse(int slotId,
4740 int responseType, int serial, RIL_Errno e,
4741 void *response, size_t responseLen) {
4742 #if VDBG
4743 RLOGD("getDataCallListResponse: serial %d", serial);
4744 #endif
4745
4746 if (radioService[slotId]->mRadioResponse != NULL) {
4747 RadioResponseInfo responseInfo = {};
4748 populateResponseInfo(responseInfo, serial, responseType, e);
4749
4750 hidl_vec<SetupDataCallResult> ret;
4751 if ((response == NULL && responseLen != 0)
4752 || responseLen % sizeof(RIL_Data_Call_Response_v11) != 0) {
4753 RLOGE("getDataCallListResponse: invalid response");
4754 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
4755 } else {
4756 convertRilDataCallListToHal(response, responseLen, ret);
4757 }
4758
4759 Return<void> retStatus = radioService[slotId]->mRadioResponse->getDataCallListResponse(
4760 responseInfo, ret);
4761 radioService[slotId]->checkReturnStatus(retStatus);
4762 } else {
4763 RLOGE("getDataCallListResponse: radioService[%d]->mRadioResponse == NULL", slotId);
4764 }
4765
4766 return 0;
4767 }
4768
setSuppServiceNotificationsResponse(int slotId,int responseType,int serial,RIL_Errno e,void * response,size_t responseLen)4769 int radio::setSuppServiceNotificationsResponse(int slotId,
4770 int responseType, int serial, RIL_Errno e,
4771 void *response, size_t responseLen) {
4772 #if VDBG
4773 RLOGD("setSuppServiceNotificationsResponse: serial %d", serial);
4774 #endif
4775
4776 if (radioService[slotId]->mRadioResponse != NULL) {
4777 RadioResponseInfo responseInfo = {};
4778 populateResponseInfo(responseInfo, serial, responseType, e);
4779 Return<void> retStatus
4780 = radioService[slotId]->mRadioResponse->setSuppServiceNotificationsResponse(
4781 responseInfo);
4782 radioService[slotId]->checkReturnStatus(retStatus);
4783 } else {
4784 RLOGE("setSuppServiceNotificationsResponse: radioService[%d]->mRadioResponse "
4785 "== NULL", slotId);
4786 }
4787
4788 return 0;
4789 }
4790
deleteSmsOnSimResponse(int slotId,int responseType,int serial,RIL_Errno e,void * response,size_t responseLen)4791 int radio::deleteSmsOnSimResponse(int slotId,
4792 int responseType, int serial, RIL_Errno e,
4793 void *response, size_t responseLen) {
4794 #if VDBG
4795 RLOGD("deleteSmsOnSimResponse: serial %d", serial);
4796 #endif
4797
4798 if (radioService[slotId]->mRadioResponse != NULL) {
4799 RadioResponseInfo responseInfo = {};
4800 populateResponseInfo(responseInfo, serial, responseType, e);
4801 Return<void> retStatus
4802 = radioService[slotId]->mRadioResponse->deleteSmsOnSimResponse(responseInfo);
4803 radioService[slotId]->checkReturnStatus(retStatus);
4804 } else {
4805 RLOGE("deleteSmsOnSimResponse: radioService[%d]->mRadioResponse == NULL", slotId);
4806 }
4807
4808 return 0;
4809 }
4810
setBandModeResponse(int slotId,int responseType,int serial,RIL_Errno e,void * response,size_t responseLen)4811 int radio::setBandModeResponse(int slotId,
4812 int responseType, int serial, RIL_Errno e,
4813 void *response, size_t responseLen) {
4814 #if VDBG
4815 RLOGD("setBandModeResponse: serial %d", serial);
4816 #endif
4817
4818 if (radioService[slotId]->mRadioResponse != NULL) {
4819 RadioResponseInfo responseInfo = {};
4820 populateResponseInfo(responseInfo, serial, responseType, e);
4821 Return<void> retStatus
4822 = radioService[slotId]->mRadioResponse->setBandModeResponse(responseInfo);
4823 radioService[slotId]->checkReturnStatus(retStatus);
4824 } else {
4825 RLOGE("setBandModeResponse: radioService[%d]->mRadioResponse == NULL", slotId);
4826 }
4827
4828 return 0;
4829 }
4830
writeSmsToSimResponse(int slotId,int responseType,int serial,RIL_Errno e,void * response,size_t responseLen)4831 int radio::writeSmsToSimResponse(int slotId,
4832 int responseType, int serial, RIL_Errno e,
4833 void *response, size_t responseLen) {
4834 #if VDBG
4835 RLOGD("writeSmsToSimResponse: serial %d", serial);
4836 #endif
4837
4838 if (radioService[slotId]->mRadioResponse != NULL) {
4839 RadioResponseInfo responseInfo = {};
4840 int ret = responseInt(responseInfo, serial, responseType, e, response, responseLen);
4841 Return<void> retStatus
4842 = radioService[slotId]->mRadioResponse->writeSmsToSimResponse(responseInfo, ret);
4843 radioService[slotId]->checkReturnStatus(retStatus);
4844 } else {
4845 RLOGE("writeSmsToSimResponse: radioService[%d]->mRadioResponse == NULL", slotId);
4846 }
4847
4848 return 0;
4849 }
4850
getAvailableBandModesResponse(int slotId,int responseType,int serial,RIL_Errno e,void * response,size_t responseLen)4851 int radio::getAvailableBandModesResponse(int slotId,
4852 int responseType, int serial, RIL_Errno e, void *response,
4853 size_t responseLen) {
4854 #if VDBG
4855 RLOGD("getAvailableBandModesResponse: serial %d", serial);
4856 #endif
4857
4858 if (radioService[slotId]->mRadioResponse != NULL) {
4859 RadioResponseInfo responseInfo = {};
4860 populateResponseInfo(responseInfo, serial, responseType, e);
4861 hidl_vec<RadioBandMode> modes;
4862 if ((response == NULL && responseLen != 0)|| responseLen % sizeof(int) != 0) {
4863 RLOGE("getAvailableBandModesResponse Invalid response: NULL");
4864 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
4865 } else {
4866 int *pInt = (int *) response;
4867 int numInts = responseLen / sizeof(int);
4868 modes.resize(numInts);
4869 for (int i = 0; i < numInts; i++) {
4870 modes[i] = (RadioBandMode) pInt[i];
4871 }
4872 }
4873 Return<void> retStatus
4874 = radioService[slotId]->mRadioResponse->getAvailableBandModesResponse(responseInfo,
4875 modes);
4876 radioService[slotId]->checkReturnStatus(retStatus);
4877 } else {
4878 RLOGE("getAvailableBandModesResponse: radioService[%d]->mRadioResponse == NULL",
4879 slotId);
4880 }
4881
4882 return 0;
4883 }
4884
sendEnvelopeResponse(int slotId,int responseType,int serial,RIL_Errno e,void * response,size_t responseLen)4885 int radio::sendEnvelopeResponse(int slotId,
4886 int responseType, int serial, RIL_Errno e,
4887 void *response, size_t responseLen) {
4888 #if VDBG
4889 RLOGD("sendEnvelopeResponse: serial %d", serial);
4890 #endif
4891
4892 if (radioService[slotId]->mRadioResponse != NULL) {
4893 RadioResponseInfo responseInfo = {};
4894 populateResponseInfo(responseInfo, serial, responseType, e);
4895 Return<void> retStatus
4896 = radioService[slotId]->mRadioResponse->sendEnvelopeResponse(responseInfo,
4897 convertCharPtrToHidlString((char *) response));
4898 radioService[slotId]->checkReturnStatus(retStatus);
4899 } else {
4900 RLOGE("sendEnvelopeResponse: radioService[%d]->mRadioResponse == NULL", slotId);
4901 }
4902
4903 return 0;
4904 }
4905
sendTerminalResponseToSimResponse(int slotId,int responseType,int serial,RIL_Errno e,void * response,size_t responseLen)4906 int radio::sendTerminalResponseToSimResponse(int slotId,
4907 int responseType, int serial, RIL_Errno e,
4908 void *response, size_t responseLen) {
4909 #if VDBG
4910 RLOGD("sendTerminalResponseToSimResponse: serial %d", serial);
4911 #endif
4912
4913 if (radioService[slotId]->mRadioResponse != NULL) {
4914 RadioResponseInfo responseInfo = {};
4915 populateResponseInfo(responseInfo, serial, responseType, e);
4916 Return<void> retStatus
4917 = radioService[slotId]->mRadioResponse->sendTerminalResponseToSimResponse(
4918 responseInfo);
4919 radioService[slotId]->checkReturnStatus(retStatus);
4920 } else {
4921 RLOGE("sendTerminalResponseToSimResponse: radioService[%d]->mRadioResponse == NULL",
4922 slotId);
4923 }
4924
4925 return 0;
4926 }
4927
handleStkCallSetupRequestFromSimResponse(int slotId,int responseType,int serial,RIL_Errno e,void * response,size_t responseLen)4928 int radio::handleStkCallSetupRequestFromSimResponse(int slotId,
4929 int responseType, int serial,
4930 RIL_Errno e, void *response,
4931 size_t responseLen) {
4932 #if VDBG
4933 RLOGD("handleStkCallSetupRequestFromSimResponse: serial %d", serial);
4934 #endif
4935
4936 if (radioService[slotId]->mRadioResponse != NULL) {
4937 RadioResponseInfo responseInfo = {};
4938 populateResponseInfo(responseInfo, serial, responseType, e);
4939 Return<void> retStatus
4940 = radioService[slotId]->mRadioResponse->handleStkCallSetupRequestFromSimResponse(
4941 responseInfo);
4942 radioService[slotId]->checkReturnStatus(retStatus);
4943 } else {
4944 RLOGE("handleStkCallSetupRequestFromSimResponse: radioService[%d]->mRadioResponse "
4945 "== NULL", slotId);
4946 }
4947
4948 return 0;
4949 }
4950
explicitCallTransferResponse(int slotId,int responseType,int serial,RIL_Errno e,void * response,size_t responseLen)4951 int radio::explicitCallTransferResponse(int slotId,
4952 int responseType, int serial, RIL_Errno e,
4953 void *response, size_t responseLen) {
4954 #if VDBG
4955 RLOGD("explicitCallTransferResponse: serial %d", serial);
4956 #endif
4957
4958 if (radioService[slotId]->mRadioResponse != NULL) {
4959 RadioResponseInfo responseInfo = {};
4960 populateResponseInfo(responseInfo, serial, responseType, e);
4961 Return<void> retStatus
4962 = radioService[slotId]->mRadioResponse->explicitCallTransferResponse(responseInfo);
4963 radioService[slotId]->checkReturnStatus(retStatus);
4964 } else {
4965 RLOGE("explicitCallTransferResponse: radioService[%d]->mRadioResponse == NULL",
4966 slotId);
4967 }
4968
4969 return 0;
4970 }
4971
setPreferredNetworkTypeResponse(int slotId,int responseType,int serial,RIL_Errno e,void * response,size_t responseLen)4972 int radio::setPreferredNetworkTypeResponse(int slotId,
4973 int responseType, int serial, RIL_Errno e,
4974 void *response, size_t responseLen) {
4975 #if VDBG
4976 RLOGD("setPreferredNetworkTypeResponse: serial %d", serial);
4977 #endif
4978
4979 if (radioService[slotId]->mRadioResponse != NULL) {
4980 RadioResponseInfo responseInfo = {};
4981 populateResponseInfo(responseInfo, serial, responseType, e);
4982 Return<void> retStatus
4983 = radioService[slotId]->mRadioResponse->setPreferredNetworkTypeResponse(
4984 responseInfo);
4985 radioService[slotId]->checkReturnStatus(retStatus);
4986 } else {
4987 RLOGE("setPreferredNetworkTypeResponse: radioService[%d]->mRadioResponse == NULL",
4988 slotId);
4989 }
4990
4991 return 0;
4992 }
4993
4994
getPreferredNetworkTypeResponse(int slotId,int responseType,int serial,RIL_Errno e,void * response,size_t responseLen)4995 int radio::getPreferredNetworkTypeResponse(int slotId,
4996 int responseType, int serial, RIL_Errno e,
4997 void *response, size_t responseLen) {
4998 #if VDBG
4999 RLOGD("getPreferredNetworkTypeResponse: serial %d", serial);
5000 #endif
5001
5002 if (radioService[slotId]->mRadioResponse != NULL) {
5003 RadioResponseInfo responseInfo = {};
5004 int ret = responseInt(responseInfo, serial, responseType, e, response, responseLen);
5005 Return<void> retStatus
5006 = radioService[slotId]->mRadioResponse->getPreferredNetworkTypeResponse(
5007 responseInfo, (PreferredNetworkType) ret);
5008 radioService[slotId]->checkReturnStatus(retStatus);
5009 } else {
5010 RLOGE("getPreferredNetworkTypeResponse: radioService[%d]->mRadioResponse == NULL",
5011 slotId);
5012 }
5013
5014 return 0;
5015 }
5016
getNeighboringCidsResponse(int slotId,int responseType,int serial,RIL_Errno e,void * response,size_t responseLen)5017 int radio::getNeighboringCidsResponse(int slotId,
5018 int responseType, int serial, RIL_Errno e,
5019 void *response, size_t responseLen) {
5020 #if VDBG
5021 RLOGD("getNeighboringCidsResponse: serial %d", serial);
5022 #endif
5023
5024 if (radioService[slotId]->mRadioResponse != NULL) {
5025 RadioResponseInfo responseInfo = {};
5026 populateResponseInfo(responseInfo, serial, responseType, e);
5027 hidl_vec<NeighboringCell> cells;
5028
5029 if ((response == NULL && responseLen != 0)
5030 || responseLen % sizeof(RIL_NeighboringCell *) != 0) {
5031 RLOGE("getNeighboringCidsResponse Invalid response: NULL");
5032 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
5033 } else {
5034 int num = responseLen / sizeof(RIL_NeighboringCell *);
5035 cells.resize(num);
5036 for (int i = 0 ; i < num; i++) {
5037 RIL_NeighboringCell *resp = ((RIL_NeighboringCell **) response)[i];
5038 cells[i].cid = convertCharPtrToHidlString(resp->cid);
5039 cells[i].rssi = resp->rssi;
5040 }
5041 }
5042
5043 Return<void> retStatus
5044 = radioService[slotId]->mRadioResponse->getNeighboringCidsResponse(responseInfo,
5045 cells);
5046 radioService[slotId]->checkReturnStatus(retStatus);
5047 } else {
5048 RLOGE("getNeighboringCidsResponse: radioService[%d]->mRadioResponse == NULL",
5049 slotId);
5050 }
5051
5052 return 0;
5053 }
5054
setLocationUpdatesResponse(int slotId,int responseType,int serial,RIL_Errno e,void * response,size_t responseLen)5055 int radio::setLocationUpdatesResponse(int slotId,
5056 int responseType, int serial, RIL_Errno e,
5057 void *response, size_t responseLen) {
5058 #if VDBG
5059 RLOGD("setLocationUpdatesResponse: serial %d", serial);
5060 #endif
5061
5062 if (radioService[slotId]->mRadioResponse != NULL) {
5063 RadioResponseInfo responseInfo = {};
5064 populateResponseInfo(responseInfo, serial, responseType, e);
5065 Return<void> retStatus
5066 = radioService[slotId]->mRadioResponse->setLocationUpdatesResponse(responseInfo);
5067 radioService[slotId]->checkReturnStatus(retStatus);
5068 } else {
5069 RLOGE("setLocationUpdatesResponse: radioService[%d]->mRadioResponse == NULL",
5070 slotId);
5071 }
5072
5073 return 0;
5074 }
5075
setCdmaSubscriptionSourceResponse(int slotId,int responseType,int serial,RIL_Errno e,void * response,size_t responseLen)5076 int radio::setCdmaSubscriptionSourceResponse(int slotId,
5077 int responseType, int serial, RIL_Errno e,
5078 void *response, size_t responseLen) {
5079 #if VDBG
5080 RLOGD("setCdmaSubscriptionSourceResponse: serial %d", serial);
5081 #endif
5082
5083 if (radioService[slotId]->mRadioResponse != NULL) {
5084 RadioResponseInfo responseInfo = {};
5085 populateResponseInfo(responseInfo, serial, responseType, e);
5086 Return<void> retStatus
5087 = radioService[slotId]->mRadioResponse->setCdmaSubscriptionSourceResponse(
5088 responseInfo);
5089 radioService[slotId]->checkReturnStatus(retStatus);
5090 } else {
5091 RLOGE("setCdmaSubscriptionSourceResponse: radioService[%d]->mRadioResponse == NULL",
5092 slotId);
5093 }
5094
5095 return 0;
5096 }
5097
setCdmaRoamingPreferenceResponse(int slotId,int responseType,int serial,RIL_Errno e,void * response,size_t responseLen)5098 int radio::setCdmaRoamingPreferenceResponse(int slotId,
5099 int responseType, int serial, RIL_Errno e,
5100 void *response, size_t responseLen) {
5101 #if VDBG
5102 RLOGD("setCdmaRoamingPreferenceResponse: serial %d", serial);
5103 #endif
5104
5105 if (radioService[slotId]->mRadioResponse != NULL) {
5106 RadioResponseInfo responseInfo = {};
5107 populateResponseInfo(responseInfo, serial, responseType, e);
5108 Return<void> retStatus
5109 = radioService[slotId]->mRadioResponse->setCdmaRoamingPreferenceResponse(
5110 responseInfo);
5111 radioService[slotId]->checkReturnStatus(retStatus);
5112 } else {
5113 RLOGE("setCdmaRoamingPreferenceResponse: radioService[%d]->mRadioResponse == NULL",
5114 slotId);
5115 }
5116
5117 return 0;
5118 }
5119
getCdmaRoamingPreferenceResponse(int slotId,int responseType,int serial,RIL_Errno e,void * response,size_t responseLen)5120 int radio::getCdmaRoamingPreferenceResponse(int slotId,
5121 int responseType, int serial, RIL_Errno e,
5122 void *response, size_t responseLen) {
5123 #if VDBG
5124 RLOGD("getCdmaRoamingPreferenceResponse: serial %d", serial);
5125 #endif
5126
5127 if (radioService[slotId]->mRadioResponse != NULL) {
5128 RadioResponseInfo responseInfo = {};
5129 int ret = responseInt(responseInfo, serial, responseType, e, response, responseLen);
5130 Return<void> retStatus
5131 = radioService[slotId]->mRadioResponse->getCdmaRoamingPreferenceResponse(
5132 responseInfo, (CdmaRoamingType) ret);
5133 radioService[slotId]->checkReturnStatus(retStatus);
5134 } else {
5135 RLOGE("getCdmaRoamingPreferenceResponse: radioService[%d]->mRadioResponse == NULL",
5136 slotId);
5137 }
5138
5139 return 0;
5140 }
5141
setTTYModeResponse(int slotId,int responseType,int serial,RIL_Errno e,void * response,size_t responseLen)5142 int radio::setTTYModeResponse(int slotId,
5143 int responseType, int serial, RIL_Errno e,
5144 void *response, size_t responseLen) {
5145 #if VDBG
5146 RLOGD("setTTYModeResponse: serial %d", serial);
5147 #endif
5148
5149 if (radioService[slotId]->mRadioResponse != NULL) {
5150 RadioResponseInfo responseInfo = {};
5151 populateResponseInfo(responseInfo, serial, responseType, e);
5152 Return<void> retStatus
5153 = radioService[slotId]->mRadioResponse->setTTYModeResponse(responseInfo);
5154 radioService[slotId]->checkReturnStatus(retStatus);
5155 } else {
5156 RLOGE("setTTYModeResponse: radioService[%d]->mRadioResponse == NULL", slotId);
5157 }
5158
5159 return 0;
5160 }
5161
getTTYModeResponse(int slotId,int responseType,int serial,RIL_Errno e,void * response,size_t responseLen)5162 int radio::getTTYModeResponse(int slotId,
5163 int responseType, int serial, RIL_Errno e,
5164 void *response, size_t responseLen) {
5165 #if VDBG
5166 RLOGD("getTTYModeResponse: serial %d", serial);
5167 #endif
5168
5169 if (radioService[slotId]->mRadioResponse != NULL) {
5170 RadioResponseInfo responseInfo = {};
5171 int ret = responseInt(responseInfo, serial, responseType, e, response, responseLen);
5172 Return<void> retStatus
5173 = radioService[slotId]->mRadioResponse->getTTYModeResponse(responseInfo,
5174 (TtyMode) ret);
5175 radioService[slotId]->checkReturnStatus(retStatus);
5176 } else {
5177 RLOGE("getTTYModeResponse: radioService[%d]->mRadioResponse == NULL", slotId);
5178 }
5179
5180 return 0;
5181 }
5182
setPreferredVoicePrivacyResponse(int slotId,int responseType,int serial,RIL_Errno e,void * response,size_t responseLen)5183 int radio::setPreferredVoicePrivacyResponse(int slotId,
5184 int responseType, int serial, RIL_Errno e,
5185 void *response, size_t responseLen) {
5186 #if VDBG
5187 RLOGD("setPreferredVoicePrivacyResponse: serial %d", serial);
5188 #endif
5189
5190 if (radioService[slotId]->mRadioResponse != NULL) {
5191 RadioResponseInfo responseInfo = {};
5192 populateResponseInfo(responseInfo, serial, responseType, e);
5193 Return<void> retStatus
5194 = radioService[slotId]->mRadioResponse->setPreferredVoicePrivacyResponse(
5195 responseInfo);
5196 radioService[slotId]->checkReturnStatus(retStatus);
5197 } else {
5198 RLOGE("setPreferredVoicePrivacyResponse: radioService[%d]->mRadioResponse == NULL",
5199 slotId);
5200 }
5201
5202 return 0;
5203 }
5204
getPreferredVoicePrivacyResponse(int slotId,int responseType,int serial,RIL_Errno e,void * response,size_t responseLen)5205 int radio::getPreferredVoicePrivacyResponse(int slotId,
5206 int responseType, int serial, RIL_Errno e,
5207 void *response, size_t responseLen) {
5208 #if VDBG
5209 RLOGD("getPreferredVoicePrivacyResponse: serial %d", serial);
5210 #endif
5211
5212 if (radioService[slotId]->mRadioResponse != NULL) {
5213 RadioResponseInfo responseInfo = {};
5214 populateResponseInfo(responseInfo, serial, responseType, e);
5215 bool enable = false;
5216 int numInts = responseLen / sizeof(int);
5217 if (response == NULL || numInts != 1) {
5218 RLOGE("getPreferredVoicePrivacyResponse Invalid response: NULL");
5219 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
5220 } else {
5221 int *pInt = (int *) response;
5222 enable = pInt[0] == 1 ? true : false;
5223 }
5224 Return<void> retStatus
5225 = radioService[slotId]->mRadioResponse->getPreferredVoicePrivacyResponse(
5226 responseInfo, enable);
5227 radioService[slotId]->checkReturnStatus(retStatus);
5228 } else {
5229 RLOGE("getPreferredVoicePrivacyResponse: radioService[%d]->mRadioResponse == NULL",
5230 slotId);
5231 }
5232
5233 return 0;
5234 }
5235
sendCDMAFeatureCodeResponse(int slotId,int responseType,int serial,RIL_Errno e,void * response,size_t responseLen)5236 int radio::sendCDMAFeatureCodeResponse(int slotId,
5237 int responseType, int serial, RIL_Errno e,
5238 void *response, size_t responseLen) {
5239 #if VDBG
5240 RLOGD("sendCDMAFeatureCodeResponse: serial %d", serial);
5241 #endif
5242
5243 if (radioService[slotId]->mRadioResponse != NULL) {
5244 RadioResponseInfo responseInfo = {};
5245 populateResponseInfo(responseInfo, serial, responseType, e);
5246 Return<void> retStatus
5247 = radioService[slotId]->mRadioResponse->sendCDMAFeatureCodeResponse(responseInfo);
5248 radioService[slotId]->checkReturnStatus(retStatus);
5249 } else {
5250 RLOGE("sendCDMAFeatureCodeResponse: radioService[%d]->mRadioResponse == NULL",
5251 slotId);
5252 }
5253
5254 return 0;
5255 }
5256
sendBurstDtmfResponse(int slotId,int responseType,int serial,RIL_Errno e,void * response,size_t responseLen)5257 int radio::sendBurstDtmfResponse(int slotId,
5258 int responseType, int serial, RIL_Errno e,
5259 void *response, size_t responseLen) {
5260 #if VDBG
5261 RLOGD("sendBurstDtmfResponse: serial %d", serial);
5262 #endif
5263
5264 if (radioService[slotId]->mRadioResponse != NULL) {
5265 RadioResponseInfo responseInfo = {};
5266 populateResponseInfo(responseInfo, serial, responseType, e);
5267 Return<void> retStatus
5268 = radioService[slotId]->mRadioResponse->sendBurstDtmfResponse(responseInfo);
5269 radioService[slotId]->checkReturnStatus(retStatus);
5270 } else {
5271 RLOGE("sendBurstDtmfResponse: radioService[%d]->mRadioResponse == NULL", slotId);
5272 }
5273
5274 return 0;
5275 }
5276
sendCdmaSmsResponse(int slotId,int responseType,int serial,RIL_Errno e,void * response,size_t responseLen)5277 int radio::sendCdmaSmsResponse(int slotId,
5278 int responseType, int serial, RIL_Errno e, void *response,
5279 size_t responseLen) {
5280 #if VDBG
5281 RLOGD("sendCdmaSmsResponse: serial %d", serial);
5282 #endif
5283
5284 if (radioService[slotId]->mRadioResponse != NULL) {
5285 RadioResponseInfo responseInfo = {};
5286 SendSmsResult result = makeSendSmsResult(responseInfo, serial, responseType, e, response,
5287 responseLen);
5288
5289 Return<void> retStatus
5290 = radioService[slotId]->mRadioResponse->sendCdmaSmsResponse(responseInfo, result);
5291 radioService[slotId]->checkReturnStatus(retStatus);
5292 } else {
5293 RLOGE("sendCdmaSmsResponse: radioService[%d]->mRadioResponse == NULL", slotId);
5294 }
5295
5296 return 0;
5297 }
5298
acknowledgeLastIncomingCdmaSmsResponse(int slotId,int responseType,int serial,RIL_Errno e,void * response,size_t responseLen)5299 int radio::acknowledgeLastIncomingCdmaSmsResponse(int slotId,
5300 int responseType, int serial, RIL_Errno e,
5301 void *response, size_t responseLen) {
5302 #if VDBG
5303 RLOGD("acknowledgeLastIncomingCdmaSmsResponse: serial %d", serial);
5304 #endif
5305
5306 if (radioService[slotId]->mRadioResponse != NULL) {
5307 RadioResponseInfo responseInfo = {};
5308 populateResponseInfo(responseInfo, serial, responseType, e);
5309 Return<void> retStatus
5310 = radioService[slotId]->mRadioResponse->acknowledgeLastIncomingCdmaSmsResponse(
5311 responseInfo);
5312 radioService[slotId]->checkReturnStatus(retStatus);
5313 } else {
5314 RLOGE("acknowledgeLastIncomingCdmaSmsResponse: radioService[%d]->mRadioResponse "
5315 "== NULL", slotId);
5316 }
5317
5318 return 0;
5319 }
5320
getGsmBroadcastConfigResponse(int slotId,int responseType,int serial,RIL_Errno e,void * response,size_t responseLen)5321 int radio::getGsmBroadcastConfigResponse(int slotId,
5322 int responseType, int serial, RIL_Errno e,
5323 void *response, size_t responseLen) {
5324 #if VDBG
5325 RLOGD("getGsmBroadcastConfigResponse: serial %d", serial);
5326 #endif
5327
5328 if (radioService[slotId]->mRadioResponse != NULL) {
5329 RadioResponseInfo responseInfo = {};
5330 populateResponseInfo(responseInfo, serial, responseType, e);
5331 hidl_vec<GsmBroadcastSmsConfigInfo> configs;
5332
5333 if ((response == NULL && responseLen != 0)
5334 || responseLen % sizeof(RIL_GSM_BroadcastSmsConfigInfo *) != 0) {
5335 RLOGE("getGsmBroadcastConfigResponse Invalid response: NULL");
5336 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
5337 } else {
5338 int num = responseLen / sizeof(RIL_GSM_BroadcastSmsConfigInfo *);
5339 configs.resize(num);
5340 for (int i = 0 ; i < num; i++) {
5341 RIL_GSM_BroadcastSmsConfigInfo *resp =
5342 ((RIL_GSM_BroadcastSmsConfigInfo **) response)[i];
5343 configs[i].fromServiceId = resp->fromServiceId;
5344 configs[i].toServiceId = resp->toServiceId;
5345 configs[i].fromCodeScheme = resp->fromCodeScheme;
5346 configs[i].toCodeScheme = resp->toCodeScheme;
5347 configs[i].selected = resp->selected == 1 ? true : false;
5348 }
5349 }
5350
5351 Return<void> retStatus
5352 = radioService[slotId]->mRadioResponse->getGsmBroadcastConfigResponse(responseInfo,
5353 configs);
5354 radioService[slotId]->checkReturnStatus(retStatus);
5355 } else {
5356 RLOGE("getGsmBroadcastConfigResponse: radioService[%d]->mRadioResponse == NULL",
5357 slotId);
5358 }
5359
5360 return 0;
5361 }
5362
setGsmBroadcastConfigResponse(int slotId,int responseType,int serial,RIL_Errno e,void * response,size_t responseLen)5363 int radio::setGsmBroadcastConfigResponse(int slotId,
5364 int responseType, int serial, RIL_Errno e,
5365 void *response, size_t responseLen) {
5366 #if VDBG
5367 RLOGD("setGsmBroadcastConfigResponse: serial %d", serial);
5368 #endif
5369
5370 if (radioService[slotId]->mRadioResponse != NULL) {
5371 RadioResponseInfo responseInfo = {};
5372 populateResponseInfo(responseInfo, serial, responseType, e);
5373 Return<void> retStatus
5374 = radioService[slotId]->mRadioResponse->setGsmBroadcastConfigResponse(responseInfo);
5375 radioService[slotId]->checkReturnStatus(retStatus);
5376 } else {
5377 RLOGE("setGsmBroadcastConfigResponse: radioService[%d]->mRadioResponse == NULL",
5378 slotId);
5379 }
5380
5381 return 0;
5382 }
5383
setGsmBroadcastActivationResponse(int slotId,int responseType,int serial,RIL_Errno e,void * response,size_t responseLen)5384 int radio::setGsmBroadcastActivationResponse(int slotId,
5385 int responseType, int serial, RIL_Errno e,
5386 void *response, size_t responseLen) {
5387 #if VDBG
5388 RLOGD("setGsmBroadcastActivationResponse: serial %d", serial);
5389 #endif
5390
5391 if (radioService[slotId]->mRadioResponse != NULL) {
5392 RadioResponseInfo responseInfo = {};
5393 populateResponseInfo(responseInfo, serial, responseType, e);
5394 Return<void> retStatus
5395 = radioService[slotId]->mRadioResponse->setGsmBroadcastActivationResponse(
5396 responseInfo);
5397 radioService[slotId]->checkReturnStatus(retStatus);
5398 } else {
5399 RLOGE("setGsmBroadcastActivationResponse: radioService[%d]->mRadioResponse == NULL",
5400 slotId);
5401 }
5402
5403 return 0;
5404 }
5405
getCdmaBroadcastConfigResponse(int slotId,int responseType,int serial,RIL_Errno e,void * response,size_t responseLen)5406 int radio::getCdmaBroadcastConfigResponse(int slotId,
5407 int responseType, int serial, RIL_Errno e,
5408 void *response, size_t responseLen) {
5409 #if VDBG
5410 RLOGD("getCdmaBroadcastConfigResponse: serial %d", serial);
5411 #endif
5412
5413 if (radioService[slotId]->mRadioResponse != NULL) {
5414 RadioResponseInfo responseInfo = {};
5415 populateResponseInfo(responseInfo, serial, responseType, e);
5416 hidl_vec<CdmaBroadcastSmsConfigInfo> configs;
5417
5418 if ((response == NULL && responseLen != 0)
5419 || responseLen % sizeof(RIL_CDMA_BroadcastSmsConfigInfo *) != 0) {
5420 RLOGE("getCdmaBroadcastConfigResponse Invalid response: NULL");
5421 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
5422 } else {
5423 int num = responseLen / sizeof(RIL_CDMA_BroadcastSmsConfigInfo *);
5424 configs.resize(num);
5425 for (int i = 0 ; i < num; i++) {
5426 RIL_CDMA_BroadcastSmsConfigInfo *resp =
5427 ((RIL_CDMA_BroadcastSmsConfigInfo **) response)[i];
5428 configs[i].serviceCategory = resp->service_category;
5429 configs[i].language = resp->language;
5430 configs[i].selected = resp->selected == 1 ? true : false;
5431 }
5432 }
5433
5434 Return<void> retStatus
5435 = radioService[slotId]->mRadioResponse->getCdmaBroadcastConfigResponse(responseInfo,
5436 configs);
5437 radioService[slotId]->checkReturnStatus(retStatus);
5438 } else {
5439 RLOGE("getCdmaBroadcastConfigResponse: radioService[%d]->mRadioResponse == NULL",
5440 slotId);
5441 }
5442
5443 return 0;
5444 }
5445
setCdmaBroadcastConfigResponse(int slotId,int responseType,int serial,RIL_Errno e,void * response,size_t responseLen)5446 int radio::setCdmaBroadcastConfigResponse(int slotId,
5447 int responseType, int serial, RIL_Errno e,
5448 void *response, size_t responseLen) {
5449 #if VDBG
5450 RLOGD("setCdmaBroadcastConfigResponse: serial %d", serial);
5451 #endif
5452
5453 if (radioService[slotId]->mRadioResponse != NULL) {
5454 RadioResponseInfo responseInfo = {};
5455 populateResponseInfo(responseInfo, serial, responseType, e);
5456 Return<void> retStatus
5457 = radioService[slotId]->mRadioResponse->setCdmaBroadcastConfigResponse(
5458 responseInfo);
5459 radioService[slotId]->checkReturnStatus(retStatus);
5460 } else {
5461 RLOGE("setCdmaBroadcastConfigResponse: radioService[%d]->mRadioResponse == NULL",
5462 slotId);
5463 }
5464
5465 return 0;
5466 }
5467
setCdmaBroadcastActivationResponse(int slotId,int responseType,int serial,RIL_Errno e,void * response,size_t responseLen)5468 int radio::setCdmaBroadcastActivationResponse(int slotId,
5469 int responseType, int serial, RIL_Errno e,
5470 void *response, size_t responseLen) {
5471 #if VDBG
5472 RLOGD("setCdmaBroadcastActivationResponse: serial %d", serial);
5473 #endif
5474
5475 if (radioService[slotId]->mRadioResponse != NULL) {
5476 RadioResponseInfo responseInfo = {};
5477 populateResponseInfo(responseInfo, serial, responseType, e);
5478 Return<void> retStatus
5479 = radioService[slotId]->mRadioResponse->setCdmaBroadcastActivationResponse(
5480 responseInfo);
5481 radioService[slotId]->checkReturnStatus(retStatus);
5482 } else {
5483 RLOGE("setCdmaBroadcastActivationResponse: radioService[%d]->mRadioResponse == NULL",
5484 slotId);
5485 }
5486
5487 return 0;
5488 }
5489
getCDMASubscriptionResponse(int slotId,int responseType,int serial,RIL_Errno e,void * response,size_t responseLen)5490 int radio::getCDMASubscriptionResponse(int slotId,
5491 int responseType, int serial, RIL_Errno e, void *response,
5492 size_t responseLen) {
5493 #if VDBG
5494 RLOGD("getCDMASubscriptionResponse: serial %d", serial);
5495 #endif
5496
5497 if (radioService[slotId]->mRadioResponse != NULL) {
5498 RadioResponseInfo responseInfo = {};
5499 populateResponseInfo(responseInfo, serial, responseType, e);
5500
5501 int numStrings = responseLen / sizeof(char *);
5502 hidl_string emptyString;
5503 if (response == NULL || numStrings != 5) {
5504 RLOGE("getOperatorResponse Invalid response: NULL");
5505 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
5506 Return<void> retStatus
5507 = radioService[slotId]->mRadioResponse->getCDMASubscriptionResponse(
5508 responseInfo, emptyString, emptyString, emptyString, emptyString, emptyString);
5509 radioService[slotId]->checkReturnStatus(retStatus);
5510 } else {
5511 char **resp = (char **) response;
5512 Return<void> retStatus
5513 = radioService[slotId]->mRadioResponse->getCDMASubscriptionResponse(
5514 responseInfo,
5515 convertCharPtrToHidlString(resp[0]),
5516 convertCharPtrToHidlString(resp[1]),
5517 convertCharPtrToHidlString(resp[2]),
5518 convertCharPtrToHidlString(resp[3]),
5519 convertCharPtrToHidlString(resp[4]));
5520 radioService[slotId]->checkReturnStatus(retStatus);
5521 }
5522 } else {
5523 RLOGE("getCDMASubscriptionResponse: radioService[%d]->mRadioResponse == NULL",
5524 slotId);
5525 }
5526
5527 return 0;
5528 }
5529
writeSmsToRuimResponse(int slotId,int responseType,int serial,RIL_Errno e,void * response,size_t responseLen)5530 int radio::writeSmsToRuimResponse(int slotId,
5531 int responseType, int serial, RIL_Errno e,
5532 void *response, size_t responseLen) {
5533 #if VDBG
5534 RLOGD("writeSmsToRuimResponse: serial %d", serial);
5535 #endif
5536
5537 if (radioService[slotId]->mRadioResponse != NULL) {
5538 RadioResponseInfo responseInfo = {};
5539 int ret = responseInt(responseInfo, serial, responseType, e, response, responseLen);
5540 Return<void> retStatus
5541 = radioService[slotId]->mRadioResponse->writeSmsToRuimResponse(responseInfo, ret);
5542 radioService[slotId]->checkReturnStatus(retStatus);
5543 } else {
5544 RLOGE("writeSmsToRuimResponse: radioService[%d]->mRadioResponse == NULL", slotId);
5545 }
5546
5547 return 0;
5548 }
5549
deleteSmsOnRuimResponse(int slotId,int responseType,int serial,RIL_Errno e,void * response,size_t responseLen)5550 int radio::deleteSmsOnRuimResponse(int slotId,
5551 int responseType, int serial, RIL_Errno e,
5552 void *response, size_t responseLen) {
5553 #if VDBG
5554 RLOGD("deleteSmsOnRuimResponse: serial %d", serial);
5555 #endif
5556
5557 if (radioService[slotId]->mRadioResponse != NULL) {
5558 RadioResponseInfo responseInfo = {};
5559 populateResponseInfo(responseInfo, serial, responseType, e);
5560 Return<void> retStatus
5561 = radioService[slotId]->mRadioResponse->deleteSmsOnRuimResponse(responseInfo);
5562 radioService[slotId]->checkReturnStatus(retStatus);
5563 } else {
5564 RLOGE("deleteSmsOnRuimResponse: radioService[%d]->mRadioResponse == NULL", slotId);
5565 }
5566
5567 return 0;
5568 }
5569
getDeviceIdentityResponse(int slotId,int responseType,int serial,RIL_Errno e,void * response,size_t responseLen)5570 int radio::getDeviceIdentityResponse(int slotId,
5571 int responseType, int serial, RIL_Errno e, void *response,
5572 size_t responseLen) {
5573 #if VDBG
5574 RLOGD("getDeviceIdentityResponse: serial %d", serial);
5575 #endif
5576
5577 if (radioService[slotId]->mRadioResponse != NULL) {
5578 RadioResponseInfo responseInfo = {};
5579 populateResponseInfo(responseInfo, serial, responseType, e);
5580
5581 int numStrings = responseLen / sizeof(char *);
5582 hidl_string emptyString;
5583 if (response == NULL || numStrings != 4) {
5584 RLOGE("getDeviceIdentityResponse Invalid response: NULL");
5585 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
5586 Return<void> retStatus
5587 = radioService[slotId]->mRadioResponse->getDeviceIdentityResponse(responseInfo,
5588 emptyString, emptyString, emptyString, emptyString);
5589 radioService[slotId]->checkReturnStatus(retStatus);
5590 } else {
5591 char **resp = (char **) response;
5592 Return<void> retStatus
5593 = radioService[slotId]->mRadioResponse->getDeviceIdentityResponse(responseInfo,
5594 convertCharPtrToHidlString(resp[0]),
5595 convertCharPtrToHidlString(resp[1]),
5596 convertCharPtrToHidlString(resp[2]),
5597 convertCharPtrToHidlString(resp[3]));
5598 radioService[slotId]->checkReturnStatus(retStatus);
5599 }
5600 } else {
5601 RLOGE("getDeviceIdentityResponse: radioService[%d]->mRadioResponse == NULL",
5602 slotId);
5603 }
5604
5605 return 0;
5606 }
5607
exitEmergencyCallbackModeResponse(int slotId,int responseType,int serial,RIL_Errno e,void * response,size_t responseLen)5608 int radio::exitEmergencyCallbackModeResponse(int slotId,
5609 int responseType, int serial, RIL_Errno e,
5610 void *response, size_t responseLen) {
5611 #if VDBG
5612 RLOGD("exitEmergencyCallbackModeResponse: serial %d", serial);
5613 #endif
5614
5615 if (radioService[slotId]->mRadioResponse != NULL) {
5616 RadioResponseInfo responseInfo = {};
5617 populateResponseInfo(responseInfo, serial, responseType, e);
5618 Return<void> retStatus
5619 = radioService[slotId]->mRadioResponse->exitEmergencyCallbackModeResponse(
5620 responseInfo);
5621 radioService[slotId]->checkReturnStatus(retStatus);
5622 } else {
5623 RLOGE("exitEmergencyCallbackModeResponse: radioService[%d]->mRadioResponse == NULL",
5624 slotId);
5625 }
5626
5627 return 0;
5628 }
5629
getSmscAddressResponse(int slotId,int responseType,int serial,RIL_Errno e,void * response,size_t responseLen)5630 int radio::getSmscAddressResponse(int slotId,
5631 int responseType, int serial, RIL_Errno e,
5632 void *response, size_t responseLen) {
5633 #if VDBG
5634 RLOGD("getSmscAddressResponse: serial %d", serial);
5635 #endif
5636
5637 if (radioService[slotId]->mRadioResponse != NULL) {
5638 RadioResponseInfo responseInfo = {};
5639 populateResponseInfo(responseInfo, serial, responseType, e);
5640 Return<void> retStatus
5641 = radioService[slotId]->mRadioResponse->getSmscAddressResponse(responseInfo,
5642 convertCharPtrToHidlString((char *) response));
5643 radioService[slotId]->checkReturnStatus(retStatus);
5644 } else {
5645 RLOGE("getSmscAddressResponse: radioService[%d]->mRadioResponse == NULL", slotId);
5646 }
5647
5648 return 0;
5649 }
5650
setSmscAddressResponse(int slotId,int responseType,int serial,RIL_Errno e,void * response,size_t responseLen)5651 int radio::setSmscAddressResponse(int slotId,
5652 int responseType, int serial, RIL_Errno e,
5653 void *response, size_t responseLen) {
5654 #if VDBG
5655 RLOGD("setSmscAddressResponse: serial %d", serial);
5656 #endif
5657
5658 if (radioService[slotId]->mRadioResponse != NULL) {
5659 RadioResponseInfo responseInfo = {};
5660 populateResponseInfo(responseInfo, serial, responseType, e);
5661 Return<void> retStatus
5662 = radioService[slotId]->mRadioResponse->setSmscAddressResponse(responseInfo);
5663 radioService[slotId]->checkReturnStatus(retStatus);
5664 } else {
5665 RLOGE("setSmscAddressResponse: radioService[%d]->mRadioResponse == NULL", slotId);
5666 }
5667
5668 return 0;
5669 }
5670
reportSmsMemoryStatusResponse(int slotId,int responseType,int serial,RIL_Errno e,void * response,size_t responseLen)5671 int radio::reportSmsMemoryStatusResponse(int slotId,
5672 int responseType, int serial, RIL_Errno e,
5673 void *response, size_t responseLen) {
5674 #if VDBG
5675 RLOGD("reportSmsMemoryStatusResponse: serial %d", serial);
5676 #endif
5677
5678 if (radioService[slotId]->mRadioResponse != NULL) {
5679 RadioResponseInfo responseInfo = {};
5680 populateResponseInfo(responseInfo, serial, responseType, e);
5681 Return<void> retStatus
5682 = radioService[slotId]->mRadioResponse->reportSmsMemoryStatusResponse(responseInfo);
5683 radioService[slotId]->checkReturnStatus(retStatus);
5684 } else {
5685 RLOGE("reportSmsMemoryStatusResponse: radioService[%d]->mRadioResponse == NULL",
5686 slotId);
5687 }
5688
5689 return 0;
5690 }
5691
reportStkServiceIsRunningResponse(int slotId,int responseType,int serial,RIL_Errno e,void * response,size_t responseLen)5692 int radio::reportStkServiceIsRunningResponse(int slotId,
5693 int responseType, int serial, RIL_Errno e,
5694 void *response, size_t responseLen) {
5695 #if VDBG
5696 RLOGD("reportStkServiceIsRunningResponse: serial %d", serial);
5697 #endif
5698
5699 if (radioService[slotId]->mRadioResponse != NULL) {
5700 RadioResponseInfo responseInfo = {};
5701 populateResponseInfo(responseInfo, serial, responseType, e);
5702 Return<void> retStatus = radioService[slotId]->mRadioResponse->
5703 reportStkServiceIsRunningResponse(responseInfo);
5704 radioService[slotId]->checkReturnStatus(retStatus);
5705 } else {
5706 RLOGE("reportStkServiceIsRunningResponse: radioService[%d]->mRadioResponse == NULL",
5707 slotId);
5708 }
5709
5710 return 0;
5711 }
5712
getCdmaSubscriptionSourceResponse(int slotId,int responseType,int serial,RIL_Errno e,void * response,size_t responseLen)5713 int radio::getCdmaSubscriptionSourceResponse(int slotId,
5714 int responseType, int serial, RIL_Errno e,
5715 void *response, size_t responseLen) {
5716 #if VDBG
5717 RLOGD("getCdmaSubscriptionSourceResponse: serial %d", serial);
5718 #endif
5719
5720 if (radioService[slotId]->mRadioResponse != NULL) {
5721 RadioResponseInfo responseInfo = {};
5722 int ret = responseInt(responseInfo, serial, responseType, e, response, responseLen);
5723 Return<void> retStatus
5724 = radioService[slotId]->mRadioResponse->getCdmaSubscriptionSourceResponse(
5725 responseInfo, (CdmaSubscriptionSource) ret);
5726 radioService[slotId]->checkReturnStatus(retStatus);
5727 } else {
5728 RLOGE("getCdmaSubscriptionSourceResponse: radioService[%d]->mRadioResponse == NULL",
5729 slotId);
5730 }
5731
5732 return 0;
5733 }
5734
requestIsimAuthenticationResponse(int slotId,int responseType,int serial,RIL_Errno e,void * response,size_t responseLen)5735 int radio::requestIsimAuthenticationResponse(int slotId,
5736 int responseType, int serial, RIL_Errno e,
5737 void *response, size_t responseLen) {
5738 #if VDBG
5739 RLOGD("requestIsimAuthenticationResponse: serial %d", serial);
5740 #endif
5741
5742 if (radioService[slotId]->mRadioResponse != NULL) {
5743 RadioResponseInfo responseInfo = {};
5744 populateResponseInfo(responseInfo, serial, responseType, e);
5745 Return<void> retStatus
5746 = radioService[slotId]->mRadioResponse->requestIsimAuthenticationResponse(
5747 responseInfo,
5748 convertCharPtrToHidlString((char *) response));
5749 radioService[slotId]->checkReturnStatus(retStatus);
5750 } else {
5751 RLOGE("requestIsimAuthenticationResponse: radioService[%d]->mRadioResponse == NULL",
5752 slotId);
5753 }
5754
5755 return 0;
5756 }
5757
acknowledgeIncomingGsmSmsWithPduResponse(int slotId,int responseType,int serial,RIL_Errno e,void * response,size_t responseLen)5758 int radio::acknowledgeIncomingGsmSmsWithPduResponse(int slotId,
5759 int responseType,
5760 int serial, RIL_Errno e, void *response,
5761 size_t responseLen) {
5762 #if VDBG
5763 RLOGD("acknowledgeIncomingGsmSmsWithPduResponse: serial %d", serial);
5764 #endif
5765
5766 if (radioService[slotId]->mRadioResponse != NULL) {
5767 RadioResponseInfo responseInfo = {};
5768 populateResponseInfo(responseInfo, serial, responseType, e);
5769 Return<void> retStatus
5770 = radioService[slotId]->mRadioResponse->acknowledgeIncomingGsmSmsWithPduResponse(
5771 responseInfo);
5772 radioService[slotId]->checkReturnStatus(retStatus);
5773 } else {
5774 RLOGE("acknowledgeIncomingGsmSmsWithPduResponse: radioService[%d]->mRadioResponse "
5775 "== NULL", slotId);
5776 }
5777
5778 return 0;
5779 }
5780
sendEnvelopeWithStatusResponse(int slotId,int responseType,int serial,RIL_Errno e,void * response,size_t responseLen)5781 int radio::sendEnvelopeWithStatusResponse(int slotId,
5782 int responseType, int serial, RIL_Errno e, void *response,
5783 size_t responseLen) {
5784 #if VDBG
5785 RLOGD("sendEnvelopeWithStatusResponse: serial %d", serial);
5786 #endif
5787
5788 if (radioService[slotId]->mRadioResponse != NULL) {
5789 RadioResponseInfo responseInfo = {};
5790 IccIoResult result = responseIccIo(responseInfo, serial, responseType, e,
5791 response, responseLen);
5792
5793 Return<void> retStatus
5794 = radioService[slotId]->mRadioResponse->sendEnvelopeWithStatusResponse(responseInfo,
5795 result);
5796 radioService[slotId]->checkReturnStatus(retStatus);
5797 } else {
5798 RLOGE("sendEnvelopeWithStatusResponse: radioService[%d]->mRadioResponse == NULL",
5799 slotId);
5800 }
5801
5802 return 0;
5803 }
5804
getVoiceRadioTechnologyResponse(int slotId,int responseType,int serial,RIL_Errno e,void * response,size_t responseLen)5805 int radio::getVoiceRadioTechnologyResponse(int slotId,
5806 int responseType, int serial, RIL_Errno e,
5807 void *response, size_t responseLen) {
5808 #if VDBG
5809 RLOGD("getVoiceRadioTechnologyResponse: serial %d", serial);
5810 #endif
5811
5812 if (radioService[slotId]->mRadioResponse != NULL) {
5813 RadioResponseInfo responseInfo = {};
5814 int ret = responseInt(responseInfo, serial, responseType, e, response, responseLen);
5815 Return<void> retStatus
5816 = radioService[slotId]->mRadioResponse->getVoiceRadioTechnologyResponse(
5817 responseInfo, (RadioTechnology) ret);
5818 radioService[slotId]->checkReturnStatus(retStatus);
5819 } else {
5820 RLOGE("getVoiceRadioTechnologyResponse: radioService[%d]->mRadioResponse == NULL",
5821 slotId);
5822 }
5823
5824 return 0;
5825 }
5826
getCellInfoListResponse(int slotId,int responseType,int serial,RIL_Errno e,void * response,size_t responseLen)5827 int radio::getCellInfoListResponse(int slotId,
5828 int responseType,
5829 int serial, RIL_Errno e, void *response,
5830 size_t responseLen) {
5831 #if VDBG
5832 RLOGD("getCellInfoListResponse: serial %d", serial);
5833 #endif
5834
5835 if (radioService[slotId]->mRadioResponse != NULL) {
5836 RadioResponseInfo responseInfo = {};
5837 populateResponseInfo(responseInfo, serial, responseType, e);
5838
5839 hidl_vec<CellInfo> ret;
5840 if ((response == NULL && responseLen != 0)
5841 || responseLen % sizeof(RIL_CellInfo_v12) != 0) {
5842 RLOGE("getCellInfoListResponse: Invalid response");
5843 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
5844 } else {
5845 convertRilCellInfoListToHal(response, responseLen, ret);
5846 }
5847
5848 Return<void> retStatus = radioService[slotId]->mRadioResponse->getCellInfoListResponse(
5849 responseInfo, ret);
5850 radioService[slotId]->checkReturnStatus(retStatus);
5851 } else {
5852 RLOGE("getCellInfoListResponse: radioService[%d]->mRadioResponse == NULL", slotId);
5853 }
5854
5855 return 0;
5856 }
5857
setCellInfoListRateResponse(int slotId,int responseType,int serial,RIL_Errno e,void * response,size_t responseLen)5858 int radio::setCellInfoListRateResponse(int slotId,
5859 int responseType,
5860 int serial, RIL_Errno e, void *response,
5861 size_t responseLen) {
5862 #if VDBG
5863 RLOGD("setCellInfoListRateResponse: serial %d", serial);
5864 #endif
5865
5866 if (radioService[slotId]->mRadioResponse != NULL) {
5867 RadioResponseInfo responseInfo = {};
5868 populateResponseInfo(responseInfo, serial, responseType, e);
5869 Return<void> retStatus
5870 = radioService[slotId]->mRadioResponse->setCellInfoListRateResponse(responseInfo);
5871 radioService[slotId]->checkReturnStatus(retStatus);
5872 } else {
5873 RLOGE("setCellInfoListRateResponse: radioService[%d]->mRadioResponse == NULL",
5874 slotId);
5875 }
5876
5877 return 0;
5878 }
5879
setInitialAttachApnResponse(int slotId,int responseType,int serial,RIL_Errno e,void * response,size_t responseLen)5880 int radio::setInitialAttachApnResponse(int slotId,
5881 int responseType, int serial, RIL_Errno e,
5882 void *response, size_t responseLen) {
5883 #if VDBG
5884 RLOGD("setInitialAttachApnResponse: serial %d", serial);
5885 #endif
5886
5887 if (radioService[slotId]->mRadioResponse != NULL) {
5888 RadioResponseInfo responseInfo = {};
5889 populateResponseInfo(responseInfo, serial, responseType, e);
5890 Return<void> retStatus
5891 = radioService[slotId]->mRadioResponse->setInitialAttachApnResponse(responseInfo);
5892 radioService[slotId]->checkReturnStatus(retStatus);
5893 } else {
5894 RLOGE("setInitialAttachApnResponse: radioService[%d]->mRadioResponse == NULL",
5895 slotId);
5896 }
5897
5898 return 0;
5899 }
5900
getImsRegistrationStateResponse(int slotId,int responseType,int serial,RIL_Errno e,void * response,size_t responseLen)5901 int radio::getImsRegistrationStateResponse(int slotId,
5902 int responseType, int serial, RIL_Errno e,
5903 void *response, size_t responseLen) {
5904 #if VDBG
5905 RLOGD("getImsRegistrationStateResponse: serial %d", serial);
5906 #endif
5907
5908 if (radioService[slotId]->mRadioResponse != NULL) {
5909 RadioResponseInfo responseInfo = {};
5910 populateResponseInfo(responseInfo, serial, responseType, e);
5911 bool isRegistered = false;
5912 RadioTechnologyFamily ratFamily = RadioTechnologyFamily::THREE_GPP;
5913 int numInts = responseLen / sizeof(int);
5914 if (response == NULL || numInts != 2) {
5915 RLOGE("getImsRegistrationStateResponse Invalid response: NULL");
5916 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
5917 } else {
5918 int *pInt = (int *) response;
5919 isRegistered = pInt[0] == 1 ? true : false;
5920 // Map RIL_RadioTechnologyFamily to RadioTechnologyFamily
5921 if (pInt[1] == RADIO_TECH_3GPP) {
5922 ratFamily = RadioTechnologyFamily::THREE_GPP;
5923 } else {
5924 ratFamily = RadioTechnologyFamily::THREE_GPP2;
5925 }
5926 }
5927 Return<void> retStatus
5928 = radioService[slotId]->mRadioResponse->getImsRegistrationStateResponse(
5929 responseInfo, isRegistered, ratFamily);
5930 radioService[slotId]->checkReturnStatus(retStatus);
5931 } else {
5932 RLOGE("getImsRegistrationStateResponse: radioService[%d]->mRadioResponse == NULL",
5933 slotId);
5934 }
5935
5936 return 0;
5937 }
5938
sendImsSmsResponse(int slotId,int responseType,int serial,RIL_Errno e,void * response,size_t responseLen)5939 int radio::sendImsSmsResponse(int slotId,
5940 int responseType, int serial, RIL_Errno e, void *response,
5941 size_t responseLen) {
5942 #if VDBG
5943 RLOGD("sendImsSmsResponse: serial %d", serial);
5944 #endif
5945
5946 if (radioService[slotId]->mRadioResponse != NULL) {
5947 RadioResponseInfo responseInfo = {};
5948 SendSmsResult result = makeSendSmsResult(responseInfo, serial, responseType, e, response,
5949 responseLen);
5950
5951 Return<void> retStatus
5952 = radioService[slotId]->mRadioResponse->sendImsSmsResponse(responseInfo, result);
5953 radioService[slotId]->checkReturnStatus(retStatus);
5954 } else {
5955 RLOGE("sendSmsResponse: radioService[%d]->mRadioResponse == NULL", slotId);
5956 }
5957
5958 return 0;
5959 }
5960
iccTransmitApduBasicChannelResponse(int slotId,int responseType,int serial,RIL_Errno e,void * response,size_t responseLen)5961 int radio::iccTransmitApduBasicChannelResponse(int slotId,
5962 int responseType, int serial, RIL_Errno e,
5963 void *response, size_t responseLen) {
5964 #if VDBG
5965 RLOGD("iccTransmitApduBasicChannelResponse: serial %d", serial);
5966 #endif
5967
5968 if (radioService[slotId]->mRadioResponse != NULL) {
5969 RadioResponseInfo responseInfo = {};
5970 IccIoResult result = responseIccIo(responseInfo, serial, responseType, e, response,
5971 responseLen);
5972
5973 Return<void> retStatus
5974 = radioService[slotId]->mRadioResponse->iccTransmitApduBasicChannelResponse(
5975 responseInfo, result);
5976 radioService[slotId]->checkReturnStatus(retStatus);
5977 } else {
5978 RLOGE("iccTransmitApduBasicChannelResponse: radioService[%d]->mRadioResponse "
5979 "== NULL", slotId);
5980 }
5981
5982 return 0;
5983 }
5984
iccOpenLogicalChannelResponse(int slotId,int responseType,int serial,RIL_Errno e,void * response,size_t responseLen)5985 int radio::iccOpenLogicalChannelResponse(int slotId,
5986 int responseType, int serial, RIL_Errno e, void *response,
5987 size_t responseLen) {
5988 #if VDBG
5989 RLOGD("iccOpenLogicalChannelResponse: serial %d", serial);
5990 #endif
5991
5992 if (radioService[slotId]->mRadioResponse != NULL) {
5993 RadioResponseInfo responseInfo = {};
5994 populateResponseInfo(responseInfo, serial, responseType, e);
5995 int channelId = -1;
5996 hidl_vec<int8_t> selectResponse;
5997 int numInts = responseLen / sizeof(int);
5998 if (response == NULL || responseLen % sizeof(int) != 0) {
5999 RLOGE("iccOpenLogicalChannelResponse Invalid response: NULL");
6000 if (response != NULL) {
6001 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
6002 }
6003 } else {
6004 int *pInt = (int *) response;
6005 channelId = pInt[0];
6006 selectResponse.resize(numInts - 1);
6007 for (int i = 1; i < numInts; i++) {
6008 selectResponse[i - 1] = (int8_t) pInt[i];
6009 }
6010 }
6011 Return<void> retStatus
6012 = radioService[slotId]->mRadioResponse->iccOpenLogicalChannelResponse(responseInfo,
6013 channelId, selectResponse);
6014 radioService[slotId]->checkReturnStatus(retStatus);
6015 } else {
6016 RLOGE("iccOpenLogicalChannelResponse: radioService[%d]->mRadioResponse == NULL",
6017 slotId);
6018 }
6019
6020 return 0;
6021 }
6022
iccCloseLogicalChannelResponse(int slotId,int responseType,int serial,RIL_Errno e,void * response,size_t responseLen)6023 int radio::iccCloseLogicalChannelResponse(int slotId,
6024 int responseType, int serial, RIL_Errno e,
6025 void *response, size_t responseLen) {
6026 #if VDBG
6027 RLOGD("iccCloseLogicalChannelResponse: serial %d", serial);
6028 #endif
6029
6030 if (radioService[slotId]->mRadioResponse != NULL) {
6031 RadioResponseInfo responseInfo = {};
6032 populateResponseInfo(responseInfo, serial, responseType, e);
6033 Return<void> retStatus
6034 = radioService[slotId]->mRadioResponse->iccCloseLogicalChannelResponse(
6035 responseInfo);
6036 radioService[slotId]->checkReturnStatus(retStatus);
6037 } else {
6038 RLOGE("iccCloseLogicalChannelResponse: radioService[%d]->mRadioResponse == NULL",
6039 slotId);
6040 }
6041
6042 return 0;
6043 }
6044
iccTransmitApduLogicalChannelResponse(int slotId,int responseType,int serial,RIL_Errno e,void * response,size_t responseLen)6045 int radio::iccTransmitApduLogicalChannelResponse(int slotId,
6046 int responseType, int serial, RIL_Errno e,
6047 void *response, size_t responseLen) {
6048 #if VDBG
6049 RLOGD("iccTransmitApduLogicalChannelResponse: serial %d", serial);
6050 #endif
6051
6052 if (radioService[slotId]->mRadioResponse != NULL) {
6053 RadioResponseInfo responseInfo = {};
6054 IccIoResult result = responseIccIo(responseInfo, serial, responseType, e, response,
6055 responseLen);
6056
6057 Return<void> retStatus
6058 = radioService[slotId]->mRadioResponse->iccTransmitApduLogicalChannelResponse(
6059 responseInfo, result);
6060 radioService[slotId]->checkReturnStatus(retStatus);
6061 } else {
6062 RLOGE("iccTransmitApduLogicalChannelResponse: radioService[%d]->mRadioResponse "
6063 "== NULL", slotId);
6064 }
6065
6066 return 0;
6067 }
6068
nvReadItemResponse(int slotId,int responseType,int serial,RIL_Errno e,void * response,size_t responseLen)6069 int radio::nvReadItemResponse(int slotId,
6070 int responseType, int serial, RIL_Errno e,
6071 void *response, size_t responseLen) {
6072 #if VDBG
6073 RLOGD("nvReadItemResponse: serial %d", serial);
6074 #endif
6075
6076 if (radioService[slotId]->mRadioResponse != NULL) {
6077 RadioResponseInfo responseInfo = {};
6078 populateResponseInfo(responseInfo, serial, responseType, e);
6079 Return<void> retStatus = radioService[slotId]->mRadioResponse->nvReadItemResponse(
6080 responseInfo,
6081 convertCharPtrToHidlString((char *) response));
6082 radioService[slotId]->checkReturnStatus(retStatus);
6083 } else {
6084 RLOGE("nvReadItemResponse: radioService[%d]->mRadioResponse == NULL", slotId);
6085 }
6086
6087 return 0;
6088 }
6089
nvWriteItemResponse(int slotId,int responseType,int serial,RIL_Errno e,void * response,size_t responseLen)6090 int radio::nvWriteItemResponse(int slotId,
6091 int responseType, int serial, RIL_Errno e,
6092 void *response, size_t responseLen) {
6093 #if VDBG
6094 RLOGD("nvWriteItemResponse: serial %d", serial);
6095 #endif
6096
6097 if (radioService[slotId]->mRadioResponse != NULL) {
6098 RadioResponseInfo responseInfo = {};
6099 populateResponseInfo(responseInfo, serial, responseType, e);
6100 Return<void> retStatus
6101 = radioService[slotId]->mRadioResponse->nvWriteItemResponse(responseInfo);
6102 radioService[slotId]->checkReturnStatus(retStatus);
6103 } else {
6104 RLOGE("nvWriteItemResponse: radioService[%d]->mRadioResponse == NULL", slotId);
6105 }
6106
6107 return 0;
6108 }
6109
nvWriteCdmaPrlResponse(int slotId,int responseType,int serial,RIL_Errno e,void * response,size_t responseLen)6110 int radio::nvWriteCdmaPrlResponse(int slotId,
6111 int responseType, int serial, RIL_Errno e,
6112 void *response, size_t responseLen) {
6113 #if VDBG
6114 RLOGD("nvWriteCdmaPrlResponse: serial %d", serial);
6115 #endif
6116
6117 if (radioService[slotId]->mRadioResponse != NULL) {
6118 RadioResponseInfo responseInfo = {};
6119 populateResponseInfo(responseInfo, serial, responseType, e);
6120 Return<void> retStatus
6121 = radioService[slotId]->mRadioResponse->nvWriteCdmaPrlResponse(responseInfo);
6122 radioService[slotId]->checkReturnStatus(retStatus);
6123 } else {
6124 RLOGE("nvWriteCdmaPrlResponse: radioService[%d]->mRadioResponse == NULL", slotId);
6125 }
6126
6127 return 0;
6128 }
6129
nvResetConfigResponse(int slotId,int responseType,int serial,RIL_Errno e,void * response,size_t responseLen)6130 int radio::nvResetConfigResponse(int slotId,
6131 int responseType, int serial, RIL_Errno e,
6132 void *response, size_t responseLen) {
6133 #if VDBG
6134 RLOGD("nvResetConfigResponse: serial %d", serial);
6135 #endif
6136
6137 if (radioService[slotId]->mRadioResponse != NULL) {
6138 RadioResponseInfo responseInfo = {};
6139 populateResponseInfo(responseInfo, serial, responseType, e);
6140 Return<void> retStatus
6141 = radioService[slotId]->mRadioResponse->nvResetConfigResponse(responseInfo);
6142 radioService[slotId]->checkReturnStatus(retStatus);
6143 } else {
6144 RLOGE("nvResetConfigResponse: radioService[%d]->mRadioResponse == NULL", slotId);
6145 }
6146
6147 return 0;
6148 }
6149
setUiccSubscriptionResponse(int slotId,int responseType,int serial,RIL_Errno e,void * response,size_t responseLen)6150 int radio::setUiccSubscriptionResponse(int slotId,
6151 int responseType, int serial, RIL_Errno e,
6152 void *response, size_t responseLen) {
6153 #if VDBG
6154 RLOGD("setUiccSubscriptionResponse: serial %d", serial);
6155 #endif
6156
6157 if (radioService[slotId]->mRadioResponse != NULL) {
6158 RadioResponseInfo responseInfo = {};
6159 populateResponseInfo(responseInfo, serial, responseType, e);
6160 Return<void> retStatus
6161 = radioService[slotId]->mRadioResponse->setUiccSubscriptionResponse(responseInfo);
6162 radioService[slotId]->checkReturnStatus(retStatus);
6163 } else {
6164 RLOGE("setUiccSubscriptionResponse: radioService[%d]->mRadioResponse == NULL",
6165 slotId);
6166 }
6167
6168 return 0;
6169 }
6170
setDataAllowedResponse(int slotId,int responseType,int serial,RIL_Errno e,void * response,size_t responseLen)6171 int radio::setDataAllowedResponse(int slotId,
6172 int responseType, int serial, RIL_Errno e,
6173 void *response, size_t responseLen) {
6174 #if VDBG
6175 RLOGD("setDataAllowedResponse: serial %d", serial);
6176 #endif
6177
6178 if (radioService[slotId]->mRadioResponse != NULL) {
6179 RadioResponseInfo responseInfo = {};
6180 populateResponseInfo(responseInfo, serial, responseType, e);
6181 Return<void> retStatus
6182 = radioService[slotId]->mRadioResponse->setDataAllowedResponse(responseInfo);
6183 radioService[slotId]->checkReturnStatus(retStatus);
6184 } else {
6185 RLOGE("setDataAllowedResponse: radioService[%d]->mRadioResponse == NULL", slotId);
6186 }
6187
6188 return 0;
6189 }
6190
getHardwareConfigResponse(int slotId,int responseType,int serial,RIL_Errno e,void * response,size_t responseLen)6191 int radio::getHardwareConfigResponse(int slotId,
6192 int responseType, int serial, RIL_Errno e,
6193 void *response, size_t responseLen) {
6194 #if VDBG
6195 RLOGD("getHardwareConfigResponse: serial %d", serial);
6196 #endif
6197
6198 if (radioService[slotId]->mRadioResponse != NULL) {
6199 RadioResponseInfo responseInfo = {};
6200 populateResponseInfo(responseInfo, serial, responseType, e);
6201
6202 hidl_vec<HardwareConfig> result;
6203 if ((response == NULL && responseLen != 0)
6204 || responseLen % sizeof(RIL_HardwareConfig) != 0) {
6205 RLOGE("hardwareConfigChangedInd: invalid response");
6206 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
6207 } else {
6208 convertRilHardwareConfigListToHal(response, responseLen, result);
6209 }
6210
6211 Return<void> retStatus = radioService[slotId]->mRadioResponse->getHardwareConfigResponse(
6212 responseInfo, result);
6213 radioService[slotId]->checkReturnStatus(retStatus);
6214 } else {
6215 RLOGE("getHardwareConfigResponse: radioService[%d]->mRadioResponse == NULL", slotId);
6216 }
6217
6218 return 0;
6219 }
6220
requestIccSimAuthenticationResponse(int slotId,int responseType,int serial,RIL_Errno e,void * response,size_t responseLen)6221 int radio::requestIccSimAuthenticationResponse(int slotId,
6222 int responseType, int serial, RIL_Errno e,
6223 void *response, size_t responseLen) {
6224 #if VDBG
6225 RLOGD("requestIccSimAuthenticationResponse: serial %d", serial);
6226 #endif
6227
6228 if (radioService[slotId]->mRadioResponse != NULL) {
6229 RadioResponseInfo responseInfo = {};
6230 IccIoResult result = responseIccIo(responseInfo, serial, responseType, e, response,
6231 responseLen);
6232
6233 Return<void> retStatus
6234 = radioService[slotId]->mRadioResponse->requestIccSimAuthenticationResponse(
6235 responseInfo, result);
6236 radioService[slotId]->checkReturnStatus(retStatus);
6237 } else {
6238 RLOGE("requestIccSimAuthenticationResponse: radioService[%d]->mRadioResponse "
6239 "== NULL", slotId);
6240 }
6241
6242 return 0;
6243 }
6244
setDataProfileResponse(int slotId,int responseType,int serial,RIL_Errno e,void * response,size_t responseLen)6245 int radio::setDataProfileResponse(int slotId,
6246 int responseType, int serial, RIL_Errno e,
6247 void *response, size_t responseLen) {
6248 #if VDBG
6249 RLOGD("setDataProfileResponse: serial %d", serial);
6250 #endif
6251
6252 if (radioService[slotId]->mRadioResponse != NULL) {
6253 RadioResponseInfo responseInfo = {};
6254 populateResponseInfo(responseInfo, serial, responseType, e);
6255 Return<void> retStatus
6256 = radioService[slotId]->mRadioResponse->setDataProfileResponse(responseInfo);
6257 radioService[slotId]->checkReturnStatus(retStatus);
6258 } else {
6259 RLOGE("setDataProfileResponse: radioService[%d]->mRadioResponse == NULL", slotId);
6260 }
6261
6262 return 0;
6263 }
6264
requestShutdownResponse(int slotId,int responseType,int serial,RIL_Errno e,void * response,size_t responseLen)6265 int radio::requestShutdownResponse(int slotId,
6266 int responseType, int serial, RIL_Errno e,
6267 void *response, size_t responseLen) {
6268 #if VDBG
6269 RLOGD("requestShutdownResponse: serial %d", serial);
6270 #endif
6271
6272 if (radioService[slotId]->mRadioResponse != NULL) {
6273 RadioResponseInfo responseInfo = {};
6274 populateResponseInfo(responseInfo, serial, responseType, e);
6275 Return<void> retStatus
6276 = radioService[slotId]->mRadioResponse->requestShutdownResponse(responseInfo);
6277 radioService[slotId]->checkReturnStatus(retStatus);
6278 } else {
6279 RLOGE("requestShutdownResponse: radioService[%d]->mRadioResponse == NULL", slotId);
6280 }
6281
6282 return 0;
6283 }
6284
responseRadioCapability(RadioResponseInfo & responseInfo,int serial,int responseType,RIL_Errno e,void * response,size_t responseLen,RadioCapability & rc)6285 void responseRadioCapability(RadioResponseInfo& responseInfo, int serial,
6286 int responseType, RIL_Errno e, void *response, size_t responseLen, RadioCapability& rc) {
6287 populateResponseInfo(responseInfo, serial, responseType, e);
6288
6289 if (response == NULL || responseLen != sizeof(RIL_RadioCapability)) {
6290 RLOGE("responseRadioCapability: Invalid response");
6291 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
6292 rc.logicalModemUuid = hidl_string();
6293 } else {
6294 convertRilRadioCapabilityToHal(response, responseLen, rc);
6295 }
6296 }
6297
getRadioCapabilityResponse(int slotId,int responseType,int serial,RIL_Errno e,void * response,size_t responseLen)6298 int radio::getRadioCapabilityResponse(int slotId,
6299 int responseType, int serial, RIL_Errno e,
6300 void *response, size_t responseLen) {
6301 #if VDBG
6302 RLOGD("getRadioCapabilityResponse: serial %d", serial);
6303 #endif
6304
6305 if (radioService[slotId]->mRadioResponse != NULL) {
6306 RadioResponseInfo responseInfo = {};
6307 RadioCapability result = {};
6308 responseRadioCapability(responseInfo, serial, responseType, e, response, responseLen,
6309 result);
6310 Return<void> retStatus = radioService[slotId]->mRadioResponse->getRadioCapabilityResponse(
6311 responseInfo, result);
6312 radioService[slotId]->checkReturnStatus(retStatus);
6313 } else {
6314 RLOGE("getRadioCapabilityResponse: radioService[%d]->mRadioResponse == NULL", slotId);
6315 }
6316
6317 return 0;
6318 }
6319
setRadioCapabilityResponse(int slotId,int responseType,int serial,RIL_Errno e,void * response,size_t responseLen)6320 int radio::setRadioCapabilityResponse(int slotId,
6321 int responseType, int serial, RIL_Errno e,
6322 void *response, size_t responseLen) {
6323 #if VDBG
6324 RLOGD("setRadioCapabilityResponse: serial %d", serial);
6325 #endif
6326
6327 if (radioService[slotId]->mRadioResponse != NULL) {
6328 RadioResponseInfo responseInfo = {};
6329 RadioCapability result = {};
6330 responseRadioCapability(responseInfo, serial, responseType, e, response, responseLen,
6331 result);
6332 Return<void> retStatus = radioService[slotId]->mRadioResponse->setRadioCapabilityResponse(
6333 responseInfo, result);
6334 radioService[slotId]->checkReturnStatus(retStatus);
6335 } else {
6336 RLOGE("setRadioCapabilityResponse: radioService[%d]->mRadioResponse == NULL", slotId);
6337 }
6338
6339 return 0;
6340 }
6341
responseLceStatusInfo(RadioResponseInfo & responseInfo,int serial,int responseType,RIL_Errno e,void * response,size_t responseLen)6342 LceStatusInfo responseLceStatusInfo(RadioResponseInfo& responseInfo, int serial, int responseType,
6343 RIL_Errno e, void *response, size_t responseLen) {
6344 populateResponseInfo(responseInfo, serial, responseType, e);
6345 LceStatusInfo result = {};
6346
6347 if (response == NULL || responseLen != sizeof(RIL_LceStatusInfo)) {
6348 RLOGE("Invalid response: NULL");
6349 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
6350 } else {
6351 RIL_LceStatusInfo *resp = (RIL_LceStatusInfo *) response;
6352 result.lceStatus = (LceStatus) resp->lce_status;
6353 result.actualIntervalMs = (uint8_t) resp->actual_interval_ms;
6354 }
6355 return result;
6356 }
6357
startLceServiceResponse(int slotId,int responseType,int serial,RIL_Errno e,void * response,size_t responseLen)6358 int radio::startLceServiceResponse(int slotId,
6359 int responseType, int serial, RIL_Errno e,
6360 void *response, size_t responseLen) {
6361 #if VDBG
6362 RLOGD("startLceServiceResponse: serial %d", serial);
6363 #endif
6364
6365 if (radioService[slotId]->mRadioResponse != NULL) {
6366 RadioResponseInfo responseInfo = {};
6367 LceStatusInfo result = responseLceStatusInfo(responseInfo, serial, responseType, e,
6368 response, responseLen);
6369
6370 Return<void> retStatus
6371 = radioService[slotId]->mRadioResponse->startLceServiceResponse(responseInfo,
6372 result);
6373 radioService[slotId]->checkReturnStatus(retStatus);
6374 } else {
6375 RLOGE("startLceServiceResponse: radioService[%d]->mRadioResponse == NULL", slotId);
6376 }
6377
6378 return 0;
6379 }
6380
stopLceServiceResponse(int slotId,int responseType,int serial,RIL_Errno e,void * response,size_t responseLen)6381 int radio::stopLceServiceResponse(int slotId,
6382 int responseType, int serial, RIL_Errno e,
6383 void *response, size_t responseLen) {
6384 #if VDBG
6385 RLOGD("stopLceServiceResponse: serial %d", serial);
6386 #endif
6387
6388 if (radioService[slotId]->mRadioResponse != NULL) {
6389 RadioResponseInfo responseInfo = {};
6390 LceStatusInfo result = responseLceStatusInfo(responseInfo, serial, responseType, e,
6391 response, responseLen);
6392
6393 Return<void> retStatus
6394 = radioService[slotId]->mRadioResponse->stopLceServiceResponse(responseInfo,
6395 result);
6396 radioService[slotId]->checkReturnStatus(retStatus);
6397 } else {
6398 RLOGE("stopLceServiceResponse: radioService[%d]->mRadioResponse == NULL", slotId);
6399 }
6400
6401 return 0;
6402 }
6403
pullLceDataResponse(int slotId,int responseType,int serial,RIL_Errno e,void * response,size_t responseLen)6404 int radio::pullLceDataResponse(int slotId,
6405 int responseType, int serial, RIL_Errno e,
6406 void *response, size_t responseLen) {
6407 #if VDBG
6408 RLOGD("pullLceDataResponse: serial %d", serial);
6409 #endif
6410
6411 if (radioService[slotId]->mRadioResponse != NULL) {
6412 RadioResponseInfo responseInfo = {};
6413 populateResponseInfo(responseInfo, serial, responseType, e);
6414
6415 LceDataInfo result = {};
6416 if (response == NULL || responseLen != sizeof(RIL_LceDataInfo)) {
6417 RLOGE("pullLceDataResponse: Invalid response");
6418 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
6419 } else {
6420 convertRilLceDataInfoToHal(response, responseLen, result);
6421 }
6422
6423 Return<void> retStatus = radioService[slotId]->mRadioResponse->pullLceDataResponse(
6424 responseInfo, result);
6425 radioService[slotId]->checkReturnStatus(retStatus);
6426 } else {
6427 RLOGE("pullLceDataResponse: radioService[%d]->mRadioResponse == NULL", slotId);
6428 }
6429
6430 return 0;
6431 }
6432
getModemActivityInfoResponse(int slotId,int responseType,int serial,RIL_Errno e,void * response,size_t responseLen)6433 int radio::getModemActivityInfoResponse(int slotId,
6434 int responseType, int serial, RIL_Errno e,
6435 void *response, size_t responseLen) {
6436 #if VDBG
6437 RLOGD("getModemActivityInfoResponse: serial %d", serial);
6438 #endif
6439
6440 if (radioService[slotId]->mRadioResponse != NULL) {
6441 RadioResponseInfo responseInfo = {};
6442 populateResponseInfo(responseInfo, serial, responseType, e);
6443 ActivityStatsInfo info;
6444 if (response == NULL || responseLen != sizeof(RIL_ActivityStatsInfo)) {
6445 RLOGE("getModemActivityInfoResponse Invalid response: NULL");
6446 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
6447 } else {
6448 RIL_ActivityStatsInfo *resp = (RIL_ActivityStatsInfo *)response;
6449 info.sleepModeTimeMs = resp->sleep_mode_time_ms;
6450 info.idleModeTimeMs = resp->idle_mode_time_ms;
6451 for(int i = 0; i < RIL_NUM_TX_POWER_LEVELS; i++) {
6452 info.txmModetimeMs[i] = resp->tx_mode_time_ms[i];
6453 }
6454 info.rxModeTimeMs = resp->rx_mode_time_ms;
6455 }
6456
6457 Return<void> retStatus
6458 = radioService[slotId]->mRadioResponse->getModemActivityInfoResponse(responseInfo,
6459 info);
6460 radioService[slotId]->checkReturnStatus(retStatus);
6461 } else {
6462 RLOGE("getModemActivityInfoResponse: radioService[%d]->mRadioResponse == NULL",
6463 slotId);
6464 }
6465
6466 return 0;
6467 }
6468
setAllowedCarriersResponse(int slotId,int responseType,int serial,RIL_Errno e,void * response,size_t responseLen)6469 int radio::setAllowedCarriersResponse(int slotId,
6470 int responseType, int serial, RIL_Errno e,
6471 void *response, size_t responseLen) {
6472 #if VDBG
6473 RLOGD("setAllowedCarriersResponse: serial %d", serial);
6474 #endif
6475
6476 if (radioService[slotId]->mRadioResponse != NULL) {
6477 RadioResponseInfo responseInfo = {};
6478 int ret = responseInt(responseInfo, serial, responseType, e, response, responseLen);
6479 Return<void> retStatus
6480 = radioService[slotId]->mRadioResponse->setAllowedCarriersResponse(responseInfo,
6481 ret);
6482 radioService[slotId]->checkReturnStatus(retStatus);
6483 } else {
6484 RLOGE("setAllowedCarriersResponse: radioService[%d]->mRadioResponse == NULL",
6485 slotId);
6486 }
6487
6488 return 0;
6489 }
6490
getAllowedCarriersResponse(int slotId,int responseType,int serial,RIL_Errno e,void * response,size_t responseLen)6491 int radio::getAllowedCarriersResponse(int slotId,
6492 int responseType, int serial, RIL_Errno e,
6493 void *response, size_t responseLen) {
6494 #if VDBG
6495 RLOGD("getAllowedCarriersResponse: serial %d", serial);
6496 #endif
6497
6498 if (radioService[slotId]->mRadioResponse != NULL) {
6499 RadioResponseInfo responseInfo = {};
6500 populateResponseInfo(responseInfo, serial, responseType, e);
6501 CarrierRestrictions carrierInfo = {};
6502 bool allAllowed = true;
6503 if (response == NULL) {
6504 #if VDBG
6505 RLOGD("getAllowedCarriersResponse response is NULL: all allowed");
6506 #endif
6507 carrierInfo.allowedCarriers.resize(0);
6508 carrierInfo.excludedCarriers.resize(0);
6509 } else if (responseLen != sizeof(RIL_CarrierRestrictions)) {
6510 RLOGE("getAllowedCarriersResponse Invalid response");
6511 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
6512 } else {
6513 RIL_CarrierRestrictions *pCr = (RIL_CarrierRestrictions *)response;
6514 if (pCr->len_allowed_carriers > 0 || pCr->len_excluded_carriers > 0) {
6515 allAllowed = false;
6516 }
6517
6518 carrierInfo.allowedCarriers.resize(pCr->len_allowed_carriers);
6519 for(int i = 0; i < pCr->len_allowed_carriers; i++) {
6520 RIL_Carrier *carrier = pCr->allowed_carriers + i;
6521 carrierInfo.allowedCarriers[i].mcc = convertCharPtrToHidlString(carrier->mcc);
6522 carrierInfo.allowedCarriers[i].mnc = convertCharPtrToHidlString(carrier->mnc);
6523 carrierInfo.allowedCarriers[i].matchType = (CarrierMatchType) carrier->match_type;
6524 carrierInfo.allowedCarriers[i].matchData =
6525 convertCharPtrToHidlString(carrier->match_data);
6526 }
6527
6528 carrierInfo.excludedCarriers.resize(pCr->len_excluded_carriers);
6529 for(int i = 0; i < pCr->len_excluded_carriers; i++) {
6530 RIL_Carrier *carrier = pCr->excluded_carriers + i;
6531 carrierInfo.excludedCarriers[i].mcc = convertCharPtrToHidlString(carrier->mcc);
6532 carrierInfo.excludedCarriers[i].mnc = convertCharPtrToHidlString(carrier->mnc);
6533 carrierInfo.excludedCarriers[i].matchType = (CarrierMatchType) carrier->match_type;
6534 carrierInfo.excludedCarriers[i].matchData =
6535 convertCharPtrToHidlString(carrier->match_data);
6536 }
6537 }
6538
6539 Return<void> retStatus
6540 = radioService[slotId]->mRadioResponse->getAllowedCarriersResponse(responseInfo,
6541 allAllowed, carrierInfo);
6542 radioService[slotId]->checkReturnStatus(retStatus);
6543 } else {
6544 RLOGE("getAllowedCarriersResponse: radioService[%d]->mRadioResponse == NULL",
6545 slotId);
6546 }
6547
6548 return 0;
6549 }
6550
sendDeviceStateResponse(int slotId,int responseType,int serial,RIL_Errno e,void * response,size_t responselen)6551 int radio::sendDeviceStateResponse(int slotId,
6552 int responseType, int serial, RIL_Errno e,
6553 void *response, size_t responselen) {
6554 #if VDBG
6555 RLOGD("sendDeviceStateResponse: serial %d", serial);
6556 #endif
6557
6558 if (radioService[slotId]->mRadioResponse != NULL) {
6559 RadioResponseInfo responseInfo = {};
6560 populateResponseInfo(responseInfo, serial, responseType, e);
6561 Return<void> retStatus
6562 = radioService[slotId]->mRadioResponse->sendDeviceStateResponse(responseInfo);
6563 radioService[slotId]->checkReturnStatus(retStatus);
6564 } else {
6565 RLOGE("sendDeviceStateResponse: radioService[%d]->mRadioResponse == NULL", slotId);
6566 }
6567
6568 return 0;
6569 }
6570
setCarrierInfoForImsiEncryptionResponse(int slotId,int responseType,int serial,RIL_Errno e,void * response,size_t responseLen)6571 int radio::setCarrierInfoForImsiEncryptionResponse(int slotId,
6572 int responseType, int serial, RIL_Errno e,
6573 void *response, size_t responseLen) {
6574 RLOGD("setCarrierInfoForImsiEncryptionResponse: serial %d", serial);
6575 if (radioService[slotId]->mRadioResponseV1_1 != NULL) {
6576 RadioResponseInfo responseInfo = {};
6577 populateResponseInfo(responseInfo, serial, responseType, e);
6578 Return<void> retStatus = radioService[slotId]->mRadioResponseV1_1->
6579 setCarrierInfoForImsiEncryptionResponse(responseInfo);
6580 radioService[slotId]->checkReturnStatus(retStatus);
6581 } else {
6582 RLOGE("setCarrierInfoForImsiEncryptionResponse: radioService[%d]->mRadioResponseV1_1 == "
6583 "NULL", slotId);
6584 }
6585 return 0;
6586 }
6587
setIndicationFilterResponse(int slotId,int responseType,int serial,RIL_Errno e,void * response,size_t responselen)6588 int radio::setIndicationFilterResponse(int slotId,
6589 int responseType, int serial, RIL_Errno e,
6590 void *response, size_t responselen) {
6591 #if VDBG
6592 RLOGD("setIndicationFilterResponse: serial %d", serial);
6593 #endif
6594
6595 if (radioService[slotId]->mRadioResponse != NULL) {
6596 RadioResponseInfo responseInfo = {};
6597 populateResponseInfo(responseInfo, serial, responseType, e);
6598 Return<void> retStatus
6599 = radioService[slotId]->mRadioResponse->setIndicationFilterResponse(responseInfo);
6600 radioService[slotId]->checkReturnStatus(retStatus);
6601 } else {
6602 RLOGE("setIndicationFilterResponse: radioService[%d]->mRadioResponse == NULL",
6603 slotId);
6604 }
6605
6606 return 0;
6607 }
6608
setSimCardPowerResponse(int slotId,int responseType,int serial,RIL_Errno e,void * response,size_t responseLen)6609 int radio::setSimCardPowerResponse(int slotId,
6610 int responseType, int serial, RIL_Errno e,
6611 void *response, size_t responseLen) {
6612 #if VDBG
6613 RLOGD("setSimCardPowerResponse: serial %d", serial);
6614 #endif
6615
6616 if (radioService[slotId]->mRadioResponse != NULL
6617 || radioService[slotId]->mRadioResponseV1_1 != NULL) {
6618 RadioResponseInfo responseInfo = {};
6619 populateResponseInfo(responseInfo, serial, responseType, e);
6620 if (radioService[slotId]->mRadioResponseV1_1 != NULL) {
6621 Return<void> retStatus = radioService[slotId]->mRadioResponseV1_1->
6622 setSimCardPowerResponse_1_1(responseInfo);
6623 radioService[slotId]->checkReturnStatus(retStatus);
6624 } else {
6625 RLOGD("setSimCardPowerResponse: radioService[%d]->mRadioResponseV1_1 == NULL",
6626 slotId);
6627 Return<void> retStatus
6628 = radioService[slotId]->mRadioResponse->setSimCardPowerResponse(responseInfo);
6629 radioService[slotId]->checkReturnStatus(retStatus);
6630 }
6631 } else {
6632 RLOGE("setSimCardPowerResponse: radioService[%d]->mRadioResponse == NULL && "
6633 "radioService[%d]->mRadioResponseV1_1 == NULL", slotId, slotId);
6634 }
6635 return 0;
6636 }
6637
startNetworkScanResponse(int slotId,int responseType,int serial,RIL_Errno e,void * response,size_t responseLen)6638 int radio::startNetworkScanResponse(int slotId, int responseType, int serial, RIL_Errno e,
6639 void *response, size_t responseLen) {
6640 #if VDBG
6641 RLOGD("startNetworkScanResponse: serial %d", serial);
6642 #endif
6643
6644 if (radioService[slotId]->mRadioResponseV1_1 != NULL) {
6645 RadioResponseInfo responseInfo = {};
6646 populateResponseInfo(responseInfo, serial, responseType, e);
6647 Return<void> retStatus
6648 = radioService[slotId]->mRadioResponseV1_1->startNetworkScanResponse(responseInfo);
6649 radioService[slotId]->checkReturnStatus(retStatus);
6650 } else {
6651 RLOGE("startNetworkScanResponse: radioService[%d]->mRadioResponseV1_1 == NULL", slotId);
6652 }
6653
6654 return 0;
6655 }
6656
stopNetworkScanResponse(int slotId,int responseType,int serial,RIL_Errno e,void * response,size_t responseLen)6657 int radio::stopNetworkScanResponse(int slotId, int responseType, int serial, RIL_Errno e,
6658 void *response, size_t responseLen) {
6659 #if VDBG
6660 RLOGD("stopNetworkScanResponse: serial %d", serial);
6661 #endif
6662
6663 if (radioService[slotId]->mRadioResponseV1_1 != NULL) {
6664 RadioResponseInfo responseInfo = {};
6665 populateResponseInfo(responseInfo, serial, responseType, e);
6666 Return<void> retStatus
6667 = radioService[slotId]->mRadioResponseV1_1->stopNetworkScanResponse(responseInfo);
6668 radioService[slotId]->checkReturnStatus(retStatus);
6669 } else {
6670 RLOGE("stopNetworkScanResponse: radioService[%d]->mRadioResponseV1_1 == NULL", slotId);
6671 }
6672
6673 return 0;
6674 }
6675
convertRilKeepaliveStatusToHal(const RIL_KeepaliveStatus * rilStatus,V1_1::KeepaliveStatus & halStatus)6676 void convertRilKeepaliveStatusToHal(const RIL_KeepaliveStatus *rilStatus,
6677 V1_1::KeepaliveStatus& halStatus) {
6678 halStatus.sessionHandle = rilStatus->sessionHandle;
6679 halStatus.code = static_cast<V1_1::KeepaliveStatusCode>(rilStatus->code);
6680 }
6681
startKeepaliveResponse(int slotId,int responseType,int serial,RIL_Errno e,void * response,size_t responseLen)6682 int radio::startKeepaliveResponse(int slotId, int responseType, int serial, RIL_Errno e,
6683 void *response, size_t responseLen) {
6684 #if VDBG
6685 RLOGD("%s(): %d", __FUNCTION__, serial);
6686 #endif
6687 RadioResponseInfo responseInfo = {};
6688 populateResponseInfo(responseInfo, serial, responseType, e);
6689
6690 // If we don't have a radio service, there's nothing we can do
6691 if (radioService[slotId]->mRadioResponseV1_1 == NULL) {
6692 RLOGE("%s: radioService[%d]->mRadioResponseV1_1 == NULL", __FUNCTION__, slotId);
6693 return 0;
6694 }
6695
6696 V1_1::KeepaliveStatus ks = {};
6697 if (response == NULL || responseLen != sizeof(V1_1::KeepaliveStatus)) {
6698 RLOGE("%s: invalid response - %d", __FUNCTION__, static_cast<int>(e));
6699 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
6700 } else {
6701 convertRilKeepaliveStatusToHal(static_cast<RIL_KeepaliveStatus*>(response), ks);
6702 }
6703
6704 Return<void> retStatus =
6705 radioService[slotId]->mRadioResponseV1_1->startKeepaliveResponse(responseInfo, ks);
6706 radioService[slotId]->checkReturnStatus(retStatus);
6707 return 0;
6708 }
6709
stopKeepaliveResponse(int slotId,int responseType,int serial,RIL_Errno e,void * response,size_t responseLen)6710 int radio::stopKeepaliveResponse(int slotId, int responseType, int serial, RIL_Errno e,
6711 void *response, size_t responseLen) {
6712 #if VDBG
6713 RLOGD("%s(): %d", __FUNCTION__, serial);
6714 #endif
6715 RadioResponseInfo responseInfo = {};
6716 populateResponseInfo(responseInfo, serial, responseType, e);
6717
6718 // If we don't have a radio service, there's nothing we can do
6719 if (radioService[slotId]->mRadioResponseV1_1 == NULL) {
6720 RLOGE("%s: radioService[%d]->mRadioResponseV1_1 == NULL", __FUNCTION__, slotId);
6721 return 0;
6722 }
6723
6724 Return<void> retStatus =
6725 radioService[slotId]->mRadioResponseV1_1->stopKeepaliveResponse(responseInfo);
6726 radioService[slotId]->checkReturnStatus(retStatus);
6727 return 0;
6728 }
6729
6730 /***************************************************************************************************
6731 * INDICATION FUNCTIONS
6732 * The below function handle unsolicited messages coming from the Radio
6733 * (messages for which there is no pending request)
6734 **************************************************************************************************/
6735
convertIntToRadioIndicationType(int indicationType)6736 RadioIndicationType convertIntToRadioIndicationType(int indicationType) {
6737 return indicationType == RESPONSE_UNSOLICITED ? (RadioIndicationType::UNSOLICITED) :
6738 (RadioIndicationType::UNSOLICITED_ACK_EXP);
6739 }
6740
radioStateChangedInd(int slotId,int indicationType,int token,RIL_Errno e,void * response,size_t responseLen)6741 int radio::radioStateChangedInd(int slotId,
6742 int indicationType, int token, RIL_Errno e, void *response,
6743 size_t responseLen) {
6744 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
6745 RadioState radioState =
6746 (RadioState) CALL_ONSTATEREQUEST(slotId);
6747 RLOGD("radioStateChangedInd: radioState %d", radioState);
6748 Return<void> retStatus = radioService[slotId]->mRadioIndication->radioStateChanged(
6749 convertIntToRadioIndicationType(indicationType), radioState);
6750 radioService[slotId]->checkReturnStatus(retStatus);
6751 } else {
6752 RLOGE("radioStateChangedInd: radioService[%d]->mRadioIndication == NULL", slotId);
6753 }
6754
6755 return 0;
6756 }
6757
callStateChangedInd(int slotId,int indicationType,int token,RIL_Errno e,void * response,size_t responseLen)6758 int radio::callStateChangedInd(int slotId,
6759 int indicationType, int token, RIL_Errno e, void *response,
6760 size_t responseLen) {
6761 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
6762 #if VDBG
6763 RLOGD("callStateChangedInd");
6764 #endif
6765 Return<void> retStatus = radioService[slotId]->mRadioIndication->callStateChanged(
6766 convertIntToRadioIndicationType(indicationType));
6767 radioService[slotId]->checkReturnStatus(retStatus);
6768 } else {
6769 RLOGE("callStateChangedInd: radioService[%d]->mRadioIndication == NULL", slotId);
6770 }
6771
6772 return 0;
6773 }
6774
networkStateChangedInd(int slotId,int indicationType,int token,RIL_Errno e,void * response,size_t responseLen)6775 int radio::networkStateChangedInd(int slotId,
6776 int indicationType, int token, RIL_Errno e, void *response,
6777 size_t responseLen) {
6778 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
6779 #if VDBG
6780 RLOGD("networkStateChangedInd");
6781 #endif
6782 Return<void> retStatus = radioService[slotId]->mRadioIndication->networkStateChanged(
6783 convertIntToRadioIndicationType(indicationType));
6784 radioService[slotId]->checkReturnStatus(retStatus);
6785 } else {
6786 RLOGE("networkStateChangedInd: radioService[%d]->mRadioIndication == NULL",
6787 slotId);
6788 }
6789
6790 return 0;
6791 }
6792
hexCharToInt(uint8_t c)6793 uint8_t hexCharToInt(uint8_t c) {
6794 if (c >= '0' && c <= '9') return (c - '0');
6795 if (c >= 'A' && c <= 'F') return (c - 'A' + 10);
6796 if (c >= 'a' && c <= 'f') return (c - 'a' + 10);
6797
6798 return INVALID_HEX_CHAR;
6799 }
6800
convertHexStringToBytes(void * response,size_t responseLen)6801 uint8_t * convertHexStringToBytes(void *response, size_t responseLen) {
6802 if (responseLen % 2 != 0) {
6803 return NULL;
6804 }
6805
6806 uint8_t *bytes = (uint8_t *)calloc(responseLen/2, sizeof(uint8_t));
6807 if (bytes == NULL) {
6808 RLOGE("convertHexStringToBytes: cannot allocate memory for bytes string");
6809 return NULL;
6810 }
6811 uint8_t *hexString = (uint8_t *)response;
6812
6813 for (size_t i = 0; i < responseLen; i += 2) {
6814 uint8_t hexChar1 = hexCharToInt(hexString[i]);
6815 uint8_t hexChar2 = hexCharToInt(hexString[i + 1]);
6816
6817 if (hexChar1 == INVALID_HEX_CHAR || hexChar2 == INVALID_HEX_CHAR) {
6818 RLOGE("convertHexStringToBytes: invalid hex char %d %d",
6819 hexString[i], hexString[i + 1]);
6820 free(bytes);
6821 return NULL;
6822 }
6823 bytes[i/2] = ((hexChar1 << 4) | hexChar2);
6824 }
6825
6826 return bytes;
6827 }
6828
newSmsInd(int slotId,int indicationType,int token,RIL_Errno e,void * response,size_t responseLen)6829 int radio::newSmsInd(int slotId, int indicationType,
6830 int token, RIL_Errno e, void *response, size_t responseLen) {
6831 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
6832 if (response == NULL || responseLen == 0) {
6833 RLOGE("newSmsInd: invalid response");
6834 return 0;
6835 }
6836
6837 uint8_t *bytes = convertHexStringToBytes(response, responseLen);
6838 if (bytes == NULL) {
6839 RLOGE("newSmsInd: convertHexStringToBytes failed");
6840 return 0;
6841 }
6842
6843 hidl_vec<uint8_t> pdu;
6844 pdu.setToExternal(bytes, responseLen/2);
6845 #if VDBG
6846 RLOGD("newSmsInd");
6847 #endif
6848 Return<void> retStatus = radioService[slotId]->mRadioIndication->newSms(
6849 convertIntToRadioIndicationType(indicationType), pdu);
6850 radioService[slotId]->checkReturnStatus(retStatus);
6851 free(bytes);
6852 } else {
6853 RLOGE("newSmsInd: radioService[%d]->mRadioIndication == NULL", slotId);
6854 }
6855
6856 return 0;
6857 }
6858
newSmsStatusReportInd(int slotId,int indicationType,int token,RIL_Errno e,void * response,size_t responseLen)6859 int radio::newSmsStatusReportInd(int slotId,
6860 int indicationType, int token, RIL_Errno e, void *response,
6861 size_t responseLen) {
6862 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
6863 if (response == NULL || responseLen == 0) {
6864 RLOGE("newSmsStatusReportInd: invalid response");
6865 return 0;
6866 }
6867
6868 uint8_t *bytes = convertHexStringToBytes(response, responseLen);
6869 if (bytes == NULL) {
6870 RLOGE("newSmsStatusReportInd: convertHexStringToBytes failed");
6871 return 0;
6872 }
6873
6874 hidl_vec<uint8_t> pdu;
6875 pdu.setToExternal(bytes, responseLen/2);
6876 #if VDBG
6877 RLOGD("newSmsStatusReportInd");
6878 #endif
6879 Return<void> retStatus = radioService[slotId]->mRadioIndication->newSmsStatusReport(
6880 convertIntToRadioIndicationType(indicationType), pdu);
6881 radioService[slotId]->checkReturnStatus(retStatus);
6882 free(bytes);
6883 } else {
6884 RLOGE("newSmsStatusReportInd: radioService[%d]->mRadioIndication == NULL", slotId);
6885 }
6886
6887 return 0;
6888 }
6889
newSmsOnSimInd(int slotId,int indicationType,int token,RIL_Errno e,void * response,size_t responseLen)6890 int radio::newSmsOnSimInd(int slotId, int indicationType,
6891 int token, RIL_Errno e, void *response, size_t responseLen) {
6892 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
6893 if (response == NULL || responseLen != sizeof(int)) {
6894 RLOGE("newSmsOnSimInd: invalid response");
6895 return 0;
6896 }
6897 int32_t recordNumber = ((int32_t *) response)[0];
6898 #if VDBG
6899 RLOGD("newSmsOnSimInd: slotIndex %d", recordNumber);
6900 #endif
6901 Return<void> retStatus = radioService[slotId]->mRadioIndication->newSmsOnSim(
6902 convertIntToRadioIndicationType(indicationType), recordNumber);
6903 radioService[slotId]->checkReturnStatus(retStatus);
6904 } else {
6905 RLOGE("newSmsOnSimInd: radioService[%d]->mRadioIndication == NULL", slotId);
6906 }
6907
6908 return 0;
6909 }
6910
onUssdInd(int slotId,int indicationType,int token,RIL_Errno e,void * response,size_t responseLen)6911 int radio::onUssdInd(int slotId, int indicationType,
6912 int token, RIL_Errno e, void *response, size_t responseLen) {
6913 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
6914 if (response == NULL || responseLen != 2 * sizeof(char *)) {
6915 RLOGE("onUssdInd: invalid response");
6916 return 0;
6917 }
6918 char **strings = (char **) response;
6919 char *mode = strings[0];
6920 hidl_string msg = convertCharPtrToHidlString(strings[1]);
6921 UssdModeType modeType = (UssdModeType) atoi(mode);
6922 #if VDBG
6923 RLOGD("onUssdInd: mode %s", mode);
6924 #endif
6925 Return<void> retStatus = radioService[slotId]->mRadioIndication->onUssd(
6926 convertIntToRadioIndicationType(indicationType), modeType, msg);
6927 radioService[slotId]->checkReturnStatus(retStatus);
6928 } else {
6929 RLOGE("onUssdInd: radioService[%d]->mRadioIndication == NULL", slotId);
6930 }
6931
6932 return 0;
6933 }
6934
nitzTimeReceivedInd(int slotId,int indicationType,int token,RIL_Errno e,void * response,size_t responseLen)6935 int radio::nitzTimeReceivedInd(int slotId,
6936 int indicationType, int token, RIL_Errno e, void *response,
6937 size_t responseLen) {
6938 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
6939 if (response == NULL || responseLen == 0) {
6940 RLOGE("nitzTimeReceivedInd: invalid response");
6941 return 0;
6942 }
6943 hidl_string nitzTime = convertCharPtrToHidlString((char *) response);
6944 #if VDBG
6945 RLOGD("nitzTimeReceivedInd: nitzTime %s receivedTime %" PRId64, nitzTime.c_str(),
6946 nitzTimeReceived[slotId]);
6947 #endif
6948 Return<void> retStatus = radioService[slotId]->mRadioIndication->nitzTimeReceived(
6949 convertIntToRadioIndicationType(indicationType), nitzTime,
6950 nitzTimeReceived[slotId]);
6951 radioService[slotId]->checkReturnStatus(retStatus);
6952 } else {
6953 RLOGE("nitzTimeReceivedInd: radioService[%d]->mRadioIndication == NULL", slotId);
6954 return -1;
6955 }
6956
6957 return 0;
6958 }
6959
convertRilSignalStrengthToHal(void * response,size_t responseLen,SignalStrength & signalStrength)6960 void convertRilSignalStrengthToHal(void *response, size_t responseLen,
6961 SignalStrength& signalStrength) {
6962 RIL_SignalStrength_v10 *rilSignalStrength = (RIL_SignalStrength_v10 *) response;
6963
6964 // Fixup LTE for backwards compatibility
6965 // signalStrength: -1 -> 99
6966 if (rilSignalStrength->LTE_SignalStrength.signalStrength == -1) {
6967 rilSignalStrength->LTE_SignalStrength.signalStrength = 99;
6968 }
6969 // rsrp: -1 -> INT_MAX all other negative value to positive.
6970 // So remap here
6971 if (rilSignalStrength->LTE_SignalStrength.rsrp == -1) {
6972 rilSignalStrength->LTE_SignalStrength.rsrp = INT_MAX;
6973 } else if (rilSignalStrength->LTE_SignalStrength.rsrp < -1) {
6974 rilSignalStrength->LTE_SignalStrength.rsrp = -rilSignalStrength->LTE_SignalStrength.rsrp;
6975 }
6976 // rsrq: -1 -> INT_MAX
6977 if (rilSignalStrength->LTE_SignalStrength.rsrq == -1) {
6978 rilSignalStrength->LTE_SignalStrength.rsrq = INT_MAX;
6979 }
6980 // Not remapping rssnr is already using INT_MAX
6981 // cqi: -1 -> INT_MAX
6982 if (rilSignalStrength->LTE_SignalStrength.cqi == -1) {
6983 rilSignalStrength->LTE_SignalStrength.cqi = INT_MAX;
6984 }
6985
6986 signalStrength.gw.signalStrength = rilSignalStrength->GW_SignalStrength.signalStrength;
6987 signalStrength.gw.bitErrorRate = rilSignalStrength->GW_SignalStrength.bitErrorRate;
6988 // RIL_SignalStrength_v10 not support gw.timingAdvance. Set to INT_MAX as
6989 // invalid value.
6990 signalStrength.gw.timingAdvance = INT_MAX;
6991
6992 signalStrength.cdma.dbm = rilSignalStrength->CDMA_SignalStrength.dbm;
6993 signalStrength.cdma.ecio = rilSignalStrength->CDMA_SignalStrength.ecio;
6994 signalStrength.evdo.dbm = rilSignalStrength->EVDO_SignalStrength.dbm;
6995 signalStrength.evdo.ecio = rilSignalStrength->EVDO_SignalStrength.ecio;
6996 signalStrength.evdo.signalNoiseRatio =
6997 rilSignalStrength->EVDO_SignalStrength.signalNoiseRatio;
6998 signalStrength.lte.signalStrength = rilSignalStrength->LTE_SignalStrength.signalStrength;
6999 signalStrength.lte.rsrp = rilSignalStrength->LTE_SignalStrength.rsrp;
7000 signalStrength.lte.rsrq = rilSignalStrength->LTE_SignalStrength.rsrq;
7001 signalStrength.lte.rssnr = rilSignalStrength->LTE_SignalStrength.rssnr;
7002 signalStrength.lte.cqi = rilSignalStrength->LTE_SignalStrength.cqi;
7003 signalStrength.lte.timingAdvance = rilSignalStrength->LTE_SignalStrength.timingAdvance;
7004 signalStrength.tdScdma.rscp = rilSignalStrength->TD_SCDMA_SignalStrength.rscp;
7005 }
7006
currentSignalStrengthInd(int slotId,int indicationType,int token,RIL_Errno e,void * response,size_t responseLen)7007 int radio::currentSignalStrengthInd(int slotId,
7008 int indicationType, int token, RIL_Errno e,
7009 void *response, size_t responseLen) {
7010 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
7011 if (response == NULL || responseLen != sizeof(RIL_SignalStrength_v10)) {
7012 RLOGE("currentSignalStrengthInd: invalid response");
7013 return 0;
7014 }
7015
7016 SignalStrength signalStrength = {};
7017 convertRilSignalStrengthToHal(response, responseLen, signalStrength);
7018
7019 #if VDBG
7020 RLOGD("currentSignalStrengthInd");
7021 #endif
7022 Return<void> retStatus = radioService[slotId]->mRadioIndication->currentSignalStrength(
7023 convertIntToRadioIndicationType(indicationType), signalStrength);
7024 radioService[slotId]->checkReturnStatus(retStatus);
7025 } else {
7026 RLOGE("currentSignalStrengthInd: radioService[%d]->mRadioIndication == NULL",
7027 slotId);
7028 }
7029
7030 return 0;
7031 }
7032
convertRilDataCallToHal(RIL_Data_Call_Response_v11 * dcResponse,SetupDataCallResult & dcResult)7033 void convertRilDataCallToHal(RIL_Data_Call_Response_v11 *dcResponse,
7034 SetupDataCallResult& dcResult) {
7035 dcResult.status = (DataCallFailCause) dcResponse->status;
7036 dcResult.suggestedRetryTime = dcResponse->suggestedRetryTime;
7037 dcResult.cid = dcResponse->cid;
7038 dcResult.active = dcResponse->active;
7039 dcResult.type = convertCharPtrToHidlString(dcResponse->type);
7040 dcResult.ifname = convertCharPtrToHidlString(dcResponse->ifname);
7041 dcResult.addresses = convertCharPtrToHidlString(dcResponse->addresses);
7042 dcResult.dnses = convertCharPtrToHidlString(dcResponse->dnses);
7043 dcResult.gateways = convertCharPtrToHidlString(dcResponse->gateways);
7044 dcResult.pcscf = convertCharPtrToHidlString(dcResponse->pcscf);
7045 dcResult.mtu = dcResponse->mtu;
7046 }
7047
convertRilDataCallListToHal(void * response,size_t responseLen,hidl_vec<SetupDataCallResult> & dcResultList)7048 void convertRilDataCallListToHal(void *response, size_t responseLen,
7049 hidl_vec<SetupDataCallResult>& dcResultList) {
7050 int num = responseLen / sizeof(RIL_Data_Call_Response_v11);
7051
7052 RIL_Data_Call_Response_v11 *dcResponse = (RIL_Data_Call_Response_v11 *) response;
7053 dcResultList.resize(num);
7054 for (int i = 0; i < num; i++) {
7055 convertRilDataCallToHal(&dcResponse[i], dcResultList[i]);
7056 }
7057 }
7058
dataCallListChangedInd(int slotId,int indicationType,int token,RIL_Errno e,void * response,size_t responseLen)7059 int radio::dataCallListChangedInd(int slotId,
7060 int indicationType, int token, RIL_Errno e, void *response,
7061 size_t responseLen) {
7062 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
7063 if ((response == NULL && responseLen != 0)
7064 || responseLen % sizeof(RIL_Data_Call_Response_v11) != 0) {
7065 RLOGE("dataCallListChangedInd: invalid response");
7066 return 0;
7067 }
7068 hidl_vec<SetupDataCallResult> dcList;
7069 convertRilDataCallListToHal(response, responseLen, dcList);
7070 #if VDBG
7071 RLOGD("dataCallListChangedInd");
7072 #endif
7073 Return<void> retStatus = radioService[slotId]->mRadioIndication->dataCallListChanged(
7074 convertIntToRadioIndicationType(indicationType), dcList);
7075 radioService[slotId]->checkReturnStatus(retStatus);
7076 } else {
7077 RLOGE("dataCallListChangedInd: radioService[%d]->mRadioIndication == NULL", slotId);
7078 }
7079
7080 return 0;
7081 }
7082
suppSvcNotifyInd(int slotId,int indicationType,int token,RIL_Errno e,void * response,size_t responseLen)7083 int radio::suppSvcNotifyInd(int slotId, int indicationType,
7084 int token, RIL_Errno e, void *response, size_t responseLen) {
7085 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
7086 if (response == NULL || responseLen != sizeof(RIL_SuppSvcNotification)) {
7087 RLOGE("suppSvcNotifyInd: invalid response");
7088 return 0;
7089 }
7090
7091 SuppSvcNotification suppSvc = {};
7092 RIL_SuppSvcNotification *ssn = (RIL_SuppSvcNotification *) response;
7093 suppSvc.isMT = ssn->notificationType;
7094 suppSvc.code = ssn->code;
7095 suppSvc.index = ssn->index;
7096 suppSvc.type = ssn->type;
7097 suppSvc.number = convertCharPtrToHidlString(ssn->number);
7098
7099 #if VDBG
7100 RLOGD("suppSvcNotifyInd: isMT %d code %d index %d type %d",
7101 suppSvc.isMT, suppSvc.code, suppSvc.index, suppSvc.type);
7102 #endif
7103 Return<void> retStatus = radioService[slotId]->mRadioIndication->suppSvcNotify(
7104 convertIntToRadioIndicationType(indicationType), suppSvc);
7105 radioService[slotId]->checkReturnStatus(retStatus);
7106 } else {
7107 RLOGE("suppSvcNotifyInd: radioService[%d]->mRadioIndication == NULL", slotId);
7108 }
7109
7110 return 0;
7111 }
7112
stkSessionEndInd(int slotId,int indicationType,int token,RIL_Errno e,void * response,size_t responseLen)7113 int radio::stkSessionEndInd(int slotId, int indicationType,
7114 int token, RIL_Errno e, void *response, size_t responseLen) {
7115 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
7116 #if VDBG
7117 RLOGD("stkSessionEndInd");
7118 #endif
7119 Return<void> retStatus = radioService[slotId]->mRadioIndication->stkSessionEnd(
7120 convertIntToRadioIndicationType(indicationType));
7121 radioService[slotId]->checkReturnStatus(retStatus);
7122 } else {
7123 RLOGE("stkSessionEndInd: radioService[%d]->mRadioIndication == NULL", slotId);
7124 }
7125
7126 return 0;
7127 }
7128
stkProactiveCommandInd(int slotId,int indicationType,int token,RIL_Errno e,void * response,size_t responseLen)7129 int radio::stkProactiveCommandInd(int slotId,
7130 int indicationType, int token, RIL_Errno e, void *response,
7131 size_t responseLen) {
7132 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
7133 if (response == NULL || responseLen == 0) {
7134 RLOGE("stkProactiveCommandInd: invalid response");
7135 return 0;
7136 }
7137 #if VDBG
7138 RLOGD("stkProactiveCommandInd");
7139 #endif
7140 Return<void> retStatus = radioService[slotId]->mRadioIndication->stkProactiveCommand(
7141 convertIntToRadioIndicationType(indicationType),
7142 convertCharPtrToHidlString((char *) response));
7143 radioService[slotId]->checkReturnStatus(retStatus);
7144 } else {
7145 RLOGE("stkProactiveCommandInd: radioService[%d]->mRadioIndication == NULL", slotId);
7146 }
7147
7148 return 0;
7149 }
7150
stkEventNotifyInd(int slotId,int indicationType,int token,RIL_Errno e,void * response,size_t responseLen)7151 int radio::stkEventNotifyInd(int slotId, int indicationType,
7152 int token, RIL_Errno e, void *response, size_t responseLen) {
7153 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
7154 if (response == NULL || responseLen == 0) {
7155 RLOGE("stkEventNotifyInd: invalid response");
7156 return 0;
7157 }
7158 #if VDBG
7159 RLOGD("stkEventNotifyInd");
7160 #endif
7161 Return<void> retStatus = radioService[slotId]->mRadioIndication->stkEventNotify(
7162 convertIntToRadioIndicationType(indicationType),
7163 convertCharPtrToHidlString((char *) response));
7164 radioService[slotId]->checkReturnStatus(retStatus);
7165 } else {
7166 RLOGE("stkEventNotifyInd: radioService[%d]->mRadioIndication == NULL", slotId);
7167 }
7168
7169 return 0;
7170 }
7171
stkCallSetupInd(int slotId,int indicationType,int token,RIL_Errno e,void * response,size_t responseLen)7172 int radio::stkCallSetupInd(int slotId, int indicationType,
7173 int token, RIL_Errno e, void *response, size_t responseLen) {
7174 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
7175 if (response == NULL || responseLen != sizeof(int)) {
7176 RLOGE("stkCallSetupInd: invalid response");
7177 return 0;
7178 }
7179 int32_t timeout = ((int32_t *) response)[0];
7180 #if VDBG
7181 RLOGD("stkCallSetupInd: timeout %d", timeout);
7182 #endif
7183 Return<void> retStatus = radioService[slotId]->mRadioIndication->stkCallSetup(
7184 convertIntToRadioIndicationType(indicationType), timeout);
7185 radioService[slotId]->checkReturnStatus(retStatus);
7186 } else {
7187 RLOGE("stkCallSetupInd: radioService[%d]->mRadioIndication == NULL", slotId);
7188 }
7189
7190 return 0;
7191 }
7192
simSmsStorageFullInd(int slotId,int indicationType,int token,RIL_Errno e,void * response,size_t responseLen)7193 int radio::simSmsStorageFullInd(int slotId,
7194 int indicationType, int token, RIL_Errno e, void *response,
7195 size_t responseLen) {
7196 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
7197 #if VDBG
7198 RLOGD("simSmsStorageFullInd");
7199 #endif
7200 Return<void> retStatus = radioService[slotId]->mRadioIndication->simSmsStorageFull(
7201 convertIntToRadioIndicationType(indicationType));
7202 radioService[slotId]->checkReturnStatus(retStatus);
7203 } else {
7204 RLOGE("simSmsStorageFullInd: radioService[%d]->mRadioIndication == NULL", slotId);
7205 }
7206
7207 return 0;
7208 }
7209
simRefreshInd(int slotId,int indicationType,int token,RIL_Errno e,void * response,size_t responseLen)7210 int radio::simRefreshInd(int slotId, int indicationType,
7211 int token, RIL_Errno e, void *response, size_t responseLen) {
7212 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
7213 if (response == NULL || responseLen != sizeof(RIL_SimRefreshResponse_v7)) {
7214 RLOGE("simRefreshInd: invalid response");
7215 return 0;
7216 }
7217
7218 SimRefreshResult refreshResult = {};
7219 RIL_SimRefreshResponse_v7 *simRefreshResponse = ((RIL_SimRefreshResponse_v7 *) response);
7220 refreshResult.type =
7221 (V1_0::SimRefreshType) simRefreshResponse->result;
7222 refreshResult.efId = simRefreshResponse->ef_id;
7223 refreshResult.aid = convertCharPtrToHidlString(simRefreshResponse->aid);
7224
7225 #if VDBG
7226 RLOGD("simRefreshInd: type %d efId %d", refreshResult.type, refreshResult.efId);
7227 #endif
7228 Return<void> retStatus = radioService[slotId]->mRadioIndication->simRefresh(
7229 convertIntToRadioIndicationType(indicationType), refreshResult);
7230 radioService[slotId]->checkReturnStatus(retStatus);
7231 } else {
7232 RLOGE("simRefreshInd: radioService[%d]->mRadioIndication == NULL", slotId);
7233 }
7234
7235 return 0;
7236 }
7237
convertRilCdmaSignalInfoRecordToHal(RIL_CDMA_SignalInfoRecord * signalInfoRecord,CdmaSignalInfoRecord & record)7238 void convertRilCdmaSignalInfoRecordToHal(RIL_CDMA_SignalInfoRecord *signalInfoRecord,
7239 CdmaSignalInfoRecord& record) {
7240 record.isPresent = signalInfoRecord->isPresent;
7241 record.signalType = signalInfoRecord->signalType;
7242 record.alertPitch = signalInfoRecord->alertPitch;
7243 record.signal = signalInfoRecord->signal;
7244 }
7245
callRingInd(int slotId,int indicationType,int token,RIL_Errno e,void * response,size_t responseLen)7246 int radio::callRingInd(int slotId, int indicationType,
7247 int token, RIL_Errno e, void *response, size_t responseLen) {
7248 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
7249 bool isGsm;
7250 CdmaSignalInfoRecord record = {};
7251 if (response == NULL || responseLen == 0) {
7252 isGsm = true;
7253 } else {
7254 isGsm = false;
7255 if (responseLen != sizeof (RIL_CDMA_SignalInfoRecord)) {
7256 RLOGE("callRingInd: invalid response");
7257 return 0;
7258 }
7259 convertRilCdmaSignalInfoRecordToHal((RIL_CDMA_SignalInfoRecord *) response, record);
7260 }
7261
7262 #if VDBG
7263 RLOGD("callRingInd: isGsm %d", isGsm);
7264 #endif
7265 Return<void> retStatus = radioService[slotId]->mRadioIndication->callRing(
7266 convertIntToRadioIndicationType(indicationType), isGsm, record);
7267 radioService[slotId]->checkReturnStatus(retStatus);
7268 } else {
7269 RLOGE("callRingInd: radioService[%d]->mRadioIndication == NULL", slotId);
7270 }
7271
7272 return 0;
7273 }
7274
simStatusChangedInd(int slotId,int indicationType,int token,RIL_Errno e,void * response,size_t responseLen)7275 int radio::simStatusChangedInd(int slotId,
7276 int indicationType, int token, RIL_Errno e, void *response,
7277 size_t responseLen) {
7278 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
7279 #if VDBG
7280 RLOGD("simStatusChangedInd");
7281 #endif
7282 Return<void> retStatus = radioService[slotId]->mRadioIndication->simStatusChanged(
7283 convertIntToRadioIndicationType(indicationType));
7284 radioService[slotId]->checkReturnStatus(retStatus);
7285 } else {
7286 RLOGE("simStatusChangedInd: radioService[%d]->mRadioIndication == NULL", slotId);
7287 }
7288
7289 return 0;
7290 }
7291
cdmaNewSmsInd(int slotId,int indicationType,int token,RIL_Errno e,void * response,size_t responseLen)7292 int radio::cdmaNewSmsInd(int slotId, int indicationType,
7293 int token, RIL_Errno e, void *response, size_t responseLen) {
7294 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
7295 if (response == NULL || responseLen != sizeof(RIL_CDMA_SMS_Message)) {
7296 RLOGE("cdmaNewSmsInd: invalid response");
7297 return 0;
7298 }
7299
7300 CdmaSmsMessage msg = {};
7301 RIL_CDMA_SMS_Message *rilMsg = (RIL_CDMA_SMS_Message *) response;
7302 msg.teleserviceId = rilMsg->uTeleserviceID;
7303 msg.isServicePresent = rilMsg->bIsServicePresent;
7304 msg.serviceCategory = rilMsg->uServicecategory;
7305 msg.address.digitMode =
7306 (V1_0::CdmaSmsDigitMode) rilMsg->sAddress.digit_mode;
7307 msg.address.numberMode =
7308 (V1_0::CdmaSmsNumberMode) rilMsg->sAddress.number_mode;
7309 msg.address.numberType =
7310 (V1_0::CdmaSmsNumberType) rilMsg->sAddress.number_type;
7311 msg.address.numberPlan =
7312 (V1_0::CdmaSmsNumberPlan) rilMsg->sAddress.number_plan;
7313
7314 int digitLimit = MIN((rilMsg->sAddress.number_of_digits), RIL_CDMA_SMS_ADDRESS_MAX);
7315 msg.address.digits.setToExternal(rilMsg->sAddress.digits, digitLimit);
7316
7317 msg.subAddress.subaddressType = (V1_0::CdmaSmsSubaddressType)
7318 rilMsg->sSubAddress.subaddressType;
7319 msg.subAddress.odd = rilMsg->sSubAddress.odd;
7320
7321 digitLimit= MIN((rilMsg->sSubAddress.number_of_digits), RIL_CDMA_SMS_SUBADDRESS_MAX);
7322 msg.subAddress.digits.setToExternal(rilMsg->sSubAddress.digits, digitLimit);
7323
7324 digitLimit = MIN((rilMsg->uBearerDataLen), RIL_CDMA_SMS_BEARER_DATA_MAX);
7325 msg.bearerData.setToExternal(rilMsg->aBearerData, digitLimit);
7326
7327 #if VDBG
7328 RLOGD("cdmaNewSmsInd");
7329 #endif
7330 Return<void> retStatus = radioService[slotId]->mRadioIndication->cdmaNewSms(
7331 convertIntToRadioIndicationType(indicationType), msg);
7332 radioService[slotId]->checkReturnStatus(retStatus);
7333 } else {
7334 RLOGE("cdmaNewSmsInd: radioService[%d]->mRadioIndication == NULL", slotId);
7335 }
7336
7337 return 0;
7338 }
7339
newBroadcastSmsInd(int slotId,int indicationType,int token,RIL_Errno e,void * response,size_t responseLen)7340 int radio::newBroadcastSmsInd(int slotId,
7341 int indicationType, int token, RIL_Errno e, void *response,
7342 size_t responseLen) {
7343 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
7344 if (response == NULL || responseLen == 0) {
7345 RLOGE("newBroadcastSmsInd: invalid response");
7346 return 0;
7347 }
7348
7349 hidl_vec<uint8_t> data;
7350 data.setToExternal((uint8_t *) response, responseLen);
7351 #if VDBG
7352 RLOGD("newBroadcastSmsInd");
7353 #endif
7354 Return<void> retStatus = radioService[slotId]->mRadioIndication->newBroadcastSms(
7355 convertIntToRadioIndicationType(indicationType), data);
7356 radioService[slotId]->checkReturnStatus(retStatus);
7357 } else {
7358 RLOGE("newBroadcastSmsInd: radioService[%d]->mRadioIndication == NULL", slotId);
7359 }
7360
7361 return 0;
7362 }
7363
cdmaRuimSmsStorageFullInd(int slotId,int indicationType,int token,RIL_Errno e,void * response,size_t responseLen)7364 int radio::cdmaRuimSmsStorageFullInd(int slotId,
7365 int indicationType, int token, RIL_Errno e, void *response,
7366 size_t responseLen) {
7367 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
7368 #if VDBG
7369 RLOGD("cdmaRuimSmsStorageFullInd");
7370 #endif
7371 Return<void> retStatus = radioService[slotId]->mRadioIndication->cdmaRuimSmsStorageFull(
7372 convertIntToRadioIndicationType(indicationType));
7373 radioService[slotId]->checkReturnStatus(retStatus);
7374 } else {
7375 RLOGE("cdmaRuimSmsStorageFullInd: radioService[%d]->mRadioIndication == NULL",
7376 slotId);
7377 }
7378
7379 return 0;
7380 }
7381
restrictedStateChangedInd(int slotId,int indicationType,int token,RIL_Errno e,void * response,size_t responseLen)7382 int radio::restrictedStateChangedInd(int slotId,
7383 int indicationType, int token, RIL_Errno e, void *response,
7384 size_t responseLen) {
7385 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
7386 if (response == NULL || responseLen != sizeof(int)) {
7387 RLOGE("restrictedStateChangedInd: invalid response");
7388 return 0;
7389 }
7390 int32_t state = ((int32_t *) response)[0];
7391 #if VDBG
7392 RLOGD("restrictedStateChangedInd: state %d", state);
7393 #endif
7394 Return<void> retStatus = radioService[slotId]->mRadioIndication->restrictedStateChanged(
7395 convertIntToRadioIndicationType(indicationType), (PhoneRestrictedState) state);
7396 radioService[slotId]->checkReturnStatus(retStatus);
7397 } else {
7398 RLOGE("restrictedStateChangedInd: radioService[%d]->mRadioIndication == NULL",
7399 slotId);
7400 }
7401
7402 return 0;
7403 }
7404
enterEmergencyCallbackModeInd(int slotId,int indicationType,int token,RIL_Errno e,void * response,size_t responseLen)7405 int radio::enterEmergencyCallbackModeInd(int slotId,
7406 int indicationType, int token, RIL_Errno e, void *response,
7407 size_t responseLen) {
7408 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
7409 #if VDBG
7410 RLOGD("enterEmergencyCallbackModeInd");
7411 #endif
7412 Return<void> retStatus = radioService[slotId]->mRadioIndication->enterEmergencyCallbackMode(
7413 convertIntToRadioIndicationType(indicationType));
7414 radioService[slotId]->checkReturnStatus(retStatus);
7415 } else {
7416 RLOGE("enterEmergencyCallbackModeInd: radioService[%d]->mRadioIndication == NULL",
7417 slotId);
7418 }
7419
7420 return 0;
7421 }
7422
cdmaCallWaitingInd(int slotId,int indicationType,int token,RIL_Errno e,void * response,size_t responseLen)7423 int radio::cdmaCallWaitingInd(int slotId,
7424 int indicationType, int token, RIL_Errno e, void *response,
7425 size_t responseLen) {
7426 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
7427 if (response == NULL || responseLen != sizeof(RIL_CDMA_CallWaiting_v6)) {
7428 RLOGE("cdmaCallWaitingInd: invalid response");
7429 return 0;
7430 }
7431
7432 CdmaCallWaiting callWaitingRecord = {};
7433 RIL_CDMA_CallWaiting_v6 *callWaitingRil = ((RIL_CDMA_CallWaiting_v6 *) response);
7434 callWaitingRecord.number = convertCharPtrToHidlString(callWaitingRil->number);
7435 callWaitingRecord.numberPresentation =
7436 (CdmaCallWaitingNumberPresentation) callWaitingRil->numberPresentation;
7437 callWaitingRecord.name = convertCharPtrToHidlString(callWaitingRil->name);
7438 convertRilCdmaSignalInfoRecordToHal(&callWaitingRil->signalInfoRecord,
7439 callWaitingRecord.signalInfoRecord);
7440 callWaitingRecord.numberType = (CdmaCallWaitingNumberType) callWaitingRil->number_type;
7441 callWaitingRecord.numberPlan = (CdmaCallWaitingNumberPlan) callWaitingRil->number_plan;
7442
7443 #if VDBG
7444 RLOGD("cdmaCallWaitingInd");
7445 #endif
7446 Return<void> retStatus = radioService[slotId]->mRadioIndication->cdmaCallWaiting(
7447 convertIntToRadioIndicationType(indicationType), callWaitingRecord);
7448 radioService[slotId]->checkReturnStatus(retStatus);
7449 } else {
7450 RLOGE("cdmaCallWaitingInd: radioService[%d]->mRadioIndication == NULL", slotId);
7451 }
7452
7453 return 0;
7454 }
7455
cdmaOtaProvisionStatusInd(int slotId,int indicationType,int token,RIL_Errno e,void * response,size_t responseLen)7456 int radio::cdmaOtaProvisionStatusInd(int slotId,
7457 int indicationType, int token, RIL_Errno e, void *response,
7458 size_t responseLen) {
7459 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
7460 if (response == NULL || responseLen != sizeof(int)) {
7461 RLOGE("cdmaOtaProvisionStatusInd: invalid response");
7462 return 0;
7463 }
7464 int32_t status = ((int32_t *) response)[0];
7465 #if VDBG
7466 RLOGD("cdmaOtaProvisionStatusInd: status %d", status);
7467 #endif
7468 Return<void> retStatus = radioService[slotId]->mRadioIndication->cdmaOtaProvisionStatus(
7469 convertIntToRadioIndicationType(indicationType), (CdmaOtaProvisionStatus) status);
7470 radioService[slotId]->checkReturnStatus(retStatus);
7471 } else {
7472 RLOGE("cdmaOtaProvisionStatusInd: radioService[%d]->mRadioIndication == NULL",
7473 slotId);
7474 }
7475
7476 return 0;
7477 }
7478
cdmaInfoRecInd(int slotId,int indicationType,int token,RIL_Errno e,void * response,size_t responseLen)7479 int radio::cdmaInfoRecInd(int slotId,
7480 int indicationType, int token, RIL_Errno e, void *response,
7481 size_t responseLen) {
7482 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
7483 if (response == NULL || responseLen != sizeof(RIL_CDMA_InformationRecords)) {
7484 RLOGE("cdmaInfoRecInd: invalid response");
7485 return 0;
7486 }
7487
7488 CdmaInformationRecords records = {};
7489 RIL_CDMA_InformationRecords *recordsRil = (RIL_CDMA_InformationRecords *) response;
7490
7491 char* string8 = NULL;
7492 int num = MIN(recordsRil->numberOfInfoRecs, RIL_CDMA_MAX_NUMBER_OF_INFO_RECS);
7493 if (recordsRil->numberOfInfoRecs > RIL_CDMA_MAX_NUMBER_OF_INFO_RECS) {
7494 RLOGE("cdmaInfoRecInd: received %d recs which is more than %d, dropping "
7495 "additional ones", recordsRil->numberOfInfoRecs,
7496 RIL_CDMA_MAX_NUMBER_OF_INFO_RECS);
7497 }
7498 records.infoRec.resize(num);
7499 for (int i = 0 ; i < num ; i++) {
7500 CdmaInformationRecord *record = &records.infoRec[i];
7501 RIL_CDMA_InformationRecord *infoRec = &recordsRil->infoRec[i];
7502 record->name = (CdmaInfoRecName) infoRec->name;
7503 // All vectors should be size 0 except one which will be size 1. Set everything to
7504 // size 0 initially.
7505 record->display.resize(0);
7506 record->number.resize(0);
7507 record->signal.resize(0);
7508 record->redir.resize(0);
7509 record->lineCtrl.resize(0);
7510 record->clir.resize(0);
7511 record->audioCtrl.resize(0);
7512 switch (infoRec->name) {
7513 case RIL_CDMA_DISPLAY_INFO_REC:
7514 case RIL_CDMA_EXTENDED_DISPLAY_INFO_REC: {
7515 if (infoRec->rec.display.alpha_len > CDMA_ALPHA_INFO_BUFFER_LENGTH) {
7516 RLOGE("cdmaInfoRecInd: invalid display info response length %d "
7517 "expected not more than %d", (int) infoRec->rec.display.alpha_len,
7518 CDMA_ALPHA_INFO_BUFFER_LENGTH);
7519 return 0;
7520 }
7521 string8 = (char*) malloc((infoRec->rec.display.alpha_len + 1) * sizeof(char));
7522 if (string8 == NULL) {
7523 RLOGE("cdmaInfoRecInd: Memory allocation failed for "
7524 "responseCdmaInformationRecords");
7525 return 0;
7526 }
7527 memcpy(string8, infoRec->rec.display.alpha_buf, infoRec->rec.display.alpha_len);
7528 string8[(int)infoRec->rec.display.alpha_len] = '\0';
7529
7530 record->display.resize(1);
7531 record->display[0].alphaBuf = string8;
7532 free(string8);
7533 string8 = NULL;
7534 break;
7535 }
7536
7537 case RIL_CDMA_CALLED_PARTY_NUMBER_INFO_REC:
7538 case RIL_CDMA_CALLING_PARTY_NUMBER_INFO_REC:
7539 case RIL_CDMA_CONNECTED_NUMBER_INFO_REC: {
7540 if (infoRec->rec.number.len > CDMA_NUMBER_INFO_BUFFER_LENGTH) {
7541 RLOGE("cdmaInfoRecInd: invalid display info response length %d "
7542 "expected not more than %d", (int) infoRec->rec.number.len,
7543 CDMA_NUMBER_INFO_BUFFER_LENGTH);
7544 return 0;
7545 }
7546 string8 = (char*) malloc((infoRec->rec.number.len + 1) * sizeof(char));
7547 if (string8 == NULL) {
7548 RLOGE("cdmaInfoRecInd: Memory allocation failed for "
7549 "responseCdmaInformationRecords");
7550 return 0;
7551 }
7552 memcpy(string8, infoRec->rec.number.buf, infoRec->rec.number.len);
7553 string8[(int)infoRec->rec.number.len] = '\0';
7554
7555 record->number.resize(1);
7556 record->number[0].number = string8;
7557 free(string8);
7558 string8 = NULL;
7559 record->number[0].numberType = infoRec->rec.number.number_type;
7560 record->number[0].numberPlan = infoRec->rec.number.number_plan;
7561 record->number[0].pi = infoRec->rec.number.pi;
7562 record->number[0].si = infoRec->rec.number.si;
7563 break;
7564 }
7565
7566 case RIL_CDMA_SIGNAL_INFO_REC: {
7567 record->signal.resize(1);
7568 record->signal[0].isPresent = infoRec->rec.signal.isPresent;
7569 record->signal[0].signalType = infoRec->rec.signal.signalType;
7570 record->signal[0].alertPitch = infoRec->rec.signal.alertPitch;
7571 record->signal[0].signal = infoRec->rec.signal.signal;
7572 break;
7573 }
7574
7575 case RIL_CDMA_REDIRECTING_NUMBER_INFO_REC: {
7576 if (infoRec->rec.redir.redirectingNumber.len >
7577 CDMA_NUMBER_INFO_BUFFER_LENGTH) {
7578 RLOGE("cdmaInfoRecInd: invalid display info response length %d "
7579 "expected not more than %d\n",
7580 (int)infoRec->rec.redir.redirectingNumber.len,
7581 CDMA_NUMBER_INFO_BUFFER_LENGTH);
7582 return 0;
7583 }
7584 string8 = (char*) malloc((infoRec->rec.redir.redirectingNumber.len + 1) *
7585 sizeof(char));
7586 if (string8 == NULL) {
7587 RLOGE("cdmaInfoRecInd: Memory allocation failed for "
7588 "responseCdmaInformationRecords");
7589 return 0;
7590 }
7591 memcpy(string8, infoRec->rec.redir.redirectingNumber.buf,
7592 infoRec->rec.redir.redirectingNumber.len);
7593 string8[(int)infoRec->rec.redir.redirectingNumber.len] = '\0';
7594
7595 record->redir.resize(1);
7596 record->redir[0].redirectingNumber.number = string8;
7597 free(string8);
7598 string8 = NULL;
7599 record->redir[0].redirectingNumber.numberType =
7600 infoRec->rec.redir.redirectingNumber.number_type;
7601 record->redir[0].redirectingNumber.numberPlan =
7602 infoRec->rec.redir.redirectingNumber.number_plan;
7603 record->redir[0].redirectingNumber.pi = infoRec->rec.redir.redirectingNumber.pi;
7604 record->redir[0].redirectingNumber.si = infoRec->rec.redir.redirectingNumber.si;
7605 record->redir[0].redirectingReason =
7606 (CdmaRedirectingReason) infoRec->rec.redir.redirectingReason;
7607 break;
7608 }
7609
7610 case RIL_CDMA_LINE_CONTROL_INFO_REC: {
7611 record->lineCtrl.resize(1);
7612 record->lineCtrl[0].lineCtrlPolarityIncluded =
7613 infoRec->rec.lineCtrl.lineCtrlPolarityIncluded;
7614 record->lineCtrl[0].lineCtrlToggle = infoRec->rec.lineCtrl.lineCtrlToggle;
7615 record->lineCtrl[0].lineCtrlReverse = infoRec->rec.lineCtrl.lineCtrlReverse;
7616 record->lineCtrl[0].lineCtrlPowerDenial =
7617 infoRec->rec.lineCtrl.lineCtrlPowerDenial;
7618 break;
7619 }
7620
7621 case RIL_CDMA_T53_CLIR_INFO_REC: {
7622 record->clir.resize(1);
7623 record->clir[0].cause = infoRec->rec.clir.cause;
7624 break;
7625 }
7626
7627 case RIL_CDMA_T53_AUDIO_CONTROL_INFO_REC: {
7628 record->audioCtrl.resize(1);
7629 record->audioCtrl[0].upLink = infoRec->rec.audioCtrl.upLink;
7630 record->audioCtrl[0].downLink = infoRec->rec.audioCtrl.downLink;
7631 break;
7632 }
7633
7634 case RIL_CDMA_T53_RELEASE_INFO_REC:
7635 RLOGE("cdmaInfoRecInd: RIL_CDMA_T53_RELEASE_INFO_REC: INVALID");
7636 return 0;
7637
7638 default:
7639 RLOGE("cdmaInfoRecInd: Incorrect name value");
7640 return 0;
7641 }
7642 }
7643
7644 #if VDBG
7645 RLOGD("cdmaInfoRecInd");
7646 #endif
7647 Return<void> retStatus = radioService[slotId]->mRadioIndication->cdmaInfoRec(
7648 convertIntToRadioIndicationType(indicationType), records);
7649 radioService[slotId]->checkReturnStatus(retStatus);
7650 } else {
7651 RLOGE("cdmaInfoRecInd: radioService[%d]->mRadioIndication == NULL", slotId);
7652 }
7653
7654 return 0;
7655 }
7656
indicateRingbackToneInd(int slotId,int indicationType,int token,RIL_Errno e,void * response,size_t responseLen)7657 int radio::indicateRingbackToneInd(int slotId,
7658 int indicationType, int token, RIL_Errno e, void *response,
7659 size_t responseLen) {
7660 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
7661 if (response == NULL || responseLen != sizeof(int)) {
7662 RLOGE("indicateRingbackToneInd: invalid response");
7663 return 0;
7664 }
7665 bool start = ((int32_t *) response)[0];
7666 #if VDBG
7667 RLOGD("indicateRingbackToneInd: start %d", start);
7668 #endif
7669 Return<void> retStatus = radioService[slotId]->mRadioIndication->indicateRingbackTone(
7670 convertIntToRadioIndicationType(indicationType), start);
7671 radioService[slotId]->checkReturnStatus(retStatus);
7672 } else {
7673 RLOGE("indicateRingbackToneInd: radioService[%d]->mRadioIndication == NULL", slotId);
7674 }
7675
7676 return 0;
7677 }
7678
resendIncallMuteInd(int slotId,int indicationType,int token,RIL_Errno e,void * response,size_t responseLen)7679 int radio::resendIncallMuteInd(int slotId,
7680 int indicationType, int token, RIL_Errno e, void *response,
7681 size_t responseLen) {
7682 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
7683 #if VDBG
7684 RLOGD("resendIncallMuteInd");
7685 #endif
7686 Return<void> retStatus = radioService[slotId]->mRadioIndication->resendIncallMute(
7687 convertIntToRadioIndicationType(indicationType));
7688 radioService[slotId]->checkReturnStatus(retStatus);
7689 } else {
7690 RLOGE("resendIncallMuteInd: radioService[%d]->mRadioIndication == NULL", slotId);
7691 }
7692
7693 return 0;
7694 }
7695
cdmaSubscriptionSourceChangedInd(int slotId,int indicationType,int token,RIL_Errno e,void * response,size_t responseLen)7696 int radio::cdmaSubscriptionSourceChangedInd(int slotId,
7697 int indicationType, int token, RIL_Errno e,
7698 void *response, size_t responseLen) {
7699 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
7700 if (response == NULL || responseLen != sizeof(int)) {
7701 RLOGE("cdmaSubscriptionSourceChangedInd: invalid response");
7702 return 0;
7703 }
7704 int32_t cdmaSource = ((int32_t *) response)[0];
7705 #if VDBG
7706 RLOGD("cdmaSubscriptionSourceChangedInd: cdmaSource %d", cdmaSource);
7707 #endif
7708 Return<void> retStatus = radioService[slotId]->mRadioIndication->
7709 cdmaSubscriptionSourceChanged(convertIntToRadioIndicationType(indicationType),
7710 (CdmaSubscriptionSource) cdmaSource);
7711 radioService[slotId]->checkReturnStatus(retStatus);
7712 } else {
7713 RLOGE("cdmaSubscriptionSourceChangedInd: radioService[%d]->mRadioIndication == NULL",
7714 slotId);
7715 }
7716
7717 return 0;
7718 }
7719
cdmaPrlChangedInd(int slotId,int indicationType,int token,RIL_Errno e,void * response,size_t responseLen)7720 int radio::cdmaPrlChangedInd(int slotId,
7721 int indicationType, int token, RIL_Errno e, void *response,
7722 size_t responseLen) {
7723 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
7724 if (response == NULL || responseLen != sizeof(int)) {
7725 RLOGE("cdmaPrlChangedInd: invalid response");
7726 return 0;
7727 }
7728 int32_t version = ((int32_t *) response)[0];
7729 #if VDBG
7730 RLOGD("cdmaPrlChangedInd: version %d", version);
7731 #endif
7732 Return<void> retStatus = radioService[slotId]->mRadioIndication->cdmaPrlChanged(
7733 convertIntToRadioIndicationType(indicationType), version);
7734 radioService[slotId]->checkReturnStatus(retStatus);
7735 } else {
7736 RLOGE("cdmaPrlChangedInd: radioService[%d]->mRadioIndication == NULL", slotId);
7737 }
7738
7739 return 0;
7740 }
7741
exitEmergencyCallbackModeInd(int slotId,int indicationType,int token,RIL_Errno e,void * response,size_t responseLen)7742 int radio::exitEmergencyCallbackModeInd(int slotId,
7743 int indicationType, int token, RIL_Errno e, void *response,
7744 size_t responseLen) {
7745 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
7746 #if VDBG
7747 RLOGD("exitEmergencyCallbackModeInd");
7748 #endif
7749 Return<void> retStatus = radioService[slotId]->mRadioIndication->exitEmergencyCallbackMode(
7750 convertIntToRadioIndicationType(indicationType));
7751 radioService[slotId]->checkReturnStatus(retStatus);
7752 } else {
7753 RLOGE("exitEmergencyCallbackModeInd: radioService[%d]->mRadioIndication == NULL",
7754 slotId);
7755 }
7756
7757 return 0;
7758 }
7759
rilConnectedInd(int slotId,int indicationType,int token,RIL_Errno e,void * response,size_t responseLen)7760 int radio::rilConnectedInd(int slotId,
7761 int indicationType, int token, RIL_Errno e, void *response,
7762 size_t responseLen) {
7763 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
7764 RLOGD("rilConnectedInd");
7765 Return<void> retStatus = radioService[slotId]->mRadioIndication->rilConnected(
7766 convertIntToRadioIndicationType(indicationType));
7767 radioService[slotId]->checkReturnStatus(retStatus);
7768 } else {
7769 RLOGE("rilConnectedInd: radioService[%d]->mRadioIndication == NULL", slotId);
7770 }
7771
7772 return 0;
7773 }
7774
voiceRadioTechChangedInd(int slotId,int indicationType,int token,RIL_Errno e,void * response,size_t responseLen)7775 int radio::voiceRadioTechChangedInd(int slotId,
7776 int indicationType, int token, RIL_Errno e, void *response,
7777 size_t responseLen) {
7778 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
7779 if (response == NULL || responseLen != sizeof(int)) {
7780 RLOGE("voiceRadioTechChangedInd: invalid response");
7781 return 0;
7782 }
7783 int32_t rat = ((int32_t *) response)[0];
7784 #if VDBG
7785 RLOGD("voiceRadioTechChangedInd: rat %d", rat);
7786 #endif
7787 Return<void> retStatus = radioService[slotId]->mRadioIndication->voiceRadioTechChanged(
7788 convertIntToRadioIndicationType(indicationType), (RadioTechnology) rat);
7789 radioService[slotId]->checkReturnStatus(retStatus);
7790 } else {
7791 RLOGE("voiceRadioTechChangedInd: radioService[%d]->mRadioIndication == NULL",
7792 slotId);
7793 }
7794
7795 return 0;
7796 }
7797
convertRilCellInfoListToHal(void * response,size_t responseLen,hidl_vec<CellInfo> & records)7798 void convertRilCellInfoListToHal(void *response, size_t responseLen, hidl_vec<CellInfo>& records) {
7799 int num = responseLen / sizeof(RIL_CellInfo_v12);
7800 records.resize(num);
7801
7802 RIL_CellInfo_v12 *rillCellInfo = (RIL_CellInfo_v12 *) response;
7803 for (int i = 0; i < num; i++) {
7804 records[i].cellInfoType = (CellInfoType) rillCellInfo->cellInfoType;
7805 records[i].registered = rillCellInfo->registered;
7806 records[i].timeStampType = (TimeStampType) rillCellInfo->timeStampType;
7807 records[i].timeStamp = rillCellInfo->timeStamp;
7808 // All vectors should be size 0 except one which will be size 1. Set everything to
7809 // size 0 initially.
7810 records[i].gsm.resize(0);
7811 records[i].wcdma.resize(0);
7812 records[i].cdma.resize(0);
7813 records[i].lte.resize(0);
7814 records[i].tdscdma.resize(0);
7815 switch(rillCellInfo->cellInfoType) {
7816 case RIL_CELL_INFO_TYPE_GSM: {
7817 records[i].gsm.resize(1);
7818 CellInfoGsm *cellInfoGsm = &records[i].gsm[0];
7819 cellInfoGsm->cellIdentityGsm.mcc =
7820 ril::util::mcc::decode(rillCellInfo->CellInfo.gsm.cellIdentityGsm.mcc);
7821 cellInfoGsm->cellIdentityGsm.mnc =
7822 ril::util::mnc::decode(rillCellInfo->CellInfo.gsm.cellIdentityGsm.mnc);
7823 cellInfoGsm->cellIdentityGsm.lac =
7824 rillCellInfo->CellInfo.gsm.cellIdentityGsm.lac;
7825 cellInfoGsm->cellIdentityGsm.cid =
7826 rillCellInfo->CellInfo.gsm.cellIdentityGsm.cid;
7827 cellInfoGsm->cellIdentityGsm.arfcn =
7828 rillCellInfo->CellInfo.gsm.cellIdentityGsm.arfcn;
7829 cellInfoGsm->cellIdentityGsm.bsic =
7830 rillCellInfo->CellInfo.gsm.cellIdentityGsm.bsic;
7831 cellInfoGsm->signalStrengthGsm.signalStrength =
7832 rillCellInfo->CellInfo.gsm.signalStrengthGsm.signalStrength;
7833 cellInfoGsm->signalStrengthGsm.bitErrorRate =
7834 rillCellInfo->CellInfo.gsm.signalStrengthGsm.bitErrorRate;
7835 cellInfoGsm->signalStrengthGsm.timingAdvance =
7836 rillCellInfo->CellInfo.gsm.signalStrengthGsm.timingAdvance;
7837 break;
7838 }
7839
7840 case RIL_CELL_INFO_TYPE_WCDMA: {
7841 records[i].wcdma.resize(1);
7842 CellInfoWcdma *cellInfoWcdma = &records[i].wcdma[0];
7843 cellInfoWcdma->cellIdentityWcdma.mcc =
7844 ril::util::mcc::decode(rillCellInfo->CellInfo.wcdma.cellIdentityWcdma.mcc);
7845 cellInfoWcdma->cellIdentityWcdma.mnc =
7846 ril::util::mnc::decode(rillCellInfo->CellInfo.wcdma.cellIdentityWcdma.mnc);
7847 cellInfoWcdma->cellIdentityWcdma.lac =
7848 rillCellInfo->CellInfo.wcdma.cellIdentityWcdma.lac;
7849 cellInfoWcdma->cellIdentityWcdma.cid =
7850 rillCellInfo->CellInfo.wcdma.cellIdentityWcdma.cid;
7851 cellInfoWcdma->cellIdentityWcdma.psc =
7852 rillCellInfo->CellInfo.wcdma.cellIdentityWcdma.psc;
7853 cellInfoWcdma->cellIdentityWcdma.uarfcn =
7854 rillCellInfo->CellInfo.wcdma.cellIdentityWcdma.uarfcn;
7855 cellInfoWcdma->signalStrengthWcdma.signalStrength =
7856 rillCellInfo->CellInfo.wcdma.signalStrengthWcdma.signalStrength;
7857 cellInfoWcdma->signalStrengthWcdma.bitErrorRate =
7858 rillCellInfo->CellInfo.wcdma.signalStrengthWcdma.bitErrorRate;
7859 break;
7860 }
7861
7862 case RIL_CELL_INFO_TYPE_CDMA: {
7863 records[i].cdma.resize(1);
7864 CellInfoCdma *cellInfoCdma = &records[i].cdma[0];
7865 cellInfoCdma->cellIdentityCdma.networkId =
7866 rillCellInfo->CellInfo.cdma.cellIdentityCdma.networkId;
7867 cellInfoCdma->cellIdentityCdma.systemId =
7868 rillCellInfo->CellInfo.cdma.cellIdentityCdma.systemId;
7869 cellInfoCdma->cellIdentityCdma.baseStationId =
7870 rillCellInfo->CellInfo.cdma.cellIdentityCdma.basestationId;
7871 cellInfoCdma->cellIdentityCdma.longitude =
7872 rillCellInfo->CellInfo.cdma.cellIdentityCdma.longitude;
7873 cellInfoCdma->cellIdentityCdma.latitude =
7874 rillCellInfo->CellInfo.cdma.cellIdentityCdma.latitude;
7875 cellInfoCdma->signalStrengthCdma.dbm =
7876 rillCellInfo->CellInfo.cdma.signalStrengthCdma.dbm;
7877 cellInfoCdma->signalStrengthCdma.ecio =
7878 rillCellInfo->CellInfo.cdma.signalStrengthCdma.ecio;
7879 cellInfoCdma->signalStrengthEvdo.dbm =
7880 rillCellInfo->CellInfo.cdma.signalStrengthEvdo.dbm;
7881 cellInfoCdma->signalStrengthEvdo.ecio =
7882 rillCellInfo->CellInfo.cdma.signalStrengthEvdo.ecio;
7883 cellInfoCdma->signalStrengthEvdo.signalNoiseRatio =
7884 rillCellInfo->CellInfo.cdma.signalStrengthEvdo.signalNoiseRatio;
7885 break;
7886 }
7887
7888 case RIL_CELL_INFO_TYPE_LTE: {
7889 records[i].lte.resize(1);
7890 CellInfoLte *cellInfoLte = &records[i].lte[0];
7891 cellInfoLte->cellIdentityLte.mcc =
7892 ril::util::mcc::decode(rillCellInfo->CellInfo.lte.cellIdentityLte.mcc);
7893 cellInfoLte->cellIdentityLte.mnc =
7894 ril::util::mnc::decode(rillCellInfo->CellInfo.lte.cellIdentityLte.mnc);
7895 cellInfoLte->cellIdentityLte.ci =
7896 rillCellInfo->CellInfo.lte.cellIdentityLte.ci;
7897 cellInfoLte->cellIdentityLte.pci =
7898 rillCellInfo->CellInfo.lte.cellIdentityLte.pci;
7899 cellInfoLte->cellIdentityLte.tac =
7900 rillCellInfo->CellInfo.lte.cellIdentityLte.tac;
7901 cellInfoLte->cellIdentityLte.earfcn =
7902 rillCellInfo->CellInfo.lte.cellIdentityLte.earfcn;
7903 cellInfoLte->signalStrengthLte.signalStrength =
7904 rillCellInfo->CellInfo.lte.signalStrengthLte.signalStrength;
7905 cellInfoLte->signalStrengthLte.rsrp =
7906 rillCellInfo->CellInfo.lte.signalStrengthLte.rsrp;
7907 cellInfoLte->signalStrengthLte.rsrq =
7908 rillCellInfo->CellInfo.lte.signalStrengthLte.rsrq;
7909 cellInfoLte->signalStrengthLte.rssnr =
7910 rillCellInfo->CellInfo.lte.signalStrengthLte.rssnr;
7911 cellInfoLte->signalStrengthLte.cqi =
7912 rillCellInfo->CellInfo.lte.signalStrengthLte.cqi;
7913 cellInfoLte->signalStrengthLte.timingAdvance =
7914 rillCellInfo->CellInfo.lte.signalStrengthLte.timingAdvance;
7915 break;
7916 }
7917
7918 case RIL_CELL_INFO_TYPE_TD_SCDMA: {
7919 records[i].tdscdma.resize(1);
7920 CellInfoTdscdma *cellInfoTdscdma = &records[i].tdscdma[0];
7921 cellInfoTdscdma->cellIdentityTdscdma.mcc =
7922 ril::util::mcc::decode(
7923 rillCellInfo->CellInfo.tdscdma.cellIdentityTdscdma.mcc);
7924 cellInfoTdscdma->cellIdentityTdscdma.mnc =
7925 ril::util::mnc::decode(
7926 rillCellInfo->CellInfo.tdscdma.cellIdentityTdscdma.mnc);
7927 cellInfoTdscdma->cellIdentityTdscdma.lac =
7928 rillCellInfo->CellInfo.tdscdma.cellIdentityTdscdma.lac;
7929 cellInfoTdscdma->cellIdentityTdscdma.cid =
7930 rillCellInfo->CellInfo.tdscdma.cellIdentityTdscdma.cid;
7931 cellInfoTdscdma->cellIdentityTdscdma.cpid =
7932 rillCellInfo->CellInfo.tdscdma.cellIdentityTdscdma.cpid;
7933 cellInfoTdscdma->signalStrengthTdscdma.rscp =
7934 rillCellInfo->CellInfo.tdscdma.signalStrengthTdscdma.rscp;
7935 break;
7936 }
7937 default: {
7938 break;
7939 }
7940 }
7941 rillCellInfo += 1;
7942 }
7943 }
7944
cellInfoListInd(int slotId,int indicationType,int token,RIL_Errno e,void * response,size_t responseLen)7945 int radio::cellInfoListInd(int slotId,
7946 int indicationType, int token, RIL_Errno e, void *response,
7947 size_t responseLen) {
7948 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
7949 if ((response == NULL && responseLen != 0) || responseLen % sizeof(RIL_CellInfo_v12) != 0) {
7950 RLOGE("cellInfoListInd: invalid response");
7951 return 0;
7952 }
7953
7954 hidl_vec<CellInfo> records;
7955 convertRilCellInfoListToHal(response, responseLen, records);
7956
7957 #if VDBG
7958 RLOGD("cellInfoListInd");
7959 #endif
7960 Return<void> retStatus = radioService[slotId]->mRadioIndication->cellInfoList(
7961 convertIntToRadioIndicationType(indicationType), records);
7962 radioService[slotId]->checkReturnStatus(retStatus);
7963 } else {
7964 RLOGE("cellInfoListInd: radioService[%d]->mRadioIndication == NULL", slotId);
7965 }
7966
7967 return 0;
7968 }
7969
imsNetworkStateChangedInd(int slotId,int indicationType,int token,RIL_Errno e,void * response,size_t responseLen)7970 int radio::imsNetworkStateChangedInd(int slotId,
7971 int indicationType, int token, RIL_Errno e, void *response,
7972 size_t responseLen) {
7973 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
7974 #if VDBG
7975 RLOGD("imsNetworkStateChangedInd");
7976 #endif
7977 Return<void> retStatus = radioService[slotId]->mRadioIndication->imsNetworkStateChanged(
7978 convertIntToRadioIndicationType(indicationType));
7979 radioService[slotId]->checkReturnStatus(retStatus);
7980 } else {
7981 RLOGE("imsNetworkStateChangedInd: radioService[%d]->mRadioIndication == NULL",
7982 slotId);
7983 }
7984
7985 return 0;
7986 }
7987
subscriptionStatusChangedInd(int slotId,int indicationType,int token,RIL_Errno e,void * response,size_t responseLen)7988 int radio::subscriptionStatusChangedInd(int slotId,
7989 int indicationType, int token, RIL_Errno e, void *response,
7990 size_t responseLen) {
7991 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
7992 if (response == NULL || responseLen != sizeof(int)) {
7993 RLOGE("subscriptionStatusChangedInd: invalid response");
7994 return 0;
7995 }
7996 bool activate = ((int32_t *) response)[0];
7997 #if VDBG
7998 RLOGD("subscriptionStatusChangedInd: activate %d", activate);
7999 #endif
8000 Return<void> retStatus = radioService[slotId]->mRadioIndication->subscriptionStatusChanged(
8001 convertIntToRadioIndicationType(indicationType), activate);
8002 radioService[slotId]->checkReturnStatus(retStatus);
8003 } else {
8004 RLOGE("subscriptionStatusChangedInd: radioService[%d]->mRadioIndication == NULL",
8005 slotId);
8006 }
8007
8008 return 0;
8009 }
8010
srvccStateNotifyInd(int slotId,int indicationType,int token,RIL_Errno e,void * response,size_t responseLen)8011 int radio::srvccStateNotifyInd(int slotId,
8012 int indicationType, int token, RIL_Errno e, void *response,
8013 size_t responseLen) {
8014 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
8015 if (response == NULL || responseLen != sizeof(int)) {
8016 RLOGE("srvccStateNotifyInd: invalid response");
8017 return 0;
8018 }
8019 int32_t state = ((int32_t *) response)[0];
8020 #if VDBG
8021 RLOGD("srvccStateNotifyInd: rat %d", state);
8022 #endif
8023 Return<void> retStatus = radioService[slotId]->mRadioIndication->srvccStateNotify(
8024 convertIntToRadioIndicationType(indicationType), (SrvccState) state);
8025 radioService[slotId]->checkReturnStatus(retStatus);
8026 } else {
8027 RLOGE("srvccStateNotifyInd: radioService[%d]->mRadioIndication == NULL", slotId);
8028 }
8029
8030 return 0;
8031 }
8032
convertRilHardwareConfigListToHal(void * response,size_t responseLen,hidl_vec<HardwareConfig> & records)8033 void convertRilHardwareConfigListToHal(void *response, size_t responseLen,
8034 hidl_vec<HardwareConfig>& records) {
8035 int num = responseLen / sizeof(RIL_HardwareConfig);
8036 records.resize(num);
8037
8038 RIL_HardwareConfig *rilHardwareConfig = (RIL_HardwareConfig *) response;
8039 for (int i = 0; i < num; i++) {
8040 records[i].type = (HardwareConfigType) rilHardwareConfig[i].type;
8041 records[i].uuid = convertCharPtrToHidlString(rilHardwareConfig[i].uuid);
8042 records[i].state = (HardwareConfigState) rilHardwareConfig[i].state;
8043 switch (rilHardwareConfig[i].type) {
8044 case RIL_HARDWARE_CONFIG_MODEM: {
8045 records[i].modem.resize(1);
8046 records[i].sim.resize(0);
8047 HardwareConfigModem *hwConfigModem = &records[i].modem[0];
8048 hwConfigModem->rat = rilHardwareConfig[i].cfg.modem.rat;
8049 hwConfigModem->maxVoice = rilHardwareConfig[i].cfg.modem.maxVoice;
8050 hwConfigModem->maxData = rilHardwareConfig[i].cfg.modem.maxData;
8051 hwConfigModem->maxStandby = rilHardwareConfig[i].cfg.modem.maxStandby;
8052 break;
8053 }
8054
8055 case RIL_HARDWARE_CONFIG_SIM: {
8056 records[i].sim.resize(1);
8057 records[i].modem.resize(0);
8058 records[i].sim[0].modemUuid =
8059 convertCharPtrToHidlString(rilHardwareConfig[i].cfg.sim.modemUuid);
8060 break;
8061 }
8062 }
8063 }
8064 }
8065
hardwareConfigChangedInd(int slotId,int indicationType,int token,RIL_Errno e,void * response,size_t responseLen)8066 int radio::hardwareConfigChangedInd(int slotId,
8067 int indicationType, int token, RIL_Errno e, void *response,
8068 size_t responseLen) {
8069 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
8070 if ((response == NULL && responseLen != 0)
8071 || responseLen % sizeof(RIL_HardwareConfig) != 0) {
8072 RLOGE("hardwareConfigChangedInd: invalid response");
8073 return 0;
8074 }
8075
8076 hidl_vec<HardwareConfig> configs;
8077 convertRilHardwareConfigListToHal(response, responseLen, configs);
8078
8079 #if VDBG
8080 RLOGD("hardwareConfigChangedInd");
8081 #endif
8082 Return<void> retStatus = radioService[slotId]->mRadioIndication->hardwareConfigChanged(
8083 convertIntToRadioIndicationType(indicationType), configs);
8084 radioService[slotId]->checkReturnStatus(retStatus);
8085 } else {
8086 RLOGE("hardwareConfigChangedInd: radioService[%d]->mRadioIndication == NULL",
8087 slotId);
8088 }
8089
8090 return 0;
8091 }
8092
convertRilRadioCapabilityToHal(void * response,size_t responseLen,RadioCapability & rc)8093 void convertRilRadioCapabilityToHal(void *response, size_t responseLen, RadioCapability& rc) {
8094 RIL_RadioCapability *rilRadioCapability = (RIL_RadioCapability *) response;
8095 rc.session = rilRadioCapability->session;
8096 rc.phase = (V1_0::RadioCapabilityPhase) rilRadioCapability->phase;
8097 rc.raf = rilRadioCapability->rat;
8098 rc.logicalModemUuid = convertCharPtrToHidlString(rilRadioCapability->logicalModemUuid);
8099 rc.status = (V1_0::RadioCapabilityStatus) rilRadioCapability->status;
8100 }
8101
radioCapabilityIndicationInd(int slotId,int indicationType,int token,RIL_Errno e,void * response,size_t responseLen)8102 int radio::radioCapabilityIndicationInd(int slotId,
8103 int indicationType, int token, RIL_Errno e, void *response,
8104 size_t responseLen) {
8105 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
8106 if (response == NULL || responseLen != sizeof(RIL_RadioCapability)) {
8107 RLOGE("radioCapabilityIndicationInd: invalid response");
8108 return 0;
8109 }
8110
8111 RadioCapability rc = {};
8112 convertRilRadioCapabilityToHal(response, responseLen, rc);
8113
8114 #if VDBG
8115 RLOGD("radioCapabilityIndicationInd");
8116 #endif
8117 Return<void> retStatus = radioService[slotId]->mRadioIndication->radioCapabilityIndication(
8118 convertIntToRadioIndicationType(indicationType), rc);
8119 radioService[slotId]->checkReturnStatus(retStatus);
8120 } else {
8121 RLOGE("radioCapabilityIndicationInd: radioService[%d]->mRadioIndication == NULL",
8122 slotId);
8123 }
8124
8125 return 0;
8126 }
8127
isServiceTypeCfQuery(RIL_SsServiceType serType,RIL_SsRequestType reqType)8128 bool isServiceTypeCfQuery(RIL_SsServiceType serType, RIL_SsRequestType reqType) {
8129 if ((reqType == SS_INTERROGATION) &&
8130 (serType == SS_CFU ||
8131 serType == SS_CF_BUSY ||
8132 serType == SS_CF_NO_REPLY ||
8133 serType == SS_CF_NOT_REACHABLE ||
8134 serType == SS_CF_ALL ||
8135 serType == SS_CF_ALL_CONDITIONAL)) {
8136 return true;
8137 }
8138 return false;
8139 }
8140
onSupplementaryServiceIndicationInd(int slotId,int indicationType,int token,RIL_Errno e,void * response,size_t responseLen)8141 int radio::onSupplementaryServiceIndicationInd(int slotId,
8142 int indicationType, int token, RIL_Errno e,
8143 void *response, size_t responseLen) {
8144 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
8145 if (response == NULL || responseLen != sizeof(RIL_StkCcUnsolSsResponse)) {
8146 RLOGE("onSupplementaryServiceIndicationInd: invalid response");
8147 return 0;
8148 }
8149
8150 RIL_StkCcUnsolSsResponse *rilSsResponse = (RIL_StkCcUnsolSsResponse *) response;
8151 StkCcUnsolSsResult ss = {};
8152 ss.serviceType = (SsServiceType) rilSsResponse->serviceType;
8153 ss.requestType = (SsRequestType) rilSsResponse->requestType;
8154 ss.teleserviceType = (SsTeleserviceType) rilSsResponse->teleserviceType;
8155 ss.serviceClass = rilSsResponse->serviceClass;
8156 ss.result = (RadioError) rilSsResponse->result;
8157
8158 if (isServiceTypeCfQuery(rilSsResponse->serviceType, rilSsResponse->requestType)) {
8159 #if VDBG
8160 RLOGD("onSupplementaryServiceIndicationInd CF type, num of Cf elements %d",
8161 rilSsResponse->cfData.numValidIndexes);
8162 #endif
8163 if (rilSsResponse->cfData.numValidIndexes > NUM_SERVICE_CLASSES) {
8164 RLOGE("onSupplementaryServiceIndicationInd numValidIndexes is greater than "
8165 "max value %d, truncating it to max value", NUM_SERVICE_CLASSES);
8166 rilSsResponse->cfData.numValidIndexes = NUM_SERVICE_CLASSES;
8167 }
8168
8169 ss.cfData.resize(1);
8170 ss.ssInfo.resize(0);
8171
8172 /* number of call info's */
8173 ss.cfData[0].cfInfo.resize(rilSsResponse->cfData.numValidIndexes);
8174
8175 for (int i = 0; i < rilSsResponse->cfData.numValidIndexes; i++) {
8176 RIL_CallForwardInfo cf = rilSsResponse->cfData.cfInfo[i];
8177 CallForwardInfo *cfInfo = &ss.cfData[0].cfInfo[i];
8178
8179 cfInfo->status = (CallForwardInfoStatus) cf.status;
8180 cfInfo->reason = cf.reason;
8181 cfInfo->serviceClass = cf.serviceClass;
8182 cfInfo->toa = cf.toa;
8183 cfInfo->number = convertCharPtrToHidlString(cf.number);
8184 cfInfo->timeSeconds = cf.timeSeconds;
8185 #if VDBG
8186 RLOGD("onSupplementaryServiceIndicationInd: "
8187 "Data: %d,reason=%d,cls=%d,toa=%d,num=%s,tout=%d],", cf.status,
8188 cf.reason, cf.serviceClass, cf.toa, (char*)cf.number, cf.timeSeconds);
8189 #endif
8190 }
8191 } else {
8192 ss.ssInfo.resize(1);
8193 ss.cfData.resize(0);
8194
8195 /* each int */
8196 ss.ssInfo[0].ssInfo.resize(SS_INFO_MAX);
8197 for (int i = 0; i < SS_INFO_MAX; i++) {
8198 #if VDBG
8199 RLOGD("onSupplementaryServiceIndicationInd: Data: %d",
8200 rilSsResponse->ssInfo[i]);
8201 #endif
8202 ss.ssInfo[0].ssInfo[i] = rilSsResponse->ssInfo[i];
8203 }
8204 }
8205
8206 #if VDBG
8207 RLOGD("onSupplementaryServiceIndicationInd");
8208 #endif
8209 Return<void> retStatus = radioService[slotId]->mRadioIndication->
8210 onSupplementaryServiceIndication(convertIntToRadioIndicationType(indicationType),
8211 ss);
8212 radioService[slotId]->checkReturnStatus(retStatus);
8213 } else {
8214 RLOGE("onSupplementaryServiceIndicationInd: "
8215 "radioService[%d]->mRadioIndication == NULL", slotId);
8216 }
8217
8218 return 0;
8219 }
8220
stkCallControlAlphaNotifyInd(int slotId,int indicationType,int token,RIL_Errno e,void * response,size_t responseLen)8221 int radio::stkCallControlAlphaNotifyInd(int slotId,
8222 int indicationType, int token, RIL_Errno e, void *response,
8223 size_t responseLen) {
8224 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
8225 if (response == NULL || responseLen == 0) {
8226 RLOGE("stkCallControlAlphaNotifyInd: invalid response");
8227 return 0;
8228 }
8229 #if VDBG
8230 RLOGD("stkCallControlAlphaNotifyInd");
8231 #endif
8232 Return<void> retStatus = radioService[slotId]->mRadioIndication->stkCallControlAlphaNotify(
8233 convertIntToRadioIndicationType(indicationType),
8234 convertCharPtrToHidlString((char *) response));
8235 radioService[slotId]->checkReturnStatus(retStatus);
8236 } else {
8237 RLOGE("stkCallControlAlphaNotifyInd: radioService[%d]->mRadioIndication == NULL",
8238 slotId);
8239 }
8240
8241 return 0;
8242 }
8243
convertRilLceDataInfoToHal(void * response,size_t responseLen,LceDataInfo & lce)8244 void convertRilLceDataInfoToHal(void *response, size_t responseLen, LceDataInfo& lce) {
8245 RIL_LceDataInfo *rilLceDataInfo = (RIL_LceDataInfo *)response;
8246 lce.lastHopCapacityKbps = rilLceDataInfo->last_hop_capacity_kbps;
8247 lce.confidenceLevel = rilLceDataInfo->confidence_level;
8248 lce.lceSuspended = rilLceDataInfo->lce_suspended;
8249 }
8250
lceDataInd(int slotId,int indicationType,int token,RIL_Errno e,void * response,size_t responseLen)8251 int radio::lceDataInd(int slotId,
8252 int indicationType, int token, RIL_Errno e, void *response,
8253 size_t responseLen) {
8254 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
8255 if (response == NULL || responseLen != sizeof(RIL_LceDataInfo)) {
8256 RLOGE("lceDataInd: invalid response");
8257 return 0;
8258 }
8259
8260 LceDataInfo lce = {};
8261 convertRilLceDataInfoToHal(response, responseLen, lce);
8262 #if VDBG
8263 RLOGD("lceDataInd");
8264 #endif
8265 Return<void> retStatus = radioService[slotId]->mRadioIndication->lceData(
8266 convertIntToRadioIndicationType(indicationType), lce);
8267 radioService[slotId]->checkReturnStatus(retStatus);
8268 } else {
8269 RLOGE("lceDataInd: radioService[%d]->mRadioIndication == NULL", slotId);
8270 }
8271
8272 return 0;
8273 }
8274
pcoDataInd(int slotId,int indicationType,int token,RIL_Errno e,void * response,size_t responseLen)8275 int radio::pcoDataInd(int slotId,
8276 int indicationType, int token, RIL_Errno e, void *response,
8277 size_t responseLen) {
8278 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
8279 if (response == NULL || responseLen != sizeof(RIL_PCO_Data)) {
8280 RLOGE("pcoDataInd: invalid response");
8281 return 0;
8282 }
8283
8284 PcoDataInfo pco = {};
8285 RIL_PCO_Data *rilPcoData = (RIL_PCO_Data *)response;
8286 pco.cid = rilPcoData->cid;
8287 pco.bearerProto = convertCharPtrToHidlString(rilPcoData->bearer_proto);
8288 pco.pcoId = rilPcoData->pco_id;
8289 pco.contents.setToExternal((uint8_t *) rilPcoData->contents, rilPcoData->contents_length);
8290
8291 #if VDBG
8292 RLOGD("pcoDataInd");
8293 #endif
8294 Return<void> retStatus = radioService[slotId]->mRadioIndication->pcoData(
8295 convertIntToRadioIndicationType(indicationType), pco);
8296 radioService[slotId]->checkReturnStatus(retStatus);
8297 } else {
8298 RLOGE("pcoDataInd: radioService[%d]->mRadioIndication == NULL", slotId);
8299 }
8300
8301 return 0;
8302 }
8303
modemResetInd(int slotId,int indicationType,int token,RIL_Errno e,void * response,size_t responseLen)8304 int radio::modemResetInd(int slotId,
8305 int indicationType, int token, RIL_Errno e, void *response,
8306 size_t responseLen) {
8307 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
8308 if (response == NULL || responseLen == 0) {
8309 RLOGE("modemResetInd: invalid response");
8310 return 0;
8311 }
8312 #if VDBG
8313 RLOGD("modemResetInd");
8314 #endif
8315 Return<void> retStatus = radioService[slotId]->mRadioIndication->modemReset(
8316 convertIntToRadioIndicationType(indicationType),
8317 convertCharPtrToHidlString((char *) response));
8318 radioService[slotId]->checkReturnStatus(retStatus);
8319 } else {
8320 RLOGE("modemResetInd: radioService[%d]->mRadioIndication == NULL", slotId);
8321 }
8322
8323 return 0;
8324 }
8325
networkScanResultInd(int slotId,int indicationType,int token,RIL_Errno e,void * response,size_t responseLen)8326 int radio::networkScanResultInd(int slotId,
8327 int indicationType, int token, RIL_Errno e, void *response,
8328 size_t responseLen) {
8329 #if VDBG
8330 RLOGD("networkScanResultInd");
8331 #endif
8332 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndicationV1_1 != NULL) {
8333 if (response == NULL || responseLen == 0) {
8334 RLOGE("networkScanResultInd: invalid response");
8335 return 0;
8336 }
8337 RLOGD("networkScanResultInd");
8338
8339 #if VDBG
8340 RLOGD("networkScanResultInd");
8341 #endif
8342
8343 RIL_NetworkScanResult *networkScanResult = (RIL_NetworkScanResult *) response;
8344
8345 V1_1::NetworkScanResult result;
8346 result.status = (V1_1::ScanStatus) networkScanResult->status;
8347 result.error = (RadioError) networkScanResult->error;
8348 convertRilCellInfoListToHal(
8349 networkScanResult->network_infos,
8350 networkScanResult->network_infos_length * sizeof(RIL_CellInfo_v12),
8351 result.networkInfos);
8352
8353 Return<void> retStatus = radioService[slotId]->mRadioIndicationV1_1->networkScanResult(
8354 convertIntToRadioIndicationType(indicationType), result);
8355 radioService[slotId]->checkReturnStatus(retStatus);
8356 } else {
8357 RLOGE("networkScanResultInd: radioService[%d]->mRadioIndicationV1_1 == NULL", slotId);
8358 }
8359 return 0;
8360 }
8361
carrierInfoForImsiEncryption(int slotId,int indicationType,int token,RIL_Errno e,void * response,size_t responseLen)8362 int radio::carrierInfoForImsiEncryption(int slotId,
8363 int indicationType, int token, RIL_Errno e, void *response,
8364 size_t responseLen) {
8365 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndicationV1_1 != NULL) {
8366 if (response == NULL || responseLen == 0) {
8367 RLOGE("carrierInfoForImsiEncryption: invalid response");
8368 return 0;
8369 }
8370 RLOGD("carrierInfoForImsiEncryption");
8371 Return<void> retStatus = radioService[slotId]->mRadioIndicationV1_1->
8372 carrierInfoForImsiEncryption(convertIntToRadioIndicationType(indicationType));
8373 radioService[slotId]->checkReturnStatus(retStatus);
8374 } else {
8375 RLOGE("carrierInfoForImsiEncryption: radioService[%d]->mRadioIndicationV1_1 == NULL",
8376 slotId);
8377 }
8378
8379 return 0;
8380 }
8381
keepaliveStatusInd(int slotId,int indicationType,int token,RIL_Errno e,void * response,size_t responseLen)8382 int radio::keepaliveStatusInd(int slotId,
8383 int indicationType, int token, RIL_Errno e, void *response,
8384 size_t responseLen) {
8385 #if VDBG
8386 RLOGD("%s(): token=%d", __FUNCTION__, token);
8387 #endif
8388 if (radioService[slotId] == NULL || radioService[slotId]->mRadioIndication == NULL) {
8389 RLOGE("%s: radioService[%d]->mRadioIndication == NULL", __FUNCTION__, slotId);
8390 return 0;
8391 }
8392
8393 auto ret = V1_1::IRadioIndication::castFrom(
8394 radioService[slotId]->mRadioIndication);
8395 if (!ret.isOk()) {
8396 RLOGE("%s: ret.isOk() == false for radioService[%d]", __FUNCTION__, slotId);
8397 return 0;
8398 }
8399 sp<V1_1::IRadioIndication> radioIndicationV1_1 = ret;
8400
8401 if (response == NULL || responseLen != sizeof(V1_1::KeepaliveStatus)) {
8402 RLOGE("%s: invalid response", __FUNCTION__);
8403 return 0;
8404 }
8405
8406 V1_1::KeepaliveStatus ks;
8407 convertRilKeepaliveStatusToHal(static_cast<RIL_KeepaliveStatus*>(response), ks);
8408
8409 Return<void> retStatus = radioIndicationV1_1->keepaliveStatus(
8410 convertIntToRadioIndicationType(indicationType), ks);
8411 radioService[slotId]->checkReturnStatus(retStatus);
8412 return 0;
8413 }
8414
registerService(RIL_RadioFunctions * callbacks,CommandInfo * commands)8415 void radio::registerService(RIL_RadioFunctions *callbacks, CommandInfo *commands) {
8416 using namespace android::hardware;
8417 int simCount = 1;
8418 const char *serviceNames[] = {
8419 android::RIL_getServiceName()
8420 #if (SIM_COUNT >= 2)
8421 , RIL2_SERVICE_NAME
8422 #if (SIM_COUNT >= 3)
8423 , RIL3_SERVICE_NAME
8424 #if (SIM_COUNT >= 4)
8425 , RIL4_SERVICE_NAME
8426 #endif
8427 #endif
8428 #endif
8429 };
8430
8431 #if (SIM_COUNT >= 2)
8432 simCount = SIM_COUNT;
8433 #endif
8434
8435 s_vendorFunctions = callbacks;
8436 s_commands = commands;
8437
8438 configureRpcThreadpool(1, true /* callerWillJoin */);
8439 for (int i = 0; i < simCount; i++) {
8440 pthread_rwlock_t *radioServiceRwlockPtr = getRadioServiceRwlock(i);
8441 int ret = pthread_rwlock_wrlock(radioServiceRwlockPtr);
8442 assert(ret == 0);
8443
8444 radioService[i] = new RadioImpl;
8445 radioService[i]->mSlotId = i;
8446 RLOGD("registerService: starting android::hardware::radio::V1_1::IRadio %s",
8447 serviceNames[i]);
8448 (void) radioService[i]->registerAsService(serviceNames[i]);
8449
8450 ret = pthread_rwlock_unlock(radioServiceRwlockPtr);
8451 assert(ret == 0);
8452 }
8453 }
8454
rilc_thread_pool()8455 void rilc_thread_pool() {
8456 joinRpcThreadpool();
8457 }
8458
getRadioServiceRwlock(int slotId)8459 pthread_rwlock_t * radio::getRadioServiceRwlock(int slotId) {
8460 pthread_rwlock_t *radioServiceRwlockPtr = &radioServiceRwlock;
8461
8462 #if (SIM_COUNT >= 2)
8463 if (slotId == 2) radioServiceRwlockPtr = &radioServiceRwlock2;
8464 #if (SIM_COUNT >= 3)
8465 if (slotId == 3) radioServiceRwlockPtr = &radioServiceRwlock3;
8466 #if (SIM_COUNT >= 4)
8467 if (slotId == 4) radioServiceRwlockPtr = &radioServiceRwlock4;
8468 #endif
8469 #endif
8470 #endif
8471
8472 return radioServiceRwlockPtr;
8473 }
8474
8475 // should acquire write lock for the corresponding service before calling this
setNitzTimeReceived(int slotId,int64_t timeReceived)8476 void radio::setNitzTimeReceived(int slotId, int64_t timeReceived) {
8477 nitzTimeReceived[slotId] = timeReceived;
8478 }
8479