blob: c4f57d6b45a06da375d79b96ab7b3629e82601e0 [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
Amit Mahajan34b33aa2017-03-01 11:13:15 -080017#define LOG_TAG "RILC"
18
pkanwardb8e0942017-03-17 12:49:34 -070019#include <android/hardware/radio/1.1/IRadio.h>
20#include <android/hardware/radio/1.1/IRadioResponse.h>
21#include <android/hardware/radio/1.1/IRadioIndication.h>
Grace Chen08eb6542017-03-23 18:39:48 -070022#include <android/hardware/radio/1.1/types.h>
pkanwardb8e0942017-03-17 12:49:34 -070023
Amit Mahajan439da362017-02-13 17:43:04 -080024#include <android/hardware/radio/deprecated/1.0/IOemHook.h>
Amit Mahajancd77a5b2016-08-25 11:19:21 -070025
26#include <hwbinder/IPCThreadState.h>
27#include <hwbinder/ProcessState.h>
Nathan Harold98cfcee2018-08-20 11:38:27 -070028#include <telephony/ril.h>
29#include <telephony/ril_mnc.h>
Amit Mahajancd77a5b2016-08-25 11:19:21 -070030#include <ril_service.h>
31#include <hidl/HidlTransportSupport.h>
Amit Mahajan5829a472016-12-28 17:28:07 -080032#include <utils/SystemClock.h>
Wei Wang100ac9b2017-02-03 14:18:07 -080033#include <inttypes.h>
Amit Mahajan5829a472016-12-28 17:28:07 -080034
35#define INVALID_HEX_CHAR 16
Amit Mahajancd77a5b2016-08-25 11:19:21 -070036
Amit Mahajanccb6d7f2017-06-09 10:44:54 -070037using namespace android::hardware::radio;
Amit Mahajancd77a5b2016-08-25 11:19:21 -070038using namespace android::hardware::radio::V1_0;
Amit Mahajan439da362017-02-13 17:43:04 -080039using namespace android::hardware::radio::deprecated::V1_0;
Amit Mahajancd77a5b2016-08-25 11:19:21 -070040using ::android::hardware::configureRpcThreadpool;
41using ::android::hardware::joinRpcThreadpool;
42using ::android::hardware::Return;
Amit Mahajancd77a5b2016-08-25 11:19:21 -070043using ::android::hardware::hidl_string;
44using ::android::hardware::hidl_vec;
45using ::android::hardware::hidl_array;
46using ::android::hardware::Void;
47using android::CommandInfo;
48using android::RequestInfo;
49using android::requestToString;
50using android::sp;
51
Sanket Padawe378ccdd2017-01-24 14:11:12 -080052#define BOOL_TO_INT(x) (x ? 1 : 0)
53#define ATOI_NULL_HANDLED(x) (x ? atoi(x) : -1)
54#define ATOI_NULL_HANDLED_DEF(x, defaultVal) (x ? atoi(x) : defaultVal)
55
Amit Mahajanb3a11bb2017-05-15 16:41:44 -070056#if defined(ANDROID_MULTI_SIM)
57#define CALL_ONREQUEST(a, b, c, d, e) \
58 s_vendorFunctions->onRequest((a), (b), (c), (d), ((RIL_SOCKET_ID)(e)))
59#define CALL_ONSTATEREQUEST(a) s_vendorFunctions->onStateRequest((RIL_SOCKET_ID)(a))
60#else
61#define CALL_ONREQUEST(a, b, c, d, e) s_vendorFunctions->onRequest((a), (b), (c), (d))
62#define CALL_ONSTATEREQUEST(a) s_vendorFunctions->onStateRequest()
63#endif
64
Steven Moreland6cc40042018-03-20 11:20:05 -070065#ifdef OEM_HOOK_DISABLED
66constexpr bool kOemHookEnabled = false;
67#else
68constexpr bool kOemHookEnabled = true;
69#endif
70
Sanket Padawe378ccdd2017-01-24 14:11:12 -080071RIL_RadioFunctions *s_vendorFunctions = NULL;
Amit Mahajancd77a5b2016-08-25 11:19:21 -070072static CommandInfo *s_commands;
73
74struct RadioImpl;
Amit Mahajan439da362017-02-13 17:43:04 -080075struct OemHookImpl;
Amit Mahajancd77a5b2016-08-25 11:19:21 -070076
77#if (SIM_COUNT >= 2)
78sp<RadioImpl> radioService[SIM_COUNT];
Amit Mahajan439da362017-02-13 17:43:04 -080079sp<OemHookImpl> oemHookService[SIM_COUNT];
Amit Mahajane9a10e62018-02-23 17:12:15 -080080int64_t nitzTimeReceived[SIM_COUNT];
Amit Mahajan439da362017-02-13 17:43:04 -080081// counter used for synchronization. It is incremented every time response callbacks are updated.
Amit Mahajand423d192017-03-16 17:04:01 -070082volatile int32_t mCounterRadio[SIM_COUNT];
83volatile int32_t mCounterOemHook[SIM_COUNT];
Amit Mahajancd77a5b2016-08-25 11:19:21 -070084#else
85sp<RadioImpl> radioService[1];
Amit Mahajan439da362017-02-13 17:43:04 -080086sp<OemHookImpl> oemHookService[1];
Amit Mahajane9a10e62018-02-23 17:12:15 -080087int64_t nitzTimeReceived[1];
Amit Mahajan439da362017-02-13 17:43:04 -080088// counter used for synchronization. It is incremented every time response callbacks are updated.
Amit Mahajand423d192017-03-16 17:04:01 -070089volatile int32_t mCounterRadio[1];
90volatile int32_t mCounterOemHook[1];
Amit Mahajancd77a5b2016-08-25 11:19:21 -070091#endif
92
Amit Mahajan932e08e2017-01-24 05:45:02 -080093static pthread_rwlock_t radioServiceRwlock = PTHREAD_RWLOCK_INITIALIZER;
94
95#if (SIM_COUNT >= 2)
96static pthread_rwlock_t radioServiceRwlock2 = PTHREAD_RWLOCK_INITIALIZER;
97#if (SIM_COUNT >= 3)
98static pthread_rwlock_t radioServiceRwlock3 = PTHREAD_RWLOCK_INITIALIZER;
99#if (SIM_COUNT >= 4)
100static pthread_rwlock_t radioServiceRwlock4 = PTHREAD_RWLOCK_INITIALIZER;
101#endif
102#endif
103#endif
104
Karsten Tausche954d1242020-11-20 15:36:08 +0100105namespace {
106
107int clampWarn(const char* name, const int value, const int min, const int max) {
108 const int clamped = (value < min) ? min : (value > max) ? max : value;
109 if (clamped != value) {
110 RLOGW("Clamping value %s (%i) into valid range [%i, %i]", name, value, min, max);
111 }
112 return clamped;
113}
114
115}
116
117
Amit Mahajan3df62912017-02-10 01:35:55 +0000118void convertRilHardwareConfigListToHal(void *response, size_t responseLen,
119 hidl_vec<HardwareConfig>& records);
120
121void convertRilRadioCapabilityToHal(void *response, size_t responseLen, RadioCapability& rc);
122
123void convertRilLceDataInfoToHal(void *response, size_t responseLen, LceDataInfo& lce);
124
125void convertRilSignalStrengthToHal(void *response, size_t responseLen,
126 SignalStrength& signalStrength);
127
128void convertRilDataCallToHal(RIL_Data_Call_Response_v11 *dcResponse,
129 SetupDataCallResult& dcResult);
130
131void convertRilDataCallListToHal(void *response, size_t responseLen,
132 hidl_vec<SetupDataCallResult>& dcResultList);
133
134void convertRilCellInfoListToHal(void *response, size_t responseLen, hidl_vec<CellInfo>& records);
135
Amit Mahajanccb6d7f2017-06-09 10:44:54 -0700136struct RadioImpl : public V1_1::IRadio {
Sanket Padawef220dc52017-01-02 23:46:00 -0800137 int32_t mSlotId;
138 sp<IRadioResponse> mRadioResponse;
139 sp<IRadioIndication> mRadioIndication;
Amit Mahajanccb6d7f2017-06-09 10:44:54 -0700140 sp<V1_1::IRadioResponse> mRadioResponseV1_1;
141 sp<V1_1::IRadioIndication> mRadioIndicationV1_1;
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700142
143 Return<void> setResponseFunctions(
144 const ::android::sp<IRadioResponse>& radioResponse,
145 const ::android::sp<IRadioIndication>& radioIndication);
146
147 Return<void> getIccCardStatus(int32_t serial);
148
Sanket Padawef220dc52017-01-02 23:46:00 -0800149 Return<void> supplyIccPinForApp(int32_t serial, const hidl_string& pin,
150 const hidl_string& aid);
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700151
Sanket Padawef220dc52017-01-02 23:46:00 -0800152 Return<void> supplyIccPukForApp(int32_t serial, const hidl_string& puk,
153 const hidl_string& pin, const hidl_string& aid);
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700154
155 Return<void> supplyIccPin2ForApp(int32_t serial,
Sanket Padawef220dc52017-01-02 23:46:00 -0800156 const hidl_string& pin2,
157 const hidl_string& aid);
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700158
Sanket Padawef220dc52017-01-02 23:46:00 -0800159 Return<void> supplyIccPuk2ForApp(int32_t serial, const hidl_string& puk2,
160 const hidl_string& pin2, const hidl_string& aid);
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700161
Sanket Padawef220dc52017-01-02 23:46:00 -0800162 Return<void> changeIccPinForApp(int32_t serial, const hidl_string& oldPin,
163 const hidl_string& newPin, const hidl_string& aid);
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700164
Sanket Padawef220dc52017-01-02 23:46:00 -0800165 Return<void> changeIccPin2ForApp(int32_t serial, const hidl_string& oldPin2,
166 const hidl_string& newPin2, const hidl_string& aid);
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700167
Sanket Padawef220dc52017-01-02 23:46:00 -0800168 Return<void> supplyNetworkDepersonalization(int32_t serial, const hidl_string& netPin);
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700169
170 Return<void> getCurrentCalls(int32_t serial);
171
Sanket Padawef220dc52017-01-02 23:46:00 -0800172 Return<void> dial(int32_t serial, const Dial& dialInfo);
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700173
174 Return<void> getImsiForApp(int32_t serial,
175 const ::android::hardware::hidl_string& aid);
176
177 Return<void> hangup(int32_t serial, int32_t gsmIndex);
178
179 Return<void> hangupWaitingOrBackground(int32_t serial);
180
181 Return<void> hangupForegroundResumeBackground(int32_t serial);
182
183 Return<void> switchWaitingOrHoldingAndActive(int32_t serial);
184
185 Return<void> conference(int32_t serial);
186
187 Return<void> rejectCall(int32_t serial);
188
189 Return<void> getLastCallFailCause(int32_t serial);
190
191 Return<void> getSignalStrength(int32_t serial);
192
193 Return<void> getVoiceRegistrationState(int32_t serial);
194
195 Return<void> getDataRegistrationState(int32_t serial);
196
197 Return<void> getOperator(int32_t serial);
198
199 Return<void> setRadioPower(int32_t serial, bool on);
200
201 Return<void> sendDtmf(int32_t serial,
202 const ::android::hardware::hidl_string& s);
203
204 Return<void> sendSms(int32_t serial, const GsmSmsMessage& message);
205
206 Return<void> sendSMSExpectMore(int32_t serial, const GsmSmsMessage& message);
207
208 Return<void> setupDataCall(int32_t serial,
Jack Yu06181bb2017-01-10 12:10:41 -0800209 RadioTechnology radioTechnology,
210 const DataProfileInfo& profileInfo,
211 bool modemCognitive,
Jack Yuffc06452017-02-13 11:21:00 -0800212 bool roamingAllowed,
213 bool isRoaming);
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700214
215 Return<void> iccIOForApp(int32_t serial,
216 const IccIo& iccIo);
217
218 Return<void> sendUssd(int32_t serial,
219 const ::android::hardware::hidl_string& ussd);
220
221 Return<void> cancelPendingUssd(int32_t serial);
222
223 Return<void> getClir(int32_t serial);
224
225 Return<void> setClir(int32_t serial, int32_t status);
226
227 Return<void> getCallForwardStatus(int32_t serial,
228 const CallForwardInfo& callInfo);
229
230 Return<void> setCallForward(int32_t serial,
231 const CallForwardInfo& callInfo);
232
233 Return<void> getCallWaiting(int32_t serial, int32_t serviceClass);
234
235 Return<void> setCallWaiting(int32_t serial, bool enable, int32_t serviceClass);
236
237 Return<void> acknowledgeLastIncomingGsmSms(int32_t serial,
238 bool success, SmsAcknowledgeFailCause cause);
239
240 Return<void> acceptCall(int32_t serial);
241
242 Return<void> deactivateDataCall(int32_t serial,
243 int32_t cid, bool reasonRadioShutDown);
244
245 Return<void> getFacilityLockForApp(int32_t serial,
246 const ::android::hardware::hidl_string& facility,
247 const ::android::hardware::hidl_string& password,
248 int32_t serviceClass,
249 const ::android::hardware::hidl_string& appId);
250
251 Return<void> setFacilityLockForApp(int32_t serial,
252 const ::android::hardware::hidl_string& facility,
253 bool lockState,
254 const ::android::hardware::hidl_string& password,
255 int32_t serviceClass,
256 const ::android::hardware::hidl_string& appId);
257
258 Return<void> setBarringPassword(int32_t serial,
259 const ::android::hardware::hidl_string& facility,
260 const ::android::hardware::hidl_string& oldPassword,
261 const ::android::hardware::hidl_string& newPassword);
262
263 Return<void> getNetworkSelectionMode(int32_t serial);
264
265 Return<void> setNetworkSelectionModeAutomatic(int32_t serial);
266
267 Return<void> setNetworkSelectionModeManual(int32_t serial,
268 const ::android::hardware::hidl_string& operatorNumeric);
269
270 Return<void> getAvailableNetworks(int32_t serial);
271
Nathan Harold6a8809d2017-07-07 19:28:58 -0700272 Return<void> startNetworkScan(int32_t serial, const V1_1::NetworkScanRequest& request);
yinxu3abe7c72017-05-03 15:15:19 -0700273
274 Return<void> stopNetworkScan(int32_t serial);
275
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700276 Return<void> startDtmf(int32_t serial,
277 const ::android::hardware::hidl_string& s);
278
279 Return<void> stopDtmf(int32_t serial);
280
281 Return<void> getBasebandVersion(int32_t serial);
282
283 Return<void> separateConnection(int32_t serial, int32_t gsmIndex);
284
285 Return<void> setMute(int32_t serial, bool enable);
286
287 Return<void> getMute(int32_t serial);
288
289 Return<void> getClip(int32_t serial);
290
291 Return<void> getDataCallList(int32_t serial);
292
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700293 Return<void> setSuppServiceNotifications(int32_t serial, bool enable);
294
295 Return<void> writeSmsToSim(int32_t serial,
296 const SmsWriteArgs& smsWriteArgs);
297
298 Return<void> deleteSmsOnSim(int32_t serial, int32_t index);
299
300 Return<void> setBandMode(int32_t serial, RadioBandMode mode);
301
302 Return<void> getAvailableBandModes(int32_t serial);
303
304 Return<void> sendEnvelope(int32_t serial,
305 const ::android::hardware::hidl_string& command);
306
307 Return<void> sendTerminalResponseToSim(int32_t serial,
308 const ::android::hardware::hidl_string& commandResponse);
309
310 Return<void> handleStkCallSetupRequestFromSim(int32_t serial, bool accept);
311
312 Return<void> explicitCallTransfer(int32_t serial);
313
314 Return<void> setPreferredNetworkType(int32_t serial, PreferredNetworkType nwType);
315
316 Return<void> getPreferredNetworkType(int32_t serial);
317
318 Return<void> getNeighboringCids(int32_t serial);
319
320 Return<void> setLocationUpdates(int32_t serial, bool enable);
321
322 Return<void> setCdmaSubscriptionSource(int32_t serial,
323 CdmaSubscriptionSource cdmaSub);
324
325 Return<void> setCdmaRoamingPreference(int32_t serial, CdmaRoamingType type);
326
327 Return<void> getCdmaRoamingPreference(int32_t serial);
328
329 Return<void> setTTYMode(int32_t serial, TtyMode mode);
330
331 Return<void> getTTYMode(int32_t serial);
332
333 Return<void> setPreferredVoicePrivacy(int32_t serial, bool enable);
334
335 Return<void> getPreferredVoicePrivacy(int32_t serial);
336
337 Return<void> sendCDMAFeatureCode(int32_t serial,
338 const ::android::hardware::hidl_string& featureCode);
339
340 Return<void> sendBurstDtmf(int32_t serial,
341 const ::android::hardware::hidl_string& dtmf,
342 int32_t on,
343 int32_t off);
344
345 Return<void> sendCdmaSms(int32_t serial, const CdmaSmsMessage& sms);
346
347 Return<void> acknowledgeLastIncomingCdmaSms(int32_t serial,
348 const CdmaSmsAck& smsAck);
349
350 Return<void> getGsmBroadcastConfig(int32_t serial);
351
352 Return<void> setGsmBroadcastConfig(int32_t serial,
353 const hidl_vec<GsmBroadcastSmsConfigInfo>& configInfo);
354
355 Return<void> setGsmBroadcastActivation(int32_t serial, bool activate);
356
357 Return<void> getCdmaBroadcastConfig(int32_t serial);
358
359 Return<void> setCdmaBroadcastConfig(int32_t serial,
360 const hidl_vec<CdmaBroadcastSmsConfigInfo>& configInfo);
361
362 Return<void> setCdmaBroadcastActivation(int32_t serial, bool activate);
363
364 Return<void> getCDMASubscription(int32_t serial);
365
366 Return<void> writeSmsToRuim(int32_t serial, const CdmaSmsWriteArgs& cdmaSms);
367
368 Return<void> deleteSmsOnRuim(int32_t serial, int32_t index);
369
370 Return<void> getDeviceIdentity(int32_t serial);
371
372 Return<void> exitEmergencyCallbackMode(int32_t serial);
373
374 Return<void> getSmscAddress(int32_t serial);
375
376 Return<void> setSmscAddress(int32_t serial,
377 const ::android::hardware::hidl_string& smsc);
378
379 Return<void> reportSmsMemoryStatus(int32_t serial, bool available);
380
381 Return<void> reportStkServiceIsRunning(int32_t serial);
382
383 Return<void> getCdmaSubscriptionSource(int32_t serial);
384
385 Return<void> requestIsimAuthentication(int32_t serial,
386 const ::android::hardware::hidl_string& challenge);
387
388 Return<void> acknowledgeIncomingGsmSmsWithPdu(int32_t serial,
389 bool success,
390 const ::android::hardware::hidl_string& ackPdu);
391
392 Return<void> sendEnvelopeWithStatus(int32_t serial,
393 const ::android::hardware::hidl_string& contents);
394
395 Return<void> getVoiceRadioTechnology(int32_t serial);
396
397 Return<void> getCellInfoList(int32_t serial);
398
399 Return<void> setCellInfoListRate(int32_t serial, int32_t rate);
400
Jack Yu06181bb2017-01-10 12:10:41 -0800401 Return<void> setInitialAttachApn(int32_t serial, const DataProfileInfo& dataProfileInfo,
Jack Yuffc06452017-02-13 11:21:00 -0800402 bool modemCognitive, bool isRoaming);
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700403
404 Return<void> getImsRegistrationState(int32_t serial);
405
406 Return<void> sendImsSms(int32_t serial, const ImsSmsMessage& message);
407
408 Return<void> iccTransmitApduBasicChannel(int32_t serial, const SimApdu& message);
409
410 Return<void> iccOpenLogicalChannel(int32_t serial,
Wileen Chiu410b7562015-11-23 14:25:22 -0800411 const ::android::hardware::hidl_string& aid, int32_t p2);
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700412
413 Return<void> iccCloseLogicalChannel(int32_t serial, int32_t channelId);
414
415 Return<void> iccTransmitApduLogicalChannel(int32_t serial, const SimApdu& message);
416
417 Return<void> nvReadItem(int32_t serial, NvItem itemId);
418
419 Return<void> nvWriteItem(int32_t serial, const NvWriteItem& item);
420
421 Return<void> nvWriteCdmaPrl(int32_t serial,
422 const ::android::hardware::hidl_vec<uint8_t>& prl);
423
424 Return<void> nvResetConfig(int32_t serial, ResetNvType resetType);
425
426 Return<void> setUiccSubscription(int32_t serial, const SelectUiccSub& uiccSub);
427
428 Return<void> setDataAllowed(int32_t serial, bool allow);
429
430 Return<void> getHardwareConfig(int32_t serial);
431
432 Return<void> requestIccSimAuthentication(int32_t serial,
433 int32_t authContext,
434 const ::android::hardware::hidl_string& authData,
435 const ::android::hardware::hidl_string& aid);
436
437 Return<void> setDataProfile(int32_t serial,
Jack Yuffc06452017-02-13 11:21:00 -0800438 const ::android::hardware::hidl_vec<DataProfileInfo>& profiles, bool isRoaming);
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700439
440 Return<void> requestShutdown(int32_t serial);
441
442 Return<void> getRadioCapability(int32_t serial);
443
444 Return<void> setRadioCapability(int32_t serial, const RadioCapability& rc);
445
446 Return<void> startLceService(int32_t serial, int32_t reportInterval, bool pullMode);
447
448 Return<void> stopLceService(int32_t serial);
449
450 Return<void> pullLceData(int32_t serial);
451
452 Return<void> getModemActivityInfo(int32_t serial);
453
454 Return<void> setAllowedCarriers(int32_t serial,
455 bool allAllowed,
456 const CarrierRestrictions& carriers);
457
458 Return<void> getAllowedCarriers(int32_t serial);
459
Jack Yu06181bb2017-01-10 12:10:41 -0800460 Return<void> sendDeviceState(int32_t serial, DeviceStateType deviceStateType, bool state);
461
462 Return<void> setIndicationFilter(int32_t serial, int32_t indicationFilter);
463
Nathan Harold6a8809d2017-07-07 19:28:58 -0700464 Return<void> startKeepalive(int32_t serial, const V1_1::KeepaliveRequest& keepalive);
Nathan Haroldec94b822017-05-25 16:10:35 -0700465
466 Return<void> stopKeepalive(int32_t serial, int32_t sessionHandle);
467
Wileen Chiu718c0bf2017-01-04 11:37:19 -0800468 Return<void> setSimCardPower(int32_t serial, bool powerUp);
Grace Chen08eb6542017-03-23 18:39:48 -0700469 Return<void> setSimCardPower_1_1(int32_t serial,
Amit Mahajanccb6d7f2017-06-09 10:44:54 -0700470 const V1_1::CardPowerState state);
Wileen Chiu718c0bf2017-01-04 11:37:19 -0800471
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700472 Return<void> responseAcknowledgement();
Amit Mahajan17249842017-01-19 15:05:45 -0800473
pkanwardb8e0942017-03-17 12:49:34 -0700474 Return<void> setCarrierInfoForImsiEncryption(int32_t serial,
Nathan Harold6a8809d2017-07-07 19:28:58 -0700475 const V1_1::ImsiEncryptionInfo& message);
pkanwardb8e0942017-03-17 12:49:34 -0700476
Amit Mahajan17249842017-01-19 15:05:45 -0800477 void checkReturnStatus(Return<void>& ret);
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700478};
479
Amit Mahajan439da362017-02-13 17:43:04 -0800480struct OemHookImpl : public IOemHook {
481 int32_t mSlotId;
482 sp<IOemHookResponse> mOemHookResponse;
483 sp<IOemHookIndication> mOemHookIndication;
484
485 Return<void> setResponseFunctions(
486 const ::android::sp<IOemHookResponse>& oemHookResponse,
487 const ::android::sp<IOemHookIndication>& oemHookIndication);
488
489 Return<void> sendRequestRaw(int32_t serial,
490 const ::android::hardware::hidl_vec<uint8_t>& data);
491
492 Return<void> sendRequestStrings(int32_t serial,
493 const ::android::hardware::hidl_vec<::android::hardware::hidl_string>& data);
494};
495
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800496void memsetAndFreeStrings(int numPointers, ...) {
497 va_list ap;
498 va_start(ap, numPointers);
499 for (int i = 0; i < numPointers; i++) {
500 char *ptr = va_arg(ap, char *);
501 if (ptr) {
502#ifdef MEMSET_FREED
Jack Yub4295a42017-04-14 12:51:49 -0700503#define MAX_STRING_LENGTH 4096
504 memset(ptr, 0, strnlen(ptr, MAX_STRING_LENGTH));
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800505#endif
506 free(ptr);
507 }
508 }
509 va_end(ap);
510}
511
Jack Yuffc06452017-02-13 11:21:00 -0800512void sendErrorResponse(RequestInfo *pRI, RIL_Errno err) {
Amit Mahajan759786a2017-03-03 17:35:47 -0800513 pRI->pCI->responseFunction((int) pRI->socket_id,
Jack Yuffc06452017-02-13 11:21:00 -0800514 (int) RadioResponseType::SOLICITED, pRI->token, err, NULL, 0);
515}
516
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800517/**
Jack Yuf68e0da2017-02-07 14:53:09 -0800518 * Copies over src to dest. If memory allocation fails, responseFunction() is called for the
Ashit Sood169fc262018-09-06 14:10:34 -0700519 * request with error RIL_E_NO_MEMORY. The size() method is used to determine the size of the
520 * destination buffer into which the HIDL string is copied. If there is a discrepancy between
521 * the string length reported by the size() method, and the length of the string returned by
522 * the c_str() method, the function will return false indicating a failure.
523 *
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800524 * Returns true on success, and false on failure.
525 */
Ruthwar Kumar Ambeer7c373812017-03-23 17:38:56 +0530526bool copyHidlStringToRil(char **dest, const hidl_string &src, RequestInfo *pRI, bool allowEmpty) {
Jack Yuf68e0da2017-02-07 14:53:09 -0800527 size_t len = src.size();
Ruthwar Kumar Ambeer7c373812017-03-23 17:38:56 +0530528 if (len == 0 && !allowEmpty) {
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800529 *dest = NULL;
530 return true;
531 }
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800532 *dest = (char *) calloc(len + 1, sizeof(char));
533 if (*dest == NULL) {
534 RLOGE("Memory allocation failed for request %s", requestToString(pRI->pCI->requestNumber));
Jack Yuffc06452017-02-13 11:21:00 -0800535 sendErrorResponse(pRI, RIL_E_NO_MEMORY);
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800536 return false;
537 }
Ashit Sood169fc262018-09-06 14:10:34 -0700538 if (strlcpy(*dest, src.c_str(), len + 1) >= (len + 1)) {
539 RLOGE("Copy of the HIDL string has been truncated, as "
540 "the string length reported by size() does not "
541 "match the length of string returned by c_str().");
542 free(*dest);
543 *dest = NULL;
544 sendErrorResponse(pRI, RIL_E_INTERNAL_ERR);
545 return false;
546 }
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800547 return true;
548}
549
Ruthwar Kumar Ambeer7c373812017-03-23 17:38:56 +0530550bool copyHidlStringToRil(char **dest, const hidl_string &src, RequestInfo *pRI) {
551 return copyHidlStringToRil(dest, src, pRI, false);
552}
553
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800554hidl_string convertCharPtrToHidlString(const char *ptr) {
555 hidl_string ret;
556 if (ptr != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -0800557 // TODO: replace this with strnlen
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800558 ret.setToExternal(ptr, strlen(ptr));
559 }
560 return ret;
561}
562
563bool dispatchVoid(int serial, int slotId, int request) {
564 RequestInfo *pRI = android::addRequestToList(serial, slotId, request);
565 if (pRI == NULL) {
566 return false;
567 }
Amit Mahajanb3a11bb2017-05-15 16:41:44 -0700568 CALL_ONREQUEST(request, NULL, 0, pRI, slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800569 return true;
570}
571
572bool dispatchString(int serial, int slotId, int request, const char * str) {
573 RequestInfo *pRI = android::addRequestToList(serial, slotId, request);
574 if (pRI == NULL) {
575 return false;
576 }
577
578 char *pString;
579 if (!copyHidlStringToRil(&pString, str, pRI)) {
580 return false;
581 }
582
Amit Mahajanb3a11bb2017-05-15 16:41:44 -0700583 CALL_ONREQUEST(request, pString, sizeof(char *), pRI, slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800584
585 memsetAndFreeStrings(1, pString);
586 return true;
587}
588
Ruthwar Kumar Ambeer7c373812017-03-23 17:38:56 +0530589bool dispatchStrings(int serial, int slotId, int request, bool allowEmpty, int countStrings, ...) {
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800590 RequestInfo *pRI = android::addRequestToList(serial, slotId, request);
591 if (pRI == NULL) {
592 return false;
593 }
594
Sanket Padawef220dc52017-01-02 23:46:00 -0800595 char **pStrings;
Sanket Padawef220dc52017-01-02 23:46:00 -0800596 pStrings = (char **)calloc(countStrings, sizeof(char *));
597 if (pStrings == NULL) {
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800598 RLOGE("Memory allocation failed for request %s", requestToString(request));
Jack Yuffc06452017-02-13 11:21:00 -0800599 sendErrorResponse(pRI, RIL_E_NO_MEMORY);
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800600 return false;
Sanket Padawef220dc52017-01-02 23:46:00 -0800601 }
602 va_list ap;
603 va_start(ap, countStrings);
604 for (int i = 0; i < countStrings; i++) {
605 const char* str = va_arg(ap, const char *);
Ruthwar Kumar Ambeer7c373812017-03-23 17:38:56 +0530606 if (!copyHidlStringToRil(&pStrings[i], hidl_string(str), pRI, allowEmpty)) {
Sanket Padawef220dc52017-01-02 23:46:00 -0800607 va_end(ap);
Sanket Padawef220dc52017-01-02 23:46:00 -0800608 for (int j = 0; j < i; j++) {
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800609 memsetAndFreeStrings(1, pStrings[j]);
Sanket Padawef220dc52017-01-02 23:46:00 -0800610 }
611 free(pStrings);
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800612 return false;
Sanket Padawef220dc52017-01-02 23:46:00 -0800613 }
Sanket Padawef220dc52017-01-02 23:46:00 -0800614 }
615 va_end(ap);
616
Amit Mahajanb3a11bb2017-05-15 16:41:44 -0700617 CALL_ONREQUEST(request, pStrings, countStrings * sizeof(char *), pRI, slotId);
Sanket Padawef220dc52017-01-02 23:46:00 -0800618
619 if (pStrings != NULL) {
620 for (int i = 0 ; i < countStrings ; i++) {
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800621 memsetAndFreeStrings(1, pStrings[i]);
Sanket Padawef220dc52017-01-02 23:46:00 -0800622 }
623
624#ifdef MEMSET_FREED
625 memset(pStrings, 0, countStrings * sizeof(char *));
626#endif
627 free(pStrings);
628 }
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800629 return true;
630}
631
632bool dispatchStrings(int serial, int slotId, int request, const hidl_vec<hidl_string>& data) {
633 RequestInfo *pRI = android::addRequestToList(serial, slotId, request);
634 if (pRI == NULL) {
635 return false;
636 }
637
638 int countStrings = data.size();
639 char **pStrings;
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800640 pStrings = (char **)calloc(countStrings, sizeof(char *));
641 if (pStrings == NULL) {
642 RLOGE("Memory allocation failed for request %s", requestToString(request));
Jack Yuffc06452017-02-13 11:21:00 -0800643 sendErrorResponse(pRI, RIL_E_NO_MEMORY);
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800644 return false;
645 }
646
647 for (int i = 0; i < countStrings; i++) {
Jack Yuf68e0da2017-02-07 14:53:09 -0800648 if (!copyHidlStringToRil(&pStrings[i], data[i], pRI)) {
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800649 for (int j = 0; j < i; j++) {
650 memsetAndFreeStrings(1, pStrings[j]);
651 }
652 free(pStrings);
653 return false;
654 }
655 }
656
Amit Mahajanb3a11bb2017-05-15 16:41:44 -0700657 CALL_ONREQUEST(request, pStrings, countStrings * sizeof(char *), pRI, slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800658
659 if (pStrings != NULL) {
660 for (int i = 0 ; i < countStrings ; i++) {
661 memsetAndFreeStrings(1, pStrings[i]);
662 }
663
664#ifdef MEMSET_FREED
665 memset(pStrings, 0, countStrings * sizeof(char *));
666#endif
667 free(pStrings);
668 }
669 return true;
670}
671
672bool dispatchInts(int serial, int slotId, int request, int countInts, ...) {
673 RequestInfo *pRI = android::addRequestToList(serial, slotId, request);
674 if (pRI == NULL) {
675 return false;
676 }
677
Jack Yuffc06452017-02-13 11:21:00 -0800678 int *pInts = (int *)calloc(countInts, sizeof(int));
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800679
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800680 if (pInts == NULL) {
681 RLOGE("Memory allocation failed for request %s", requestToString(request));
Jack Yuffc06452017-02-13 11:21:00 -0800682 sendErrorResponse(pRI, RIL_E_NO_MEMORY);
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800683 return false;
684 }
685 va_list ap;
686 va_start(ap, countInts);
687 for (int i = 0; i < countInts; i++) {
688 pInts[i] = va_arg(ap, int);
689 }
690 va_end(ap);
691
Amit Mahajanb3a11bb2017-05-15 16:41:44 -0700692 CALL_ONREQUEST(request, pInts, countInts * sizeof(int), pRI, slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800693
694 if (pInts != NULL) {
695#ifdef MEMSET_FREED
696 memset(pInts, 0, countInts * sizeof(int));
697#endif
698 free(pInts);
699 }
700 return true;
701}
702
703bool dispatchCallForwardStatus(int serial, int slotId, int request,
704 const CallForwardInfo& callInfo) {
705 RequestInfo *pRI = android::addRequestToList(serial, slotId, request);
706 if (pRI == NULL) {
707 return false;
708 }
709
710 RIL_CallForwardInfo cf;
711 cf.status = (int) callInfo.status;
712 cf.reason = callInfo.reason;
713 cf.serviceClass = callInfo.serviceClass;
714 cf.toa = callInfo.toa;
715 cf.timeSeconds = callInfo.timeSeconds;
716
717 if (!copyHidlStringToRil(&cf.number, callInfo.number, pRI)) {
718 return false;
719 }
720
Amit Mahajanb3a11bb2017-05-15 16:41:44 -0700721 CALL_ONREQUEST(request, &cf, sizeof(cf), pRI, slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800722
723 memsetAndFreeStrings(1, cf.number);
724
725 return true;
726}
727
728bool dispatchRaw(int serial, int slotId, int request, const hidl_vec<uint8_t>& rawBytes) {
729 RequestInfo *pRI = android::addRequestToList(serial, slotId, request);
730 if (pRI == NULL) {
731 return false;
732 }
733
734 const uint8_t *uData = rawBytes.data();
735
Amit Mahajanb3a11bb2017-05-15 16:41:44 -0700736 CALL_ONREQUEST(request, (void *) uData, rawBytes.size(), pRI, slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800737
738 return true;
739}
740
741bool dispatchIccApdu(int serial, int slotId, int request, const SimApdu& message) {
742 RequestInfo *pRI = android::addRequestToList(serial, slotId, request);
743 if (pRI == NULL) {
744 return false;
745 }
746
Jack Yu8e732d42017-04-14 00:08:06 -0700747 RIL_SIM_APDU apdu = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800748
749 apdu.sessionid = message.sessionId;
750 apdu.cla = message.cla;
751 apdu.instruction = message.instruction;
752 apdu.p1 = message.p1;
753 apdu.p2 = message.p2;
754 apdu.p3 = message.p3;
755
756 if (!copyHidlStringToRil(&apdu.data, message.data, pRI)) {
757 return false;
758 }
759
Amit Mahajanb3a11bb2017-05-15 16:41:44 -0700760 CALL_ONREQUEST(request, &apdu, sizeof(apdu), pRI, slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800761
762 memsetAndFreeStrings(1, apdu.data);
763
764 return true;
Sanket Padawef220dc52017-01-02 23:46:00 -0800765}
766
Amit Mahajand423d192017-03-16 17:04:01 -0700767void checkReturnStatus(int32_t slotId, Return<void>& ret, bool isRadioService) {
Amit Mahajan17249842017-01-19 15:05:45 -0800768 if (ret.isOk() == false) {
Amit Mahajan439da362017-02-13 17:43:04 -0800769 RLOGE("checkReturnStatus: unable to call response/indication callback");
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800770 // Remote process hosting the callbacks must be dead. Reset the callback objects;
Amit Mahajan17249842017-01-19 15:05:45 -0800771 // there's no other recovery to be done here. When the client process is back up, it will
772 // call setResponseFunctions()
Amit Mahajan932e08e2017-01-24 05:45:02 -0800773
774 // Caller should already hold rdlock, release that first
775 // note the current counter to avoid overwriting updates made by another thread before
776 // write lock is acquired.
Amit Mahajand423d192017-03-16 17:04:01 -0700777 int counter = isRadioService ? mCounterRadio[slotId] : mCounterOemHook[slotId];
Amit Mahajan439da362017-02-13 17:43:04 -0800778 pthread_rwlock_t *radioServiceRwlockPtr = radio::getRadioServiceRwlock(slotId);
Amit Mahajan932e08e2017-01-24 05:45:02 -0800779 int ret = pthread_rwlock_unlock(radioServiceRwlockPtr);
780 assert(ret == 0);
781
782 // acquire wrlock
783 ret = pthread_rwlock_wrlock(radioServiceRwlockPtr);
784 assert(ret == 0);
785
786 // make sure the counter value has not changed
Amit Mahajand423d192017-03-16 17:04:01 -0700787 if (counter == (isRadioService ? mCounterRadio[slotId] : mCounterOemHook[slotId])) {
788 if (isRadioService) {
789 radioService[slotId]->mRadioResponse = NULL;
790 radioService[slotId]->mRadioIndication = NULL;
Amit Mahajanccb6d7f2017-06-09 10:44:54 -0700791 radioService[slotId]->mRadioResponseV1_1 = NULL;
792 radioService[slotId]->mRadioIndicationV1_1 = NULL;
Amit Mahajand423d192017-03-16 17:04:01 -0700793 } else {
794 oemHookService[slotId]->mOemHookResponse = NULL;
795 oemHookService[slotId]->mOemHookIndication = NULL;
796 }
797 isRadioService ? mCounterRadio[slotId]++ : mCounterOemHook[slotId]++;
Amit Mahajan932e08e2017-01-24 05:45:02 -0800798 } else {
Amit Mahajan439da362017-02-13 17:43:04 -0800799 RLOGE("checkReturnStatus: not resetting responseFunctions as they likely "
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800800 "got updated on another thread");
Amit Mahajan932e08e2017-01-24 05:45:02 -0800801 }
802
803 // release wrlock
804 ret = pthread_rwlock_unlock(radioServiceRwlockPtr);
805 assert(ret == 0);
806
807 // Reacquire rdlock
808 ret = pthread_rwlock_rdlock(radioServiceRwlockPtr);
809 assert(ret == 0);
Amit Mahajan17249842017-01-19 15:05:45 -0800810 }
811}
812
Amit Mahajan439da362017-02-13 17:43:04 -0800813void RadioImpl::checkReturnStatus(Return<void>& ret) {
Amit Mahajand423d192017-03-16 17:04:01 -0700814 ::checkReturnStatus(mSlotId, ret, true);
Amit Mahajan439da362017-02-13 17:43:04 -0800815}
816
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700817Return<void> RadioImpl::setResponseFunctions(
818 const ::android::sp<IRadioResponse>& radioResponseParam,
819 const ::android::sp<IRadioIndication>& radioIndicationParam) {
Amit Mahajan111ddca2017-03-03 12:05:13 -0800820 RLOGD("setResponseFunctions");
Amit Mahajan932e08e2017-01-24 05:45:02 -0800821
822 pthread_rwlock_t *radioServiceRwlockPtr = radio::getRadioServiceRwlock(mSlotId);
823 int ret = pthread_rwlock_wrlock(radioServiceRwlockPtr);
824 assert(ret == 0);
825
Sanket Padawef220dc52017-01-02 23:46:00 -0800826 mRadioResponse = radioResponseParam;
827 mRadioIndication = radioIndicationParam;
Amit Mahajanccb6d7f2017-06-09 10:44:54 -0700828 mRadioResponseV1_1 = V1_1::IRadioResponse::castFrom(mRadioResponse).withDefault(nullptr);
829 mRadioIndicationV1_1 = V1_1::IRadioIndication::castFrom(mRadioIndication).withDefault(nullptr);
830 if (mRadioResponseV1_1 == nullptr || mRadioIndicationV1_1 == nullptr) {
831 mRadioResponseV1_1 = nullptr;
832 mRadioIndicationV1_1 = nullptr;
833 }
834
Amit Mahajand423d192017-03-16 17:04:01 -0700835 mCounterRadio[mSlotId]++;
Amit Mahajan932e08e2017-01-24 05:45:02 -0800836
837 ret = pthread_rwlock_unlock(radioServiceRwlockPtr);
838 assert(ret == 0);
839
Amit Mahajan60482fd2017-03-14 16:39:27 -0700840 // client is connected. Send initial indications.
841 android::onNewCommandConnect((RIL_SOCKET_ID) mSlotId);
842
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800843 return Void();
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700844}
845
846Return<void> RadioImpl::getIccCardStatus(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -0700847#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -0800848 RLOGD("getIccCardStatus: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -0700849#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800850 dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_SIM_STATUS);
851 return Void();
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700852}
853
Sanket Padawef220dc52017-01-02 23:46:00 -0800854Return<void> RadioImpl::supplyIccPinForApp(int32_t serial, const hidl_string& pin,
855 const hidl_string& aid) {
Jayachandran C572f2f42017-03-25 14:30:13 -0700856#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -0800857 RLOGD("supplyIccPinForApp: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -0700858#endif
Ruthwar Kumar Ambeer7c373812017-03-23 17:38:56 +0530859 dispatchStrings(serial, mSlotId, RIL_REQUEST_ENTER_SIM_PIN, true,
Scott Randolphc7213312017-04-03 14:06:40 -0700860 2, pin.c_str(), aid.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800861 return Void();
Sanket Padawef220dc52017-01-02 23:46:00 -0800862}
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700863
Sanket Padawef220dc52017-01-02 23:46:00 -0800864Return<void> RadioImpl::supplyIccPukForApp(int32_t serial, const hidl_string& puk,
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800865 const hidl_string& pin, const hidl_string& aid) {
Jayachandran C572f2f42017-03-25 14:30:13 -0700866#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -0800867 RLOGD("supplyIccPukForApp: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -0700868#endif
Ruthwar Kumar Ambeer7c373812017-03-23 17:38:56 +0530869 dispatchStrings(serial, mSlotId, RIL_REQUEST_ENTER_SIM_PUK, true,
Scott Randolphc7213312017-04-03 14:06:40 -0700870 3, puk.c_str(), pin.c_str(), aid.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800871 return Void();
Sanket Padawef220dc52017-01-02 23:46:00 -0800872}
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700873
Sanket Padawef220dc52017-01-02 23:46:00 -0800874Return<void> RadioImpl::supplyIccPin2ForApp(int32_t serial, const hidl_string& pin2,
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800875 const hidl_string& aid) {
Jayachandran C572f2f42017-03-25 14:30:13 -0700876#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -0800877 RLOGD("supplyIccPin2ForApp: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -0700878#endif
Ruthwar Kumar Ambeer7c373812017-03-23 17:38:56 +0530879 dispatchStrings(serial, mSlotId, RIL_REQUEST_ENTER_SIM_PIN2, true,
Scott Randolphc7213312017-04-03 14:06:40 -0700880 2, pin2.c_str(), aid.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800881 return Void();
Sanket Padawef220dc52017-01-02 23:46:00 -0800882}
883
884Return<void> RadioImpl::supplyIccPuk2ForApp(int32_t serial, const hidl_string& puk2,
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800885 const hidl_string& pin2, const hidl_string& aid) {
Jayachandran C572f2f42017-03-25 14:30:13 -0700886#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -0800887 RLOGD("supplyIccPuk2ForApp: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -0700888#endif
Ruthwar Kumar Ambeer7c373812017-03-23 17:38:56 +0530889 dispatchStrings(serial, mSlotId, RIL_REQUEST_ENTER_SIM_PUK2, true,
Scott Randolphc7213312017-04-03 14:06:40 -0700890 3, puk2.c_str(), pin2.c_str(), aid.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800891 return Void();
Sanket Padawef220dc52017-01-02 23:46:00 -0800892}
893
894Return<void> RadioImpl::changeIccPinForApp(int32_t serial, const hidl_string& oldPin,
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800895 const hidl_string& newPin, const hidl_string& aid) {
Jayachandran C572f2f42017-03-25 14:30:13 -0700896#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -0800897 RLOGD("changeIccPinForApp: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -0700898#endif
Ruthwar Kumar Ambeer7c373812017-03-23 17:38:56 +0530899 dispatchStrings(serial, mSlotId, RIL_REQUEST_CHANGE_SIM_PIN, true,
Scott Randolphc7213312017-04-03 14:06:40 -0700900 3, oldPin.c_str(), newPin.c_str(), aid.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800901 return Void();
Sanket Padawef220dc52017-01-02 23:46:00 -0800902}
903
904Return<void> RadioImpl::changeIccPin2ForApp(int32_t serial, const hidl_string& oldPin2,
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800905 const hidl_string& newPin2, const hidl_string& aid) {
Jayachandran C572f2f42017-03-25 14:30:13 -0700906#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -0800907 RLOGD("changeIccPin2ForApp: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -0700908#endif
Ruthwar Kumar Ambeer7c373812017-03-23 17:38:56 +0530909 dispatchStrings(serial, mSlotId, RIL_REQUEST_CHANGE_SIM_PIN2, true,
Scott Randolphc7213312017-04-03 14:06:40 -0700910 3, oldPin2.c_str(), newPin2.c_str(), aid.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800911 return Void();
Sanket Padawef220dc52017-01-02 23:46:00 -0800912}
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700913
914Return<void> RadioImpl::supplyNetworkDepersonalization(int32_t serial,
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800915 const hidl_string& netPin) {
Jayachandran C572f2f42017-03-25 14:30:13 -0700916#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -0800917 RLOGD("supplyNetworkDepersonalization: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -0700918#endif
Ruthwar Kumar Ambeer7c373812017-03-23 17:38:56 +0530919 dispatchStrings(serial, mSlotId, RIL_REQUEST_ENTER_NETWORK_DEPERSONALIZATION, true,
Scott Randolphc7213312017-04-03 14:06:40 -0700920 1, netPin.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800921 return Void();
Sanket Padawef220dc52017-01-02 23:46:00 -0800922}
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700923
Sanket Padawef220dc52017-01-02 23:46:00 -0800924Return<void> RadioImpl::getCurrentCalls(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -0700925#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -0800926 RLOGD("getCurrentCalls: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -0700927#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800928 dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_CURRENT_CALLS);
929 return Void();
Sanket Padawef220dc52017-01-02 23:46:00 -0800930}
931
932Return<void> RadioImpl::dial(int32_t serial, const Dial& dialInfo) {
Jayachandran C572f2f42017-03-25 14:30:13 -0700933#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -0800934 RLOGD("dial: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -0700935#endif
Sanket Padawef220dc52017-01-02 23:46:00 -0800936 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_DIAL);
937 if (pRI == NULL) {
938 return Void();
939 }
Jack Yuf68e0da2017-02-07 14:53:09 -0800940 RIL_Dial dial = {};
941 RIL_UUS_Info uusInfo = {};
Sanket Padawef220dc52017-01-02 23:46:00 -0800942 int32_t sizeOfDial = sizeof(dial);
943
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800944 if (!copyHidlStringToRil(&dial.address, dialInfo.address, pRI)) {
Sanket Padawef220dc52017-01-02 23:46:00 -0800945 return Void();
946 }
Jack Yuf68e0da2017-02-07 14:53:09 -0800947 dial.clir = (int) dialInfo.clir;
Sanket Padawef220dc52017-01-02 23:46:00 -0800948
Sanket Padawef220dc52017-01-02 23:46:00 -0800949 if (dialInfo.uusInfo.size() != 0) {
Sanket Padawef220dc52017-01-02 23:46:00 -0800950 uusInfo.uusType = (RIL_UUS_Type) dialInfo.uusInfo[0].uusType;
951 uusInfo.uusDcs = (RIL_UUS_DCS) dialInfo.uusInfo[0].uusDcs;
952
953 if (dialInfo.uusInfo[0].uusData.size() == 0) {
954 uusInfo.uusData = NULL;
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800955 uusInfo.uusLength = 0;
Sanket Padawef220dc52017-01-02 23:46:00 -0800956 } else {
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800957 if (!copyHidlStringToRil(&uusInfo.uusData, dialInfo.uusInfo[0].uusData, pRI)) {
958 memsetAndFreeStrings(1, dial.address);
Sanket Padawef220dc52017-01-02 23:46:00 -0800959 return Void();
960 }
Jack Yuf68e0da2017-02-07 14:53:09 -0800961 uusInfo.uusLength = dialInfo.uusInfo[0].uusData.size();
Sanket Padawef220dc52017-01-02 23:46:00 -0800962 }
963
Sanket Padawef220dc52017-01-02 23:46:00 -0800964 dial.uusInfo = &uusInfo;
965 }
966
Amit Mahajanb3a11bb2017-05-15 16:41:44 -0700967 CALL_ONREQUEST(RIL_REQUEST_DIAL, &dial, sizeOfDial, pRI, mSlotId);
Sanket Padawef220dc52017-01-02 23:46:00 -0800968
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800969 memsetAndFreeStrings(2, dial.address, uusInfo.uusData);
Sanket Padawef220dc52017-01-02 23:46:00 -0800970
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800971 return Void();
Sanket Padawef220dc52017-01-02 23:46:00 -0800972}
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700973
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800974Return<void> RadioImpl::getImsiForApp(int32_t serial, const hidl_string& aid) {
Jayachandran C572f2f42017-03-25 14:30:13 -0700975#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -0800976 RLOGD("getImsiForApp: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -0700977#endif
Ruthwar Kumar Ambeer7c373812017-03-23 17:38:56 +0530978 dispatchStrings(serial, mSlotId, RIL_REQUEST_GET_IMSI, false,
Scott Randolphc7213312017-04-03 14:06:40 -0700979 1, aid.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800980 return Void();
981}
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700982
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800983Return<void> RadioImpl::hangup(int32_t serial, int32_t gsmIndex) {
Jayachandran C572f2f42017-03-25 14:30:13 -0700984#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -0800985 RLOGD("hangup: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -0700986#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800987 dispatchInts(serial, mSlotId, RIL_REQUEST_HANGUP, 1, gsmIndex);
988 return Void();
989}
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700990
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800991Return<void> RadioImpl::hangupWaitingOrBackground(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -0700992#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -0800993 RLOGD("hangupWaitingOrBackground: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -0700994#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800995 dispatchVoid(serial, mSlotId, RIL_REQUEST_HANGUP_WAITING_OR_BACKGROUND);
996 return Void();
997}
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700998
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800999Return<void> RadioImpl::hangupForegroundResumeBackground(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001000#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001001 RLOGD("hangupForegroundResumeBackground: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001002#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001003 dispatchVoid(serial, mSlotId, RIL_REQUEST_HANGUP_FOREGROUND_RESUME_BACKGROUND);
1004 return Void();
1005}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001006
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001007Return<void> RadioImpl::switchWaitingOrHoldingAndActive(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001008#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001009 RLOGD("switchWaitingOrHoldingAndActive: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001010#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001011 dispatchVoid(serial, mSlotId, RIL_REQUEST_SWITCH_WAITING_OR_HOLDING_AND_ACTIVE);
1012 return Void();
1013}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001014
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001015Return<void> RadioImpl::conference(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001016#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001017 RLOGD("conference: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001018#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001019 dispatchVoid(serial, mSlotId, RIL_REQUEST_CONFERENCE);
1020 return Void();
1021}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001022
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001023Return<void> RadioImpl::rejectCall(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001024#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001025 RLOGD("rejectCall: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001026#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001027 dispatchVoid(serial, mSlotId, RIL_REQUEST_UDUB);
1028 return Void();
1029}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001030
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001031Return<void> RadioImpl::getLastCallFailCause(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001032#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001033 RLOGD("getLastCallFailCause: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001034#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001035 dispatchVoid(serial, mSlotId, RIL_REQUEST_LAST_CALL_FAIL_CAUSE);
1036 return Void();
1037}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001038
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001039Return<void> RadioImpl::getSignalStrength(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001040#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001041 RLOGD("getSignalStrength: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001042#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001043 dispatchVoid(serial, mSlotId, RIL_REQUEST_SIGNAL_STRENGTH);
1044 return Void();
1045}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001046
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001047Return<void> RadioImpl::getVoiceRegistrationState(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001048#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001049 RLOGD("getVoiceRegistrationState: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001050#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001051 dispatchVoid(serial, mSlotId, RIL_REQUEST_VOICE_REGISTRATION_STATE);
1052 return Void();
1053}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001054
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001055Return<void> RadioImpl::getDataRegistrationState(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001056#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001057 RLOGD("getDataRegistrationState: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001058#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001059 dispatchVoid(serial, mSlotId, RIL_REQUEST_DATA_REGISTRATION_STATE);
1060 return Void();
1061}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001062
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001063Return<void> RadioImpl::getOperator(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001064#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001065 RLOGD("getOperator: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001066#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001067 dispatchVoid(serial, mSlotId, RIL_REQUEST_OPERATOR);
1068 return Void();
1069}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001070
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001071Return<void> RadioImpl::setRadioPower(int32_t serial, bool on) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08001072 RLOGD("setRadioPower: serial %d on %d", serial, on);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001073 dispatchInts(serial, mSlotId, RIL_REQUEST_RADIO_POWER, 1, BOOL_TO_INT(on));
1074 return Void();
1075}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001076
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001077Return<void> RadioImpl::sendDtmf(int32_t serial, const hidl_string& s) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001078#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001079 RLOGD("sendDtmf: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001080#endif
Scott Randolphc7213312017-04-03 14:06:40 -07001081 dispatchString(serial, mSlotId, RIL_REQUEST_DTMF, s.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001082 return Void();
1083}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001084
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001085Return<void> RadioImpl::sendSms(int32_t serial, const GsmSmsMessage& message) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001086#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001087 RLOGD("sendSms: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001088#endif
Ruthwar Kumar Ambeer7c373812017-03-23 17:38:56 +05301089 dispatchStrings(serial, mSlotId, RIL_REQUEST_SEND_SMS, false,
Scott Randolphc7213312017-04-03 14:06:40 -07001090 2, message.smscPdu.c_str(), message.pdu.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001091 return Void();
1092}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001093
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001094Return<void> RadioImpl::sendSMSExpectMore(int32_t serial, const GsmSmsMessage& message) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001095#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001096 RLOGD("sendSMSExpectMore: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001097#endif
Ruthwar Kumar Ambeer7c373812017-03-23 17:38:56 +05301098 dispatchStrings(serial, mSlotId, RIL_REQUEST_SEND_SMS_EXPECT_MORE, false,
Scott Randolphc7213312017-04-03 14:06:40 -07001099 2, message.smscPdu.c_str(), message.pdu.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001100 return Void();
1101}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001102
Jack Yuc13645e2017-04-13 20:55:03 -07001103static bool convertMvnoTypeToString(MvnoType type, char *&str) {
Jack Yuffc06452017-02-13 11:21:00 -08001104 switch (type) {
Jack Yuc13645e2017-04-13 20:55:03 -07001105 case MvnoType::IMSI:
1106 str = (char *)"imsi";
1107 return true;
1108 case MvnoType::GID:
1109 str = (char *)"gid";
1110 return true;
1111 case MvnoType::SPN:
1112 str = (char *)"spn";
1113 return true;
1114 case MvnoType::NONE:
1115 str = (char *)"";
1116 return true;
Jack Yuffc06452017-02-13 11:21:00 -08001117 }
Jack Yuc13645e2017-04-13 20:55:03 -07001118 return false;
Jack Yuffc06452017-02-13 11:21:00 -08001119}
1120
1121Return<void> RadioImpl::setupDataCall(int32_t serial, RadioTechnology radioTechnology,
1122 const DataProfileInfo& dataProfileInfo, bool modemCognitive,
1123 bool roamingAllowed, bool isRoaming) {
1124
Jayachandran C572f2f42017-03-25 14:30:13 -07001125#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001126 RLOGD("setupDataCall: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001127#endif
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001128
Jack Yuffc06452017-02-13 11:21:00 -08001129 if (s_vendorFunctions->version >= 4 && s_vendorFunctions->version <= 14) {
1130 const hidl_string &protocol =
1131 (isRoaming ? dataProfileInfo.roamingProtocol : dataProfileInfo.protocol);
Ruthwar Kumar Ambeer7c373812017-03-23 17:38:56 +05301132 dispatchStrings(serial, mSlotId, RIL_REQUEST_SETUP_DATA_CALL, true, 7,
Jack Yuffc06452017-02-13 11:21:00 -08001133 std::to_string((int) radioTechnology + 2).c_str(),
1134 std::to_string((int) dataProfileInfo.profileId).c_str(),
1135 dataProfileInfo.apn.c_str(),
1136 dataProfileInfo.user.c_str(),
1137 dataProfileInfo.password.c_str(),
1138 std::to_string((int) dataProfileInfo.authType).c_str(),
1139 protocol.c_str());
1140 } else if (s_vendorFunctions->version >= 15) {
Jack Yuc13645e2017-04-13 20:55:03 -07001141 char *mvnoTypeStr = NULL;
1142 if (!convertMvnoTypeToString(dataProfileInfo.mvnoType, mvnoTypeStr)) {
Jack Yuffc06452017-02-13 11:21:00 -08001143 RequestInfo *pRI = android::addRequestToList(serial, mSlotId,
1144 RIL_REQUEST_SETUP_DATA_CALL);
1145 if (pRI != NULL) {
1146 sendErrorResponse(pRI, RIL_E_INVALID_ARGUMENTS);
1147 }
1148 return Void();
1149 }
Ruthwar Kumar Ambeer7c373812017-03-23 17:38:56 +05301150 dispatchStrings(serial, mSlotId, RIL_REQUEST_SETUP_DATA_CALL, true, 15,
Jack Yuffc06452017-02-13 11:21:00 -08001151 std::to_string((int) radioTechnology + 2).c_str(),
1152 std::to_string((int) dataProfileInfo.profileId).c_str(),
1153 dataProfileInfo.apn.c_str(),
1154 dataProfileInfo.user.c_str(),
1155 dataProfileInfo.password.c_str(),
1156 std::to_string((int) dataProfileInfo.authType).c_str(),
1157 dataProfileInfo.protocol.c_str(),
1158 dataProfileInfo.roamingProtocol.c_str(),
1159 std::to_string(dataProfileInfo.supportedApnTypesBitmap).c_str(),
1160 std::to_string(dataProfileInfo.bearerBitmap).c_str(),
Jack Yuc13645e2017-04-13 20:55:03 -07001161 modemCognitive ? "1" : "0",
Jack Yuffc06452017-02-13 11:21:00 -08001162 std::to_string(dataProfileInfo.mtu).c_str(),
1163 mvnoTypeStr,
1164 dataProfileInfo.mvnoMatchData.c_str(),
Jack Yuc13645e2017-04-13 20:55:03 -07001165 roamingAllowed ? "1" : "0");
Jack Yuffc06452017-02-13 11:21:00 -08001166 } else {
1167 RLOGE("Unsupported RIL version %d, min version expected 4", s_vendorFunctions->version);
1168 RequestInfo *pRI = android::addRequestToList(serial, mSlotId,
1169 RIL_REQUEST_SETUP_DATA_CALL);
1170 if (pRI != NULL) {
1171 sendErrorResponse(pRI, RIL_E_REQUEST_NOT_SUPPORTED);
1172 }
1173 }
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001174 return Void();
1175}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001176
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001177Return<void> RadioImpl::iccIOForApp(int32_t serial, const IccIo& iccIo) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001178#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001179 RLOGD("iccIOForApp: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001180#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001181 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_SIM_IO);
1182 if (pRI == NULL) {
1183 return Void();
1184 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001185
Jack Yu8e732d42017-04-14 00:08:06 -07001186 RIL_SIM_IO_v6 rilIccIo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001187 rilIccIo.command = iccIo.command;
1188 rilIccIo.fileid = iccIo.fileId;
1189 if (!copyHidlStringToRil(&rilIccIo.path, iccIo.path, pRI)) {
1190 return Void();
1191 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001192
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001193 rilIccIo.p1 = iccIo.p1;
1194 rilIccIo.p2 = iccIo.p2;
1195 rilIccIo.p3 = iccIo.p3;
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001196
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001197 if (!copyHidlStringToRil(&rilIccIo.data, iccIo.data, pRI)) {
1198 memsetAndFreeStrings(1, rilIccIo.path);
1199 return Void();
1200 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001201
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001202 if (!copyHidlStringToRil(&rilIccIo.pin2, iccIo.pin2, pRI)) {
1203 memsetAndFreeStrings(2, rilIccIo.path, rilIccIo.data);
1204 return Void();
1205 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001206
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001207 if (!copyHidlStringToRil(&rilIccIo.aidPtr, iccIo.aid, pRI)) {
1208 memsetAndFreeStrings(3, rilIccIo.path, rilIccIo.data, rilIccIo.pin2);
1209 return Void();
1210 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001211
Amit Mahajanb3a11bb2017-05-15 16:41:44 -07001212 CALL_ONREQUEST(RIL_REQUEST_SIM_IO, &rilIccIo, sizeof(rilIccIo), pRI, mSlotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001213
1214 memsetAndFreeStrings(4, rilIccIo.path, rilIccIo.data, rilIccIo.pin2, rilIccIo.aidPtr);
1215
1216 return Void();
1217}
1218
1219Return<void> RadioImpl::sendUssd(int32_t serial, const hidl_string& ussd) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001220#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001221 RLOGD("sendUssd: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001222#endif
Scott Randolphc7213312017-04-03 14:06:40 -07001223 dispatchString(serial, mSlotId, RIL_REQUEST_SEND_USSD, ussd.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001224 return Void();
1225}
1226
1227Return<void> RadioImpl::cancelPendingUssd(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001228#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001229 RLOGD("cancelPendingUssd: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001230#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001231 dispatchVoid(serial, mSlotId, RIL_REQUEST_CANCEL_USSD);
1232 return Void();
1233}
1234
1235Return<void> RadioImpl::getClir(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001236#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001237 RLOGD("getClir: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001238#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001239 dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_CLIR);
1240 return Void();
1241}
1242
1243Return<void> RadioImpl::setClir(int32_t serial, int32_t status) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001244#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001245 RLOGD("setClir: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001246#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001247 dispatchInts(serial, mSlotId, RIL_REQUEST_SET_CLIR, 1, status);
1248 return Void();
1249}
1250
1251Return<void> RadioImpl::getCallForwardStatus(int32_t serial, const CallForwardInfo& callInfo) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001252#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001253 RLOGD("getCallForwardStatus: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001254#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001255 dispatchCallForwardStatus(serial, mSlotId, RIL_REQUEST_QUERY_CALL_FORWARD_STATUS,
1256 callInfo);
1257 return Void();
1258}
1259
1260Return<void> RadioImpl::setCallForward(int32_t serial, const CallForwardInfo& callInfo) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001261#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001262 RLOGD("setCallForward: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001263#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001264 dispatchCallForwardStatus(serial, mSlotId, RIL_REQUEST_SET_CALL_FORWARD,
1265 callInfo);
1266 return Void();
1267}
1268
1269Return<void> RadioImpl::getCallWaiting(int32_t serial, int32_t serviceClass) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001270#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001271 RLOGD("getCallWaiting: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001272#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001273 dispatchInts(serial, mSlotId, RIL_REQUEST_QUERY_CALL_WAITING, 1, serviceClass);
1274 return Void();
1275}
1276
1277Return<void> RadioImpl::setCallWaiting(int32_t serial, bool enable, int32_t serviceClass) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001278#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001279 RLOGD("setCallWaiting: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001280#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001281 dispatchInts(serial, mSlotId, RIL_REQUEST_SET_CALL_WAITING, 2, BOOL_TO_INT(enable),
1282 serviceClass);
1283 return Void();
1284}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001285
1286Return<void> RadioImpl::acknowledgeLastIncomingGsmSms(int32_t serial,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001287 bool success, SmsAcknowledgeFailCause cause) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001288#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001289 RLOGD("acknowledgeLastIncomingGsmSms: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001290#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001291 dispatchInts(serial, mSlotId, RIL_REQUEST_SMS_ACKNOWLEDGE, 2, BOOL_TO_INT(success),
1292 cause);
1293 return Void();
1294}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001295
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001296Return<void> RadioImpl::acceptCall(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001297#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001298 RLOGD("acceptCall: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001299#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001300 dispatchVoid(serial, mSlotId, RIL_REQUEST_ANSWER);
1301 return Void();
1302}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001303
1304Return<void> RadioImpl::deactivateDataCall(int32_t serial,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001305 int32_t cid, bool reasonRadioShutDown) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001306#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001307 RLOGD("deactivateDataCall: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001308#endif
Ruthwar Kumar Ambeer7c373812017-03-23 17:38:56 +05301309 dispatchStrings(serial, mSlotId, RIL_REQUEST_DEACTIVATE_DATA_CALL, false,
Scott Randolphc7213312017-04-03 14:06:40 -07001310 2, (std::to_string(cid)).c_str(), reasonRadioShutDown ? "1" : "0");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001311 return Void();
1312}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001313
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001314Return<void> RadioImpl::getFacilityLockForApp(int32_t serial, const hidl_string& facility,
1315 const hidl_string& password, int32_t serviceClass,
1316 const hidl_string& appId) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001317#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001318 RLOGD("getFacilityLockForApp: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001319#endif
Ruthwar Kumar Ambeer7c373812017-03-23 17:38:56 +05301320 dispatchStrings(serial, mSlotId, RIL_REQUEST_QUERY_FACILITY_LOCK, true,
Scott Randolphc7213312017-04-03 14:06:40 -07001321 4, facility.c_str(), password.c_str(),
1322 (std::to_string(serviceClass)).c_str(), appId.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001323 return Void();
1324}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001325
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001326Return<void> RadioImpl::setFacilityLockForApp(int32_t serial, const hidl_string& facility,
1327 bool lockState, const hidl_string& password,
1328 int32_t serviceClass, const hidl_string& appId) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001329#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001330 RLOGD("setFacilityLockForApp: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001331#endif
Ruthwar Kumar Ambeer7c373812017-03-23 17:38:56 +05301332 dispatchStrings(serial, mSlotId, RIL_REQUEST_SET_FACILITY_LOCK, true,
Scott Randolphc7213312017-04-03 14:06:40 -07001333 5, facility.c_str(), lockState ? "1" : "0", password.c_str(),
1334 (std::to_string(serviceClass)).c_str(), appId.c_str() );
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001335 return Void();
1336}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001337
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001338Return<void> RadioImpl::setBarringPassword(int32_t serial, const hidl_string& facility,
1339 const hidl_string& oldPassword,
1340 const hidl_string& newPassword) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001341#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001342 RLOGD("setBarringPassword: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001343#endif
Ruthwar Kumar Ambeer7c373812017-03-23 17:38:56 +05301344 dispatchStrings(serial, mSlotId, RIL_REQUEST_CHANGE_BARRING_PASSWORD, true,
Sanket Padawe75e42a52017-05-24 10:03:55 -07001345 3, facility.c_str(), oldPassword.c_str(), newPassword.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001346 return Void();
1347}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001348
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001349Return<void> RadioImpl::getNetworkSelectionMode(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001350#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001351 RLOGD("getNetworkSelectionMode: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001352#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001353 dispatchVoid(serial, mSlotId, RIL_REQUEST_QUERY_NETWORK_SELECTION_MODE);
1354 return Void();
1355}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001356
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001357Return<void> RadioImpl::setNetworkSelectionModeAutomatic(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001358#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001359 RLOGD("setNetworkSelectionModeAutomatic: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001360#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001361 dispatchVoid(serial, mSlotId, RIL_REQUEST_SET_NETWORK_SELECTION_AUTOMATIC);
1362 return Void();
1363}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001364
1365Return<void> RadioImpl::setNetworkSelectionModeManual(int32_t serial,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001366 const hidl_string& operatorNumeric) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001367#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001368 RLOGD("setNetworkSelectionModeManual: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001369#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001370 dispatchString(serial, mSlotId, RIL_REQUEST_SET_NETWORK_SELECTION_MANUAL,
Scott Randolphc7213312017-04-03 14:06:40 -07001371 operatorNumeric.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001372 return Void();
1373}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001374
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001375Return<void> RadioImpl::getAvailableNetworks(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001376#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001377 RLOGD("getAvailableNetworks: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001378#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001379 dispatchVoid(serial, mSlotId, RIL_REQUEST_QUERY_AVAILABLE_NETWORKS);
1380 return Void();
1381}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001382
Nathan Harold6a8809d2017-07-07 19:28:58 -07001383Return<void> RadioImpl::startNetworkScan(int32_t serial, const V1_1::NetworkScanRequest& request) {
yinxu3abe7c72017-05-03 15:15:19 -07001384#if VDBG
1385 RLOGD("startNetworkScan: serial %d", serial);
1386#endif
yinxu8688abd2017-05-22 11:26:45 -07001387
1388 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_START_NETWORK_SCAN);
1389 if (pRI == NULL) {
1390 return Void();
1391 }
1392
pitchaiah57b203f2020-10-13 09:25:02 +02001393#ifdef NETWORK_SCAN_NOT_SUPPORTED /* Qualcomm ril doesn't support RIL_REQUEST_START_NETWORK_SCAN */
1394 RLOGD("RIL_REQUEST_START_NETWORK_SCAN not supported");
1395 sendErrorResponse(pRI, RIL_E_REQUEST_NOT_SUPPORTED);
1396 return Void();
1397#else
1398
yinxu8688abd2017-05-22 11:26:45 -07001399 if (request.specifiers.size() > MAX_RADIO_ACCESS_NETWORKS) {
1400 sendErrorResponse(pRI, RIL_E_INVALID_ARGUMENTS);
1401 return Void();
1402 }
1403
1404 RIL_NetworkScanRequest scan_request = {};
1405
1406 scan_request.type = (RIL_ScanType) request.type;
1407 scan_request.interval = request.interval;
1408 scan_request.specifiers_length = request.specifiers.size();
1409 for (size_t i = 0; i < request.specifiers.size(); ++i) {
1410 if (request.specifiers[i].geranBands.size() > MAX_BANDS ||
1411 request.specifiers[i].utranBands.size() > MAX_BANDS ||
1412 request.specifiers[i].eutranBands.size() > MAX_BANDS ||
1413 request.specifiers[i].channels.size() > MAX_CHANNELS) {
1414 sendErrorResponse(pRI, RIL_E_INVALID_ARGUMENTS);
1415 return Void();
1416 }
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07001417 const V1_1::RadioAccessSpecifier& ras_from =
yinxu8688abd2017-05-22 11:26:45 -07001418 request.specifiers[i];
1419 RIL_RadioAccessSpecifier& ras_to = scan_request.specifiers[i];
1420
1421 ras_to.radio_access_network = (RIL_RadioAccessNetworks) ras_from.radioAccessNetwork;
1422 ras_to.channels_length = ras_from.channels.size();
1423
1424 std::copy(ras_from.channels.begin(), ras_from.channels.end(), ras_to.channels);
1425 const std::vector<uint32_t> * bands = nullptr;
1426 switch (request.specifiers[i].radioAccessNetwork) {
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07001427 case V1_1::RadioAccessNetworks::GERAN:
yinxu8688abd2017-05-22 11:26:45 -07001428 ras_to.bands_length = ras_from.geranBands.size();
1429 bands = (std::vector<uint32_t> *) &ras_from.geranBands;
1430 break;
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07001431 case V1_1::RadioAccessNetworks::UTRAN:
yinxu8688abd2017-05-22 11:26:45 -07001432 ras_to.bands_length = ras_from.utranBands.size();
1433 bands = (std::vector<uint32_t> *) &ras_from.utranBands;
1434 break;
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07001435 case V1_1::RadioAccessNetworks::EUTRAN:
yinxu8688abd2017-05-22 11:26:45 -07001436 ras_to.bands_length = ras_from.eutranBands.size();
1437 bands = (std::vector<uint32_t> *) &ras_from.eutranBands;
1438 break;
1439 default:
1440 sendErrorResponse(pRI, RIL_E_INVALID_ARGUMENTS);
1441 return Void();
1442 }
1443 // safe to copy to geran_bands because it's a union member
yinxu9c7ad932017-06-22 17:10:59 -07001444 for (size_t idx = 0; idx < ras_to.bands_length; ++idx) {
1445 ras_to.bands.geran_bands[idx] = (RIL_GeranBands) (*bands)[idx];
1446 }
yinxu8688abd2017-05-22 11:26:45 -07001447 }
1448
Mathieu Chartierf65b2c92017-06-05 13:59:25 -07001449 CALL_ONREQUEST(RIL_REQUEST_START_NETWORK_SCAN, &scan_request, sizeof(scan_request), pRI,
1450 mSlotId);
yinxu8688abd2017-05-22 11:26:45 -07001451
yinxu3abe7c72017-05-03 15:15:19 -07001452 return Void();
pitchaiah57b203f2020-10-13 09:25:02 +02001453#endif
yinxu3abe7c72017-05-03 15:15:19 -07001454}
1455
1456Return<void> RadioImpl::stopNetworkScan(int32_t serial) {
1457#if VDBG
1458 RLOGD("stopNetworkScan: serial %d", serial);
1459#endif
yinxu3abe7c72017-05-03 15:15:19 -07001460 dispatchVoid(serial, mSlotId, RIL_REQUEST_STOP_NETWORK_SCAN);
1461 return Void();
1462}
1463
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001464Return<void> RadioImpl::startDtmf(int32_t serial, const hidl_string& s) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001465#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001466 RLOGD("startDtmf: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001467#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001468 dispatchString(serial, mSlotId, RIL_REQUEST_DTMF_START,
Scott Randolphc7213312017-04-03 14:06:40 -07001469 s.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001470 return Void();
1471}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001472
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001473Return<void> RadioImpl::stopDtmf(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001474#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001475 RLOGD("stopDtmf: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001476#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001477 dispatchVoid(serial, mSlotId, RIL_REQUEST_DTMF_STOP);
1478 return Void();
1479}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001480
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001481Return<void> RadioImpl::getBasebandVersion(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001482#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001483 RLOGD("getBasebandVersion: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001484#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001485 dispatchVoid(serial, mSlotId, RIL_REQUEST_BASEBAND_VERSION);
1486 return Void();
1487}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001488
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001489Return<void> RadioImpl::separateConnection(int32_t serial, int32_t gsmIndex) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001490#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001491 RLOGD("separateConnection: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001492#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001493 dispatchInts(serial, mSlotId, RIL_REQUEST_SEPARATE_CONNECTION, 1, gsmIndex);
1494 return Void();
1495}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001496
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001497Return<void> RadioImpl::setMute(int32_t serial, bool enable) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001498#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001499 RLOGD("setMute: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001500#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001501 dispatchInts(serial, mSlotId, RIL_REQUEST_SET_MUTE, 1, BOOL_TO_INT(enable));
1502 return Void();
1503}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001504
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001505Return<void> RadioImpl::getMute(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001506#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001507 RLOGD("getMute: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001508#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001509 dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_MUTE);
1510 return Void();
1511}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001512
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001513Return<void> RadioImpl::getClip(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001514#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001515 RLOGD("getClip: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001516#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001517 dispatchVoid(serial, mSlotId, RIL_REQUEST_QUERY_CLIP);
1518 return Void();
1519}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001520
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001521Return<void> RadioImpl::getDataCallList(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001522#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001523 RLOGD("getDataCallList: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001524#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001525 dispatchVoid(serial, mSlotId, RIL_REQUEST_DATA_CALL_LIST);
1526 return Void();
1527}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001528
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001529Return<void> RadioImpl::setSuppServiceNotifications(int32_t serial, bool enable) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001530#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001531 RLOGD("setSuppServiceNotifications: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001532#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001533 dispatchInts(serial, mSlotId, RIL_REQUEST_SET_SUPP_SVC_NOTIFICATION, 1,
1534 BOOL_TO_INT(enable));
1535 return Void();
1536}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001537
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001538Return<void> RadioImpl::writeSmsToSim(int32_t serial, const SmsWriteArgs& smsWriteArgs) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001539#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001540 RLOGD("writeSmsToSim: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001541#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001542 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_WRITE_SMS_TO_SIM);
1543 if (pRI == NULL) {
1544 return Void();
1545 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001546
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001547 RIL_SMS_WriteArgs args;
1548 args.status = (int) smsWriteArgs.status;
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001549
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001550 if (!copyHidlStringToRil(&args.pdu, smsWriteArgs.pdu, pRI)) {
1551 return Void();
1552 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001553
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001554 if (!copyHidlStringToRil(&args.smsc, smsWriteArgs.smsc, pRI)) {
1555 memsetAndFreeStrings(1, args.pdu);
1556 return Void();
1557 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001558
Amit Mahajanb3a11bb2017-05-15 16:41:44 -07001559 CALL_ONREQUEST(RIL_REQUEST_WRITE_SMS_TO_SIM, &args, sizeof(args), pRI, mSlotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001560
1561 memsetAndFreeStrings(2, args.smsc, args.pdu);
1562
1563 return Void();
1564}
1565
1566Return<void> RadioImpl::deleteSmsOnSim(int32_t serial, int32_t index) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001567#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001568 RLOGD("deleteSmsOnSim: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001569#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001570 dispatchInts(serial, mSlotId, RIL_REQUEST_DELETE_SMS_ON_SIM, 1, index);
1571 return Void();
1572}
1573
1574Return<void> RadioImpl::setBandMode(int32_t serial, RadioBandMode mode) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001575#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001576 RLOGD("setBandMode: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001577#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001578 dispatchInts(serial, mSlotId, RIL_REQUEST_SET_BAND_MODE, 1, mode);
1579 return Void();
1580}
1581
1582Return<void> RadioImpl::getAvailableBandModes(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001583#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001584 RLOGD("getAvailableBandModes: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001585#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001586 dispatchVoid(serial, mSlotId, RIL_REQUEST_QUERY_AVAILABLE_BAND_MODE);
1587 return Void();
1588}
1589
1590Return<void> RadioImpl::sendEnvelope(int32_t serial, const hidl_string& command) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001591#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001592 RLOGD("sendEnvelope: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001593#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001594 dispatchString(serial, mSlotId, RIL_REQUEST_STK_SEND_ENVELOPE_COMMAND,
Scott Randolphc7213312017-04-03 14:06:40 -07001595 command.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001596 return Void();
1597}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001598
1599Return<void> RadioImpl::sendTerminalResponseToSim(int32_t serial,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001600 const hidl_string& commandResponse) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001601#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001602 RLOGD("sendTerminalResponseToSim: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001603#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001604 dispatchString(serial, mSlotId, RIL_REQUEST_STK_SEND_TERMINAL_RESPONSE,
Scott Randolphc7213312017-04-03 14:06:40 -07001605 commandResponse.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001606 return Void();
1607}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001608
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001609Return<void> RadioImpl::handleStkCallSetupRequestFromSim(int32_t serial, bool accept) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001610#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001611 RLOGD("handleStkCallSetupRequestFromSim: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001612#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001613 dispatchInts(serial, mSlotId, RIL_REQUEST_STK_HANDLE_CALL_SETUP_REQUESTED_FROM_SIM,
1614 1, BOOL_TO_INT(accept));
1615 return Void();
1616}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001617
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001618Return<void> RadioImpl::explicitCallTransfer(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001619#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001620 RLOGD("explicitCallTransfer: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001621#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001622 dispatchVoid(serial, mSlotId, RIL_REQUEST_EXPLICIT_CALL_TRANSFER);
1623 return Void();
1624}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001625
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001626Return<void> RadioImpl::setPreferredNetworkType(int32_t serial, PreferredNetworkType nwType) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001627#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001628 RLOGD("setPreferredNetworkType: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001629#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001630 dispatchInts(serial, mSlotId, RIL_REQUEST_SET_PREFERRED_NETWORK_TYPE, 1, nwType);
1631 return Void();
1632}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001633
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001634Return<void> RadioImpl::getPreferredNetworkType(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001635#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001636 RLOGD("getPreferredNetworkType: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001637#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001638 dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_PREFERRED_NETWORK_TYPE);
1639 return Void();
1640}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001641
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001642Return<void> RadioImpl::getNeighboringCids(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001643#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001644 RLOGD("getNeighboringCids: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001645#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001646 dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_NEIGHBORING_CELL_IDS);
1647 return Void();
1648}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001649
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001650Return<void> RadioImpl::setLocationUpdates(int32_t serial, bool enable) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001651#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001652 RLOGD("setLocationUpdates: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001653#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001654 dispatchInts(serial, mSlotId, RIL_REQUEST_SET_LOCATION_UPDATES, 1, BOOL_TO_INT(enable));
1655 return Void();
1656}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001657
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001658Return<void> RadioImpl::setCdmaSubscriptionSource(int32_t serial, CdmaSubscriptionSource cdmaSub) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001659#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001660 RLOGD("setCdmaSubscriptionSource: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001661#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001662 dispatchInts(serial, mSlotId, RIL_REQUEST_CDMA_SET_SUBSCRIPTION_SOURCE, 1, cdmaSub);
1663 return Void();
1664}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001665
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001666Return<void> RadioImpl::setCdmaRoamingPreference(int32_t serial, CdmaRoamingType type) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001667#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001668 RLOGD("setCdmaRoamingPreference: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001669#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001670 dispatchInts(serial, mSlotId, RIL_REQUEST_CDMA_SET_ROAMING_PREFERENCE, 1, type);
1671 return Void();
1672}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001673
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001674Return<void> RadioImpl::getCdmaRoamingPreference(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001675#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001676 RLOGD("getCdmaRoamingPreference: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001677#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001678 dispatchVoid(serial, mSlotId, RIL_REQUEST_CDMA_QUERY_ROAMING_PREFERENCE);
1679 return Void();
1680}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001681
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001682Return<void> RadioImpl::setTTYMode(int32_t serial, TtyMode mode) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001683#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001684 RLOGD("setTTYMode: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001685#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001686 dispatchInts(serial, mSlotId, RIL_REQUEST_SET_TTY_MODE, 1, mode);
1687 return Void();
1688}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001689
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001690Return<void> RadioImpl::getTTYMode(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001691#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001692 RLOGD("getTTYMode: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001693#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001694 dispatchVoid(serial, mSlotId, RIL_REQUEST_QUERY_TTY_MODE);
1695 return Void();
1696}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001697
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001698Return<void> RadioImpl::setPreferredVoicePrivacy(int32_t serial, bool enable) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001699#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001700 RLOGD("setPreferredVoicePrivacy: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001701#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001702 dispatchInts(serial, mSlotId, RIL_REQUEST_CDMA_SET_PREFERRED_VOICE_PRIVACY_MODE,
1703 1, BOOL_TO_INT(enable));
1704 return Void();
1705}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001706
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001707Return<void> RadioImpl::getPreferredVoicePrivacy(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001708#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001709 RLOGD("getPreferredVoicePrivacy: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001710#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001711 dispatchVoid(serial, mSlotId, RIL_REQUEST_CDMA_QUERY_PREFERRED_VOICE_PRIVACY_MODE);
1712 return Void();
1713}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001714
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001715Return<void> RadioImpl::sendCDMAFeatureCode(int32_t serial, const hidl_string& featureCode) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001716#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001717 RLOGD("sendCDMAFeatureCode: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001718#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001719 dispatchString(serial, mSlotId, RIL_REQUEST_CDMA_FLASH,
Scott Randolphc7213312017-04-03 14:06:40 -07001720 featureCode.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001721 return Void();
1722}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001723
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001724Return<void> RadioImpl::sendBurstDtmf(int32_t serial, const hidl_string& dtmf, int32_t on,
1725 int32_t off) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001726#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001727 RLOGD("sendBurstDtmf: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001728#endif
Ruthwar Kumar Ambeer7c373812017-03-23 17:38:56 +05301729 dispatchStrings(serial, mSlotId, RIL_REQUEST_CDMA_BURST_DTMF, false,
Scott Randolphc7213312017-04-03 14:06:40 -07001730 3, dtmf.c_str(), (std::to_string(on)).c_str(),
1731 (std::to_string(off)).c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001732 return Void();
1733}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001734
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001735void constructCdmaSms(RIL_CDMA_SMS_Message &rcsm, const CdmaSmsMessage& sms) {
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001736 rcsm.uTeleserviceID = sms.teleserviceId;
1737 rcsm.bIsServicePresent = BOOL_TO_INT(sms.isServicePresent);
1738 rcsm.uServicecategory = sms.serviceCategory;
1739 rcsm.sAddress.digit_mode = (RIL_CDMA_SMS_DigitMode) sms.address.digitMode;
1740 rcsm.sAddress.number_mode = (RIL_CDMA_SMS_NumberMode) sms.address.numberMode;
1741 rcsm.sAddress.number_type = (RIL_CDMA_SMS_NumberType) sms.address.numberType;
1742 rcsm.sAddress.number_plan = (RIL_CDMA_SMS_NumberPlan) sms.address.numberPlan;
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001743
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001744 rcsm.sAddress.number_of_digits = sms.address.digits.size();
1745 int digitLimit= MIN((rcsm.sAddress.number_of_digits), RIL_CDMA_SMS_ADDRESS_MAX);
1746 for (int i = 0; i < digitLimit; i++) {
1747 rcsm.sAddress.digits[i] = sms.address.digits[i];
1748 }
1749
1750 rcsm.sSubAddress.subaddressType = (RIL_CDMA_SMS_SubaddressType) sms.subAddress.subaddressType;
1751 rcsm.sSubAddress.odd = BOOL_TO_INT(sms.subAddress.odd);
1752
1753 rcsm.sSubAddress.number_of_digits = sms.subAddress.digits.size();
1754 digitLimit= MIN((rcsm.sSubAddress.number_of_digits), RIL_CDMA_SMS_SUBADDRESS_MAX);
1755 for (int i = 0; i < digitLimit; i++) {
1756 rcsm.sSubAddress.digits[i] = sms.subAddress.digits[i];
1757 }
1758
1759 rcsm.uBearerDataLen = sms.bearerData.size();
1760 digitLimit= MIN((rcsm.uBearerDataLen), RIL_CDMA_SMS_BEARER_DATA_MAX);
1761 for (int i = 0; i < digitLimit; i++) {
1762 rcsm.aBearerData[i] = sms.bearerData[i];
1763 }
1764}
1765
1766Return<void> RadioImpl::sendCdmaSms(int32_t serial, const CdmaSmsMessage& sms) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001767#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001768 RLOGD("sendCdmaSms: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001769#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001770 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_CDMA_SEND_SMS);
1771 if (pRI == NULL) {
1772 return Void();
1773 }
1774
Jack Yu8e732d42017-04-14 00:08:06 -07001775 RIL_CDMA_SMS_Message rcsm = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001776 constructCdmaSms(rcsm, sms);
1777
Amit Mahajanb3a11bb2017-05-15 16:41:44 -07001778 CALL_ONREQUEST(pRI->pCI->requestNumber, &rcsm, sizeof(rcsm), pRI, mSlotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001779 return Void();
1780}
1781
1782Return<void> RadioImpl::acknowledgeLastIncomingCdmaSms(int32_t serial, const CdmaSmsAck& smsAck) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001783#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001784 RLOGD("acknowledgeLastIncomingCdmaSms: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001785#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001786 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_CDMA_SMS_ACKNOWLEDGE);
1787 if (pRI == NULL) {
1788 return Void();
1789 }
1790
Jack Yuf68e0da2017-02-07 14:53:09 -08001791 RIL_CDMA_SMS_Ack rcsa = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001792
1793 rcsa.uErrorClass = (RIL_CDMA_SMS_ErrorClass) smsAck.errorClass;
1794 rcsa.uSMSCauseCode = smsAck.smsCauseCode;
1795
Amit Mahajanb3a11bb2017-05-15 16:41:44 -07001796 CALL_ONREQUEST(pRI->pCI->requestNumber, &rcsa, sizeof(rcsa), pRI, mSlotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001797 return Void();
1798}
1799
1800Return<void> RadioImpl::getGsmBroadcastConfig(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001801#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001802 RLOGD("getGsmBroadcastConfig: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001803#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001804 dispatchVoid(serial, mSlotId, RIL_REQUEST_GSM_GET_BROADCAST_SMS_CONFIG);
1805 return Void();
1806}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001807
1808Return<void> RadioImpl::setGsmBroadcastConfig(int32_t serial,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001809 const hidl_vec<GsmBroadcastSmsConfigInfo>&
1810 configInfo) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001811#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001812 RLOGD("setGsmBroadcastConfig: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001813#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001814 RequestInfo *pRI = android::addRequestToList(serial, mSlotId,
1815 RIL_REQUEST_GSM_SET_BROADCAST_SMS_CONFIG);
1816 if (pRI == NULL) {
1817 return Void();
1818 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001819
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001820 int num = configInfo.size();
1821 RIL_GSM_BroadcastSmsConfigInfo gsmBci[num];
1822 RIL_GSM_BroadcastSmsConfigInfo *gsmBciPtrs[num];
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001823
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001824 for (int i = 0 ; i < num ; i++ ) {
1825 gsmBciPtrs[i] = &gsmBci[i];
1826 gsmBci[i].fromServiceId = configInfo[i].fromServiceId;
1827 gsmBci[i].toServiceId = configInfo[i].toServiceId;
1828 gsmBci[i].fromCodeScheme = configInfo[i].fromCodeScheme;
1829 gsmBci[i].toCodeScheme = configInfo[i].toCodeScheme;
1830 gsmBci[i].selected = BOOL_TO_INT(configInfo[i].selected);
1831 }
1832
Amit Mahajanb3a11bb2017-05-15 16:41:44 -07001833 CALL_ONREQUEST(pRI->pCI->requestNumber, gsmBciPtrs,
1834 num * sizeof(RIL_GSM_BroadcastSmsConfigInfo *), pRI, mSlotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001835 return Void();
1836}
1837
1838Return<void> RadioImpl::setGsmBroadcastActivation(int32_t serial, bool activate) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001839#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001840 RLOGD("setGsmBroadcastActivation: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001841#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001842 dispatchInts(serial, mSlotId, RIL_REQUEST_GSM_SMS_BROADCAST_ACTIVATION,
Sanket Padawe0de29d12017-02-10 13:19:47 -08001843 1, BOOL_TO_INT(!activate));
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001844 return Void();
1845}
1846
1847Return<void> RadioImpl::getCdmaBroadcastConfig(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001848#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001849 RLOGD("getCdmaBroadcastConfig: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001850#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001851 dispatchVoid(serial, mSlotId, RIL_REQUEST_CDMA_GET_BROADCAST_SMS_CONFIG);
1852 return Void();
1853}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001854
1855Return<void> RadioImpl::setCdmaBroadcastConfig(int32_t serial,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001856 const hidl_vec<CdmaBroadcastSmsConfigInfo>&
1857 configInfo) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001858#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001859 RLOGD("setCdmaBroadcastConfig: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001860#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001861 RequestInfo *pRI = android::addRequestToList(serial, mSlotId,
1862 RIL_REQUEST_CDMA_SET_BROADCAST_SMS_CONFIG);
1863 if (pRI == NULL) {
1864 return Void();
1865 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001866
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001867 int num = configInfo.size();
1868 RIL_CDMA_BroadcastSmsConfigInfo cdmaBci[num];
1869 RIL_CDMA_BroadcastSmsConfigInfo *cdmaBciPtrs[num];
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001870
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001871 for (int i = 0 ; i < num ; i++ ) {
1872 cdmaBciPtrs[i] = &cdmaBci[i];
1873 cdmaBci[i].service_category = configInfo[i].serviceCategory;
1874 cdmaBci[i].language = configInfo[i].language;
1875 cdmaBci[i].selected = BOOL_TO_INT(configInfo[i].selected);
1876 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001877
Amit Mahajanb3a11bb2017-05-15 16:41:44 -07001878 CALL_ONREQUEST(pRI->pCI->requestNumber, cdmaBciPtrs,
1879 num * sizeof(RIL_CDMA_BroadcastSmsConfigInfo *), pRI, mSlotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001880 return Void();
1881}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001882
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001883Return<void> RadioImpl::setCdmaBroadcastActivation(int32_t serial, bool activate) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001884#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001885 RLOGD("setCdmaBroadcastActivation: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001886#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001887 dispatchInts(serial, mSlotId, RIL_REQUEST_CDMA_SMS_BROADCAST_ACTIVATION,
Sanket Padawe0de29d12017-02-10 13:19:47 -08001888 1, BOOL_TO_INT(!activate));
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001889 return Void();
1890}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001891
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001892Return<void> RadioImpl::getCDMASubscription(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001893#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001894 RLOGD("getCDMASubscription: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001895#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001896 dispatchVoid(serial, mSlotId, RIL_REQUEST_CDMA_SUBSCRIPTION);
1897 return Void();
1898}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001899
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001900Return<void> RadioImpl::writeSmsToRuim(int32_t serial, const CdmaSmsWriteArgs& cdmaSms) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001901#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001902 RLOGD("writeSmsToRuim: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001903#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001904 RequestInfo *pRI = android::addRequestToList(serial, mSlotId,
1905 RIL_REQUEST_CDMA_WRITE_SMS_TO_RUIM);
1906 if (pRI == NULL) {
1907 return Void();
1908 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001909
Jack Yuf68e0da2017-02-07 14:53:09 -08001910 RIL_CDMA_SMS_WriteArgs rcsw = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001911 rcsw.status = (int) cdmaSms.status;
1912 constructCdmaSms(rcsw.message, cdmaSms.message);
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001913
Amit Mahajanb3a11bb2017-05-15 16:41:44 -07001914 CALL_ONREQUEST(pRI->pCI->requestNumber, &rcsw, sizeof(rcsw), pRI, mSlotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001915 return Void();
1916}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001917
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001918Return<void> RadioImpl::deleteSmsOnRuim(int32_t serial, int32_t index) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001919#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001920 RLOGD("deleteSmsOnRuim: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001921#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001922 dispatchInts(serial, mSlotId, RIL_REQUEST_CDMA_DELETE_SMS_ON_RUIM, 1, index);
1923 return Void();
1924}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001925
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001926Return<void> RadioImpl::getDeviceIdentity(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001927#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001928 RLOGD("getDeviceIdentity: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001929#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001930 dispatchVoid(serial, mSlotId, RIL_REQUEST_DEVICE_IDENTITY);
1931 return Void();
1932}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001933
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001934Return<void> RadioImpl::exitEmergencyCallbackMode(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001935#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001936 RLOGD("exitEmergencyCallbackMode: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001937#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001938 dispatchVoid(serial, mSlotId, RIL_REQUEST_EXIT_EMERGENCY_CALLBACK_MODE);
1939 return Void();
1940}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001941
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001942Return<void> RadioImpl::getSmscAddress(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001943#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001944 RLOGD("getSmscAddress: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001945#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001946 dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_SMSC_ADDRESS);
1947 return Void();
1948}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001949
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001950Return<void> RadioImpl::setSmscAddress(int32_t serial, const hidl_string& smsc) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001951#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001952 RLOGD("setSmscAddress: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001953#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001954 dispatchString(serial, mSlotId, RIL_REQUEST_SET_SMSC_ADDRESS,
Scott Randolphc7213312017-04-03 14:06:40 -07001955 smsc.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001956 return Void();
1957}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001958
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001959Return<void> RadioImpl::reportSmsMemoryStatus(int32_t serial, bool available) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001960#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001961 RLOGD("reportSmsMemoryStatus: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001962#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001963 dispatchInts(serial, mSlotId, RIL_REQUEST_REPORT_SMS_MEMORY_STATUS, 1,
1964 BOOL_TO_INT(available));
1965 return Void();
1966}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001967
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001968Return<void> RadioImpl::reportStkServiceIsRunning(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001969#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001970 RLOGD("reportStkServiceIsRunning: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001971#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001972 dispatchVoid(serial, mSlotId, RIL_REQUEST_REPORT_STK_SERVICE_IS_RUNNING);
1973 return Void();
1974}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001975
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001976Return<void> RadioImpl::getCdmaSubscriptionSource(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001977#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001978 RLOGD("getCdmaSubscriptionSource: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001979#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001980 dispatchVoid(serial, mSlotId, RIL_REQUEST_CDMA_GET_SUBSCRIPTION_SOURCE);
1981 return Void();
1982}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001983
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001984Return<void> RadioImpl::requestIsimAuthentication(int32_t serial, const hidl_string& challenge) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001985#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001986 RLOGD("requestIsimAuthentication: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001987#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001988 dispatchString(serial, mSlotId, RIL_REQUEST_ISIM_AUTHENTICATION,
Scott Randolphc7213312017-04-03 14:06:40 -07001989 challenge.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001990 return Void();
1991}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001992
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001993Return<void> RadioImpl::acknowledgeIncomingGsmSmsWithPdu(int32_t serial, bool success,
1994 const hidl_string& ackPdu) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001995#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001996 RLOGD("acknowledgeIncomingGsmSmsWithPdu: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001997#endif
Ruthwar Kumar Ambeer7c373812017-03-23 17:38:56 +05301998 dispatchStrings(serial, mSlotId, RIL_REQUEST_ACKNOWLEDGE_INCOMING_GSM_SMS_WITH_PDU, false,
Scott Randolphc7213312017-04-03 14:06:40 -07001999 2, success ? "1" : "0", ackPdu.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002000 return Void();
2001}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002002
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002003Return<void> RadioImpl::sendEnvelopeWithStatus(int32_t serial, const hidl_string& contents) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002004#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002005 RLOGD("sendEnvelopeWithStatus: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002006#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002007 dispatchString(serial, mSlotId, RIL_REQUEST_STK_SEND_ENVELOPE_WITH_STATUS,
Scott Randolphc7213312017-04-03 14:06:40 -07002008 contents.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002009 return Void();
2010}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002011
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002012Return<void> RadioImpl::getVoiceRadioTechnology(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002013#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002014 RLOGD("getVoiceRadioTechnology: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002015#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002016 dispatchVoid(serial, mSlotId, RIL_REQUEST_VOICE_RADIO_TECH);
2017 return Void();
2018}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002019
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002020Return<void> RadioImpl::getCellInfoList(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002021#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002022 RLOGD("getCellInfoList: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002023#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002024 dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_CELL_INFO_LIST);
2025 return Void();
2026}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002027
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002028Return<void> RadioImpl::setCellInfoListRate(int32_t serial, int32_t rate) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002029#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002030 RLOGD("setCellInfoListRate: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002031#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002032 dispatchInts(serial, mSlotId, RIL_REQUEST_SET_UNSOL_CELL_INFO_LIST_RATE, 1, rate);
2033 return Void();
2034}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002035
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002036Return<void> RadioImpl::setInitialAttachApn(int32_t serial, const DataProfileInfo& dataProfileInfo,
Jack Yuffc06452017-02-13 11:21:00 -08002037 bool modemCognitive, bool isRoaming) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002038#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002039 RLOGD("setInitialAttachApn: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002040#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002041 RequestInfo *pRI = android::addRequestToList(serial, mSlotId,
2042 RIL_REQUEST_SET_INITIAL_ATTACH_APN);
2043 if (pRI == NULL) {
2044 return Void();
2045 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002046
Jack Yuffc06452017-02-13 11:21:00 -08002047 if (s_vendorFunctions->version <= 14) {
2048 RIL_InitialAttachApn iaa = {};
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002049
Ruthwar Kumar Ambeer7c373812017-03-23 17:38:56 +05302050 if (!copyHidlStringToRil(&iaa.apn, dataProfileInfo.apn, pRI, true)) {
2051 return Void();
Jack Yuffc06452017-02-13 11:21:00 -08002052 }
2053
2054 const hidl_string &protocol =
2055 (isRoaming ? dataProfileInfo.roamingProtocol : dataProfileInfo.protocol);
2056
2057 if (!copyHidlStringToRil(&iaa.protocol, protocol, pRI)) {
Jack Yu8e732d42017-04-14 00:08:06 -07002058 memsetAndFreeStrings(1, iaa.apn);
Jack Yuffc06452017-02-13 11:21:00 -08002059 return Void();
2060 }
2061 iaa.authtype = (int) dataProfileInfo.authType;
2062 if (!copyHidlStringToRil(&iaa.username, dataProfileInfo.user, pRI)) {
Jack Yu8e732d42017-04-14 00:08:06 -07002063 memsetAndFreeStrings(2, iaa.apn, iaa.protocol);
Jack Yuffc06452017-02-13 11:21:00 -08002064 return Void();
2065 }
2066 if (!copyHidlStringToRil(&iaa.password, dataProfileInfo.password, pRI)) {
Jack Yu8e732d42017-04-14 00:08:06 -07002067 memsetAndFreeStrings(3, iaa.apn, iaa.protocol, iaa.username);
Jack Yuffc06452017-02-13 11:21:00 -08002068 return Void();
2069 }
2070
Amit Mahajanb3a11bb2017-05-15 16:41:44 -07002071 CALL_ONREQUEST(RIL_REQUEST_SET_INITIAL_ATTACH_APN, &iaa, sizeof(iaa), pRI, mSlotId);
Jack Yuffc06452017-02-13 11:21:00 -08002072
2073 memsetAndFreeStrings(4, iaa.apn, iaa.protocol, iaa.username, iaa.password);
2074 } else {
2075 RIL_InitialAttachApn_v15 iaa = {};
2076
Ruthwar Kumar Ambeer7c373812017-03-23 17:38:56 +05302077 if (!copyHidlStringToRil(&iaa.apn, dataProfileInfo.apn, pRI, true)) {
2078 return Void();
Jack Yuffc06452017-02-13 11:21:00 -08002079 }
Sanket Padawe46e9ee32017-06-20 12:40:19 -07002080
Jack Yuffc06452017-02-13 11:21:00 -08002081 if (!copyHidlStringToRil(&iaa.protocol, dataProfileInfo.protocol, pRI)) {
Jack Yu8e732d42017-04-14 00:08:06 -07002082 memsetAndFreeStrings(1, iaa.apn);
Jack Yuffc06452017-02-13 11:21:00 -08002083 return Void();
2084 }
2085 if (!copyHidlStringToRil(&iaa.roamingProtocol, dataProfileInfo.roamingProtocol, pRI)) {
Jack Yu8e732d42017-04-14 00:08:06 -07002086 memsetAndFreeStrings(2, iaa.apn, iaa.protocol);
Jack Yuffc06452017-02-13 11:21:00 -08002087 return Void();
2088 }
2089 iaa.authtype = (int) dataProfileInfo.authType;
2090 if (!copyHidlStringToRil(&iaa.username, dataProfileInfo.user, pRI)) {
Jack Yu8e732d42017-04-14 00:08:06 -07002091 memsetAndFreeStrings(3, iaa.apn, iaa.protocol, iaa.roamingProtocol);
Jack Yuffc06452017-02-13 11:21:00 -08002092 return Void();
2093 }
2094 if (!copyHidlStringToRil(&iaa.password, dataProfileInfo.password, pRI)) {
Jack Yu8e732d42017-04-14 00:08:06 -07002095 memsetAndFreeStrings(4, iaa.apn, iaa.protocol, iaa.roamingProtocol, iaa.username);
Jack Yuffc06452017-02-13 11:21:00 -08002096 return Void();
2097 }
2098 iaa.supportedTypesBitmask = dataProfileInfo.supportedApnTypesBitmap;
2099 iaa.bearerBitmask = dataProfileInfo.bearerBitmap;
2100 iaa.modemCognitive = BOOL_TO_INT(modemCognitive);
2101 iaa.mtu = dataProfileInfo.mtu;
2102
Jack Yuc13645e2017-04-13 20:55:03 -07002103 if (!convertMvnoTypeToString(dataProfileInfo.mvnoType, iaa.mvnoType)) {
Jack Yuffc06452017-02-13 11:21:00 -08002104 sendErrorResponse(pRI, RIL_E_INVALID_ARGUMENTS);
Jack Yu8e732d42017-04-14 00:08:06 -07002105 memsetAndFreeStrings(5, iaa.apn, iaa.protocol, iaa.roamingProtocol, iaa.username,
2106 iaa.password);
Jack Yuffc06452017-02-13 11:21:00 -08002107 return Void();
2108 }
2109
2110 if (!copyHidlStringToRil(&iaa.mvnoMatchData, dataProfileInfo.mvnoMatchData, pRI)) {
Jack Yu8e732d42017-04-14 00:08:06 -07002111 memsetAndFreeStrings(5, iaa.apn, iaa.protocol, iaa.roamingProtocol, iaa.username,
2112 iaa.password);
Jack Yuffc06452017-02-13 11:21:00 -08002113 return Void();
2114 }
2115
Amit Mahajanb3a11bb2017-05-15 16:41:44 -07002116 CALL_ONREQUEST(RIL_REQUEST_SET_INITIAL_ATTACH_APN, &iaa, sizeof(iaa), pRI, mSlotId);
Jack Yuffc06452017-02-13 11:21:00 -08002117
2118 memsetAndFreeStrings(6, iaa.apn, iaa.protocol, iaa.roamingProtocol, iaa.username,
2119 iaa.password, iaa.mvnoMatchData);
2120 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002121
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002122 return Void();
2123}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002124
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002125Return<void> RadioImpl::getImsRegistrationState(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002126#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002127 RLOGD("getImsRegistrationState: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002128#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002129 dispatchVoid(serial, mSlotId, RIL_REQUEST_IMS_REGISTRATION_STATE);
2130 return Void();
2131}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002132
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002133bool dispatchImsGsmSms(const ImsSmsMessage& message, RequestInfo *pRI) {
Jack Yuf68e0da2017-02-07 14:53:09 -08002134 RIL_IMS_SMS_Message rism = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002135 char **pStrings;
2136 int countStrings = 2;
2137 int dataLen = sizeof(char *) * countStrings;
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002138
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002139 rism.tech = RADIO_TECH_3GPP;
2140 rism.retry = BOOL_TO_INT(message.retry);
2141 rism.messageRef = message.messageRef;
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002142
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002143 if (message.gsmMessage.size() != 1) {
2144 RLOGE("dispatchImsGsmSms: Invalid len %s", requestToString(pRI->pCI->requestNumber));
Jack Yuffc06452017-02-13 11:21:00 -08002145 sendErrorResponse(pRI, RIL_E_INVALID_ARGUMENTS);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002146 return false;
2147 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002148
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002149 pStrings = (char **)calloc(countStrings, sizeof(char *));
2150 if (pStrings == NULL) {
2151 RLOGE("dispatchImsGsmSms: Memory allocation failed for request %s",
2152 requestToString(pRI->pCI->requestNumber));
Jack Yuffc06452017-02-13 11:21:00 -08002153 sendErrorResponse(pRI, RIL_E_NO_MEMORY);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002154 return false;
2155 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002156
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002157 if (!copyHidlStringToRil(&pStrings[0], message.gsmMessage[0].smscPdu, pRI)) {
2158#ifdef MEMSET_FREED
Jack Yub4295a42017-04-14 12:51:49 -07002159 memset(pStrings, 0, dataLen);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002160#endif
2161 free(pStrings);
2162 return false;
2163 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002164
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002165 if (!copyHidlStringToRil(&pStrings[1], message.gsmMessage[0].pdu, pRI)) {
2166 memsetAndFreeStrings(1, pStrings[0]);
2167#ifdef MEMSET_FREED
Jack Yub4295a42017-04-14 12:51:49 -07002168 memset(pStrings, 0, dataLen);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002169#endif
2170 free(pStrings);
2171 return false;
2172 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002173
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002174 rism.message.gsmMessage = pStrings;
Amit Mahajanb3a11bb2017-05-15 16:41:44 -07002175 CALL_ONREQUEST(pRI->pCI->requestNumber, &rism, sizeof(RIL_RadioTechnologyFamily) +
2176 sizeof(uint8_t) + sizeof(int32_t) + dataLen, pRI, pRI->socket_id);
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002177
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002178 for (int i = 0 ; i < countStrings ; i++) {
2179 memsetAndFreeStrings(1, pStrings[i]);
2180 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002181
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002182#ifdef MEMSET_FREED
Jack Yub4295a42017-04-14 12:51:49 -07002183 memset(pStrings, 0, dataLen);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002184#endif
2185 free(pStrings);
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002186
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002187 return true;
2188}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002189
Sanket Padawec4195802017-06-27 14:53:22 -07002190struct ImsCdmaSms {
2191 RIL_IMS_SMS_Message imsSms;
2192 RIL_CDMA_SMS_Message cdmaSms;
2193};
2194
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002195bool dispatchImsCdmaSms(const ImsSmsMessage& message, RequestInfo *pRI) {
Sanket Padawec4195802017-06-27 14:53:22 -07002196 ImsCdmaSms temp = {};
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002197
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002198 if (message.cdmaMessage.size() != 1) {
2199 RLOGE("dispatchImsCdmaSms: Invalid len %s", requestToString(pRI->pCI->requestNumber));
Jack Yuffc06452017-02-13 11:21:00 -08002200 sendErrorResponse(pRI, RIL_E_INVALID_ARGUMENTS);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002201 return false;
2202 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002203
Sanket Padawec4195802017-06-27 14:53:22 -07002204 temp.imsSms.tech = RADIO_TECH_3GPP2;
2205 temp.imsSms.retry = BOOL_TO_INT(message.retry);
2206 temp.imsSms.messageRef = message.messageRef;
2207 temp.imsSms.message.cdmaMessage = &temp.cdmaSms;
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002208
Sanket Padawec4195802017-06-27 14:53:22 -07002209 constructCdmaSms(temp.cdmaSms, message.cdmaMessage[0]);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002210
Sanket Padawec4195802017-06-27 14:53:22 -07002211 // Vendor code expects payload length to include actual msg payload
2212 // (sizeof(RIL_CDMA_SMS_Message)) instead of (RIL_CDMA_SMS_Message *) + size of other fields in
2213 // RIL_IMS_SMS_Message
2214 int payloadLen = sizeof(RIL_RadioTechnologyFamily) + sizeof(uint8_t) + sizeof(int32_t)
2215 + sizeof(RIL_CDMA_SMS_Message);
2216
2217 CALL_ONREQUEST(pRI->pCI->requestNumber, &temp.imsSms, payloadLen, pRI, pRI->socket_id);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002218
2219 return true;
2220}
2221
2222Return<void> RadioImpl::sendImsSms(int32_t serial, const ImsSmsMessage& message) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002223#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002224 RLOGD("sendImsSms: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002225#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002226 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_IMS_SEND_SMS);
2227 if (pRI == NULL) {
2228 return Void();
2229 }
2230
2231 RIL_RadioTechnologyFamily format = (RIL_RadioTechnologyFamily) message.tech;
2232
2233 if (RADIO_TECH_3GPP == format) {
2234 dispatchImsGsmSms(message, pRI);
2235 } else if (RADIO_TECH_3GPP2 == format) {
2236 dispatchImsCdmaSms(message, pRI);
2237 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08002238 RLOGE("sendImsSms: Invalid radio tech %s",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002239 requestToString(pRI->pCI->requestNumber));
Jack Yuffc06452017-02-13 11:21:00 -08002240 sendErrorResponse(pRI, RIL_E_INVALID_ARGUMENTS);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002241 }
2242 return Void();
2243}
2244
2245Return<void> RadioImpl::iccTransmitApduBasicChannel(int32_t serial, const SimApdu& message) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002246#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002247 RLOGD("iccTransmitApduBasicChannel: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002248#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002249 dispatchIccApdu(serial, mSlotId, RIL_REQUEST_SIM_TRANSMIT_APDU_BASIC, message);
2250 return Void();
2251}
2252
Wileen Chiu410b7562015-11-23 14:25:22 -08002253Return<void> RadioImpl::iccOpenLogicalChannel(int32_t serial, const hidl_string& aid, int32_t p2) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002254#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002255 RLOGD("iccOpenLogicalChannel: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002256#endif
Wileen Chiu410b7562015-11-23 14:25:22 -08002257 if (s_vendorFunctions->version < 15) {
2258 dispatchString(serial, mSlotId, RIL_REQUEST_SIM_OPEN_CHANNEL, aid.c_str());
2259 } else {
2260 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_SIM_OPEN_CHANNEL);
2261 if (pRI == NULL) {
2262 return Void();
2263 }
2264
Jack Yu8e732d42017-04-14 00:08:06 -07002265 RIL_OpenChannelParams params = {};
Wileen Chiu410b7562015-11-23 14:25:22 -08002266
2267 params.p2 = p2;
2268
2269 if (!copyHidlStringToRil(&params.aidPtr, aid, pRI)) {
2270 return Void();
2271 }
2272
Amit Mahajanb3a11bb2017-05-15 16:41:44 -07002273 CALL_ONREQUEST(pRI->pCI->requestNumber, &params, sizeof(params), pRI, mSlotId);
Wileen Chiu410b7562015-11-23 14:25:22 -08002274
2275 memsetAndFreeStrings(1, params.aidPtr);
2276 }
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002277 return Void();
2278}
2279
2280Return<void> RadioImpl::iccCloseLogicalChannel(int32_t serial, int32_t channelId) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002281#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002282 RLOGD("iccCloseLogicalChannel: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002283#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002284 dispatchInts(serial, mSlotId, RIL_REQUEST_SIM_CLOSE_CHANNEL, 1, channelId);
2285 return Void();
2286}
2287
2288Return<void> RadioImpl::iccTransmitApduLogicalChannel(int32_t serial, const SimApdu& message) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002289#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002290 RLOGD("iccTransmitApduLogicalChannel: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002291#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002292 dispatchIccApdu(serial, mSlotId, RIL_REQUEST_SIM_TRANSMIT_APDU_CHANNEL, message);
2293 return Void();
2294}
2295
2296Return<void> RadioImpl::nvReadItem(int32_t serial, NvItem itemId) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002297#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002298 RLOGD("nvReadItem: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002299#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002300 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_NV_READ_ITEM);
2301 if (pRI == NULL) {
2302 return Void();
2303 }
2304
Jack Yu8e732d42017-04-14 00:08:06 -07002305 RIL_NV_ReadItem nvri = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002306 nvri.itemID = (RIL_NV_Item) itemId;
2307
Amit Mahajanb3a11bb2017-05-15 16:41:44 -07002308 CALL_ONREQUEST(pRI->pCI->requestNumber, &nvri, sizeof(nvri), pRI, mSlotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002309 return Void();
2310}
2311
2312Return<void> RadioImpl::nvWriteItem(int32_t serial, const NvWriteItem& item) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002313#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002314 RLOGD("nvWriteItem: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002315#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002316 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_NV_WRITE_ITEM);
2317 if (pRI == NULL) {
2318 return Void();
2319 }
2320
Jack Yu8e732d42017-04-14 00:08:06 -07002321 RIL_NV_WriteItem nvwi = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002322
2323 nvwi.itemID = (RIL_NV_Item) item.itemId;
2324
2325 if (!copyHidlStringToRil(&nvwi.value, item.value, pRI)) {
2326 return Void();
2327 }
2328
Amit Mahajanb3a11bb2017-05-15 16:41:44 -07002329 CALL_ONREQUEST(pRI->pCI->requestNumber, &nvwi, sizeof(nvwi), pRI, mSlotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002330
2331 memsetAndFreeStrings(1, nvwi.value);
2332 return Void();
2333}
2334
2335Return<void> RadioImpl::nvWriteCdmaPrl(int32_t serial, const hidl_vec<uint8_t>& prl) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002336#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002337 RLOGD("nvWriteCdmaPrl: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002338#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002339 dispatchRaw(serial, mSlotId, RIL_REQUEST_NV_WRITE_CDMA_PRL, prl);
2340 return Void();
2341}
2342
2343Return<void> RadioImpl::nvResetConfig(int32_t serial, ResetNvType resetType) {
Jayachandran C32763f02017-04-30 10:21:14 -07002344 int rilResetType = -1;
Jayachandran C572f2f42017-03-25 14:30:13 -07002345#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002346 RLOGD("nvResetConfig: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002347#endif
Jayachandran C32763f02017-04-30 10:21:14 -07002348 /* Convert ResetNvType to RIL.h values
2349 * RIL_REQUEST_NV_RESET_CONFIG
2350 * 1 - reload all NV items
2351 * 2 - erase NV reset (SCRTN)
2352 * 3 - factory reset (RTN)
2353 */
2354 switch(resetType) {
2355 case ResetNvType::RELOAD:
2356 rilResetType = 1;
2357 break;
2358 case ResetNvType::ERASE:
2359 rilResetType = 2;
2360 break;
2361 case ResetNvType::FACTORY_RESET:
2362 rilResetType = 3;
2363 break;
2364 }
2365 dispatchInts(serial, mSlotId, RIL_REQUEST_NV_RESET_CONFIG, 1, rilResetType);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002366 return Void();
2367}
2368
2369Return<void> RadioImpl::setUiccSubscription(int32_t serial, const SelectUiccSub& uiccSub) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002370#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002371 RLOGD("setUiccSubscription: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002372#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002373 RequestInfo *pRI = android::addRequestToList(serial, mSlotId,
2374 RIL_REQUEST_SET_UICC_SUBSCRIPTION);
2375 if (pRI == NULL) {
2376 return Void();
2377 }
2378
Jack Yuf68e0da2017-02-07 14:53:09 -08002379 RIL_SelectUiccSub rilUiccSub = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002380
2381 rilUiccSub.slot = uiccSub.slot;
2382 rilUiccSub.app_index = uiccSub.appIndex;
2383 rilUiccSub.sub_type = (RIL_SubscriptionType) uiccSub.subType;
2384 rilUiccSub.act_status = (RIL_UiccSubActStatus) uiccSub.actStatus;
2385
Amit Mahajanb3a11bb2017-05-15 16:41:44 -07002386 CALL_ONREQUEST(pRI->pCI->requestNumber, &rilUiccSub, sizeof(rilUiccSub), pRI, mSlotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002387 return Void();
2388}
2389
2390Return<void> RadioImpl::setDataAllowed(int32_t serial, bool allow) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002391#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002392 RLOGD("setDataAllowed: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002393#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002394 dispatchInts(serial, mSlotId, RIL_REQUEST_ALLOW_DATA, 1, BOOL_TO_INT(allow));
2395 return Void();
2396}
2397
2398Return<void> RadioImpl::getHardwareConfig(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002399#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002400 RLOGD("getHardwareConfig: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002401#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002402 dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_HARDWARE_CONFIG);
2403 return Void();
2404}
2405
2406Return<void> RadioImpl::requestIccSimAuthentication(int32_t serial, int32_t authContext,
2407 const hidl_string& authData, const hidl_string& aid) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002408#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002409 RLOGD("requestIccSimAuthentication: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002410#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002411 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_SIM_AUTHENTICATION);
2412 if (pRI == NULL) {
2413 return Void();
2414 }
2415
Jack Yu8e732d42017-04-14 00:08:06 -07002416 RIL_SimAuthentication pf = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002417
2418 pf.authContext = authContext;
2419
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002420 if (!copyHidlStringToRil(&pf.authData, authData, pRI)) {
2421 return Void();
2422 }
2423
2424 if (!copyHidlStringToRil(&pf.aid, aid, pRI)) {
2425 memsetAndFreeStrings(1, pf.authData);
2426 return Void();
2427 }
2428
Amit Mahajanb3a11bb2017-05-15 16:41:44 -07002429 CALL_ONREQUEST(pRI->pCI->requestNumber, &pf, sizeof(pf), pRI, mSlotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002430
2431 memsetAndFreeStrings(2, pf.authData, pf.aid);
2432 return Void();
2433}
2434
2435/**
Jack Yuffc06452017-02-13 11:21:00 -08002436 * @param numProfiles number of data profile
2437 * @param dataProfiles the pointer to the actual data profiles. The acceptable type is
2438 RIL_DataProfileInfo or RIL_DataProfileInfo_v15.
2439 * @param dataProfilePtrs the pointer to the pointers that point to each data profile structure
2440 * @param numfields number of string-type member in the data profile structure
2441 * @param ... the variadic parameters are pointers to each string-type member
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002442 **/
Jack Yuffc06452017-02-13 11:21:00 -08002443template <typename T>
2444void freeSetDataProfileData(int numProfiles, T *dataProfiles, T **dataProfilePtrs,
2445 int numfields, ...) {
2446 va_list args;
2447 va_start(args, numfields);
2448
2449 // Iterate through each string-type field that need to be free.
2450 for (int i = 0; i < numfields; i++) {
2451 // Iterate through each data profile and free that specific string-type field.
2452 // The type 'char *T::*' is a type of pointer to a 'char *' member inside T structure.
2453 char *T::*ptr = va_arg(args, char *T::*);
2454 for (int j = 0; j < numProfiles; j++) {
2455 memsetAndFreeStrings(1, dataProfiles[j].*ptr);
2456 }
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002457 }
2458
Jack Yuffc06452017-02-13 11:21:00 -08002459 va_end(args);
2460
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002461#ifdef MEMSET_FREED
Jack Yuffc06452017-02-13 11:21:00 -08002462 memset(dataProfiles, 0, numProfiles * sizeof(T));
2463 memset(dataProfilePtrs, 0, numProfiles * sizeof(T *));
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002464#endif
2465 free(dataProfiles);
2466 free(dataProfilePtrs);
2467}
2468
Jack Yuffc06452017-02-13 11:21:00 -08002469Return<void> RadioImpl::setDataProfile(int32_t serial, const hidl_vec<DataProfileInfo>& profiles,
2470 bool isRoaming) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002471#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002472 RLOGD("setDataProfile: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002473#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002474 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_SET_DATA_PROFILE);
2475 if (pRI == NULL) {
2476 return Void();
2477 }
2478
Jack Yuffc06452017-02-13 11:21:00 -08002479 size_t num = profiles.size();
2480 bool success = false;
2481
2482 if (s_vendorFunctions->version <= 14) {
2483
2484 RIL_DataProfileInfo *dataProfiles =
2485 (RIL_DataProfileInfo *) calloc(num, sizeof(RIL_DataProfileInfo));
2486
2487 if (dataProfiles == NULL) {
2488 RLOGE("Memory allocation failed for request %s",
2489 requestToString(pRI->pCI->requestNumber));
2490 sendErrorResponse(pRI, RIL_E_NO_MEMORY);
2491 return Void();
2492 }
2493
2494 RIL_DataProfileInfo **dataProfilePtrs =
2495 (RIL_DataProfileInfo **) calloc(num, sizeof(RIL_DataProfileInfo *));
2496 if (dataProfilePtrs == NULL) {
2497 RLOGE("Memory allocation failed for request %s",
2498 requestToString(pRI->pCI->requestNumber));
2499 free(dataProfiles);
2500 sendErrorResponse(pRI, RIL_E_NO_MEMORY);
2501 return Void();
2502 }
2503
2504 for (size_t i = 0; i < num; i++) {
2505 dataProfilePtrs[i] = &dataProfiles[i];
2506
Ruthwar Kumar Ambeer7c373812017-03-23 17:38:56 +05302507 success = copyHidlStringToRil(&dataProfiles[i].apn, profiles[i].apn, pRI, true);
Jack Yuffc06452017-02-13 11:21:00 -08002508
2509 const hidl_string &protocol =
2510 (isRoaming ? profiles[i].roamingProtocol : profiles[i].protocol);
2511
Ruthwar Kumar Ambeer7c373812017-03-23 17:38:56 +05302512 if (success && !copyHidlStringToRil(&dataProfiles[i].protocol, protocol, pRI, true)) {
Jack Yuffc06452017-02-13 11:21:00 -08002513 success = false;
2514 }
2515
Ruthwar Kumar Ambeer7c373812017-03-23 17:38:56 +05302516 if (success && !copyHidlStringToRil(&dataProfiles[i].user, profiles[i].user, pRI,
2517 true)) {
Jack Yuffc06452017-02-13 11:21:00 -08002518 success = false;
2519 }
2520 if (success && !copyHidlStringToRil(&dataProfiles[i].password, profiles[i].password,
Ruthwar Kumar Ambeer7c373812017-03-23 17:38:56 +05302521 pRI, true)) {
Jack Yuffc06452017-02-13 11:21:00 -08002522 success = false;
2523 }
2524
2525 if (!success) {
2526 freeSetDataProfileData(num, dataProfiles, dataProfilePtrs, 4,
2527 &RIL_DataProfileInfo::apn, &RIL_DataProfileInfo::protocol,
2528 &RIL_DataProfileInfo::user, &RIL_DataProfileInfo::password);
2529 return Void();
2530 }
2531
2532 dataProfiles[i].profileId = (RIL_DataProfile) profiles[i].profileId;
2533 dataProfiles[i].authType = (int) profiles[i].authType;
2534 dataProfiles[i].type = (int) profiles[i].type;
2535 dataProfiles[i].maxConnsTime = profiles[i].maxConnsTime;
2536 dataProfiles[i].maxConns = profiles[i].maxConns;
2537 dataProfiles[i].waitTime = profiles[i].waitTime;
2538 dataProfiles[i].enabled = BOOL_TO_INT(profiles[i].enabled);
2539 }
2540
Amit Mahajanb3a11bb2017-05-15 16:41:44 -07002541 CALL_ONREQUEST(RIL_REQUEST_SET_DATA_PROFILE, dataProfilePtrs,
2542 num * sizeof(RIL_DataProfileInfo *), pRI, mSlotId);
Jack Yuffc06452017-02-13 11:21:00 -08002543
2544 freeSetDataProfileData(num, dataProfiles, dataProfilePtrs, 4,
2545 &RIL_DataProfileInfo::apn, &RIL_DataProfileInfo::protocol,
2546 &RIL_DataProfileInfo::user, &RIL_DataProfileInfo::password);
2547 } else {
2548 RIL_DataProfileInfo_v15 *dataProfiles =
2549 (RIL_DataProfileInfo_v15 *) calloc(num, sizeof(RIL_DataProfileInfo_v15));
2550
2551 if (dataProfiles == NULL) {
2552 RLOGE("Memory allocation failed for request %s",
2553 requestToString(pRI->pCI->requestNumber));
2554 sendErrorResponse(pRI, RIL_E_NO_MEMORY);
2555 return Void();
2556 }
2557
2558 RIL_DataProfileInfo_v15 **dataProfilePtrs =
2559 (RIL_DataProfileInfo_v15 **) calloc(num, sizeof(RIL_DataProfileInfo_v15 *));
2560 if (dataProfilePtrs == NULL) {
2561 RLOGE("Memory allocation failed for request %s",
2562 requestToString(pRI->pCI->requestNumber));
2563 free(dataProfiles);
2564 sendErrorResponse(pRI, RIL_E_NO_MEMORY);
2565 return Void();
2566 }
2567
2568 for (size_t i = 0; i < num; i++) {
2569 dataProfilePtrs[i] = &dataProfiles[i];
2570
Ruthwar Kumar Ambeer7c373812017-03-23 17:38:56 +05302571 success = copyHidlStringToRil(&dataProfiles[i].apn, profiles[i].apn, pRI, true);
Jack Yuffc06452017-02-13 11:21:00 -08002572 if (success && !copyHidlStringToRil(&dataProfiles[i].protocol, profiles[i].protocol,
2573 pRI)) {
2574 success = false;
2575 }
2576 if (success && !copyHidlStringToRil(&dataProfiles[i].roamingProtocol,
Ruthwar Kumar Ambeer7c373812017-03-23 17:38:56 +05302577 profiles[i].roamingProtocol, pRI, true)) {
Jack Yuffc06452017-02-13 11:21:00 -08002578 success = false;
2579 }
Ruthwar Kumar Ambeer7c373812017-03-23 17:38:56 +05302580 if (success && !copyHidlStringToRil(&dataProfiles[i].user, profiles[i].user, pRI,
2581 true)) {
Jack Yuffc06452017-02-13 11:21:00 -08002582 success = false;
2583 }
2584 if (success && !copyHidlStringToRil(&dataProfiles[i].password, profiles[i].password,
Ruthwar Kumar Ambeer7c373812017-03-23 17:38:56 +05302585 pRI, true)) {
Jack Yuffc06452017-02-13 11:21:00 -08002586 success = false;
2587 }
Jack Yuffc06452017-02-13 11:21:00 -08002588 if (success && !copyHidlStringToRil(&dataProfiles[i].mvnoMatchData,
Ruthwar Kumar Ambeer7c373812017-03-23 17:38:56 +05302589 profiles[i].mvnoMatchData, pRI, true)) {
Jack Yuffc06452017-02-13 11:21:00 -08002590 success = false;
2591 }
2592
Jack Yuc13645e2017-04-13 20:55:03 -07002593 if (success && !convertMvnoTypeToString(profiles[i].mvnoType,
2594 dataProfiles[i].mvnoType)) {
2595 sendErrorResponse(pRI, RIL_E_INVALID_ARGUMENTS);
2596 success = false;
Jack Yuffc06452017-02-13 11:21:00 -08002597 }
2598
2599 if (!success) {
2600 freeSetDataProfileData(num, dataProfiles, dataProfilePtrs, 6,
2601 &RIL_DataProfileInfo_v15::apn, &RIL_DataProfileInfo_v15::protocol,
2602 &RIL_DataProfileInfo_v15::roamingProtocol, &RIL_DataProfileInfo_v15::user,
2603 &RIL_DataProfileInfo_v15::password, &RIL_DataProfileInfo_v15::mvnoMatchData);
2604 return Void();
2605 }
2606
2607 dataProfiles[i].profileId = (RIL_DataProfile) profiles[i].profileId;
2608 dataProfiles[i].authType = (int) profiles[i].authType;
2609 dataProfiles[i].type = (int) profiles[i].type;
2610 dataProfiles[i].maxConnsTime = profiles[i].maxConnsTime;
2611 dataProfiles[i].maxConns = profiles[i].maxConns;
2612 dataProfiles[i].waitTime = profiles[i].waitTime;
2613 dataProfiles[i].enabled = BOOL_TO_INT(profiles[i].enabled);
2614 dataProfiles[i].supportedTypesBitmask = profiles[i].supportedApnTypesBitmap;
2615 dataProfiles[i].bearerBitmask = profiles[i].bearerBitmap;
2616 dataProfiles[i].mtu = profiles[i].mtu;
2617 }
2618
Amit Mahajanb3a11bb2017-05-15 16:41:44 -07002619 CALL_ONREQUEST(RIL_REQUEST_SET_DATA_PROFILE, dataProfilePtrs,
2620 num * sizeof(RIL_DataProfileInfo_v15 *), pRI, mSlotId);
Jack Yuffc06452017-02-13 11:21:00 -08002621
2622 freeSetDataProfileData(num, dataProfiles, dataProfilePtrs, 6,
2623 &RIL_DataProfileInfo_v15::apn, &RIL_DataProfileInfo_v15::protocol,
2624 &RIL_DataProfileInfo_v15::roamingProtocol, &RIL_DataProfileInfo_v15::user,
2625 &RIL_DataProfileInfo_v15::password, &RIL_DataProfileInfo_v15::mvnoMatchData);
2626 }
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002627
2628 return Void();
2629}
2630
2631Return<void> RadioImpl::requestShutdown(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002632#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002633 RLOGD("requestShutdown: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002634#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002635 dispatchVoid(serial, mSlotId, RIL_REQUEST_SHUTDOWN);
2636 return Void();
2637}
2638
2639Return<void> RadioImpl::getRadioCapability(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002640#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002641 RLOGD("getRadioCapability: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002642#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002643 dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_RADIO_CAPABILITY);
2644 return Void();
2645}
2646
2647Return<void> RadioImpl::setRadioCapability(int32_t serial, const RadioCapability& rc) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002648#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002649 RLOGD("setRadioCapability: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002650#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002651 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_SET_RADIO_CAPABILITY);
2652 if (pRI == NULL) {
2653 return Void();
2654 }
2655
Jack Yu8e732d42017-04-14 00:08:06 -07002656 RIL_RadioCapability rilRc = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002657
2658 // TODO : set rilRc.version using HIDL version ?
2659 rilRc.session = rc.session;
2660 rilRc.phase = (int) rc.phase;
2661 rilRc.rat = (int) rc.raf;
2662 rilRc.status = (int) rc.status;
Ashit Sood169fc262018-09-06 14:10:34 -07002663 strlcpy(rilRc.logicalModemUuid, rc.logicalModemUuid.c_str(), sizeof(rilRc.logicalModemUuid));
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002664
Amit Mahajanb3a11bb2017-05-15 16:41:44 -07002665 CALL_ONREQUEST(pRI->pCI->requestNumber, &rilRc, sizeof(rilRc), pRI, mSlotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002666
2667 return Void();
2668}
2669
2670Return<void> RadioImpl::startLceService(int32_t serial, int32_t reportInterval, bool pullMode) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002671#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002672 RLOGD("startLceService: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002673#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002674 dispatchInts(serial, mSlotId, RIL_REQUEST_START_LCE, 2, reportInterval,
2675 BOOL_TO_INT(pullMode));
2676 return Void();
2677}
2678
2679Return<void> RadioImpl::stopLceService(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002680#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002681 RLOGD("stopLceService: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002682#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002683 dispatchVoid(serial, mSlotId, RIL_REQUEST_STOP_LCE);
2684 return Void();
2685}
2686
2687Return<void> RadioImpl::pullLceData(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002688#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002689 RLOGD("pullLceData: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002690#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002691 dispatchVoid(serial, mSlotId, RIL_REQUEST_PULL_LCEDATA);
2692 return Void();
2693}
2694
2695Return<void> RadioImpl::getModemActivityInfo(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002696#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002697 RLOGD("getModemActivityInfo: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002698#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002699 dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_ACTIVITY_INFO);
2700 return Void();
2701}
2702
2703Return<void> RadioImpl::setAllowedCarriers(int32_t serial, bool allAllowed,
2704 const CarrierRestrictions& carriers) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002705#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002706 RLOGD("setAllowedCarriers: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002707#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002708 RequestInfo *pRI = android::addRequestToList(serial, mSlotId,
2709 RIL_REQUEST_SET_CARRIER_RESTRICTIONS);
2710 if (pRI == NULL) {
2711 return Void();
2712 }
2713
Jack Yuf68e0da2017-02-07 14:53:09 -08002714 RIL_CarrierRestrictions cr = {};
Jack Yu11ab4042017-02-21 17:08:01 -08002715 RIL_Carrier *allowedCarriers = NULL;
2716 RIL_Carrier *excludedCarriers = NULL;
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002717
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002718 cr.len_allowed_carriers = carriers.allowedCarriers.size();
2719 allowedCarriers = (RIL_Carrier *)calloc(cr.len_allowed_carriers, sizeof(RIL_Carrier));
2720 if (allowedCarriers == NULL) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08002721 RLOGE("setAllowedCarriers: Memory allocation failed for request %s",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002722 requestToString(pRI->pCI->requestNumber));
Jack Yuffc06452017-02-13 11:21:00 -08002723 sendErrorResponse(pRI, RIL_E_NO_MEMORY);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002724 return Void();
2725 }
2726 cr.allowed_carriers = allowedCarriers;
2727
2728 cr.len_excluded_carriers = carriers.excludedCarriers.size();
2729 excludedCarriers = (RIL_Carrier *)calloc(cr.len_excluded_carriers, sizeof(RIL_Carrier));
2730 if (excludedCarriers == NULL) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08002731 RLOGE("setAllowedCarriers: Memory allocation failed for request %s",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002732 requestToString(pRI->pCI->requestNumber));
Jack Yuffc06452017-02-13 11:21:00 -08002733 sendErrorResponse(pRI, RIL_E_NO_MEMORY);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002734#ifdef MEMSET_FREED
2735 memset(allowedCarriers, 0, cr.len_allowed_carriers * sizeof(RIL_Carrier));
2736#endif
2737 free(allowedCarriers);
2738 return Void();
2739 }
2740 cr.excluded_carriers = excludedCarriers;
2741
2742 for (int i = 0; i < cr.len_allowed_carriers; i++) {
Scott Randolphc7213312017-04-03 14:06:40 -07002743 allowedCarriers[i].mcc = carriers.allowedCarriers[i].mcc.c_str();
2744 allowedCarriers[i].mnc = carriers.allowedCarriers[i].mnc.c_str();
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002745 allowedCarriers[i].match_type = (RIL_CarrierMatchType) carriers.allowedCarriers[i].matchType;
Scott Randolphc7213312017-04-03 14:06:40 -07002746 allowedCarriers[i].match_data = carriers.allowedCarriers[i].matchData.c_str();
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002747 }
2748
Amit Mahajan3f510f62017-03-01 10:26:58 -08002749 for (int i = 0; i < cr.len_excluded_carriers; i++) {
Scott Randolphc7213312017-04-03 14:06:40 -07002750 excludedCarriers[i].mcc = carriers.excludedCarriers[i].mcc.c_str();
2751 excludedCarriers[i].mnc = carriers.excludedCarriers[i].mnc.c_str();
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002752 excludedCarriers[i].match_type =
2753 (RIL_CarrierMatchType) carriers.excludedCarriers[i].matchType;
Scott Randolphc7213312017-04-03 14:06:40 -07002754 excludedCarriers[i].match_data = carriers.excludedCarriers[i].matchData.c_str();
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002755 }
2756
Amit Mahajanb3a11bb2017-05-15 16:41:44 -07002757 CALL_ONREQUEST(pRI->pCI->requestNumber, &cr, sizeof(RIL_CarrierRestrictions), pRI, mSlotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002758
2759#ifdef MEMSET_FREED
2760 memset(allowedCarriers, 0, cr.len_allowed_carriers * sizeof(RIL_Carrier));
2761 memset(excludedCarriers, 0, cr.len_excluded_carriers * sizeof(RIL_Carrier));
2762#endif
2763 free(allowedCarriers);
2764 free(excludedCarriers);
2765 return Void();
2766}
2767
2768Return<void> RadioImpl::getAllowedCarriers(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002769#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002770 RLOGD("getAllowedCarriers: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002771#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002772 dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_CARRIER_RESTRICTIONS);
2773 return Void();
2774}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002775
Jack Yu11ab4042017-02-21 17:08:01 -08002776Return<void> RadioImpl::sendDeviceState(int32_t serial, DeviceStateType deviceStateType,
2777 bool state) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002778#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002779 RLOGD("sendDeviceState: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002780#endif
Jack Yu11ab4042017-02-21 17:08:01 -08002781 if (s_vendorFunctions->version < 15) {
2782 if (deviceStateType == DeviceStateType::LOW_DATA_EXPECTED) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08002783 RLOGD("sendDeviceState: calling screen state %d", BOOL_TO_INT(!state));
Jack Yu11ab4042017-02-21 17:08:01 -08002784 dispatchInts(serial, mSlotId, RIL_REQUEST_SCREEN_STATE, 1, BOOL_TO_INT(!state));
2785 } else {
2786 RequestInfo *pRI = android::addRequestToList(serial, mSlotId,
2787 RIL_REQUEST_SEND_DEVICE_STATE);
2788 sendErrorResponse(pRI, RIL_E_REQUEST_NOT_SUPPORTED);
2789 }
2790 return Void();
2791 }
2792 dispatchInts(serial, mSlotId, RIL_REQUEST_SEND_DEVICE_STATE, 2, (int) deviceStateType,
2793 BOOL_TO_INT(state));
2794 return Void();
2795}
2796
2797Return<void> RadioImpl::setIndicationFilter(int32_t serial, int32_t indicationFilter) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002798#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002799 RLOGD("setIndicationFilter: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002800#endif
Jack Yu11ab4042017-02-21 17:08:01 -08002801 if (s_vendorFunctions->version < 15) {
2802 RequestInfo *pRI = android::addRequestToList(serial, mSlotId,
2803 RIL_REQUEST_SET_UNSOLICITED_RESPONSE_FILTER);
2804 sendErrorResponse(pRI, RIL_E_REQUEST_NOT_SUPPORTED);
2805 return Void();
2806 }
2807 dispatchInts(serial, mSlotId, RIL_REQUEST_SET_UNSOLICITED_RESPONSE_FILTER, 1, indicationFilter);
2808 return Void();
2809}
2810
Wileen Chiu718c0bf2017-01-04 11:37:19 -08002811Return<void> RadioImpl::setSimCardPower(int32_t serial, bool powerUp) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002812#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002813 RLOGD("setSimCardPower: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002814#endif
Wileen Chiu718c0bf2017-01-04 11:37:19 -08002815 dispatchInts(serial, mSlotId, RIL_REQUEST_SET_SIM_CARD_POWER, 1, BOOL_TO_INT(powerUp));
2816 return Void();
2817}
2818
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07002819Return<void> RadioImpl::setSimCardPower_1_1(int32_t serial, const V1_1::CardPowerState state) {
Grace Chen08eb6542017-03-23 18:39:48 -07002820#if VDBG
2821 RLOGD("setSimCardPower_1_1: serial %d state %d", serial, state);
2822#endif
2823 dispatchInts(serial, mSlotId, RIL_REQUEST_SET_SIM_CARD_POWER, 1, state);
2824 return Void();
2825}
2826
Nathan Harold6a8809d2017-07-07 19:28:58 -07002827Return<void> RadioImpl::setCarrierInfoForImsiEncryption(int32_t serial,
2828 const V1_1::ImsiEncryptionInfo& data) {
2829#if VDBG
2830 RLOGD("setCarrierInfoForImsiEncryption: serial %d", serial);
2831#endif
2832 RequestInfo *pRI = android::addRequestToList(
2833 serial, mSlotId, RIL_REQUEST_SET_CARRIER_INFO_IMSI_ENCRYPTION);
2834 if (pRI == NULL) {
2835 return Void();
2836 }
2837
2838 RIL_CarrierInfoForImsiEncryption imsiEncryption = {};
2839
2840 if (!copyHidlStringToRil(&imsiEncryption.mnc, data.mnc, pRI)) {
2841 return Void();
2842 }
2843 if (!copyHidlStringToRil(&imsiEncryption.mcc, data.mcc, pRI)) {
2844 memsetAndFreeStrings(1, imsiEncryption.mnc);
2845 return Void();
2846 }
2847 if (!copyHidlStringToRil(&imsiEncryption.keyIdentifier, data.keyIdentifier, pRI)) {
2848 memsetAndFreeStrings(2, imsiEncryption.mnc, imsiEncryption.mcc);
2849 return Void();
2850 }
Youngrak Leee6f16f22017-12-03 10:50:37 -08002851 imsiEncryption.carrierKeyLength = data.carrierKey.size();
2852 imsiEncryption.carrierKey = new uint8_t[imsiEncryption.carrierKeyLength];
2853 memcpy(imsiEncryption.carrierKey, data.carrierKey.data(), imsiEncryption.carrierKeyLength);
Nathan Harold6a8809d2017-07-07 19:28:58 -07002854 imsiEncryption.expirationTime = data.expirationTime;
2855 CALL_ONREQUEST(pRI->pCI->requestNumber, &imsiEncryption,
2856 sizeof(RIL_CarrierInfoForImsiEncryption), pRI, mSlotId);
2857 delete(imsiEncryption.carrierKey);
2858 return Void();
2859}
2860
2861Return<void> RadioImpl::startKeepalive(int32_t serial, const V1_1::KeepaliveRequest& keepalive) {
2862#if VDBG
2863 RLOGD("%s(): %d", __FUNCTION__, serial);
2864#endif
2865 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_START_KEEPALIVE);
2866 if (pRI == NULL) {
2867 return Void();
2868 }
2869
2870 RIL_KeepaliveRequest kaReq = {};
2871
2872 kaReq.type = static_cast<RIL_KeepaliveType>(keepalive.type);
2873 switch(kaReq.type) {
2874 case NATT_IPV4:
2875 if (keepalive.sourceAddress.size() != 4 ||
2876 keepalive.destinationAddress.size() != 4) {
2877 RLOGE("Invalid address for keepalive!");
2878 sendErrorResponse(pRI, RIL_E_INVALID_ARGUMENTS);
2879 return Void();
2880 }
2881 break;
2882 case NATT_IPV6:
2883 if (keepalive.sourceAddress.size() != 16 ||
2884 keepalive.destinationAddress.size() != 16) {
2885 RLOGE("Invalid address for keepalive!");
2886 sendErrorResponse(pRI, RIL_E_INVALID_ARGUMENTS);
2887 return Void();
2888 }
2889 break;
2890 default:
2891 RLOGE("Unknown packet keepalive type!");
2892 sendErrorResponse(pRI, RIL_E_INVALID_ARGUMENTS);
2893 return Void();
2894 }
2895
2896 ::memcpy(kaReq.sourceAddress, keepalive.sourceAddress.data(), keepalive.sourceAddress.size());
2897 kaReq.sourcePort = keepalive.sourcePort;
2898
2899 ::memcpy(kaReq.destinationAddress,
2900 keepalive.destinationAddress.data(), keepalive.destinationAddress.size());
2901 kaReq.destinationPort = keepalive.destinationPort;
2902
2903 kaReq.maxKeepaliveIntervalMillis = keepalive.maxKeepaliveIntervalMillis;
2904 kaReq.cid = keepalive.cid; // This is the context ID of the data call
2905
2906 CALL_ONREQUEST(pRI->pCI->requestNumber, &kaReq, sizeof(RIL_KeepaliveRequest), pRI, mSlotId);
2907 return Void();
2908}
2909
2910Return<void> RadioImpl::stopKeepalive(int32_t serial, int32_t sessionHandle) {
2911#if VDBG
2912 RLOGD("%s(): %d", __FUNCTION__, serial);
2913#endif
2914 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_STOP_KEEPALIVE);
2915 if (pRI == NULL) {
2916 return Void();
2917 }
2918
2919 CALL_ONREQUEST(pRI->pCI->requestNumber, &sessionHandle, sizeof(uint32_t), pRI, mSlotId);
2920 return Void();
2921}
2922
Sanket Padawef220dc52017-01-02 23:46:00 -08002923Return<void> RadioImpl::responseAcknowledgement() {
2924 android::releaseWakeLock();
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002925 return Void();
Sanket Padawef220dc52017-01-02 23:46:00 -08002926}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002927
Amit Mahajan439da362017-02-13 17:43:04 -08002928Return<void> OemHookImpl::setResponseFunctions(
2929 const ::android::sp<IOemHookResponse>& oemHookResponseParam,
2930 const ::android::sp<IOemHookIndication>& oemHookIndicationParam) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002931#if VDBG
Amit Mahajan439da362017-02-13 17:43:04 -08002932 RLOGD("OemHookImpl::setResponseFunctions");
Jayachandran C572f2f42017-03-25 14:30:13 -07002933#endif
Amit Mahajan439da362017-02-13 17:43:04 -08002934
2935 pthread_rwlock_t *radioServiceRwlockPtr = radio::getRadioServiceRwlock(mSlotId);
2936 int ret = pthread_rwlock_wrlock(radioServiceRwlockPtr);
2937 assert(ret == 0);
2938
2939 mOemHookResponse = oemHookResponseParam;
2940 mOemHookIndication = oemHookIndicationParam;
Amit Mahajand423d192017-03-16 17:04:01 -07002941 mCounterOemHook[mSlotId]++;
Amit Mahajan439da362017-02-13 17:43:04 -08002942
2943 ret = pthread_rwlock_unlock(radioServiceRwlockPtr);
2944 assert(ret == 0);
2945
2946 return Void();
2947}
2948
2949Return<void> OemHookImpl::sendRequestRaw(int32_t serial, const hidl_vec<uint8_t>& data) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002950#if VDBG
Amit Mahajan439da362017-02-13 17:43:04 -08002951 RLOGD("OemHookImpl::sendRequestRaw: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002952#endif
Amit Mahajan439da362017-02-13 17:43:04 -08002953 dispatchRaw(serial, mSlotId, RIL_REQUEST_OEM_HOOK_RAW, data);
2954 return Void();
2955}
2956
2957Return<void> OemHookImpl::sendRequestStrings(int32_t serial,
2958 const hidl_vec<hidl_string>& data) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002959#if VDBG
Amit Mahajan439da362017-02-13 17:43:04 -08002960 RLOGD("OemHookImpl::sendRequestStrings: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002961#endif
Amit Mahajan439da362017-02-13 17:43:04 -08002962 dispatchStrings(serial, mSlotId, RIL_REQUEST_OEM_HOOK_STRINGS, data);
2963 return Void();
2964}
2965
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002966/***************************************************************************************************
2967 * RESPONSE FUNCTIONS
2968 * Functions above are used for requests going from framework to vendor code. The ones below are
2969 * responses for those requests coming back from the vendor code.
2970 **************************************************************************************************/
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002971
Sanket Padawef220dc52017-01-02 23:46:00 -08002972void radio::acknowledgeRequest(int slotId, int serial) {
2973 if (radioService[slotId]->mRadioResponse != NULL) {
Amit Mahajan17249842017-01-19 15:05:45 -08002974 Return<void> retStatus = radioService[slotId]->mRadioResponse->acknowledgeRequest(serial);
2975 radioService[slotId]->checkReturnStatus(retStatus);
Sanket Padawef220dc52017-01-02 23:46:00 -08002976 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08002977 RLOGE("acknowledgeRequest: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawef220dc52017-01-02 23:46:00 -08002978 }
2979}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002980
Sanket Padawef220dc52017-01-02 23:46:00 -08002981void populateResponseInfo(RadioResponseInfo& responseInfo, int serial, int responseType,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002982 RIL_Errno e) {
Sanket Padawef220dc52017-01-02 23:46:00 -08002983 responseInfo.serial = serial;
2984 switch (responseType) {
2985 case RESPONSE_SOLICITED:
2986 responseInfo.type = RadioResponseType::SOLICITED;
2987 break;
2988 case RESPONSE_SOLICITED_ACK_EXP:
2989 responseInfo.type = RadioResponseType::SOLICITED_ACK_EXP;
2990 break;
2991 }
2992 responseInfo.error = (RadioError) e;
2993}
2994
Naveen Kalla346bbc02017-03-16 12:55:55 -07002995int responseIntOrEmpty(RadioResponseInfo& responseInfo, int serial, int responseType, RIL_Errno e,
2996 void *response, size_t responseLen) {
2997 populateResponseInfo(responseInfo, serial, responseType, e);
2998 int ret = -1;
2999
3000 if (response == NULL && responseLen == 0) {
3001 // Earlier RILs did not send a response for some cases although the interface
3002 // expected an integer as response. Do not return error if response is empty. Instead
3003 // Return -1 in those cases to maintain backward compatibility.
3004 } else if (response == NULL || responseLen != sizeof(int)) {
3005 RLOGE("responseIntOrEmpty: Invalid response");
3006 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
3007 } else {
3008 int *p_int = (int *) response;
3009 ret = p_int[0];
3010 }
3011 return ret;
3012}
3013
Sanket Padawef220dc52017-01-02 23:46:00 -08003014int responseInt(RadioResponseInfo& responseInfo, int serial, int responseType, RIL_Errno e,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003015 void *response, size_t responseLen) {
Sanket Padawef220dc52017-01-02 23:46:00 -08003016 populateResponseInfo(responseInfo, serial, responseType, e);
3017 int ret = -1;
3018
3019 if (response == NULL || responseLen != sizeof(int)) {
3020 RLOGE("responseInt: Invalid response");
3021 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
3022 } else {
3023 int *p_int = (int *) response;
3024 ret = p_int[0];
3025 }
3026 return ret;
3027}
3028
Amit Mahajan759786a2017-03-03 17:35:47 -08003029int radio::getIccCardStatusResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003030 int responseType, int serial, RIL_Errno e,
3031 void *response, size_t responseLen) {
Sanket Padawef220dc52017-01-02 23:46:00 -08003032 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003033 RadioResponseInfo responseInfo = {};
Sanket Padawef220dc52017-01-02 23:46:00 -08003034 populateResponseInfo(responseInfo, serial, responseType, e);
Ryuto Sawada1879d102017-07-21 23:18:50 +09003035 CardStatus cardStatus = {CardState::ABSENT, PinState::UNKNOWN, -1, -1, -1, {}};
Nathan Harold7da5dd62017-06-08 16:41:52 -07003036 RIL_CardStatus_v6 *p_cur = ((RIL_CardStatus_v6 *) response);
3037 if (response == NULL || responseLen != sizeof(RIL_CardStatus_v6)
3038 || p_cur->gsm_umts_subscription_app_index >= p_cur->num_applications
3039 || p_cur->cdma_subscription_app_index >= p_cur->num_applications
3040 || p_cur->ims_subscription_app_index >= p_cur->num_applications) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003041 RLOGE("getIccCardStatusResponse: Invalid response");
Sanket Padawef220dc52017-01-02 23:46:00 -08003042 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
Amit Mahajancd77a5b2016-08-25 11:19:21 -07003043 } else {
Amit Mahajancd77a5b2016-08-25 11:19:21 -07003044 cardStatus.cardState = (CardState) p_cur->card_state;
3045 cardStatus.universalPinState = (PinState) p_cur->universal_pin_state;
3046 cardStatus.gsmUmtsSubscriptionAppIndex = p_cur->gsm_umts_subscription_app_index;
3047 cardStatus.cdmaSubscriptionAppIndex = p_cur->cdma_subscription_app_index;
3048 cardStatus.imsSubscriptionAppIndex = p_cur->ims_subscription_app_index;
3049
3050 RIL_AppStatus *rilAppStatus = p_cur->applications;
3051 cardStatus.applications.resize(p_cur->num_applications);
3052 AppStatus *appStatus = cardStatus.applications.data();
Jayachandran C572f2f42017-03-25 14:30:13 -07003053#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003054 RLOGD("getIccCardStatusResponse: num_applications %d", p_cur->num_applications);
Jayachandran C572f2f42017-03-25 14:30:13 -07003055#endif
Amit Mahajancd77a5b2016-08-25 11:19:21 -07003056 for (int i = 0; i < p_cur->num_applications; i++) {
3057 appStatus[i].appType = (AppType) rilAppStatus[i].app_type;
3058 appStatus[i].appState = (AppState) rilAppStatus[i].app_state;
3059 appStatus[i].persoSubstate = (PersoSubstate) rilAppStatus[i].perso_substate;
3060 appStatus[i].aidPtr = convertCharPtrToHidlString(rilAppStatus[i].aid_ptr);
3061 appStatus[i].appLabelPtr = convertCharPtrToHidlString(
3062 rilAppStatus[i].app_label_ptr);
3063 appStatus[i].pin1Replaced = rilAppStatus[i].pin1_replaced;
3064 appStatus[i].pin1 = (PinState) rilAppStatus[i].pin1;
3065 appStatus[i].pin2 = (PinState) rilAppStatus[i].pin2;
3066 }
3067 }
3068
Amit Mahajan17249842017-01-19 15:05:45 -08003069 Return<void> retStatus = radioService[slotId]->mRadioResponse->
3070 getIccCardStatusResponse(responseInfo, cardStatus);
3071 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajancd77a5b2016-08-25 11:19:21 -07003072 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003073 RLOGE("getIccCardStatusResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawef220dc52017-01-02 23:46:00 -08003074 }
3075
3076 return 0;
3077}
3078
Amit Mahajan759786a2017-03-03 17:35:47 -08003079int radio::supplyIccPinForAppResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003080 int responseType, int serial, RIL_Errno e,
3081 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003082#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003083 RLOGD("supplyIccPinForAppResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003084#endif
Sanket Padawef220dc52017-01-02 23:46:00 -08003085
3086 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003087 RadioResponseInfo responseInfo = {};
Naveen Kalla346bbc02017-03-16 12:55:55 -07003088 int ret = responseIntOrEmpty(responseInfo, serial, responseType, e, response, responseLen);
Amit Mahajan17249842017-01-19 15:05:45 -08003089 Return<void> retStatus = radioService[slotId]->mRadioResponse->
3090 supplyIccPinForAppResponse(responseInfo, ret);
Amit Mahajanb3a11bb2017-05-15 16:41:44 -07003091 RLOGE("supplyIccPinForAppResponse: amit ret %d", ret);
Amit Mahajan17249842017-01-19 15:05:45 -08003092 radioService[slotId]->checkReturnStatus(retStatus);
Sanket Padawef220dc52017-01-02 23:46:00 -08003093 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003094 RLOGE("supplyIccPinForAppResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawef220dc52017-01-02 23:46:00 -08003095 slotId);
3096 }
3097
3098 return 0;
3099}
3100
Amit Mahajan759786a2017-03-03 17:35:47 -08003101int radio::supplyIccPukForAppResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003102 int responseType, int serial, RIL_Errno e,
3103 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003104#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003105 RLOGD("supplyIccPukForAppResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003106#endif
Sanket Padawef220dc52017-01-02 23:46:00 -08003107
3108 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003109 RadioResponseInfo responseInfo = {};
Naveen Kalla346bbc02017-03-16 12:55:55 -07003110 int ret = responseIntOrEmpty(responseInfo, serial, responseType, e, response, responseLen);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003111 Return<void> retStatus = radioService[slotId]->mRadioResponse->supplyIccPukForAppResponse(
3112 responseInfo, ret);
Amit Mahajan17249842017-01-19 15:05:45 -08003113 radioService[slotId]->checkReturnStatus(retStatus);
Sanket Padawef220dc52017-01-02 23:46:00 -08003114 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003115 RLOGE("supplyIccPukForAppResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawef220dc52017-01-02 23:46:00 -08003116 slotId);
3117 }
3118
3119 return 0;
3120}
3121
Amit Mahajan759786a2017-03-03 17:35:47 -08003122int radio::supplyIccPin2ForAppResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003123 int responseType, int serial, RIL_Errno e,
3124 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003125#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003126 RLOGD("supplyIccPin2ForAppResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003127#endif
Sanket Padawef220dc52017-01-02 23:46:00 -08003128
3129 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003130 RadioResponseInfo responseInfo = {};
Naveen Kalla346bbc02017-03-16 12:55:55 -07003131 int ret = responseIntOrEmpty(responseInfo, serial, responseType, e, response, responseLen);
Amit Mahajan17249842017-01-19 15:05:45 -08003132 Return<void> retStatus = radioService[slotId]->mRadioResponse->
3133 supplyIccPin2ForAppResponse(responseInfo, ret);
3134 radioService[slotId]->checkReturnStatus(retStatus);
Sanket Padawef220dc52017-01-02 23:46:00 -08003135 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003136 RLOGE("supplyIccPin2ForAppResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawef220dc52017-01-02 23:46:00 -08003137 slotId);
3138 }
3139
3140 return 0;
3141}
3142
Amit Mahajan759786a2017-03-03 17:35:47 -08003143int radio::supplyIccPuk2ForAppResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003144 int responseType, int serial, RIL_Errno e,
3145 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003146#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003147 RLOGD("supplyIccPuk2ForAppResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003148#endif
Sanket Padawef220dc52017-01-02 23:46:00 -08003149
3150 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003151 RadioResponseInfo responseInfo = {};
Naveen Kalla346bbc02017-03-16 12:55:55 -07003152 int ret = responseIntOrEmpty(responseInfo, serial, responseType, e, response, responseLen);
Amit Mahajan17249842017-01-19 15:05:45 -08003153 Return<void> retStatus = radioService[slotId]->mRadioResponse->
3154 supplyIccPuk2ForAppResponse(responseInfo, ret);
3155 radioService[slotId]->checkReturnStatus(retStatus);
Sanket Padawef220dc52017-01-02 23:46:00 -08003156 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003157 RLOGE("supplyIccPuk2ForAppResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawef220dc52017-01-02 23:46:00 -08003158 slotId);
3159 }
3160
3161 return 0;
3162}
3163
Amit Mahajan759786a2017-03-03 17:35:47 -08003164int radio::changeIccPinForAppResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003165 int responseType, int serial, RIL_Errno e,
3166 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003167#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003168 RLOGD("changeIccPinForAppResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003169#endif
Sanket Padawef220dc52017-01-02 23:46:00 -08003170
3171 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003172 RadioResponseInfo responseInfo = {};
Naveen Kalla346bbc02017-03-16 12:55:55 -07003173 int ret = responseIntOrEmpty(responseInfo, serial, responseType, e, response, responseLen);
Amit Mahajan17249842017-01-19 15:05:45 -08003174 Return<void> retStatus = radioService[slotId]->mRadioResponse->
3175 changeIccPinForAppResponse(responseInfo, ret);
3176 radioService[slotId]->checkReturnStatus(retStatus);
Sanket Padawef220dc52017-01-02 23:46:00 -08003177 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003178 RLOGE("changeIccPinForAppResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawef220dc52017-01-02 23:46:00 -08003179 slotId);
3180 }
3181
3182 return 0;
3183}
3184
Amit Mahajan759786a2017-03-03 17:35:47 -08003185int radio::changeIccPin2ForAppResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003186 int responseType, int serial, RIL_Errno e,
3187 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003188#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003189 RLOGD("changeIccPin2ForAppResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003190#endif
Sanket Padawef220dc52017-01-02 23:46:00 -08003191
3192 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003193 RadioResponseInfo responseInfo = {};
Naveen Kalla346bbc02017-03-16 12:55:55 -07003194 int ret = responseIntOrEmpty(responseInfo, serial, responseType, e, response, responseLen);
Amit Mahajan17249842017-01-19 15:05:45 -08003195 Return<void> retStatus = radioService[slotId]->mRadioResponse->
3196 changeIccPin2ForAppResponse(responseInfo, ret);
3197 radioService[slotId]->checkReturnStatus(retStatus);
Sanket Padawef220dc52017-01-02 23:46:00 -08003198 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003199 RLOGE("changeIccPin2ForAppResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawef220dc52017-01-02 23:46:00 -08003200 slotId);
3201 }
3202
3203 return 0;
3204}
3205
Amit Mahajan759786a2017-03-03 17:35:47 -08003206int radio::supplyNetworkDepersonalizationResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003207 int responseType, int serial, RIL_Errno e,
3208 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003209#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003210 RLOGD("supplyNetworkDepersonalizationResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003211#endif
Sanket Padawef220dc52017-01-02 23:46:00 -08003212
3213 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003214 RadioResponseInfo responseInfo = {};
Naveen Kalla346bbc02017-03-16 12:55:55 -07003215 int ret = responseIntOrEmpty(responseInfo, serial, responseType, e, response, responseLen);
Amit Mahajan17249842017-01-19 15:05:45 -08003216 Return<void> retStatus = radioService[slotId]->mRadioResponse->
3217 supplyNetworkDepersonalizationResponse(responseInfo, ret);
3218 radioService[slotId]->checkReturnStatus(retStatus);
Sanket Padawef220dc52017-01-02 23:46:00 -08003219 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003220 RLOGE("supplyNetworkDepersonalizationResponse: radioService[%d]->mRadioResponse == "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003221 "NULL", slotId);
Sanket Padawef220dc52017-01-02 23:46:00 -08003222 }
3223
3224 return 0;
3225}
3226
Amit Mahajan759786a2017-03-03 17:35:47 -08003227int radio::getCurrentCallsResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003228 int responseType, int serial, RIL_Errno e,
3229 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003230#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003231 RLOGD("getCurrentCallsResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003232#endif
Sanket Padawef220dc52017-01-02 23:46:00 -08003233
3234 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003235 RadioResponseInfo responseInfo = {};
Sanket Padawef220dc52017-01-02 23:46:00 -08003236 populateResponseInfo(responseInfo, serial, responseType, e);
3237
3238 hidl_vec<Call> calls;
Amit Mahajan13058cb2017-06-07 23:10:27 -07003239 if ((response == NULL && responseLen != 0)
3240 || (responseLen % sizeof(RIL_Call *)) != 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003241 RLOGE("getCurrentCallsResponse: Invalid response");
Amit Mahajan5829a472016-12-28 17:28:07 -08003242 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
Sanket Padawef220dc52017-01-02 23:46:00 -08003243 } else {
3244 int num = responseLen / sizeof(RIL_Call *);
3245 calls.resize(num);
3246
3247 for (int i = 0 ; i < num ; i++) {
3248 RIL_Call *p_cur = ((RIL_Call **) response)[i];
3249 /* each call info */
3250 calls[i].state = (CallState) p_cur->state;
3251 calls[i].index = p_cur->index;
3252 calls[i].toa = p_cur->toa;
3253 calls[i].isMpty = p_cur->isMpty;
3254 calls[i].isMT = p_cur->isMT;
3255 calls[i].als = p_cur->als;
3256 calls[i].isVoice = p_cur->isVoice;
3257 calls[i].isVoicePrivacy = p_cur->isVoicePrivacy;
3258 calls[i].number = convertCharPtrToHidlString(p_cur->number);
3259 calls[i].numberPresentation = (CallPresentation) p_cur->numberPresentation;
3260 calls[i].name = convertCharPtrToHidlString(p_cur->name);
3261 calls[i].namePresentation = (CallPresentation) p_cur->namePresentation;
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003262 if (p_cur->uusInfo != NULL && p_cur->uusInfo->uusData != NULL) {
Sanket Padawef220dc52017-01-02 23:46:00 -08003263 RIL_UUS_Info *uusInfo = p_cur->uusInfo;
Ajay Nambi83e7acd2017-09-05 15:06:22 +05303264 calls[i].uusInfo.resize(1);
Sanket Padawef220dc52017-01-02 23:46:00 -08003265 calls[i].uusInfo[0].uusType = (UusType) uusInfo->uusType;
3266 calls[i].uusInfo[0].uusDcs = (UusDcs) uusInfo->uusDcs;
3267 // convert uusInfo->uusData to a null-terminated string
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003268 char *nullTermStr = strndup(uusInfo->uusData, uusInfo->uusLength);
3269 calls[i].uusInfo[0].uusData = nullTermStr;
3270 free(nullTermStr);
Sanket Padawef220dc52017-01-02 23:46:00 -08003271 }
3272 }
3273 }
3274
Amit Mahajan17249842017-01-19 15:05:45 -08003275 Return<void> retStatus = radioService[slotId]->mRadioResponse->
3276 getCurrentCallsResponse(responseInfo, calls);
3277 radioService[slotId]->checkReturnStatus(retStatus);
Sanket Padawef220dc52017-01-02 23:46:00 -08003278 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003279 RLOGE("getCurrentCallsResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawef220dc52017-01-02 23:46:00 -08003280 }
3281
3282 return 0;
3283}
3284
Amit Mahajan759786a2017-03-03 17:35:47 -08003285int radio::dialResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003286 int responseType, int serial, RIL_Errno e, void *response,
3287 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003288#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003289 RLOGD("dialResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003290#endif
Sanket Padawef220dc52017-01-02 23:46:00 -08003291
3292 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003293 RadioResponseInfo responseInfo = {};
Sanket Padawef220dc52017-01-02 23:46:00 -08003294 populateResponseInfo(responseInfo, serial, responseType, e);
Amit Mahajan17249842017-01-19 15:05:45 -08003295 Return<void> retStatus = radioService[slotId]->mRadioResponse->dialResponse(responseInfo);
3296 radioService[slotId]->checkReturnStatus(retStatus);
Sanket Padawef220dc52017-01-02 23:46:00 -08003297 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003298 RLOGE("dialResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Amit Mahajancd77a5b2016-08-25 11:19:21 -07003299 }
3300
3301 return 0;
3302}
3303
Amit Mahajan759786a2017-03-03 17:35:47 -08003304int radio::getIMSIForAppResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003305 int responseType, int serial, RIL_Errno e, void *response,
3306 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003307#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003308 RLOGD("getIMSIForAppResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003309#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003310
3311 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003312 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003313 populateResponseInfo(responseInfo, serial, responseType, e);
3314 Return<void> retStatus = radioService[slotId]->mRadioResponse->getIMSIForAppResponse(
3315 responseInfo, convertCharPtrToHidlString((char *) response));
3316 radioService[slotId]->checkReturnStatus(retStatus);
3317 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003318 RLOGE("getIMSIForAppResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003319 slotId);
3320 }
3321
3322 return 0;
3323}
3324
Amit Mahajan759786a2017-03-03 17:35:47 -08003325int radio::hangupConnectionResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003326 int responseType, int serial, RIL_Errno e,
3327 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003328#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003329 RLOGD("hangupConnectionResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003330#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003331
3332 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003333 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003334 populateResponseInfo(responseInfo, serial, responseType, e);
3335 Return<void> retStatus = radioService[slotId]->mRadioResponse->hangupConnectionResponse(
3336 responseInfo);
3337 radioService[slotId]->checkReturnStatus(retStatus);
3338 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003339 RLOGE("hangupConnectionResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003340 slotId);
3341 }
3342
3343 return 0;
3344}
3345
Amit Mahajan759786a2017-03-03 17:35:47 -08003346int radio::hangupWaitingOrBackgroundResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003347 int responseType, int serial, RIL_Errno e,
3348 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003349#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003350 RLOGD("hangupWaitingOrBackgroundResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003351#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003352
3353 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003354 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003355 populateResponseInfo(responseInfo, serial, responseType, e);
3356 Return<void> retStatus =
3357 radioService[slotId]->mRadioResponse->hangupWaitingOrBackgroundResponse(
3358 responseInfo);
3359 radioService[slotId]->checkReturnStatus(retStatus);
3360 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003361 RLOGE("hangupWaitingOrBackgroundResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003362 slotId);
3363 }
3364
3365 return 0;
3366}
3367
Amit Mahajan759786a2017-03-03 17:35:47 -08003368int radio::hangupForegroundResumeBackgroundResponse(int slotId, int responseType, int serial,
3369 RIL_Errno e, void *response,
3370 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003371#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003372 RLOGD("hangupWaitingOrBackgroundResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003373#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003374
3375 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003376 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003377 populateResponseInfo(responseInfo, serial, responseType, e);
3378 Return<void> retStatus =
3379 radioService[slotId]->mRadioResponse->hangupWaitingOrBackgroundResponse(
3380 responseInfo);
3381 radioService[slotId]->checkReturnStatus(retStatus);
3382 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003383 RLOGE("hangupWaitingOrBackgroundResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003384 slotId);
3385 }
3386
3387 return 0;
3388}
3389
Amit Mahajan759786a2017-03-03 17:35:47 -08003390int radio::switchWaitingOrHoldingAndActiveResponse(int slotId, int responseType, int serial,
3391 RIL_Errno e, void *response,
3392 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003393#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003394 RLOGD("switchWaitingOrHoldingAndActiveResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003395#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003396
3397 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003398 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003399 populateResponseInfo(responseInfo, serial, responseType, e);
3400 Return<void> retStatus =
3401 radioService[slotId]->mRadioResponse->switchWaitingOrHoldingAndActiveResponse(
3402 responseInfo);
3403 radioService[slotId]->checkReturnStatus(retStatus);
3404 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003405 RLOGE("switchWaitingOrHoldingAndActiveResponse: radioService[%d]->mRadioResponse "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003406 "== NULL", slotId);
3407 }
3408
3409 return 0;
3410}
3411
Amit Mahajan759786a2017-03-03 17:35:47 -08003412int radio::conferenceResponse(int slotId, int responseType,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003413 int serial, RIL_Errno e, void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003414#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003415 RLOGD("conferenceResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003416#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003417
3418 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003419 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003420 populateResponseInfo(responseInfo, serial, responseType, e);
3421 Return<void> retStatus = radioService[slotId]->mRadioResponse->conferenceResponse(
3422 responseInfo);
3423 radioService[slotId]->checkReturnStatus(retStatus);
3424 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003425 RLOGE("conferenceResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003426 slotId);
3427 }
3428
3429 return 0;
3430}
3431
Amit Mahajan759786a2017-03-03 17:35:47 -08003432int radio::rejectCallResponse(int slotId, int responseType,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003433 int serial, RIL_Errno e, void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003434#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003435 RLOGD("rejectCallResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003436#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003437
3438 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003439 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003440 populateResponseInfo(responseInfo, serial, responseType, e);
3441 Return<void> retStatus = radioService[slotId]->mRadioResponse->rejectCallResponse(
3442 responseInfo);
3443 radioService[slotId]->checkReturnStatus(retStatus);
3444 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003445 RLOGE("rejectCallResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003446 slotId);
3447 }
3448
3449 return 0;
3450}
3451
Amit Mahajan759786a2017-03-03 17:35:47 -08003452int radio::getLastCallFailCauseResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003453 int responseType, int serial, RIL_Errno e, void *response,
3454 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003455#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003456 RLOGD("getLastCallFailCauseResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003457#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003458
3459 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003460 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003461 populateResponseInfo(responseInfo, serial, responseType, e);
Jack Yuf68e0da2017-02-07 14:53:09 -08003462
3463 LastCallFailCauseInfo info = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003464 info.vendorCause = hidl_string();
3465 if (response == NULL) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003466 RLOGE("getCurrentCallsResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003467 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
3468 } else if (responseLen == sizeof(int)) {
3469 int *pInt = (int *) response;
3470 info.causeCode = (LastCallFailCause) pInt[0];
3471 } else if (responseLen == sizeof(RIL_LastCallFailCauseInfo)) {
3472 RIL_LastCallFailCauseInfo *pFailCauseInfo = (RIL_LastCallFailCauseInfo *) response;
3473 info.causeCode = (LastCallFailCause) pFailCauseInfo->cause_code;
3474 info.vendorCause = convertCharPtrToHidlString(pFailCauseInfo->vendor_cause);
3475 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003476 RLOGE("getCurrentCallsResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003477 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
3478 }
3479
3480 Return<void> retStatus = radioService[slotId]->mRadioResponse->getLastCallFailCauseResponse(
3481 responseInfo, info);
3482 radioService[slotId]->checkReturnStatus(retStatus);
3483 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003484 RLOGE("getLastCallFailCauseResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003485 slotId);
3486 }
3487
3488 return 0;
3489}
3490
Amit Mahajan759786a2017-03-03 17:35:47 -08003491int radio::getSignalStrengthResponse(int slotId,
Amit Mahajan3df62912017-02-10 01:35:55 +00003492 int responseType, int serial, RIL_Errno e,
3493 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003494#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003495 RLOGD("getSignalStrengthResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003496#endif
Amit Mahajan3df62912017-02-10 01:35:55 +00003497
3498 if (radioService[slotId]->mRadioResponse != NULL) {
Amit Mahajan3da9ac02017-02-13 13:41:28 -08003499 RadioResponseInfo responseInfo = {};
Amit Mahajan3df62912017-02-10 01:35:55 +00003500 populateResponseInfo(responseInfo, serial, responseType, e);
Amit Mahajan3da9ac02017-02-13 13:41:28 -08003501 SignalStrength signalStrength = {};
Amit Mahajan3df62912017-02-10 01:35:55 +00003502 if (response == NULL || responseLen != sizeof(RIL_SignalStrength_v10)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003503 RLOGE("getSignalStrengthResponse: Invalid response");
Amit Mahajan3df62912017-02-10 01:35:55 +00003504 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
3505 } else {
3506 convertRilSignalStrengthToHal(response, responseLen, signalStrength);
3507 }
3508
3509 Return<void> retStatus = radioService[slotId]->mRadioResponse->getSignalStrengthResponse(
3510 responseInfo, signalStrength);
3511 radioService[slotId]->checkReturnStatus(retStatus);
3512 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003513 RLOGE("getSignalStrengthResponse: radioService[%d]->mRadioResponse == NULL",
Amit Mahajan3df62912017-02-10 01:35:55 +00003514 slotId);
3515 }
3516
3517 return 0;
3518}
3519
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003520RIL_CellInfoType getCellInfoTypeRadioTechnology(char *rat) {
3521 if (rat == NULL) {
3522 return RIL_CELL_INFO_TYPE_NONE;
3523 }
3524
3525 int radioTech = atoi(rat);
3526
3527 switch(radioTech) {
3528
3529 case RADIO_TECH_GPRS:
3530 case RADIO_TECH_EDGE:
3531 case RADIO_TECH_GSM: {
3532 return RIL_CELL_INFO_TYPE_GSM;
3533 }
3534
3535 case RADIO_TECH_UMTS:
3536 case RADIO_TECH_HSDPA:
3537 case RADIO_TECH_HSUPA:
3538 case RADIO_TECH_HSPA:
3539 case RADIO_TECH_HSPAP: {
3540 return RIL_CELL_INFO_TYPE_WCDMA;
3541 }
3542
3543 case RADIO_TECH_IS95A:
3544 case RADIO_TECH_IS95B:
3545 case RADIO_TECH_1xRTT:
3546 case RADIO_TECH_EVDO_0:
3547 case RADIO_TECH_EVDO_A:
3548 case RADIO_TECH_EVDO_B:
3549 case RADIO_TECH_EHRPD: {
3550 return RIL_CELL_INFO_TYPE_CDMA;
3551 }
3552
3553 case RADIO_TECH_LTE:
3554 case RADIO_TECH_LTE_CA: {
3555 return RIL_CELL_INFO_TYPE_LTE;
3556 }
3557
3558 case RADIO_TECH_TD_SCDMA: {
3559 return RIL_CELL_INFO_TYPE_TD_SCDMA;
3560 }
3561
3562 default: {
3563 break;
3564 }
3565 }
3566
3567 return RIL_CELL_INFO_TYPE_NONE;
3568
3569}
3570
3571void fillCellIdentityResponse(CellIdentity &cellIdentity, RIL_CellIdentity_v16 &rilCellIdentity) {
3572
3573 cellIdentity.cellIdentityGsm.resize(0);
3574 cellIdentity.cellIdentityWcdma.resize(0);
3575 cellIdentity.cellIdentityCdma.resize(0);
3576 cellIdentity.cellIdentityTdscdma.resize(0);
3577 cellIdentity.cellIdentityLte.resize(0);
3578 cellIdentity.cellInfoType = (CellInfoType)rilCellIdentity.cellInfoType;
3579 switch(rilCellIdentity.cellInfoType) {
3580
3581 case RIL_CELL_INFO_TYPE_GSM: {
3582 cellIdentity.cellIdentityGsm.resize(1);
3583 cellIdentity.cellIdentityGsm[0].mcc =
3584 std::to_string(rilCellIdentity.cellIdentityGsm.mcc);
3585 cellIdentity.cellIdentityGsm[0].mnc =
Nathan Harold98cfcee2018-08-20 11:38:27 -07003586 ril::util::mnc::decode(rilCellIdentity.cellIdentityGsm.mnc);
Gohulan Balachandran453c8352019-02-05 11:20:46 -08003587
3588 if (cellIdentity.cellIdentityGsm[0].mcc == "-1") {
3589 cellIdentity.cellIdentityGsm[0].mcc = "";
3590 }
3591
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003592 cellIdentity.cellIdentityGsm[0].lac = rilCellIdentity.cellIdentityGsm.lac;
3593 cellIdentity.cellIdentityGsm[0].cid = rilCellIdentity.cellIdentityGsm.cid;
3594 cellIdentity.cellIdentityGsm[0].arfcn = rilCellIdentity.cellIdentityGsm.arfcn;
3595 cellIdentity.cellIdentityGsm[0].bsic = rilCellIdentity.cellIdentityGsm.bsic;
3596 break;
3597 }
3598
3599 case RIL_CELL_INFO_TYPE_WCDMA: {
3600 cellIdentity.cellIdentityWcdma.resize(1);
3601 cellIdentity.cellIdentityWcdma[0].mcc =
3602 std::to_string(rilCellIdentity.cellIdentityWcdma.mcc);
3603 cellIdentity.cellIdentityWcdma[0].mnc =
Nathan Harold98cfcee2018-08-20 11:38:27 -07003604 ril::util::mnc::decode(rilCellIdentity.cellIdentityWcdma.mnc);
Gohulan Balachandran453c8352019-02-05 11:20:46 -08003605
3606 if (cellIdentity.cellIdentityWcdma[0].mcc == "-1") {
3607 cellIdentity.cellIdentityWcdma[0].mcc = "";
3608 }
3609
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003610 cellIdentity.cellIdentityWcdma[0].lac = rilCellIdentity.cellIdentityWcdma.lac;
3611 cellIdentity.cellIdentityWcdma[0].cid = rilCellIdentity.cellIdentityWcdma.cid;
3612 cellIdentity.cellIdentityWcdma[0].psc = rilCellIdentity.cellIdentityWcdma.psc;
3613 cellIdentity.cellIdentityWcdma[0].uarfcn = rilCellIdentity.cellIdentityWcdma.uarfcn;
3614 break;
3615 }
3616
3617 case RIL_CELL_INFO_TYPE_CDMA: {
3618 cellIdentity.cellIdentityCdma.resize(1);
3619 cellIdentity.cellIdentityCdma[0].networkId = rilCellIdentity.cellIdentityCdma.networkId;
3620 cellIdentity.cellIdentityCdma[0].systemId = rilCellIdentity.cellIdentityCdma.systemId;
3621 cellIdentity.cellIdentityCdma[0].baseStationId =
3622 rilCellIdentity.cellIdentityCdma.basestationId;
3623 cellIdentity.cellIdentityCdma[0].longitude = rilCellIdentity.cellIdentityCdma.longitude;
3624 cellIdentity.cellIdentityCdma[0].latitude = rilCellIdentity.cellIdentityCdma.latitude;
3625 break;
3626 }
3627
3628 case RIL_CELL_INFO_TYPE_LTE: {
3629 cellIdentity.cellIdentityLte.resize(1);
3630 cellIdentity.cellIdentityLte[0].mcc =
3631 std::to_string(rilCellIdentity.cellIdentityLte.mcc);
3632 cellIdentity.cellIdentityLte[0].mnc =
Nathan Harold98cfcee2018-08-20 11:38:27 -07003633 ril::util::mnc::decode(rilCellIdentity.cellIdentityLte.mnc);
Gohulan Balachandran453c8352019-02-05 11:20:46 -08003634
3635 if (cellIdentity.cellIdentityLte[0].mcc == "-1") {
3636 cellIdentity.cellIdentityLte[0].mcc = "";
3637 }
3638
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003639 cellIdentity.cellIdentityLte[0].ci = rilCellIdentity.cellIdentityLte.ci;
3640 cellIdentity.cellIdentityLte[0].pci = rilCellIdentity.cellIdentityLte.pci;
3641 cellIdentity.cellIdentityLte[0].tac = rilCellIdentity.cellIdentityLte.tac;
3642 cellIdentity.cellIdentityLte[0].earfcn = rilCellIdentity.cellIdentityLte.earfcn;
3643 break;
3644 }
3645
3646 case RIL_CELL_INFO_TYPE_TD_SCDMA: {
3647 cellIdentity.cellIdentityTdscdma.resize(1);
3648 cellIdentity.cellIdentityTdscdma[0].mcc =
3649 std::to_string(rilCellIdentity.cellIdentityTdscdma.mcc);
3650 cellIdentity.cellIdentityTdscdma[0].mnc =
Nathan Harold98cfcee2018-08-20 11:38:27 -07003651 ril::util::mnc::decode(rilCellIdentity.cellIdentityTdscdma.mnc);
Gohulan Balachandran453c8352019-02-05 11:20:46 -08003652
3653 if (cellIdentity.cellIdentityTdscdma[0].mcc == "-1") {
3654 cellIdentity.cellIdentityTdscdma[0].mcc = "";
3655 }
3656
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003657 cellIdentity.cellIdentityTdscdma[0].lac = rilCellIdentity.cellIdentityTdscdma.lac;
3658 cellIdentity.cellIdentityTdscdma[0].cid = rilCellIdentity.cellIdentityTdscdma.cid;
3659 cellIdentity.cellIdentityTdscdma[0].cpid = rilCellIdentity.cellIdentityTdscdma.cpid;
3660 break;
3661 }
3662
3663 default: {
3664 break;
3665 }
3666 }
3667}
3668
3669int convertResponseStringEntryToInt(char **response, int index, int numStrings) {
3670 if ((response != NULL) && (numStrings > index) && (response[index] != NULL)) {
3671 return atoi(response[index]);
3672 }
3673
3674 return -1;
3675}
3676
Sooraj Sasindran758ee462017-06-07 16:30:18 -07003677int convertResponseHexStringEntryToInt(char **response, int index, int numStrings) {
3678 const int hexBase = 16;
3679 if ((response != NULL) && (numStrings > index) && (response[index] != NULL)) {
3680 return strtol(response[index], NULL, hexBase);
3681 }
3682
3683 return -1;
3684}
3685
3686/* Fill Cell Identity info from Voice Registration State Response.
3687 * This fucntion is applicable only for RIL Version < 15.
3688 * Response is a "char **".
3689 * First and Second entries are in hex string format
3690 * and rest are integers represented in ascii format. */
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003691void fillCellIdentityFromVoiceRegStateResponseString(CellIdentity &cellIdentity,
3692 int numStrings, char** response) {
3693
3694 RIL_CellIdentity_v16 rilCellIdentity;
Jack Yu8e732d42017-04-14 00:08:06 -07003695 memset(&rilCellIdentity, -1, sizeof(RIL_CellIdentity_v16));
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003696
3697 rilCellIdentity.cellInfoType = getCellInfoTypeRadioTechnology(response[3]);
3698 switch(rilCellIdentity.cellInfoType) {
3699
3700 case RIL_CELL_INFO_TYPE_GSM: {
Sooraj Sasindran758ee462017-06-07 16:30:18 -07003701 /* valid LAC are hexstrings in the range 0x0000 - 0xffff */
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003702 rilCellIdentity.cellIdentityGsm.lac =
Sooraj Sasindran758ee462017-06-07 16:30:18 -07003703 convertResponseHexStringEntryToInt(response, 1, numStrings);
3704
3705 /* valid CID are hexstrings in the range 0x00000000 - 0xffffffff */
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003706 rilCellIdentity.cellIdentityGsm.cid =
Sooraj Sasindran758ee462017-06-07 16:30:18 -07003707 convertResponseHexStringEntryToInt(response, 2, numStrings);
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003708 break;
3709 }
3710
3711 case RIL_CELL_INFO_TYPE_WCDMA: {
Sooraj Sasindran758ee462017-06-07 16:30:18 -07003712 /* valid LAC are hexstrings in the range 0x0000 - 0xffff */
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003713 rilCellIdentity.cellIdentityWcdma.lac =
Sooraj Sasindran758ee462017-06-07 16:30:18 -07003714 convertResponseHexStringEntryToInt(response, 1, numStrings);
3715
3716 /* valid CID are hexstrings in the range 0x00000000 - 0xffffffff */
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003717 rilCellIdentity.cellIdentityWcdma.cid =
Sooraj Sasindran758ee462017-06-07 16:30:18 -07003718 convertResponseHexStringEntryToInt(response, 2, numStrings);
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003719 rilCellIdentity.cellIdentityWcdma.psc =
3720 convertResponseStringEntryToInt(response, 14, numStrings);
3721 break;
3722 }
3723
3724 case RIL_CELL_INFO_TYPE_TD_SCDMA:{
Sooraj Sasindran758ee462017-06-07 16:30:18 -07003725 /* valid LAC are hexstrings in the range 0x0000 - 0xffff */
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003726 rilCellIdentity.cellIdentityTdscdma.lac =
Sooraj Sasindran758ee462017-06-07 16:30:18 -07003727 convertResponseHexStringEntryToInt(response, 1, numStrings);
3728
3729 /* valid CID are hexstrings in the range 0x00000000 - 0xffffffff */
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003730 rilCellIdentity.cellIdentityTdscdma.cid =
Sooraj Sasindran758ee462017-06-07 16:30:18 -07003731 convertResponseHexStringEntryToInt(response, 2, numStrings);
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003732 break;
3733 }
3734
3735 case RIL_CELL_INFO_TYPE_CDMA:{
3736 rilCellIdentity.cellIdentityCdma.basestationId =
3737 convertResponseStringEntryToInt(response, 4, numStrings);
Nathan Harold35afd642017-07-07 17:12:04 -07003738 /* Order of Lat. and Long. swapped between RIL and HIDL interface versions. */
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003739 rilCellIdentity.cellIdentityCdma.latitude =
Nathan Harold35afd642017-07-07 17:12:04 -07003740 convertResponseStringEntryToInt(response, 5, numStrings);
3741 rilCellIdentity.cellIdentityCdma.longitude =
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003742 convertResponseStringEntryToInt(response, 6, numStrings);
3743 rilCellIdentity.cellIdentityCdma.systemId =
3744 convertResponseStringEntryToInt(response, 8, numStrings);
3745 rilCellIdentity.cellIdentityCdma.networkId =
3746 convertResponseStringEntryToInt(response, 9, numStrings);
3747 break;
3748 }
3749
Sooraj Sasindranf28e42a2017-03-06 23:07:22 -08003750 case RIL_CELL_INFO_TYPE_LTE:{
Sooraj Sasindran758ee462017-06-07 16:30:18 -07003751 /* valid TAC are hexstrings in the range 0x0000 - 0xffff */
Sooraj Sasindranf28e42a2017-03-06 23:07:22 -08003752 rilCellIdentity.cellIdentityLte.tac =
Sooraj Sasindran758ee462017-06-07 16:30:18 -07003753 convertResponseHexStringEntryToInt(response, 1, numStrings);
3754
3755 /* valid CID are hexstrings in the range 0x00000000 - 0xffffffff */
Sooraj Sasindranf28e42a2017-03-06 23:07:22 -08003756 rilCellIdentity.cellIdentityLte.ci =
Sooraj Sasindran758ee462017-06-07 16:30:18 -07003757 convertResponseHexStringEntryToInt(response, 2, numStrings);
Sooraj Sasindranf28e42a2017-03-06 23:07:22 -08003758 break;
3759 }
3760
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003761 default: {
3762 break;
3763 }
3764 }
3765
3766 fillCellIdentityResponse(cellIdentity, rilCellIdentity);
3767}
3768
Sooraj Sasindran758ee462017-06-07 16:30:18 -07003769/* Fill Cell Identity info from Data Registration State Response.
3770 * This fucntion is applicable only for RIL Version < 15.
3771 * Response is a "char **".
3772 * First and Second entries are in hex string format
3773 * and rest are integers represented in ascii format. */
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003774void fillCellIdentityFromDataRegStateResponseString(CellIdentity &cellIdentity,
3775 int numStrings, char** response) {
3776
3777 RIL_CellIdentity_v16 rilCellIdentity;
Jack Yu8e732d42017-04-14 00:08:06 -07003778 memset(&rilCellIdentity, -1, sizeof(RIL_CellIdentity_v16));
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003779
3780 rilCellIdentity.cellInfoType = getCellInfoTypeRadioTechnology(response[3]);
3781 switch(rilCellIdentity.cellInfoType) {
3782 case RIL_CELL_INFO_TYPE_GSM: {
Sooraj Sasindran758ee462017-06-07 16:30:18 -07003783 /* valid LAC are hexstrings in the range 0x0000 - 0xffff */
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003784 rilCellIdentity.cellIdentityGsm.lac =
Sooraj Sasindran758ee462017-06-07 16:30:18 -07003785 convertResponseHexStringEntryToInt(response, 1, numStrings);
3786
3787 /* valid CID are hexstrings in the range 0x00000000 - 0xffffffff */
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003788 rilCellIdentity.cellIdentityGsm.cid =
Sooraj Sasindran758ee462017-06-07 16:30:18 -07003789 convertResponseHexStringEntryToInt(response, 2, numStrings);
Gohulan Balachandran453c8352019-02-05 11:20:46 -08003790
3791 if (numStrings >= 13) {
3792 rilCellIdentity.cellIdentityGsm.mcc =
3793 convertResponseStringEntryToInt(response, 11, numStrings);
3794
3795 rilCellIdentity.cellIdentityGsm.mnc =
3796 convertResponseStringEntryToInt(response, 12, numStrings);
3797 }
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003798 break;
3799 }
3800 case RIL_CELL_INFO_TYPE_WCDMA: {
Sooraj Sasindran758ee462017-06-07 16:30:18 -07003801 /* valid LAC are hexstrings in the range 0x0000 - 0xffff */
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003802 rilCellIdentity.cellIdentityWcdma.lac =
Sooraj Sasindran758ee462017-06-07 16:30:18 -07003803 convertResponseHexStringEntryToInt(response, 1, numStrings);
3804
3805 /* valid CID are hexstrings in the range 0x00000000 - 0xffffffff */
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003806 rilCellIdentity.cellIdentityWcdma.cid =
Sooraj Sasindran758ee462017-06-07 16:30:18 -07003807 convertResponseHexStringEntryToInt(response, 2, numStrings);
Gohulan Balachandran453c8352019-02-05 11:20:46 -08003808
3809 if (numStrings >= 13) {
3810 rilCellIdentity.cellIdentityWcdma.mcc =
3811 convertResponseStringEntryToInt(response, 11, numStrings);
3812
3813 rilCellIdentity.cellIdentityWcdma.mnc =
3814 convertResponseStringEntryToInt(response, 12, numStrings);
3815 }
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003816 break;
3817 }
3818 case RIL_CELL_INFO_TYPE_TD_SCDMA:{
Sooraj Sasindran758ee462017-06-07 16:30:18 -07003819 /* valid LAC are hexstrings in the range 0x0000 - 0xffff */
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003820 rilCellIdentity.cellIdentityTdscdma.lac =
Sooraj Sasindran758ee462017-06-07 16:30:18 -07003821 convertResponseHexStringEntryToInt(response, 1, numStrings);
3822
3823 /* valid CID are hexstrings in the range 0x00000000 - 0xffffffff */
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003824 rilCellIdentity.cellIdentityTdscdma.cid =
Sooraj Sasindran758ee462017-06-07 16:30:18 -07003825 convertResponseHexStringEntryToInt(response, 2, numStrings);
Gohulan Balachandran453c8352019-02-05 11:20:46 -08003826
3827 if (numStrings >= 13) {
3828 rilCellIdentity.cellIdentityTdscdma.mcc =
3829 convertResponseStringEntryToInt(response, 11, numStrings);
3830
3831 rilCellIdentity.cellIdentityTdscdma.mnc =
3832 convertResponseStringEntryToInt(response, 12, numStrings);
3833 }
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003834 break;
3835 }
3836 case RIL_CELL_INFO_TYPE_LTE: {
3837 rilCellIdentity.cellIdentityLte.tac =
3838 convertResponseStringEntryToInt(response, 6, numStrings);
3839 rilCellIdentity.cellIdentityLte.pci =
3840 convertResponseStringEntryToInt(response, 7, numStrings);
3841 rilCellIdentity.cellIdentityLte.ci =
3842 convertResponseStringEntryToInt(response, 8, numStrings);
Gohulan Balachandran453c8352019-02-05 11:20:46 -08003843
3844 if (numStrings >= 13) {
3845 rilCellIdentity.cellIdentityLte.mcc =
3846 convertResponseStringEntryToInt(response, 11, numStrings);
3847
3848 rilCellIdentity.cellIdentityLte.mnc =
3849 convertResponseStringEntryToInt(response, 12, numStrings);
3850 }
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003851 break;
3852 }
3853 default: {
3854 break;
3855 }
3856 }
3857
3858 fillCellIdentityResponse(cellIdentity, rilCellIdentity);
3859}
3860
Amit Mahajan759786a2017-03-03 17:35:47 -08003861int radio::getVoiceRegistrationStateResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003862 int responseType, int serial, RIL_Errno e,
3863 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003864#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003865 RLOGD("getVoiceRegistrationStateResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003866#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003867
3868 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003869 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003870 populateResponseInfo(responseInfo, serial, responseType, e);
3871
Jack Yuf68e0da2017-02-07 14:53:09 -08003872 VoiceRegStateResult voiceRegResponse = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003873 int numStrings = responseLen / sizeof(char *);
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003874 if (response == NULL) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003875 RLOGE("getVoiceRegistrationStateResponse Invalid response: NULL");
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003876 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
3877 } else if (s_vendorFunctions->version <= 14) {
3878 if (numStrings != 15) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003879 RLOGE("getVoiceRegistrationStateResponse Invalid response: NULL");
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003880 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
3881 } else {
3882 char **resp = (char **) response;
3883 voiceRegResponse.regState = (RegState) ATOI_NULL_HANDLED_DEF(resp[0], 4);
3884 voiceRegResponse.rat = ATOI_NULL_HANDLED(resp[3]);
3885 voiceRegResponse.cssSupported = ATOI_NULL_HANDLED_DEF(resp[7], 0);
3886 voiceRegResponse.roamingIndicator = ATOI_NULL_HANDLED(resp[10]);
3887 voiceRegResponse.systemIsInPrl = ATOI_NULL_HANDLED_DEF(resp[11], 0);
3888 voiceRegResponse.defaultRoamingIndicator = ATOI_NULL_HANDLED_DEF(resp[12], 0);
3889 voiceRegResponse.reasonForDenial = ATOI_NULL_HANDLED_DEF(resp[13], 0);
3890 fillCellIdentityFromVoiceRegStateResponseString(voiceRegResponse.cellIdentity,
3891 numStrings, resp);
3892 }
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003893 } else {
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003894 RIL_VoiceRegistrationStateResponse *voiceRegState =
3895 (RIL_VoiceRegistrationStateResponse *)response;
3896
3897 if (responseLen != sizeof(RIL_VoiceRegistrationStateResponse)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003898 RLOGE("getVoiceRegistrationStateResponse Invalid response: NULL");
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003899 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
3900 } else {
3901 voiceRegResponse.regState = (RegState) voiceRegState->regState;
3902 voiceRegResponse.rat = voiceRegState->rat;;
3903 voiceRegResponse.cssSupported = voiceRegState->cssSupported;
3904 voiceRegResponse.roamingIndicator = voiceRegState->roamingIndicator;
3905 voiceRegResponse.systemIsInPrl = voiceRegState->systemIsInPrl;
3906 voiceRegResponse.defaultRoamingIndicator = voiceRegState->defaultRoamingIndicator;
3907 voiceRegResponse.reasonForDenial = voiceRegState->reasonForDenial;
3908 fillCellIdentityResponse(voiceRegResponse.cellIdentity,
3909 voiceRegState->cellIdentity);
3910 }
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003911 }
3912
3913 Return<void> retStatus =
3914 radioService[slotId]->mRadioResponse->getVoiceRegistrationStateResponse(
3915 responseInfo, voiceRegResponse);
3916 radioService[slotId]->checkReturnStatus(retStatus);
3917 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003918 RLOGE("getVoiceRegistrationStateResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003919 slotId);
3920 }
3921
3922 return 0;
3923}
3924
Amit Mahajan759786a2017-03-03 17:35:47 -08003925int radio::getDataRegistrationStateResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003926 int responseType, int serial, RIL_Errno e,
3927 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003928#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003929 RLOGD("getDataRegistrationStateResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003930#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003931
3932 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003933 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003934 populateResponseInfo(responseInfo, serial, responseType, e);
Jack Yuf68e0da2017-02-07 14:53:09 -08003935 DataRegStateResult dataRegResponse = {};
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003936 if (response == NULL) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003937 RLOGE("getDataRegistrationStateResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003938 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003939 } else if (s_vendorFunctions->version <= 14) {
3940 int numStrings = responseLen / sizeof(char *);
Gohulan Balachandran453c8352019-02-05 11:20:46 -08003941 if ((numStrings != 6) && (numStrings != 11) && (numStrings != 13)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003942 RLOGE("getDataRegistrationStateResponse Invalid response: NULL");
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003943 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
3944 } else {
3945 char **resp = (char **) response;
3946 dataRegResponse.regState = (RegState) ATOI_NULL_HANDLED_DEF(resp[0], 4);
3947 dataRegResponse.rat = ATOI_NULL_HANDLED_DEF(resp[3], 0);
3948 dataRegResponse.reasonDataDenied = ATOI_NULL_HANDLED(resp[4]);
3949 dataRegResponse.maxDataCalls = ATOI_NULL_HANDLED_DEF(resp[5], 1);
3950 fillCellIdentityFromDataRegStateResponseString(dataRegResponse.cellIdentity,
3951 numStrings, resp);
3952 }
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003953 } else {
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003954 RIL_DataRegistrationStateResponse *dataRegState =
3955 (RIL_DataRegistrationStateResponse *)response;
3956
3957 if (responseLen != sizeof(RIL_DataRegistrationStateResponse)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003958 RLOGE("getDataRegistrationStateResponse Invalid response: NULL");
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003959 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
3960 } else {
3961 dataRegResponse.regState = (RegState) dataRegState->regState;
3962 dataRegResponse.rat = dataRegState->rat;;
3963 dataRegResponse.reasonDataDenied = dataRegState->reasonDataDenied;
3964 dataRegResponse.maxDataCalls = dataRegState->maxDataCalls;
3965 fillCellIdentityResponse(dataRegResponse.cellIdentity, dataRegState->cellIdentity);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003966 }
3967 }
3968
3969 Return<void> retStatus =
3970 radioService[slotId]->mRadioResponse->getDataRegistrationStateResponse(responseInfo,
3971 dataRegResponse);
3972 radioService[slotId]->checkReturnStatus(retStatus);
3973 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003974 RLOGE("getDataRegistrationStateResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003975 slotId);
3976 }
3977
3978 return 0;
3979}
3980
Amit Mahajan759786a2017-03-03 17:35:47 -08003981int radio::getOperatorResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003982 int responseType, int serial, RIL_Errno e, void *response,
3983 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003984#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003985 RLOGD("getOperatorResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003986#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003987
3988 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003989 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003990 populateResponseInfo(responseInfo, serial, responseType, e);
3991 hidl_string longName;
3992 hidl_string shortName;
3993 hidl_string numeric;
3994 int numStrings = responseLen / sizeof(char *);
3995 if (response == NULL || numStrings != 3) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003996 RLOGE("getOperatorResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003997 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
3998
3999 } else {
4000 char **resp = (char **) response;
4001 longName = convertCharPtrToHidlString(resp[0]);
4002 shortName = convertCharPtrToHidlString(resp[1]);
4003 numeric = convertCharPtrToHidlString(resp[2]);
4004 }
4005 Return<void> retStatus = radioService[slotId]->mRadioResponse->getOperatorResponse(
4006 responseInfo, longName, shortName, numeric);
4007 radioService[slotId]->checkReturnStatus(retStatus);
4008 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004009 RLOGE("getOperatorResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004010 slotId);
4011 }
4012
4013 return 0;
4014}
4015
Amit Mahajan759786a2017-03-03 17:35:47 -08004016int radio::setRadioPowerResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004017 int responseType, int serial, RIL_Errno e, void *response,
4018 size_t responseLen) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004019 RLOGD("setRadioPowerResponse: serial %d", serial);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004020
4021 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004022 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004023 populateResponseInfo(responseInfo, serial, responseType, e);
4024 Return<void> retStatus = radioService[slotId]->mRadioResponse->setRadioPowerResponse(
4025 responseInfo);
4026 radioService[slotId]->checkReturnStatus(retStatus);
4027 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004028 RLOGE("setRadioPowerResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004029 slotId);
4030 }
4031
4032 return 0;
4033}
4034
Amit Mahajan759786a2017-03-03 17:35:47 -08004035int radio::sendDtmfResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004036 int responseType, int serial, RIL_Errno e, void *response,
4037 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004038#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004039 RLOGD("sendDtmfResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004040#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004041
4042 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004043 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004044 populateResponseInfo(responseInfo, serial, responseType, e);
4045 Return<void> retStatus = radioService[slotId]->mRadioResponse->sendDtmfResponse(
4046 responseInfo);
4047 radioService[slotId]->checkReturnStatus(retStatus);
4048 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004049 RLOGE("sendDtmfResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004050 slotId);
4051 }
4052
4053 return 0;
4054}
4055
4056SendSmsResult makeSendSmsResult(RadioResponseInfo& responseInfo, int serial, int responseType,
4057 RIL_Errno e, void *response, size_t responseLen) {
4058 populateResponseInfo(responseInfo, serial, responseType, e);
Jack Yuf68e0da2017-02-07 14:53:09 -08004059 SendSmsResult result = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004060
4061 if (response == NULL || responseLen != sizeof(RIL_SMS_Response)) {
4062 RLOGE("Invalid response: NULL");
4063 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004064 result.ackPDU = hidl_string();
4065 } else {
4066 RIL_SMS_Response *resp = (RIL_SMS_Response *) response;
4067 result.messageRef = resp->messageRef;
4068 result.ackPDU = convertCharPtrToHidlString(resp->ackPDU);
4069 result.errorCode = resp->errorCode;
4070 }
4071 return result;
4072}
4073
Amit Mahajan759786a2017-03-03 17:35:47 -08004074int radio::sendSmsResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004075 int responseType, int serial, RIL_Errno e, void *response,
4076 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004077#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004078 RLOGD("sendSmsResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004079#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004080
4081 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004082 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004083 SendSmsResult result = makeSendSmsResult(responseInfo, serial, responseType, e, response,
4084 responseLen);
4085
4086 Return<void> retStatus = radioService[slotId]->mRadioResponse->sendSmsResponse(responseInfo,
4087 result);
4088 radioService[slotId]->checkReturnStatus(retStatus);
4089 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004090 RLOGE("sendSmsResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004091 }
4092
4093 return 0;
4094}
4095
Amit Mahajan759786a2017-03-03 17:35:47 -08004096int radio::sendSMSExpectMoreResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004097 int responseType, int serial, RIL_Errno e, void *response,
4098 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004099#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004100 RLOGD("sendSMSExpectMoreResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004101#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004102
4103 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004104 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004105 SendSmsResult result = makeSendSmsResult(responseInfo, serial, responseType, e, response,
4106 responseLen);
4107
4108 Return<void> retStatus = radioService[slotId]->mRadioResponse->sendSMSExpectMoreResponse(
4109 responseInfo, result);
4110 radioService[slotId]->checkReturnStatus(retStatus);
4111 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004112 RLOGE("sendSMSExpectMoreResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004113 }
4114
4115 return 0;
4116}
4117
Amit Mahajan759786a2017-03-03 17:35:47 -08004118int radio::setupDataCallResponse(int slotId,
Amit Mahajan3df62912017-02-10 01:35:55 +00004119 int responseType, int serial, RIL_Errno e, void *response,
4120 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004121#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004122 RLOGD("setupDataCallResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004123#endif
Amit Mahajan3df62912017-02-10 01:35:55 +00004124
4125 if (radioService[slotId]->mRadioResponse != NULL) {
Amit Mahajan3da9ac02017-02-13 13:41:28 -08004126 RadioResponseInfo responseInfo = {};
Amit Mahajan3df62912017-02-10 01:35:55 +00004127 populateResponseInfo(responseInfo, serial, responseType, e);
4128
Amit Mahajan3da9ac02017-02-13 13:41:28 -08004129 SetupDataCallResult result = {};
Amit Mahajan13058cb2017-06-07 23:10:27 -07004130 if (response == NULL || (responseLen % sizeof(RIL_Data_Call_Response_v11)) != 0) {
4131 if (response != NULL) {
4132 RLOGE("setupDataCallResponse: Invalid response");
4133 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
4134 }
Jack Yu5079e182017-02-28 15:21:18 -08004135 result.status = DataCallFailCause::ERROR_UNSPECIFIED;
Amit Mahajan3da9ac02017-02-13 13:41:28 -08004136 result.type = hidl_string();
4137 result.ifname = hidl_string();
4138 result.addresses = hidl_string();
4139 result.dnses = hidl_string();
4140 result.gateways = hidl_string();
4141 result.pcscf = hidl_string();
Amit Mahajan3df62912017-02-10 01:35:55 +00004142 } else {
4143 convertRilDataCallToHal((RIL_Data_Call_Response_v11 *) response, result);
4144 }
4145
4146 Return<void> retStatus = radioService[slotId]->mRadioResponse->setupDataCallResponse(
4147 responseInfo, result);
4148 radioService[slotId]->checkReturnStatus(retStatus);
4149 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004150 RLOGE("setupDataCallResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Amit Mahajan3df62912017-02-10 01:35:55 +00004151 }
4152
4153 return 0;
4154}
4155
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004156IccIoResult responseIccIo(RadioResponseInfo& responseInfo, int serial, int responseType,
4157 RIL_Errno e, void *response, size_t responseLen) {
4158 populateResponseInfo(responseInfo, serial, responseType, e);
Jack Yuf68e0da2017-02-07 14:53:09 -08004159 IccIoResult result = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004160
4161 if (response == NULL || responseLen != sizeof(RIL_SIM_IO_Response)) {
4162 RLOGE("Invalid response: NULL");
4163 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004164 result.simResponse = hidl_string();
4165 } else {
4166 RIL_SIM_IO_Response *resp = (RIL_SIM_IO_Response *) response;
4167 result.sw1 = resp->sw1;
4168 result.sw2 = resp->sw2;
4169 result.simResponse = convertCharPtrToHidlString(resp->simResponse);
4170 }
4171 return result;
4172}
4173
Amit Mahajan759786a2017-03-03 17:35:47 -08004174int radio::iccIOForAppResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004175 int responseType, int serial, RIL_Errno e, void *response,
4176 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004177#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004178 RLOGD("iccIOForAppResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004179#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004180
4181 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004182 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004183 IccIoResult result = responseIccIo(responseInfo, serial, responseType, e, response,
4184 responseLen);
4185
4186 Return<void> retStatus = radioService[slotId]->mRadioResponse->iccIOForAppResponse(
4187 responseInfo, result);
4188 radioService[slotId]->checkReturnStatus(retStatus);
4189 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004190 RLOGE("iccIOForAppResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004191 }
4192
4193 return 0;
4194}
4195
Amit Mahajan759786a2017-03-03 17:35:47 -08004196int radio::sendUssdResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004197 int responseType, int serial, RIL_Errno e, void *response,
4198 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004199#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004200 RLOGD("sendUssdResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004201#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004202
4203 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004204 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004205 populateResponseInfo(responseInfo, serial, responseType, e);
4206 Return<void> retStatus = radioService[slotId]->mRadioResponse->sendUssdResponse(
4207 responseInfo);
4208 radioService[slotId]->checkReturnStatus(retStatus);
4209 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004210 RLOGE("sendUssdResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004211 slotId);
4212 }
4213
4214 return 0;
4215}
4216
Amit Mahajan759786a2017-03-03 17:35:47 -08004217int radio::cancelPendingUssdResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004218 int responseType, int serial, RIL_Errno e, void *response,
4219 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004220#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004221 RLOGD("cancelPendingUssdResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004222#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004223
4224 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004225 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004226 populateResponseInfo(responseInfo, serial, responseType, e);
4227 Return<void> retStatus = radioService[slotId]->mRadioResponse->cancelPendingUssdResponse(
4228 responseInfo);
4229 radioService[slotId]->checkReturnStatus(retStatus);
4230 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004231 RLOGE("cancelPendingUssdResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004232 slotId);
4233 }
4234
4235 return 0;
4236}
4237
Amit Mahajan759786a2017-03-03 17:35:47 -08004238int radio::getClirResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004239 int responseType, int serial, RIL_Errno e, void *response,
4240 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004241#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004242 RLOGD("getClirResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004243#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004244
4245 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004246 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004247 populateResponseInfo(responseInfo, serial, responseType, e);
4248 int n = -1, m = -1;
4249 int numInts = responseLen / sizeof(int);
4250 if (response == NULL || numInts != 2) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004251 RLOGE("getClirResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004252 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
4253 } else {
4254 int *pInt = (int *) response;
4255 n = pInt[0];
4256 m = pInt[1];
4257 }
4258 Return<void> retStatus = radioService[slotId]->mRadioResponse->getClirResponse(responseInfo,
4259 n, m);
4260 radioService[slotId]->checkReturnStatus(retStatus);
4261 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004262 RLOGE("getClirResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004263 }
4264
4265 return 0;
4266}
4267
Amit Mahajan759786a2017-03-03 17:35:47 -08004268int radio::setClirResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004269 int responseType, int serial, RIL_Errno e, void *response,
4270 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004271#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004272 RLOGD("setClirResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004273#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004274
4275 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004276 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004277 populateResponseInfo(responseInfo, serial, responseType, e);
4278 Return<void> retStatus = radioService[slotId]->mRadioResponse->setClirResponse(
4279 responseInfo);
4280 radioService[slotId]->checkReturnStatus(retStatus);
4281 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004282 RLOGE("setClirResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004283 }
4284
4285 return 0;
4286}
4287
Amit Mahajan759786a2017-03-03 17:35:47 -08004288int radio::getCallForwardStatusResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004289 int responseType, int serial, RIL_Errno e,
4290 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004291#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004292 RLOGD("getCallForwardStatusResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004293#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004294
4295 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004296 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004297 populateResponseInfo(responseInfo, serial, responseType, e);
4298 hidl_vec<CallForwardInfo> callForwardInfos;
4299
Amit Mahajan13058cb2017-06-07 23:10:27 -07004300 if ((response == NULL && responseLen != 0)
4301 || responseLen % sizeof(RIL_CallForwardInfo *) != 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004302 RLOGE("getCallForwardStatusResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004303 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
4304 } else {
4305 int num = responseLen / sizeof(RIL_CallForwardInfo *);
4306 callForwardInfos.resize(num);
4307 for (int i = 0 ; i < num; i++) {
4308 RIL_CallForwardInfo *resp = ((RIL_CallForwardInfo **) response)[i];
4309 callForwardInfos[i].status = (CallForwardInfoStatus) resp->status;
4310 callForwardInfos[i].reason = resp->reason;
4311 callForwardInfos[i].serviceClass = resp->serviceClass;
4312 callForwardInfos[i].toa = resp->toa;
4313 callForwardInfos[i].number = convertCharPtrToHidlString(resp->number);
4314 callForwardInfos[i].timeSeconds = resp->timeSeconds;
4315 }
4316 }
4317
4318 Return<void> retStatus = radioService[slotId]->mRadioResponse->getCallForwardStatusResponse(
4319 responseInfo, callForwardInfos);
4320 radioService[slotId]->checkReturnStatus(retStatus);
4321 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004322 RLOGE("getCallForwardStatusResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004323 slotId);
4324 }
4325
4326 return 0;
4327}
4328
Amit Mahajan759786a2017-03-03 17:35:47 -08004329int radio::setCallForwardResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004330 int responseType, int serial, RIL_Errno e, void *response,
4331 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004332#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004333 RLOGD("setCallForwardResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004334#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004335
4336 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004337 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004338 populateResponseInfo(responseInfo, serial, responseType, e);
4339 Return<void> retStatus = radioService[slotId]->mRadioResponse->setCallForwardResponse(
4340 responseInfo);
4341 radioService[slotId]->checkReturnStatus(retStatus);
4342 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004343 RLOGE("setCallForwardResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004344 }
4345
4346 return 0;
4347}
4348
Amit Mahajan759786a2017-03-03 17:35:47 -08004349int radio::getCallWaitingResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004350 int responseType, int serial, RIL_Errno e, void *response,
4351 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004352#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004353 RLOGD("getCallWaitingResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004354#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004355
4356 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004357 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004358 populateResponseInfo(responseInfo, serial, responseType, e);
4359 bool enable = false;
4360 int serviceClass = -1;
4361 int numInts = responseLen / sizeof(int);
4362 if (response == NULL || numInts != 2) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004363 RLOGE("getCallWaitingResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004364 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
4365 } else {
4366 int *pInt = (int *) response;
4367 enable = pInt[0] == 1 ? true : false;
4368 serviceClass = pInt[1];
4369 }
Sanket Padawe5375bfa2017-03-07 17:21:05 -08004370 Return<void> retStatus = radioService[slotId]->mRadioResponse->getCallWaitingResponse(
4371 responseInfo, enable, serviceClass);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004372 radioService[slotId]->checkReturnStatus(retStatus);
4373 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004374 RLOGE("getCallWaitingResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004375 }
4376
4377 return 0;
4378}
4379
Amit Mahajan759786a2017-03-03 17:35:47 -08004380int radio::setCallWaitingResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004381 int responseType, int serial, RIL_Errno e, void *response,
4382 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004383#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004384 RLOGD("setCallWaitingResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004385#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004386
4387 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004388 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004389 populateResponseInfo(responseInfo, serial, responseType, e);
4390 Return<void> retStatus = radioService[slotId]->mRadioResponse->setCallWaitingResponse(
4391 responseInfo);
4392 radioService[slotId]->checkReturnStatus(retStatus);
4393 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004394 RLOGE("setCallWaitingResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004395 }
4396
4397 return 0;
4398}
4399
Amit Mahajan759786a2017-03-03 17:35:47 -08004400int radio::acknowledgeLastIncomingGsmSmsResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004401 int responseType, int serial, RIL_Errno e,
4402 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004403#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004404 RLOGD("acknowledgeLastIncomingGsmSmsResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004405#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004406
4407 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004408 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004409 populateResponseInfo(responseInfo, serial, responseType, e);
4410 Return<void> retStatus =
4411 radioService[slotId]->mRadioResponse->acknowledgeLastIncomingGsmSmsResponse(
4412 responseInfo);
4413 radioService[slotId]->checkReturnStatus(retStatus);
4414 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004415 RLOGE("acknowledgeLastIncomingGsmSmsResponse: radioService[%d]->mRadioResponse "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004416 "== NULL", slotId);
4417 }
4418
4419 return 0;
4420}
4421
Amit Mahajan759786a2017-03-03 17:35:47 -08004422int radio::acceptCallResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004423 int responseType, int serial, RIL_Errno e,
4424 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004425#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004426 RLOGD("acceptCallResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004427#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004428
4429 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004430 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004431 populateResponseInfo(responseInfo, serial, responseType, e);
4432 Return<void> retStatus = radioService[slotId]->mRadioResponse->acceptCallResponse(
4433 responseInfo);
4434 radioService[slotId]->checkReturnStatus(retStatus);
4435 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004436 RLOGE("acceptCallResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004437 slotId);
4438 }
4439
4440 return 0;
4441}
4442
Amit Mahajan759786a2017-03-03 17:35:47 -08004443int radio::deactivateDataCallResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004444 int responseType, int serial, RIL_Errno e,
4445 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004446#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004447 RLOGD("deactivateDataCallResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004448#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004449
4450 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004451 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004452 populateResponseInfo(responseInfo, serial, responseType, e);
4453 Return<void> retStatus = radioService[slotId]->mRadioResponse->deactivateDataCallResponse(
4454 responseInfo);
4455 radioService[slotId]->checkReturnStatus(retStatus);
4456 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004457 RLOGE("deactivateDataCallResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004458 slotId);
4459 }
4460
4461 return 0;
4462}
4463
Amit Mahajan759786a2017-03-03 17:35:47 -08004464int radio::getFacilityLockForAppResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004465 int responseType, int serial, RIL_Errno e,
4466 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004467#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004468 RLOGD("getFacilityLockForAppResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004469#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004470
4471 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004472 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004473 int ret = responseInt(responseInfo, serial, responseType, e, response, responseLen);
4474 Return<void> retStatus = radioService[slotId]->mRadioResponse->
4475 getFacilityLockForAppResponse(responseInfo, ret);
4476 radioService[slotId]->checkReturnStatus(retStatus);
4477 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004478 RLOGE("getFacilityLockForAppResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004479 slotId);
4480 }
4481
4482 return 0;
4483}
4484
Amit Mahajan759786a2017-03-03 17:35:47 -08004485int radio::setFacilityLockForAppResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004486 int responseType, int serial, RIL_Errno e,
4487 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004488#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004489 RLOGD("setFacilityLockForAppResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004490#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004491
4492 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004493 RadioResponseInfo responseInfo = {};
Naveen Kalla346bbc02017-03-16 12:55:55 -07004494 int ret = responseIntOrEmpty(responseInfo, serial, responseType, e, response, responseLen);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004495 Return<void> retStatus
4496 = radioService[slotId]->mRadioResponse->setFacilityLockForAppResponse(responseInfo,
4497 ret);
4498 radioService[slotId]->checkReturnStatus(retStatus);
4499 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004500 RLOGE("setFacilityLockForAppResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004501 slotId);
4502 }
4503
4504 return 0;
4505}
4506
Amit Mahajan759786a2017-03-03 17:35:47 -08004507int radio::setBarringPasswordResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004508 int responseType, int serial, RIL_Errno e,
4509 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004510#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004511 RLOGD("acceptCallResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004512#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004513
4514 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004515 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004516 populateResponseInfo(responseInfo, serial, responseType, e);
4517 Return<void> retStatus
4518 = radioService[slotId]->mRadioResponse->setBarringPasswordResponse(responseInfo);
4519 radioService[slotId]->checkReturnStatus(retStatus);
4520 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004521 RLOGE("setBarringPasswordResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004522 slotId);
4523 }
4524
4525 return 0;
4526}
4527
Amit Mahajan759786a2017-03-03 17:35:47 -08004528int radio::getNetworkSelectionModeResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004529 int responseType, int serial, RIL_Errno e, void *response,
4530 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004531#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004532 RLOGD("getNetworkSelectionModeResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004533#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004534
4535 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004536 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004537 populateResponseInfo(responseInfo, serial, responseType, e);
4538 bool manual = false;
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004539 if (response == NULL || responseLen != sizeof(int)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004540 RLOGE("getNetworkSelectionModeResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004541 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
4542 } else {
4543 int *pInt = (int *) response;
4544 manual = pInt[0] == 1 ? true : false;
4545 }
4546 Return<void> retStatus
4547 = radioService[slotId]->mRadioResponse->getNetworkSelectionModeResponse(
4548 responseInfo,
4549 manual);
4550 radioService[slotId]->checkReturnStatus(retStatus);
4551 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004552 RLOGE("getNetworkSelectionModeResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004553 slotId);
4554 }
4555
4556 return 0;
4557}
4558
Amit Mahajan759786a2017-03-03 17:35:47 -08004559int radio::setNetworkSelectionModeAutomaticResponse(int slotId, int responseType, int serial,
4560 RIL_Errno e, void *response,
4561 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004562#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004563 RLOGD("setNetworkSelectionModeAutomaticResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004564#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004565
4566 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004567 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004568 populateResponseInfo(responseInfo, serial, responseType, e);
4569 Return<void> retStatus
4570 = radioService[slotId]->mRadioResponse->setNetworkSelectionModeAutomaticResponse(
4571 responseInfo);
4572 radioService[slotId]->checkReturnStatus(retStatus);
4573 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004574 RLOGE("setNetworkSelectionModeAutomaticResponse: radioService[%d]->mRadioResponse "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004575 "== NULL", slotId);
4576 }
4577
4578 return 0;
4579}
4580
Amit Mahajan759786a2017-03-03 17:35:47 -08004581int radio::setNetworkSelectionModeManualResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004582 int responseType, int serial, RIL_Errno e,
4583 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004584#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004585 RLOGD("setNetworkSelectionModeManualResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004586#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004587
4588 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004589 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004590 populateResponseInfo(responseInfo, serial, responseType, e);
4591 Return<void> retStatus
4592 = radioService[slotId]->mRadioResponse->setNetworkSelectionModeManualResponse(
4593 responseInfo);
4594 radioService[slotId]->checkReturnStatus(retStatus);
4595 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004596 RLOGE("acceptCallResponse: radioService[%d]->setNetworkSelectionModeManualResponse "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004597 "== NULL", slotId);
4598 }
4599
4600 return 0;
4601}
4602
Jack Yuf68e0da2017-02-07 14:53:09 -08004603int convertOperatorStatusToInt(const char *str) {
4604 if (strncmp("unknown", str, 9) == 0) {
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004605 return (int) OperatorStatus::UNKNOWN;
Jack Yuf68e0da2017-02-07 14:53:09 -08004606 } else if (strncmp("available", str, 9) == 0) {
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004607 return (int) OperatorStatus::AVAILABLE;
Jack Yuf68e0da2017-02-07 14:53:09 -08004608 } else if (strncmp("current", str, 9) == 0) {
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004609 return (int) OperatorStatus::CURRENT;
Jack Yuf68e0da2017-02-07 14:53:09 -08004610 } else if (strncmp("forbidden", str, 9) == 0) {
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004611 return (int) OperatorStatus::FORBIDDEN;
4612 } else {
4613 return -1;
4614 }
4615}
4616
Amit Mahajan759786a2017-03-03 17:35:47 -08004617int radio::getAvailableNetworksResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004618 int responseType, int serial, RIL_Errno e, void *response,
4619 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004620#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004621 RLOGD("getAvailableNetworksResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004622#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004623
4624 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004625 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004626 populateResponseInfo(responseInfo, serial, responseType, e);
4627 hidl_vec<OperatorInfo> networks;
Amit Mahajan13058cb2017-06-07 23:10:27 -07004628 if ((response == NULL && responseLen != 0)
4629 || responseLen % (4 * sizeof(char *))!= 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004630 RLOGE("getAvailableNetworksResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004631 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
4632 } else {
4633 char **resp = (char **) response;
4634 int numStrings = responseLen / sizeof(char *);
4635 networks.resize(numStrings/4);
Jayachandran Ce0d755c2017-03-01 18:26:50 -08004636 for (int i = 0, j = 0; i < numStrings; i = i + 4, j++) {
4637 networks[j].alphaLong = convertCharPtrToHidlString(resp[i]);
4638 networks[j].alphaShort = convertCharPtrToHidlString(resp[i + 1]);
4639 networks[j].operatorNumeric = convertCharPtrToHidlString(resp[i + 2]);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004640 int status = convertOperatorStatusToInt(resp[i + 3]);
4641 if (status == -1) {
4642 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
4643 } else {
Jayachandran Ce0d755c2017-03-01 18:26:50 -08004644 networks[j].status = (OperatorStatus) status;
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004645 }
4646 }
4647 }
4648 Return<void> retStatus
4649 = radioService[slotId]->mRadioResponse->getAvailableNetworksResponse(responseInfo,
4650 networks);
4651 radioService[slotId]->checkReturnStatus(retStatus);
4652 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004653 RLOGE("getAvailableNetworksResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004654 slotId);
4655 }
4656
4657 return 0;
4658}
4659
Amit Mahajan759786a2017-03-03 17:35:47 -08004660int radio::startDtmfResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004661 int responseType, int serial, RIL_Errno e,
4662 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004663#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004664 RLOGD("startDtmfResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004665#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004666
4667 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004668 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004669 populateResponseInfo(responseInfo, serial, responseType, e);
4670 Return<void> retStatus
4671 = radioService[slotId]->mRadioResponse->startDtmfResponse(responseInfo);
4672 radioService[slotId]->checkReturnStatus(retStatus);
4673 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004674 RLOGE("startDtmfResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004675 }
4676
4677 return 0;
4678}
4679
Amit Mahajan759786a2017-03-03 17:35:47 -08004680int radio::stopDtmfResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004681 int responseType, int serial, RIL_Errno e,
4682 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004683#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004684 RLOGD("stopDtmfResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004685#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004686
4687 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004688 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004689 populateResponseInfo(responseInfo, serial, responseType, e);
4690 Return<void> retStatus
4691 = radioService[slotId]->mRadioResponse->stopDtmfResponse(responseInfo);
4692 radioService[slotId]->checkReturnStatus(retStatus);
4693 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004694 RLOGE("stopDtmfResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004695 }
4696
4697 return 0;
4698}
4699
Amit Mahajan759786a2017-03-03 17:35:47 -08004700int radio::getBasebandVersionResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004701 int responseType, int serial, RIL_Errno e,
4702 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004703#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004704 RLOGD("getBasebandVersionResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004705#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004706
4707 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004708 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004709 populateResponseInfo(responseInfo, serial, responseType, e);
4710 Return<void> retStatus
4711 = radioService[slotId]->mRadioResponse->getBasebandVersionResponse(responseInfo,
4712 convertCharPtrToHidlString((char *) response));
4713 radioService[slotId]->checkReturnStatus(retStatus);
4714 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004715 RLOGE("getBasebandVersionResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004716 }
4717
4718 return 0;
4719}
4720
Amit Mahajan759786a2017-03-03 17:35:47 -08004721int radio::separateConnectionResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004722 int responseType, int serial, RIL_Errno e,
4723 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004724#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004725 RLOGD("separateConnectionResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004726#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004727
4728 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004729 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004730 populateResponseInfo(responseInfo, serial, responseType, e);
4731 Return<void> retStatus
4732 = radioService[slotId]->mRadioResponse->separateConnectionResponse(responseInfo);
4733 radioService[slotId]->checkReturnStatus(retStatus);
4734 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004735 RLOGE("separateConnectionResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004736 slotId);
4737 }
4738
4739 return 0;
4740}
4741
Amit Mahajan759786a2017-03-03 17:35:47 -08004742int radio::setMuteResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004743 int responseType, int serial, RIL_Errno e,
4744 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004745#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004746 RLOGD("setMuteResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004747#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004748
4749 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004750 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004751 populateResponseInfo(responseInfo, serial, responseType, e);
4752 Return<void> retStatus
4753 = radioService[slotId]->mRadioResponse->setMuteResponse(responseInfo);
4754 radioService[slotId]->checkReturnStatus(retStatus);
4755 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004756 RLOGE("setMuteResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004757 }
4758
4759 return 0;
4760}
4761
Amit Mahajan759786a2017-03-03 17:35:47 -08004762int radio::getMuteResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004763 int responseType, int serial, RIL_Errno e, void *response,
4764 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004765#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004766 RLOGD("getMuteResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004767#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004768
4769 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004770 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004771 populateResponseInfo(responseInfo, serial, responseType, e);
4772 bool enable = false;
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004773 if (response == NULL || responseLen != sizeof(int)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004774 RLOGE("getMuteResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004775 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
4776 } else {
4777 int *pInt = (int *) response;
4778 enable = pInt[0] == 1 ? true : false;
4779 }
4780 Return<void> retStatus = radioService[slotId]->mRadioResponse->getMuteResponse(responseInfo,
4781 enable);
4782 radioService[slotId]->checkReturnStatus(retStatus);
4783 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004784 RLOGE("getMuteResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004785 }
4786
4787 return 0;
4788}
4789
Amit Mahajan759786a2017-03-03 17:35:47 -08004790int radio::getClipResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004791 int responseType, int serial, RIL_Errno e,
4792 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004793#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004794 RLOGD("getClipResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004795#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004796
4797 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004798 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004799 int ret = responseInt(responseInfo, serial, responseType, e, response, responseLen);
4800 Return<void> retStatus = radioService[slotId]->mRadioResponse->getClipResponse(responseInfo,
4801 (ClipStatus) ret);
4802 radioService[slotId]->checkReturnStatus(retStatus);
4803 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004804 RLOGE("getClipResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004805 }
4806
4807 return 0;
4808}
4809
Amit Mahajan759786a2017-03-03 17:35:47 -08004810int radio::getDataCallListResponse(int slotId,
Amit Mahajan3df62912017-02-10 01:35:55 +00004811 int responseType, int serial, RIL_Errno e,
4812 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004813#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004814 RLOGD("getDataCallListResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004815#endif
Amit Mahajan3df62912017-02-10 01:35:55 +00004816
4817 if (radioService[slotId]->mRadioResponse != NULL) {
Amit Mahajan3da9ac02017-02-13 13:41:28 -08004818 RadioResponseInfo responseInfo = {};
Amit Mahajan3df62912017-02-10 01:35:55 +00004819 populateResponseInfo(responseInfo, serial, responseType, e);
4820
4821 hidl_vec<SetupDataCallResult> ret;
Amit Mahajan13058cb2017-06-07 23:10:27 -07004822 if ((response == NULL && responseLen != 0)
4823 || responseLen % sizeof(RIL_Data_Call_Response_v11) != 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004824 RLOGE("getDataCallListResponse: invalid response");
Amit Mahajan3df62912017-02-10 01:35:55 +00004825 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
4826 } else {
4827 convertRilDataCallListToHal(response, responseLen, ret);
4828 }
4829
4830 Return<void> retStatus = radioService[slotId]->mRadioResponse->getDataCallListResponse(
4831 responseInfo, ret);
4832 radioService[slotId]->checkReturnStatus(retStatus);
4833 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004834 RLOGE("getDataCallListResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Amit Mahajan3df62912017-02-10 01:35:55 +00004835 }
4836
4837 return 0;
4838}
4839
Amit Mahajan759786a2017-03-03 17:35:47 -08004840int radio::setSuppServiceNotificationsResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004841 int responseType, int serial, RIL_Errno e,
4842 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004843#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004844 RLOGD("setSuppServiceNotificationsResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004845#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004846
4847 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004848 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004849 populateResponseInfo(responseInfo, serial, responseType, e);
4850 Return<void> retStatus
4851 = radioService[slotId]->mRadioResponse->setSuppServiceNotificationsResponse(
4852 responseInfo);
4853 radioService[slotId]->checkReturnStatus(retStatus);
4854 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004855 RLOGE("setSuppServiceNotificationsResponse: radioService[%d]->mRadioResponse "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004856 "== NULL", slotId);
4857 }
4858
4859 return 0;
4860}
4861
Amit Mahajan759786a2017-03-03 17:35:47 -08004862int radio::deleteSmsOnSimResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004863 int responseType, int serial, RIL_Errno e,
4864 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004865#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004866 RLOGD("deleteSmsOnSimResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004867#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004868
4869 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004870 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004871 populateResponseInfo(responseInfo, serial, responseType, e);
4872 Return<void> retStatus
4873 = radioService[slotId]->mRadioResponse->deleteSmsOnSimResponse(responseInfo);
4874 radioService[slotId]->checkReturnStatus(retStatus);
4875 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004876 RLOGE("deleteSmsOnSimResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004877 }
4878
4879 return 0;
4880}
4881
Amit Mahajan759786a2017-03-03 17:35:47 -08004882int radio::setBandModeResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004883 int responseType, int serial, RIL_Errno e,
4884 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004885#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004886 RLOGD("setBandModeResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004887#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004888
4889 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004890 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004891 populateResponseInfo(responseInfo, serial, responseType, e);
4892 Return<void> retStatus
4893 = radioService[slotId]->mRadioResponse->setBandModeResponse(responseInfo);
4894 radioService[slotId]->checkReturnStatus(retStatus);
4895 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004896 RLOGE("setBandModeResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004897 }
4898
4899 return 0;
4900}
4901
Amit Mahajan759786a2017-03-03 17:35:47 -08004902int radio::writeSmsToSimResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004903 int responseType, int serial, RIL_Errno e,
4904 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004905#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004906 RLOGD("writeSmsToSimResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004907#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004908
4909 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004910 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004911 int ret = responseInt(responseInfo, serial, responseType, e, response, responseLen);
4912 Return<void> retStatus
4913 = radioService[slotId]->mRadioResponse->writeSmsToSimResponse(responseInfo, ret);
4914 radioService[slotId]->checkReturnStatus(retStatus);
4915 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004916 RLOGE("writeSmsToSimResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004917 }
4918
4919 return 0;
4920}
4921
Amit Mahajan759786a2017-03-03 17:35:47 -08004922int radio::getAvailableBandModesResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004923 int responseType, int serial, RIL_Errno e, void *response,
4924 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004925#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004926 RLOGD("getAvailableBandModesResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004927#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004928
4929 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004930 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004931 populateResponseInfo(responseInfo, serial, responseType, e);
4932 hidl_vec<RadioBandMode> modes;
Amit Mahajan13058cb2017-06-07 23:10:27 -07004933 if ((response == NULL && responseLen != 0)|| responseLen % sizeof(int) != 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004934 RLOGE("getAvailableBandModesResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004935 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
4936 } else {
4937 int *pInt = (int *) response;
4938 int numInts = responseLen / sizeof(int);
4939 modes.resize(numInts);
4940 for (int i = 0; i < numInts; i++) {
4941 modes[i] = (RadioBandMode) pInt[i];
4942 }
4943 }
4944 Return<void> retStatus
4945 = radioService[slotId]->mRadioResponse->getAvailableBandModesResponse(responseInfo,
4946 modes);
4947 radioService[slotId]->checkReturnStatus(retStatus);
4948 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004949 RLOGE("getAvailableBandModesResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004950 slotId);
4951 }
4952
4953 return 0;
4954}
4955
Amit Mahajan759786a2017-03-03 17:35:47 -08004956int radio::sendEnvelopeResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004957 int responseType, int serial, RIL_Errno e,
4958 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004959#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004960 RLOGD("sendEnvelopeResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004961#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004962
4963 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004964 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004965 populateResponseInfo(responseInfo, serial, responseType, e);
4966 Return<void> retStatus
4967 = radioService[slotId]->mRadioResponse->sendEnvelopeResponse(responseInfo,
4968 convertCharPtrToHidlString((char *) response));
4969 radioService[slotId]->checkReturnStatus(retStatus);
4970 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004971 RLOGE("sendEnvelopeResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004972 }
4973
4974 return 0;
4975}
4976
Amit Mahajan759786a2017-03-03 17:35:47 -08004977int radio::sendTerminalResponseToSimResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004978 int responseType, int serial, RIL_Errno e,
4979 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004980#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004981 RLOGD("sendTerminalResponseToSimResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004982#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004983
4984 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004985 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004986 populateResponseInfo(responseInfo, serial, responseType, e);
4987 Return<void> retStatus
4988 = radioService[slotId]->mRadioResponse->sendTerminalResponseToSimResponse(
4989 responseInfo);
4990 radioService[slotId]->checkReturnStatus(retStatus);
4991 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004992 RLOGE("sendTerminalResponseToSimResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004993 slotId);
4994 }
4995
4996 return 0;
4997}
4998
Amit Mahajan759786a2017-03-03 17:35:47 -08004999int radio::handleStkCallSetupRequestFromSimResponse(int slotId,
5000 int responseType, int serial,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005001 RIL_Errno e, void *response,
5002 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005003#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005004 RLOGD("handleStkCallSetupRequestFromSimResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005005#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005006
5007 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005008 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005009 populateResponseInfo(responseInfo, serial, responseType, e);
5010 Return<void> retStatus
5011 = radioService[slotId]->mRadioResponse->handleStkCallSetupRequestFromSimResponse(
5012 responseInfo);
5013 radioService[slotId]->checkReturnStatus(retStatus);
5014 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005015 RLOGE("handleStkCallSetupRequestFromSimResponse: radioService[%d]->mRadioResponse "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005016 "== NULL", slotId);
5017 }
5018
5019 return 0;
5020}
5021
Amit Mahajan759786a2017-03-03 17:35:47 -08005022int radio::explicitCallTransferResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005023 int responseType, int serial, RIL_Errno e,
5024 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005025#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005026 RLOGD("explicitCallTransferResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005027#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005028
5029 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005030 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005031 populateResponseInfo(responseInfo, serial, responseType, e);
5032 Return<void> retStatus
5033 = radioService[slotId]->mRadioResponse->explicitCallTransferResponse(responseInfo);
5034 radioService[slotId]->checkReturnStatus(retStatus);
5035 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005036 RLOGE("explicitCallTransferResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005037 slotId);
5038 }
5039
5040 return 0;
5041}
5042
Amit Mahajan759786a2017-03-03 17:35:47 -08005043int radio::setPreferredNetworkTypeResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005044 int responseType, int serial, RIL_Errno e,
5045 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005046#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005047 RLOGD("setPreferredNetworkTypeResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005048#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005049
5050 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005051 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005052 populateResponseInfo(responseInfo, serial, responseType, e);
5053 Return<void> retStatus
5054 = radioService[slotId]->mRadioResponse->setPreferredNetworkTypeResponse(
5055 responseInfo);
5056 radioService[slotId]->checkReturnStatus(retStatus);
5057 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005058 RLOGE("setPreferredNetworkTypeResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005059 slotId);
5060 }
5061
5062 return 0;
5063}
5064
5065
Amit Mahajan759786a2017-03-03 17:35:47 -08005066int radio::getPreferredNetworkTypeResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005067 int responseType, int serial, RIL_Errno e,
5068 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005069#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005070 RLOGD("getPreferredNetworkTypeResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005071#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005072
5073 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005074 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005075 int ret = responseInt(responseInfo, serial, responseType, e, response, responseLen);
5076 Return<void> retStatus
5077 = radioService[slotId]->mRadioResponse->getPreferredNetworkTypeResponse(
5078 responseInfo, (PreferredNetworkType) ret);
5079 radioService[slotId]->checkReturnStatus(retStatus);
5080 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005081 RLOGE("getPreferredNetworkTypeResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005082 slotId);
5083 }
5084
5085 return 0;
5086}
5087
Amit Mahajan759786a2017-03-03 17:35:47 -08005088int radio::getNeighboringCidsResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005089 int responseType, int serial, RIL_Errno e,
5090 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005091#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005092 RLOGD("getNeighboringCidsResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005093#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005094
5095 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005096 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005097 populateResponseInfo(responseInfo, serial, responseType, e);
5098 hidl_vec<NeighboringCell> cells;
5099
Amit Mahajan13058cb2017-06-07 23:10:27 -07005100 if ((response == NULL && responseLen != 0)
5101 || responseLen % sizeof(RIL_NeighboringCell *) != 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005102 RLOGE("getNeighboringCidsResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005103 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
5104 } else {
5105 int num = responseLen / sizeof(RIL_NeighboringCell *);
5106 cells.resize(num);
5107 for (int i = 0 ; i < num; i++) {
5108 RIL_NeighboringCell *resp = ((RIL_NeighboringCell **) response)[i];
5109 cells[i].cid = convertCharPtrToHidlString(resp->cid);
5110 cells[i].rssi = resp->rssi;
5111 }
5112 }
5113
5114 Return<void> retStatus
5115 = radioService[slotId]->mRadioResponse->getNeighboringCidsResponse(responseInfo,
5116 cells);
5117 radioService[slotId]->checkReturnStatus(retStatus);
5118 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005119 RLOGE("getNeighboringCidsResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005120 slotId);
5121 }
5122
5123 return 0;
5124}
5125
Amit Mahajan759786a2017-03-03 17:35:47 -08005126int radio::setLocationUpdatesResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005127 int responseType, int serial, RIL_Errno e,
5128 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005129#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005130 RLOGD("setLocationUpdatesResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005131#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005132
5133 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005134 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005135 populateResponseInfo(responseInfo, serial, responseType, e);
5136 Return<void> retStatus
5137 = radioService[slotId]->mRadioResponse->setLocationUpdatesResponse(responseInfo);
5138 radioService[slotId]->checkReturnStatus(retStatus);
5139 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005140 RLOGE("setLocationUpdatesResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005141 slotId);
5142 }
5143
5144 return 0;
5145}
5146
Amit Mahajan759786a2017-03-03 17:35:47 -08005147int radio::setCdmaSubscriptionSourceResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005148 int responseType, int serial, RIL_Errno e,
5149 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005150#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005151 RLOGD("setCdmaSubscriptionSourceResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005152#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005153
5154 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005155 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005156 populateResponseInfo(responseInfo, serial, responseType, e);
5157 Return<void> retStatus
5158 = radioService[slotId]->mRadioResponse->setCdmaSubscriptionSourceResponse(
5159 responseInfo);
5160 radioService[slotId]->checkReturnStatus(retStatus);
5161 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005162 RLOGE("setCdmaSubscriptionSourceResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005163 slotId);
5164 }
5165
5166 return 0;
5167}
5168
Amit Mahajan759786a2017-03-03 17:35:47 -08005169int radio::setCdmaRoamingPreferenceResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005170 int responseType, int serial, RIL_Errno e,
5171 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005172#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005173 RLOGD("setCdmaRoamingPreferenceResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005174#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005175
5176 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005177 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005178 populateResponseInfo(responseInfo, serial, responseType, e);
5179 Return<void> retStatus
5180 = radioService[slotId]->mRadioResponse->setCdmaRoamingPreferenceResponse(
5181 responseInfo);
5182 radioService[slotId]->checkReturnStatus(retStatus);
5183 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005184 RLOGE("setCdmaRoamingPreferenceResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005185 slotId);
5186 }
5187
5188 return 0;
5189}
5190
Amit Mahajan759786a2017-03-03 17:35:47 -08005191int radio::getCdmaRoamingPreferenceResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005192 int responseType, int serial, RIL_Errno e,
5193 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005194#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005195 RLOGD("getCdmaRoamingPreferenceResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005196#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005197
5198 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005199 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005200 int ret = responseInt(responseInfo, serial, responseType, e, response, responseLen);
5201 Return<void> retStatus
5202 = radioService[slotId]->mRadioResponse->getCdmaRoamingPreferenceResponse(
5203 responseInfo, (CdmaRoamingType) ret);
5204 radioService[slotId]->checkReturnStatus(retStatus);
5205 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005206 RLOGE("getCdmaRoamingPreferenceResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005207 slotId);
5208 }
5209
5210 return 0;
5211}
5212
Amit Mahajan759786a2017-03-03 17:35:47 -08005213int radio::setTTYModeResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005214 int responseType, int serial, RIL_Errno e,
5215 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005216#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005217 RLOGD("setTTYModeResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005218#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005219
5220 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005221 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005222 populateResponseInfo(responseInfo, serial, responseType, e);
5223 Return<void> retStatus
5224 = radioService[slotId]->mRadioResponse->setTTYModeResponse(responseInfo);
5225 radioService[slotId]->checkReturnStatus(retStatus);
5226 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005227 RLOGE("setTTYModeResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005228 }
5229
5230 return 0;
5231}
5232
Amit Mahajan759786a2017-03-03 17:35:47 -08005233int radio::getTTYModeResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005234 int responseType, int serial, RIL_Errno e,
5235 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005236#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005237 RLOGD("getTTYModeResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005238#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005239
5240 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005241 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005242 int ret = responseInt(responseInfo, serial, responseType, e, response, responseLen);
5243 Return<void> retStatus
5244 = radioService[slotId]->mRadioResponse->getTTYModeResponse(responseInfo,
5245 (TtyMode) ret);
5246 radioService[slotId]->checkReturnStatus(retStatus);
5247 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005248 RLOGE("getTTYModeResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005249 }
5250
5251 return 0;
5252}
5253
Amit Mahajan759786a2017-03-03 17:35:47 -08005254int radio::setPreferredVoicePrivacyResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005255 int responseType, int serial, RIL_Errno e,
5256 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005257#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005258 RLOGD("setPreferredVoicePrivacyResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005259#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005260
5261 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005262 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005263 populateResponseInfo(responseInfo, serial, responseType, e);
5264 Return<void> retStatus
5265 = radioService[slotId]->mRadioResponse->setPreferredVoicePrivacyResponse(
5266 responseInfo);
5267 radioService[slotId]->checkReturnStatus(retStatus);
5268 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005269 RLOGE("setPreferredVoicePrivacyResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005270 slotId);
5271 }
5272
5273 return 0;
5274}
5275
Amit Mahajan759786a2017-03-03 17:35:47 -08005276int radio::getPreferredVoicePrivacyResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005277 int responseType, int serial, RIL_Errno e,
5278 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005279#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005280 RLOGD("getPreferredVoicePrivacyResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005281#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005282
5283 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005284 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005285 populateResponseInfo(responseInfo, serial, responseType, e);
5286 bool enable = false;
5287 int numInts = responseLen / sizeof(int);
5288 if (response == NULL || numInts != 1) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005289 RLOGE("getPreferredVoicePrivacyResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005290 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
5291 } else {
5292 int *pInt = (int *) response;
5293 enable = pInt[0] == 1 ? true : false;
5294 }
5295 Return<void> retStatus
5296 = radioService[slotId]->mRadioResponse->getPreferredVoicePrivacyResponse(
5297 responseInfo, enable);
5298 radioService[slotId]->checkReturnStatus(retStatus);
5299 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005300 RLOGE("getPreferredVoicePrivacyResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005301 slotId);
5302 }
5303
5304 return 0;
5305}
5306
Amit Mahajan759786a2017-03-03 17:35:47 -08005307int radio::sendCDMAFeatureCodeResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005308 int responseType, int serial, RIL_Errno e,
5309 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005310#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005311 RLOGD("sendCDMAFeatureCodeResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005312#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005313
5314 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005315 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005316 populateResponseInfo(responseInfo, serial, responseType, e);
5317 Return<void> retStatus
5318 = radioService[slotId]->mRadioResponse->sendCDMAFeatureCodeResponse(responseInfo);
5319 radioService[slotId]->checkReturnStatus(retStatus);
5320 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005321 RLOGE("sendCDMAFeatureCodeResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005322 slotId);
5323 }
5324
5325 return 0;
5326}
5327
Amit Mahajan759786a2017-03-03 17:35:47 -08005328int radio::sendBurstDtmfResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005329 int responseType, int serial, RIL_Errno e,
5330 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005331#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005332 RLOGD("sendBurstDtmfResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005333#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005334
5335 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005336 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005337 populateResponseInfo(responseInfo, serial, responseType, e);
5338 Return<void> retStatus
5339 = radioService[slotId]->mRadioResponse->sendBurstDtmfResponse(responseInfo);
5340 radioService[slotId]->checkReturnStatus(retStatus);
5341 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005342 RLOGE("sendBurstDtmfResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005343 }
5344
5345 return 0;
5346}
5347
Amit Mahajan759786a2017-03-03 17:35:47 -08005348int radio::sendCdmaSmsResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005349 int responseType, int serial, RIL_Errno e, void *response,
5350 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005351#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005352 RLOGD("sendCdmaSmsResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005353#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005354
5355 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005356 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005357 SendSmsResult result = makeSendSmsResult(responseInfo, serial, responseType, e, response,
5358 responseLen);
5359
5360 Return<void> retStatus
5361 = radioService[slotId]->mRadioResponse->sendCdmaSmsResponse(responseInfo, result);
5362 radioService[slotId]->checkReturnStatus(retStatus);
5363 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005364 RLOGE("sendCdmaSmsResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005365 }
5366
5367 return 0;
5368}
5369
Amit Mahajan759786a2017-03-03 17:35:47 -08005370int radio::acknowledgeLastIncomingCdmaSmsResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005371 int responseType, int serial, RIL_Errno e,
5372 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005373#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005374 RLOGD("acknowledgeLastIncomingCdmaSmsResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005375#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005376
5377 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005378 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005379 populateResponseInfo(responseInfo, serial, responseType, e);
5380 Return<void> retStatus
5381 = radioService[slotId]->mRadioResponse->acknowledgeLastIncomingCdmaSmsResponse(
5382 responseInfo);
5383 radioService[slotId]->checkReturnStatus(retStatus);
5384 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005385 RLOGE("acknowledgeLastIncomingCdmaSmsResponse: radioService[%d]->mRadioResponse "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005386 "== NULL", slotId);
5387 }
5388
5389 return 0;
5390}
5391
Amit Mahajan759786a2017-03-03 17:35:47 -08005392int radio::getGsmBroadcastConfigResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005393 int responseType, int serial, RIL_Errno e,
5394 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005395#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005396 RLOGD("getGsmBroadcastConfigResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005397#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005398
5399 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005400 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005401 populateResponseInfo(responseInfo, serial, responseType, e);
5402 hidl_vec<GsmBroadcastSmsConfigInfo> configs;
5403
Amit Mahajan13058cb2017-06-07 23:10:27 -07005404 if ((response == NULL && responseLen != 0)
5405 || responseLen % sizeof(RIL_GSM_BroadcastSmsConfigInfo *) != 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005406 RLOGE("getGsmBroadcastConfigResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005407 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
5408 } else {
5409 int num = responseLen / sizeof(RIL_GSM_BroadcastSmsConfigInfo *);
5410 configs.resize(num);
5411 for (int i = 0 ; i < num; i++) {
5412 RIL_GSM_BroadcastSmsConfigInfo *resp =
5413 ((RIL_GSM_BroadcastSmsConfigInfo **) response)[i];
5414 configs[i].fromServiceId = resp->fromServiceId;
5415 configs[i].toServiceId = resp->toServiceId;
5416 configs[i].fromCodeScheme = resp->fromCodeScheme;
5417 configs[i].toCodeScheme = resp->toCodeScheme;
5418 configs[i].selected = resp->selected == 1 ? true : false;
5419 }
5420 }
5421
5422 Return<void> retStatus
5423 = radioService[slotId]->mRadioResponse->getGsmBroadcastConfigResponse(responseInfo,
5424 configs);
5425 radioService[slotId]->checkReturnStatus(retStatus);
5426 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005427 RLOGE("getGsmBroadcastConfigResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005428 slotId);
5429 }
5430
5431 return 0;
5432}
5433
Amit Mahajan759786a2017-03-03 17:35:47 -08005434int radio::setGsmBroadcastConfigResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005435 int responseType, int serial, RIL_Errno e,
5436 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005437#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005438 RLOGD("setGsmBroadcastConfigResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005439#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005440
5441 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005442 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005443 populateResponseInfo(responseInfo, serial, responseType, e);
5444 Return<void> retStatus
5445 = radioService[slotId]->mRadioResponse->setGsmBroadcastConfigResponse(responseInfo);
5446 radioService[slotId]->checkReturnStatus(retStatus);
5447 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005448 RLOGE("setGsmBroadcastConfigResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005449 slotId);
5450 }
5451
5452 return 0;
5453}
5454
Amit Mahajan759786a2017-03-03 17:35:47 -08005455int radio::setGsmBroadcastActivationResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005456 int responseType, int serial, RIL_Errno e,
5457 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005458#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005459 RLOGD("setGsmBroadcastActivationResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005460#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005461
5462 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005463 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005464 populateResponseInfo(responseInfo, serial, responseType, e);
5465 Return<void> retStatus
5466 = radioService[slotId]->mRadioResponse->setGsmBroadcastActivationResponse(
5467 responseInfo);
5468 radioService[slotId]->checkReturnStatus(retStatus);
5469 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005470 RLOGE("setGsmBroadcastActivationResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005471 slotId);
5472 }
5473
5474 return 0;
5475}
5476
Amit Mahajan759786a2017-03-03 17:35:47 -08005477int radio::getCdmaBroadcastConfigResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005478 int responseType, int serial, RIL_Errno e,
5479 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005480#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005481 RLOGD("getCdmaBroadcastConfigResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005482#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005483
5484 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005485 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005486 populateResponseInfo(responseInfo, serial, responseType, e);
5487 hidl_vec<CdmaBroadcastSmsConfigInfo> configs;
5488
Amit Mahajan13058cb2017-06-07 23:10:27 -07005489 if ((response == NULL && responseLen != 0)
5490 || responseLen % sizeof(RIL_CDMA_BroadcastSmsConfigInfo *) != 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005491 RLOGE("getCdmaBroadcastConfigResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005492 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
5493 } else {
5494 int num = responseLen / sizeof(RIL_CDMA_BroadcastSmsConfigInfo *);
5495 configs.resize(num);
5496 for (int i = 0 ; i < num; i++) {
5497 RIL_CDMA_BroadcastSmsConfigInfo *resp =
5498 ((RIL_CDMA_BroadcastSmsConfigInfo **) response)[i];
5499 configs[i].serviceCategory = resp->service_category;
5500 configs[i].language = resp->language;
5501 configs[i].selected = resp->selected == 1 ? true : false;
5502 }
5503 }
5504
5505 Return<void> retStatus
5506 = radioService[slotId]->mRadioResponse->getCdmaBroadcastConfigResponse(responseInfo,
5507 configs);
5508 radioService[slotId]->checkReturnStatus(retStatus);
5509 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005510 RLOGE("getCdmaBroadcastConfigResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005511 slotId);
5512 }
5513
5514 return 0;
5515}
5516
Amit Mahajan759786a2017-03-03 17:35:47 -08005517int radio::setCdmaBroadcastConfigResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005518 int responseType, int serial, RIL_Errno e,
5519 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005520#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005521 RLOGD("setCdmaBroadcastConfigResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005522#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005523
5524 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005525 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005526 populateResponseInfo(responseInfo, serial, responseType, e);
5527 Return<void> retStatus
5528 = radioService[slotId]->mRadioResponse->setCdmaBroadcastConfigResponse(
5529 responseInfo);
5530 radioService[slotId]->checkReturnStatus(retStatus);
5531 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005532 RLOGE("setCdmaBroadcastConfigResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005533 slotId);
5534 }
5535
5536 return 0;
5537}
5538
Amit Mahajan759786a2017-03-03 17:35:47 -08005539int radio::setCdmaBroadcastActivationResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005540 int responseType, int serial, RIL_Errno e,
5541 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005542#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005543 RLOGD("setCdmaBroadcastActivationResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005544#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005545
5546 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005547 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005548 populateResponseInfo(responseInfo, serial, responseType, e);
5549 Return<void> retStatus
5550 = radioService[slotId]->mRadioResponse->setCdmaBroadcastActivationResponse(
5551 responseInfo);
5552 radioService[slotId]->checkReturnStatus(retStatus);
5553 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005554 RLOGE("setCdmaBroadcastActivationResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005555 slotId);
5556 }
5557
5558 return 0;
5559}
5560
Amit Mahajan759786a2017-03-03 17:35:47 -08005561int radio::getCDMASubscriptionResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005562 int responseType, int serial, RIL_Errno e, void *response,
5563 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005564#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005565 RLOGD("getCDMASubscriptionResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005566#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005567
5568 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005569 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005570 populateResponseInfo(responseInfo, serial, responseType, e);
5571
5572 int numStrings = responseLen / sizeof(char *);
5573 hidl_string emptyString;
5574 if (response == NULL || numStrings != 5) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005575 RLOGE("getOperatorResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005576 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
5577 Return<void> retStatus
5578 = radioService[slotId]->mRadioResponse->getCDMASubscriptionResponse(
5579 responseInfo, emptyString, emptyString, emptyString, emptyString, emptyString);
5580 radioService[slotId]->checkReturnStatus(retStatus);
5581 } else {
5582 char **resp = (char **) response;
5583 Return<void> retStatus
5584 = radioService[slotId]->mRadioResponse->getCDMASubscriptionResponse(
5585 responseInfo,
5586 convertCharPtrToHidlString(resp[0]),
5587 convertCharPtrToHidlString(resp[1]),
5588 convertCharPtrToHidlString(resp[2]),
5589 convertCharPtrToHidlString(resp[3]),
5590 convertCharPtrToHidlString(resp[4]));
5591 radioService[slotId]->checkReturnStatus(retStatus);
5592 }
5593 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005594 RLOGE("getCDMASubscriptionResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005595 slotId);
5596 }
5597
5598 return 0;
5599}
5600
Amit Mahajan759786a2017-03-03 17:35:47 -08005601int radio::writeSmsToRuimResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005602 int responseType, int serial, RIL_Errno e,
5603 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005604#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005605 RLOGD("writeSmsToRuimResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005606#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005607
5608 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005609 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005610 int ret = responseInt(responseInfo, serial, responseType, e, response, responseLen);
5611 Return<void> retStatus
5612 = radioService[slotId]->mRadioResponse->writeSmsToRuimResponse(responseInfo, ret);
5613 radioService[slotId]->checkReturnStatus(retStatus);
5614 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005615 RLOGE("writeSmsToRuimResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005616 }
5617
5618 return 0;
5619}
5620
Amit Mahajan759786a2017-03-03 17:35:47 -08005621int radio::deleteSmsOnRuimResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005622 int responseType, int serial, RIL_Errno e,
5623 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005624#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005625 RLOGD("deleteSmsOnRuimResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005626#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005627
5628 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005629 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005630 populateResponseInfo(responseInfo, serial, responseType, e);
5631 Return<void> retStatus
5632 = radioService[slotId]->mRadioResponse->deleteSmsOnRuimResponse(responseInfo);
5633 radioService[slotId]->checkReturnStatus(retStatus);
5634 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005635 RLOGE("deleteSmsOnRuimResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005636 }
5637
5638 return 0;
5639}
5640
Amit Mahajan759786a2017-03-03 17:35:47 -08005641int radio::getDeviceIdentityResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005642 int responseType, int serial, RIL_Errno e, void *response,
5643 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005644#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005645 RLOGD("getDeviceIdentityResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005646#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005647
5648 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005649 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005650 populateResponseInfo(responseInfo, serial, responseType, e);
5651
5652 int numStrings = responseLen / sizeof(char *);
5653 hidl_string emptyString;
5654 if (response == NULL || numStrings != 4) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005655 RLOGE("getDeviceIdentityResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005656 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
5657 Return<void> retStatus
5658 = radioService[slotId]->mRadioResponse->getDeviceIdentityResponse(responseInfo,
5659 emptyString, emptyString, emptyString, emptyString);
5660 radioService[slotId]->checkReturnStatus(retStatus);
5661 } else {
5662 char **resp = (char **) response;
5663 Return<void> retStatus
5664 = radioService[slotId]->mRadioResponse->getDeviceIdentityResponse(responseInfo,
5665 convertCharPtrToHidlString(resp[0]),
5666 convertCharPtrToHidlString(resp[1]),
5667 convertCharPtrToHidlString(resp[2]),
5668 convertCharPtrToHidlString(resp[3]));
5669 radioService[slotId]->checkReturnStatus(retStatus);
5670 }
5671 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005672 RLOGE("getDeviceIdentityResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005673 slotId);
5674 }
5675
5676 return 0;
5677}
5678
Amit Mahajan759786a2017-03-03 17:35:47 -08005679int radio::exitEmergencyCallbackModeResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005680 int responseType, int serial, RIL_Errno e,
5681 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005682#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005683 RLOGD("exitEmergencyCallbackModeResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005684#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005685
5686 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005687 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005688 populateResponseInfo(responseInfo, serial, responseType, e);
5689 Return<void> retStatus
5690 = radioService[slotId]->mRadioResponse->exitEmergencyCallbackModeResponse(
5691 responseInfo);
5692 radioService[slotId]->checkReturnStatus(retStatus);
5693 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005694 RLOGE("exitEmergencyCallbackModeResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005695 slotId);
5696 }
5697
5698 return 0;
5699}
5700
Amit Mahajan759786a2017-03-03 17:35:47 -08005701int radio::getSmscAddressResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005702 int responseType, int serial, RIL_Errno e,
5703 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005704#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005705 RLOGD("getSmscAddressResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005706#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005707
5708 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005709 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005710 populateResponseInfo(responseInfo, serial, responseType, e);
5711 Return<void> retStatus
5712 = radioService[slotId]->mRadioResponse->getSmscAddressResponse(responseInfo,
5713 convertCharPtrToHidlString((char *) response));
5714 radioService[slotId]->checkReturnStatus(retStatus);
5715 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005716 RLOGE("getSmscAddressResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005717 }
5718
5719 return 0;
5720}
5721
Amit Mahajan759786a2017-03-03 17:35:47 -08005722int radio::setSmscAddressResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005723 int responseType, int serial, RIL_Errno e,
5724 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005725#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005726 RLOGD("setSmscAddressResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005727#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005728
5729 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005730 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005731 populateResponseInfo(responseInfo, serial, responseType, e);
5732 Return<void> retStatus
5733 = radioService[slotId]->mRadioResponse->setSmscAddressResponse(responseInfo);
5734 radioService[slotId]->checkReturnStatus(retStatus);
5735 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005736 RLOGE("setSmscAddressResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005737 }
5738
5739 return 0;
5740}
5741
Amit Mahajan759786a2017-03-03 17:35:47 -08005742int radio::reportSmsMemoryStatusResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005743 int responseType, int serial, RIL_Errno e,
5744 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005745#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005746 RLOGD("reportSmsMemoryStatusResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005747#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005748
5749 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005750 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005751 populateResponseInfo(responseInfo, serial, responseType, e);
5752 Return<void> retStatus
5753 = radioService[slotId]->mRadioResponse->reportSmsMemoryStatusResponse(responseInfo);
5754 radioService[slotId]->checkReturnStatus(retStatus);
5755 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005756 RLOGE("reportSmsMemoryStatusResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005757 slotId);
5758 }
5759
5760 return 0;
5761}
5762
Amit Mahajan759786a2017-03-03 17:35:47 -08005763int radio::reportStkServiceIsRunningResponse(int slotId,
Amit Mahajan5007ffa2017-01-31 17:14:42 -08005764 int responseType, int serial, RIL_Errno e,
5765 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005766#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005767 RLOGD("reportStkServiceIsRunningResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005768#endif
Amit Mahajan5007ffa2017-01-31 17:14:42 -08005769
5770 if (radioService[slotId]->mRadioResponse != NULL) {
Amit Mahajan3da9ac02017-02-13 13:41:28 -08005771 RadioResponseInfo responseInfo = {};
Amit Mahajan5007ffa2017-01-31 17:14:42 -08005772 populateResponseInfo(responseInfo, serial, responseType, e);
5773 Return<void> retStatus = radioService[slotId]->mRadioResponse->
5774 reportStkServiceIsRunningResponse(responseInfo);
5775 radioService[slotId]->checkReturnStatus(retStatus);
5776 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005777 RLOGE("reportStkServiceIsRunningResponse: radioService[%d]->mRadioResponse == NULL",
Amit Mahajan5007ffa2017-01-31 17:14:42 -08005778 slotId);
5779 }
5780
5781 return 0;
5782}
5783
Amit Mahajan759786a2017-03-03 17:35:47 -08005784int radio::getCdmaSubscriptionSourceResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005785 int responseType, int serial, RIL_Errno e,
5786 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005787#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005788 RLOGD("getCdmaSubscriptionSourceResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005789#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005790
5791 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005792 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005793 int ret = responseInt(responseInfo, serial, responseType, e, response, responseLen);
5794 Return<void> retStatus
5795 = radioService[slotId]->mRadioResponse->getCdmaSubscriptionSourceResponse(
5796 responseInfo, (CdmaSubscriptionSource) ret);
5797 radioService[slotId]->checkReturnStatus(retStatus);
5798 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005799 RLOGE("getCdmaSubscriptionSourceResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005800 slotId);
5801 }
5802
5803 return 0;
5804}
5805
Amit Mahajan759786a2017-03-03 17:35:47 -08005806int radio::requestIsimAuthenticationResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005807 int responseType, int serial, RIL_Errno e,
5808 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005809#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005810 RLOGD("requestIsimAuthenticationResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005811#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005812
5813 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005814 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005815 populateResponseInfo(responseInfo, serial, responseType, e);
5816 Return<void> retStatus
5817 = radioService[slotId]->mRadioResponse->requestIsimAuthenticationResponse(
5818 responseInfo,
5819 convertCharPtrToHidlString((char *) response));
5820 radioService[slotId]->checkReturnStatus(retStatus);
5821 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005822 RLOGE("requestIsimAuthenticationResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005823 slotId);
5824 }
5825
5826 return 0;
5827}
5828
Amit Mahajan759786a2017-03-03 17:35:47 -08005829int radio::acknowledgeIncomingGsmSmsWithPduResponse(int slotId,
5830 int responseType,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005831 int serial, RIL_Errno e, void *response,
5832 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005833#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005834 RLOGD("acknowledgeIncomingGsmSmsWithPduResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005835#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005836
5837 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005838 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005839 populateResponseInfo(responseInfo, serial, responseType, e);
5840 Return<void> retStatus
5841 = radioService[slotId]->mRadioResponse->acknowledgeIncomingGsmSmsWithPduResponse(
5842 responseInfo);
5843 radioService[slotId]->checkReturnStatus(retStatus);
5844 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005845 RLOGE("acknowledgeIncomingGsmSmsWithPduResponse: radioService[%d]->mRadioResponse "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005846 "== NULL", slotId);
5847 }
5848
5849 return 0;
5850}
5851
Amit Mahajan759786a2017-03-03 17:35:47 -08005852int radio::sendEnvelopeWithStatusResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005853 int responseType, int serial, RIL_Errno e, void *response,
5854 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005855#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005856 RLOGD("sendEnvelopeWithStatusResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005857#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005858
5859 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005860 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005861 IccIoResult result = responseIccIo(responseInfo, serial, responseType, e,
5862 response, responseLen);
5863
5864 Return<void> retStatus
5865 = radioService[slotId]->mRadioResponse->sendEnvelopeWithStatusResponse(responseInfo,
5866 result);
5867 radioService[slotId]->checkReturnStatus(retStatus);
5868 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005869 RLOGE("sendEnvelopeWithStatusResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005870 slotId);
5871 }
5872
5873 return 0;
5874}
5875
Amit Mahajan759786a2017-03-03 17:35:47 -08005876int radio::getVoiceRadioTechnologyResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005877 int responseType, int serial, RIL_Errno e,
5878 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005879#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005880 RLOGD("getVoiceRadioTechnologyResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005881#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005882
5883 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005884 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005885 int ret = responseInt(responseInfo, serial, responseType, e, response, responseLen);
5886 Return<void> retStatus
5887 = radioService[slotId]->mRadioResponse->getVoiceRadioTechnologyResponse(
5888 responseInfo, (RadioTechnology) ret);
5889 radioService[slotId]->checkReturnStatus(retStatus);
5890 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005891 RLOGE("getVoiceRadioTechnologyResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005892 slotId);
5893 }
5894
5895 return 0;
5896}
5897
Amit Mahajan759786a2017-03-03 17:35:47 -08005898int radio::getCellInfoListResponse(int slotId,
5899 int responseType,
Amit Mahajan3df62912017-02-10 01:35:55 +00005900 int serial, RIL_Errno e, void *response,
5901 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005902#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005903 RLOGD("getCellInfoListResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005904#endif
Amit Mahajan3df62912017-02-10 01:35:55 +00005905
5906 if (radioService[slotId]->mRadioResponse != NULL) {
Amit Mahajan3da9ac02017-02-13 13:41:28 -08005907 RadioResponseInfo responseInfo = {};
Amit Mahajan3df62912017-02-10 01:35:55 +00005908 populateResponseInfo(responseInfo, serial, responseType, e);
5909
5910 hidl_vec<CellInfo> ret;
Amit Mahajan13058cb2017-06-07 23:10:27 -07005911 if ((response == NULL && responseLen != 0)
5912 || responseLen % sizeof(RIL_CellInfo_v12) != 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005913 RLOGE("getCellInfoListResponse: Invalid response");
Amit Mahajan3df62912017-02-10 01:35:55 +00005914 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
5915 } else {
5916 convertRilCellInfoListToHal(response, responseLen, ret);
5917 }
5918
5919 Return<void> retStatus = radioService[slotId]->mRadioResponse->getCellInfoListResponse(
5920 responseInfo, ret);
5921 radioService[slotId]->checkReturnStatus(retStatus);
5922 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005923 RLOGE("getCellInfoListResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Amit Mahajan3df62912017-02-10 01:35:55 +00005924 }
5925
5926 return 0;
5927}
5928
Amit Mahajan759786a2017-03-03 17:35:47 -08005929int radio::setCellInfoListRateResponse(int slotId,
5930 int responseType,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005931 int serial, RIL_Errno e, void *response,
5932 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005933#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005934 RLOGD("setCellInfoListRateResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005935#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005936
5937 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005938 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005939 populateResponseInfo(responseInfo, serial, responseType, e);
5940 Return<void> retStatus
5941 = radioService[slotId]->mRadioResponse->setCellInfoListRateResponse(responseInfo);
5942 radioService[slotId]->checkReturnStatus(retStatus);
5943 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005944 RLOGE("setCellInfoListRateResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005945 slotId);
5946 }
5947
5948 return 0;
5949}
5950
Amit Mahajan759786a2017-03-03 17:35:47 -08005951int radio::setInitialAttachApnResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005952 int responseType, int serial, RIL_Errno e,
5953 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005954#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005955 RLOGD("setInitialAttachApnResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005956#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005957
5958 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005959 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005960 populateResponseInfo(responseInfo, serial, responseType, e);
5961 Return<void> retStatus
5962 = radioService[slotId]->mRadioResponse->setInitialAttachApnResponse(responseInfo);
5963 radioService[slotId]->checkReturnStatus(retStatus);
5964 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005965 RLOGE("setInitialAttachApnResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005966 slotId);
5967 }
5968
5969 return 0;
5970}
5971
Amit Mahajan759786a2017-03-03 17:35:47 -08005972int radio::getImsRegistrationStateResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005973 int responseType, int serial, RIL_Errno e,
5974 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005975#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005976 RLOGD("getImsRegistrationStateResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005977#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005978
5979 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005980 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005981 populateResponseInfo(responseInfo, serial, responseType, e);
5982 bool isRegistered = false;
5983 int ratFamily = 0;
5984 int numInts = responseLen / sizeof(int);
5985 if (response == NULL || numInts != 2) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005986 RLOGE("getImsRegistrationStateResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005987 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
5988 } else {
5989 int *pInt = (int *) response;
5990 isRegistered = pInt[0] == 1 ? true : false;
5991 ratFamily = pInt[1];
5992 }
5993 Return<void> retStatus
5994 = radioService[slotId]->mRadioResponse->getImsRegistrationStateResponse(
5995 responseInfo, isRegistered, (RadioTechnologyFamily) ratFamily);
5996 radioService[slotId]->checkReturnStatus(retStatus);
5997 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005998 RLOGE("getImsRegistrationStateResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005999 slotId);
6000 }
6001
6002 return 0;
6003}
6004
Amit Mahajan759786a2017-03-03 17:35:47 -08006005int radio::sendImsSmsResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006006 int responseType, int serial, RIL_Errno e, void *response,
6007 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006008#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006009 RLOGD("sendImsSmsResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006010#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006011
6012 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08006013 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006014 SendSmsResult result = makeSendSmsResult(responseInfo, serial, responseType, e, response,
6015 responseLen);
6016
6017 Return<void> retStatus
6018 = radioService[slotId]->mRadioResponse->sendImsSmsResponse(responseInfo, result);
6019 radioService[slotId]->checkReturnStatus(retStatus);
6020 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006021 RLOGE("sendSmsResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006022 }
6023
6024 return 0;
6025}
6026
Amit Mahajan759786a2017-03-03 17:35:47 -08006027int radio::iccTransmitApduBasicChannelResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006028 int responseType, int serial, RIL_Errno e,
6029 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006030#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006031 RLOGD("iccTransmitApduBasicChannelResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006032#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006033
6034 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08006035 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006036 IccIoResult result = responseIccIo(responseInfo, serial, responseType, e, response,
6037 responseLen);
6038
6039 Return<void> retStatus
6040 = radioService[slotId]->mRadioResponse->iccTransmitApduBasicChannelResponse(
6041 responseInfo, result);
6042 radioService[slotId]->checkReturnStatus(retStatus);
6043 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006044 RLOGE("iccTransmitApduBasicChannelResponse: radioService[%d]->mRadioResponse "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006045 "== NULL", slotId);
6046 }
6047
6048 return 0;
6049}
6050
Amit Mahajan759786a2017-03-03 17:35:47 -08006051int radio::iccOpenLogicalChannelResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006052 int responseType, int serial, RIL_Errno e, void *response,
6053 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006054#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006055 RLOGD("iccOpenLogicalChannelResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006056#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006057
6058 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08006059 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006060 populateResponseInfo(responseInfo, serial, responseType, e);
6061 int channelId = -1;
6062 hidl_vec<int8_t> selectResponse;
6063 int numInts = responseLen / sizeof(int);
6064 if (response == NULL || responseLen % sizeof(int) != 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006065 RLOGE("iccOpenLogicalChannelResponse Invalid response: NULL");
Amit Mahajan13058cb2017-06-07 23:10:27 -07006066 if (response != NULL) {
6067 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
6068 }
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006069 } else {
6070 int *pInt = (int *) response;
6071 channelId = pInt[0];
6072 selectResponse.resize(numInts - 1);
6073 for (int i = 1; i < numInts; i++) {
6074 selectResponse[i - 1] = (int8_t) pInt[i];
6075 }
6076 }
6077 Return<void> retStatus
6078 = radioService[slotId]->mRadioResponse->iccOpenLogicalChannelResponse(responseInfo,
6079 channelId, selectResponse);
6080 radioService[slotId]->checkReturnStatus(retStatus);
6081 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006082 RLOGE("iccOpenLogicalChannelResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006083 slotId);
6084 }
6085
6086 return 0;
6087}
6088
Amit Mahajan759786a2017-03-03 17:35:47 -08006089int radio::iccCloseLogicalChannelResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006090 int responseType, int serial, RIL_Errno e,
6091 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006092#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006093 RLOGD("iccCloseLogicalChannelResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006094#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006095
6096 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08006097 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006098 populateResponseInfo(responseInfo, serial, responseType, e);
6099 Return<void> retStatus
6100 = radioService[slotId]->mRadioResponse->iccCloseLogicalChannelResponse(
6101 responseInfo);
6102 radioService[slotId]->checkReturnStatus(retStatus);
6103 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006104 RLOGE("iccCloseLogicalChannelResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006105 slotId);
6106 }
6107
6108 return 0;
6109}
6110
Amit Mahajan759786a2017-03-03 17:35:47 -08006111int radio::iccTransmitApduLogicalChannelResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006112 int responseType, int serial, RIL_Errno e,
6113 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006114#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006115 RLOGD("iccTransmitApduLogicalChannelResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006116#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006117
6118 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08006119 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006120 IccIoResult result = responseIccIo(responseInfo, serial, responseType, e, response,
6121 responseLen);
6122
6123 Return<void> retStatus
6124 = radioService[slotId]->mRadioResponse->iccTransmitApduLogicalChannelResponse(
6125 responseInfo, result);
6126 radioService[slotId]->checkReturnStatus(retStatus);
6127 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006128 RLOGE("iccTransmitApduLogicalChannelResponse: radioService[%d]->mRadioResponse "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006129 "== NULL", slotId);
6130 }
6131
6132 return 0;
6133}
6134
Amit Mahajan759786a2017-03-03 17:35:47 -08006135int radio::nvReadItemResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006136 int responseType, int serial, RIL_Errno e,
6137 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006138#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006139 RLOGD("nvReadItemResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006140#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006141
6142 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08006143 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006144 populateResponseInfo(responseInfo, serial, responseType, e);
6145 Return<void> retStatus = radioService[slotId]->mRadioResponse->nvReadItemResponse(
6146 responseInfo,
6147 convertCharPtrToHidlString((char *) response));
6148 radioService[slotId]->checkReturnStatus(retStatus);
6149 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006150 RLOGE("nvReadItemResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006151 }
6152
6153 return 0;
6154}
6155
Amit Mahajan759786a2017-03-03 17:35:47 -08006156int radio::nvWriteItemResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006157 int responseType, int serial, RIL_Errno e,
6158 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006159#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006160 RLOGD("nvWriteItemResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006161#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006162
6163 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08006164 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006165 populateResponseInfo(responseInfo, serial, responseType, e);
6166 Return<void> retStatus
6167 = radioService[slotId]->mRadioResponse->nvWriteItemResponse(responseInfo);
6168 radioService[slotId]->checkReturnStatus(retStatus);
6169 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006170 RLOGE("nvWriteItemResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006171 }
6172
6173 return 0;
6174}
6175
Amit Mahajan759786a2017-03-03 17:35:47 -08006176int radio::nvWriteCdmaPrlResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006177 int responseType, int serial, RIL_Errno e,
6178 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006179#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006180 RLOGD("nvWriteCdmaPrlResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006181#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006182
6183 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08006184 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006185 populateResponseInfo(responseInfo, serial, responseType, e);
6186 Return<void> retStatus
6187 = radioService[slotId]->mRadioResponse->nvWriteCdmaPrlResponse(responseInfo);
6188 radioService[slotId]->checkReturnStatus(retStatus);
6189 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006190 RLOGE("nvWriteCdmaPrlResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006191 }
6192
6193 return 0;
6194}
6195
Amit Mahajan759786a2017-03-03 17:35:47 -08006196int radio::nvResetConfigResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006197 int responseType, int serial, RIL_Errno e,
6198 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006199#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006200 RLOGD("nvResetConfigResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006201#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006202
6203 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08006204 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006205 populateResponseInfo(responseInfo, serial, responseType, e);
6206 Return<void> retStatus
6207 = radioService[slotId]->mRadioResponse->nvResetConfigResponse(responseInfo);
6208 radioService[slotId]->checkReturnStatus(retStatus);
6209 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006210 RLOGE("nvResetConfigResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006211 }
6212
6213 return 0;
6214}
6215
Amit Mahajan759786a2017-03-03 17:35:47 -08006216int radio::setUiccSubscriptionResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006217 int responseType, int serial, RIL_Errno e,
6218 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006219#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006220 RLOGD("setUiccSubscriptionResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006221#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006222
6223 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08006224 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006225 populateResponseInfo(responseInfo, serial, responseType, e);
6226 Return<void> retStatus
6227 = radioService[slotId]->mRadioResponse->setUiccSubscriptionResponse(responseInfo);
6228 radioService[slotId]->checkReturnStatus(retStatus);
6229 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006230 RLOGE("setUiccSubscriptionResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006231 slotId);
6232 }
6233
6234 return 0;
6235}
6236
Amit Mahajan759786a2017-03-03 17:35:47 -08006237int radio::setDataAllowedResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006238 int responseType, int serial, RIL_Errno e,
6239 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006240#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006241 RLOGD("setDataAllowedResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006242#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006243
6244 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08006245 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006246 populateResponseInfo(responseInfo, serial, responseType, e);
6247 Return<void> retStatus
6248 = radioService[slotId]->mRadioResponse->setDataAllowedResponse(responseInfo);
6249 radioService[slotId]->checkReturnStatus(retStatus);
6250 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006251 RLOGE("setDataAllowedResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006252 }
6253
6254 return 0;
6255}
6256
Amit Mahajan759786a2017-03-03 17:35:47 -08006257int radio::getHardwareConfigResponse(int slotId,
Amit Mahajan3df62912017-02-10 01:35:55 +00006258 int responseType, int serial, RIL_Errno e,
6259 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006260#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006261 RLOGD("getHardwareConfigResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006262#endif
Amit Mahajan3df62912017-02-10 01:35:55 +00006263
6264 if (radioService[slotId]->mRadioResponse != NULL) {
Amit Mahajan3da9ac02017-02-13 13:41:28 -08006265 RadioResponseInfo responseInfo = {};
Amit Mahajan3df62912017-02-10 01:35:55 +00006266 populateResponseInfo(responseInfo, serial, responseType, e);
6267
6268 hidl_vec<HardwareConfig> result;
Amit Mahajan13058cb2017-06-07 23:10:27 -07006269 if ((response == NULL && responseLen != 0)
6270 || responseLen % sizeof(RIL_HardwareConfig) != 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006271 RLOGE("hardwareConfigChangedInd: invalid response");
Amit Mahajan3df62912017-02-10 01:35:55 +00006272 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
6273 } else {
6274 convertRilHardwareConfigListToHal(response, responseLen, result);
6275 }
6276
6277 Return<void> retStatus = radioService[slotId]->mRadioResponse->getHardwareConfigResponse(
6278 responseInfo, result);
6279 radioService[slotId]->checkReturnStatus(retStatus);
6280 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006281 RLOGE("getHardwareConfigResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Amit Mahajan3df62912017-02-10 01:35:55 +00006282 }
6283
6284 return 0;
6285}
6286
Amit Mahajan759786a2017-03-03 17:35:47 -08006287int radio::requestIccSimAuthenticationResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006288 int responseType, int serial, RIL_Errno e,
6289 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006290#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006291 RLOGD("requestIccSimAuthenticationResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006292#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006293
6294 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08006295 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006296 IccIoResult result = responseIccIo(responseInfo, serial, responseType, e, response,
6297 responseLen);
6298
6299 Return<void> retStatus
6300 = radioService[slotId]->mRadioResponse->requestIccSimAuthenticationResponse(
6301 responseInfo, result);
6302 radioService[slotId]->checkReturnStatus(retStatus);
6303 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006304 RLOGE("requestIccSimAuthenticationResponse: radioService[%d]->mRadioResponse "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006305 "== NULL", slotId);
6306 }
6307
6308 return 0;
6309}
6310
Amit Mahajan759786a2017-03-03 17:35:47 -08006311int radio::setDataProfileResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006312 int responseType, int serial, RIL_Errno e,
6313 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006314#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006315 RLOGD("setDataProfileResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006316#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006317
6318 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08006319 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006320 populateResponseInfo(responseInfo, serial, responseType, e);
6321 Return<void> retStatus
6322 = radioService[slotId]->mRadioResponse->setDataProfileResponse(responseInfo);
6323 radioService[slotId]->checkReturnStatus(retStatus);
6324 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006325 RLOGE("setDataProfileResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006326 }
6327
6328 return 0;
6329}
6330
Amit Mahajan759786a2017-03-03 17:35:47 -08006331int radio::requestShutdownResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006332 int responseType, int serial, RIL_Errno e,
6333 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006334#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006335 RLOGD("requestShutdownResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006336#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006337
6338 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08006339 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006340 populateResponseInfo(responseInfo, serial, responseType, e);
6341 Return<void> retStatus
6342 = radioService[slotId]->mRadioResponse->requestShutdownResponse(responseInfo);
6343 radioService[slotId]->checkReturnStatus(retStatus);
6344 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006345 RLOGE("requestShutdownResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006346 }
6347
6348 return 0;
6349}
6350
Amit Mahajan3df62912017-02-10 01:35:55 +00006351void responseRadioCapability(RadioResponseInfo& responseInfo, int serial,
6352 int responseType, RIL_Errno e, void *response, size_t responseLen, RadioCapability& rc) {
6353 populateResponseInfo(responseInfo, serial, responseType, e);
6354
Amit Mahajan1fbff082017-02-24 11:24:39 -08006355 if (response == NULL || responseLen != sizeof(RIL_RadioCapability)) {
Amit Mahajan3df62912017-02-10 01:35:55 +00006356 RLOGE("responseRadioCapability: Invalid response");
6357 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
Amit Mahajan3da9ac02017-02-13 13:41:28 -08006358 rc.logicalModemUuid = hidl_string();
Amit Mahajan3df62912017-02-10 01:35:55 +00006359 } else {
6360 convertRilRadioCapabilityToHal(response, responseLen, rc);
6361 }
6362}
6363
Amit Mahajan759786a2017-03-03 17:35:47 -08006364int radio::getRadioCapabilityResponse(int slotId,
Amit Mahajan3df62912017-02-10 01:35:55 +00006365 int responseType, int serial, RIL_Errno e,
6366 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006367#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006368 RLOGD("getRadioCapabilityResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006369#endif
Amit Mahajan3df62912017-02-10 01:35:55 +00006370
6371 if (radioService[slotId]->mRadioResponse != NULL) {
Amit Mahajan3da9ac02017-02-13 13:41:28 -08006372 RadioResponseInfo responseInfo = {};
6373 RadioCapability result = {};
Amit Mahajan3df62912017-02-10 01:35:55 +00006374 responseRadioCapability(responseInfo, serial, responseType, e, response, responseLen,
6375 result);
6376 Return<void> retStatus = radioService[slotId]->mRadioResponse->getRadioCapabilityResponse(
6377 responseInfo, result);
6378 radioService[slotId]->checkReturnStatus(retStatus);
6379 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006380 RLOGE("getRadioCapabilityResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Amit Mahajan3df62912017-02-10 01:35:55 +00006381 }
6382
6383 return 0;
6384}
6385
Amit Mahajan759786a2017-03-03 17:35:47 -08006386int radio::setRadioCapabilityResponse(int slotId,
Amit Mahajan3df62912017-02-10 01:35:55 +00006387 int responseType, int serial, RIL_Errno e,
6388 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006389#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006390 RLOGD("setRadioCapabilityResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006391#endif
Amit Mahajan3df62912017-02-10 01:35:55 +00006392
6393 if (radioService[slotId]->mRadioResponse != NULL) {
Amit Mahajan3da9ac02017-02-13 13:41:28 -08006394 RadioResponseInfo responseInfo = {};
6395 RadioCapability result = {};
Amit Mahajan3df62912017-02-10 01:35:55 +00006396 responseRadioCapability(responseInfo, serial, responseType, e, response, responseLen,
6397 result);
6398 Return<void> retStatus = radioService[slotId]->mRadioResponse->setRadioCapabilityResponse(
6399 responseInfo, result);
6400 radioService[slotId]->checkReturnStatus(retStatus);
6401 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006402 RLOGE("setRadioCapabilityResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Amit Mahajan3df62912017-02-10 01:35:55 +00006403 }
6404
6405 return 0;
6406}
6407
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006408LceStatusInfo responseLceStatusInfo(RadioResponseInfo& responseInfo, int serial, int responseType,
6409 RIL_Errno e, void *response, size_t responseLen) {
6410 populateResponseInfo(responseInfo, serial, responseType, e);
Jack Yuf68e0da2017-02-07 14:53:09 -08006411 LceStatusInfo result = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006412
6413 if (response == NULL || responseLen != sizeof(RIL_LceStatusInfo)) {
6414 RLOGE("Invalid response: NULL");
6415 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006416 } else {
6417 RIL_LceStatusInfo *resp = (RIL_LceStatusInfo *) response;
6418 result.lceStatus = (LceStatus) resp->lce_status;
6419 result.actualIntervalMs = (uint8_t) resp->actual_interval_ms;
6420 }
6421 return result;
6422}
6423
Amit Mahajan759786a2017-03-03 17:35:47 -08006424int radio::startLceServiceResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006425 int responseType, int serial, RIL_Errno e,
6426 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006427#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006428 RLOGD("startLceServiceResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006429#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006430
6431 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08006432 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006433 LceStatusInfo result = responseLceStatusInfo(responseInfo, serial, responseType, e,
6434 response, responseLen);
6435
6436 Return<void> retStatus
6437 = radioService[slotId]->mRadioResponse->startLceServiceResponse(responseInfo,
6438 result);
6439 radioService[slotId]->checkReturnStatus(retStatus);
6440 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006441 RLOGE("startLceServiceResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006442 }
6443
6444 return 0;
6445}
6446
Amit Mahajan759786a2017-03-03 17:35:47 -08006447int radio::stopLceServiceResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006448 int responseType, int serial, RIL_Errno e,
6449 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006450#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006451 RLOGD("stopLceServiceResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006452#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006453
6454 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08006455 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006456 LceStatusInfo result = responseLceStatusInfo(responseInfo, serial, responseType, e,
6457 response, responseLen);
6458
6459 Return<void> retStatus
6460 = radioService[slotId]->mRadioResponse->stopLceServiceResponse(responseInfo,
6461 result);
6462 radioService[slotId]->checkReturnStatus(retStatus);
6463 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006464 RLOGE("stopLceServiceResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006465 }
6466
6467 return 0;
6468}
6469
Amit Mahajan759786a2017-03-03 17:35:47 -08006470int radio::pullLceDataResponse(int slotId,
Amit Mahajan3df62912017-02-10 01:35:55 +00006471 int responseType, int serial, RIL_Errno e,
6472 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006473#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006474 RLOGD("pullLceDataResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006475#endif
Amit Mahajan3df62912017-02-10 01:35:55 +00006476
6477 if (radioService[slotId]->mRadioResponse != NULL) {
Amit Mahajan3da9ac02017-02-13 13:41:28 -08006478 RadioResponseInfo responseInfo = {};
Amit Mahajan3df62912017-02-10 01:35:55 +00006479 populateResponseInfo(responseInfo, serial, responseType, e);
6480
Amit Mahajan3da9ac02017-02-13 13:41:28 -08006481 LceDataInfo result = {};
Amit Mahajan3df62912017-02-10 01:35:55 +00006482 if (response == NULL || responseLen != sizeof(RIL_LceDataInfo)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006483 RLOGE("pullLceDataResponse: Invalid response");
Amit Mahajan3df62912017-02-10 01:35:55 +00006484 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
Amit Mahajan3df62912017-02-10 01:35:55 +00006485 } else {
6486 convertRilLceDataInfoToHal(response, responseLen, result);
6487 }
6488
6489 Return<void> retStatus = radioService[slotId]->mRadioResponse->pullLceDataResponse(
6490 responseInfo, result);
6491 radioService[slotId]->checkReturnStatus(retStatus);
6492 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006493 RLOGE("pullLceDataResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Amit Mahajan3df62912017-02-10 01:35:55 +00006494 }
6495
6496 return 0;
6497}
6498
Amit Mahajan759786a2017-03-03 17:35:47 -08006499int radio::getModemActivityInfoResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006500 int responseType, int serial, RIL_Errno e,
6501 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006502#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006503 RLOGD("getModemActivityInfoResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006504#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006505
6506 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08006507 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006508 populateResponseInfo(responseInfo, serial, responseType, e);
6509 ActivityStatsInfo info;
6510 if (response == NULL || responseLen != sizeof(RIL_ActivityStatsInfo)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006511 RLOGE("getModemActivityInfoResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006512 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006513 } else {
6514 RIL_ActivityStatsInfo *resp = (RIL_ActivityStatsInfo *)response;
6515 info.sleepModeTimeMs = resp->sleep_mode_time_ms;
6516 info.idleModeTimeMs = resp->idle_mode_time_ms;
6517 for(int i = 0; i < RIL_NUM_TX_POWER_LEVELS; i++) {
6518 info.txmModetimeMs[i] = resp->tx_mode_time_ms[i];
6519 }
6520 info.rxModeTimeMs = resp->rx_mode_time_ms;
6521 }
6522
6523 Return<void> retStatus
6524 = radioService[slotId]->mRadioResponse->getModemActivityInfoResponse(responseInfo,
6525 info);
6526 radioService[slotId]->checkReturnStatus(retStatus);
6527 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006528 RLOGE("getModemActivityInfoResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006529 slotId);
6530 }
6531
6532 return 0;
6533}
6534
Amit Mahajan759786a2017-03-03 17:35:47 -08006535int radio::setAllowedCarriersResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006536 int responseType, int serial, RIL_Errno e,
6537 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006538#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006539 RLOGD("setAllowedCarriersResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006540#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006541
6542 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08006543 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006544 int ret = responseInt(responseInfo, serial, responseType, e, response, responseLen);
6545 Return<void> retStatus
6546 = radioService[slotId]->mRadioResponse->setAllowedCarriersResponse(responseInfo,
6547 ret);
6548 radioService[slotId]->checkReturnStatus(retStatus);
6549 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006550 RLOGE("setAllowedCarriersResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006551 slotId);
6552 }
6553
6554 return 0;
6555}
6556
Amit Mahajan759786a2017-03-03 17:35:47 -08006557int radio::getAllowedCarriersResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006558 int responseType, int serial, RIL_Errno e,
6559 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006560#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006561 RLOGD("getAllowedCarriersResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006562#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006563
6564 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08006565 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006566 populateResponseInfo(responseInfo, serial, responseType, e);
Jack Yuf68e0da2017-02-07 14:53:09 -08006567 CarrierRestrictions carrierInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006568 bool allAllowed = true;
Jayachandran C70f7d2e2017-04-28 00:57:13 -07006569 if (response == NULL) {
6570#if VDBG
6571 RLOGD("getAllowedCarriersResponse response is NULL: all allowed");
6572#endif
6573 carrierInfo.allowedCarriers.resize(0);
6574 carrierInfo.excludedCarriers.resize(0);
6575 } else if (responseLen != sizeof(RIL_CarrierRestrictions)) {
6576 RLOGE("getAllowedCarriersResponse Invalid response");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006577 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
6578 } else {
6579 RIL_CarrierRestrictions *pCr = (RIL_CarrierRestrictions *)response;
6580 if (pCr->len_allowed_carriers > 0 || pCr->len_excluded_carriers > 0) {
6581 allAllowed = false;
6582 }
6583
6584 carrierInfo.allowedCarriers.resize(pCr->len_allowed_carriers);
6585 for(int i = 0; i < pCr->len_allowed_carriers; i++) {
6586 RIL_Carrier *carrier = pCr->allowed_carriers + i;
6587 carrierInfo.allowedCarriers[i].mcc = convertCharPtrToHidlString(carrier->mcc);
6588 carrierInfo.allowedCarriers[i].mnc = convertCharPtrToHidlString(carrier->mnc);
6589 carrierInfo.allowedCarriers[i].matchType = (CarrierMatchType) carrier->match_type;
6590 carrierInfo.allowedCarriers[i].matchData =
6591 convertCharPtrToHidlString(carrier->match_data);
6592 }
6593
6594 carrierInfo.excludedCarriers.resize(pCr->len_excluded_carriers);
6595 for(int i = 0; i < pCr->len_excluded_carriers; i++) {
6596 RIL_Carrier *carrier = pCr->excluded_carriers + i;
6597 carrierInfo.excludedCarriers[i].mcc = convertCharPtrToHidlString(carrier->mcc);
6598 carrierInfo.excludedCarriers[i].mnc = convertCharPtrToHidlString(carrier->mnc);
6599 carrierInfo.excludedCarriers[i].matchType = (CarrierMatchType) carrier->match_type;
6600 carrierInfo.excludedCarriers[i].matchData =
6601 convertCharPtrToHidlString(carrier->match_data);
6602 }
6603 }
6604
6605 Return<void> retStatus
6606 = radioService[slotId]->mRadioResponse->getAllowedCarriersResponse(responseInfo,
6607 allAllowed, carrierInfo);
6608 radioService[slotId]->checkReturnStatus(retStatus);
6609 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006610 RLOGE("getAllowedCarriersResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006611 slotId);
6612 }
6613
6614 return 0;
6615}
6616
Amit Mahajan759786a2017-03-03 17:35:47 -08006617int radio::sendDeviceStateResponse(int slotId,
Jack Yu11ab4042017-02-21 17:08:01 -08006618 int responseType, int serial, RIL_Errno e,
6619 void *response, size_t responselen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006620#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006621 RLOGD("sendDeviceStateResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006622#endif
Jack Yu11ab4042017-02-21 17:08:01 -08006623
6624 if (radioService[slotId]->mRadioResponse != NULL) {
6625 RadioResponseInfo responseInfo = {};
6626 populateResponseInfo(responseInfo, serial, responseType, e);
6627 Return<void> retStatus
6628 = radioService[slotId]->mRadioResponse->sendDeviceStateResponse(responseInfo);
6629 radioService[slotId]->checkReturnStatus(retStatus);
6630 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006631 RLOGE("sendDeviceStateResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Jack Yu11ab4042017-02-21 17:08:01 -08006632 }
6633
6634 return 0;
6635}
6636
pkanwardb8e0942017-03-17 12:49:34 -07006637int radio::setCarrierInfoForImsiEncryptionResponse(int slotId,
6638 int responseType, int serial, RIL_Errno e,
6639 void *response, size_t responseLen) {
6640 RLOGD("setCarrierInfoForImsiEncryptionResponse: serial %d", serial);
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07006641 if (radioService[slotId]->mRadioResponseV1_1 != NULL) {
pkanwardb8e0942017-03-17 12:49:34 -07006642 RadioResponseInfo responseInfo = {};
6643 populateResponseInfo(responseInfo, serial, responseType, e);
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07006644 Return<void> retStatus = radioService[slotId]->mRadioResponseV1_1->
6645 setCarrierInfoForImsiEncryptionResponse(responseInfo);
6646 radioService[slotId]->checkReturnStatus(retStatus);
pkanwardb8e0942017-03-17 12:49:34 -07006647 } else {
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07006648 RLOGE("setCarrierInfoForImsiEncryptionResponse: radioService[%d]->mRadioResponseV1_1 == "
6649 "NULL", slotId);
pkanwardb8e0942017-03-17 12:49:34 -07006650 }
6651 return 0;
6652}
6653
Amit Mahajan759786a2017-03-03 17:35:47 -08006654int radio::setIndicationFilterResponse(int slotId,
Jack Yu11ab4042017-02-21 17:08:01 -08006655 int responseType, int serial, RIL_Errno e,
6656 void *response, size_t responselen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006657#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006658 RLOGD("setIndicationFilterResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006659#endif
Jack Yu11ab4042017-02-21 17:08:01 -08006660
6661 if (radioService[slotId]->mRadioResponse != NULL) {
6662 RadioResponseInfo responseInfo = {};
6663 populateResponseInfo(responseInfo, serial, responseType, e);
6664 Return<void> retStatus
6665 = radioService[slotId]->mRadioResponse->setIndicationFilterResponse(responseInfo);
6666 radioService[slotId]->checkReturnStatus(retStatus);
6667 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006668 RLOGE("setIndicationFilterResponse: radioService[%d]->mRadioResponse == NULL",
Jack Yu11ab4042017-02-21 17:08:01 -08006669 slotId);
6670 }
6671
6672 return 0;
6673}
6674
Amit Mahajan759786a2017-03-03 17:35:47 -08006675int radio::setSimCardPowerResponse(int slotId,
Wileen Chiu718c0bf2017-01-04 11:37:19 -08006676 int responseType, int serial, RIL_Errno e,
6677 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006678#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006679 RLOGD("setSimCardPowerResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006680#endif
Wileen Chiu718c0bf2017-01-04 11:37:19 -08006681
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07006682 if (radioService[slotId]->mRadioResponse != NULL
6683 || radioService[slotId]->mRadioResponseV1_1 != NULL) {
Wileen Chiu718c0bf2017-01-04 11:37:19 -08006684 RadioResponseInfo responseInfo = {};
6685 populateResponseInfo(responseInfo, serial, responseType, e);
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07006686 if (radioService[slotId]->mRadioResponseV1_1 != NULL) {
6687 Return<void> retStatus = radioService[slotId]->mRadioResponseV1_1->
6688 setSimCardPowerResponse_1_1(responseInfo);
Grace Chen08eb6542017-03-23 18:39:48 -07006689 radioService[slotId]->checkReturnStatus(retStatus);
6690 } else {
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07006691 RLOGD("setSimCardPowerResponse: radioService[%d]->mRadioResponseV1_1 == NULL",
Grace Chen08eb6542017-03-23 18:39:48 -07006692 slotId);
6693 Return<void> retStatus
6694 = radioService[slotId]->mRadioResponse->setSimCardPowerResponse(responseInfo);
6695 radioService[slotId]->checkReturnStatus(retStatus);
6696 }
Wileen Chiu718c0bf2017-01-04 11:37:19 -08006697 } else {
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07006698 RLOGE("setSimCardPowerResponse: radioService[%d]->mRadioResponse == NULL && "
6699 "radioService[%d]->mRadioResponseV1_1 == NULL", slotId, slotId);
Wileen Chiu718c0bf2017-01-04 11:37:19 -08006700 }
Wileen Chiu718c0bf2017-01-04 11:37:19 -08006701 return 0;
6702}
6703
yinxu8688abd2017-05-22 11:26:45 -07006704int radio::startNetworkScanResponse(int slotId, int responseType, int serial, RIL_Errno e,
6705 void *response, size_t responseLen) {
6706#if VDBG
6707 RLOGD("startNetworkScanResponse: serial %d", serial);
6708#endif
6709
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07006710 if (radioService[slotId]->mRadioResponseV1_1 != NULL) {
yinxu8688abd2017-05-22 11:26:45 -07006711 RadioResponseInfo responseInfo = {};
6712 populateResponseInfo(responseInfo, serial, responseType, e);
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07006713 Return<void> retStatus
6714 = radioService[slotId]->mRadioResponseV1_1->startNetworkScanResponse(responseInfo);
6715 radioService[slotId]->checkReturnStatus(retStatus);
yinxu8688abd2017-05-22 11:26:45 -07006716 } else {
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07006717 RLOGE("startNetworkScanResponse: radioService[%d]->mRadioResponseV1_1 == NULL", slotId);
yinxu8688abd2017-05-22 11:26:45 -07006718 }
6719
6720 return 0;
6721}
6722
6723int radio::stopNetworkScanResponse(int slotId, int responseType, int serial, RIL_Errno e,
6724 void *response, size_t responseLen) {
6725#if VDBG
6726 RLOGD("stopNetworkScanResponse: serial %d", serial);
6727#endif
6728
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07006729 if (radioService[slotId]->mRadioResponseV1_1 != NULL) {
yinxu8688abd2017-05-22 11:26:45 -07006730 RadioResponseInfo responseInfo = {};
6731 populateResponseInfo(responseInfo, serial, responseType, e);
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07006732 Return<void> retStatus
6733 = radioService[slotId]->mRadioResponseV1_1->stopNetworkScanResponse(responseInfo);
6734 radioService[slotId]->checkReturnStatus(retStatus);
yinxu8688abd2017-05-22 11:26:45 -07006735 } else {
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07006736 RLOGE("stopNetworkScanResponse: radioService[%d]->mRadioResponseV1_1 == NULL", slotId);
yinxu8688abd2017-05-22 11:26:45 -07006737 }
6738
6739 return 0;
6740}
6741
Nathan Harold6a8809d2017-07-07 19:28:58 -07006742void convertRilKeepaliveStatusToHal(const RIL_KeepaliveStatus *rilStatus,
6743 V1_1::KeepaliveStatus& halStatus) {
6744 halStatus.sessionHandle = rilStatus->sessionHandle;
6745 halStatus.code = static_cast<V1_1::KeepaliveStatusCode>(rilStatus->code);
6746}
6747
6748int radio::startKeepaliveResponse(int slotId, int responseType, int serial, RIL_Errno e,
6749 void *response, size_t responseLen) {
6750#if VDBG
6751 RLOGD("%s(): %d", __FUNCTION__, serial);
6752#endif
6753 RadioResponseInfo responseInfo = {};
6754 populateResponseInfo(responseInfo, serial, responseType, e);
6755
6756 // If we don't have a radio service, there's nothing we can do
6757 if (radioService[slotId]->mRadioResponseV1_1 == NULL) {
6758 RLOGE("%s: radioService[%d]->mRadioResponseV1_1 == NULL", __FUNCTION__, slotId);
6759 return 0;
6760 }
6761
6762 V1_1::KeepaliveStatus ks = {};
6763 if (response == NULL || responseLen != sizeof(V1_1::KeepaliveStatus)) {
6764 RLOGE("%s: invalid response - %d", __FUNCTION__, static_cast<int>(e));
6765 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
6766 } else {
6767 convertRilKeepaliveStatusToHal(static_cast<RIL_KeepaliveStatus*>(response), ks);
6768 }
6769
6770 Return<void> retStatus =
6771 radioService[slotId]->mRadioResponseV1_1->startKeepaliveResponse(responseInfo, ks);
6772 radioService[slotId]->checkReturnStatus(retStatus);
6773 return 0;
6774}
6775
6776int radio::stopKeepaliveResponse(int slotId, int responseType, int serial, RIL_Errno e,
6777 void *response, size_t responseLen) {
6778#if VDBG
6779 RLOGD("%s(): %d", __FUNCTION__, serial);
6780#endif
6781 RadioResponseInfo responseInfo = {};
6782 populateResponseInfo(responseInfo, serial, responseType, e);
6783
6784 // If we don't have a radio service, there's nothing we can do
6785 if (radioService[slotId]->mRadioResponseV1_1 == NULL) {
6786 RLOGE("%s: radioService[%d]->mRadioResponseV1_1 == NULL", __FUNCTION__, slotId);
6787 return 0;
6788 }
6789
6790 Return<void> retStatus =
6791 radioService[slotId]->mRadioResponseV1_1->stopKeepaliveResponse(responseInfo);
6792 radioService[slotId]->checkReturnStatus(retStatus);
6793 return 0;
6794}
6795
Amit Mahajan759786a2017-03-03 17:35:47 -08006796int radio::sendRequestRawResponse(int slotId,
Amit Mahajan439da362017-02-13 17:43:04 -08006797 int responseType, int serial, RIL_Errno e,
6798 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006799#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006800 RLOGD("sendRequestRawResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006801#endif
Amit Mahajan439da362017-02-13 17:43:04 -08006802
Steven Moreland6cc40042018-03-20 11:20:05 -07006803 if (!kOemHookEnabled) return 0;
6804
Amit Mahajan439da362017-02-13 17:43:04 -08006805 if (oemHookService[slotId]->mOemHookResponse != NULL) {
6806 RadioResponseInfo responseInfo = {};
6807 populateResponseInfo(responseInfo, serial, responseType, e);
6808 hidl_vec<uint8_t> data;
6809
6810 if (response == NULL) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006811 RLOGE("sendRequestRawResponse: Invalid response");
Amit Mahajan439da362017-02-13 17:43:04 -08006812 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
6813 } else {
6814 data.setToExternal((uint8_t *) response, responseLen);
6815 }
6816 Return<void> retStatus = oemHookService[slotId]->mOemHookResponse->
6817 sendRequestRawResponse(responseInfo, data);
Amit Mahajand423d192017-03-16 17:04:01 -07006818 checkReturnStatus(slotId, retStatus, false);
Amit Mahajan439da362017-02-13 17:43:04 -08006819 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006820 RLOGE("sendRequestRawResponse: oemHookService[%d]->mOemHookResponse == NULL",
Amit Mahajan439da362017-02-13 17:43:04 -08006821 slotId);
6822 }
6823
6824 return 0;
6825}
6826
Amit Mahajan759786a2017-03-03 17:35:47 -08006827int radio::sendRequestStringsResponse(int slotId,
Amit Mahajan439da362017-02-13 17:43:04 -08006828 int responseType, int serial, RIL_Errno e,
6829 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006830#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006831 RLOGD("sendRequestStringsResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006832#endif
Amit Mahajan439da362017-02-13 17:43:04 -08006833
Steven Moreland6cc40042018-03-20 11:20:05 -07006834 if (!kOemHookEnabled) return 0;
6835
Amit Mahajan439da362017-02-13 17:43:04 -08006836 if (oemHookService[slotId]->mOemHookResponse != NULL) {
6837 RadioResponseInfo responseInfo = {};
6838 populateResponseInfo(responseInfo, serial, responseType, e);
6839 hidl_vec<hidl_string> data;
6840
Amit Mahajan13058cb2017-06-07 23:10:27 -07006841 if ((response == NULL && responseLen != 0) || responseLen % sizeof(char *) != 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006842 RLOGE("sendRequestStringsResponse Invalid response: NULL");
Amit Mahajan439da362017-02-13 17:43:04 -08006843 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
6844 } else {
6845 char **resp = (char **) response;
6846 int numStrings = responseLen / sizeof(char *);
6847 data.resize(numStrings);
6848 for (int i = 0; i < numStrings; i++) {
6849 data[i] = convertCharPtrToHidlString(resp[i]);
6850 }
6851 }
6852 Return<void> retStatus
6853 = oemHookService[slotId]->mOemHookResponse->sendRequestStringsResponse(
6854 responseInfo, data);
Amit Mahajand423d192017-03-16 17:04:01 -07006855 checkReturnStatus(slotId, retStatus, false);
Amit Mahajan439da362017-02-13 17:43:04 -08006856 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006857 RLOGE("sendRequestStringsResponse: oemHookService[%d]->mOemHookResponse == "
Amit Mahajan439da362017-02-13 17:43:04 -08006858 "NULL", slotId);
6859 }
6860
6861 return 0;
6862}
6863
Nathan Harold6a8809d2017-07-07 19:28:58 -07006864/***************************************************************************************************
6865 * INDICATION FUNCTIONS
6866 * The below function handle unsolicited messages coming from the Radio
6867 * (messages for which there is no pending request)
6868 **************************************************************************************************/
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006869
Amit Mahajan5829a472016-12-28 17:28:07 -08006870RadioIndicationType convertIntToRadioIndicationType(int indicationType) {
6871 return indicationType == RESPONSE_UNSOLICITED ? (RadioIndicationType::UNSOLICITED) :
6872 (RadioIndicationType::UNSOLICITED_ACK_EXP);
6873}
6874
Amit Mahajan759786a2017-03-03 17:35:47 -08006875int radio::radioStateChangedInd(int slotId,
Amit Mahajan1f652692017-03-01 12:08:46 -08006876 int indicationType, int token, RIL_Errno e, void *response,
6877 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08006878 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajanb3a11bb2017-05-15 16:41:44 -07006879 RadioState radioState =
6880 (RadioState) CALL_ONSTATEREQUEST(slotId);
Amit Mahajan111ddca2017-03-03 12:05:13 -08006881 RLOGD("radioStateChangedInd: radioState %d", radioState);
Amit Mahajan17249842017-01-19 15:05:45 -08006882 Return<void> retStatus = radioService[slotId]->mRadioIndication->radioStateChanged(
Amit Mahajan1f652692017-03-01 12:08:46 -08006883 convertIntToRadioIndicationType(indicationType), radioState);
Amit Mahajan17249842017-01-19 15:05:45 -08006884 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajancd77a5b2016-08-25 11:19:21 -07006885 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006886 RLOGE("radioStateChangedInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajancd77a5b2016-08-25 11:19:21 -07006887 }
Amit Mahajan1f652692017-03-01 12:08:46 -08006888
6889 return 0;
Amit Mahajancd77a5b2016-08-25 11:19:21 -07006890}
6891
Amit Mahajan759786a2017-03-03 17:35:47 -08006892int radio::callStateChangedInd(int slotId,
Amit Mahajan5829a472016-12-28 17:28:07 -08006893 int indicationType, int token, RIL_Errno e, void *response,
6894 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08006895 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006896#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006897 RLOGD("callStateChangedInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07006898#endif
Amit Mahajan17249842017-01-19 15:05:45 -08006899 Return<void> retStatus = radioService[slotId]->mRadioIndication->callStateChanged(
Amit Mahajan5829a472016-12-28 17:28:07 -08006900 convertIntToRadioIndicationType(indicationType));
Amit Mahajan17249842017-01-19 15:05:45 -08006901 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08006902 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006903 RLOGE("callStateChangedInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08006904 }
6905
6906 return 0;
6907}
6908
Amit Mahajan759786a2017-03-03 17:35:47 -08006909int radio::networkStateChangedInd(int slotId,
Amit Mahajan1f652692017-03-01 12:08:46 -08006910 int indicationType, int token, RIL_Errno e, void *response,
6911 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08006912 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006913#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006914 RLOGD("networkStateChangedInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07006915#endif
Jack Yu06181bb2017-01-10 12:10:41 -08006916 Return<void> retStatus = radioService[slotId]->mRadioIndication->networkStateChanged(
Amit Mahajan5829a472016-12-28 17:28:07 -08006917 convertIntToRadioIndicationType(indicationType));
Amit Mahajan17249842017-01-19 15:05:45 -08006918 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08006919 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006920 RLOGE("networkStateChangedInd: radioService[%d]->mRadioIndication == NULL",
Amit Mahajan2fa9e632017-01-06 16:55:33 -08006921 slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08006922 }
6923
6924 return 0;
6925}
6926
6927uint8_t hexCharToInt(uint8_t c) {
6928 if (c >= '0' && c <= '9') return (c - '0');
6929 if (c >= 'A' && c <= 'F') return (c - 'A' + 10);
6930 if (c >= 'a' && c <= 'f') return (c - 'a' + 10);
6931
6932 return INVALID_HEX_CHAR;
6933}
6934
6935uint8_t * convertHexStringToBytes(void *response, size_t responseLen) {
6936 if (responseLen % 2 != 0) {
6937 return NULL;
6938 }
6939
6940 uint8_t *bytes = (uint8_t *)calloc(responseLen/2, sizeof(uint8_t));
6941 if (bytes == NULL) {
6942 RLOGE("convertHexStringToBytes: cannot allocate memory for bytes string");
6943 return NULL;
6944 }
6945 uint8_t *hexString = (uint8_t *)response;
6946
Wei Wang100ac9b2017-02-03 14:18:07 -08006947 for (size_t i = 0; i < responseLen; i += 2) {
Amit Mahajan5829a472016-12-28 17:28:07 -08006948 uint8_t hexChar1 = hexCharToInt(hexString[i]);
6949 uint8_t hexChar2 = hexCharToInt(hexString[i + 1]);
6950
6951 if (hexChar1 == INVALID_HEX_CHAR || hexChar2 == INVALID_HEX_CHAR) {
6952 RLOGE("convertHexStringToBytes: invalid hex char %d %d",
6953 hexString[i], hexString[i + 1]);
6954 free(bytes);
6955 return NULL;
6956 }
6957 bytes[i/2] = ((hexChar1 << 4) | hexChar2);
6958 }
6959
6960 return bytes;
6961}
6962
Amit Mahajan759786a2017-03-03 17:35:47 -08006963int radio::newSmsInd(int slotId, int indicationType,
Amit Mahajan5829a472016-12-28 17:28:07 -08006964 int token, RIL_Errno e, void *response, size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08006965 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan5829a472016-12-28 17:28:07 -08006966 if (response == NULL || responseLen == 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006967 RLOGE("newSmsInd: invalid response");
Amit Mahajan5829a472016-12-28 17:28:07 -08006968 return 0;
6969 }
6970
6971 uint8_t *bytes = convertHexStringToBytes(response, responseLen);
6972 if (bytes == NULL) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006973 RLOGE("newSmsInd: convertHexStringToBytes failed");
Amit Mahajan5829a472016-12-28 17:28:07 -08006974 return 0;
6975 }
6976
6977 hidl_vec<uint8_t> pdu;
6978 pdu.setToExternal(bytes, responseLen/2);
Jayachandran C572f2f42017-03-25 14:30:13 -07006979#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006980 RLOGD("newSmsInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07006981#endif
Amit Mahajan17249842017-01-19 15:05:45 -08006982 Return<void> retStatus = radioService[slotId]->mRadioIndication->newSms(
Amit Mahajan5829a472016-12-28 17:28:07 -08006983 convertIntToRadioIndicationType(indicationType), pdu);
Amit Mahajan17249842017-01-19 15:05:45 -08006984 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08006985 free(bytes);
6986 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006987 RLOGE("newSmsInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08006988 }
6989
6990 return 0;
6991}
6992
Amit Mahajan759786a2017-03-03 17:35:47 -08006993int radio::newSmsStatusReportInd(int slotId,
Amit Mahajan5829a472016-12-28 17:28:07 -08006994 int indicationType, int token, RIL_Errno e, void *response,
6995 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08006996 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan5829a472016-12-28 17:28:07 -08006997 if (response == NULL || responseLen == 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006998 RLOGE("newSmsStatusReportInd: invalid response");
Amit Mahajan5829a472016-12-28 17:28:07 -08006999 return 0;
7000 }
7001
7002 uint8_t *bytes = convertHexStringToBytes(response, responseLen);
7003 if (bytes == NULL) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007004 RLOGE("newSmsStatusReportInd: convertHexStringToBytes failed");
Amit Mahajan5829a472016-12-28 17:28:07 -08007005 return 0;
7006 }
7007
7008 hidl_vec<uint8_t> pdu;
7009 pdu.setToExternal(bytes, responseLen/2);
Jayachandran C572f2f42017-03-25 14:30:13 -07007010#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007011 RLOGD("newSmsStatusReportInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07007012#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007013 Return<void> retStatus = radioService[slotId]->mRadioIndication->newSmsStatusReport(
Amit Mahajan5829a472016-12-28 17:28:07 -08007014 convertIntToRadioIndicationType(indicationType), pdu);
Amit Mahajan17249842017-01-19 15:05:45 -08007015 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08007016 free(bytes);
7017 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007018 RLOGE("newSmsStatusReportInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08007019 }
7020
7021 return 0;
7022}
7023
Amit Mahajan759786a2017-03-03 17:35:47 -08007024int radio::newSmsOnSimInd(int slotId, int indicationType,
Amit Mahajan5829a472016-12-28 17:28:07 -08007025 int token, RIL_Errno e, void *response, size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007026 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan5829a472016-12-28 17:28:07 -08007027 if (response == NULL || responseLen != sizeof(int)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007028 RLOGE("newSmsOnSimInd: invalid response");
Amit Mahajan5829a472016-12-28 17:28:07 -08007029 return 0;
7030 }
7031 int32_t recordNumber = ((int32_t *) response)[0];
Jayachandran C572f2f42017-03-25 14:30:13 -07007032#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007033 RLOGD("newSmsOnSimInd: slotIndex %d", recordNumber);
Jayachandran C572f2f42017-03-25 14:30:13 -07007034#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007035 Return<void> retStatus = radioService[slotId]->mRadioIndication->newSmsOnSim(
Amit Mahajan5829a472016-12-28 17:28:07 -08007036 convertIntToRadioIndicationType(indicationType), recordNumber);
Amit Mahajan17249842017-01-19 15:05:45 -08007037 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08007038 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007039 RLOGE("newSmsOnSimInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08007040 }
7041
7042 return 0;
7043}
7044
Amit Mahajan759786a2017-03-03 17:35:47 -08007045int radio::onUssdInd(int slotId, int indicationType,
Amit Mahajan5829a472016-12-28 17:28:07 -08007046 int token, RIL_Errno e, void *response, size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007047 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan5829a472016-12-28 17:28:07 -08007048 if (response == NULL || responseLen != 2 * sizeof(char *)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007049 RLOGE("onUssdInd: invalid response");
Amit Mahajan5829a472016-12-28 17:28:07 -08007050 return 0;
7051 }
7052 char **strings = (char **) response;
7053 char *mode = strings[0];
7054 hidl_string msg = convertCharPtrToHidlString(strings[1]);
7055 UssdModeType modeType = (UssdModeType) atoi(mode);
Jayachandran C572f2f42017-03-25 14:30:13 -07007056#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007057 RLOGD("onUssdInd: mode %s", mode);
Jayachandran C572f2f42017-03-25 14:30:13 -07007058#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007059 Return<void> retStatus = radioService[slotId]->mRadioIndication->onUssd(
Amit Mahajan5829a472016-12-28 17:28:07 -08007060 convertIntToRadioIndicationType(indicationType), modeType, msg);
Amit Mahajan17249842017-01-19 15:05:45 -08007061 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08007062 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007063 RLOGE("onUssdInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08007064 }
7065
7066 return 0;
7067}
7068
Amit Mahajan759786a2017-03-03 17:35:47 -08007069int radio::nitzTimeReceivedInd(int slotId,
Amit Mahajan5829a472016-12-28 17:28:07 -08007070 int indicationType, int token, RIL_Errno e, void *response,
7071 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007072 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan5829a472016-12-28 17:28:07 -08007073 if (response == NULL || responseLen == 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007074 RLOGE("nitzTimeReceivedInd: invalid response");
Amit Mahajan5829a472016-12-28 17:28:07 -08007075 return 0;
7076 }
7077 hidl_string nitzTime = convertCharPtrToHidlString((char *) response);
Jayachandran C572f2f42017-03-25 14:30:13 -07007078#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007079 RLOGD("nitzTimeReceivedInd: nitzTime %s receivedTime %" PRId64, nitzTime.c_str(),
Amit Mahajane9a10e62018-02-23 17:12:15 -08007080 nitzTimeReceived[slotId]);
Jayachandran C572f2f42017-03-25 14:30:13 -07007081#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007082 Return<void> retStatus = radioService[slotId]->mRadioIndication->nitzTimeReceived(
Amit Mahajane9a10e62018-02-23 17:12:15 -08007083 convertIntToRadioIndicationType(indicationType), nitzTime,
7084 nitzTimeReceived[slotId]);
Amit Mahajan17249842017-01-19 15:05:45 -08007085 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08007086 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007087 RLOGE("nitzTimeReceivedInd: radioService[%d]->mRadioIndication == NULL", slotId);
Weilun Dud2c30932017-02-09 12:32:42 -08007088 return -1;
Amit Mahajan5829a472016-12-28 17:28:07 -08007089 }
7090
7091 return 0;
7092}
7093
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007094void convertRilSignalStrengthToHal(void *response, size_t responseLen,
7095 SignalStrength& signalStrength) {
7096 RIL_SignalStrength_v10 *rilSignalStrength = (RIL_SignalStrength_v10 *) response;
7097
7098 // Fixup LTE for backwards compatibility
7099 // signalStrength: -1 -> 99
7100 if (rilSignalStrength->LTE_SignalStrength.signalStrength == -1) {
7101 rilSignalStrength->LTE_SignalStrength.signalStrength = 99;
7102 }
7103 // rsrp: -1 -> INT_MAX all other negative value to positive.
7104 // So remap here
7105 if (rilSignalStrength->LTE_SignalStrength.rsrp == -1) {
7106 rilSignalStrength->LTE_SignalStrength.rsrp = INT_MAX;
7107 } else if (rilSignalStrength->LTE_SignalStrength.rsrp < -1) {
7108 rilSignalStrength->LTE_SignalStrength.rsrp = -rilSignalStrength->LTE_SignalStrength.rsrp;
7109 }
7110 // rsrq: -1 -> INT_MAX
7111 if (rilSignalStrength->LTE_SignalStrength.rsrq == -1) {
7112 rilSignalStrength->LTE_SignalStrength.rsrq = INT_MAX;
7113 }
7114 // Not remapping rssnr is already using INT_MAX
7115 // cqi: -1 -> INT_MAX
7116 if (rilSignalStrength->LTE_SignalStrength.cqi == -1) {
7117 rilSignalStrength->LTE_SignalStrength.cqi = INT_MAX;
7118 }
7119
7120 signalStrength.gw.signalStrength = rilSignalStrength->GW_SignalStrength.signalStrength;
7121 signalStrength.gw.bitErrorRate = rilSignalStrength->GW_SignalStrength.bitErrorRate;
Tim Lin87316482019-01-22 17:17:51 +08007122 // RIL_SignalStrength_v10 not support gw.timingAdvance. Set to INT_MAX as
7123 // invalid value.
7124 signalStrength.gw.timingAdvance = INT_MAX;
7125
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007126 signalStrength.cdma.dbm = rilSignalStrength->CDMA_SignalStrength.dbm;
7127 signalStrength.cdma.ecio = rilSignalStrength->CDMA_SignalStrength.ecio;
7128 signalStrength.evdo.dbm = rilSignalStrength->EVDO_SignalStrength.dbm;
7129 signalStrength.evdo.ecio = rilSignalStrength->EVDO_SignalStrength.ecio;
7130 signalStrength.evdo.signalNoiseRatio =
7131 rilSignalStrength->EVDO_SignalStrength.signalNoiseRatio;
7132 signalStrength.lte.signalStrength = rilSignalStrength->LTE_SignalStrength.signalStrength;
7133 signalStrength.lte.rsrp = rilSignalStrength->LTE_SignalStrength.rsrp;
7134 signalStrength.lte.rsrq = rilSignalStrength->LTE_SignalStrength.rsrq;
7135 signalStrength.lte.rssnr = rilSignalStrength->LTE_SignalStrength.rssnr;
7136 signalStrength.lte.cqi = rilSignalStrength->LTE_SignalStrength.cqi;
7137 signalStrength.lte.timingAdvance = rilSignalStrength->LTE_SignalStrength.timingAdvance;
7138 signalStrength.tdScdma.rscp = rilSignalStrength->TD_SCDMA_SignalStrength.rscp;
7139}
7140
Amit Mahajan759786a2017-03-03 17:35:47 -08007141int radio::currentSignalStrengthInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007142 int indicationType, int token, RIL_Errno e,
7143 void *response, size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007144 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007145 if (response == NULL || responseLen != sizeof(RIL_SignalStrength_v10)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007146 RLOGE("currentSignalStrengthInd: invalid response");
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007147 return 0;
7148 }
7149
Jack Yuf68e0da2017-02-07 14:53:09 -08007150 SignalStrength signalStrength = {};
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007151 convertRilSignalStrengthToHal(response, responseLen, signalStrength);
7152
Jayachandran C572f2f42017-03-25 14:30:13 -07007153#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007154 RLOGD("currentSignalStrengthInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07007155#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007156 Return<void> retStatus = radioService[slotId]->mRadioIndication->currentSignalStrength(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007157 convertIntToRadioIndicationType(indicationType), signalStrength);
Amit Mahajan17249842017-01-19 15:05:45 -08007158 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007159 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007160 RLOGE("currentSignalStrengthInd: radioService[%d]->mRadioIndication == NULL",
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007161 slotId);
7162 }
7163
7164 return 0;
7165}
7166
Amit Mahajan5829a472016-12-28 17:28:07 -08007167void convertRilDataCallToHal(RIL_Data_Call_Response_v11 *dcResponse,
7168 SetupDataCallResult& dcResult) {
Jack Yu5079e182017-02-28 15:21:18 -08007169 dcResult.status = (DataCallFailCause) dcResponse->status;
Amit Mahajan5829a472016-12-28 17:28:07 -08007170 dcResult.suggestedRetryTime = dcResponse->suggestedRetryTime;
7171 dcResult.cid = dcResponse->cid;
7172 dcResult.active = dcResponse->active;
7173 dcResult.type = convertCharPtrToHidlString(dcResponse->type);
7174 dcResult.ifname = convertCharPtrToHidlString(dcResponse->ifname);
7175 dcResult.addresses = convertCharPtrToHidlString(dcResponse->addresses);
7176 dcResult.dnses = convertCharPtrToHidlString(dcResponse->dnses);
7177 dcResult.gateways = convertCharPtrToHidlString(dcResponse->gateways);
7178 dcResult.pcscf = convertCharPtrToHidlString(dcResponse->pcscf);
7179 dcResult.mtu = dcResponse->mtu;
7180}
7181
7182void convertRilDataCallListToHal(void *response, size_t responseLen,
7183 hidl_vec<SetupDataCallResult>& dcResultList) {
7184 int num = responseLen / sizeof(RIL_Data_Call_Response_v11);
7185
7186 RIL_Data_Call_Response_v11 *dcResponse = (RIL_Data_Call_Response_v11 *) response;
7187 dcResultList.resize(num);
7188 for (int i = 0; i < num; i++) {
7189 convertRilDataCallToHal(&dcResponse[i], dcResultList[i]);
7190 }
7191}
7192
Amit Mahajan759786a2017-03-03 17:35:47 -08007193int radio::dataCallListChangedInd(int slotId,
Amit Mahajan5829a472016-12-28 17:28:07 -08007194 int indicationType, int token, RIL_Errno e, void *response,
7195 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007196 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan13058cb2017-06-07 23:10:27 -07007197 if ((response == NULL && responseLen != 0)
7198 || responseLen % sizeof(RIL_Data_Call_Response_v11) != 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007199 RLOGE("dataCallListChangedInd: invalid response");
Amit Mahajan5829a472016-12-28 17:28:07 -08007200 return 0;
7201 }
7202 hidl_vec<SetupDataCallResult> dcList;
7203 convertRilDataCallListToHal(response, responseLen, dcList);
Jayachandran C572f2f42017-03-25 14:30:13 -07007204#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007205 RLOGD("dataCallListChangedInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07007206#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007207 Return<void> retStatus = radioService[slotId]->mRadioIndication->dataCallListChanged(
Amit Mahajan5829a472016-12-28 17:28:07 -08007208 convertIntToRadioIndicationType(indicationType), dcList);
Amit Mahajan17249842017-01-19 15:05:45 -08007209 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08007210 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007211 RLOGE("dataCallListChangedInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08007212 }
7213
7214 return 0;
7215}
7216
Amit Mahajan759786a2017-03-03 17:35:47 -08007217int radio::suppSvcNotifyInd(int slotId, int indicationType,
Amit Mahajan5829a472016-12-28 17:28:07 -08007218 int token, RIL_Errno e, void *response, size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007219 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan5829a472016-12-28 17:28:07 -08007220 if (response == NULL || responseLen != sizeof(RIL_SuppSvcNotification)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007221 RLOGE("suppSvcNotifyInd: invalid response");
Amit Mahajan5829a472016-12-28 17:28:07 -08007222 return 0;
7223 }
7224
Jack Yuf68e0da2017-02-07 14:53:09 -08007225 SuppSvcNotification suppSvc = {};
Amit Mahajan5829a472016-12-28 17:28:07 -08007226 RIL_SuppSvcNotification *ssn = (RIL_SuppSvcNotification *) response;
7227 suppSvc.isMT = ssn->notificationType;
7228 suppSvc.code = ssn->code;
7229 suppSvc.index = ssn->index;
7230 suppSvc.type = ssn->type;
7231 suppSvc.number = convertCharPtrToHidlString(ssn->number);
7232
Jayachandran C572f2f42017-03-25 14:30:13 -07007233#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007234 RLOGD("suppSvcNotifyInd: isMT %d code %d index %d type %d",
Amit Mahajan5829a472016-12-28 17:28:07 -08007235 suppSvc.isMT, suppSvc.code, suppSvc.index, suppSvc.type);
Jayachandran C572f2f42017-03-25 14:30:13 -07007236#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007237 Return<void> retStatus = radioService[slotId]->mRadioIndication->suppSvcNotify(
Amit Mahajan5829a472016-12-28 17:28:07 -08007238 convertIntToRadioIndicationType(indicationType), suppSvc);
Amit Mahajan17249842017-01-19 15:05:45 -08007239 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08007240 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007241 RLOGE("suppSvcNotifyInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08007242 }
7243
7244 return 0;
7245}
7246
Amit Mahajan759786a2017-03-03 17:35:47 -08007247int radio::stkSessionEndInd(int slotId, int indicationType,
Amit Mahajan5829a472016-12-28 17:28:07 -08007248 int token, RIL_Errno e, void *response, size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007249 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Jayachandran C572f2f42017-03-25 14:30:13 -07007250#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007251 RLOGD("stkSessionEndInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07007252#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007253 Return<void> retStatus = radioService[slotId]->mRadioIndication->stkSessionEnd(
Amit Mahajan5829a472016-12-28 17:28:07 -08007254 convertIntToRadioIndicationType(indicationType));
Amit Mahajan17249842017-01-19 15:05:45 -08007255 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08007256 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007257 RLOGE("stkSessionEndInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08007258 }
7259
7260 return 0;
7261}
7262
Amit Mahajan759786a2017-03-03 17:35:47 -08007263int radio::stkProactiveCommandInd(int slotId,
Amit Mahajan5829a472016-12-28 17:28:07 -08007264 int indicationType, int token, RIL_Errno e, void *response,
7265 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007266 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan5829a472016-12-28 17:28:07 -08007267 if (response == NULL || responseLen == 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007268 RLOGE("stkProactiveCommandInd: invalid response");
Amit Mahajan5829a472016-12-28 17:28:07 -08007269 return 0;
7270 }
Jayachandran C572f2f42017-03-25 14:30:13 -07007271#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007272 RLOGD("stkProactiveCommandInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07007273#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007274 Return<void> retStatus = radioService[slotId]->mRadioIndication->stkProactiveCommand(
Amit Mahajan5829a472016-12-28 17:28:07 -08007275 convertIntToRadioIndicationType(indicationType),
7276 convertCharPtrToHidlString((char *) response));
Amit Mahajan17249842017-01-19 15:05:45 -08007277 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08007278 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007279 RLOGE("stkProactiveCommandInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08007280 }
7281
7282 return 0;
7283}
7284
Amit Mahajan759786a2017-03-03 17:35:47 -08007285int radio::stkEventNotifyInd(int slotId, int indicationType,
Amit Mahajan5829a472016-12-28 17:28:07 -08007286 int token, RIL_Errno e, void *response, size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007287 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan5829a472016-12-28 17:28:07 -08007288 if (response == NULL || responseLen == 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007289 RLOGE("stkEventNotifyInd: invalid response");
Amit Mahajan5829a472016-12-28 17:28:07 -08007290 return 0;
7291 }
Jayachandran C572f2f42017-03-25 14:30:13 -07007292#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007293 RLOGD("stkEventNotifyInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07007294#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007295 Return<void> retStatus = radioService[slotId]->mRadioIndication->stkEventNotify(
Amit Mahajan5829a472016-12-28 17:28:07 -08007296 convertIntToRadioIndicationType(indicationType),
7297 convertCharPtrToHidlString((char *) response));
Amit Mahajan17249842017-01-19 15:05:45 -08007298 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08007299 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007300 RLOGE("stkEventNotifyInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08007301 }
7302
7303 return 0;
7304}
7305
Amit Mahajan759786a2017-03-03 17:35:47 -08007306int radio::stkCallSetupInd(int slotId, int indicationType,
Amit Mahajan5829a472016-12-28 17:28:07 -08007307 int token, RIL_Errno e, void *response, size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007308 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan5829a472016-12-28 17:28:07 -08007309 if (response == NULL || responseLen != sizeof(int)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007310 RLOGE("stkCallSetupInd: invalid response");
Amit Mahajan5829a472016-12-28 17:28:07 -08007311 return 0;
7312 }
7313 int32_t timeout = ((int32_t *) response)[0];
Jayachandran C572f2f42017-03-25 14:30:13 -07007314#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007315 RLOGD("stkCallSetupInd: timeout %d", timeout);
Jayachandran C572f2f42017-03-25 14:30:13 -07007316#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007317 Return<void> retStatus = radioService[slotId]->mRadioIndication->stkCallSetup(
Amit Mahajan5829a472016-12-28 17:28:07 -08007318 convertIntToRadioIndicationType(indicationType), timeout);
Amit Mahajan17249842017-01-19 15:05:45 -08007319 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08007320 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007321 RLOGE("stkCallSetupInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08007322 }
7323
7324 return 0;
7325}
7326
Amit Mahajan759786a2017-03-03 17:35:47 -08007327int radio::simSmsStorageFullInd(int slotId,
Amit Mahajan5829a472016-12-28 17:28:07 -08007328 int indicationType, int token, RIL_Errno e, void *response,
7329 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007330 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Jayachandran C572f2f42017-03-25 14:30:13 -07007331#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007332 RLOGD("simSmsStorageFullInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07007333#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007334 Return<void> retStatus = radioService[slotId]->mRadioIndication->simSmsStorageFull(
Amit Mahajan5829a472016-12-28 17:28:07 -08007335 convertIntToRadioIndicationType(indicationType));
Amit Mahajan17249842017-01-19 15:05:45 -08007336 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08007337 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007338 RLOGE("simSmsStorageFullInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08007339 }
7340
7341 return 0;
7342}
7343
Amit Mahajan759786a2017-03-03 17:35:47 -08007344int radio::simRefreshInd(int slotId, int indicationType,
Amit Mahajan5829a472016-12-28 17:28:07 -08007345 int token, RIL_Errno e, void *response, size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007346 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan5829a472016-12-28 17:28:07 -08007347 if (response == NULL || responseLen != sizeof(RIL_SimRefreshResponse_v7)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007348 RLOGE("simRefreshInd: invalid response");
Amit Mahajan5829a472016-12-28 17:28:07 -08007349 return 0;
7350 }
7351
Jack Yuf68e0da2017-02-07 14:53:09 -08007352 SimRefreshResult refreshResult = {};
Amit Mahajan5829a472016-12-28 17:28:07 -08007353 RIL_SimRefreshResponse_v7 *simRefreshResponse = ((RIL_SimRefreshResponse_v7 *) response);
7354 refreshResult.type =
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07007355 (V1_0::SimRefreshType) simRefreshResponse->result;
Amit Mahajan5829a472016-12-28 17:28:07 -08007356 refreshResult.efId = simRefreshResponse->ef_id;
7357 refreshResult.aid = convertCharPtrToHidlString(simRefreshResponse->aid);
7358
Jayachandran C572f2f42017-03-25 14:30:13 -07007359#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007360 RLOGD("simRefreshInd: type %d efId %d", refreshResult.type, refreshResult.efId);
Jayachandran C572f2f42017-03-25 14:30:13 -07007361#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007362 Return<void> retStatus = radioService[slotId]->mRadioIndication->simRefresh(
Amit Mahajan5829a472016-12-28 17:28:07 -08007363 convertIntToRadioIndicationType(indicationType), refreshResult);
Amit Mahajan17249842017-01-19 15:05:45 -08007364 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08007365 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007366 RLOGE("simRefreshInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08007367 }
7368
7369 return 0;
7370}
7371
7372void convertRilCdmaSignalInfoRecordToHal(RIL_CDMA_SignalInfoRecord *signalInfoRecord,
7373 CdmaSignalInfoRecord& record) {
7374 record.isPresent = signalInfoRecord->isPresent;
7375 record.signalType = signalInfoRecord->signalType;
7376 record.alertPitch = signalInfoRecord->alertPitch;
7377 record.signal = signalInfoRecord->signal;
7378}
7379
Amit Mahajan759786a2017-03-03 17:35:47 -08007380int radio::callRingInd(int slotId, int indicationType,
Amit Mahajan5829a472016-12-28 17:28:07 -08007381 int token, RIL_Errno e, void *response, size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007382 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan5829a472016-12-28 17:28:07 -08007383 bool isGsm;
Jack Yuf68e0da2017-02-07 14:53:09 -08007384 CdmaSignalInfoRecord record = {};
Amit Mahajan5829a472016-12-28 17:28:07 -08007385 if (response == NULL || responseLen == 0) {
7386 isGsm = true;
7387 } else {
7388 isGsm = false;
7389 if (responseLen != sizeof (RIL_CDMA_SignalInfoRecord)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007390 RLOGE("callRingInd: invalid response");
Amit Mahajan5829a472016-12-28 17:28:07 -08007391 return 0;
7392 }
7393 convertRilCdmaSignalInfoRecordToHal((RIL_CDMA_SignalInfoRecord *) response, record);
7394 }
7395
Jayachandran C572f2f42017-03-25 14:30:13 -07007396#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007397 RLOGD("callRingInd: isGsm %d", isGsm);
Jayachandran C572f2f42017-03-25 14:30:13 -07007398#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007399 Return<void> retStatus = radioService[slotId]->mRadioIndication->callRing(
Amit Mahajan5829a472016-12-28 17:28:07 -08007400 convertIntToRadioIndicationType(indicationType), isGsm, record);
Amit Mahajan17249842017-01-19 15:05:45 -08007401 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08007402 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007403 RLOGE("callRingInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08007404 }
7405
7406 return 0;
7407}
7408
Amit Mahajan759786a2017-03-03 17:35:47 -08007409int radio::simStatusChangedInd(int slotId,
Amit Mahajan5829a472016-12-28 17:28:07 -08007410 int indicationType, int token, RIL_Errno e, void *response,
7411 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007412 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Jayachandran C572f2f42017-03-25 14:30:13 -07007413#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007414 RLOGD("simStatusChangedInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07007415#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007416 Return<void> retStatus = radioService[slotId]->mRadioIndication->simStatusChanged(
Amit Mahajan5829a472016-12-28 17:28:07 -08007417 convertIntToRadioIndicationType(indicationType));
Amit Mahajan17249842017-01-19 15:05:45 -08007418 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08007419 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007420 RLOGE("simStatusChangedInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08007421 }
7422
7423 return 0;
7424}
7425
Amit Mahajan759786a2017-03-03 17:35:47 -08007426int radio::cdmaNewSmsInd(int slotId, int indicationType,
Amit Mahajan5829a472016-12-28 17:28:07 -08007427 int token, RIL_Errno e, void *response, size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007428 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan5829a472016-12-28 17:28:07 -08007429 if (response == NULL || responseLen != sizeof(RIL_CDMA_SMS_Message)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007430 RLOGE("cdmaNewSmsInd: invalid response");
Amit Mahajan5829a472016-12-28 17:28:07 -08007431 return 0;
7432 }
7433
Jack Yuf68e0da2017-02-07 14:53:09 -08007434 CdmaSmsMessage msg = {};
Amit Mahajan5829a472016-12-28 17:28:07 -08007435 RIL_CDMA_SMS_Message *rilMsg = (RIL_CDMA_SMS_Message *) response;
7436 msg.teleserviceId = rilMsg->uTeleserviceID;
7437 msg.isServicePresent = rilMsg->bIsServicePresent;
7438 msg.serviceCategory = rilMsg->uServicecategory;
7439 msg.address.digitMode =
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07007440 (V1_0::CdmaSmsDigitMode) rilMsg->sAddress.digit_mode;
Amit Mahajan5829a472016-12-28 17:28:07 -08007441 msg.address.numberMode =
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07007442 (V1_0::CdmaSmsNumberMode) rilMsg->sAddress.number_mode;
Amit Mahajan5829a472016-12-28 17:28:07 -08007443 msg.address.numberType =
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07007444 (V1_0::CdmaSmsNumberType) rilMsg->sAddress.number_type;
Amit Mahajan5829a472016-12-28 17:28:07 -08007445 msg.address.numberPlan =
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07007446 (V1_0::CdmaSmsNumberPlan) rilMsg->sAddress.number_plan;
Amit Mahajan5829a472016-12-28 17:28:07 -08007447
7448 int digitLimit = MIN((rilMsg->sAddress.number_of_digits), RIL_CDMA_SMS_ADDRESS_MAX);
7449 msg.address.digits.setToExternal(rilMsg->sAddress.digits, digitLimit);
7450
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07007451 msg.subAddress.subaddressType = (V1_0::CdmaSmsSubaddressType)
Amit Mahajan5829a472016-12-28 17:28:07 -08007452 rilMsg->sSubAddress.subaddressType;
7453 msg.subAddress.odd = rilMsg->sSubAddress.odd;
7454
7455 digitLimit= MIN((rilMsg->sSubAddress.number_of_digits), RIL_CDMA_SMS_SUBADDRESS_MAX);
7456 msg.subAddress.digits.setToExternal(rilMsg->sSubAddress.digits, digitLimit);
7457
7458 digitLimit = MIN((rilMsg->uBearerDataLen), RIL_CDMA_SMS_BEARER_DATA_MAX);
7459 msg.bearerData.setToExternal(rilMsg->aBearerData, digitLimit);
7460
Jayachandran C572f2f42017-03-25 14:30:13 -07007461#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007462 RLOGD("cdmaNewSmsInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07007463#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007464 Return<void> retStatus = radioService[slotId]->mRadioIndication->cdmaNewSms(
Amit Mahajan5829a472016-12-28 17:28:07 -08007465 convertIntToRadioIndicationType(indicationType), msg);
Amit Mahajan17249842017-01-19 15:05:45 -08007466 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08007467 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007468 RLOGE("cdmaNewSmsInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08007469 }
7470
7471 return 0;
7472}
7473
Amit Mahajan759786a2017-03-03 17:35:47 -08007474int radio::newBroadcastSmsInd(int slotId,
Amit Mahajan1955c742016-12-29 07:07:54 -08007475 int indicationType, int token, RIL_Errno e, void *response,
7476 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007477 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan1955c742016-12-29 07:07:54 -08007478 if (response == NULL || responseLen == 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007479 RLOGE("newBroadcastSmsInd: invalid response");
Amit Mahajan1955c742016-12-29 07:07:54 -08007480 return 0;
7481 }
7482
7483 hidl_vec<uint8_t> data;
7484 data.setToExternal((uint8_t *) response, responseLen);
Jayachandran C572f2f42017-03-25 14:30:13 -07007485#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007486 RLOGD("newBroadcastSmsInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07007487#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007488 Return<void> retStatus = radioService[slotId]->mRadioIndication->newBroadcastSms(
Amit Mahajan1955c742016-12-29 07:07:54 -08007489 convertIntToRadioIndicationType(indicationType), data);
Amit Mahajan17249842017-01-19 15:05:45 -08007490 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan1955c742016-12-29 07:07:54 -08007491 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007492 RLOGE("newBroadcastSmsInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan1955c742016-12-29 07:07:54 -08007493 }
7494
7495 return 0;
7496}
7497
Amit Mahajan759786a2017-03-03 17:35:47 -08007498int radio::cdmaRuimSmsStorageFullInd(int slotId,
Amit Mahajan1955c742016-12-29 07:07:54 -08007499 int indicationType, int token, RIL_Errno e, void *response,
7500 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007501 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Jayachandran C572f2f42017-03-25 14:30:13 -07007502#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007503 RLOGD("cdmaRuimSmsStorageFullInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07007504#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007505 Return<void> retStatus = radioService[slotId]->mRadioIndication->cdmaRuimSmsStorageFull(
Amit Mahajan1955c742016-12-29 07:07:54 -08007506 convertIntToRadioIndicationType(indicationType));
Amit Mahajan17249842017-01-19 15:05:45 -08007507 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan1955c742016-12-29 07:07:54 -08007508 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007509 RLOGE("cdmaRuimSmsStorageFullInd: radioService[%d]->mRadioIndication == NULL",
Amit Mahajan1955c742016-12-29 07:07:54 -08007510 slotId);
7511 }
7512
7513 return 0;
7514}
7515
Amit Mahajan759786a2017-03-03 17:35:47 -08007516int radio::restrictedStateChangedInd(int slotId,
Amit Mahajan1955c742016-12-29 07:07:54 -08007517 int indicationType, int token, RIL_Errno e, void *response,
7518 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007519 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan1955c742016-12-29 07:07:54 -08007520 if (response == NULL || responseLen != sizeof(int)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007521 RLOGE("restrictedStateChangedInd: invalid response");
Amit Mahajan1955c742016-12-29 07:07:54 -08007522 return 0;
7523 }
7524 int32_t state = ((int32_t *) response)[0];
Jayachandran C572f2f42017-03-25 14:30:13 -07007525#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007526 RLOGD("restrictedStateChangedInd: state %d", state);
Jayachandran C572f2f42017-03-25 14:30:13 -07007527#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007528 Return<void> retStatus = radioService[slotId]->mRadioIndication->restrictedStateChanged(
Amit Mahajan1955c742016-12-29 07:07:54 -08007529 convertIntToRadioIndicationType(indicationType), (PhoneRestrictedState) state);
Amit Mahajan17249842017-01-19 15:05:45 -08007530 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan1955c742016-12-29 07:07:54 -08007531 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007532 RLOGE("restrictedStateChangedInd: radioService[%d]->mRadioIndication == NULL",
Amit Mahajan1955c742016-12-29 07:07:54 -08007533 slotId);
7534 }
7535
7536 return 0;
7537}
7538
Amit Mahajan759786a2017-03-03 17:35:47 -08007539int radio::enterEmergencyCallbackModeInd(int slotId,
Amit Mahajan1955c742016-12-29 07:07:54 -08007540 int indicationType, int token, RIL_Errno e, void *response,
7541 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007542 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Jayachandran C572f2f42017-03-25 14:30:13 -07007543#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007544 RLOGD("enterEmergencyCallbackModeInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07007545#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007546 Return<void> retStatus = radioService[slotId]->mRadioIndication->enterEmergencyCallbackMode(
Amit Mahajan1955c742016-12-29 07:07:54 -08007547 convertIntToRadioIndicationType(indicationType));
Amit Mahajan17249842017-01-19 15:05:45 -08007548 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan1955c742016-12-29 07:07:54 -08007549 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007550 RLOGE("enterEmergencyCallbackModeInd: radioService[%d]->mRadioIndication == NULL",
Amit Mahajan1955c742016-12-29 07:07:54 -08007551 slotId);
7552 }
7553
7554 return 0;
7555}
7556
Amit Mahajan759786a2017-03-03 17:35:47 -08007557int radio::cdmaCallWaitingInd(int slotId,
Amit Mahajan1955c742016-12-29 07:07:54 -08007558 int indicationType, int token, RIL_Errno e, void *response,
7559 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007560 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan1955c742016-12-29 07:07:54 -08007561 if (response == NULL || responseLen != sizeof(RIL_CDMA_CallWaiting_v6)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007562 RLOGE("cdmaCallWaitingInd: invalid response");
Amit Mahajan1955c742016-12-29 07:07:54 -08007563 return 0;
7564 }
7565
Jack Yuf68e0da2017-02-07 14:53:09 -08007566 CdmaCallWaiting callWaitingRecord = {};
Amit Mahajan1955c742016-12-29 07:07:54 -08007567 RIL_CDMA_CallWaiting_v6 *callWaitingRil = ((RIL_CDMA_CallWaiting_v6 *) response);
7568 callWaitingRecord.number = convertCharPtrToHidlString(callWaitingRil->number);
7569 callWaitingRecord.numberPresentation =
7570 (CdmaCallWaitingNumberPresentation) callWaitingRil->numberPresentation;
7571 callWaitingRecord.name = convertCharPtrToHidlString(callWaitingRil->name);
7572 convertRilCdmaSignalInfoRecordToHal(&callWaitingRil->signalInfoRecord,
7573 callWaitingRecord.signalInfoRecord);
7574 callWaitingRecord.numberType = (CdmaCallWaitingNumberType) callWaitingRil->number_type;
7575 callWaitingRecord.numberPlan = (CdmaCallWaitingNumberPlan) callWaitingRil->number_plan;
7576
Jayachandran C572f2f42017-03-25 14:30:13 -07007577#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007578 RLOGD("cdmaCallWaitingInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07007579#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007580 Return<void> retStatus = radioService[slotId]->mRadioIndication->cdmaCallWaiting(
Amit Mahajan1955c742016-12-29 07:07:54 -08007581 convertIntToRadioIndicationType(indicationType), callWaitingRecord);
Amit Mahajan17249842017-01-19 15:05:45 -08007582 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan1955c742016-12-29 07:07:54 -08007583 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007584 RLOGE("cdmaCallWaitingInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan1955c742016-12-29 07:07:54 -08007585 }
7586
7587 return 0;
7588}
7589
Amit Mahajan759786a2017-03-03 17:35:47 -08007590int radio::cdmaOtaProvisionStatusInd(int slotId,
Amit Mahajan1955c742016-12-29 07:07:54 -08007591 int indicationType, int token, RIL_Errno e, void *response,
7592 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007593 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan1955c742016-12-29 07:07:54 -08007594 if (response == NULL || responseLen != sizeof(int)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007595 RLOGE("cdmaOtaProvisionStatusInd: invalid response");
Amit Mahajan1955c742016-12-29 07:07:54 -08007596 return 0;
7597 }
7598 int32_t status = ((int32_t *) response)[0];
Jayachandran C572f2f42017-03-25 14:30:13 -07007599#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007600 RLOGD("cdmaOtaProvisionStatusInd: status %d", status);
Jayachandran C572f2f42017-03-25 14:30:13 -07007601#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007602 Return<void> retStatus = radioService[slotId]->mRadioIndication->cdmaOtaProvisionStatus(
Amit Mahajan1955c742016-12-29 07:07:54 -08007603 convertIntToRadioIndicationType(indicationType), (CdmaOtaProvisionStatus) status);
Amit Mahajan17249842017-01-19 15:05:45 -08007604 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan1955c742016-12-29 07:07:54 -08007605 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007606 RLOGE("cdmaOtaProvisionStatusInd: radioService[%d]->mRadioIndication == NULL",
Amit Mahajan1955c742016-12-29 07:07:54 -08007607 slotId);
7608 }
7609
7610 return 0;
7611}
7612
Amit Mahajan759786a2017-03-03 17:35:47 -08007613int radio::cdmaInfoRecInd(int slotId,
Amit Mahajan1955c742016-12-29 07:07:54 -08007614 int indicationType, int token, RIL_Errno e, void *response,
7615 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007616 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan1955c742016-12-29 07:07:54 -08007617 if (response == NULL || responseLen != sizeof(RIL_CDMA_InformationRecords)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007618 RLOGE("cdmaInfoRecInd: invalid response");
Amit Mahajan1955c742016-12-29 07:07:54 -08007619 return 0;
7620 }
7621
Jack Yuf68e0da2017-02-07 14:53:09 -08007622 CdmaInformationRecords records = {};
Amit Mahajan1955c742016-12-29 07:07:54 -08007623 RIL_CDMA_InformationRecords *recordsRil = (RIL_CDMA_InformationRecords *) response;
7624
7625 char* string8 = NULL;
7626 int num = MIN(recordsRil->numberOfInfoRecs, RIL_CDMA_MAX_NUMBER_OF_INFO_RECS);
7627 if (recordsRil->numberOfInfoRecs > RIL_CDMA_MAX_NUMBER_OF_INFO_RECS) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007628 RLOGE("cdmaInfoRecInd: received %d recs which is more than %d, dropping "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08007629 "additional ones", recordsRil->numberOfInfoRecs,
Amit Mahajan1955c742016-12-29 07:07:54 -08007630 RIL_CDMA_MAX_NUMBER_OF_INFO_RECS);
7631 }
7632 records.infoRec.resize(num);
7633 for (int i = 0 ; i < num ; i++) {
7634 CdmaInformationRecord *record = &records.infoRec[i];
7635 RIL_CDMA_InformationRecord *infoRec = &recordsRil->infoRec[i];
7636 record->name = (CdmaInfoRecName) infoRec->name;
Sanket Padawe378ccdd2017-01-24 14:11:12 -08007637 // All vectors should be size 0 except one which will be size 1. Set everything to
7638 // size 0 initially.
7639 record->display.resize(0);
7640 record->number.resize(0);
7641 record->signal.resize(0);
7642 record->redir.resize(0);
7643 record->lineCtrl.resize(0);
7644 record->clir.resize(0);
7645 record->audioCtrl.resize(0);
Amit Mahajan1955c742016-12-29 07:07:54 -08007646 switch (infoRec->name) {
7647 case RIL_CDMA_DISPLAY_INFO_REC:
7648 case RIL_CDMA_EXTENDED_DISPLAY_INFO_REC: {
7649 if (infoRec->rec.display.alpha_len > CDMA_ALPHA_INFO_BUFFER_LENGTH) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007650 RLOGE("cdmaInfoRecInd: invalid display info response length %d "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08007651 "expected not more than %d", (int) infoRec->rec.display.alpha_len,
Amit Mahajan1955c742016-12-29 07:07:54 -08007652 CDMA_ALPHA_INFO_BUFFER_LENGTH);
7653 return 0;
7654 }
7655 string8 = (char*) malloc((infoRec->rec.display.alpha_len + 1) * sizeof(char));
7656 if (string8 == NULL) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007657 RLOGE("cdmaInfoRecInd: Memory allocation failed for "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08007658 "responseCdmaInformationRecords");
Amit Mahajan1955c742016-12-29 07:07:54 -08007659 return 0;
7660 }
7661 memcpy(string8, infoRec->rec.display.alpha_buf, infoRec->rec.display.alpha_len);
7662 string8[(int)infoRec->rec.display.alpha_len] = '\0';
7663
7664 record->display.resize(1);
7665 record->display[0].alphaBuf = string8;
7666 free(string8);
7667 string8 = NULL;
7668 break;
7669 }
7670
7671 case RIL_CDMA_CALLED_PARTY_NUMBER_INFO_REC:
7672 case RIL_CDMA_CALLING_PARTY_NUMBER_INFO_REC:
7673 case RIL_CDMA_CONNECTED_NUMBER_INFO_REC: {
7674 if (infoRec->rec.number.len > CDMA_NUMBER_INFO_BUFFER_LENGTH) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007675 RLOGE("cdmaInfoRecInd: invalid display info response length %d "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08007676 "expected not more than %d", (int) infoRec->rec.number.len,
Amit Mahajan1955c742016-12-29 07:07:54 -08007677 CDMA_NUMBER_INFO_BUFFER_LENGTH);
7678 return 0;
7679 }
7680 string8 = (char*) malloc((infoRec->rec.number.len + 1) * sizeof(char));
7681 if (string8 == NULL) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007682 RLOGE("cdmaInfoRecInd: Memory allocation failed for "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08007683 "responseCdmaInformationRecords");
Amit Mahajan1955c742016-12-29 07:07:54 -08007684 return 0;
7685 }
7686 memcpy(string8, infoRec->rec.number.buf, infoRec->rec.number.len);
7687 string8[(int)infoRec->rec.number.len] = '\0';
7688
7689 record->number.resize(1);
7690 record->number[0].number = string8;
7691 free(string8);
7692 string8 = NULL;
7693 record->number[0].numberType = infoRec->rec.number.number_type;
7694 record->number[0].numberPlan = infoRec->rec.number.number_plan;
7695 record->number[0].pi = infoRec->rec.number.pi;
7696 record->number[0].si = infoRec->rec.number.si;
7697 break;
7698 }
7699
7700 case RIL_CDMA_SIGNAL_INFO_REC: {
7701 record->signal.resize(1);
7702 record->signal[0].isPresent = infoRec->rec.signal.isPresent;
7703 record->signal[0].signalType = infoRec->rec.signal.signalType;
7704 record->signal[0].alertPitch = infoRec->rec.signal.alertPitch;
7705 record->signal[0].signal = infoRec->rec.signal.signal;
7706 break;
7707 }
7708
7709 case RIL_CDMA_REDIRECTING_NUMBER_INFO_REC: {
7710 if (infoRec->rec.redir.redirectingNumber.len >
7711 CDMA_NUMBER_INFO_BUFFER_LENGTH) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007712 RLOGE("cdmaInfoRecInd: invalid display info response length %d "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08007713 "expected not more than %d\n",
Amit Mahajan1955c742016-12-29 07:07:54 -08007714 (int)infoRec->rec.redir.redirectingNumber.len,
7715 CDMA_NUMBER_INFO_BUFFER_LENGTH);
7716 return 0;
7717 }
7718 string8 = (char*) malloc((infoRec->rec.redir.redirectingNumber.len + 1) *
7719 sizeof(char));
7720 if (string8 == NULL) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007721 RLOGE("cdmaInfoRecInd: Memory allocation failed for "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08007722 "responseCdmaInformationRecords");
Amit Mahajan1955c742016-12-29 07:07:54 -08007723 return 0;
7724 }
7725 memcpy(string8, infoRec->rec.redir.redirectingNumber.buf,
7726 infoRec->rec.redir.redirectingNumber.len);
7727 string8[(int)infoRec->rec.redir.redirectingNumber.len] = '\0';
7728
7729 record->redir.resize(1);
7730 record->redir[0].redirectingNumber.number = string8;
7731 free(string8);
7732 string8 = NULL;
7733 record->redir[0].redirectingNumber.numberType =
7734 infoRec->rec.redir.redirectingNumber.number_type;
7735 record->redir[0].redirectingNumber.numberPlan =
7736 infoRec->rec.redir.redirectingNumber.number_plan;
7737 record->redir[0].redirectingNumber.pi = infoRec->rec.redir.redirectingNumber.pi;
7738 record->redir[0].redirectingNumber.si = infoRec->rec.redir.redirectingNumber.si;
7739 record->redir[0].redirectingReason =
7740 (CdmaRedirectingReason) infoRec->rec.redir.redirectingReason;
7741 break;
7742 }
7743
7744 case RIL_CDMA_LINE_CONTROL_INFO_REC: {
7745 record->lineCtrl.resize(1);
7746 record->lineCtrl[0].lineCtrlPolarityIncluded =
7747 infoRec->rec.lineCtrl.lineCtrlPolarityIncluded;
7748 record->lineCtrl[0].lineCtrlToggle = infoRec->rec.lineCtrl.lineCtrlToggle;
7749 record->lineCtrl[0].lineCtrlReverse = infoRec->rec.lineCtrl.lineCtrlReverse;
7750 record->lineCtrl[0].lineCtrlPowerDenial =
7751 infoRec->rec.lineCtrl.lineCtrlPowerDenial;
7752 break;
7753 }
7754
7755 case RIL_CDMA_T53_CLIR_INFO_REC: {
7756 record->clir.resize(1);
7757 record->clir[0].cause = infoRec->rec.clir.cause;
7758 break;
7759 }
7760
7761 case RIL_CDMA_T53_AUDIO_CONTROL_INFO_REC: {
7762 record->audioCtrl.resize(1);
7763 record->audioCtrl[0].upLink = infoRec->rec.audioCtrl.upLink;
7764 record->audioCtrl[0].downLink = infoRec->rec.audioCtrl.downLink;
7765 break;
7766 }
7767
7768 case RIL_CDMA_T53_RELEASE_INFO_REC:
Amit Mahajan111ddca2017-03-03 12:05:13 -08007769 RLOGE("cdmaInfoRecInd: RIL_CDMA_T53_RELEASE_INFO_REC: INVALID");
Amit Mahajan1955c742016-12-29 07:07:54 -08007770 return 0;
7771
7772 default:
Amit Mahajan111ddca2017-03-03 12:05:13 -08007773 RLOGE("cdmaInfoRecInd: Incorrect name value");
Amit Mahajan1955c742016-12-29 07:07:54 -08007774 return 0;
7775 }
7776 }
7777
Jayachandran C572f2f42017-03-25 14:30:13 -07007778#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007779 RLOGD("cdmaInfoRecInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07007780#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007781 Return<void> retStatus = radioService[slotId]->mRadioIndication->cdmaInfoRec(
Amit Mahajan1955c742016-12-29 07:07:54 -08007782 convertIntToRadioIndicationType(indicationType), records);
Amit Mahajan17249842017-01-19 15:05:45 -08007783 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan1955c742016-12-29 07:07:54 -08007784 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007785 RLOGE("cdmaInfoRecInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan1955c742016-12-29 07:07:54 -08007786 }
7787
7788 return 0;
7789}
7790
Amit Mahajan759786a2017-03-03 17:35:47 -08007791int radio::indicateRingbackToneInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007792 int indicationType, int token, RIL_Errno e, void *response,
7793 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007794 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007795 if (response == NULL || responseLen != sizeof(int)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007796 RLOGE("indicateRingbackToneInd: invalid response");
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007797 return 0;
7798 }
7799 bool start = ((int32_t *) response)[0];
Jayachandran C572f2f42017-03-25 14:30:13 -07007800#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007801 RLOGD("indicateRingbackToneInd: start %d", start);
Jayachandran C572f2f42017-03-25 14:30:13 -07007802#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007803 Return<void> retStatus = radioService[slotId]->mRadioIndication->indicateRingbackTone(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007804 convertIntToRadioIndicationType(indicationType), start);
Amit Mahajan17249842017-01-19 15:05:45 -08007805 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007806 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007807 RLOGE("indicateRingbackToneInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007808 }
7809
7810 return 0;
7811}
7812
Amit Mahajan759786a2017-03-03 17:35:47 -08007813int radio::resendIncallMuteInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007814 int indicationType, int token, RIL_Errno e, void *response,
7815 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007816 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Jayachandran C572f2f42017-03-25 14:30:13 -07007817#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007818 RLOGD("resendIncallMuteInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07007819#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007820 Return<void> retStatus = radioService[slotId]->mRadioIndication->resendIncallMute(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007821 convertIntToRadioIndicationType(indicationType));
Amit Mahajan17249842017-01-19 15:05:45 -08007822 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007823 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007824 RLOGE("resendIncallMuteInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007825 }
7826
7827 return 0;
7828}
7829
Amit Mahajan759786a2017-03-03 17:35:47 -08007830int radio::cdmaSubscriptionSourceChangedInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007831 int indicationType, int token, RIL_Errno e,
7832 void *response, size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007833 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007834 if (response == NULL || responseLen != sizeof(int)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007835 RLOGE("cdmaSubscriptionSourceChangedInd: invalid response");
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007836 return 0;
7837 }
7838 int32_t cdmaSource = ((int32_t *) response)[0];
Jayachandran C572f2f42017-03-25 14:30:13 -07007839#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007840 RLOGD("cdmaSubscriptionSourceChangedInd: cdmaSource %d", cdmaSource);
Jayachandran C572f2f42017-03-25 14:30:13 -07007841#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007842 Return<void> retStatus = radioService[slotId]->mRadioIndication->
7843 cdmaSubscriptionSourceChanged(convertIntToRadioIndicationType(indicationType),
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007844 (CdmaSubscriptionSource) cdmaSource);
Amit Mahajan17249842017-01-19 15:05:45 -08007845 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007846 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007847 RLOGE("cdmaSubscriptionSourceChangedInd: radioService[%d]->mRadioIndication == NULL",
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007848 slotId);
7849 }
7850
7851 return 0;
7852}
7853
Amit Mahajan759786a2017-03-03 17:35:47 -08007854int radio::cdmaPrlChangedInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007855 int indicationType, int token, RIL_Errno e, void *response,
7856 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007857 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007858 if (response == NULL || responseLen != sizeof(int)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007859 RLOGE("cdmaPrlChangedInd: invalid response");
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007860 return 0;
7861 }
7862 int32_t version = ((int32_t *) response)[0];
Jayachandran C572f2f42017-03-25 14:30:13 -07007863#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007864 RLOGD("cdmaPrlChangedInd: version %d", version);
Jayachandran C572f2f42017-03-25 14:30:13 -07007865#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007866 Return<void> retStatus = radioService[slotId]->mRadioIndication->cdmaPrlChanged(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007867 convertIntToRadioIndicationType(indicationType), version);
Amit Mahajan17249842017-01-19 15:05:45 -08007868 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007869 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007870 RLOGE("cdmaPrlChangedInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007871 }
7872
7873 return 0;
7874}
7875
Amit Mahajan759786a2017-03-03 17:35:47 -08007876int radio::exitEmergencyCallbackModeInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007877 int indicationType, int token, RIL_Errno e, void *response,
7878 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007879 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Jayachandran C572f2f42017-03-25 14:30:13 -07007880#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007881 RLOGD("exitEmergencyCallbackModeInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07007882#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007883 Return<void> retStatus = radioService[slotId]->mRadioIndication->exitEmergencyCallbackMode(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007884 convertIntToRadioIndicationType(indicationType));
Amit Mahajan17249842017-01-19 15:05:45 -08007885 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007886 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007887 RLOGE("exitEmergencyCallbackModeInd: radioService[%d]->mRadioIndication == NULL",
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007888 slotId);
7889 }
7890
7891 return 0;
7892}
7893
Amit Mahajan759786a2017-03-03 17:35:47 -08007894int radio::rilConnectedInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007895 int indicationType, int token, RIL_Errno e, void *response,
7896 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007897 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007898 RLOGD("rilConnectedInd");
Amit Mahajan17249842017-01-19 15:05:45 -08007899 Return<void> retStatus = radioService[slotId]->mRadioIndication->rilConnected(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007900 convertIntToRadioIndicationType(indicationType));
Amit Mahajan17249842017-01-19 15:05:45 -08007901 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007902 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007903 RLOGE("rilConnectedInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007904 }
7905
7906 return 0;
7907}
7908
Amit Mahajan759786a2017-03-03 17:35:47 -08007909int radio::voiceRadioTechChangedInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007910 int indicationType, int token, RIL_Errno e, void *response,
7911 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007912 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007913 if (response == NULL || responseLen != sizeof(int)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007914 RLOGE("voiceRadioTechChangedInd: invalid response");
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007915 return 0;
7916 }
7917 int32_t rat = ((int32_t *) response)[0];
Jayachandran C572f2f42017-03-25 14:30:13 -07007918#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007919 RLOGD("voiceRadioTechChangedInd: rat %d", rat);
Jayachandran C572f2f42017-03-25 14:30:13 -07007920#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007921 Return<void> retStatus = radioService[slotId]->mRadioIndication->voiceRadioTechChanged(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007922 convertIntToRadioIndicationType(indicationType), (RadioTechnology) rat);
Amit Mahajan17249842017-01-19 15:05:45 -08007923 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007924 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007925 RLOGE("voiceRadioTechChangedInd: radioService[%d]->mRadioIndication == NULL",
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007926 slotId);
7927 }
7928
7929 return 0;
7930}
7931
7932void convertRilCellInfoListToHal(void *response, size_t responseLen, hidl_vec<CellInfo>& records) {
7933 int num = responseLen / sizeof(RIL_CellInfo_v12);
7934 records.resize(num);
7935
7936 RIL_CellInfo_v12 *rillCellInfo = (RIL_CellInfo_v12 *) response;
7937 for (int i = 0; i < num; i++) {
7938 records[i].cellInfoType = (CellInfoType) rillCellInfo->cellInfoType;
7939 records[i].registered = rillCellInfo->registered;
7940 records[i].timeStampType = (TimeStampType) rillCellInfo->timeStampType;
7941 records[i].timeStamp = rillCellInfo->timeStamp;
Sanket Padawe378ccdd2017-01-24 14:11:12 -08007942 // All vectors should be size 0 except one which will be size 1. Set everything to
7943 // size 0 initially.
7944 records[i].gsm.resize(0);
7945 records[i].wcdma.resize(0);
7946 records[i].cdma.resize(0);
7947 records[i].lte.resize(0);
7948 records[i].tdscdma.resize(0);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007949 switch(rillCellInfo->cellInfoType) {
7950 case RIL_CELL_INFO_TYPE_GSM: {
7951 records[i].gsm.resize(1);
7952 CellInfoGsm *cellInfoGsm = &records[i].gsm[0];
7953 cellInfoGsm->cellIdentityGsm.mcc =
7954 std::to_string(rillCellInfo->CellInfo.gsm.cellIdentityGsm.mcc);
7955 cellInfoGsm->cellIdentityGsm.mnc =
Nathan Harold98cfcee2018-08-20 11:38:27 -07007956 ril::util::mnc::decode(rillCellInfo->CellInfo.gsm.cellIdentityGsm.mnc);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007957 cellInfoGsm->cellIdentityGsm.lac =
7958 rillCellInfo->CellInfo.gsm.cellIdentityGsm.lac;
7959 cellInfoGsm->cellIdentityGsm.cid =
7960 rillCellInfo->CellInfo.gsm.cellIdentityGsm.cid;
7961 cellInfoGsm->cellIdentityGsm.arfcn =
7962 rillCellInfo->CellInfo.gsm.cellIdentityGsm.arfcn;
7963 cellInfoGsm->cellIdentityGsm.bsic =
7964 rillCellInfo->CellInfo.gsm.cellIdentityGsm.bsic;
7965 cellInfoGsm->signalStrengthGsm.signalStrength =
7966 rillCellInfo->CellInfo.gsm.signalStrengthGsm.signalStrength;
7967 cellInfoGsm->signalStrengthGsm.bitErrorRate =
7968 rillCellInfo->CellInfo.gsm.signalStrengthGsm.bitErrorRate;
7969 cellInfoGsm->signalStrengthGsm.timingAdvance =
7970 rillCellInfo->CellInfo.gsm.signalStrengthGsm.timingAdvance;
7971 break;
7972 }
7973
7974 case RIL_CELL_INFO_TYPE_WCDMA: {
7975 records[i].wcdma.resize(1);
7976 CellInfoWcdma *cellInfoWcdma = &records[i].wcdma[0];
7977 cellInfoWcdma->cellIdentityWcdma.mcc =
7978 std::to_string(rillCellInfo->CellInfo.wcdma.cellIdentityWcdma.mcc);
7979 cellInfoWcdma->cellIdentityWcdma.mnc =
Nathan Harold98cfcee2018-08-20 11:38:27 -07007980 ril::util::mnc::decode(rillCellInfo->CellInfo.wcdma.cellIdentityWcdma.mnc);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007981 cellInfoWcdma->cellIdentityWcdma.lac =
7982 rillCellInfo->CellInfo.wcdma.cellIdentityWcdma.lac;
7983 cellInfoWcdma->cellIdentityWcdma.cid =
7984 rillCellInfo->CellInfo.wcdma.cellIdentityWcdma.cid;
7985 cellInfoWcdma->cellIdentityWcdma.psc =
7986 rillCellInfo->CellInfo.wcdma.cellIdentityWcdma.psc;
Luca Weiss90a59372021-08-05 15:11:26 +02007987 cellInfoWcdma->cellIdentityWcdma.uarfcn = clampWarn("uarfcn",
7988 rillCellInfo->CellInfo.wcdma.cellIdentityWcdma.uarfcn, 412, 11000);
7989 cellInfoWcdma->signalStrengthWcdma.signalStrength = clampWarn("signalStrength",
7990 rillCellInfo->CellInfo.wcdma.signalStrengthWcdma.signalStrength, 0, 31);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007991 cellInfoWcdma->signalStrengthWcdma.bitErrorRate =
7992 rillCellInfo->CellInfo.wcdma.signalStrengthWcdma.bitErrorRate;
7993 break;
7994 }
7995
7996 case RIL_CELL_INFO_TYPE_CDMA: {
7997 records[i].cdma.resize(1);
7998 CellInfoCdma *cellInfoCdma = &records[i].cdma[0];
7999 cellInfoCdma->cellIdentityCdma.networkId =
8000 rillCellInfo->CellInfo.cdma.cellIdentityCdma.networkId;
8001 cellInfoCdma->cellIdentityCdma.systemId =
8002 rillCellInfo->CellInfo.cdma.cellIdentityCdma.systemId;
8003 cellInfoCdma->cellIdentityCdma.baseStationId =
8004 rillCellInfo->CellInfo.cdma.cellIdentityCdma.basestationId;
8005 cellInfoCdma->cellIdentityCdma.longitude =
8006 rillCellInfo->CellInfo.cdma.cellIdentityCdma.longitude;
8007 cellInfoCdma->cellIdentityCdma.latitude =
8008 rillCellInfo->CellInfo.cdma.cellIdentityCdma.latitude;
8009 cellInfoCdma->signalStrengthCdma.dbm =
8010 rillCellInfo->CellInfo.cdma.signalStrengthCdma.dbm;
8011 cellInfoCdma->signalStrengthCdma.ecio =
8012 rillCellInfo->CellInfo.cdma.signalStrengthCdma.ecio;
8013 cellInfoCdma->signalStrengthEvdo.dbm =
8014 rillCellInfo->CellInfo.cdma.signalStrengthEvdo.dbm;
8015 cellInfoCdma->signalStrengthEvdo.ecio =
8016 rillCellInfo->CellInfo.cdma.signalStrengthEvdo.ecio;
8017 cellInfoCdma->signalStrengthEvdo.signalNoiseRatio =
8018 rillCellInfo->CellInfo.cdma.signalStrengthEvdo.signalNoiseRatio;
8019 break;
8020 }
8021
8022 case RIL_CELL_INFO_TYPE_LTE: {
8023 records[i].lte.resize(1);
8024 CellInfoLte *cellInfoLte = &records[i].lte[0];
8025 cellInfoLte->cellIdentityLte.mcc =
8026 std::to_string(rillCellInfo->CellInfo.lte.cellIdentityLte.mcc);
8027 cellInfoLte->cellIdentityLte.mnc =
Nathan Harold98cfcee2018-08-20 11:38:27 -07008028 ril::util::mnc::decode(rillCellInfo->CellInfo.lte.cellIdentityLte.mnc);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008029 cellInfoLte->cellIdentityLte.ci =
8030 rillCellInfo->CellInfo.lte.cellIdentityLte.ci;
8031 cellInfoLte->cellIdentityLte.pci =
8032 rillCellInfo->CellInfo.lte.cellIdentityLte.pci;
8033 cellInfoLte->cellIdentityLte.tac =
8034 rillCellInfo->CellInfo.lte.cellIdentityLte.tac;
Luca Weiss90a59372021-08-05 15:11:26 +02008035 cellInfoLte->cellIdentityLte.earfcn = clampWarn("earfcn",
8036 rillCellInfo->CellInfo.lte.cellIdentityLte.earfcn, 7, 262136);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008037 cellInfoLte->signalStrengthLte.signalStrength =
8038 rillCellInfo->CellInfo.lte.signalStrengthLte.signalStrength;
Karsten Tausche954d1242020-11-20 15:36:08 +01008039 cellInfoLte->signalStrengthLte.rsrp = clampWarn("rsrp",
8040 rillCellInfo->CellInfo.lte.signalStrengthLte.rsrp, 44, 140);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008041 cellInfoLte->signalStrengthLte.rsrq =
8042 rillCellInfo->CellInfo.lte.signalStrengthLte.rsrq;
8043 cellInfoLte->signalStrengthLte.rssnr =
8044 rillCellInfo->CellInfo.lte.signalStrengthLte.rssnr;
8045 cellInfoLte->signalStrengthLte.cqi =
8046 rillCellInfo->CellInfo.lte.signalStrengthLte.cqi;
8047 cellInfoLte->signalStrengthLte.timingAdvance =
8048 rillCellInfo->CellInfo.lte.signalStrengthLte.timingAdvance;
8049 break;
8050 }
8051
8052 case RIL_CELL_INFO_TYPE_TD_SCDMA: {
8053 records[i].tdscdma.resize(1);
8054 CellInfoTdscdma *cellInfoTdscdma = &records[i].tdscdma[0];
8055 cellInfoTdscdma->cellIdentityTdscdma.mcc =
8056 std::to_string(rillCellInfo->CellInfo.tdscdma.cellIdentityTdscdma.mcc);
8057 cellInfoTdscdma->cellIdentityTdscdma.mnc =
Nathan Harold98cfcee2018-08-20 11:38:27 -07008058 ril::util::mnc::decode(
8059 rillCellInfo->CellInfo.tdscdma.cellIdentityTdscdma.mnc);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008060 cellInfoTdscdma->cellIdentityTdscdma.lac =
8061 rillCellInfo->CellInfo.tdscdma.cellIdentityTdscdma.lac;
8062 cellInfoTdscdma->cellIdentityTdscdma.cid =
8063 rillCellInfo->CellInfo.tdscdma.cellIdentityTdscdma.cid;
8064 cellInfoTdscdma->cellIdentityTdscdma.cpid =
8065 rillCellInfo->CellInfo.tdscdma.cellIdentityTdscdma.cpid;
8066 cellInfoTdscdma->signalStrengthTdscdma.rscp =
8067 rillCellInfo->CellInfo.tdscdma.signalStrengthTdscdma.rscp;
8068 break;
8069 }
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08008070 default: {
8071 break;
8072 }
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008073 }
8074 rillCellInfo += 1;
8075 }
8076}
8077
Amit Mahajan759786a2017-03-03 17:35:47 -08008078int radio::cellInfoListInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008079 int indicationType, int token, RIL_Errno e, void *response,
8080 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08008081 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan13058cb2017-06-07 23:10:27 -07008082 if ((response == NULL && responseLen != 0) || responseLen % sizeof(RIL_CellInfo_v12) != 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008083 RLOGE("cellInfoListInd: invalid response");
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008084 return 0;
8085 }
8086
8087 hidl_vec<CellInfo> records;
8088 convertRilCellInfoListToHal(response, responseLen, records);
8089
Jayachandran C572f2f42017-03-25 14:30:13 -07008090#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08008091 RLOGD("cellInfoListInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07008092#endif
Amit Mahajan17249842017-01-19 15:05:45 -08008093 Return<void> retStatus = radioService[slotId]->mRadioIndication->cellInfoList(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008094 convertIntToRadioIndicationType(indicationType), records);
Amit Mahajan17249842017-01-19 15:05:45 -08008095 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008096 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008097 RLOGE("cellInfoListInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008098 }
8099
8100 return 0;
8101}
8102
Amit Mahajan759786a2017-03-03 17:35:47 -08008103int radio::imsNetworkStateChangedInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008104 int indicationType, int token, RIL_Errno e, void *response,
8105 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08008106 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Jayachandran C572f2f42017-03-25 14:30:13 -07008107#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08008108 RLOGD("imsNetworkStateChangedInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07008109#endif
Amit Mahajan17249842017-01-19 15:05:45 -08008110 Return<void> retStatus = radioService[slotId]->mRadioIndication->imsNetworkStateChanged(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008111 convertIntToRadioIndicationType(indicationType));
Amit Mahajan17249842017-01-19 15:05:45 -08008112 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008113 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008114 RLOGE("imsNetworkStateChangedInd: radioService[%d]->mRadioIndication == NULL",
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008115 slotId);
8116 }
8117
8118 return 0;
8119}
8120
Amit Mahajan759786a2017-03-03 17:35:47 -08008121int radio::subscriptionStatusChangedInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008122 int indicationType, int token, RIL_Errno e, void *response,
8123 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08008124 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008125 if (response == NULL || responseLen != sizeof(int)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008126 RLOGE("subscriptionStatusChangedInd: invalid response");
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008127 return 0;
8128 }
8129 bool activate = ((int32_t *) response)[0];
Jayachandran C572f2f42017-03-25 14:30:13 -07008130#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08008131 RLOGD("subscriptionStatusChangedInd: activate %d", activate);
Jayachandran C572f2f42017-03-25 14:30:13 -07008132#endif
Amit Mahajan17249842017-01-19 15:05:45 -08008133 Return<void> retStatus = radioService[slotId]->mRadioIndication->subscriptionStatusChanged(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008134 convertIntToRadioIndicationType(indicationType), activate);
Amit Mahajan17249842017-01-19 15:05:45 -08008135 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008136 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008137 RLOGE("subscriptionStatusChangedInd: radioService[%d]->mRadioIndication == NULL",
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008138 slotId);
8139 }
8140
8141 return 0;
8142}
8143
Amit Mahajan759786a2017-03-03 17:35:47 -08008144int radio::srvccStateNotifyInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008145 int indicationType, int token, RIL_Errno e, void *response,
8146 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08008147 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008148 if (response == NULL || responseLen != sizeof(int)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008149 RLOGE("srvccStateNotifyInd: invalid response");
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008150 return 0;
8151 }
8152 int32_t state = ((int32_t *) response)[0];
Jayachandran C572f2f42017-03-25 14:30:13 -07008153#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08008154 RLOGD("srvccStateNotifyInd: rat %d", state);
Jayachandran C572f2f42017-03-25 14:30:13 -07008155#endif
Amit Mahajan17249842017-01-19 15:05:45 -08008156 Return<void> retStatus = radioService[slotId]->mRadioIndication->srvccStateNotify(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008157 convertIntToRadioIndicationType(indicationType), (SrvccState) state);
Amit Mahajan17249842017-01-19 15:05:45 -08008158 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008159 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008160 RLOGE("srvccStateNotifyInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008161 }
8162
8163 return 0;
8164}
8165
8166void convertRilHardwareConfigListToHal(void *response, size_t responseLen,
8167 hidl_vec<HardwareConfig>& records) {
8168 int num = responseLen / sizeof(RIL_HardwareConfig);
8169 records.resize(num);
8170
8171 RIL_HardwareConfig *rilHardwareConfig = (RIL_HardwareConfig *) response;
8172 for (int i = 0; i < num; i++) {
8173 records[i].type = (HardwareConfigType) rilHardwareConfig[i].type;
8174 records[i].uuid = convertCharPtrToHidlString(rilHardwareConfig[i].uuid);
8175 records[i].state = (HardwareConfigState) rilHardwareConfig[i].state;
8176 switch (rilHardwareConfig[i].type) {
8177 case RIL_HARDWARE_CONFIG_MODEM: {
8178 records[i].modem.resize(1);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08008179 records[i].sim.resize(0);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008180 HardwareConfigModem *hwConfigModem = &records[i].modem[0];
8181 hwConfigModem->rat = rilHardwareConfig[i].cfg.modem.rat;
8182 hwConfigModem->maxVoice = rilHardwareConfig[i].cfg.modem.maxVoice;
8183 hwConfigModem->maxData = rilHardwareConfig[i].cfg.modem.maxData;
8184 hwConfigModem->maxStandby = rilHardwareConfig[i].cfg.modem.maxStandby;
8185 break;
8186 }
8187
8188 case RIL_HARDWARE_CONFIG_SIM: {
8189 records[i].sim.resize(1);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08008190 records[i].modem.resize(0);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008191 records[i].sim[0].modemUuid =
8192 convertCharPtrToHidlString(rilHardwareConfig[i].cfg.sim.modemUuid);
8193 break;
8194 }
8195 }
8196 }
8197}
8198
Amit Mahajan759786a2017-03-03 17:35:47 -08008199int radio::hardwareConfigChangedInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008200 int indicationType, int token, RIL_Errno e, void *response,
8201 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08008202 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan13058cb2017-06-07 23:10:27 -07008203 if ((response == NULL && responseLen != 0)
8204 || responseLen % sizeof(RIL_HardwareConfig) != 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008205 RLOGE("hardwareConfigChangedInd: invalid response");
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008206 return 0;
8207 }
8208
8209 hidl_vec<HardwareConfig> configs;
8210 convertRilHardwareConfigListToHal(response, responseLen, configs);
8211
Jayachandran C572f2f42017-03-25 14:30:13 -07008212#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08008213 RLOGD("hardwareConfigChangedInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07008214#endif
Amit Mahajan17249842017-01-19 15:05:45 -08008215 Return<void> retStatus = radioService[slotId]->mRadioIndication->hardwareConfigChanged(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008216 convertIntToRadioIndicationType(indicationType), configs);
Amit Mahajan17249842017-01-19 15:05:45 -08008217 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008218 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008219 RLOGE("hardwareConfigChangedInd: radioService[%d]->mRadioIndication == NULL",
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008220 slotId);
8221 }
8222
8223 return 0;
8224}
8225
8226void convertRilRadioCapabilityToHal(void *response, size_t responseLen, RadioCapability& rc) {
8227 RIL_RadioCapability *rilRadioCapability = (RIL_RadioCapability *) response;
8228 rc.session = rilRadioCapability->session;
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07008229 rc.phase = (V1_0::RadioCapabilityPhase) rilRadioCapability->phase;
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008230 rc.raf = rilRadioCapability->rat;
8231 rc.logicalModemUuid = convertCharPtrToHidlString(rilRadioCapability->logicalModemUuid);
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07008232 rc.status = (V1_0::RadioCapabilityStatus) rilRadioCapability->status;
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008233}
8234
Amit Mahajan759786a2017-03-03 17:35:47 -08008235int radio::radioCapabilityIndicationInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008236 int indicationType, int token, RIL_Errno e, void *response,
8237 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08008238 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008239 if (response == NULL || responseLen != sizeof(RIL_RadioCapability)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008240 RLOGE("radioCapabilityIndicationInd: invalid response");
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008241 return 0;
8242 }
8243
Jack Yuf68e0da2017-02-07 14:53:09 -08008244 RadioCapability rc = {};
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008245 convertRilRadioCapabilityToHal(response, responseLen, rc);
8246
Jayachandran C572f2f42017-03-25 14:30:13 -07008247#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08008248 RLOGD("radioCapabilityIndicationInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07008249#endif
Amit Mahajan17249842017-01-19 15:05:45 -08008250 Return<void> retStatus = radioService[slotId]->mRadioIndication->radioCapabilityIndication(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008251 convertIntToRadioIndicationType(indicationType), rc);
Amit Mahajan17249842017-01-19 15:05:45 -08008252 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008253 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008254 RLOGE("radioCapabilityIndicationInd: radioService[%d]->mRadioIndication == NULL",
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008255 slotId);
8256 }
8257
8258 return 0;
8259}
8260
8261bool isServiceTypeCfQuery(RIL_SsServiceType serType, RIL_SsRequestType reqType) {
8262 if ((reqType == SS_INTERROGATION) &&
8263 (serType == SS_CFU ||
8264 serType == SS_CF_BUSY ||
8265 serType == SS_CF_NO_REPLY ||
8266 serType == SS_CF_NOT_REACHABLE ||
8267 serType == SS_CF_ALL ||
8268 serType == SS_CF_ALL_CONDITIONAL)) {
8269 return true;
8270 }
8271 return false;
8272}
8273
Amit Mahajan759786a2017-03-03 17:35:47 -08008274int radio::onSupplementaryServiceIndicationInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008275 int indicationType, int token, RIL_Errno e,
8276 void *response, size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08008277 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008278 if (response == NULL || responseLen != sizeof(RIL_StkCcUnsolSsResponse)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008279 RLOGE("onSupplementaryServiceIndicationInd: invalid response");
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008280 return 0;
8281 }
8282
8283 RIL_StkCcUnsolSsResponse *rilSsResponse = (RIL_StkCcUnsolSsResponse *) response;
Jack Yuf68e0da2017-02-07 14:53:09 -08008284 StkCcUnsolSsResult ss = {};
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008285 ss.serviceType = (SsServiceType) rilSsResponse->serviceType;
8286 ss.requestType = (SsRequestType) rilSsResponse->requestType;
8287 ss.teleserviceType = (SsTeleserviceType) rilSsResponse->teleserviceType;
8288 ss.serviceClass = rilSsResponse->serviceClass;
8289 ss.result = (RadioError) rilSsResponse->result;
8290
8291 if (isServiceTypeCfQuery(rilSsResponse->serviceType, rilSsResponse->requestType)) {
Jayachandran C572f2f42017-03-25 14:30:13 -07008292#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08008293 RLOGD("onSupplementaryServiceIndicationInd CF type, num of Cf elements %d",
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008294 rilSsResponse->cfData.numValidIndexes);
Jayachandran C572f2f42017-03-25 14:30:13 -07008295#endif
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008296 if (rilSsResponse->cfData.numValidIndexes > NUM_SERVICE_CLASSES) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008297 RLOGE("onSupplementaryServiceIndicationInd numValidIndexes is greater than "
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008298 "max value %d, truncating it to max value", NUM_SERVICE_CLASSES);
8299 rilSsResponse->cfData.numValidIndexes = NUM_SERVICE_CLASSES;
8300 }
8301
8302 ss.cfData.resize(1);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08008303 ss.ssInfo.resize(0);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008304
8305 /* number of call info's */
8306 ss.cfData[0].cfInfo.resize(rilSsResponse->cfData.numValidIndexes);
8307
8308 for (int i = 0; i < rilSsResponse->cfData.numValidIndexes; i++) {
8309 RIL_CallForwardInfo cf = rilSsResponse->cfData.cfInfo[i];
8310 CallForwardInfo *cfInfo = &ss.cfData[0].cfInfo[i];
8311
8312 cfInfo->status = (CallForwardInfoStatus) cf.status;
8313 cfInfo->reason = cf.reason;
8314 cfInfo->serviceClass = cf.serviceClass;
8315 cfInfo->toa = cf.toa;
8316 cfInfo->number = convertCharPtrToHidlString(cf.number);
8317 cfInfo->timeSeconds = cf.timeSeconds;
Jayachandran C572f2f42017-03-25 14:30:13 -07008318#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08008319 RLOGD("onSupplementaryServiceIndicationInd: "
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008320 "Data: %d,reason=%d,cls=%d,toa=%d,num=%s,tout=%d],", cf.status,
8321 cf.reason, cf.serviceClass, cf.toa, (char*)cf.number, cf.timeSeconds);
Jayachandran C572f2f42017-03-25 14:30:13 -07008322#endif
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008323 }
8324 } else {
8325 ss.ssInfo.resize(1);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08008326 ss.cfData.resize(0);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008327
8328 /* each int */
8329 ss.ssInfo[0].ssInfo.resize(SS_INFO_MAX);
8330 for (int i = 0; i < SS_INFO_MAX; i++) {
Jayachandran C572f2f42017-03-25 14:30:13 -07008331#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08008332 RLOGD("onSupplementaryServiceIndicationInd: Data: %d",
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008333 rilSsResponse->ssInfo[i]);
Jayachandran C572f2f42017-03-25 14:30:13 -07008334#endif
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008335 ss.ssInfo[0].ssInfo[i] = rilSsResponse->ssInfo[i];
8336 }
8337 }
8338
Jayachandran C572f2f42017-03-25 14:30:13 -07008339#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08008340 RLOGD("onSupplementaryServiceIndicationInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07008341#endif
Amit Mahajan17249842017-01-19 15:05:45 -08008342 Return<void> retStatus = radioService[slotId]->mRadioIndication->
8343 onSupplementaryServiceIndication(convertIntToRadioIndicationType(indicationType),
8344 ss);
8345 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008346 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008347 RLOGE("onSupplementaryServiceIndicationInd: "
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008348 "radioService[%d]->mRadioIndication == NULL", slotId);
8349 }
8350
8351 return 0;
8352}
8353
Amit Mahajan759786a2017-03-03 17:35:47 -08008354int radio::stkCallControlAlphaNotifyInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008355 int indicationType, int token, RIL_Errno e, void *response,
8356 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08008357 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008358 if (response == NULL || responseLen == 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008359 RLOGE("stkCallControlAlphaNotifyInd: invalid response");
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008360 return 0;
8361 }
Jayachandran C572f2f42017-03-25 14:30:13 -07008362#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08008363 RLOGD("stkCallControlAlphaNotifyInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07008364#endif
Amit Mahajan17249842017-01-19 15:05:45 -08008365 Return<void> retStatus = radioService[slotId]->mRadioIndication->stkCallControlAlphaNotify(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008366 convertIntToRadioIndicationType(indicationType),
8367 convertCharPtrToHidlString((char *) response));
Amit Mahajan17249842017-01-19 15:05:45 -08008368 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008369 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008370 RLOGE("stkCallControlAlphaNotifyInd: radioService[%d]->mRadioIndication == NULL",
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008371 slotId);
8372 }
8373
8374 return 0;
8375}
8376
8377void convertRilLceDataInfoToHal(void *response, size_t responseLen, LceDataInfo& lce) {
8378 RIL_LceDataInfo *rilLceDataInfo = (RIL_LceDataInfo *)response;
8379 lce.lastHopCapacityKbps = rilLceDataInfo->last_hop_capacity_kbps;
8380 lce.confidenceLevel = rilLceDataInfo->confidence_level;
8381 lce.lceSuspended = rilLceDataInfo->lce_suspended;
8382}
8383
Amit Mahajan759786a2017-03-03 17:35:47 -08008384int radio::lceDataInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008385 int indicationType, int token, RIL_Errno e, void *response,
8386 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08008387 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008388 if (response == NULL || responseLen != sizeof(RIL_LceDataInfo)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008389 RLOGE("lceDataInd: invalid response");
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008390 return 0;
8391 }
8392
Jack Yuf68e0da2017-02-07 14:53:09 -08008393 LceDataInfo lce = {};
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008394 convertRilLceDataInfoToHal(response, responseLen, lce);
Jayachandran C572f2f42017-03-25 14:30:13 -07008395#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08008396 RLOGD("lceDataInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07008397#endif
Amit Mahajan17249842017-01-19 15:05:45 -08008398 Return<void> retStatus = radioService[slotId]->mRadioIndication->lceData(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008399 convertIntToRadioIndicationType(indicationType), lce);
Amit Mahajan17249842017-01-19 15:05:45 -08008400 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008401 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008402 RLOGE("lceDataInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008403 }
8404
8405 return 0;
8406}
8407
Amit Mahajan759786a2017-03-03 17:35:47 -08008408int radio::pcoDataInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008409 int indicationType, int token, RIL_Errno e, void *response,
8410 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08008411 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008412 if (response == NULL || responseLen != sizeof(RIL_PCO_Data)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008413 RLOGE("pcoDataInd: invalid response");
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008414 return 0;
8415 }
8416
Jack Yuf68e0da2017-02-07 14:53:09 -08008417 PcoDataInfo pco = {};
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008418 RIL_PCO_Data *rilPcoData = (RIL_PCO_Data *)response;
8419 pco.cid = rilPcoData->cid;
8420 pco.bearerProto = convertCharPtrToHidlString(rilPcoData->bearer_proto);
8421 pco.pcoId = rilPcoData->pco_id;
8422 pco.contents.setToExternal((uint8_t *) rilPcoData->contents, rilPcoData->contents_length);
8423
Jayachandran C572f2f42017-03-25 14:30:13 -07008424#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08008425 RLOGD("pcoDataInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07008426#endif
Amit Mahajan17249842017-01-19 15:05:45 -08008427 Return<void> retStatus = radioService[slotId]->mRadioIndication->pcoData(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008428 convertIntToRadioIndicationType(indicationType), pco);
Amit Mahajan17249842017-01-19 15:05:45 -08008429 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008430 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008431 RLOGE("pcoDataInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008432 }
8433
8434 return 0;
8435}
8436
Amit Mahajan759786a2017-03-03 17:35:47 -08008437int radio::modemResetInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008438 int indicationType, int token, RIL_Errno e, void *response,
8439 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08008440 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008441 if (response == NULL || responseLen == 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008442 RLOGE("modemResetInd: invalid response");
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008443 return 0;
8444 }
Jayachandran C572f2f42017-03-25 14:30:13 -07008445#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08008446 RLOGD("modemResetInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07008447#endif
Amit Mahajan17249842017-01-19 15:05:45 -08008448 Return<void> retStatus = radioService[slotId]->mRadioIndication->modemReset(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008449 convertIntToRadioIndicationType(indicationType),
8450 convertCharPtrToHidlString((char *) response));
Amit Mahajan17249842017-01-19 15:05:45 -08008451 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008452 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008453 RLOGE("modemResetInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008454 }
8455
8456 return 0;
8457}
8458
yinxu3abe7c72017-05-03 15:15:19 -07008459int radio::networkScanResultInd(int slotId,
8460 int indicationType, int token, RIL_Errno e, void *response,
yinxu8688abd2017-05-22 11:26:45 -07008461 size_t responseLen) {
yinxu3abe7c72017-05-03 15:15:19 -07008462#if VDBG
8463 RLOGD("networkScanResultInd");
8464#endif
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07008465 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndicationV1_1 != NULL) {
yinxu8688abd2017-05-22 11:26:45 -07008466 if (response == NULL || responseLen == 0) {
8467 RLOGE("networkScanResultInd: invalid response");
8468 return 0;
8469 }
8470 RLOGD("networkScanResultInd");
8471
8472#if VDBG
8473 RLOGD("networkScanResultInd");
8474#endif
8475
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07008476 RIL_NetworkScanResult *networkScanResult = (RIL_NetworkScanResult *) response;
yinxu8688abd2017-05-22 11:26:45 -07008477
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07008478 V1_1::NetworkScanResult result;
8479 result.status = (V1_1::ScanStatus) networkScanResult->status;
Sooraj Sasindran982ba7a2018-05-07 21:20:43 -07008480 result.error = (RadioError) networkScanResult->error;
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07008481 convertRilCellInfoListToHal(
8482 networkScanResult->network_infos,
8483 networkScanResult->network_infos_length * sizeof(RIL_CellInfo_v12),
8484 result.networkInfos);
yinxu8688abd2017-05-22 11:26:45 -07008485
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07008486 Return<void> retStatus = radioService[slotId]->mRadioIndicationV1_1->networkScanResult(
8487 convertIntToRadioIndicationType(indicationType), result);
8488 radioService[slotId]->checkReturnStatus(retStatus);
yinxu8688abd2017-05-22 11:26:45 -07008489 } else {
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07008490 RLOGE("networkScanResultInd: radioService[%d]->mRadioIndicationV1_1 == NULL", slotId);
yinxu8688abd2017-05-22 11:26:45 -07008491 }
yinxu3abe7c72017-05-03 15:15:19 -07008492 return 0;
8493}
8494
pkanwardb8e0942017-03-17 12:49:34 -07008495int radio::carrierInfoForImsiEncryption(int slotId,
8496 int indicationType, int token, RIL_Errno e, void *response,
8497 size_t responseLen) {
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07008498 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndicationV1_1 != NULL) {
pkanwardb8e0942017-03-17 12:49:34 -07008499 if (response == NULL || responseLen == 0) {
8500 RLOGE("carrierInfoForImsiEncryption: invalid response");
8501 return 0;
8502 }
8503 RLOGD("carrierInfoForImsiEncryption");
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07008504 Return<void> retStatus = radioService[slotId]->mRadioIndicationV1_1->
8505 carrierInfoForImsiEncryption(convertIntToRadioIndicationType(indicationType));
8506 radioService[slotId]->checkReturnStatus(retStatus);
pkanwardb8e0942017-03-17 12:49:34 -07008507 } else {
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07008508 RLOGE("carrierInfoForImsiEncryption: radioService[%d]->mRadioIndicationV1_1 == NULL",
8509 slotId);
pkanwardb8e0942017-03-17 12:49:34 -07008510 }
8511
8512 return 0;
8513}
8514
Nathan Harold6a8809d2017-07-07 19:28:58 -07008515int radio::keepaliveStatusInd(int slotId,
8516 int indicationType, int token, RIL_Errno e, void *response,
8517 size_t responseLen) {
8518#if VDBG
8519 RLOGD("%s(): token=%d", __FUNCTION__, token);
8520#endif
8521 if (radioService[slotId] == NULL || radioService[slotId]->mRadioIndication == NULL) {
8522 RLOGE("%s: radioService[%d]->mRadioIndication == NULL", __FUNCTION__, slotId);
8523 return 0;
8524 }
8525
8526 auto ret = V1_1::IRadioIndication::castFrom(
8527 radioService[slotId]->mRadioIndication);
8528 if (!ret.isOk()) {
8529 RLOGE("%s: ret.isOk() == false for radioService[%d]", __FUNCTION__, slotId);
8530 return 0;
8531 }
8532 sp<V1_1::IRadioIndication> radioIndicationV1_1 = ret;
8533
8534 if (response == NULL || responseLen != sizeof(V1_1::KeepaliveStatus)) {
8535 RLOGE("%s: invalid response", __FUNCTION__);
8536 return 0;
8537 }
8538
8539 V1_1::KeepaliveStatus ks;
8540 convertRilKeepaliveStatusToHal(static_cast<RIL_KeepaliveStatus*>(response), ks);
8541
8542 Return<void> retStatus = radioIndicationV1_1->keepaliveStatus(
8543 convertIntToRadioIndicationType(indicationType), ks);
8544 radioService[slotId]->checkReturnStatus(retStatus);
8545 return 0;
8546}
8547
Amit Mahajan759786a2017-03-03 17:35:47 -08008548int radio::oemHookRawInd(int slotId,
Amit Mahajan439da362017-02-13 17:43:04 -08008549 int indicationType, int token, RIL_Errno e, void *response,
8550 size_t responseLen) {
Steven Moreland6cc40042018-03-20 11:20:05 -07008551 if (!kOemHookEnabled) return 0;
8552
Amit Mahajan439da362017-02-13 17:43:04 -08008553 if (oemHookService[slotId] != NULL && oemHookService[slotId]->mOemHookIndication != NULL) {
8554 if (response == NULL || responseLen == 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008555 RLOGE("oemHookRawInd: invalid response");
Amit Mahajan439da362017-02-13 17:43:04 -08008556 return 0;
8557 }
8558
8559 hidl_vec<uint8_t> data;
8560 data.setToExternal((uint8_t *) response, responseLen);
Jayachandran C572f2f42017-03-25 14:30:13 -07008561#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08008562 RLOGD("oemHookRawInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07008563#endif
Amit Mahajan439da362017-02-13 17:43:04 -08008564 Return<void> retStatus = oemHookService[slotId]->mOemHookIndication->oemHookRaw(
8565 convertIntToRadioIndicationType(indicationType), data);
Amit Mahajand423d192017-03-16 17:04:01 -07008566 checkReturnStatus(slotId, retStatus, false);
Amit Mahajan439da362017-02-13 17:43:04 -08008567 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008568 RLOGE("oemHookRawInd: oemHookService[%d]->mOemHookIndication == NULL", slotId);
Amit Mahajan439da362017-02-13 17:43:04 -08008569 }
8570
8571 return 0;
8572}
8573
Amit Mahajancd77a5b2016-08-25 11:19:21 -07008574void radio::registerService(RIL_RadioFunctions *callbacks, CommandInfo *commands) {
8575 using namespace android::hardware;
8576 int simCount = 1;
Amit Mahajan439da362017-02-13 17:43:04 -08008577 const char *serviceNames[] = {
Amit Mahajan7955c432017-03-28 11:17:55 -07008578 android::RIL_getServiceName()
Amit Mahajancd77a5b2016-08-25 11:19:21 -07008579 #if (SIM_COUNT >= 2)
Amit Mahajan7955c432017-03-28 11:17:55 -07008580 , RIL2_SERVICE_NAME
Amit Mahajancd77a5b2016-08-25 11:19:21 -07008581 #if (SIM_COUNT >= 3)
Amit Mahajan7955c432017-03-28 11:17:55 -07008582 , RIL3_SERVICE_NAME
Amit Mahajancd77a5b2016-08-25 11:19:21 -07008583 #if (SIM_COUNT >= 4)
Amit Mahajan7955c432017-03-28 11:17:55 -07008584 , RIL4_SERVICE_NAME
Amit Mahajan439da362017-02-13 17:43:04 -08008585 #endif
8586 #endif
8587 #endif
8588 };
8589
Amit Mahajancd77a5b2016-08-25 11:19:21 -07008590 #if (SIM_COUNT >= 2)
8591 simCount = SIM_COUNT;
8592 #endif
8593
terrycrhuang456df1b2018-05-04 13:47:06 +08008594 s_vendorFunctions = callbacks;
8595 s_commands = commands;
8596
Amit Mahajancd77a5b2016-08-25 11:19:21 -07008597 configureRpcThreadpool(1, true /* callerWillJoin */);
8598 for (int i = 0; i < simCount; i++) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08008599 pthread_rwlock_t *radioServiceRwlockPtr = getRadioServiceRwlock(i);
8600 int ret = pthread_rwlock_wrlock(radioServiceRwlockPtr);
8601 assert(ret == 0);
8602
Amit Mahajancd77a5b2016-08-25 11:19:21 -07008603 radioService[i] = new RadioImpl;
Sanket Padawef220dc52017-01-02 23:46:00 -08008604 radioService[i]->mSlotId = i;
pkanwardb8e0942017-03-17 12:49:34 -07008605 RLOGD("registerService: starting android::hardware::radio::V1_1::IRadio %s",
8606 serviceNames[i]);
Amit Mahajancd77a5b2016-08-25 11:19:21 -07008607 android::status_t status = radioService[i]->registerAsService(serviceNames[i]);
Steven Moreland6cc40042018-03-20 11:20:05 -07008608
8609 if (kOemHookEnabled) {
8610 oemHookService[i] = new OemHookImpl;
8611 oemHookService[i]->mSlotId = i;
8612 status = oemHookService[i]->registerAsService(serviceNames[i]);
8613 }
Amit Mahajan932e08e2017-01-24 05:45:02 -08008614
8615 ret = pthread_rwlock_unlock(radioServiceRwlockPtr);
8616 assert(ret == 0);
Amit Mahajancd77a5b2016-08-25 11:19:21 -07008617 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07008618}
8619
8620void rilc_thread_pool() {
8621 joinRpcThreadpool();
Amit Mahajan932e08e2017-01-24 05:45:02 -08008622}
8623
8624pthread_rwlock_t * radio::getRadioServiceRwlock(int slotId) {
8625 pthread_rwlock_t *radioServiceRwlockPtr = &radioServiceRwlock;
8626
8627 #if (SIM_COUNT >= 2)
8628 if (slotId == 2) radioServiceRwlockPtr = &radioServiceRwlock2;
8629 #if (SIM_COUNT >= 3)
8630 if (slotId == 3) radioServiceRwlockPtr = &radioServiceRwlock3;
8631 #if (SIM_COUNT >= 4)
8632 if (slotId == 4) radioServiceRwlockPtr = &radioServiceRwlock4;
8633 #endif
8634 #endif
8635 #endif
8636
8637 return radioServiceRwlockPtr;
Sanket Padawe0de29d12017-02-10 13:19:47 -08008638}
Amit Mahajane9a10e62018-02-23 17:12:15 -08008639
8640// should acquire write lock for the corresponding service before calling this
8641void radio::setNitzTimeReceived(int slotId, long timeReceived) {
8642 nitzTimeReceived[slotId] = timeReceived;
8643}