blob: b0ecb45b2d2ccd130d5b47aff99e6dc1f8d0eadb [file] [log] [blame]
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001/*
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#include <android/hardware/radio/1.0/IRadio.h>
18
19#include <hwbinder/IPCThreadState.h>
20#include <hwbinder/ProcessState.h>
21#include <ril_service.h>
22#include <hidl/HidlTransportSupport.h>
Amit Mahajan5829a472016-12-28 17:28:07 -080023#include <utils/SystemClock.h>
24
25#define INVALID_HEX_CHAR 16
Amit Mahajancd77a5b2016-08-25 11:19:21 -070026
27using namespace android::hardware::radio::V1_0;
28using ::android::hardware::configureRpcThreadpool;
29using ::android::hardware::joinRpcThreadpool;
30using ::android::hardware::Return;
31using ::android::hardware::Status;
32using ::android::hardware::hidl_string;
33using ::android::hardware::hidl_vec;
34using ::android::hardware::hidl_array;
35using ::android::hardware::Void;
36using android::CommandInfo;
37using android::RequestInfo;
38using android::requestToString;
39using android::sp;
40
41RIL_RadioFunctions *s_callbacks = NULL;
42static CommandInfo *s_commands;
43
44struct RadioImpl;
45
46#if (SIM_COUNT >= 2)
47sp<RadioImpl> radioService[SIM_COUNT];
48#else
49sp<RadioImpl> radioService[1];
50#endif
51
Amit Mahajan932e08e2017-01-24 05:45:02 -080052static pthread_rwlock_t radioServiceRwlock = PTHREAD_RWLOCK_INITIALIZER;
53
54#if (SIM_COUNT >= 2)
55static pthread_rwlock_t radioServiceRwlock2 = PTHREAD_RWLOCK_INITIALIZER;
56#if (SIM_COUNT >= 3)
57static pthread_rwlock_t radioServiceRwlock3 = PTHREAD_RWLOCK_INITIALIZER;
58#if (SIM_COUNT >= 4)
59static pthread_rwlock_t radioServiceRwlock4 = PTHREAD_RWLOCK_INITIALIZER;
60#endif
61#endif
62#endif
63
Amit Mahajancd77a5b2016-08-25 11:19:21 -070064struct RadioImpl : public IRadio {
Sanket Padawef220dc52017-01-02 23:46:00 -080065 int32_t mSlotId;
Amit Mahajan932e08e2017-01-24 05:45:02 -080066 // counter used for synchronization. It is incremented every time mRadioResponse or
67 // mRadioIndication value is updated.
68 volatile int32_t mCounter;
Sanket Padawef220dc52017-01-02 23:46:00 -080069 sp<IRadioResponse> mRadioResponse;
70 sp<IRadioIndication> mRadioIndication;
Amit Mahajancd77a5b2016-08-25 11:19:21 -070071
72 Return<void> setResponseFunctions(
73 const ::android::sp<IRadioResponse>& radioResponse,
74 const ::android::sp<IRadioIndication>& radioIndication);
75
76 Return<void> getIccCardStatus(int32_t serial);
77
Sanket Padawef220dc52017-01-02 23:46:00 -080078 Return<void> supplyIccPinForApp(int32_t serial, const hidl_string& pin,
79 const hidl_string& aid);
Amit Mahajancd77a5b2016-08-25 11:19:21 -070080
Sanket Padawef220dc52017-01-02 23:46:00 -080081 Return<void> supplyIccPukForApp(int32_t serial, const hidl_string& puk,
82 const hidl_string& pin, const hidl_string& aid);
Amit Mahajancd77a5b2016-08-25 11:19:21 -070083
84 Return<void> supplyIccPin2ForApp(int32_t serial,
Sanket Padawef220dc52017-01-02 23:46:00 -080085 const hidl_string& pin2,
86 const hidl_string& aid);
Amit Mahajancd77a5b2016-08-25 11:19:21 -070087
Sanket Padawef220dc52017-01-02 23:46:00 -080088 Return<void> supplyIccPuk2ForApp(int32_t serial, const hidl_string& puk2,
89 const hidl_string& pin2, const hidl_string& aid);
Amit Mahajancd77a5b2016-08-25 11:19:21 -070090
Sanket Padawef220dc52017-01-02 23:46:00 -080091 Return<void> changeIccPinForApp(int32_t serial, const hidl_string& oldPin,
92 const hidl_string& newPin, const hidl_string& aid);
Amit Mahajancd77a5b2016-08-25 11:19:21 -070093
Sanket Padawef220dc52017-01-02 23:46:00 -080094 Return<void> changeIccPin2ForApp(int32_t serial, const hidl_string& oldPin2,
95 const hidl_string& newPin2, const hidl_string& aid);
Amit Mahajancd77a5b2016-08-25 11:19:21 -070096
Sanket Padawef220dc52017-01-02 23:46:00 -080097 Return<void> supplyNetworkDepersonalization(int32_t serial, const hidl_string& netPin);
Amit Mahajancd77a5b2016-08-25 11:19:21 -070098
99 Return<void> getCurrentCalls(int32_t serial);
100
Sanket Padawef220dc52017-01-02 23:46:00 -0800101 Return<void> dial(int32_t serial, const Dial& dialInfo);
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700102
103 Return<void> getImsiForApp(int32_t serial,
104 const ::android::hardware::hidl_string& aid);
105
106 Return<void> hangup(int32_t serial, int32_t gsmIndex);
107
108 Return<void> hangupWaitingOrBackground(int32_t serial);
109
110 Return<void> hangupForegroundResumeBackground(int32_t serial);
111
112 Return<void> switchWaitingOrHoldingAndActive(int32_t serial);
113
114 Return<void> conference(int32_t serial);
115
116 Return<void> rejectCall(int32_t serial);
117
118 Return<void> getLastCallFailCause(int32_t serial);
119
120 Return<void> getSignalStrength(int32_t serial);
121
122 Return<void> getVoiceRegistrationState(int32_t serial);
123
124 Return<void> getDataRegistrationState(int32_t serial);
125
126 Return<void> getOperator(int32_t serial);
127
128 Return<void> setRadioPower(int32_t serial, bool on);
129
130 Return<void> sendDtmf(int32_t serial,
131 const ::android::hardware::hidl_string& s);
132
133 Return<void> sendSms(int32_t serial, const GsmSmsMessage& message);
134
135 Return<void> sendSMSExpectMore(int32_t serial, const GsmSmsMessage& message);
136
137 Return<void> setupDataCall(int32_t serial,
Jack Yu06181bb2017-01-10 12:10:41 -0800138 RadioTechnology radioTechnology,
139 const DataProfileInfo& profileInfo,
140 bool modemCognitive,
141 bool roamingAllowed);
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700142
143 Return<void> iccIOForApp(int32_t serial,
144 const IccIo& iccIo);
145
146 Return<void> sendUssd(int32_t serial,
147 const ::android::hardware::hidl_string& ussd);
148
149 Return<void> cancelPendingUssd(int32_t serial);
150
151 Return<void> getClir(int32_t serial);
152
153 Return<void> setClir(int32_t serial, int32_t status);
154
155 Return<void> getCallForwardStatus(int32_t serial,
156 const CallForwardInfo& callInfo);
157
158 Return<void> setCallForward(int32_t serial,
159 const CallForwardInfo& callInfo);
160
161 Return<void> getCallWaiting(int32_t serial, int32_t serviceClass);
162
163 Return<void> setCallWaiting(int32_t serial, bool enable, int32_t serviceClass);
164
165 Return<void> acknowledgeLastIncomingGsmSms(int32_t serial,
166 bool success, SmsAcknowledgeFailCause cause);
167
168 Return<void> acceptCall(int32_t serial);
169
170 Return<void> deactivateDataCall(int32_t serial,
171 int32_t cid, bool reasonRadioShutDown);
172
173 Return<void> getFacilityLockForApp(int32_t serial,
174 const ::android::hardware::hidl_string& facility,
175 const ::android::hardware::hidl_string& password,
176 int32_t serviceClass,
177 const ::android::hardware::hidl_string& appId);
178
179 Return<void> setFacilityLockForApp(int32_t serial,
180 const ::android::hardware::hidl_string& facility,
181 bool lockState,
182 const ::android::hardware::hidl_string& password,
183 int32_t serviceClass,
184 const ::android::hardware::hidl_string& appId);
185
186 Return<void> setBarringPassword(int32_t serial,
187 const ::android::hardware::hidl_string& facility,
188 const ::android::hardware::hidl_string& oldPassword,
189 const ::android::hardware::hidl_string& newPassword);
190
191 Return<void> getNetworkSelectionMode(int32_t serial);
192
193 Return<void> setNetworkSelectionModeAutomatic(int32_t serial);
194
195 Return<void> setNetworkSelectionModeManual(int32_t serial,
196 const ::android::hardware::hidl_string& operatorNumeric);
197
198 Return<void> getAvailableNetworks(int32_t serial);
199
200 Return<void> startDtmf(int32_t serial,
201 const ::android::hardware::hidl_string& s);
202
203 Return<void> stopDtmf(int32_t serial);
204
205 Return<void> getBasebandVersion(int32_t serial);
206
207 Return<void> separateConnection(int32_t serial, int32_t gsmIndex);
208
209 Return<void> setMute(int32_t serial, bool enable);
210
211 Return<void> getMute(int32_t serial);
212
213 Return<void> getClip(int32_t serial);
214
215 Return<void> getDataCallList(int32_t serial);
216
217 Return<void> sendOemRadioRequestRaw(int32_t serial,
218 const ::android::hardware::hidl_vec<uint8_t>& data);
219
220 Return<void> sendOemRadioRequestStrings(int32_t serial,
221 const ::android::hardware::hidl_vec<::android::hardware::hidl_string>& data);
222
223 Return<void> sendScreenState(int32_t serial, bool enable);
224
225 Return<void> setSuppServiceNotifications(int32_t serial, bool enable);
226
227 Return<void> writeSmsToSim(int32_t serial,
228 const SmsWriteArgs& smsWriteArgs);
229
230 Return<void> deleteSmsOnSim(int32_t serial, int32_t index);
231
232 Return<void> setBandMode(int32_t serial, RadioBandMode mode);
233
234 Return<void> getAvailableBandModes(int32_t serial);
235
236 Return<void> sendEnvelope(int32_t serial,
237 const ::android::hardware::hidl_string& command);
238
239 Return<void> sendTerminalResponseToSim(int32_t serial,
240 const ::android::hardware::hidl_string& commandResponse);
241
242 Return<void> handleStkCallSetupRequestFromSim(int32_t serial, bool accept);
243
244 Return<void> explicitCallTransfer(int32_t serial);
245
246 Return<void> setPreferredNetworkType(int32_t serial, PreferredNetworkType nwType);
247
248 Return<void> getPreferredNetworkType(int32_t serial);
249
250 Return<void> getNeighboringCids(int32_t serial);
251
252 Return<void> setLocationUpdates(int32_t serial, bool enable);
253
254 Return<void> setCdmaSubscriptionSource(int32_t serial,
255 CdmaSubscriptionSource cdmaSub);
256
257 Return<void> setCdmaRoamingPreference(int32_t serial, CdmaRoamingType type);
258
259 Return<void> getCdmaRoamingPreference(int32_t serial);
260
261 Return<void> setTTYMode(int32_t serial, TtyMode mode);
262
263 Return<void> getTTYMode(int32_t serial);
264
265 Return<void> setPreferredVoicePrivacy(int32_t serial, bool enable);
266
267 Return<void> getPreferredVoicePrivacy(int32_t serial);
268
269 Return<void> sendCDMAFeatureCode(int32_t serial,
270 const ::android::hardware::hidl_string& featureCode);
271
272 Return<void> sendBurstDtmf(int32_t serial,
273 const ::android::hardware::hidl_string& dtmf,
274 int32_t on,
275 int32_t off);
276
277 Return<void> sendCdmaSms(int32_t serial, const CdmaSmsMessage& sms);
278
279 Return<void> acknowledgeLastIncomingCdmaSms(int32_t serial,
280 const CdmaSmsAck& smsAck);
281
282 Return<void> getGsmBroadcastConfig(int32_t serial);
283
284 Return<void> setGsmBroadcastConfig(int32_t serial,
285 const hidl_vec<GsmBroadcastSmsConfigInfo>& configInfo);
286
287 Return<void> setGsmBroadcastActivation(int32_t serial, bool activate);
288
289 Return<void> getCdmaBroadcastConfig(int32_t serial);
290
291 Return<void> setCdmaBroadcastConfig(int32_t serial,
292 const hidl_vec<CdmaBroadcastSmsConfigInfo>& configInfo);
293
294 Return<void> setCdmaBroadcastActivation(int32_t serial, bool activate);
295
296 Return<void> getCDMASubscription(int32_t serial);
297
298 Return<void> writeSmsToRuim(int32_t serial, const CdmaSmsWriteArgs& cdmaSms);
299
300 Return<void> deleteSmsOnRuim(int32_t serial, int32_t index);
301
302 Return<void> getDeviceIdentity(int32_t serial);
303
304 Return<void> exitEmergencyCallbackMode(int32_t serial);
305
306 Return<void> getSmscAddress(int32_t serial);
307
308 Return<void> setSmscAddress(int32_t serial,
309 const ::android::hardware::hidl_string& smsc);
310
311 Return<void> reportSmsMemoryStatus(int32_t serial, bool available);
312
313 Return<void> reportStkServiceIsRunning(int32_t serial);
314
315 Return<void> getCdmaSubscriptionSource(int32_t serial);
316
317 Return<void> requestIsimAuthentication(int32_t serial,
318 const ::android::hardware::hidl_string& challenge);
319
320 Return<void> acknowledgeIncomingGsmSmsWithPdu(int32_t serial,
321 bool success,
322 const ::android::hardware::hidl_string& ackPdu);
323
324 Return<void> sendEnvelopeWithStatus(int32_t serial,
325 const ::android::hardware::hidl_string& contents);
326
327 Return<void> getVoiceRadioTechnology(int32_t serial);
328
329 Return<void> getCellInfoList(int32_t serial);
330
331 Return<void> setCellInfoListRate(int32_t serial, int32_t rate);
332
Jack Yu06181bb2017-01-10 12:10:41 -0800333 Return<void> setInitialAttachApn(int32_t serial, const DataProfileInfo& dataProfileInfo,
334 bool modemCognitive);
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700335
336 Return<void> getImsRegistrationState(int32_t serial);
337
338 Return<void> sendImsSms(int32_t serial, const ImsSmsMessage& message);
339
340 Return<void> iccTransmitApduBasicChannel(int32_t serial, const SimApdu& message);
341
342 Return<void> iccOpenLogicalChannel(int32_t serial,
343 const ::android::hardware::hidl_string& aid);
344
345 Return<void> iccCloseLogicalChannel(int32_t serial, int32_t channelId);
346
347 Return<void> iccTransmitApduLogicalChannel(int32_t serial, const SimApdu& message);
348
349 Return<void> nvReadItem(int32_t serial, NvItem itemId);
350
351 Return<void> nvWriteItem(int32_t serial, const NvWriteItem& item);
352
353 Return<void> nvWriteCdmaPrl(int32_t serial,
354 const ::android::hardware::hidl_vec<uint8_t>& prl);
355
356 Return<void> nvResetConfig(int32_t serial, ResetNvType resetType);
357
358 Return<void> setUiccSubscription(int32_t serial, const SelectUiccSub& uiccSub);
359
360 Return<void> setDataAllowed(int32_t serial, bool allow);
361
362 Return<void> getHardwareConfig(int32_t serial);
363
364 Return<void> requestIccSimAuthentication(int32_t serial,
365 int32_t authContext,
366 const ::android::hardware::hidl_string& authData,
367 const ::android::hardware::hidl_string& aid);
368
369 Return<void> setDataProfile(int32_t serial,
370 const ::android::hardware::hidl_vec<DataProfileInfo>& profiles);
371
372 Return<void> requestShutdown(int32_t serial);
373
374 Return<void> getRadioCapability(int32_t serial);
375
376 Return<void> setRadioCapability(int32_t serial, const RadioCapability& rc);
377
378 Return<void> startLceService(int32_t serial, int32_t reportInterval, bool pullMode);
379
380 Return<void> stopLceService(int32_t serial);
381
382 Return<void> pullLceData(int32_t serial);
383
384 Return<void> getModemActivityInfo(int32_t serial);
385
386 Return<void> setAllowedCarriers(int32_t serial,
387 bool allAllowed,
388 const CarrierRestrictions& carriers);
389
390 Return<void> getAllowedCarriers(int32_t serial);
391
Jack Yu06181bb2017-01-10 12:10:41 -0800392 Return<void> sendDeviceState(int32_t serial, DeviceStateType deviceStateType, bool state);
393
394 Return<void> setIndicationFilter(int32_t serial, int32_t indicationFilter);
395
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700396 Return<void> responseAcknowledgement();
Amit Mahajan17249842017-01-19 15:05:45 -0800397
398 void checkReturnStatus(Return<void>& ret);
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700399};
400
Sanket Padawef220dc52017-01-02 23:46:00 -0800401void dispatchStrings(RequestInfo *pRI, int countStrings, ...) {
402 char **pStrings;
403 android::Parcel p; // TODO: should delete this after translation of all commands is complete
404 pStrings = (char **)calloc(countStrings, sizeof(char *));
405 if (pStrings == NULL) {
406 RLOGE("Memory allocation failed for request %s",
407 requestToString(pRI->pCI->requestNumber));
408 pRI->pCI->responseFunction(p, (int) pRI->socket_id, pRI->pCI->requestNumber,
409 (int) RadioResponseType::SOLICITED, pRI->token, RIL_E_NO_MEMORY, NULL, 0);
410 return;
411 }
412 va_list ap;
413 va_start(ap, countStrings);
414 for (int i = 0; i < countStrings; i++) {
415 const char* str = va_arg(ap, const char *);
416 int len = strlen(str);
417 pStrings[i] = (char *) calloc(len + 1, sizeof(char));
418 if (pStrings[i] == NULL) {
419 RLOGE("Memory allocation failed for request %s",
420 requestToString(pRI->pCI->requestNumber));
421 va_end(ap);
422 pRI->pCI->responseFunction(p, (int) pRI->socket_id, pRI->pCI->requestNumber,
423 (int) RadioResponseType::SOLICITED, pRI->token, RIL_E_NO_MEMORY, NULL, 0);
424 for (int j = 0; j < i; j++) {
425#ifdef MEMSET_FREED
426 memsetString (pStrings[j]);
427#endif
428 free(pStrings[j]);
429 }
430 free(pStrings);
431 return;
432 }
433 strncpy(pStrings[i], str, len + 1);
434 }
435 va_end(ap);
436
437 s_callbacks->onRequest(pRI->pCI->requestNumber, pStrings, countStrings * sizeof(char *), pRI);
438
439 if (pStrings != NULL) {
440 for (int i = 0 ; i < countStrings ; i++) {
441#ifdef MEMSET_FREED
442 memsetString (pStrings[i]);
443#endif
444 free(pStrings[i]);
445 }
446
447#ifdef MEMSET_FREED
448 memset(pStrings, 0, countStrings * sizeof(char *));
449#endif
450 free(pStrings);
451 }
452}
453
Amit Mahajan17249842017-01-19 15:05:45 -0800454void RadioImpl::checkReturnStatus(Return<void>& ret) {
455 if (ret.isOk() == false) {
456 RLOGE("checkReturnStatus: unable to call response/indication callback");
457 // Remote process (RIL.java) hosting the callbacks must be dead. Reset the callback objects;
458 // there's no other recovery to be done here. When the client process is back up, it will
459 // call setResponseFunctions()
Amit Mahajan932e08e2017-01-24 05:45:02 -0800460
461 // Caller should already hold rdlock, release that first
462 // note the current counter to avoid overwriting updates made by another thread before
463 // write lock is acquired.
464 int counter = mCounter;
465 pthread_rwlock_t *radioServiceRwlockPtr = radio::getRadioServiceRwlock(mSlotId);
466 int ret = pthread_rwlock_unlock(radioServiceRwlockPtr);
467 assert(ret == 0);
468
469 // acquire wrlock
470 ret = pthread_rwlock_wrlock(radioServiceRwlockPtr);
471 assert(ret == 0);
472
473 // make sure the counter value has not changed
474 if (counter == mCounter) {
475 mRadioResponse = NULL;
476 mRadioIndication = NULL;
477 mCounter++;
478 } else {
479 RLOGE("checkReturnStatus: not resetting responseFunctions as they likely got updated"
480 "on another thread");
481 }
482
483 // release wrlock
484 ret = pthread_rwlock_unlock(radioServiceRwlockPtr);
485 assert(ret == 0);
486
487 // Reacquire rdlock
488 ret = pthread_rwlock_rdlock(radioServiceRwlockPtr);
489 assert(ret == 0);
Amit Mahajan17249842017-01-19 15:05:45 -0800490 }
491}
492
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700493Return<void> RadioImpl::setResponseFunctions(
494 const ::android::sp<IRadioResponse>& radioResponseParam,
495 const ::android::sp<IRadioIndication>& radioIndicationParam) {
496 RLOGD("RadioImpl::setResponseFunctions");
Amit Mahajan932e08e2017-01-24 05:45:02 -0800497
498 pthread_rwlock_t *radioServiceRwlockPtr = radio::getRadioServiceRwlock(mSlotId);
499 int ret = pthread_rwlock_wrlock(radioServiceRwlockPtr);
500 assert(ret == 0);
501
Sanket Padawef220dc52017-01-02 23:46:00 -0800502 mRadioResponse = radioResponseParam;
503 mRadioIndication = radioIndicationParam;
Amit Mahajan932e08e2017-01-24 05:45:02 -0800504 mCounter++;
505
506 ret = pthread_rwlock_unlock(radioServiceRwlockPtr);
507 assert(ret == 0);
508
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700509 return Status::ok();
510}
511
512Return<void> RadioImpl::getIccCardStatus(int32_t serial) {
513 RLOGD("RadioImpl::getIccCardStatus: serial %d", serial);
Sanket Padawef220dc52017-01-02 23:46:00 -0800514 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_GET_SIM_STATUS);
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700515 if (pRI == NULL) {
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700516 return Void();
517 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700518 s_callbacks->onRequest(RIL_REQUEST_GET_SIM_STATUS, NULL, 0, pRI);
519
520 return Status::ok();
521}
522
Sanket Padawef220dc52017-01-02 23:46:00 -0800523Return<void> RadioImpl::supplyIccPinForApp(int32_t serial, const hidl_string& pin,
524 const hidl_string& aid) {
525 RLOGD("RadioImpl::supplyIccPinForApp: serial %d", serial);
526 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_ENTER_SIM_PIN);
527 if (pRI == NULL) {
528 return Void();
529 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700530
Sanket Padawef220dc52017-01-02 23:46:00 -0800531 dispatchStrings(pRI, 2, (const char *)pin, (const char *)aid);
532 return Status::ok();
533}
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700534
Sanket Padawef220dc52017-01-02 23:46:00 -0800535Return<void> RadioImpl::supplyIccPukForApp(int32_t serial, const hidl_string& puk,
536 const hidl_string& pin, const hidl_string& aid) {
537 RLOGD("RadioImpl::supplyIccPukForApp: serial %d", serial);
538 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_ENTER_SIM_PUK);
539 if (pRI == NULL) {
540 return Void();
541 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700542
Sanket Padawef220dc52017-01-02 23:46:00 -0800543 dispatchStrings(pRI, 3, (const char *)puk, (const char *)pin, (const char *)aid);
544 return Status::ok();
545}
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700546
Sanket Padawef220dc52017-01-02 23:46:00 -0800547Return<void> RadioImpl::supplyIccPin2ForApp(int32_t serial, const hidl_string& pin2,
548 const hidl_string& aid) {
549 RLOGD("RadioImpl::supplyIccPin2ForApp: serial %d", serial);
550 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_ENTER_SIM_PIN2);
551 if (pRI == NULL) {
552 return Void();
553 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700554
Sanket Padawef220dc52017-01-02 23:46:00 -0800555 dispatchStrings(pRI, 2, (const char *)pin2, (const char *)aid);
556 return Status::ok();
557}
558
559Return<void> RadioImpl::supplyIccPuk2ForApp(int32_t serial, const hidl_string& puk2,
560 const hidl_string& pin2, const hidl_string& aid) {
561 RLOGD("RadioImpl::supplyIccPuk2ForApp: serial %d", serial);
562 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_ENTER_SIM_PUK2);
563 if (pRI == NULL) {
564 return Void();
565 }
566
567 dispatchStrings(pRI, 3, (const char *)puk2, (const char *)pin2, (const char *)aid);
568 return Status::ok();
569}
570
571Return<void> RadioImpl::changeIccPinForApp(int32_t serial, const hidl_string& oldPin,
572 const hidl_string& newPin, const hidl_string& aid) {
573 RLOGD("RadioImpl::changeIccPinForApp: serial %d", serial);
574 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_CHANGE_SIM_PIN);
575 if (pRI == NULL) {
576 return Void();
577 }
578
579 dispatchStrings(pRI, 3, (const char *)oldPin, (const char *)newPin,
580 (const char *)aid);
581 return Status::ok();
582}
583
584Return<void> RadioImpl::changeIccPin2ForApp(int32_t serial, const hidl_string& oldPin2,
585 const hidl_string& newPin2, const hidl_string& aid) {
586 RLOGD("RadioImpl::changeIccPin2ForApp: serial %d", serial);
587 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_CHANGE_SIM_PIN2);
588 if (pRI == NULL) {
589 return Void();
590 }
591
592 dispatchStrings(pRI, 3, (const char *)oldPin2, (const char *)newPin2,
593 (const char *)aid);
594 return Status::ok();
595}
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700596
597Return<void> RadioImpl::supplyNetworkDepersonalization(int32_t serial,
Sanket Padawef220dc52017-01-02 23:46:00 -0800598 const hidl_string& netPin) {
599 RLOGD("RadioImpl::supplyNetworkDepersonalization: serial %d", serial);
600 RequestInfo *pRI = android::addRequestToList(serial, mSlotId,
601 RIL_REQUEST_ENTER_NETWORK_DEPERSONALIZATION);
602 if (pRI == NULL) {
603 return Void();
604 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700605
Sanket Padawef220dc52017-01-02 23:46:00 -0800606 dispatchStrings(pRI, 1, (const char *)netPin);
607 return Status::ok();
608}
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700609
Sanket Padawef220dc52017-01-02 23:46:00 -0800610Return<void> RadioImpl::getCurrentCalls(int32_t serial) {
611 RLOGD("RadioImpl::getCurrentCalls: serial %d", serial);
612 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_GET_CURRENT_CALLS);
613 if (pRI == NULL) {
614 return Void();
615 }
616
617 s_callbacks->onRequest(RIL_REQUEST_GET_CURRENT_CALLS, NULL, 0, pRI);
618 return Status::ok();
619}
620
621Return<void> RadioImpl::dial(int32_t serial, const Dial& dialInfo) {
622 RLOGD("RadioImpl::dial: serial %d", serial);
623 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_DIAL);
624 if (pRI == NULL) {
625 return Void();
626 }
627 RIL_Dial dial;
628 RIL_UUS_Info uusInfo;
629 int32_t sizeOfDial = sizeof(dial);
630
631 memset (&dial, 0, sizeOfDial);
632
633 dial.address = (char *) calloc(dialInfo.address.size() + 1, sizeof(char));
634 if (dial.address == NULL) {
635 android::Parcel p;
636 RLOGE("Memory allocation failed for request %s", requestToString(pRI->pCI->requestNumber));
637 pRI->pCI->responseFunction(p, (int) pRI->socket_id, pRI->pCI->requestNumber,
638 (int) RadioResponseType::SOLICITED, pRI->token, RIL_E_NO_MEMORY, NULL, 0);
639 return Void();
640 }
641 strcpy(dial.address, dialInfo.address.c_str());
642 dial.clir = (int)dialInfo.clir;
643
644 memset(&uusInfo, 0, sizeof(RIL_UUS_Info));
645 if (dialInfo.uusInfo.size() != 0) {
646 int32_t len;
647
648 uusInfo.uusType = (RIL_UUS_Type) dialInfo.uusInfo[0].uusType;
649 uusInfo.uusDcs = (RIL_UUS_DCS) dialInfo.uusInfo[0].uusDcs;
650
651 if (dialInfo.uusInfo[0].uusData.size() == 0) {
652 uusInfo.uusData = NULL;
653 len = 0;
654 } else {
655 len = dialInfo.uusInfo[0].uusData.size();
656 uusInfo.uusData = (char*) calloc(len + 1, sizeof(char));
657 // check if the length is invalid
658 if (uusInfo.uusData == NULL) {
659 RLOGE("Memory allocation failed for request %s",
660 requestToString(pRI->pCI->requestNumber));
661 android::Parcel p;
662 pRI->pCI->responseFunction(p, (int) pRI->socket_id, pRI->pCI->requestNumber,
663 (int) RadioResponseType::SOLICITED, pRI->token, RIL_E_NO_MEMORY, NULL, 0);
664 free(dial.address);
665 return Void();
666 }
667 strcpy(uusInfo.uusData, dialInfo.uusInfo[0].uusData.c_str());
668 }
669
670 uusInfo.uusLength = len;
671 dial.uusInfo = &uusInfo;
672 }
673
674 s_callbacks->onRequest(RIL_REQUEST_DIAL, &dial, sizeOfDial, pRI);
675
676#ifdef MEMSET_FREED
677 memsetString (dial.address);
678#endif
679 free (dial.address);
680
681#ifdef MEMSET_FREED
682 memsetString (uusInfo.uusData);
683#endif
684 if (uusInfo.uusData != NULL) {
685 free(uusInfo.uusData);
686 }
687
688 return Status::ok();
689}
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700690
691Return<void> RadioImpl::getImsiForApp(int32_t serial,
Sanket Padawef220dc52017-01-02 23:46:00 -0800692 const hidl_string& aid) {return Status::ok();}
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700693
694Return<void> RadioImpl::hangup(int32_t serial, int32_t gsmIndex) {return Status::ok();}
695
696Return<void> RadioImpl::hangupWaitingOrBackground(int32_t serial) {return Status::ok();}
697
698Return<void> RadioImpl::hangupForegroundResumeBackground(int32_t serial) {return Status::ok();}
699
700Return<void> RadioImpl::switchWaitingOrHoldingAndActive(int32_t serial) {return Status::ok();}
701
702Return<void> RadioImpl::conference(int32_t serial) {return Status::ok();}
703
704Return<void> RadioImpl::rejectCall(int32_t serial) {return Status::ok();}
705
706Return<void> RadioImpl::getLastCallFailCause(int32_t serial) {return Status::ok();}
707
708Return<void> RadioImpl::getSignalStrength(int32_t serial) {return Status::ok();}
709
710Return<void> RadioImpl::getVoiceRegistrationState(int32_t serial) {return Status::ok();}
711
712Return<void> RadioImpl::getDataRegistrationState(int32_t serial) {return Status::ok();}
713
714Return<void> RadioImpl::getOperator(int32_t serial) {return Status::ok();}
715
716Return<void> RadioImpl::setRadioPower(int32_t serial, bool on) {return Status::ok();}
717
718Return<void> RadioImpl::sendDtmf(int32_t serial,
719 const ::android::hardware::hidl_string& s) {return Status::ok();}
720
721Return<void> RadioImpl::sendSms(int32_t serial, const GsmSmsMessage& message) {return Status::ok();}
722
723Return<void> RadioImpl::sendSMSExpectMore(int32_t serial, const GsmSmsMessage& message) {return Status::ok();}
724
Jack Yu06181bb2017-01-10 12:10:41 -0800725Return<void> RadioImpl::setupDataCall(int32_t serial, RadioTechnology radioTechnology,
726 const DataProfileInfo& dataProfileInfo, bool modemCognitive, bool roamingAllowed) {
727 return Status::ok();}
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700728
729Return<void> RadioImpl::iccIOForApp(int32_t serial,
730 const IccIo& iccIo) {return Status::ok();}
731
732Return<void> RadioImpl::sendUssd(int32_t serial,
733 const ::android::hardware::hidl_string& ussd) {return Status::ok();}
734
735Return<void> RadioImpl::cancelPendingUssd(int32_t serial) {return Status::ok();}
736
737Return<void> RadioImpl::getClir(int32_t serial) {return Status::ok();}
738
739Return<void> RadioImpl::setClir(int32_t serial, int32_t status) {return Status::ok();}
740
741Return<void> RadioImpl::getCallForwardStatus(int32_t serial,
742 const CallForwardInfo& callInfo) {return Status::ok();}
743
744Return<void> RadioImpl::setCallForward(int32_t serial,
745 const CallForwardInfo& callInfo) {return Status::ok();}
746
747Return<void> RadioImpl::getCallWaiting(int32_t serial, int32_t serviceClass) {return Status::ok();}
748
749Return<void> RadioImpl::setCallWaiting(int32_t serial, bool enable, int32_t serviceClass) {return Status::ok();}
750
751Return<void> RadioImpl::acknowledgeLastIncomingGsmSms(int32_t serial,
752 bool success, SmsAcknowledgeFailCause cause) {return Status::ok();}
753
754Return<void> RadioImpl::acceptCall(int32_t serial) {return Status::ok();}
755
756Return<void> RadioImpl::deactivateDataCall(int32_t serial,
757 int32_t cid, bool reasonRadioShutDown) {return Status::ok();}
758
759Return<void> RadioImpl::getFacilityLockForApp(int32_t serial,
760 const ::android::hardware::hidl_string& facility,
761 const ::android::hardware::hidl_string& password,
762 int32_t serviceClass,
763 const ::android::hardware::hidl_string& appId) {return Status::ok();}
764
765Return<void> RadioImpl::setFacilityLockForApp(int32_t serial,
766 const ::android::hardware::hidl_string& facility,
767 bool lockState,
768 const ::android::hardware::hidl_string& password,
769 int32_t serviceClass,
770 const ::android::hardware::hidl_string& appId) {return Status::ok();}
771
772Return<void> RadioImpl::setBarringPassword(int32_t serial,
773 const ::android::hardware::hidl_string& facility,
774 const ::android::hardware::hidl_string& oldPassword,
775 const ::android::hardware::hidl_string& newPassword) {return Status::ok();}
776
777Return<void> RadioImpl::getNetworkSelectionMode(int32_t serial) {return Status::ok();}
778
779Return<void> RadioImpl::setNetworkSelectionModeAutomatic(int32_t serial) {return Status::ok();}
780
781Return<void> RadioImpl::setNetworkSelectionModeManual(int32_t serial,
782 const ::android::hardware::hidl_string& operatorNumeric) {return Status::ok();}
783
784Return<void> RadioImpl::getAvailableNetworks(int32_t serial) {return Status::ok();}
785
786Return<void> RadioImpl::startDtmf(int32_t serial,
787 const ::android::hardware::hidl_string& s) {return Status::ok();}
788
789Return<void> RadioImpl::stopDtmf(int32_t serial) {return Status::ok();}
790
791Return<void> RadioImpl::getBasebandVersion(int32_t serial) {return Status::ok();}
792
793Return<void> RadioImpl::separateConnection(int32_t serial, int32_t gsmIndex) {return Status::ok();}
794
795Return<void> RadioImpl::setMute(int32_t serial, bool enable) {return Status::ok();}
796
797Return<void> RadioImpl::getMute(int32_t serial) {return Status::ok();}
798
799Return<void> RadioImpl::getClip(int32_t serial) {return Status::ok();}
800
801Return<void> RadioImpl::getDataCallList(int32_t serial) {return Status::ok();}
802
803Return<void> RadioImpl::sendOemRadioRequestRaw(int32_t serial,
804 const ::android::hardware::hidl_vec<uint8_t>& data) {return Status::ok();}
805
806Return<void> RadioImpl::sendOemRadioRequestStrings(int32_t serial,
807 const ::android::hardware::hidl_vec<::android::hardware::hidl_string>& data) {return Status::ok();}
808
809Return<void> RadioImpl::sendScreenState(int32_t serial, bool enable) {return Status::ok();}
810
811Return<void> RadioImpl::setSuppServiceNotifications(int32_t serial, bool enable) {return Status::ok();}
812
813Return<void> RadioImpl::writeSmsToSim(int32_t serial,
814 const SmsWriteArgs& smsWriteArgs) {return Status::ok();}
815
816Return<void> RadioImpl::deleteSmsOnSim(int32_t serial, int32_t index) {return Status::ok();}
817
818Return<void> RadioImpl::setBandMode(int32_t serial, RadioBandMode mode) {return Status::ok();}
819
820Return<void> RadioImpl::getAvailableBandModes(int32_t serial) {return Status::ok();}
821
822Return<void> RadioImpl::sendEnvelope(int32_t serial,
823 const ::android::hardware::hidl_string& command) {return Status::ok();}
824
825Return<void> RadioImpl::sendTerminalResponseToSim(int32_t serial,
826 const ::android::hardware::hidl_string& commandResponse) {return Status::ok();}
827
828Return<void> RadioImpl::handleStkCallSetupRequestFromSim(int32_t serial, bool accept) {return Status::ok();}
829
830Return<void> RadioImpl::explicitCallTransfer(int32_t serial) {return Status::ok();}
831
832Return<void> RadioImpl::setPreferredNetworkType(int32_t serial, PreferredNetworkType nwType) {return Status::ok();}
833
834Return<void> RadioImpl::getPreferredNetworkType(int32_t serial) {return Status::ok();}
835
836Return<void> RadioImpl::getNeighboringCids(int32_t serial) {return Status::ok();}
837
838Return<void> RadioImpl::setLocationUpdates(int32_t serial, bool enable) {return Status::ok();}
839
840Return<void> RadioImpl::setCdmaSubscriptionSource(int32_t serial, CdmaSubscriptionSource cdmaSub) {return Status::ok();}
841
842Return<void> RadioImpl::setCdmaRoamingPreference(int32_t serial, CdmaRoamingType type) {return Status::ok();}
843
844Return<void> RadioImpl::getCdmaRoamingPreference(int32_t serial) {return Status::ok();}
845
846Return<void> RadioImpl::setTTYMode(int32_t serial, TtyMode mode) {return Status::ok();}
847
848Return<void> RadioImpl::getTTYMode(int32_t serial) {return Status::ok();}
849
850Return<void> RadioImpl::setPreferredVoicePrivacy(int32_t serial, bool enable) {return Status::ok();}
851
852Return<void> RadioImpl::getPreferredVoicePrivacy(int32_t serial) {return Status::ok();}
853
854Return<void> RadioImpl::sendCDMAFeatureCode(int32_t serial,
855 const ::android::hardware::hidl_string& featureCode) {return Status::ok();}
856
857Return<void> RadioImpl::sendBurstDtmf(int32_t serial,
858 const ::android::hardware::hidl_string& dtmf,
859 int32_t on,
860 int32_t off) {return Status::ok();}
861
862Return<void> RadioImpl::sendCdmaSms(int32_t serial, const CdmaSmsMessage& sms) {return Status::ok();}
863
864Return<void> RadioImpl::acknowledgeLastIncomingCdmaSms(int32_t serial, const CdmaSmsAck& smsAck) {return Status::ok();}
865
866Return<void> RadioImpl::getGsmBroadcastConfig(int32_t serial) {return Status::ok();}
867
868Return<void> RadioImpl::setGsmBroadcastConfig(int32_t serial,
869 const hidl_vec<GsmBroadcastSmsConfigInfo>& configInfo) {return Status::ok();}
870
871Return<void> RadioImpl::setGsmBroadcastActivation(int32_t serial, bool activate) {return Status::ok();}
872
873Return<void> RadioImpl::getCdmaBroadcastConfig(int32_t serial) {return Status::ok();}
874
875Return<void> RadioImpl::setCdmaBroadcastConfig(int32_t serial,
876 const hidl_vec<CdmaBroadcastSmsConfigInfo>& configInfo) {return Status::ok();}
877
878Return<void> RadioImpl::setCdmaBroadcastActivation(int32_t serial, bool activate) {return Status::ok();}
879
880Return<void> RadioImpl::getCDMASubscription(int32_t serial) {return Status::ok();}
881
882Return<void> RadioImpl::writeSmsToRuim(int32_t serial, const CdmaSmsWriteArgs& cdmaSms) {return Status::ok();}
883
884Return<void> RadioImpl::deleteSmsOnRuim(int32_t serial, int32_t index) {return Status::ok();}
885
886Return<void> RadioImpl::getDeviceIdentity(int32_t serial) {return Status::ok();}
887
888Return<void> RadioImpl::exitEmergencyCallbackMode(int32_t serial) {return Status::ok();}
889
890Return<void> RadioImpl::getSmscAddress(int32_t serial) {return Status::ok();}
891
892Return<void> RadioImpl::setSmscAddress(int32_t serial,
893 const ::android::hardware::hidl_string& smsc) {return Status::ok();}
894
895Return<void> RadioImpl::reportSmsMemoryStatus(int32_t serial, bool available) {return Status::ok();}
896
897Return<void> RadioImpl::reportStkServiceIsRunning(int32_t serial) {return Status::ok();}
898
899Return<void> RadioImpl::getCdmaSubscriptionSource(int32_t serial) {return Status::ok();}
900
901Return<void> RadioImpl::requestIsimAuthentication(int32_t serial,
902 const ::android::hardware::hidl_string& challenge) {return Status::ok();}
903
904Return<void> RadioImpl::acknowledgeIncomingGsmSmsWithPdu(int32_t serial,
905 bool success,
906 const ::android::hardware::hidl_string& ackPdu) {return Status::ok();}
907
908Return<void> RadioImpl::sendEnvelopeWithStatus(int32_t serial,
909 const ::android::hardware::hidl_string& contents) {return Status::ok();}
910
911Return<void> RadioImpl::getVoiceRadioTechnology(int32_t serial) {return Status::ok();}
912
913Return<void> RadioImpl::getCellInfoList(int32_t serial) {return Status::ok();}
914
915Return<void> RadioImpl::setCellInfoListRate(int32_t serial, int32_t rate) {return Status::ok();}
916
Jack Yu06181bb2017-01-10 12:10:41 -0800917Return<void> RadioImpl::setInitialAttachApn(int32_t serial, const DataProfileInfo& dataProfileInfo, bool modemCognitive) {return Status::ok();}
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700918
919Return<void> RadioImpl::getImsRegistrationState(int32_t serial) {return Status::ok();}
920
921Return<void> RadioImpl::sendImsSms(int32_t serial, const ImsSmsMessage& message) {return Status::ok();}
922
923Return<void> RadioImpl::iccTransmitApduBasicChannel(int32_t serial, const SimApdu& message) {return Status::ok();}
924
925Return<void> RadioImpl::iccOpenLogicalChannel(int32_t serial,
926 const ::android::hardware::hidl_string& aid) {return Status::ok();}
927
928Return<void> RadioImpl::iccCloseLogicalChannel(int32_t serial, int32_t channelId) {return Status::ok();}
929
930Return<void> RadioImpl::iccTransmitApduLogicalChannel(int32_t serial, const SimApdu& message) {return Status::ok();}
931
932Return<void> RadioImpl::nvReadItem(int32_t serial, NvItem itemId) {return Status::ok();}
933
934Return<void> RadioImpl::nvWriteItem(int32_t serial, const NvWriteItem& item) {return Status::ok();}
935
936Return<void> RadioImpl::nvWriteCdmaPrl(int32_t serial,
937 const ::android::hardware::hidl_vec<uint8_t>& prl) {return Status::ok();}
938
939Return<void> RadioImpl::nvResetConfig(int32_t serial, ResetNvType resetType) {return Status::ok();}
940
941Return<void> RadioImpl::setUiccSubscription(int32_t serial, const SelectUiccSub& uiccSub) {return Status::ok();}
942
943Return<void> RadioImpl::setDataAllowed(int32_t serial, bool allow) {return Status::ok();}
944
945Return<void> RadioImpl::getHardwareConfig(int32_t serial) {return Status::ok();}
946
947Return<void> RadioImpl::requestIccSimAuthentication(int32_t serial,
948 int32_t authContext,
949 const ::android::hardware::hidl_string& authData,
950 const ::android::hardware::hidl_string& aid) {return Status::ok();}
951
952Return<void> RadioImpl::setDataProfile(int32_t serial,
953 const ::android::hardware::hidl_vec<DataProfileInfo>& profiles) {return Status::ok();}
954
955Return<void> RadioImpl::requestShutdown(int32_t serial) {return Status::ok();}
956
957Return<void> RadioImpl::getRadioCapability(int32_t serial) {return Status::ok();}
958
959Return<void> RadioImpl::setRadioCapability(int32_t serial, const RadioCapability& rc) {return Status::ok();}
960
961Return<void> RadioImpl::startLceService(int32_t serial, int32_t reportInterval, bool pullMode) {return Status::ok();}
962
963Return<void> RadioImpl::stopLceService(int32_t serial) {return Status::ok();}
964
965Return<void> RadioImpl::pullLceData(int32_t serial) {return Status::ok();}
966
967Return<void> RadioImpl::getModemActivityInfo(int32_t serial) {return Status::ok();}
968
969Return<void> RadioImpl::setAllowedCarriers(int32_t serial,
970 bool allAllowed,
971 const CarrierRestrictions& carriers) {return Status::ok();}
972
973Return<void> RadioImpl::getAllowedCarriers(int32_t serial) {return Status::ok();}
974
Jack Yu06181bb2017-01-10 12:10:41 -0800975Return<void> RadioImpl::sendDeviceState(int32_t serial, DeviceStateType deviceStateType, bool state) {return Status::ok();}
976
977Return<void> RadioImpl::setIndicationFilter(int32_t serial, int32_t indicationFilter) {return Status::ok();}
978
Sanket Padawef220dc52017-01-02 23:46:00 -0800979Return<void> RadioImpl::responseAcknowledgement() {
980 android::releaseWakeLock();
981 return Status::ok();
982}
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700983
984hidl_string convertCharPtrToHidlString(char *ptr) {
985 hidl_string ret;
986 if (ptr != NULL) {
987 ret.setToExternal(ptr, strlen(ptr));
988 }
989 return ret;
990}
991
Sanket Padawef220dc52017-01-02 23:46:00 -0800992void radio::acknowledgeRequest(int slotId, int serial) {
993 if (radioService[slotId]->mRadioResponse != NULL) {
Amit Mahajan17249842017-01-19 15:05:45 -0800994 Return<void> retStatus = radioService[slotId]->mRadioResponse->acknowledgeRequest(serial);
995 radioService[slotId]->checkReturnStatus(retStatus);
Sanket Padawef220dc52017-01-02 23:46:00 -0800996 } else {
Amit Mahajan5829a472016-12-28 17:28:07 -0800997 RLOGE("radio::acknowledgeRequest: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawef220dc52017-01-02 23:46:00 -0800998 }
999}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001000
Sanket Padawef220dc52017-01-02 23:46:00 -08001001void populateResponseInfo(RadioResponseInfo& responseInfo, int serial, int responseType,
1002 RIL_Errno e) {
1003 responseInfo.serial = serial;
1004 switch (responseType) {
1005 case RESPONSE_SOLICITED:
1006 responseInfo.type = RadioResponseType::SOLICITED;
1007 break;
1008 case RESPONSE_SOLICITED_ACK_EXP:
1009 responseInfo.type = RadioResponseType::SOLICITED_ACK_EXP;
1010 break;
1011 }
1012 responseInfo.error = (RadioError) e;
1013}
1014
1015int responseInt(RadioResponseInfo& responseInfo, int serial, int responseType, RIL_Errno e,
1016 void *response, size_t responseLen) {
1017 populateResponseInfo(responseInfo, serial, responseType, e);
1018 int ret = -1;
1019
1020 if (response == NULL || responseLen != sizeof(int)) {
1021 RLOGE("responseInt: Invalid response");
1022 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
1023 } else {
1024 int *p_int = (int *) response;
1025 ret = p_int[0];
1026 }
1027 return ret;
1028}
1029
1030int radio::getIccCardStatusResponse(android::Parcel &p, int slotId, int requestNumber,
1031 int responseType, int serial, RIL_Errno e, void *response, size_t responseLen) {
1032 RLOGD("radio::getIccCardStatusResponse: serial %d", serial);
1033
1034 if (radioService[slotId]->mRadioResponse != NULL) {
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001035 RadioResponseInfo responseInfo;
Sanket Padawef220dc52017-01-02 23:46:00 -08001036 populateResponseInfo(responseInfo, serial, responseType, e);
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001037 CardStatus cardStatus;
Sanket Padawef220dc52017-01-02 23:46:00 -08001038 if (response == NULL || responseLen != sizeof(RIL_CardStatus_v6)) {
1039 RLOGE("radio::getIccCardStatusResponse: Invalid response");
1040 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
1041 memset(&cardStatus, 0, sizeof(cardStatus));
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001042 } else {
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001043 RIL_CardStatus_v6 *p_cur = ((RIL_CardStatus_v6 *) response);
1044 cardStatus.cardState = (CardState) p_cur->card_state;
1045 cardStatus.universalPinState = (PinState) p_cur->universal_pin_state;
1046 cardStatus.gsmUmtsSubscriptionAppIndex = p_cur->gsm_umts_subscription_app_index;
1047 cardStatus.cdmaSubscriptionAppIndex = p_cur->cdma_subscription_app_index;
1048 cardStatus.imsSubscriptionAppIndex = p_cur->ims_subscription_app_index;
1049
1050 RIL_AppStatus *rilAppStatus = p_cur->applications;
1051 cardStatus.applications.resize(p_cur->num_applications);
1052 AppStatus *appStatus = cardStatus.applications.data();
Sanket Padawef220dc52017-01-02 23:46:00 -08001053 RLOGD("radio::getIccCardStatusResponse: num_applications %d", p_cur->num_applications);
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001054 for (int i = 0; i < p_cur->num_applications; i++) {
1055 appStatus[i].appType = (AppType) rilAppStatus[i].app_type;
1056 appStatus[i].appState = (AppState) rilAppStatus[i].app_state;
1057 appStatus[i].persoSubstate = (PersoSubstate) rilAppStatus[i].perso_substate;
1058 appStatus[i].aidPtr = convertCharPtrToHidlString(rilAppStatus[i].aid_ptr);
1059 appStatus[i].appLabelPtr = convertCharPtrToHidlString(
1060 rilAppStatus[i].app_label_ptr);
1061 appStatus[i].pin1Replaced = rilAppStatus[i].pin1_replaced;
1062 appStatus[i].pin1 = (PinState) rilAppStatus[i].pin1;
1063 appStatus[i].pin2 = (PinState) rilAppStatus[i].pin2;
1064 }
1065 }
1066
Amit Mahajan17249842017-01-19 15:05:45 -08001067 Return<void> retStatus = radioService[slotId]->mRadioResponse->
1068 getIccCardStatusResponse(responseInfo, cardStatus);
1069 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001070 } else {
Sanket Padawef220dc52017-01-02 23:46:00 -08001071 RLOGE("radio::getIccCardStatusResponse: radioService[%d]->mRadioResponse == NULL", slotId);
1072 }
1073
1074 return 0;
1075}
1076
1077int radio::supplyIccPinForAppResponse(android::Parcel &p, int slotId, int requestNumber,
1078 int responseType, int serial, RIL_Errno e, void *response, size_t responseLen) {
1079 RLOGD("radio::supplyIccPinForAppResponse: serial %d", serial);
1080
1081 if (radioService[slotId]->mRadioResponse != NULL) {
1082 RadioResponseInfo responseInfo;
1083 int ret = responseInt(responseInfo, serial, responseType, e, response, responseLen);
Amit Mahajan17249842017-01-19 15:05:45 -08001084 Return<void> retStatus = radioService[slotId]->mRadioResponse->
1085 supplyIccPinForAppResponse(responseInfo, ret);
1086 radioService[slotId]->checkReturnStatus(retStatus);
Sanket Padawef220dc52017-01-02 23:46:00 -08001087 } else {
1088 RLOGE("radio::supplyIccPinForAppResponse: radioService[%d]->mRadioResponse == NULL",
1089 slotId);
1090 }
1091
1092 return 0;
1093}
1094
1095int radio::supplyIccPukForAppResponse(android::Parcel &p, int slotId, int requestNumber,
1096 int responseType, int serial, RIL_Errno e, void *response, size_t responseLen) {
1097 RLOGD("radio::supplyIccPukForAppResponse: serial %d", serial);
1098
1099 if (radioService[slotId]->mRadioResponse != NULL) {
1100 RadioResponseInfo responseInfo;
1101 int ret = responseInt(responseInfo, serial, responseType, e, response, responseLen);
Amit Mahajan17249842017-01-19 15:05:45 -08001102 Return<void> retStatus = radioService[slotId]->mRadioResponse->supplyIccPukForAppResponse(responseInfo, ret);
1103 radioService[slotId]->checkReturnStatus(retStatus);
Sanket Padawef220dc52017-01-02 23:46:00 -08001104 } else {
1105 RLOGE("radio::supplyIccPukForAppResponse: radioService[%d]->mRadioResponse == NULL",
1106 slotId);
1107 }
1108
1109 return 0;
1110}
1111
1112int radio::supplyIccPin2ForAppResponse(android::Parcel &p, int slotId, int requestNumber,
1113 int responseType, int serial, RIL_Errno e, void *response, size_t responseLen) {
1114 RLOGD("radio::supplyIccPin2ForAppResponse: serial %d", serial);
1115
1116 if (radioService[slotId]->mRadioResponse != NULL) {
1117 RadioResponseInfo responseInfo;
1118 int ret = responseInt(responseInfo, serial, responseType, e, response, responseLen);
Amit Mahajan17249842017-01-19 15:05:45 -08001119 Return<void> retStatus = radioService[slotId]->mRadioResponse->
1120 supplyIccPin2ForAppResponse(responseInfo, ret);
1121 radioService[slotId]->checkReturnStatus(retStatus);
Sanket Padawef220dc52017-01-02 23:46:00 -08001122 } else {
1123 RLOGE("radio::supplyIccPin2ForAppResponse: radioService[%d]->mRadioResponse == NULL",
1124 slotId);
1125 }
1126
1127 return 0;
1128}
1129
1130int radio::supplyIccPuk2ForAppResponse(android::Parcel &p, int slotId, int requestNumber,
1131 int responseType, int serial, RIL_Errno e, void *response, size_t responseLen) {
1132 RLOGD("radio::supplyIccPuk2ForAppResponse: serial %d", serial);
1133
1134 if (radioService[slotId]->mRadioResponse != NULL) {
1135 RadioResponseInfo responseInfo;
1136 int ret = responseInt(responseInfo, serial, responseType, e, response, responseLen);
Amit Mahajan17249842017-01-19 15:05:45 -08001137 Return<void> retStatus = radioService[slotId]->mRadioResponse->
1138 supplyIccPuk2ForAppResponse(responseInfo, ret);
1139 radioService[slotId]->checkReturnStatus(retStatus);
Sanket Padawef220dc52017-01-02 23:46:00 -08001140 } else {
1141 RLOGE("radio::supplyIccPuk2ForAppResponse: radioService[%d]->mRadioResponse == NULL",
1142 slotId);
1143 }
1144
1145 return 0;
1146}
1147
1148int radio::changeIccPinForAppResponse(android::Parcel &p, int slotId, int requestNumber,
1149 int responseType, int serial, RIL_Errno e, void *response, size_t responseLen) {
1150 RLOGD("radio::changeIccPinForAppResponse: serial %d", serial);
1151
1152 if (radioService[slotId]->mRadioResponse != NULL) {
1153 RadioResponseInfo responseInfo;
1154 int ret = responseInt(responseInfo, serial, responseType, e, response, responseLen);
Amit Mahajan17249842017-01-19 15:05:45 -08001155 Return<void> retStatus = radioService[slotId]->mRadioResponse->
1156 changeIccPinForAppResponse(responseInfo, ret);
1157 radioService[slotId]->checkReturnStatus(retStatus);
Sanket Padawef220dc52017-01-02 23:46:00 -08001158 } else {
1159 RLOGE("radio::changeIccPinForAppResponse: radioService[%d]->mRadioResponse == NULL",
1160 slotId);
1161 }
1162
1163 return 0;
1164}
1165
1166int radio::changeIccPin2ForAppResponse(android::Parcel &p, int slotId, int requestNumber,
1167 int responseType, int serial, RIL_Errno e, void *response, size_t responseLen) {
1168 RLOGD("radio::changeIccPin2ForAppResponse: serial %d", serial);
1169
1170 if (radioService[slotId]->mRadioResponse != NULL) {
1171 RadioResponseInfo responseInfo;
1172 int ret = responseInt(responseInfo, serial, responseType, e, response, responseLen);
Amit Mahajan17249842017-01-19 15:05:45 -08001173 Return<void> retStatus = radioService[slotId]->mRadioResponse->
1174 changeIccPin2ForAppResponse(responseInfo, ret);
1175 radioService[slotId]->checkReturnStatus(retStatus);
Sanket Padawef220dc52017-01-02 23:46:00 -08001176 } else {
1177 RLOGE("radio::changeIccPin2ForAppResponse: radioService[%d]->mRadioResponse == NULL",
1178 slotId);
1179 }
1180
1181 return 0;
1182}
1183
1184int radio::supplyNetworkDepersonalizationResponse(android::Parcel &p, int slotId, int requestNumber,
1185 int responseType, int serial, RIL_Errno e, void *response, size_t responseLen) {
1186 RLOGD("radio::supplyNetworkDepersonalizationResponse: serial %d", serial);
1187
1188 if (radioService[slotId]->mRadioResponse != NULL) {
1189 RadioResponseInfo responseInfo;
1190 int ret = responseInt(responseInfo, serial, responseType, e, response, responseLen);
Amit Mahajan17249842017-01-19 15:05:45 -08001191 Return<void> retStatus = radioService[slotId]->mRadioResponse->
1192 supplyNetworkDepersonalizationResponse(responseInfo, ret);
1193 radioService[slotId]->checkReturnStatus(retStatus);
Sanket Padawef220dc52017-01-02 23:46:00 -08001194 } else {
1195 RLOGE("radio::supplyNetworkDepersonalizationResponse: radioService[%d]->mRadioResponse == \
1196 NULL", slotId);
1197 }
1198
1199 return 0;
1200}
1201
1202int radio::getCurrentCallsResponse(android::Parcel &p, int slotId, int requestNumber,
1203 int responseType, int serial, RIL_Errno e, void *response, size_t responseLen) {
1204 RLOGD("radio::getCurrentCallsResponse: serial %d", serial);
1205
1206 if (radioService[slotId]->mRadioResponse != NULL) {
1207 RadioResponseInfo responseInfo;
1208 populateResponseInfo(responseInfo, serial, responseType, e);
1209
1210 hidl_vec<Call> calls;
1211 if (response == NULL || (responseLen % sizeof(RIL_Call *)) != 0) {
1212 RLOGE("radio::getCurrentCallsResponse: Invalid response");
Amit Mahajan5829a472016-12-28 17:28:07 -08001213 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
Sanket Padawef220dc52017-01-02 23:46:00 -08001214 } else {
1215 int num = responseLen / sizeof(RIL_Call *);
1216 calls.resize(num);
1217
1218 for (int i = 0 ; i < num ; i++) {
1219 RIL_Call *p_cur = ((RIL_Call **) response)[i];
1220 /* each call info */
1221 calls[i].state = (CallState) p_cur->state;
1222 calls[i].index = p_cur->index;
1223 calls[i].toa = p_cur->toa;
1224 calls[i].isMpty = p_cur->isMpty;
1225 calls[i].isMT = p_cur->isMT;
1226 calls[i].als = p_cur->als;
1227 calls[i].isVoice = p_cur->isVoice;
1228 calls[i].isVoicePrivacy = p_cur->isVoicePrivacy;
1229 calls[i].number = convertCharPtrToHidlString(p_cur->number);
1230 calls[i].numberPresentation = (CallPresentation) p_cur->numberPresentation;
1231 calls[i].name = convertCharPtrToHidlString(p_cur->name);
1232 calls[i].namePresentation = (CallPresentation) p_cur->namePresentation;
1233 if (!(p_cur->uusInfo == NULL || p_cur->uusInfo->uusData == NULL)) {
1234 RIL_UUS_Info *uusInfo = p_cur->uusInfo;
1235 calls[i].uusInfo[0].uusType = (UusType) uusInfo->uusType;
1236 calls[i].uusInfo[0].uusDcs = (UusDcs) uusInfo->uusDcs;
1237 // convert uusInfo->uusData to a null-terminated string
1238 if (uusInfo->uusData != NULL) {
1239 char *nullTermStr = strndup(uusInfo->uusData, uusInfo->uusLength);
1240 calls[i].uusInfo[0].uusData = nullTermStr;
1241 free(nullTermStr);
1242 } else {
1243 hidl_string emptyString;
1244 calls[i].uusInfo[0].uusData = emptyString;
1245 }
1246 }
1247 }
1248 }
1249
Amit Mahajan17249842017-01-19 15:05:45 -08001250 Return<void> retStatus = radioService[slotId]->mRadioResponse->
1251 getCurrentCallsResponse(responseInfo, calls);
1252 radioService[slotId]->checkReturnStatus(retStatus);
Sanket Padawef220dc52017-01-02 23:46:00 -08001253 } else {
Amit Mahajan5829a472016-12-28 17:28:07 -08001254 RLOGE("radio::getCurrentCallsResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawef220dc52017-01-02 23:46:00 -08001255 }
1256
1257 return 0;
1258}
1259
1260int radio::dialResponse(android::Parcel &p, int slotId, int requestNumber,
1261 int responseType, int serial, RIL_Errno e, void *response, size_t responseLen) {
1262 RLOGD("radio::dialResponse: serial %d", serial);
1263
1264 if (radioService[slotId]->mRadioResponse != NULL) {
1265 RadioResponseInfo responseInfo;
1266 populateResponseInfo(responseInfo, serial, responseType, e);
Amit Mahajan17249842017-01-19 15:05:45 -08001267 Return<void> retStatus = radioService[slotId]->mRadioResponse->dialResponse(responseInfo);
1268 radioService[slotId]->checkReturnStatus(retStatus);
Sanket Padawef220dc52017-01-02 23:46:00 -08001269 } else {
1270 RLOGE("radio::dialResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001271 }
1272
1273 return 0;
1274}
1275
Amit Mahajan5829a472016-12-28 17:28:07 -08001276RadioIndicationType convertIntToRadioIndicationType(int indicationType) {
1277 return indicationType == RESPONSE_UNSOLICITED ? (RadioIndicationType::UNSOLICITED) :
1278 (RadioIndicationType::UNSOLICITED_ACK_EXP);
1279}
1280
1281void radio::radioStateChangedInd(int slotId, int indicationType, RIL_RadioState radioState) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08001282 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan5829a472016-12-28 17:28:07 -08001283 RLOGD("radio::radioStateChangedInd: radioState %d", radioState);
Amit Mahajan17249842017-01-19 15:05:45 -08001284 Return<void> retStatus = radioService[slotId]->mRadioIndication->radioStateChanged(
Amit Mahajan5829a472016-12-28 17:28:07 -08001285 convertIntToRadioIndicationType(indicationType), (RadioState) radioState);
Amit Mahajan17249842017-01-19 15:05:45 -08001286 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001287 } else {
Amit Mahajan5829a472016-12-28 17:28:07 -08001288 RLOGE("radio::radioStateChangedInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001289 }
1290}
1291
Amit Mahajan5829a472016-12-28 17:28:07 -08001292int radio::callStateChangedInd(android::Parcel &p, int slotId, int requestNumber,
1293 int indicationType, int token, RIL_Errno e, void *response,
1294 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08001295 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan5829a472016-12-28 17:28:07 -08001296 RLOGD("radio::callStateChangedInd");
Amit Mahajan17249842017-01-19 15:05:45 -08001297 Return<void> retStatus = radioService[slotId]->mRadioIndication->callStateChanged(
Amit Mahajan5829a472016-12-28 17:28:07 -08001298 convertIntToRadioIndicationType(indicationType));
Amit Mahajan17249842017-01-19 15:05:45 -08001299 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08001300 } else {
1301 RLOGE("radio::callStateChangedInd: radioService[%d]->mRadioIndication == NULL", slotId);
1302 }
1303
1304 return 0;
1305}
1306
Jack Yu06181bb2017-01-10 12:10:41 -08001307int radio::networkStateChangedInd(android::Parcel &p, int slotId, int requestNumber,
Amit Mahajan5829a472016-12-28 17:28:07 -08001308 int indicationType, int token, RIL_Errno e, void *response,
1309 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08001310 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Jack Yu06181bb2017-01-10 12:10:41 -08001311 RLOGD("radio::networkStateChangedInd");
1312 Return<void> retStatus = radioService[slotId]->mRadioIndication->networkStateChanged(
Amit Mahajan5829a472016-12-28 17:28:07 -08001313 convertIntToRadioIndicationType(indicationType));
Amit Mahajan17249842017-01-19 15:05:45 -08001314 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08001315 } else {
Jack Yu06181bb2017-01-10 12:10:41 -08001316 RLOGE("radio::networkStateChangedInd: radioService[%d]->mRadioIndication == NULL",
Amit Mahajan2fa9e632017-01-06 16:55:33 -08001317 slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08001318 }
1319
1320 return 0;
1321}
1322
1323uint8_t hexCharToInt(uint8_t c) {
1324 if (c >= '0' && c <= '9') return (c - '0');
1325 if (c >= 'A' && c <= 'F') return (c - 'A' + 10);
1326 if (c >= 'a' && c <= 'f') return (c - 'a' + 10);
1327
1328 return INVALID_HEX_CHAR;
1329}
1330
1331uint8_t * convertHexStringToBytes(void *response, size_t responseLen) {
1332 if (responseLen % 2 != 0) {
1333 return NULL;
1334 }
1335
1336 uint8_t *bytes = (uint8_t *)calloc(responseLen/2, sizeof(uint8_t));
1337 if (bytes == NULL) {
1338 RLOGE("convertHexStringToBytes: cannot allocate memory for bytes string");
1339 return NULL;
1340 }
1341 uint8_t *hexString = (uint8_t *)response;
1342
1343 for (int i = 0; i < responseLen; i += 2) {
1344 uint8_t hexChar1 = hexCharToInt(hexString[i]);
1345 uint8_t hexChar2 = hexCharToInt(hexString[i + 1]);
1346
1347 if (hexChar1 == INVALID_HEX_CHAR || hexChar2 == INVALID_HEX_CHAR) {
1348 RLOGE("convertHexStringToBytes: invalid hex char %d %d",
1349 hexString[i], hexString[i + 1]);
1350 free(bytes);
1351 return NULL;
1352 }
1353 bytes[i/2] = ((hexChar1 << 4) | hexChar2);
1354 }
1355
1356 return bytes;
1357}
1358
1359int radio::newSmsInd(android::Parcel &p, int slotId, int requestNumber, int indicationType,
1360 int token, RIL_Errno e, void *response, size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08001361 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan5829a472016-12-28 17:28:07 -08001362 if (response == NULL || responseLen == 0) {
1363 RLOGE("radio::newSmsInd: invalid response");
1364 return 0;
1365 }
1366
1367 uint8_t *bytes = convertHexStringToBytes(response, responseLen);
1368 if (bytes == NULL) {
1369 RLOGE("radio::newSmsInd: convertHexStringToBytes failed");
1370 return 0;
1371 }
1372
1373 hidl_vec<uint8_t> pdu;
1374 pdu.setToExternal(bytes, responseLen/2);
1375 RLOGD("radio::newSmsInd");
Amit Mahajan17249842017-01-19 15:05:45 -08001376 Return<void> retStatus = radioService[slotId]->mRadioIndication->newSms(
Amit Mahajan5829a472016-12-28 17:28:07 -08001377 convertIntToRadioIndicationType(indicationType), pdu);
Amit Mahajan17249842017-01-19 15:05:45 -08001378 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08001379 free(bytes);
1380 } else {
1381 RLOGE("radio::newSmsInd: radioService[%d]->mRadioIndication == NULL", slotId);
1382 }
1383
1384 return 0;
1385}
1386
1387int radio::newSmsStatusReportInd(android::Parcel &p, int slotId, int requestNumber,
1388 int indicationType, int token, RIL_Errno e, void *response,
1389 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08001390 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan5829a472016-12-28 17:28:07 -08001391 if (response == NULL || responseLen == 0) {
1392 RLOGE("radio::newSmsStatusReportInd: invalid response");
1393 return 0;
1394 }
1395
1396 uint8_t *bytes = convertHexStringToBytes(response, responseLen);
1397 if (bytes == NULL) {
1398 RLOGE("radio::newSmsStatusReportInd: convertHexStringToBytes failed");
1399 return 0;
1400 }
1401
1402 hidl_vec<uint8_t> pdu;
1403 pdu.setToExternal(bytes, responseLen/2);
1404 RLOGD("radio::newSmsStatusReportInd");
Amit Mahajan17249842017-01-19 15:05:45 -08001405 Return<void> retStatus = radioService[slotId]->mRadioIndication->newSmsStatusReport(
Amit Mahajan5829a472016-12-28 17:28:07 -08001406 convertIntToRadioIndicationType(indicationType), pdu);
Amit Mahajan17249842017-01-19 15:05:45 -08001407 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08001408 free(bytes);
1409 } else {
1410 RLOGE("radio::newSmsStatusReportInd: radioService[%d]->mRadioIndication == NULL", slotId);
1411 }
1412
1413 return 0;
1414}
1415
1416int radio::newSmsOnSimInd(android::Parcel &p, int slotId, int requestNumber, int indicationType,
1417 int token, RIL_Errno e, void *response, size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08001418 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan5829a472016-12-28 17:28:07 -08001419 if (response == NULL || responseLen != sizeof(int)) {
1420 RLOGE("radio::newSmsOnSimInd: invalid response");
1421 return 0;
1422 }
1423 int32_t recordNumber = ((int32_t *) response)[0];
1424 RLOGD("radio::newSmsOnSimInd: slotIndex %d", recordNumber);
Amit Mahajan17249842017-01-19 15:05:45 -08001425 Return<void> retStatus = radioService[slotId]->mRadioIndication->newSmsOnSim(
Amit Mahajan5829a472016-12-28 17:28:07 -08001426 convertIntToRadioIndicationType(indicationType), recordNumber);
Amit Mahajan17249842017-01-19 15:05:45 -08001427 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08001428 } else {
1429 RLOGE("radio::newSmsOnSimInd: radioService[%d]->mRadioIndication == NULL", slotId);
1430 }
1431
1432 return 0;
1433}
1434
1435int radio::onUssdInd(android::Parcel &p, int slotId, int requestNumber, int indicationType,
1436 int token, RIL_Errno e, void *response, size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08001437 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan5829a472016-12-28 17:28:07 -08001438 if (response == NULL || responseLen != 2 * sizeof(char *)) {
1439 RLOGE("radio::onUssdInd: invalid response");
1440 return 0;
1441 }
1442 char **strings = (char **) response;
1443 char *mode = strings[0];
1444 hidl_string msg = convertCharPtrToHidlString(strings[1]);
1445 UssdModeType modeType = (UssdModeType) atoi(mode);
1446 RLOGD("radio::onUssdInd: mode %s", mode);
Amit Mahajan17249842017-01-19 15:05:45 -08001447 Return<void> retStatus = radioService[slotId]->mRadioIndication->onUssd(
Amit Mahajan5829a472016-12-28 17:28:07 -08001448 convertIntToRadioIndicationType(indicationType), modeType, msg);
Amit Mahajan17249842017-01-19 15:05:45 -08001449 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08001450 } else {
1451 RLOGE("radio::onUssdInd: radioService[%d]->mRadioIndication == NULL", slotId);
1452 }
1453
1454 return 0;
1455}
1456
1457int radio::nitzTimeReceivedInd(android::Parcel &p, int slotId, int requestNumber,
1458 int indicationType, int token, RIL_Errno e, void *response,
1459 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08001460 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan5829a472016-12-28 17:28:07 -08001461 if (response == NULL || responseLen == 0) {
1462 RLOGE("radio::nitzTimeReceivedInd: invalid response");
1463 return 0;
1464 }
1465 hidl_string nitzTime = convertCharPtrToHidlString((char *) response);
1466 int64_t timeReceived = android::elapsedRealtime();
Amit Mahajan2fa9e632017-01-06 16:55:33 -08001467 RLOGD("radio::nitzTimeReceivedInd: nitzTime %s receivedTime %ld", nitzTime.c_str(),
1468 timeReceived);
Amit Mahajan17249842017-01-19 15:05:45 -08001469 Return<void> retStatus = radioService[slotId]->mRadioIndication->nitzTimeReceived(
Amit Mahajan5829a472016-12-28 17:28:07 -08001470 convertIntToRadioIndicationType(indicationType), nitzTime, timeReceived);
Amit Mahajan17249842017-01-19 15:05:45 -08001471 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08001472 } else {
1473 RLOGE("radio::nitzTimeReceivedInd: radioService[%d]->mRadioIndication == NULL", slotId);
Weilun Dud2c30932017-02-09 12:32:42 -08001474 return -1;
Amit Mahajan5829a472016-12-28 17:28:07 -08001475 }
1476
1477 return 0;
1478}
1479
Amit Mahajan2fa9e632017-01-06 16:55:33 -08001480void convertRilSignalStrengthToHal(void *response, size_t responseLen,
1481 SignalStrength& signalStrength) {
1482 RIL_SignalStrength_v10 *rilSignalStrength = (RIL_SignalStrength_v10 *) response;
1483
1484 // Fixup LTE for backwards compatibility
1485 // signalStrength: -1 -> 99
1486 if (rilSignalStrength->LTE_SignalStrength.signalStrength == -1) {
1487 rilSignalStrength->LTE_SignalStrength.signalStrength = 99;
1488 }
1489 // rsrp: -1 -> INT_MAX all other negative value to positive.
1490 // So remap here
1491 if (rilSignalStrength->LTE_SignalStrength.rsrp == -1) {
1492 rilSignalStrength->LTE_SignalStrength.rsrp = INT_MAX;
1493 } else if (rilSignalStrength->LTE_SignalStrength.rsrp < -1) {
1494 rilSignalStrength->LTE_SignalStrength.rsrp = -rilSignalStrength->LTE_SignalStrength.rsrp;
1495 }
1496 // rsrq: -1 -> INT_MAX
1497 if (rilSignalStrength->LTE_SignalStrength.rsrq == -1) {
1498 rilSignalStrength->LTE_SignalStrength.rsrq = INT_MAX;
1499 }
1500 // Not remapping rssnr is already using INT_MAX
1501 // cqi: -1 -> INT_MAX
1502 if (rilSignalStrength->LTE_SignalStrength.cqi == -1) {
1503 rilSignalStrength->LTE_SignalStrength.cqi = INT_MAX;
1504 }
1505
1506 signalStrength.gw.signalStrength = rilSignalStrength->GW_SignalStrength.signalStrength;
1507 signalStrength.gw.bitErrorRate = rilSignalStrength->GW_SignalStrength.bitErrorRate;
1508 signalStrength.cdma.dbm = rilSignalStrength->CDMA_SignalStrength.dbm;
1509 signalStrength.cdma.ecio = rilSignalStrength->CDMA_SignalStrength.ecio;
1510 signalStrength.evdo.dbm = rilSignalStrength->EVDO_SignalStrength.dbm;
1511 signalStrength.evdo.ecio = rilSignalStrength->EVDO_SignalStrength.ecio;
1512 signalStrength.evdo.signalNoiseRatio =
1513 rilSignalStrength->EVDO_SignalStrength.signalNoiseRatio;
1514 signalStrength.lte.signalStrength = rilSignalStrength->LTE_SignalStrength.signalStrength;
1515 signalStrength.lte.rsrp = rilSignalStrength->LTE_SignalStrength.rsrp;
1516 signalStrength.lte.rsrq = rilSignalStrength->LTE_SignalStrength.rsrq;
1517 signalStrength.lte.rssnr = rilSignalStrength->LTE_SignalStrength.rssnr;
1518 signalStrength.lte.cqi = rilSignalStrength->LTE_SignalStrength.cqi;
1519 signalStrength.lte.timingAdvance = rilSignalStrength->LTE_SignalStrength.timingAdvance;
1520 signalStrength.tdScdma.rscp = rilSignalStrength->TD_SCDMA_SignalStrength.rscp;
1521}
1522
1523int radio::currentSignalStrengthInd(android::Parcel &p, int slotId, int requestNumber,
1524 int indicationType, int token, RIL_Errno e,
1525 void *response, size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08001526 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan2fa9e632017-01-06 16:55:33 -08001527 if (response == NULL || responseLen != sizeof(RIL_SignalStrength_v10)) {
1528 RLOGE("radio::currentSignalStrengthInd: invalid response");
1529 return 0;
1530 }
1531
1532 SignalStrength signalStrength;
1533 convertRilSignalStrengthToHal(response, responseLen, signalStrength);
1534
1535 RLOGD("radio::currentSignalStrengthInd");
Amit Mahajan17249842017-01-19 15:05:45 -08001536 Return<void> retStatus = radioService[slotId]->mRadioIndication->currentSignalStrength(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08001537 convertIntToRadioIndicationType(indicationType), signalStrength);
Amit Mahajan17249842017-01-19 15:05:45 -08001538 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08001539 } else {
1540 RLOGE("radio::currentSignalStrengthInd: radioService[%d]->mRadioIndication == NULL",
1541 slotId);
1542 }
1543
1544 return 0;
1545}
1546
Amit Mahajan5829a472016-12-28 17:28:07 -08001547void convertRilDataCallToHal(RIL_Data_Call_Response_v11 *dcResponse,
1548 SetupDataCallResult& dcResult) {
1549 dcResult.status = dcResponse->status;
1550 dcResult.suggestedRetryTime = dcResponse->suggestedRetryTime;
1551 dcResult.cid = dcResponse->cid;
1552 dcResult.active = dcResponse->active;
1553 dcResult.type = convertCharPtrToHidlString(dcResponse->type);
1554 dcResult.ifname = convertCharPtrToHidlString(dcResponse->ifname);
1555 dcResult.addresses = convertCharPtrToHidlString(dcResponse->addresses);
1556 dcResult.dnses = convertCharPtrToHidlString(dcResponse->dnses);
1557 dcResult.gateways = convertCharPtrToHidlString(dcResponse->gateways);
1558 dcResult.pcscf = convertCharPtrToHidlString(dcResponse->pcscf);
1559 dcResult.mtu = dcResponse->mtu;
1560}
1561
1562void convertRilDataCallListToHal(void *response, size_t responseLen,
1563 hidl_vec<SetupDataCallResult>& dcResultList) {
1564 int num = responseLen / sizeof(RIL_Data_Call_Response_v11);
1565
1566 RIL_Data_Call_Response_v11 *dcResponse = (RIL_Data_Call_Response_v11 *) response;
1567 dcResultList.resize(num);
1568 for (int i = 0; i < num; i++) {
1569 convertRilDataCallToHal(&dcResponse[i], dcResultList[i]);
1570 }
1571}
1572
1573int radio::dataCallListChangedInd(android::Parcel &p, int slotId, int requestNumber,
1574 int indicationType, int token, RIL_Errno e, void *response,
1575 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08001576 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan5829a472016-12-28 17:28:07 -08001577 if (response == NULL || responseLen % sizeof(RIL_Data_Call_Response_v11) != 0) {
1578 RLOGE("radio::dataCallListChangedInd: invalid response");
1579 return 0;
1580 }
1581 hidl_vec<SetupDataCallResult> dcList;
1582 convertRilDataCallListToHal(response, responseLen, dcList);
1583 RLOGD("radio::dataCallListChangedInd");
Amit Mahajan17249842017-01-19 15:05:45 -08001584 Return<void> retStatus = radioService[slotId]->mRadioIndication->dataCallListChanged(
Amit Mahajan5829a472016-12-28 17:28:07 -08001585 convertIntToRadioIndicationType(indicationType), dcList);
Amit Mahajan17249842017-01-19 15:05:45 -08001586 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08001587 } else {
1588 RLOGE("radio::dataCallListChangedInd: radioService[%d]->mRadioIndication == NULL", slotId);
1589 }
1590
1591 return 0;
1592}
1593
1594int radio::suppSvcNotifyInd(android::Parcel &p, int slotId, int requestNumber, int indicationType,
1595 int token, RIL_Errno e, void *response, size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08001596 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan5829a472016-12-28 17:28:07 -08001597 if (response == NULL || responseLen != sizeof(RIL_SuppSvcNotification)) {
1598 RLOGE("radio::suppSvcNotifyInd: invalid response");
1599 return 0;
1600 }
1601
1602 SuppSvcNotification suppSvc;
1603 RIL_SuppSvcNotification *ssn = (RIL_SuppSvcNotification *) response;
1604 suppSvc.isMT = ssn->notificationType;
1605 suppSvc.code = ssn->code;
1606 suppSvc.index = ssn->index;
1607 suppSvc.type = ssn->type;
1608 suppSvc.number = convertCharPtrToHidlString(ssn->number);
1609
1610 RLOGD("radio::suppSvcNotifyInd: isMT %d code %d index %d type %d",
1611 suppSvc.isMT, suppSvc.code, suppSvc.index, suppSvc.type);
Amit Mahajan17249842017-01-19 15:05:45 -08001612 Return<void> retStatus = radioService[slotId]->mRadioIndication->suppSvcNotify(
Amit Mahajan5829a472016-12-28 17:28:07 -08001613 convertIntToRadioIndicationType(indicationType), suppSvc);
Amit Mahajan17249842017-01-19 15:05:45 -08001614 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08001615 } else {
1616 RLOGE("radio::suppSvcNotifyInd: radioService[%d]->mRadioIndication == NULL", slotId);
1617 }
1618
1619 return 0;
1620}
1621
1622int radio::stkSessionEndInd(android::Parcel &p, int slotId, int requestNumber, int indicationType,
1623 int token, RIL_Errno e, void *response, size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08001624 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan5829a472016-12-28 17:28:07 -08001625 RLOGD("radio::stkSessionEndInd");
Amit Mahajan17249842017-01-19 15:05:45 -08001626 Return<void> retStatus = radioService[slotId]->mRadioIndication->stkSessionEnd(
Amit Mahajan5829a472016-12-28 17:28:07 -08001627 convertIntToRadioIndicationType(indicationType));
Amit Mahajan17249842017-01-19 15:05:45 -08001628 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08001629 } else {
1630 RLOGE("radio::stkSessionEndInd: radioService[%d]->mRadioIndication == NULL", slotId);
1631 }
1632
1633 return 0;
1634}
1635
1636int radio::stkProactiveCommandInd(android::Parcel &p, int slotId, int requestNumber,
1637 int indicationType, int token, RIL_Errno e, void *response,
1638 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08001639 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan5829a472016-12-28 17:28:07 -08001640 if (response == NULL || responseLen == 0) {
1641 RLOGE("radio::stkProactiveCommandInd: invalid response");
1642 return 0;
1643 }
1644 RLOGD("radio::stkProactiveCommandInd");
Amit Mahajan17249842017-01-19 15:05:45 -08001645 Return<void> retStatus = radioService[slotId]->mRadioIndication->stkProactiveCommand(
Amit Mahajan5829a472016-12-28 17:28:07 -08001646 convertIntToRadioIndicationType(indicationType),
1647 convertCharPtrToHidlString((char *) response));
Amit Mahajan17249842017-01-19 15:05:45 -08001648 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08001649 } else {
1650 RLOGE("radio::stkProactiveCommandInd: radioService[%d]->mRadioIndication == NULL", slotId);
1651 }
1652
1653 return 0;
1654}
1655
1656int radio::stkEventNotifyInd(android::Parcel &p, int slotId, int requestNumber, int indicationType,
1657 int token, RIL_Errno e, void *response, size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08001658 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan5829a472016-12-28 17:28:07 -08001659 if (response == NULL || responseLen == 0) {
1660 RLOGE("radio::stkEventNotifyInd: invalid response");
1661 return 0;
1662 }
1663 RLOGD("radio::stkEventNotifyInd");
Amit Mahajan17249842017-01-19 15:05:45 -08001664 Return<void> retStatus = radioService[slotId]->mRadioIndication->stkEventNotify(
Amit Mahajan5829a472016-12-28 17:28:07 -08001665 convertIntToRadioIndicationType(indicationType),
1666 convertCharPtrToHidlString((char *) response));
Amit Mahajan17249842017-01-19 15:05:45 -08001667 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08001668 } else {
1669 RLOGE("radio::stkEventNotifyInd: radioService[%d]->mRadioIndication == NULL", slotId);
1670 }
1671
1672 return 0;
1673}
1674
1675int radio::stkCallSetupInd(android::Parcel &p, int slotId, int requestNumber, int indicationType,
1676 int token, RIL_Errno e, void *response, size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08001677 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan5829a472016-12-28 17:28:07 -08001678 if (response == NULL || responseLen != sizeof(int)) {
1679 RLOGE("radio::stkCallSetupInd: invalid response");
1680 return 0;
1681 }
1682 int32_t timeout = ((int32_t *) response)[0];
1683 RLOGD("radio::stkCallSetupInd: timeout %d", timeout);
Amit Mahajan17249842017-01-19 15:05:45 -08001684 Return<void> retStatus = radioService[slotId]->mRadioIndication->stkCallSetup(
Amit Mahajan5829a472016-12-28 17:28:07 -08001685 convertIntToRadioIndicationType(indicationType), timeout);
Amit Mahajan17249842017-01-19 15:05:45 -08001686 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08001687 } else {
1688 RLOGE("radio::stkCallSetupInd: radioService[%d]->mRadioIndication == NULL", slotId);
1689 }
1690
1691 return 0;
1692}
1693
1694int radio::simSmsStorageFullInd(android::Parcel &p, int slotId, int requestNumber,
1695 int indicationType, int token, RIL_Errno e, void *response,
1696 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08001697 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan5829a472016-12-28 17:28:07 -08001698 RLOGD("radio::simSmsStorageFullInd");
Amit Mahajan17249842017-01-19 15:05:45 -08001699 Return<void> retStatus = radioService[slotId]->mRadioIndication->simSmsStorageFull(
Amit Mahajan5829a472016-12-28 17:28:07 -08001700 convertIntToRadioIndicationType(indicationType));
Amit Mahajan17249842017-01-19 15:05:45 -08001701 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08001702 } else {
1703 RLOGE("radio::simSmsStorageFullInd: radioService[%d]->mRadioIndication == NULL", slotId);
1704 }
1705
1706 return 0;
1707}
1708
1709int radio::simRefreshInd(android::Parcel &p, int slotId, int requestNumber, int indicationType,
1710 int token, RIL_Errno e, void *response, size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08001711 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan5829a472016-12-28 17:28:07 -08001712 if (response == NULL || responseLen != sizeof(RIL_SimRefreshResponse_v7)) {
1713 RLOGE("radio::simRefreshInd: invalid response");
1714 return 0;
1715 }
1716
1717 SimRefreshResult refreshResult;
1718 RIL_SimRefreshResponse_v7 *simRefreshResponse = ((RIL_SimRefreshResponse_v7 *) response);
1719 refreshResult.type =
1720 (android::hardware::radio::V1_0::SimRefreshType) simRefreshResponse->result;
1721 refreshResult.efId = simRefreshResponse->ef_id;
1722 refreshResult.aid = convertCharPtrToHidlString(simRefreshResponse->aid);
1723
1724 RLOGD("radio::simRefreshInd: type %d efId %d", refreshResult.type, refreshResult.efId);
Amit Mahajan17249842017-01-19 15:05:45 -08001725 Return<void> retStatus = radioService[slotId]->mRadioIndication->simRefresh(
Amit Mahajan5829a472016-12-28 17:28:07 -08001726 convertIntToRadioIndicationType(indicationType), refreshResult);
Amit Mahajan17249842017-01-19 15:05:45 -08001727 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08001728 } else {
1729 RLOGE("radio::simRefreshInd: radioService[%d]->mRadioIndication == NULL", slotId);
1730 }
1731
1732 return 0;
1733}
1734
1735void convertRilCdmaSignalInfoRecordToHal(RIL_CDMA_SignalInfoRecord *signalInfoRecord,
1736 CdmaSignalInfoRecord& record) {
1737 record.isPresent = signalInfoRecord->isPresent;
1738 record.signalType = signalInfoRecord->signalType;
1739 record.alertPitch = signalInfoRecord->alertPitch;
1740 record.signal = signalInfoRecord->signal;
1741}
1742
1743int radio::callRingInd(android::Parcel &p, int slotId, int requestNumber, int indicationType,
1744 int token, RIL_Errno e, void *response, size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08001745 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan5829a472016-12-28 17:28:07 -08001746 bool isGsm;
1747 CdmaSignalInfoRecord record;
1748 if (response == NULL || responseLen == 0) {
1749 isGsm = true;
1750 } else {
1751 isGsm = false;
1752 if (responseLen != sizeof (RIL_CDMA_SignalInfoRecord)) {
1753 RLOGE("radio::callRingInd: invalid response");
1754 return 0;
1755 }
1756 convertRilCdmaSignalInfoRecordToHal((RIL_CDMA_SignalInfoRecord *) response, record);
1757 }
1758
1759 RLOGD("radio::callRingInd: isGsm %d", isGsm);
Amit Mahajan17249842017-01-19 15:05:45 -08001760 Return<void> retStatus = radioService[slotId]->mRadioIndication->callRing(
Amit Mahajan5829a472016-12-28 17:28:07 -08001761 convertIntToRadioIndicationType(indicationType), isGsm, record);
Amit Mahajan17249842017-01-19 15:05:45 -08001762 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08001763 } else {
1764 RLOGE("radio::callRingInd: radioService[%d]->mRadioIndication == NULL", slotId);
1765 }
1766
1767 return 0;
1768}
1769
1770int radio::simStatusChangedInd(android::Parcel &p, int slotId, int requestNumber,
1771 int indicationType, int token, RIL_Errno e, void *response,
1772 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08001773 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan5829a472016-12-28 17:28:07 -08001774 RLOGD("radio::simStatusChangedInd");
Amit Mahajan17249842017-01-19 15:05:45 -08001775 Return<void> retStatus = radioService[slotId]->mRadioIndication->simStatusChanged(
Amit Mahajan5829a472016-12-28 17:28:07 -08001776 convertIntToRadioIndicationType(indicationType));
Amit Mahajan17249842017-01-19 15:05:45 -08001777 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08001778 } else {
1779 RLOGE("radio::simStatusChangedInd: radioService[%d]->mRadioIndication == NULL", slotId);
1780 }
1781
1782 return 0;
1783}
1784
1785int radio::cdmaNewSmsInd(android::Parcel &p, int slotId, int requestNumber, int indicationType,
1786 int token, RIL_Errno e, void *response, size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08001787 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan5829a472016-12-28 17:28:07 -08001788 if (response == NULL || responseLen != sizeof(RIL_CDMA_SMS_Message)) {
1789 RLOGE("radio::cdmaNewSmsInd: invalid response");
1790 return 0;
1791 }
1792
1793 CdmaSmsMessage msg;
1794 RIL_CDMA_SMS_Message *rilMsg = (RIL_CDMA_SMS_Message *) response;
1795 msg.teleserviceId = rilMsg->uTeleserviceID;
1796 msg.isServicePresent = rilMsg->bIsServicePresent;
1797 msg.serviceCategory = rilMsg->uServicecategory;
1798 msg.address.digitMode =
1799 (android::hardware::radio::V1_0::CdmaSmsDigitMode) rilMsg->sAddress.digit_mode;
1800 msg.address.numberMode =
1801 (android::hardware::radio::V1_0::CdmaSmsNumberMode) rilMsg->sAddress.number_mode;
1802 msg.address.numberType =
1803 (android::hardware::radio::V1_0::CdmaSmsNumberType) rilMsg->sAddress.number_type;
1804 msg.address.numberPlan =
1805 (android::hardware::radio::V1_0::CdmaSmsNumberPlan) rilMsg->sAddress.number_plan;
1806
1807 int digitLimit = MIN((rilMsg->sAddress.number_of_digits), RIL_CDMA_SMS_ADDRESS_MAX);
1808 msg.address.digits.setToExternal(rilMsg->sAddress.digits, digitLimit);
1809
1810 msg.subAddress.subaddressType = (android::hardware::radio::V1_0::CdmaSmsSubaddressType)
1811 rilMsg->sSubAddress.subaddressType;
1812 msg.subAddress.odd = rilMsg->sSubAddress.odd;
1813
1814 digitLimit= MIN((rilMsg->sSubAddress.number_of_digits), RIL_CDMA_SMS_SUBADDRESS_MAX);
1815 msg.subAddress.digits.setToExternal(rilMsg->sSubAddress.digits, digitLimit);
1816
1817 digitLimit = MIN((rilMsg->uBearerDataLen), RIL_CDMA_SMS_BEARER_DATA_MAX);
1818 msg.bearerData.setToExternal(rilMsg->aBearerData, digitLimit);
1819
1820 RLOGD("radio::cdmaNewSmsInd");
Amit Mahajan17249842017-01-19 15:05:45 -08001821 Return<void> retStatus = radioService[slotId]->mRadioIndication->cdmaNewSms(
Amit Mahajan5829a472016-12-28 17:28:07 -08001822 convertIntToRadioIndicationType(indicationType), msg);
Amit Mahajan17249842017-01-19 15:05:45 -08001823 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08001824 } else {
1825 RLOGE("radio::cdmaNewSmsInd: radioService[%d]->mRadioIndication == NULL", slotId);
1826 }
1827
1828 return 0;
1829}
1830
Amit Mahajan1955c742016-12-29 07:07:54 -08001831int radio::newBroadcastSmsInd(android::Parcel &p, int slotId, int requestNumber,
1832 int indicationType, int token, RIL_Errno e, void *response,
1833 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08001834 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan1955c742016-12-29 07:07:54 -08001835 if (response == NULL || responseLen == 0) {
1836 RLOGE("radio::newBroadcastSmsInd: invalid response");
1837 return 0;
1838 }
1839
1840 hidl_vec<uint8_t> data;
1841 data.setToExternal((uint8_t *) response, responseLen);
1842 RLOGD("radio::newBroadcastSmsInd");
Amit Mahajan17249842017-01-19 15:05:45 -08001843 Return<void> retStatus = radioService[slotId]->mRadioIndication->newBroadcastSms(
Amit Mahajan1955c742016-12-29 07:07:54 -08001844 convertIntToRadioIndicationType(indicationType), data);
Amit Mahajan17249842017-01-19 15:05:45 -08001845 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan1955c742016-12-29 07:07:54 -08001846 } else {
1847 RLOGE("radio::newBroadcastSmsInd: radioService[%d]->mRadioIndication == NULL", slotId);
1848 }
1849
1850 return 0;
1851}
1852
1853int radio::cdmaRuimSmsStorageFullInd(android::Parcel &p, int slotId, int requestNumber,
1854 int indicationType, int token, RIL_Errno e, void *response,
1855 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08001856 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan1955c742016-12-29 07:07:54 -08001857 RLOGD("radio::cdmaRuimSmsStorageFullInd");
Amit Mahajan17249842017-01-19 15:05:45 -08001858 Return<void> retStatus = radioService[slotId]->mRadioIndication->cdmaRuimSmsStorageFull(
Amit Mahajan1955c742016-12-29 07:07:54 -08001859 convertIntToRadioIndicationType(indicationType));
Amit Mahajan17249842017-01-19 15:05:45 -08001860 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan1955c742016-12-29 07:07:54 -08001861 } else {
1862 RLOGE("radio::cdmaRuimSmsStorageFullInd: radioService[%d]->mRadioIndication == NULL",
1863 slotId);
1864 }
1865
1866 return 0;
1867}
1868
1869int radio::restrictedStateChangedInd(android::Parcel &p, int slotId, int requestNumber,
1870 int indicationType, int token, RIL_Errno e, void *response,
1871 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08001872 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan1955c742016-12-29 07:07:54 -08001873 if (response == NULL || responseLen != sizeof(int)) {
1874 RLOGE("radio::restrictedStateChangedInd: invalid response");
1875 return 0;
1876 }
1877 int32_t state = ((int32_t *) response)[0];
1878 RLOGD("radio::restrictedStateChangedInd: state %d", state);
Amit Mahajan17249842017-01-19 15:05:45 -08001879 Return<void> retStatus = radioService[slotId]->mRadioIndication->restrictedStateChanged(
Amit Mahajan1955c742016-12-29 07:07:54 -08001880 convertIntToRadioIndicationType(indicationType), (PhoneRestrictedState) state);
Amit Mahajan17249842017-01-19 15:05:45 -08001881 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan1955c742016-12-29 07:07:54 -08001882 } else {
1883 RLOGE("radio::restrictedStateChangedInd: radioService[%d]->mRadioIndication == NULL",
1884 slotId);
1885 }
1886
1887 return 0;
1888}
1889
1890int radio::enterEmergencyCallbackModeInd(android::Parcel &p, int slotId, int requestNumber,
1891 int indicationType, int token, RIL_Errno e, void *response,
1892 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08001893 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan1955c742016-12-29 07:07:54 -08001894 RLOGD("radio::enterEmergencyCallbackModeInd");
Amit Mahajan17249842017-01-19 15:05:45 -08001895 Return<void> retStatus = radioService[slotId]->mRadioIndication->enterEmergencyCallbackMode(
Amit Mahajan1955c742016-12-29 07:07:54 -08001896 convertIntToRadioIndicationType(indicationType));
Amit Mahajan17249842017-01-19 15:05:45 -08001897 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan1955c742016-12-29 07:07:54 -08001898 } else {
1899 RLOGE("radio::enterEmergencyCallbackModeInd: radioService[%d]->mRadioIndication == NULL",
1900 slotId);
1901 }
1902
1903 return 0;
1904}
1905
1906int radio::cdmaCallWaitingInd(android::Parcel &p, int slotId, int requestNumber,
1907 int indicationType, int token, RIL_Errno e, void *response,
1908 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08001909 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan1955c742016-12-29 07:07:54 -08001910 if (response == NULL || responseLen != sizeof(RIL_CDMA_CallWaiting_v6)) {
1911 RLOGE("radio::cdmaCallWaitingInd: invalid response");
1912 return 0;
1913 }
1914
1915 CdmaCallWaiting callWaitingRecord;
1916 RIL_CDMA_CallWaiting_v6 *callWaitingRil = ((RIL_CDMA_CallWaiting_v6 *) response);
1917 callWaitingRecord.number = convertCharPtrToHidlString(callWaitingRil->number);
1918 callWaitingRecord.numberPresentation =
1919 (CdmaCallWaitingNumberPresentation) callWaitingRil->numberPresentation;
1920 callWaitingRecord.name = convertCharPtrToHidlString(callWaitingRil->name);
1921 convertRilCdmaSignalInfoRecordToHal(&callWaitingRil->signalInfoRecord,
1922 callWaitingRecord.signalInfoRecord);
1923 callWaitingRecord.numberType = (CdmaCallWaitingNumberType) callWaitingRil->number_type;
1924 callWaitingRecord.numberPlan = (CdmaCallWaitingNumberPlan) callWaitingRil->number_plan;
1925
1926 RLOGD("radio::cdmaCallWaitingInd");
Amit Mahajan17249842017-01-19 15:05:45 -08001927 Return<void> retStatus = radioService[slotId]->mRadioIndication->cdmaCallWaiting(
Amit Mahajan1955c742016-12-29 07:07:54 -08001928 convertIntToRadioIndicationType(indicationType), callWaitingRecord);
Amit Mahajan17249842017-01-19 15:05:45 -08001929 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan1955c742016-12-29 07:07:54 -08001930 } else {
1931 RLOGE("radio::cdmaCallWaitingInd: radioService[%d]->mRadioIndication == NULL", slotId);
1932 }
1933
1934 return 0;
1935}
1936
1937int radio::cdmaOtaProvisionStatusInd(android::Parcel &p, int slotId, int requestNumber,
1938 int indicationType, int token, RIL_Errno e, void *response,
1939 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08001940 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan1955c742016-12-29 07:07:54 -08001941 if (response == NULL || responseLen != sizeof(int)) {
1942 RLOGE("radio::cdmaOtaProvisionStatusInd: invalid response");
1943 return 0;
1944 }
1945 int32_t status = ((int32_t *) response)[0];
1946 RLOGD("radio::cdmaOtaProvisionStatusInd: status %d", status);
Amit Mahajan17249842017-01-19 15:05:45 -08001947 Return<void> retStatus = radioService[slotId]->mRadioIndication->cdmaOtaProvisionStatus(
Amit Mahajan1955c742016-12-29 07:07:54 -08001948 convertIntToRadioIndicationType(indicationType), (CdmaOtaProvisionStatus) status);
Amit Mahajan17249842017-01-19 15:05:45 -08001949 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan1955c742016-12-29 07:07:54 -08001950 } else {
1951 RLOGE("radio::cdmaOtaProvisionStatusInd: radioService[%d]->mRadioIndication == NULL",
1952 slotId);
1953 }
1954
1955 return 0;
1956}
1957
1958int radio::cdmaInfoRecInd(android::Parcel &p, int slotId, int requestNumber,
1959 int indicationType, int token, RIL_Errno e, void *response,
1960 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08001961 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan1955c742016-12-29 07:07:54 -08001962 if (response == NULL || responseLen != sizeof(RIL_CDMA_InformationRecords)) {
1963 RLOGE("radio::cdmaInfoRecInd: invalid response");
1964 return 0;
1965 }
1966
1967 CdmaInformationRecords records;
1968 RIL_CDMA_InformationRecords *recordsRil = (RIL_CDMA_InformationRecords *) response;
1969
1970 char* string8 = NULL;
1971 int num = MIN(recordsRil->numberOfInfoRecs, RIL_CDMA_MAX_NUMBER_OF_INFO_RECS);
1972 if (recordsRil->numberOfInfoRecs > RIL_CDMA_MAX_NUMBER_OF_INFO_RECS) {
1973 RLOGE("radio::cdmaInfoRecInd: received %d recs which is more than %d, dropping \
1974 additional ones",
1975 recordsRil->numberOfInfoRecs,
1976 RIL_CDMA_MAX_NUMBER_OF_INFO_RECS);
1977 }
1978 records.infoRec.resize(num);
1979 for (int i = 0 ; i < num ; i++) {
1980 CdmaInformationRecord *record = &records.infoRec[i];
1981 RIL_CDMA_InformationRecord *infoRec = &recordsRil->infoRec[i];
1982 record->name = (CdmaInfoRecName) infoRec->name;
1983 switch (infoRec->name) {
1984 case RIL_CDMA_DISPLAY_INFO_REC:
1985 case RIL_CDMA_EXTENDED_DISPLAY_INFO_REC: {
1986 if (infoRec->rec.display.alpha_len > CDMA_ALPHA_INFO_BUFFER_LENGTH) {
1987 RLOGE("radio::cdmaInfoRecInd: invalid display info response length %d \
1988 expected not more than %d", (int) infoRec->rec.display.alpha_len,
1989 CDMA_ALPHA_INFO_BUFFER_LENGTH);
1990 return 0;
1991 }
1992 string8 = (char*) malloc((infoRec->rec.display.alpha_len + 1) * sizeof(char));
1993 if (string8 == NULL) {
1994 RLOGE("radio::cdmaInfoRecInd: Memory allocation failed for \
1995 responseCdmaInformationRecords");
1996 return 0;
1997 }
1998 memcpy(string8, infoRec->rec.display.alpha_buf, infoRec->rec.display.alpha_len);
1999 string8[(int)infoRec->rec.display.alpha_len] = '\0';
2000
2001 record->display.resize(1);
2002 record->display[0].alphaBuf = string8;
2003 free(string8);
2004 string8 = NULL;
2005 break;
2006 }
2007
2008 case RIL_CDMA_CALLED_PARTY_NUMBER_INFO_REC:
2009 case RIL_CDMA_CALLING_PARTY_NUMBER_INFO_REC:
2010 case RIL_CDMA_CONNECTED_NUMBER_INFO_REC: {
2011 if (infoRec->rec.number.len > CDMA_NUMBER_INFO_BUFFER_LENGTH) {
2012 RLOGE("radio::cdmaInfoRecInd: invalid display info response length %d \
2013 expected not more than %d", (int) infoRec->rec.number.len,
2014 CDMA_NUMBER_INFO_BUFFER_LENGTH);
2015 return 0;
2016 }
2017 string8 = (char*) malloc((infoRec->rec.number.len + 1) * sizeof(char));
2018 if (string8 == NULL) {
2019 RLOGE("radio::cdmaInfoRecInd: Memory allocation failed for \
2020 responseCdmaInformationRecords");
2021 return 0;
2022 }
2023 memcpy(string8, infoRec->rec.number.buf, infoRec->rec.number.len);
2024 string8[(int)infoRec->rec.number.len] = '\0';
2025
2026 record->number.resize(1);
2027 record->number[0].number = string8;
2028 free(string8);
2029 string8 = NULL;
2030 record->number[0].numberType = infoRec->rec.number.number_type;
2031 record->number[0].numberPlan = infoRec->rec.number.number_plan;
2032 record->number[0].pi = infoRec->rec.number.pi;
2033 record->number[0].si = infoRec->rec.number.si;
2034 break;
2035 }
2036
2037 case RIL_CDMA_SIGNAL_INFO_REC: {
2038 record->signal.resize(1);
2039 record->signal[0].isPresent = infoRec->rec.signal.isPresent;
2040 record->signal[0].signalType = infoRec->rec.signal.signalType;
2041 record->signal[0].alertPitch = infoRec->rec.signal.alertPitch;
2042 record->signal[0].signal = infoRec->rec.signal.signal;
2043 break;
2044 }
2045
2046 case RIL_CDMA_REDIRECTING_NUMBER_INFO_REC: {
2047 if (infoRec->rec.redir.redirectingNumber.len >
2048 CDMA_NUMBER_INFO_BUFFER_LENGTH) {
2049 RLOGE("radio::cdmaInfoRecInd: invalid display info response length %d \
2050 expected not more than %d\n",
2051 (int)infoRec->rec.redir.redirectingNumber.len,
2052 CDMA_NUMBER_INFO_BUFFER_LENGTH);
2053 return 0;
2054 }
2055 string8 = (char*) malloc((infoRec->rec.redir.redirectingNumber.len + 1) *
2056 sizeof(char));
2057 if (string8 == NULL) {
2058 RLOGE("radio::cdmaInfoRecInd: Memory allocation failed for \
2059 responseCdmaInformationRecords");
2060 return 0;
2061 }
2062 memcpy(string8, infoRec->rec.redir.redirectingNumber.buf,
2063 infoRec->rec.redir.redirectingNumber.len);
2064 string8[(int)infoRec->rec.redir.redirectingNumber.len] = '\0';
2065
2066 record->redir.resize(1);
2067 record->redir[0].redirectingNumber.number = string8;
2068 free(string8);
2069 string8 = NULL;
2070 record->redir[0].redirectingNumber.numberType =
2071 infoRec->rec.redir.redirectingNumber.number_type;
2072 record->redir[0].redirectingNumber.numberPlan =
2073 infoRec->rec.redir.redirectingNumber.number_plan;
2074 record->redir[0].redirectingNumber.pi = infoRec->rec.redir.redirectingNumber.pi;
2075 record->redir[0].redirectingNumber.si = infoRec->rec.redir.redirectingNumber.si;
2076 record->redir[0].redirectingReason =
2077 (CdmaRedirectingReason) infoRec->rec.redir.redirectingReason;
2078 break;
2079 }
2080
2081 case RIL_CDMA_LINE_CONTROL_INFO_REC: {
2082 record->lineCtrl.resize(1);
2083 record->lineCtrl[0].lineCtrlPolarityIncluded =
2084 infoRec->rec.lineCtrl.lineCtrlPolarityIncluded;
2085 record->lineCtrl[0].lineCtrlToggle = infoRec->rec.lineCtrl.lineCtrlToggle;
2086 record->lineCtrl[0].lineCtrlReverse = infoRec->rec.lineCtrl.lineCtrlReverse;
2087 record->lineCtrl[0].lineCtrlPowerDenial =
2088 infoRec->rec.lineCtrl.lineCtrlPowerDenial;
2089 break;
2090 }
2091
2092 case RIL_CDMA_T53_CLIR_INFO_REC: {
2093 record->clir.resize(1);
2094 record->clir[0].cause = infoRec->rec.clir.cause;
2095 break;
2096 }
2097
2098 case RIL_CDMA_T53_AUDIO_CONTROL_INFO_REC: {
2099 record->audioCtrl.resize(1);
2100 record->audioCtrl[0].upLink = infoRec->rec.audioCtrl.upLink;
2101 record->audioCtrl[0].downLink = infoRec->rec.audioCtrl.downLink;
2102 break;
2103 }
2104
2105 case RIL_CDMA_T53_RELEASE_INFO_REC:
2106 RLOGE("radio::cdmaInfoRecInd: RIL_CDMA_T53_RELEASE_INFO_REC: INVALID");
2107 return 0;
2108
2109 default:
2110 RLOGE("radio::cdmaInfoRecInd: Incorrect name value");
2111 return 0;
2112 }
2113 }
2114
2115 RLOGD("radio::cdmaInfoRecInd");
Amit Mahajan17249842017-01-19 15:05:45 -08002116 Return<void> retStatus = radioService[slotId]->mRadioIndication->cdmaInfoRec(
Amit Mahajan1955c742016-12-29 07:07:54 -08002117 convertIntToRadioIndicationType(indicationType), records);
Amit Mahajan17249842017-01-19 15:05:45 -08002118 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan1955c742016-12-29 07:07:54 -08002119 } else {
2120 RLOGE("radio::cdmaInfoRecInd: radioService[%d]->mRadioIndication == NULL", slotId);
2121 }
2122
2123 return 0;
2124}
2125
Amit Mahajan2fa9e632017-01-06 16:55:33 -08002126int radio::oemHookRawInd(android::Parcel &p, int slotId, int requestNumber,
2127 int indicationType, int token, RIL_Errno e, void *response,
2128 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08002129 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan2fa9e632017-01-06 16:55:33 -08002130 if (response == NULL || responseLen == 0) {
2131 RLOGE("radio::oemHookRawInd: invalid response");
2132 return 0;
2133 }
2134
2135 hidl_vec<uint8_t> data;
2136 data.setToExternal((uint8_t *) response, responseLen);
2137 RLOGD("radio::oemHookRawInd");
Amit Mahajan17249842017-01-19 15:05:45 -08002138 Return<void> retStatus = radioService[slotId]->mRadioIndication->oemHookRaw(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08002139 convertIntToRadioIndicationType(indicationType), data);
Amit Mahajan17249842017-01-19 15:05:45 -08002140 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08002141 } else {
2142 RLOGE("radio::oemHookRawInd: radioService[%d]->mRadioIndication == NULL", slotId);
2143 }
2144
2145 return 0;
2146}
2147
2148int radio::indicateRingbackToneInd(android::Parcel &p, int slotId, int requestNumber,
2149 int indicationType, int token, RIL_Errno e, void *response,
2150 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08002151 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan2fa9e632017-01-06 16:55:33 -08002152 if (response == NULL || responseLen != sizeof(int)) {
2153 RLOGE("radio::indicateRingbackToneInd: invalid response");
2154 return 0;
2155 }
2156 bool start = ((int32_t *) response)[0];
2157 RLOGD("radio::indicateRingbackToneInd: start %d", start);
Amit Mahajan17249842017-01-19 15:05:45 -08002158 Return<void> retStatus = radioService[slotId]->mRadioIndication->indicateRingbackTone(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08002159 convertIntToRadioIndicationType(indicationType), start);
Amit Mahajan17249842017-01-19 15:05:45 -08002160 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08002161 } else {
2162 RLOGE("radio::indicateRingbackToneInd: radioService[%d]->mRadioIndication == NULL", slotId);
2163 }
2164
2165 return 0;
2166}
2167
2168int radio::resendIncallMuteInd(android::Parcel &p, int slotId, int requestNumber,
2169 int indicationType, int token, RIL_Errno e, void *response,
2170 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08002171 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan2fa9e632017-01-06 16:55:33 -08002172 RLOGD("radio::resendIncallMuteInd");
Amit Mahajan17249842017-01-19 15:05:45 -08002173 Return<void> retStatus = radioService[slotId]->mRadioIndication->resendIncallMute(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08002174 convertIntToRadioIndicationType(indicationType));
Amit Mahajan17249842017-01-19 15:05:45 -08002175 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08002176 } else {
2177 RLOGE("radio::resendIncallMuteInd: radioService[%d]->mRadioIndication == NULL", slotId);
2178 }
2179
2180 return 0;
2181}
2182
2183int radio::cdmaSubscriptionSourceChangedInd(android::Parcel &p, int slotId, int requestNumber,
2184 int indicationType, int token, RIL_Errno e,
2185 void *response, size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08002186 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan2fa9e632017-01-06 16:55:33 -08002187 if (response == NULL || responseLen != sizeof(int)) {
2188 RLOGE("radio::cdmaSubscriptionSourceChangedInd: invalid response");
2189 return 0;
2190 }
2191 int32_t cdmaSource = ((int32_t *) response)[0];
2192 RLOGD("radio::cdmaSubscriptionSourceChangedInd: cdmaSource %d", cdmaSource);
Amit Mahajan17249842017-01-19 15:05:45 -08002193 Return<void> retStatus = radioService[slotId]->mRadioIndication->
2194 cdmaSubscriptionSourceChanged(convertIntToRadioIndicationType(indicationType),
Amit Mahajan2fa9e632017-01-06 16:55:33 -08002195 (CdmaSubscriptionSource) cdmaSource);
Amit Mahajan17249842017-01-19 15:05:45 -08002196 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08002197 } else {
2198 RLOGE("radio::cdmaSubscriptionSourceChangedInd: radioService[%d]->mRadioIndication == NULL",
2199 slotId);
2200 }
2201
2202 return 0;
2203}
2204
2205int radio::cdmaPrlChangedInd(android::Parcel &p, int slotId, int requestNumber,
2206 int indicationType, int token, RIL_Errno e, void *response,
2207 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08002208 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan2fa9e632017-01-06 16:55:33 -08002209 if (response == NULL || responseLen != sizeof(int)) {
2210 RLOGE("radio::cdmaPrlChangedInd: invalid response");
2211 return 0;
2212 }
2213 int32_t version = ((int32_t *) response)[0];
2214 RLOGD("radio::cdmaPrlChangedInd: version %d", version);
Amit Mahajan17249842017-01-19 15:05:45 -08002215 Return<void> retStatus = radioService[slotId]->mRadioIndication->cdmaPrlChanged(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08002216 convertIntToRadioIndicationType(indicationType), version);
Amit Mahajan17249842017-01-19 15:05:45 -08002217 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08002218 } else {
2219 RLOGE("radio::cdmaPrlChangedInd: radioService[%d]->mRadioIndication == NULL", slotId);
2220 }
2221
2222 return 0;
2223}
2224
2225int radio::exitEmergencyCallbackModeInd(android::Parcel &p, int slotId, int requestNumber,
2226 int indicationType, int token, RIL_Errno e, void *response,
2227 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08002228 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan2fa9e632017-01-06 16:55:33 -08002229 RLOGD("radio::exitEmergencyCallbackModeInd");
Amit Mahajan17249842017-01-19 15:05:45 -08002230 Return<void> retStatus = radioService[slotId]->mRadioIndication->exitEmergencyCallbackMode(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08002231 convertIntToRadioIndicationType(indicationType));
Amit Mahajan17249842017-01-19 15:05:45 -08002232 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08002233 } else {
2234 RLOGE("radio::exitEmergencyCallbackModeInd: radioService[%d]->mRadioIndication == NULL",
2235 slotId);
2236 }
2237
2238 return 0;
2239}
2240
2241int radio::rilConnectedInd(android::Parcel &p, int slotId, int requestNumber,
2242 int indicationType, int token, RIL_Errno e, void *response,
2243 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08002244 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan2fa9e632017-01-06 16:55:33 -08002245 RLOGD("radio::rilConnectedInd");
Amit Mahajan17249842017-01-19 15:05:45 -08002246 Return<void> retStatus = radioService[slotId]->mRadioIndication->rilConnected(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08002247 convertIntToRadioIndicationType(indicationType));
Amit Mahajan17249842017-01-19 15:05:45 -08002248 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08002249 } else {
2250 RLOGE("radio::rilConnectedInd: radioService[%d]->mRadioIndication == NULL", slotId);
2251 }
2252
2253 return 0;
2254}
2255
2256int radio::voiceRadioTechChangedInd(android::Parcel &p, int slotId, int requestNumber,
2257 int indicationType, int token, RIL_Errno e, void *response,
2258 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08002259 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan2fa9e632017-01-06 16:55:33 -08002260 if (response == NULL || responseLen != sizeof(int)) {
2261 RLOGE("radio::voiceRadioTechChangedInd: invalid response");
2262 return 0;
2263 }
2264 int32_t rat = ((int32_t *) response)[0];
2265 RLOGD("radio::voiceRadioTechChangedInd: rat %d", rat);
Amit Mahajan17249842017-01-19 15:05:45 -08002266 Return<void> retStatus = radioService[slotId]->mRadioIndication->voiceRadioTechChanged(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08002267 convertIntToRadioIndicationType(indicationType), (RadioTechnology) rat);
Amit Mahajan17249842017-01-19 15:05:45 -08002268 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08002269 } else {
2270 RLOGE("radio::voiceRadioTechChangedInd: radioService[%d]->mRadioIndication == NULL",
2271 slotId);
2272 }
2273
2274 return 0;
2275}
2276
2277void convertRilCellInfoListToHal(void *response, size_t responseLen, hidl_vec<CellInfo>& records) {
2278 int num = responseLen / sizeof(RIL_CellInfo_v12);
2279 records.resize(num);
2280
2281 RIL_CellInfo_v12 *rillCellInfo = (RIL_CellInfo_v12 *) response;
2282 for (int i = 0; i < num; i++) {
2283 records[i].cellInfoType = (CellInfoType) rillCellInfo->cellInfoType;
2284 records[i].registered = rillCellInfo->registered;
2285 records[i].timeStampType = (TimeStampType) rillCellInfo->timeStampType;
2286 records[i].timeStamp = rillCellInfo->timeStamp;
2287 switch(rillCellInfo->cellInfoType) {
2288 case RIL_CELL_INFO_TYPE_GSM: {
2289 records[i].gsm.resize(1);
2290 CellInfoGsm *cellInfoGsm = &records[i].gsm[0];
2291 cellInfoGsm->cellIdentityGsm.mcc =
2292 std::to_string(rillCellInfo->CellInfo.gsm.cellIdentityGsm.mcc);
2293 cellInfoGsm->cellIdentityGsm.mnc =
2294 std::to_string(rillCellInfo->CellInfo.gsm.cellIdentityGsm.mnc);
2295 cellInfoGsm->cellIdentityGsm.lac =
2296 rillCellInfo->CellInfo.gsm.cellIdentityGsm.lac;
2297 cellInfoGsm->cellIdentityGsm.cid =
2298 rillCellInfo->CellInfo.gsm.cellIdentityGsm.cid;
2299 cellInfoGsm->cellIdentityGsm.arfcn =
2300 rillCellInfo->CellInfo.gsm.cellIdentityGsm.arfcn;
2301 cellInfoGsm->cellIdentityGsm.bsic =
2302 rillCellInfo->CellInfo.gsm.cellIdentityGsm.bsic;
2303 cellInfoGsm->signalStrengthGsm.signalStrength =
2304 rillCellInfo->CellInfo.gsm.signalStrengthGsm.signalStrength;
2305 cellInfoGsm->signalStrengthGsm.bitErrorRate =
2306 rillCellInfo->CellInfo.gsm.signalStrengthGsm.bitErrorRate;
2307 cellInfoGsm->signalStrengthGsm.timingAdvance =
2308 rillCellInfo->CellInfo.gsm.signalStrengthGsm.timingAdvance;
2309 break;
2310 }
2311
2312 case RIL_CELL_INFO_TYPE_WCDMA: {
2313 records[i].wcdma.resize(1);
2314 CellInfoWcdma *cellInfoWcdma = &records[i].wcdma[0];
2315 cellInfoWcdma->cellIdentityWcdma.mcc =
2316 std::to_string(rillCellInfo->CellInfo.wcdma.cellIdentityWcdma.mcc);
2317 cellInfoWcdma->cellIdentityWcdma.mnc =
2318 std::to_string(rillCellInfo->CellInfo.wcdma.cellIdentityWcdma.mnc);
2319 cellInfoWcdma->cellIdentityWcdma.lac =
2320 rillCellInfo->CellInfo.wcdma.cellIdentityWcdma.lac;
2321 cellInfoWcdma->cellIdentityWcdma.cid =
2322 rillCellInfo->CellInfo.wcdma.cellIdentityWcdma.cid;
2323 cellInfoWcdma->cellIdentityWcdma.psc =
2324 rillCellInfo->CellInfo.wcdma.cellIdentityWcdma.psc;
2325 cellInfoWcdma->cellIdentityWcdma.uarfcn =
2326 rillCellInfo->CellInfo.wcdma.cellIdentityWcdma.uarfcn;
2327 cellInfoWcdma->signalStrengthWcdma.signalStrength =
2328 rillCellInfo->CellInfo.wcdma.signalStrengthWcdma.signalStrength;
2329 cellInfoWcdma->signalStrengthWcdma.bitErrorRate =
2330 rillCellInfo->CellInfo.wcdma.signalStrengthWcdma.bitErrorRate;
2331 break;
2332 }
2333
2334 case RIL_CELL_INFO_TYPE_CDMA: {
2335 records[i].cdma.resize(1);
2336 CellInfoCdma *cellInfoCdma = &records[i].cdma[0];
2337 cellInfoCdma->cellIdentityCdma.networkId =
2338 rillCellInfo->CellInfo.cdma.cellIdentityCdma.networkId;
2339 cellInfoCdma->cellIdentityCdma.systemId =
2340 rillCellInfo->CellInfo.cdma.cellIdentityCdma.systemId;
2341 cellInfoCdma->cellIdentityCdma.baseStationId =
2342 rillCellInfo->CellInfo.cdma.cellIdentityCdma.basestationId;
2343 cellInfoCdma->cellIdentityCdma.longitude =
2344 rillCellInfo->CellInfo.cdma.cellIdentityCdma.longitude;
2345 cellInfoCdma->cellIdentityCdma.latitude =
2346 rillCellInfo->CellInfo.cdma.cellIdentityCdma.latitude;
2347 cellInfoCdma->signalStrengthCdma.dbm =
2348 rillCellInfo->CellInfo.cdma.signalStrengthCdma.dbm;
2349 cellInfoCdma->signalStrengthCdma.ecio =
2350 rillCellInfo->CellInfo.cdma.signalStrengthCdma.ecio;
2351 cellInfoCdma->signalStrengthEvdo.dbm =
2352 rillCellInfo->CellInfo.cdma.signalStrengthEvdo.dbm;
2353 cellInfoCdma->signalStrengthEvdo.ecio =
2354 rillCellInfo->CellInfo.cdma.signalStrengthEvdo.ecio;
2355 cellInfoCdma->signalStrengthEvdo.signalNoiseRatio =
2356 rillCellInfo->CellInfo.cdma.signalStrengthEvdo.signalNoiseRatio;
2357 break;
2358 }
2359
2360 case RIL_CELL_INFO_TYPE_LTE: {
2361 records[i].lte.resize(1);
2362 CellInfoLte *cellInfoLte = &records[i].lte[0];
2363 cellInfoLte->cellIdentityLte.mcc =
2364 std::to_string(rillCellInfo->CellInfo.lte.cellIdentityLte.mcc);
2365 cellInfoLte->cellIdentityLte.mnc =
2366 std::to_string(rillCellInfo->CellInfo.lte.cellIdentityLte.mnc);
2367 cellInfoLte->cellIdentityLte.ci =
2368 rillCellInfo->CellInfo.lte.cellIdentityLte.ci;
2369 cellInfoLte->cellIdentityLte.pci =
2370 rillCellInfo->CellInfo.lte.cellIdentityLte.pci;
2371 cellInfoLte->cellIdentityLte.tac =
2372 rillCellInfo->CellInfo.lte.cellIdentityLte.tac;
2373 cellInfoLte->cellIdentityLte.earfcn =
2374 rillCellInfo->CellInfo.lte.cellIdentityLte.earfcn;
2375 cellInfoLte->signalStrengthLte.signalStrength =
2376 rillCellInfo->CellInfo.lte.signalStrengthLte.signalStrength;
2377 cellInfoLte->signalStrengthLte.rsrp =
2378 rillCellInfo->CellInfo.lte.signalStrengthLte.rsrp;
2379 cellInfoLte->signalStrengthLte.rsrq =
2380 rillCellInfo->CellInfo.lte.signalStrengthLte.rsrq;
2381 cellInfoLte->signalStrengthLte.rssnr =
2382 rillCellInfo->CellInfo.lte.signalStrengthLte.rssnr;
2383 cellInfoLte->signalStrengthLte.cqi =
2384 rillCellInfo->CellInfo.lte.signalStrengthLte.cqi;
2385 cellInfoLte->signalStrengthLte.timingAdvance =
2386 rillCellInfo->CellInfo.lte.signalStrengthLte.timingAdvance;
2387 break;
2388 }
2389
2390 case RIL_CELL_INFO_TYPE_TD_SCDMA: {
2391 records[i].tdscdma.resize(1);
2392 CellInfoTdscdma *cellInfoTdscdma = &records[i].tdscdma[0];
2393 cellInfoTdscdma->cellIdentityTdscdma.mcc =
2394 std::to_string(rillCellInfo->CellInfo.tdscdma.cellIdentityTdscdma.mcc);
2395 cellInfoTdscdma->cellIdentityTdscdma.mnc =
2396 std::to_string(rillCellInfo->CellInfo.tdscdma.cellIdentityTdscdma.mnc);
2397 cellInfoTdscdma->cellIdentityTdscdma.lac =
2398 rillCellInfo->CellInfo.tdscdma.cellIdentityTdscdma.lac;
2399 cellInfoTdscdma->cellIdentityTdscdma.cid =
2400 rillCellInfo->CellInfo.tdscdma.cellIdentityTdscdma.cid;
2401 cellInfoTdscdma->cellIdentityTdscdma.cpid =
2402 rillCellInfo->CellInfo.tdscdma.cellIdentityTdscdma.cpid;
2403 cellInfoTdscdma->signalStrengthTdscdma.rscp =
2404 rillCellInfo->CellInfo.tdscdma.signalStrengthTdscdma.rscp;
2405 break;
2406 }
2407 }
2408 rillCellInfo += 1;
2409 }
2410}
2411
2412int radio::cellInfoListInd(android::Parcel &p, int slotId, int requestNumber,
2413 int indicationType, int token, RIL_Errno e, void *response,
2414 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08002415 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan2fa9e632017-01-06 16:55:33 -08002416 if (response == NULL || responseLen % sizeof(RIL_CellInfo_v12) != 0) {
2417 RLOGE("radio::cellInfoListInd: invalid response");
2418 return 0;
2419 }
2420
2421 hidl_vec<CellInfo> records;
2422 convertRilCellInfoListToHal(response, responseLen, records);
2423
2424 RLOGD("radio::cellInfoListInd");
Amit Mahajan17249842017-01-19 15:05:45 -08002425 Return<void> retStatus = radioService[slotId]->mRadioIndication->cellInfoList(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08002426 convertIntToRadioIndicationType(indicationType), records);
Amit Mahajan17249842017-01-19 15:05:45 -08002427 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08002428 } else {
2429 RLOGE("radio::cellInfoListInd: radioService[%d]->mRadioIndication == NULL", slotId);
2430 }
2431
2432 return 0;
2433}
2434
2435int radio::imsNetworkStateChangedInd(android::Parcel &p, int slotId, int requestNumber,
2436 int indicationType, int token, RIL_Errno e, void *response,
2437 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08002438 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan2fa9e632017-01-06 16:55:33 -08002439 RLOGD("radio::imsNetworkStateChangedInd");
Amit Mahajan17249842017-01-19 15:05:45 -08002440 Return<void> retStatus = radioService[slotId]->mRadioIndication->imsNetworkStateChanged(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08002441 convertIntToRadioIndicationType(indicationType));
Amit Mahajan17249842017-01-19 15:05:45 -08002442 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08002443 } else {
2444 RLOGE("radio::imsNetworkStateChangedInd: radioService[%d]->mRadioIndication == NULL",
2445 slotId);
2446 }
2447
2448 return 0;
2449}
2450
2451int radio::subscriptionStatusChangedInd(android::Parcel &p, int slotId, int requestNumber,
2452 int indicationType, int token, RIL_Errno e, void *response,
2453 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08002454 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan2fa9e632017-01-06 16:55:33 -08002455 if (response == NULL || responseLen != sizeof(int)) {
2456 RLOGE("radio::subscriptionStatusChangedInd: invalid response");
2457 return 0;
2458 }
2459 bool activate = ((int32_t *) response)[0];
2460 RLOGD("radio::subscriptionStatusChangedInd: activate %d", activate);
Amit Mahajan17249842017-01-19 15:05:45 -08002461 Return<void> retStatus = radioService[slotId]->mRadioIndication->subscriptionStatusChanged(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08002462 convertIntToRadioIndicationType(indicationType), activate);
Amit Mahajan17249842017-01-19 15:05:45 -08002463 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08002464 } else {
2465 RLOGE("radio::subscriptionStatusChangedInd: radioService[%d]->mRadioIndication == NULL",
2466 slotId);
2467 }
2468
2469 return 0;
2470}
2471
2472int radio::srvccStateNotifyInd(android::Parcel &p, int slotId, int requestNumber,
2473 int indicationType, int token, RIL_Errno e, void *response,
2474 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08002475 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan2fa9e632017-01-06 16:55:33 -08002476 if (response == NULL || responseLen != sizeof(int)) {
2477 RLOGE("radio::srvccStateNotifyInd: invalid response");
2478 return 0;
2479 }
2480 int32_t state = ((int32_t *) response)[0];
2481 RLOGD("radio::srvccStateNotifyInd: rat %d", state);
Amit Mahajan17249842017-01-19 15:05:45 -08002482 Return<void> retStatus = radioService[slotId]->mRadioIndication->srvccStateNotify(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08002483 convertIntToRadioIndicationType(indicationType), (SrvccState) state);
Amit Mahajan17249842017-01-19 15:05:45 -08002484 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08002485 } else {
2486 RLOGE("radio::srvccStateNotifyInd: radioService[%d]->mRadioIndication == NULL", slotId);
2487 }
2488
2489 return 0;
2490}
2491
2492void convertRilHardwareConfigListToHal(void *response, size_t responseLen,
2493 hidl_vec<HardwareConfig>& records) {
2494 int num = responseLen / sizeof(RIL_HardwareConfig);
2495 records.resize(num);
2496
2497 RIL_HardwareConfig *rilHardwareConfig = (RIL_HardwareConfig *) response;
2498 for (int i = 0; i < num; i++) {
2499 records[i].type = (HardwareConfigType) rilHardwareConfig[i].type;
2500 records[i].uuid = convertCharPtrToHidlString(rilHardwareConfig[i].uuid);
2501 records[i].state = (HardwareConfigState) rilHardwareConfig[i].state;
2502 switch (rilHardwareConfig[i].type) {
2503 case RIL_HARDWARE_CONFIG_MODEM: {
2504 records[i].modem.resize(1);
2505 HardwareConfigModem *hwConfigModem = &records[i].modem[0];
2506 hwConfigModem->rat = rilHardwareConfig[i].cfg.modem.rat;
2507 hwConfigModem->maxVoice = rilHardwareConfig[i].cfg.modem.maxVoice;
2508 hwConfigModem->maxData = rilHardwareConfig[i].cfg.modem.maxData;
2509 hwConfigModem->maxStandby = rilHardwareConfig[i].cfg.modem.maxStandby;
2510 break;
2511 }
2512
2513 case RIL_HARDWARE_CONFIG_SIM: {
2514 records[i].sim.resize(1);
2515 records[i].sim[0].modemUuid =
2516 convertCharPtrToHidlString(rilHardwareConfig[i].cfg.sim.modemUuid);
2517 break;
2518 }
2519 }
2520 }
2521}
2522
2523int radio::hardwareConfigChangedInd(android::Parcel &p, int slotId, int requestNumber,
2524 int indicationType, int token, RIL_Errno e, void *response,
2525 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08002526 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan2fa9e632017-01-06 16:55:33 -08002527 if (response == NULL || responseLen % sizeof(RIL_HardwareConfig) != 0) {
2528 RLOGE("radio::hardwareConfigChangedInd: invalid response");
2529 return 0;
2530 }
2531
2532 hidl_vec<HardwareConfig> configs;
2533 convertRilHardwareConfigListToHal(response, responseLen, configs);
2534
2535 RLOGD("radio::hardwareConfigChangedInd");
Amit Mahajan17249842017-01-19 15:05:45 -08002536 Return<void> retStatus = radioService[slotId]->mRadioIndication->hardwareConfigChanged(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08002537 convertIntToRadioIndicationType(indicationType), configs);
Amit Mahajan17249842017-01-19 15:05:45 -08002538 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08002539 } else {
2540 RLOGE("radio::hardwareConfigChangedInd: radioService[%d]->mRadioIndication == NULL",
2541 slotId);
2542 }
2543
2544 return 0;
2545}
2546
2547void convertRilRadioCapabilityToHal(void *response, size_t responseLen, RadioCapability& rc) {
2548 RIL_RadioCapability *rilRadioCapability = (RIL_RadioCapability *) response;
2549 rc.session = rilRadioCapability->session;
2550 rc.phase = (android::hardware::radio::V1_0::RadioCapabilityPhase) rilRadioCapability->phase;
2551 rc.raf = rilRadioCapability->rat;
2552 rc.logicalModemUuid = convertCharPtrToHidlString(rilRadioCapability->logicalModemUuid);
2553 rc.status = (android::hardware::radio::V1_0::RadioCapabilityStatus) rilRadioCapability->status;
2554}
2555
2556int radio::radioCapabilityIndicationInd(android::Parcel &p, int slotId, int requestNumber,
2557 int indicationType, int token, RIL_Errno e, void *response,
2558 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08002559 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan2fa9e632017-01-06 16:55:33 -08002560 if (response == NULL || responseLen != sizeof(RIL_RadioCapability)) {
2561 RLOGE("radio::radioCapabilityIndicationInd: invalid response");
2562 return 0;
2563 }
2564
2565 RadioCapability rc;
2566 convertRilRadioCapabilityToHal(response, responseLen, rc);
2567
2568 RLOGD("radio::radioCapabilityIndicationInd");
Amit Mahajan17249842017-01-19 15:05:45 -08002569 Return<void> retStatus = radioService[slotId]->mRadioIndication->radioCapabilityIndication(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08002570 convertIntToRadioIndicationType(indicationType), rc);
Amit Mahajan17249842017-01-19 15:05:45 -08002571 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08002572 } else {
2573 RLOGE("radio::radioCapabilityIndicationInd: radioService[%d]->mRadioIndication == NULL",
2574 slotId);
2575 }
2576
2577 return 0;
2578}
2579
2580bool isServiceTypeCfQuery(RIL_SsServiceType serType, RIL_SsRequestType reqType) {
2581 if ((reqType == SS_INTERROGATION) &&
2582 (serType == SS_CFU ||
2583 serType == SS_CF_BUSY ||
2584 serType == SS_CF_NO_REPLY ||
2585 serType == SS_CF_NOT_REACHABLE ||
2586 serType == SS_CF_ALL ||
2587 serType == SS_CF_ALL_CONDITIONAL)) {
2588 return true;
2589 }
2590 return false;
2591}
2592
2593int radio::onSupplementaryServiceIndicationInd(android::Parcel &p, int slotId, int requestNumber,
2594 int indicationType, int token, RIL_Errno e,
2595 void *response, size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08002596 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan2fa9e632017-01-06 16:55:33 -08002597 if (response == NULL || responseLen != sizeof(RIL_StkCcUnsolSsResponse)) {
2598 RLOGE("radio::onSupplementaryServiceIndicationInd: invalid response");
2599 return 0;
2600 }
2601
2602 RIL_StkCcUnsolSsResponse *rilSsResponse = (RIL_StkCcUnsolSsResponse *) response;
2603 StkCcUnsolSsResult ss;
2604 ss.serviceType = (SsServiceType) rilSsResponse->serviceType;
2605 ss.requestType = (SsRequestType) rilSsResponse->requestType;
2606 ss.teleserviceType = (SsTeleserviceType) rilSsResponse->teleserviceType;
2607 ss.serviceClass = rilSsResponse->serviceClass;
2608 ss.result = (RadioError) rilSsResponse->result;
2609
2610 if (isServiceTypeCfQuery(rilSsResponse->serviceType, rilSsResponse->requestType)) {
2611 RLOGD("radio::onSupplementaryServiceIndicationInd CF type, num of Cf elements %d",
2612 rilSsResponse->cfData.numValidIndexes);
2613 if (rilSsResponse->cfData.numValidIndexes > NUM_SERVICE_CLASSES) {
2614 RLOGE("radio::onSupplementaryServiceIndicationInd numValidIndexes is greater than "
2615 "max value %d, truncating it to max value", NUM_SERVICE_CLASSES);
2616 rilSsResponse->cfData.numValidIndexes = NUM_SERVICE_CLASSES;
2617 }
2618
2619 ss.cfData.resize(1);
2620
2621 /* number of call info's */
2622 ss.cfData[0].cfInfo.resize(rilSsResponse->cfData.numValidIndexes);
2623
2624 for (int i = 0; i < rilSsResponse->cfData.numValidIndexes; i++) {
2625 RIL_CallForwardInfo cf = rilSsResponse->cfData.cfInfo[i];
2626 CallForwardInfo *cfInfo = &ss.cfData[0].cfInfo[i];
2627
2628 cfInfo->status = (CallForwardInfoStatus) cf.status;
2629 cfInfo->reason = cf.reason;
2630 cfInfo->serviceClass = cf.serviceClass;
2631 cfInfo->toa = cf.toa;
2632 cfInfo->number = convertCharPtrToHidlString(cf.number);
2633 cfInfo->timeSeconds = cf.timeSeconds;
2634 RLOGD("radio::onSupplementaryServiceIndicationInd: "
2635 "Data: %d,reason=%d,cls=%d,toa=%d,num=%s,tout=%d],", cf.status,
2636 cf.reason, cf.serviceClass, cf.toa, (char*)cf.number, cf.timeSeconds);
2637 }
2638 } else {
2639 ss.ssInfo.resize(1);
2640
2641 /* each int */
2642 ss.ssInfo[0].ssInfo.resize(SS_INFO_MAX);
2643 for (int i = 0; i < SS_INFO_MAX; i++) {
2644 RLOGD("radio::onSupplementaryServiceIndicationInd: Data: %d",
2645 rilSsResponse->ssInfo[i]);
2646 ss.ssInfo[0].ssInfo[i] = rilSsResponse->ssInfo[i];
2647 }
2648 }
2649
2650 RLOGD("radio::onSupplementaryServiceIndicationInd");
Amit Mahajan17249842017-01-19 15:05:45 -08002651 Return<void> retStatus = radioService[slotId]->mRadioIndication->
2652 onSupplementaryServiceIndication(convertIntToRadioIndicationType(indicationType),
2653 ss);
2654 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08002655 } else {
2656 RLOGE("radio::onSupplementaryServiceIndicationInd: "
2657 "radioService[%d]->mRadioIndication == NULL", slotId);
2658 }
2659
2660 return 0;
2661}
2662
2663int radio::stkCallControlAlphaNotifyInd(android::Parcel &p, int slotId, int requestNumber,
2664 int indicationType, int token, RIL_Errno e, void *response,
2665 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08002666 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan2fa9e632017-01-06 16:55:33 -08002667 if (response == NULL || responseLen == 0) {
2668 RLOGE("radio::stkCallControlAlphaNotifyInd: invalid response");
2669 return 0;
2670 }
2671 RLOGD("radio::stkCallControlAlphaNotifyInd");
Amit Mahajan17249842017-01-19 15:05:45 -08002672 Return<void> retStatus = radioService[slotId]->mRadioIndication->stkCallControlAlphaNotify(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08002673 convertIntToRadioIndicationType(indicationType),
2674 convertCharPtrToHidlString((char *) response));
Amit Mahajan17249842017-01-19 15:05:45 -08002675 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08002676 } else {
2677 RLOGE("radio::stkCallControlAlphaNotifyInd: radioService[%d]->mRadioIndication == NULL",
2678 slotId);
2679 }
2680
2681 return 0;
2682}
2683
2684void convertRilLceDataInfoToHal(void *response, size_t responseLen, LceDataInfo& lce) {
2685 RIL_LceDataInfo *rilLceDataInfo = (RIL_LceDataInfo *)response;
2686 lce.lastHopCapacityKbps = rilLceDataInfo->last_hop_capacity_kbps;
2687 lce.confidenceLevel = rilLceDataInfo->confidence_level;
2688 lce.lceSuspended = rilLceDataInfo->lce_suspended;
2689}
2690
2691int radio::lceDataInd(android::Parcel &p, int slotId, int requestNumber,
2692 int indicationType, int token, RIL_Errno e, void *response,
2693 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08002694 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan2fa9e632017-01-06 16:55:33 -08002695 if (response == NULL || responseLen != sizeof(RIL_LceDataInfo)) {
2696 RLOGE("radio::lceDataInd: invalid response");
2697 return 0;
2698 }
2699
2700 LceDataInfo lce;
2701 convertRilLceDataInfoToHal(response, responseLen, lce);
2702 RLOGD("radio::lceDataInd");
Amit Mahajan17249842017-01-19 15:05:45 -08002703 Return<void> retStatus = radioService[slotId]->mRadioIndication->lceData(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08002704 convertIntToRadioIndicationType(indicationType), lce);
Amit Mahajan17249842017-01-19 15:05:45 -08002705 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08002706 } else {
2707 RLOGE("radio::lceDataInd: radioService[%d]->mRadioIndication == NULL", slotId);
2708 }
2709
2710 return 0;
2711}
2712
2713int radio::pcoDataInd(android::Parcel &p, int slotId, int requestNumber,
2714 int indicationType, int token, RIL_Errno e, void *response,
2715 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08002716 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan2fa9e632017-01-06 16:55:33 -08002717 if (response == NULL || responseLen != sizeof(RIL_PCO_Data)) {
2718 RLOGE("radio::pcoDataInd: invalid response");
2719 return 0;
2720 }
2721
2722 PcoDataInfo pco;
2723 RIL_PCO_Data *rilPcoData = (RIL_PCO_Data *)response;
2724 pco.cid = rilPcoData->cid;
2725 pco.bearerProto = convertCharPtrToHidlString(rilPcoData->bearer_proto);
2726 pco.pcoId = rilPcoData->pco_id;
2727 pco.contents.setToExternal((uint8_t *) rilPcoData->contents, rilPcoData->contents_length);
2728
2729 RLOGD("radio::pcoDataInd");
Amit Mahajan17249842017-01-19 15:05:45 -08002730 Return<void> retStatus = radioService[slotId]->mRadioIndication->pcoData(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08002731 convertIntToRadioIndicationType(indicationType), pco);
Amit Mahajan17249842017-01-19 15:05:45 -08002732 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08002733 } else {
2734 RLOGE("radio::pcoDataInd: radioService[%d]->mRadioIndication == NULL", slotId);
2735 }
2736
2737 return 0;
2738}
2739
2740int radio::modemResetInd(android::Parcel &p, int slotId, int requestNumber,
2741 int indicationType, int token, RIL_Errno e, void *response,
2742 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08002743 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan2fa9e632017-01-06 16:55:33 -08002744 if (response == NULL || responseLen == 0) {
2745 RLOGE("radio::modemResetInd: invalid response");
2746 return 0;
2747 }
2748 RLOGD("radio::modemResetInd");
Amit Mahajan17249842017-01-19 15:05:45 -08002749 Return<void> retStatus = radioService[slotId]->mRadioIndication->modemReset(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08002750 convertIntToRadioIndicationType(indicationType),
2751 convertCharPtrToHidlString((char *) response));
Amit Mahajan17249842017-01-19 15:05:45 -08002752 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08002753 } else {
2754 RLOGE("radio::modemResetInd: radioService[%d]->mRadioIndication == NULL", slotId);
2755 }
2756
2757 return 0;
2758}
2759
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002760void radio::registerService(RIL_RadioFunctions *callbacks, CommandInfo *commands) {
2761 using namespace android::hardware;
2762 int simCount = 1;
2763 char *serviceNames[] = {
2764 android::RIL_getRilSocketName()
2765 #if (SIM_COUNT >= 2)
2766 , SOCKET2_NAME_RIL
2767 #if (SIM_COUNT >= 3)
2768 , SOCKET3_NAME_RIL
2769 #if (SIM_COUNT >= 4)
2770 , SOCKET4_NAME_RIL
2771 #endif
2772 #endif
2773 #endif
2774 };
2775
2776 #if (SIM_COUNT >= 2)
2777 simCount = SIM_COUNT;
2778 #endif
2779
2780 configureRpcThreadpool(1, true /* callerWillJoin */);
2781 for (int i = 0; i < simCount; i++) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08002782 pthread_rwlock_t *radioServiceRwlockPtr = getRadioServiceRwlock(i);
2783 int ret = pthread_rwlock_wrlock(radioServiceRwlockPtr);
2784 assert(ret == 0);
2785
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002786 radioService[i] = new RadioImpl;
Sanket Padawef220dc52017-01-02 23:46:00 -08002787 radioService[i]->mSlotId = i;
Amit Mahajan5829a472016-12-28 17:28:07 -08002788 RLOGD("radio::registerService: starting IRadio %s", serviceNames[i]);
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002789 android::status_t status = radioService[i]->registerAsService(serviceNames[i]);
Amit Mahajan932e08e2017-01-24 05:45:02 -08002790
2791 ret = pthread_rwlock_unlock(radioServiceRwlockPtr);
2792 assert(ret == 0);
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002793 }
2794
2795 s_callbacks = callbacks;
2796 s_commands = commands;
2797}
2798
2799void rilc_thread_pool() {
2800 joinRpcThreadpool();
Amit Mahajan932e08e2017-01-24 05:45:02 -08002801}
2802
2803pthread_rwlock_t * radio::getRadioServiceRwlock(int slotId) {
2804 pthread_rwlock_t *radioServiceRwlockPtr = &radioServiceRwlock;
2805
2806 #if (SIM_COUNT >= 2)
2807 if (slotId == 2) radioServiceRwlockPtr = &radioServiceRwlock2;
2808 #if (SIM_COUNT >= 3)
2809 if (slotId == 3) radioServiceRwlockPtr = &radioServiceRwlock3;
2810 #if (SIM_COUNT >= 4)
2811 if (slotId == 4) radioServiceRwlockPtr = &radioServiceRwlock4;
2812 #endif
2813 #endif
2814 #endif
2815
2816 return radioServiceRwlockPtr;
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002817}