blob: 07125105e5a742e94af0ea4f1774ecc238b3cba6 [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
Amit Mahajan3df62912017-02-10 01:35:55 +0000105void convertRilHardwareConfigListToHal(void *response, size_t responseLen,
106 hidl_vec<HardwareConfig>& records);
107
108void convertRilRadioCapabilityToHal(void *response, size_t responseLen, RadioCapability& rc);
109
110void convertRilLceDataInfoToHal(void *response, size_t responseLen, LceDataInfo& lce);
111
112void convertRilSignalStrengthToHal(void *response, size_t responseLen,
113 SignalStrength& signalStrength);
114
115void convertRilDataCallToHal(RIL_Data_Call_Response_v11 *dcResponse,
116 SetupDataCallResult& dcResult);
117
118void convertRilDataCallListToHal(void *response, size_t responseLen,
119 hidl_vec<SetupDataCallResult>& dcResultList);
120
121void convertRilCellInfoListToHal(void *response, size_t responseLen, hidl_vec<CellInfo>& records);
122
Amit Mahajanccb6d7f2017-06-09 10:44:54 -0700123struct RadioImpl : public V1_1::IRadio {
Sanket Padawef220dc52017-01-02 23:46:00 -0800124 int32_t mSlotId;
125 sp<IRadioResponse> mRadioResponse;
126 sp<IRadioIndication> mRadioIndication;
Amit Mahajanccb6d7f2017-06-09 10:44:54 -0700127 sp<V1_1::IRadioResponse> mRadioResponseV1_1;
128 sp<V1_1::IRadioIndication> mRadioIndicationV1_1;
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700129
130 Return<void> setResponseFunctions(
131 const ::android::sp<IRadioResponse>& radioResponse,
132 const ::android::sp<IRadioIndication>& radioIndication);
133
134 Return<void> getIccCardStatus(int32_t serial);
135
Sanket Padawef220dc52017-01-02 23:46:00 -0800136 Return<void> supplyIccPinForApp(int32_t serial, const hidl_string& pin,
137 const hidl_string& aid);
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700138
Sanket Padawef220dc52017-01-02 23:46:00 -0800139 Return<void> supplyIccPukForApp(int32_t serial, const hidl_string& puk,
140 const hidl_string& pin, const hidl_string& aid);
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700141
142 Return<void> supplyIccPin2ForApp(int32_t serial,
Sanket Padawef220dc52017-01-02 23:46:00 -0800143 const hidl_string& pin2,
144 const hidl_string& aid);
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700145
Sanket Padawef220dc52017-01-02 23:46:00 -0800146 Return<void> supplyIccPuk2ForApp(int32_t serial, const hidl_string& puk2,
147 const hidl_string& pin2, const hidl_string& aid);
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700148
Sanket Padawef220dc52017-01-02 23:46:00 -0800149 Return<void> changeIccPinForApp(int32_t serial, const hidl_string& oldPin,
150 const hidl_string& newPin, const hidl_string& aid);
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700151
Sanket Padawef220dc52017-01-02 23:46:00 -0800152 Return<void> changeIccPin2ForApp(int32_t serial, const hidl_string& oldPin2,
153 const hidl_string& newPin2, const hidl_string& aid);
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700154
Sanket Padawef220dc52017-01-02 23:46:00 -0800155 Return<void> supplyNetworkDepersonalization(int32_t serial, const hidl_string& netPin);
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700156
157 Return<void> getCurrentCalls(int32_t serial);
158
Sanket Padawef220dc52017-01-02 23:46:00 -0800159 Return<void> dial(int32_t serial, const Dial& dialInfo);
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700160
161 Return<void> getImsiForApp(int32_t serial,
162 const ::android::hardware::hidl_string& aid);
163
164 Return<void> hangup(int32_t serial, int32_t gsmIndex);
165
166 Return<void> hangupWaitingOrBackground(int32_t serial);
167
168 Return<void> hangupForegroundResumeBackground(int32_t serial);
169
170 Return<void> switchWaitingOrHoldingAndActive(int32_t serial);
171
172 Return<void> conference(int32_t serial);
173
174 Return<void> rejectCall(int32_t serial);
175
176 Return<void> getLastCallFailCause(int32_t serial);
177
178 Return<void> getSignalStrength(int32_t serial);
179
180 Return<void> getVoiceRegistrationState(int32_t serial);
181
182 Return<void> getDataRegistrationState(int32_t serial);
183
184 Return<void> getOperator(int32_t serial);
185
186 Return<void> setRadioPower(int32_t serial, bool on);
187
188 Return<void> sendDtmf(int32_t serial,
189 const ::android::hardware::hidl_string& s);
190
191 Return<void> sendSms(int32_t serial, const GsmSmsMessage& message);
192
193 Return<void> sendSMSExpectMore(int32_t serial, const GsmSmsMessage& message);
194
195 Return<void> setupDataCall(int32_t serial,
Jack Yu06181bb2017-01-10 12:10:41 -0800196 RadioTechnology radioTechnology,
197 const DataProfileInfo& profileInfo,
198 bool modemCognitive,
Jack Yuffc06452017-02-13 11:21:00 -0800199 bool roamingAllowed,
200 bool isRoaming);
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700201
202 Return<void> iccIOForApp(int32_t serial,
203 const IccIo& iccIo);
204
205 Return<void> sendUssd(int32_t serial,
206 const ::android::hardware::hidl_string& ussd);
207
208 Return<void> cancelPendingUssd(int32_t serial);
209
210 Return<void> getClir(int32_t serial);
211
212 Return<void> setClir(int32_t serial, int32_t status);
213
214 Return<void> getCallForwardStatus(int32_t serial,
215 const CallForwardInfo& callInfo);
216
217 Return<void> setCallForward(int32_t serial,
218 const CallForwardInfo& callInfo);
219
220 Return<void> getCallWaiting(int32_t serial, int32_t serviceClass);
221
222 Return<void> setCallWaiting(int32_t serial, bool enable, int32_t serviceClass);
223
224 Return<void> acknowledgeLastIncomingGsmSms(int32_t serial,
225 bool success, SmsAcknowledgeFailCause cause);
226
227 Return<void> acceptCall(int32_t serial);
228
229 Return<void> deactivateDataCall(int32_t serial,
230 int32_t cid, bool reasonRadioShutDown);
231
232 Return<void> getFacilityLockForApp(int32_t serial,
233 const ::android::hardware::hidl_string& facility,
234 const ::android::hardware::hidl_string& password,
235 int32_t serviceClass,
236 const ::android::hardware::hidl_string& appId);
237
238 Return<void> setFacilityLockForApp(int32_t serial,
239 const ::android::hardware::hidl_string& facility,
240 bool lockState,
241 const ::android::hardware::hidl_string& password,
242 int32_t serviceClass,
243 const ::android::hardware::hidl_string& appId);
244
245 Return<void> setBarringPassword(int32_t serial,
246 const ::android::hardware::hidl_string& facility,
247 const ::android::hardware::hidl_string& oldPassword,
248 const ::android::hardware::hidl_string& newPassword);
249
250 Return<void> getNetworkSelectionMode(int32_t serial);
251
252 Return<void> setNetworkSelectionModeAutomatic(int32_t serial);
253
254 Return<void> setNetworkSelectionModeManual(int32_t serial,
255 const ::android::hardware::hidl_string& operatorNumeric);
256
257 Return<void> getAvailableNetworks(int32_t serial);
258
Nathan Harold6a8809d2017-07-07 19:28:58 -0700259 Return<void> startNetworkScan(int32_t serial, const V1_1::NetworkScanRequest& request);
yinxu3abe7c72017-05-03 15:15:19 -0700260
261 Return<void> stopNetworkScan(int32_t serial);
262
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700263 Return<void> startDtmf(int32_t serial,
264 const ::android::hardware::hidl_string& s);
265
266 Return<void> stopDtmf(int32_t serial);
267
268 Return<void> getBasebandVersion(int32_t serial);
269
270 Return<void> separateConnection(int32_t serial, int32_t gsmIndex);
271
272 Return<void> setMute(int32_t serial, bool enable);
273
274 Return<void> getMute(int32_t serial);
275
276 Return<void> getClip(int32_t serial);
277
278 Return<void> getDataCallList(int32_t serial);
279
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700280 Return<void> setSuppServiceNotifications(int32_t serial, bool enable);
281
282 Return<void> writeSmsToSim(int32_t serial,
283 const SmsWriteArgs& smsWriteArgs);
284
285 Return<void> deleteSmsOnSim(int32_t serial, int32_t index);
286
287 Return<void> setBandMode(int32_t serial, RadioBandMode mode);
288
289 Return<void> getAvailableBandModes(int32_t serial);
290
291 Return<void> sendEnvelope(int32_t serial,
292 const ::android::hardware::hidl_string& command);
293
294 Return<void> sendTerminalResponseToSim(int32_t serial,
295 const ::android::hardware::hidl_string& commandResponse);
296
297 Return<void> handleStkCallSetupRequestFromSim(int32_t serial, bool accept);
298
299 Return<void> explicitCallTransfer(int32_t serial);
300
301 Return<void> setPreferredNetworkType(int32_t serial, PreferredNetworkType nwType);
302
303 Return<void> getPreferredNetworkType(int32_t serial);
304
305 Return<void> getNeighboringCids(int32_t serial);
306
307 Return<void> setLocationUpdates(int32_t serial, bool enable);
308
309 Return<void> setCdmaSubscriptionSource(int32_t serial,
310 CdmaSubscriptionSource cdmaSub);
311
312 Return<void> setCdmaRoamingPreference(int32_t serial, CdmaRoamingType type);
313
314 Return<void> getCdmaRoamingPreference(int32_t serial);
315
316 Return<void> setTTYMode(int32_t serial, TtyMode mode);
317
318 Return<void> getTTYMode(int32_t serial);
319
320 Return<void> setPreferredVoicePrivacy(int32_t serial, bool enable);
321
322 Return<void> getPreferredVoicePrivacy(int32_t serial);
323
324 Return<void> sendCDMAFeatureCode(int32_t serial,
325 const ::android::hardware::hidl_string& featureCode);
326
327 Return<void> sendBurstDtmf(int32_t serial,
328 const ::android::hardware::hidl_string& dtmf,
329 int32_t on,
330 int32_t off);
331
332 Return<void> sendCdmaSms(int32_t serial, const CdmaSmsMessage& sms);
333
334 Return<void> acknowledgeLastIncomingCdmaSms(int32_t serial,
335 const CdmaSmsAck& smsAck);
336
337 Return<void> getGsmBroadcastConfig(int32_t serial);
338
339 Return<void> setGsmBroadcastConfig(int32_t serial,
340 const hidl_vec<GsmBroadcastSmsConfigInfo>& configInfo);
341
342 Return<void> setGsmBroadcastActivation(int32_t serial, bool activate);
343
344 Return<void> getCdmaBroadcastConfig(int32_t serial);
345
346 Return<void> setCdmaBroadcastConfig(int32_t serial,
347 const hidl_vec<CdmaBroadcastSmsConfigInfo>& configInfo);
348
349 Return<void> setCdmaBroadcastActivation(int32_t serial, bool activate);
350
351 Return<void> getCDMASubscription(int32_t serial);
352
353 Return<void> writeSmsToRuim(int32_t serial, const CdmaSmsWriteArgs& cdmaSms);
354
355 Return<void> deleteSmsOnRuim(int32_t serial, int32_t index);
356
357 Return<void> getDeviceIdentity(int32_t serial);
358
359 Return<void> exitEmergencyCallbackMode(int32_t serial);
360
361 Return<void> getSmscAddress(int32_t serial);
362
363 Return<void> setSmscAddress(int32_t serial,
364 const ::android::hardware::hidl_string& smsc);
365
366 Return<void> reportSmsMemoryStatus(int32_t serial, bool available);
367
368 Return<void> reportStkServiceIsRunning(int32_t serial);
369
370 Return<void> getCdmaSubscriptionSource(int32_t serial);
371
372 Return<void> requestIsimAuthentication(int32_t serial,
373 const ::android::hardware::hidl_string& challenge);
374
375 Return<void> acknowledgeIncomingGsmSmsWithPdu(int32_t serial,
376 bool success,
377 const ::android::hardware::hidl_string& ackPdu);
378
379 Return<void> sendEnvelopeWithStatus(int32_t serial,
380 const ::android::hardware::hidl_string& contents);
381
382 Return<void> getVoiceRadioTechnology(int32_t serial);
383
384 Return<void> getCellInfoList(int32_t serial);
385
386 Return<void> setCellInfoListRate(int32_t serial, int32_t rate);
387
Jack Yu06181bb2017-01-10 12:10:41 -0800388 Return<void> setInitialAttachApn(int32_t serial, const DataProfileInfo& dataProfileInfo,
Jack Yuffc06452017-02-13 11:21:00 -0800389 bool modemCognitive, bool isRoaming);
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700390
391 Return<void> getImsRegistrationState(int32_t serial);
392
393 Return<void> sendImsSms(int32_t serial, const ImsSmsMessage& message);
394
395 Return<void> iccTransmitApduBasicChannel(int32_t serial, const SimApdu& message);
396
397 Return<void> iccOpenLogicalChannel(int32_t serial,
Wileen Chiu410b7562015-11-23 14:25:22 -0800398 const ::android::hardware::hidl_string& aid, int32_t p2);
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700399
400 Return<void> iccCloseLogicalChannel(int32_t serial, int32_t channelId);
401
402 Return<void> iccTransmitApduLogicalChannel(int32_t serial, const SimApdu& message);
403
404 Return<void> nvReadItem(int32_t serial, NvItem itemId);
405
406 Return<void> nvWriteItem(int32_t serial, const NvWriteItem& item);
407
408 Return<void> nvWriteCdmaPrl(int32_t serial,
409 const ::android::hardware::hidl_vec<uint8_t>& prl);
410
411 Return<void> nvResetConfig(int32_t serial, ResetNvType resetType);
412
413 Return<void> setUiccSubscription(int32_t serial, const SelectUiccSub& uiccSub);
414
415 Return<void> setDataAllowed(int32_t serial, bool allow);
416
417 Return<void> getHardwareConfig(int32_t serial);
418
419 Return<void> requestIccSimAuthentication(int32_t serial,
420 int32_t authContext,
421 const ::android::hardware::hidl_string& authData,
422 const ::android::hardware::hidl_string& aid);
423
424 Return<void> setDataProfile(int32_t serial,
Jack Yuffc06452017-02-13 11:21:00 -0800425 const ::android::hardware::hidl_vec<DataProfileInfo>& profiles, bool isRoaming);
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700426
427 Return<void> requestShutdown(int32_t serial);
428
429 Return<void> getRadioCapability(int32_t serial);
430
431 Return<void> setRadioCapability(int32_t serial, const RadioCapability& rc);
432
433 Return<void> startLceService(int32_t serial, int32_t reportInterval, bool pullMode);
434
435 Return<void> stopLceService(int32_t serial);
436
437 Return<void> pullLceData(int32_t serial);
438
439 Return<void> getModemActivityInfo(int32_t serial);
440
441 Return<void> setAllowedCarriers(int32_t serial,
442 bool allAllowed,
443 const CarrierRestrictions& carriers);
444
445 Return<void> getAllowedCarriers(int32_t serial);
446
Jack Yu06181bb2017-01-10 12:10:41 -0800447 Return<void> sendDeviceState(int32_t serial, DeviceStateType deviceStateType, bool state);
448
449 Return<void> setIndicationFilter(int32_t serial, int32_t indicationFilter);
450
Nathan Harold6a8809d2017-07-07 19:28:58 -0700451 Return<void> startKeepalive(int32_t serial, const V1_1::KeepaliveRequest& keepalive);
Nathan Haroldec94b822017-05-25 16:10:35 -0700452
453 Return<void> stopKeepalive(int32_t serial, int32_t sessionHandle);
454
Wileen Chiu718c0bf2017-01-04 11:37:19 -0800455 Return<void> setSimCardPower(int32_t serial, bool powerUp);
Grace Chen08eb6542017-03-23 18:39:48 -0700456 Return<void> setSimCardPower_1_1(int32_t serial,
Amit Mahajanccb6d7f2017-06-09 10:44:54 -0700457 const V1_1::CardPowerState state);
Wileen Chiu718c0bf2017-01-04 11:37:19 -0800458
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700459 Return<void> responseAcknowledgement();
Amit Mahajan17249842017-01-19 15:05:45 -0800460
pkanwardb8e0942017-03-17 12:49:34 -0700461 Return<void> setCarrierInfoForImsiEncryption(int32_t serial,
Nathan Harold6a8809d2017-07-07 19:28:58 -0700462 const V1_1::ImsiEncryptionInfo& message);
pkanwardb8e0942017-03-17 12:49:34 -0700463
Amit Mahajan17249842017-01-19 15:05:45 -0800464 void checkReturnStatus(Return<void>& ret);
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700465};
466
Amit Mahajan439da362017-02-13 17:43:04 -0800467struct OemHookImpl : public IOemHook {
468 int32_t mSlotId;
469 sp<IOemHookResponse> mOemHookResponse;
470 sp<IOemHookIndication> mOemHookIndication;
471
472 Return<void> setResponseFunctions(
473 const ::android::sp<IOemHookResponse>& oemHookResponse,
474 const ::android::sp<IOemHookIndication>& oemHookIndication);
475
476 Return<void> sendRequestRaw(int32_t serial,
477 const ::android::hardware::hidl_vec<uint8_t>& data);
478
479 Return<void> sendRequestStrings(int32_t serial,
480 const ::android::hardware::hidl_vec<::android::hardware::hidl_string>& data);
481};
482
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800483void memsetAndFreeStrings(int numPointers, ...) {
484 va_list ap;
485 va_start(ap, numPointers);
486 for (int i = 0; i < numPointers; i++) {
487 char *ptr = va_arg(ap, char *);
488 if (ptr) {
489#ifdef MEMSET_FREED
Jack Yub4295a42017-04-14 12:51:49 -0700490#define MAX_STRING_LENGTH 4096
491 memset(ptr, 0, strnlen(ptr, MAX_STRING_LENGTH));
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800492#endif
493 free(ptr);
494 }
495 }
496 va_end(ap);
497}
498
Jack Yuffc06452017-02-13 11:21:00 -0800499void sendErrorResponse(RequestInfo *pRI, RIL_Errno err) {
Amit Mahajan759786a2017-03-03 17:35:47 -0800500 pRI->pCI->responseFunction((int) pRI->socket_id,
Jack Yuffc06452017-02-13 11:21:00 -0800501 (int) RadioResponseType::SOLICITED, pRI->token, err, NULL, 0);
502}
503
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800504/**
Jack Yuf68e0da2017-02-07 14:53:09 -0800505 * Copies over src to dest. If memory allocation fails, responseFunction() is called for the
Ashit Sood169fc262018-09-06 14:10:34 -0700506 * request with error RIL_E_NO_MEMORY. The size() method is used to determine the size of the
507 * destination buffer into which the HIDL string is copied. If there is a discrepancy between
508 * the string length reported by the size() method, and the length of the string returned by
509 * the c_str() method, the function will return false indicating a failure.
510 *
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800511 * Returns true on success, and false on failure.
512 */
Ruthwar Kumar Ambeer7c373812017-03-23 17:38:56 +0530513bool copyHidlStringToRil(char **dest, const hidl_string &src, RequestInfo *pRI, bool allowEmpty) {
Jack Yuf68e0da2017-02-07 14:53:09 -0800514 size_t len = src.size();
Ruthwar Kumar Ambeer7c373812017-03-23 17:38:56 +0530515 if (len == 0 && !allowEmpty) {
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800516 *dest = NULL;
517 return true;
518 }
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800519 *dest = (char *) calloc(len + 1, sizeof(char));
520 if (*dest == NULL) {
521 RLOGE("Memory allocation failed for request %s", requestToString(pRI->pCI->requestNumber));
Jack Yuffc06452017-02-13 11:21:00 -0800522 sendErrorResponse(pRI, RIL_E_NO_MEMORY);
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800523 return false;
524 }
Ashit Sood169fc262018-09-06 14:10:34 -0700525 if (strlcpy(*dest, src.c_str(), len + 1) >= (len + 1)) {
526 RLOGE("Copy of the HIDL string has been truncated, as "
527 "the string length reported by size() does not "
528 "match the length of string returned by c_str().");
529 free(*dest);
530 *dest = NULL;
531 sendErrorResponse(pRI, RIL_E_INTERNAL_ERR);
532 return false;
533 }
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800534 return true;
535}
536
Ruthwar Kumar Ambeer7c373812017-03-23 17:38:56 +0530537bool copyHidlStringToRil(char **dest, const hidl_string &src, RequestInfo *pRI) {
538 return copyHidlStringToRil(dest, src, pRI, false);
539}
540
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800541hidl_string convertCharPtrToHidlString(const char *ptr) {
542 hidl_string ret;
543 if (ptr != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -0800544 // TODO: replace this with strnlen
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800545 ret.setToExternal(ptr, strlen(ptr));
546 }
547 return ret;
548}
549
550bool dispatchVoid(int serial, int slotId, int request) {
551 RequestInfo *pRI = android::addRequestToList(serial, slotId, request);
552 if (pRI == NULL) {
553 return false;
554 }
Amit Mahajanb3a11bb2017-05-15 16:41:44 -0700555 CALL_ONREQUEST(request, NULL, 0, pRI, slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800556 return true;
557}
558
559bool dispatchString(int serial, int slotId, int request, const char * str) {
560 RequestInfo *pRI = android::addRequestToList(serial, slotId, request);
561 if (pRI == NULL) {
562 return false;
563 }
564
565 char *pString;
566 if (!copyHidlStringToRil(&pString, str, pRI)) {
567 return false;
568 }
569
Amit Mahajanb3a11bb2017-05-15 16:41:44 -0700570 CALL_ONREQUEST(request, pString, sizeof(char *), pRI, slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800571
572 memsetAndFreeStrings(1, pString);
573 return true;
574}
575
Ruthwar Kumar Ambeer7c373812017-03-23 17:38:56 +0530576bool dispatchStrings(int serial, int slotId, int request, bool allowEmpty, int countStrings, ...) {
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800577 RequestInfo *pRI = android::addRequestToList(serial, slotId, request);
578 if (pRI == NULL) {
579 return false;
580 }
581
Sanket Padawef220dc52017-01-02 23:46:00 -0800582 char **pStrings;
Sanket Padawef220dc52017-01-02 23:46:00 -0800583 pStrings = (char **)calloc(countStrings, sizeof(char *));
584 if (pStrings == NULL) {
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800585 RLOGE("Memory allocation failed for request %s", requestToString(request));
Jack Yuffc06452017-02-13 11:21:00 -0800586 sendErrorResponse(pRI, RIL_E_NO_MEMORY);
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800587 return false;
Sanket Padawef220dc52017-01-02 23:46:00 -0800588 }
589 va_list ap;
590 va_start(ap, countStrings);
591 for (int i = 0; i < countStrings; i++) {
592 const char* str = va_arg(ap, const char *);
Ruthwar Kumar Ambeer7c373812017-03-23 17:38:56 +0530593 if (!copyHidlStringToRil(&pStrings[i], hidl_string(str), pRI, allowEmpty)) {
Sanket Padawef220dc52017-01-02 23:46:00 -0800594 va_end(ap);
Sanket Padawef220dc52017-01-02 23:46:00 -0800595 for (int j = 0; j < i; j++) {
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800596 memsetAndFreeStrings(1, pStrings[j]);
Sanket Padawef220dc52017-01-02 23:46:00 -0800597 }
598 free(pStrings);
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800599 return false;
Sanket Padawef220dc52017-01-02 23:46:00 -0800600 }
Sanket Padawef220dc52017-01-02 23:46:00 -0800601 }
602 va_end(ap);
603
Amit Mahajanb3a11bb2017-05-15 16:41:44 -0700604 CALL_ONREQUEST(request, pStrings, countStrings * sizeof(char *), pRI, slotId);
Sanket Padawef220dc52017-01-02 23:46:00 -0800605
606 if (pStrings != NULL) {
607 for (int i = 0 ; i < countStrings ; i++) {
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800608 memsetAndFreeStrings(1, pStrings[i]);
Sanket Padawef220dc52017-01-02 23:46:00 -0800609 }
610
611#ifdef MEMSET_FREED
612 memset(pStrings, 0, countStrings * sizeof(char *));
613#endif
614 free(pStrings);
615 }
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800616 return true;
617}
618
619bool dispatchStrings(int serial, int slotId, int request, const hidl_vec<hidl_string>& data) {
620 RequestInfo *pRI = android::addRequestToList(serial, slotId, request);
621 if (pRI == NULL) {
622 return false;
623 }
624
625 int countStrings = data.size();
626 char **pStrings;
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800627 pStrings = (char **)calloc(countStrings, sizeof(char *));
628 if (pStrings == NULL) {
629 RLOGE("Memory allocation failed for request %s", requestToString(request));
Jack Yuffc06452017-02-13 11:21:00 -0800630 sendErrorResponse(pRI, RIL_E_NO_MEMORY);
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800631 return false;
632 }
633
634 for (int i = 0; i < countStrings; i++) {
Jack Yuf68e0da2017-02-07 14:53:09 -0800635 if (!copyHidlStringToRil(&pStrings[i], data[i], pRI)) {
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800636 for (int j = 0; j < i; j++) {
637 memsetAndFreeStrings(1, pStrings[j]);
638 }
639 free(pStrings);
640 return false;
641 }
642 }
643
Amit Mahajanb3a11bb2017-05-15 16:41:44 -0700644 CALL_ONREQUEST(request, pStrings, countStrings * sizeof(char *), pRI, slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800645
646 if (pStrings != NULL) {
647 for (int i = 0 ; i < countStrings ; i++) {
648 memsetAndFreeStrings(1, pStrings[i]);
649 }
650
651#ifdef MEMSET_FREED
652 memset(pStrings, 0, countStrings * sizeof(char *));
653#endif
654 free(pStrings);
655 }
656 return true;
657}
658
659bool dispatchInts(int serial, int slotId, int request, int countInts, ...) {
660 RequestInfo *pRI = android::addRequestToList(serial, slotId, request);
661 if (pRI == NULL) {
662 return false;
663 }
664
Jack Yuffc06452017-02-13 11:21:00 -0800665 int *pInts = (int *)calloc(countInts, sizeof(int));
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800666
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800667 if (pInts == NULL) {
668 RLOGE("Memory allocation failed for request %s", requestToString(request));
Jack Yuffc06452017-02-13 11:21:00 -0800669 sendErrorResponse(pRI, RIL_E_NO_MEMORY);
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800670 return false;
671 }
672 va_list ap;
673 va_start(ap, countInts);
674 for (int i = 0; i < countInts; i++) {
675 pInts[i] = va_arg(ap, int);
676 }
677 va_end(ap);
678
Amit Mahajanb3a11bb2017-05-15 16:41:44 -0700679 CALL_ONREQUEST(request, pInts, countInts * sizeof(int), pRI, slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800680
681 if (pInts != NULL) {
682#ifdef MEMSET_FREED
683 memset(pInts, 0, countInts * sizeof(int));
684#endif
685 free(pInts);
686 }
687 return true;
688}
689
690bool dispatchCallForwardStatus(int serial, int slotId, int request,
691 const CallForwardInfo& callInfo) {
692 RequestInfo *pRI = android::addRequestToList(serial, slotId, request);
693 if (pRI == NULL) {
694 return false;
695 }
696
697 RIL_CallForwardInfo cf;
698 cf.status = (int) callInfo.status;
699 cf.reason = callInfo.reason;
700 cf.serviceClass = callInfo.serviceClass;
701 cf.toa = callInfo.toa;
702 cf.timeSeconds = callInfo.timeSeconds;
703
704 if (!copyHidlStringToRil(&cf.number, callInfo.number, pRI)) {
705 return false;
706 }
707
Amit Mahajanb3a11bb2017-05-15 16:41:44 -0700708 CALL_ONREQUEST(request, &cf, sizeof(cf), pRI, slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800709
710 memsetAndFreeStrings(1, cf.number);
711
712 return true;
713}
714
715bool dispatchRaw(int serial, int slotId, int request, const hidl_vec<uint8_t>& rawBytes) {
716 RequestInfo *pRI = android::addRequestToList(serial, slotId, request);
717 if (pRI == NULL) {
718 return false;
719 }
720
721 const uint8_t *uData = rawBytes.data();
722
Amit Mahajanb3a11bb2017-05-15 16:41:44 -0700723 CALL_ONREQUEST(request, (void *) uData, rawBytes.size(), pRI, slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800724
725 return true;
726}
727
728bool dispatchIccApdu(int serial, int slotId, int request, const SimApdu& message) {
729 RequestInfo *pRI = android::addRequestToList(serial, slotId, request);
730 if (pRI == NULL) {
731 return false;
732 }
733
Jack Yu8e732d42017-04-14 00:08:06 -0700734 RIL_SIM_APDU apdu = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800735
736 apdu.sessionid = message.sessionId;
737 apdu.cla = message.cla;
738 apdu.instruction = message.instruction;
739 apdu.p1 = message.p1;
740 apdu.p2 = message.p2;
741 apdu.p3 = message.p3;
742
743 if (!copyHidlStringToRil(&apdu.data, message.data, pRI)) {
744 return false;
745 }
746
Amit Mahajanb3a11bb2017-05-15 16:41:44 -0700747 CALL_ONREQUEST(request, &apdu, sizeof(apdu), pRI, slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800748
749 memsetAndFreeStrings(1, apdu.data);
750
751 return true;
Sanket Padawef220dc52017-01-02 23:46:00 -0800752}
753
Amit Mahajand423d192017-03-16 17:04:01 -0700754void checkReturnStatus(int32_t slotId, Return<void>& ret, bool isRadioService) {
Amit Mahajan17249842017-01-19 15:05:45 -0800755 if (ret.isOk() == false) {
Amit Mahajan439da362017-02-13 17:43:04 -0800756 RLOGE("checkReturnStatus: unable to call response/indication callback");
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800757 // Remote process hosting the callbacks must be dead. Reset the callback objects;
Amit Mahajan17249842017-01-19 15:05:45 -0800758 // there's no other recovery to be done here. When the client process is back up, it will
759 // call setResponseFunctions()
Amit Mahajan932e08e2017-01-24 05:45:02 -0800760
761 // Caller should already hold rdlock, release that first
762 // note the current counter to avoid overwriting updates made by another thread before
763 // write lock is acquired.
Amit Mahajand423d192017-03-16 17:04:01 -0700764 int counter = isRadioService ? mCounterRadio[slotId] : mCounterOemHook[slotId];
Amit Mahajan439da362017-02-13 17:43:04 -0800765 pthread_rwlock_t *radioServiceRwlockPtr = radio::getRadioServiceRwlock(slotId);
Amit Mahajan932e08e2017-01-24 05:45:02 -0800766 int ret = pthread_rwlock_unlock(radioServiceRwlockPtr);
767 assert(ret == 0);
768
769 // acquire wrlock
770 ret = pthread_rwlock_wrlock(radioServiceRwlockPtr);
771 assert(ret == 0);
772
773 // make sure the counter value has not changed
Amit Mahajand423d192017-03-16 17:04:01 -0700774 if (counter == (isRadioService ? mCounterRadio[slotId] : mCounterOemHook[slotId])) {
775 if (isRadioService) {
776 radioService[slotId]->mRadioResponse = NULL;
777 radioService[slotId]->mRadioIndication = NULL;
Amit Mahajanccb6d7f2017-06-09 10:44:54 -0700778 radioService[slotId]->mRadioResponseV1_1 = NULL;
779 radioService[slotId]->mRadioIndicationV1_1 = NULL;
Amit Mahajand423d192017-03-16 17:04:01 -0700780 } else {
781 oemHookService[slotId]->mOemHookResponse = NULL;
782 oemHookService[slotId]->mOemHookIndication = NULL;
783 }
784 isRadioService ? mCounterRadio[slotId]++ : mCounterOemHook[slotId]++;
Amit Mahajan932e08e2017-01-24 05:45:02 -0800785 } else {
Amit Mahajan439da362017-02-13 17:43:04 -0800786 RLOGE("checkReturnStatus: not resetting responseFunctions as they likely "
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800787 "got updated on another thread");
Amit Mahajan932e08e2017-01-24 05:45:02 -0800788 }
789
790 // release wrlock
791 ret = pthread_rwlock_unlock(radioServiceRwlockPtr);
792 assert(ret == 0);
793
794 // Reacquire rdlock
795 ret = pthread_rwlock_rdlock(radioServiceRwlockPtr);
796 assert(ret == 0);
Amit Mahajan17249842017-01-19 15:05:45 -0800797 }
798}
799
Amit Mahajan439da362017-02-13 17:43:04 -0800800void RadioImpl::checkReturnStatus(Return<void>& ret) {
Amit Mahajand423d192017-03-16 17:04:01 -0700801 ::checkReturnStatus(mSlotId, ret, true);
Amit Mahajan439da362017-02-13 17:43:04 -0800802}
803
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700804Return<void> RadioImpl::setResponseFunctions(
805 const ::android::sp<IRadioResponse>& radioResponseParam,
806 const ::android::sp<IRadioIndication>& radioIndicationParam) {
Amit Mahajan111ddca2017-03-03 12:05:13 -0800807 RLOGD("setResponseFunctions");
Amit Mahajan932e08e2017-01-24 05:45:02 -0800808
809 pthread_rwlock_t *radioServiceRwlockPtr = radio::getRadioServiceRwlock(mSlotId);
810 int ret = pthread_rwlock_wrlock(radioServiceRwlockPtr);
811 assert(ret == 0);
812
Sanket Padawef220dc52017-01-02 23:46:00 -0800813 mRadioResponse = radioResponseParam;
814 mRadioIndication = radioIndicationParam;
Amit Mahajanccb6d7f2017-06-09 10:44:54 -0700815 mRadioResponseV1_1 = V1_1::IRadioResponse::castFrom(mRadioResponse).withDefault(nullptr);
816 mRadioIndicationV1_1 = V1_1::IRadioIndication::castFrom(mRadioIndication).withDefault(nullptr);
817 if (mRadioResponseV1_1 == nullptr || mRadioIndicationV1_1 == nullptr) {
818 mRadioResponseV1_1 = nullptr;
819 mRadioIndicationV1_1 = nullptr;
820 }
821
Amit Mahajand423d192017-03-16 17:04:01 -0700822 mCounterRadio[mSlotId]++;
Amit Mahajan932e08e2017-01-24 05:45:02 -0800823
824 ret = pthread_rwlock_unlock(radioServiceRwlockPtr);
825 assert(ret == 0);
826
Amit Mahajan60482fd2017-03-14 16:39:27 -0700827 // client is connected. Send initial indications.
828 android::onNewCommandConnect((RIL_SOCKET_ID) mSlotId);
829
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800830 return Void();
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700831}
832
833Return<void> RadioImpl::getIccCardStatus(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -0700834#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -0800835 RLOGD("getIccCardStatus: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -0700836#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800837 dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_SIM_STATUS);
838 return Void();
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700839}
840
Sanket Padawef220dc52017-01-02 23:46:00 -0800841Return<void> RadioImpl::supplyIccPinForApp(int32_t serial, const hidl_string& pin,
842 const hidl_string& aid) {
Jayachandran C572f2f42017-03-25 14:30:13 -0700843#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -0800844 RLOGD("supplyIccPinForApp: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -0700845#endif
Ruthwar Kumar Ambeer7c373812017-03-23 17:38:56 +0530846 dispatchStrings(serial, mSlotId, RIL_REQUEST_ENTER_SIM_PIN, true,
Scott Randolphc7213312017-04-03 14:06:40 -0700847 2, pin.c_str(), aid.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800848 return Void();
Sanket Padawef220dc52017-01-02 23:46:00 -0800849}
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700850
Sanket Padawef220dc52017-01-02 23:46:00 -0800851Return<void> RadioImpl::supplyIccPukForApp(int32_t serial, const hidl_string& puk,
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800852 const hidl_string& pin, const hidl_string& aid) {
Jayachandran C572f2f42017-03-25 14:30:13 -0700853#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -0800854 RLOGD("supplyIccPukForApp: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -0700855#endif
Ruthwar Kumar Ambeer7c373812017-03-23 17:38:56 +0530856 dispatchStrings(serial, mSlotId, RIL_REQUEST_ENTER_SIM_PUK, true,
Scott Randolphc7213312017-04-03 14:06:40 -0700857 3, puk.c_str(), pin.c_str(), aid.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800858 return Void();
Sanket Padawef220dc52017-01-02 23:46:00 -0800859}
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700860
Sanket Padawef220dc52017-01-02 23:46:00 -0800861Return<void> RadioImpl::supplyIccPin2ForApp(int32_t serial, const hidl_string& pin2,
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800862 const hidl_string& aid) {
Jayachandran C572f2f42017-03-25 14:30:13 -0700863#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -0800864 RLOGD("supplyIccPin2ForApp: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -0700865#endif
Ruthwar Kumar Ambeer7c373812017-03-23 17:38:56 +0530866 dispatchStrings(serial, mSlotId, RIL_REQUEST_ENTER_SIM_PIN2, true,
Scott Randolphc7213312017-04-03 14:06:40 -0700867 2, pin2.c_str(), aid.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800868 return Void();
Sanket Padawef220dc52017-01-02 23:46:00 -0800869}
870
871Return<void> RadioImpl::supplyIccPuk2ForApp(int32_t serial, const hidl_string& puk2,
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800872 const hidl_string& pin2, const hidl_string& aid) {
Jayachandran C572f2f42017-03-25 14:30:13 -0700873#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -0800874 RLOGD("supplyIccPuk2ForApp: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -0700875#endif
Ruthwar Kumar Ambeer7c373812017-03-23 17:38:56 +0530876 dispatchStrings(serial, mSlotId, RIL_REQUEST_ENTER_SIM_PUK2, true,
Scott Randolphc7213312017-04-03 14:06:40 -0700877 3, puk2.c_str(), pin2.c_str(), aid.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800878 return Void();
Sanket Padawef220dc52017-01-02 23:46:00 -0800879}
880
881Return<void> RadioImpl::changeIccPinForApp(int32_t serial, const hidl_string& oldPin,
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800882 const hidl_string& newPin, const hidl_string& aid) {
Jayachandran C572f2f42017-03-25 14:30:13 -0700883#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -0800884 RLOGD("changeIccPinForApp: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -0700885#endif
Ruthwar Kumar Ambeer7c373812017-03-23 17:38:56 +0530886 dispatchStrings(serial, mSlotId, RIL_REQUEST_CHANGE_SIM_PIN, true,
Scott Randolphc7213312017-04-03 14:06:40 -0700887 3, oldPin.c_str(), newPin.c_str(), aid.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800888 return Void();
Sanket Padawef220dc52017-01-02 23:46:00 -0800889}
890
891Return<void> RadioImpl::changeIccPin2ForApp(int32_t serial, const hidl_string& oldPin2,
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800892 const hidl_string& newPin2, const hidl_string& aid) {
Jayachandran C572f2f42017-03-25 14:30:13 -0700893#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -0800894 RLOGD("changeIccPin2ForApp: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -0700895#endif
Ruthwar Kumar Ambeer7c373812017-03-23 17:38:56 +0530896 dispatchStrings(serial, mSlotId, RIL_REQUEST_CHANGE_SIM_PIN2, true,
Scott Randolphc7213312017-04-03 14:06:40 -0700897 3, oldPin2.c_str(), newPin2.c_str(), aid.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800898 return Void();
Sanket Padawef220dc52017-01-02 23:46:00 -0800899}
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700900
901Return<void> RadioImpl::supplyNetworkDepersonalization(int32_t serial,
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800902 const hidl_string& netPin) {
Jayachandran C572f2f42017-03-25 14:30:13 -0700903#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -0800904 RLOGD("supplyNetworkDepersonalization: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -0700905#endif
Ruthwar Kumar Ambeer7c373812017-03-23 17:38:56 +0530906 dispatchStrings(serial, mSlotId, RIL_REQUEST_ENTER_NETWORK_DEPERSONALIZATION, true,
Scott Randolphc7213312017-04-03 14:06:40 -0700907 1, netPin.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800908 return Void();
Sanket Padawef220dc52017-01-02 23:46:00 -0800909}
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700910
Sanket Padawef220dc52017-01-02 23:46:00 -0800911Return<void> RadioImpl::getCurrentCalls(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -0700912#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -0800913 RLOGD("getCurrentCalls: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -0700914#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800915 dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_CURRENT_CALLS);
916 return Void();
Sanket Padawef220dc52017-01-02 23:46:00 -0800917}
918
919Return<void> RadioImpl::dial(int32_t serial, const Dial& dialInfo) {
Jayachandran C572f2f42017-03-25 14:30:13 -0700920#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -0800921 RLOGD("dial: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -0700922#endif
Sanket Padawef220dc52017-01-02 23:46:00 -0800923 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_DIAL);
924 if (pRI == NULL) {
925 return Void();
926 }
Jack Yuf68e0da2017-02-07 14:53:09 -0800927 RIL_Dial dial = {};
928 RIL_UUS_Info uusInfo = {};
Sanket Padawef220dc52017-01-02 23:46:00 -0800929 int32_t sizeOfDial = sizeof(dial);
930
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800931 if (!copyHidlStringToRil(&dial.address, dialInfo.address, pRI)) {
Sanket Padawef220dc52017-01-02 23:46:00 -0800932 return Void();
933 }
Jack Yuf68e0da2017-02-07 14:53:09 -0800934 dial.clir = (int) dialInfo.clir;
Sanket Padawef220dc52017-01-02 23:46:00 -0800935
Sanket Padawef220dc52017-01-02 23:46:00 -0800936 if (dialInfo.uusInfo.size() != 0) {
Sanket Padawef220dc52017-01-02 23:46:00 -0800937 uusInfo.uusType = (RIL_UUS_Type) dialInfo.uusInfo[0].uusType;
938 uusInfo.uusDcs = (RIL_UUS_DCS) dialInfo.uusInfo[0].uusDcs;
939
940 if (dialInfo.uusInfo[0].uusData.size() == 0) {
941 uusInfo.uusData = NULL;
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800942 uusInfo.uusLength = 0;
Sanket Padawef220dc52017-01-02 23:46:00 -0800943 } else {
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800944 if (!copyHidlStringToRil(&uusInfo.uusData, dialInfo.uusInfo[0].uusData, pRI)) {
945 memsetAndFreeStrings(1, dial.address);
Sanket Padawef220dc52017-01-02 23:46:00 -0800946 return Void();
947 }
Jack Yuf68e0da2017-02-07 14:53:09 -0800948 uusInfo.uusLength = dialInfo.uusInfo[0].uusData.size();
Sanket Padawef220dc52017-01-02 23:46:00 -0800949 }
950
Sanket Padawef220dc52017-01-02 23:46:00 -0800951 dial.uusInfo = &uusInfo;
952 }
953
Amit Mahajanb3a11bb2017-05-15 16:41:44 -0700954 CALL_ONREQUEST(RIL_REQUEST_DIAL, &dial, sizeOfDial, pRI, mSlotId);
Sanket Padawef220dc52017-01-02 23:46:00 -0800955
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800956 memsetAndFreeStrings(2, dial.address, uusInfo.uusData);
Sanket Padawef220dc52017-01-02 23:46:00 -0800957
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800958 return Void();
Sanket Padawef220dc52017-01-02 23:46:00 -0800959}
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700960
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800961Return<void> RadioImpl::getImsiForApp(int32_t serial, const hidl_string& aid) {
Jayachandran C572f2f42017-03-25 14:30:13 -0700962#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -0800963 RLOGD("getImsiForApp: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -0700964#endif
Ruthwar Kumar Ambeer7c373812017-03-23 17:38:56 +0530965 dispatchStrings(serial, mSlotId, RIL_REQUEST_GET_IMSI, false,
Scott Randolphc7213312017-04-03 14:06:40 -0700966 1, aid.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800967 return Void();
968}
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700969
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800970Return<void> RadioImpl::hangup(int32_t serial, int32_t gsmIndex) {
Jayachandran C572f2f42017-03-25 14:30:13 -0700971#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -0800972 RLOGD("hangup: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -0700973#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800974 dispatchInts(serial, mSlotId, RIL_REQUEST_HANGUP, 1, gsmIndex);
975 return Void();
976}
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700977
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800978Return<void> RadioImpl::hangupWaitingOrBackground(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -0700979#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -0800980 RLOGD("hangupWaitingOrBackground: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -0700981#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800982 dispatchVoid(serial, mSlotId, RIL_REQUEST_HANGUP_WAITING_OR_BACKGROUND);
983 return Void();
984}
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700985
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800986Return<void> RadioImpl::hangupForegroundResumeBackground(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -0700987#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -0800988 RLOGD("hangupForegroundResumeBackground: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -0700989#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800990 dispatchVoid(serial, mSlotId, RIL_REQUEST_HANGUP_FOREGROUND_RESUME_BACKGROUND);
991 return Void();
992}
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700993
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800994Return<void> RadioImpl::switchWaitingOrHoldingAndActive(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -0700995#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -0800996 RLOGD("switchWaitingOrHoldingAndActive: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -0700997#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800998 dispatchVoid(serial, mSlotId, RIL_REQUEST_SWITCH_WAITING_OR_HOLDING_AND_ACTIVE);
999 return Void();
1000}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001001
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001002Return<void> RadioImpl::conference(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001003#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001004 RLOGD("conference: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001005#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001006 dispatchVoid(serial, mSlotId, RIL_REQUEST_CONFERENCE);
1007 return Void();
1008}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001009
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001010Return<void> RadioImpl::rejectCall(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001011#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001012 RLOGD("rejectCall: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001013#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001014 dispatchVoid(serial, mSlotId, RIL_REQUEST_UDUB);
1015 return Void();
1016}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001017
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001018Return<void> RadioImpl::getLastCallFailCause(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001019#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001020 RLOGD("getLastCallFailCause: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001021#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001022 dispatchVoid(serial, mSlotId, RIL_REQUEST_LAST_CALL_FAIL_CAUSE);
1023 return Void();
1024}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001025
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001026Return<void> RadioImpl::getSignalStrength(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001027#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001028 RLOGD("getSignalStrength: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001029#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001030 dispatchVoid(serial, mSlotId, RIL_REQUEST_SIGNAL_STRENGTH);
1031 return Void();
1032}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001033
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001034Return<void> RadioImpl::getVoiceRegistrationState(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001035#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001036 RLOGD("getVoiceRegistrationState: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001037#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001038 dispatchVoid(serial, mSlotId, RIL_REQUEST_VOICE_REGISTRATION_STATE);
1039 return Void();
1040}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001041
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001042Return<void> RadioImpl::getDataRegistrationState(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001043#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001044 RLOGD("getDataRegistrationState: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001045#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001046 dispatchVoid(serial, mSlotId, RIL_REQUEST_DATA_REGISTRATION_STATE);
1047 return Void();
1048}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001049
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001050Return<void> RadioImpl::getOperator(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001051#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001052 RLOGD("getOperator: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001053#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001054 dispatchVoid(serial, mSlotId, RIL_REQUEST_OPERATOR);
1055 return Void();
1056}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001057
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001058Return<void> RadioImpl::setRadioPower(int32_t serial, bool on) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08001059 RLOGD("setRadioPower: serial %d on %d", serial, on);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001060 dispatchInts(serial, mSlotId, RIL_REQUEST_RADIO_POWER, 1, BOOL_TO_INT(on));
1061 return Void();
1062}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001063
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001064Return<void> RadioImpl::sendDtmf(int32_t serial, const hidl_string& s) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001065#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001066 RLOGD("sendDtmf: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001067#endif
Scott Randolphc7213312017-04-03 14:06:40 -07001068 dispatchString(serial, mSlotId, RIL_REQUEST_DTMF, s.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001069 return Void();
1070}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001071
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001072Return<void> RadioImpl::sendSms(int32_t serial, const GsmSmsMessage& message) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001073#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001074 RLOGD("sendSms: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001075#endif
Ruthwar Kumar Ambeer7c373812017-03-23 17:38:56 +05301076 dispatchStrings(serial, mSlotId, RIL_REQUEST_SEND_SMS, false,
Scott Randolphc7213312017-04-03 14:06:40 -07001077 2, message.smscPdu.c_str(), message.pdu.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001078 return Void();
1079}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001080
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001081Return<void> RadioImpl::sendSMSExpectMore(int32_t serial, const GsmSmsMessage& message) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001082#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001083 RLOGD("sendSMSExpectMore: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001084#endif
Ruthwar Kumar Ambeer7c373812017-03-23 17:38:56 +05301085 dispatchStrings(serial, mSlotId, RIL_REQUEST_SEND_SMS_EXPECT_MORE, false,
Scott Randolphc7213312017-04-03 14:06:40 -07001086 2, message.smscPdu.c_str(), message.pdu.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001087 return Void();
1088}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001089
Jack Yuc13645e2017-04-13 20:55:03 -07001090static bool convertMvnoTypeToString(MvnoType type, char *&str) {
Jack Yuffc06452017-02-13 11:21:00 -08001091 switch (type) {
Jack Yuc13645e2017-04-13 20:55:03 -07001092 case MvnoType::IMSI:
1093 str = (char *)"imsi";
1094 return true;
1095 case MvnoType::GID:
1096 str = (char *)"gid";
1097 return true;
1098 case MvnoType::SPN:
1099 str = (char *)"spn";
1100 return true;
1101 case MvnoType::NONE:
1102 str = (char *)"";
1103 return true;
Jack Yuffc06452017-02-13 11:21:00 -08001104 }
Jack Yuc13645e2017-04-13 20:55:03 -07001105 return false;
Jack Yuffc06452017-02-13 11:21:00 -08001106}
1107
1108Return<void> RadioImpl::setupDataCall(int32_t serial, RadioTechnology radioTechnology,
1109 const DataProfileInfo& dataProfileInfo, bool modemCognitive,
1110 bool roamingAllowed, bool isRoaming) {
1111
Jayachandran C572f2f42017-03-25 14:30:13 -07001112#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001113 RLOGD("setupDataCall: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001114#endif
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001115
Jack Yuffc06452017-02-13 11:21:00 -08001116 if (s_vendorFunctions->version >= 4 && s_vendorFunctions->version <= 14) {
1117 const hidl_string &protocol =
1118 (isRoaming ? dataProfileInfo.roamingProtocol : dataProfileInfo.protocol);
Ruthwar Kumar Ambeer7c373812017-03-23 17:38:56 +05301119 dispatchStrings(serial, mSlotId, RIL_REQUEST_SETUP_DATA_CALL, true, 7,
Jack Yuffc06452017-02-13 11:21:00 -08001120 std::to_string((int) radioTechnology + 2).c_str(),
1121 std::to_string((int) dataProfileInfo.profileId).c_str(),
1122 dataProfileInfo.apn.c_str(),
1123 dataProfileInfo.user.c_str(),
1124 dataProfileInfo.password.c_str(),
1125 std::to_string((int) dataProfileInfo.authType).c_str(),
1126 protocol.c_str());
1127 } else if (s_vendorFunctions->version >= 15) {
Jack Yuc13645e2017-04-13 20:55:03 -07001128 char *mvnoTypeStr = NULL;
1129 if (!convertMvnoTypeToString(dataProfileInfo.mvnoType, mvnoTypeStr)) {
Jack Yuffc06452017-02-13 11:21:00 -08001130 RequestInfo *pRI = android::addRequestToList(serial, mSlotId,
1131 RIL_REQUEST_SETUP_DATA_CALL);
1132 if (pRI != NULL) {
1133 sendErrorResponse(pRI, RIL_E_INVALID_ARGUMENTS);
1134 }
1135 return Void();
1136 }
Ruthwar Kumar Ambeer7c373812017-03-23 17:38:56 +05301137 dispatchStrings(serial, mSlotId, RIL_REQUEST_SETUP_DATA_CALL, true, 15,
Jack Yuffc06452017-02-13 11:21:00 -08001138 std::to_string((int) radioTechnology + 2).c_str(),
1139 std::to_string((int) dataProfileInfo.profileId).c_str(),
1140 dataProfileInfo.apn.c_str(),
1141 dataProfileInfo.user.c_str(),
1142 dataProfileInfo.password.c_str(),
1143 std::to_string((int) dataProfileInfo.authType).c_str(),
1144 dataProfileInfo.protocol.c_str(),
1145 dataProfileInfo.roamingProtocol.c_str(),
1146 std::to_string(dataProfileInfo.supportedApnTypesBitmap).c_str(),
1147 std::to_string(dataProfileInfo.bearerBitmap).c_str(),
Jack Yuc13645e2017-04-13 20:55:03 -07001148 modemCognitive ? "1" : "0",
Jack Yuffc06452017-02-13 11:21:00 -08001149 std::to_string(dataProfileInfo.mtu).c_str(),
1150 mvnoTypeStr,
1151 dataProfileInfo.mvnoMatchData.c_str(),
Jack Yuc13645e2017-04-13 20:55:03 -07001152 roamingAllowed ? "1" : "0");
Jack Yuffc06452017-02-13 11:21:00 -08001153 } else {
1154 RLOGE("Unsupported RIL version %d, min version expected 4", s_vendorFunctions->version);
1155 RequestInfo *pRI = android::addRequestToList(serial, mSlotId,
1156 RIL_REQUEST_SETUP_DATA_CALL);
1157 if (pRI != NULL) {
1158 sendErrorResponse(pRI, RIL_E_REQUEST_NOT_SUPPORTED);
1159 }
1160 }
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001161 return Void();
1162}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001163
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001164Return<void> RadioImpl::iccIOForApp(int32_t serial, const IccIo& iccIo) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001165#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001166 RLOGD("iccIOForApp: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001167#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001168 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_SIM_IO);
1169 if (pRI == NULL) {
1170 return Void();
1171 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001172
Jack Yu8e732d42017-04-14 00:08:06 -07001173 RIL_SIM_IO_v6 rilIccIo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001174 rilIccIo.command = iccIo.command;
1175 rilIccIo.fileid = iccIo.fileId;
1176 if (!copyHidlStringToRil(&rilIccIo.path, iccIo.path, pRI)) {
1177 return Void();
1178 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001179
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001180 rilIccIo.p1 = iccIo.p1;
1181 rilIccIo.p2 = iccIo.p2;
1182 rilIccIo.p3 = iccIo.p3;
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001183
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001184 if (!copyHidlStringToRil(&rilIccIo.data, iccIo.data, pRI)) {
1185 memsetAndFreeStrings(1, rilIccIo.path);
1186 return Void();
1187 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001188
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001189 if (!copyHidlStringToRil(&rilIccIo.pin2, iccIo.pin2, pRI)) {
1190 memsetAndFreeStrings(2, rilIccIo.path, rilIccIo.data);
1191 return Void();
1192 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001193
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001194 if (!copyHidlStringToRil(&rilIccIo.aidPtr, iccIo.aid, pRI)) {
1195 memsetAndFreeStrings(3, rilIccIo.path, rilIccIo.data, rilIccIo.pin2);
1196 return Void();
1197 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001198
Amit Mahajanb3a11bb2017-05-15 16:41:44 -07001199 CALL_ONREQUEST(RIL_REQUEST_SIM_IO, &rilIccIo, sizeof(rilIccIo), pRI, mSlotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001200
1201 memsetAndFreeStrings(4, rilIccIo.path, rilIccIo.data, rilIccIo.pin2, rilIccIo.aidPtr);
1202
1203 return Void();
1204}
1205
1206Return<void> RadioImpl::sendUssd(int32_t serial, const hidl_string& ussd) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001207#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001208 RLOGD("sendUssd: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001209#endif
Scott Randolphc7213312017-04-03 14:06:40 -07001210 dispatchString(serial, mSlotId, RIL_REQUEST_SEND_USSD, ussd.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001211 return Void();
1212}
1213
1214Return<void> RadioImpl::cancelPendingUssd(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001215#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001216 RLOGD("cancelPendingUssd: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001217#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001218 dispatchVoid(serial, mSlotId, RIL_REQUEST_CANCEL_USSD);
1219 return Void();
1220}
1221
1222Return<void> RadioImpl::getClir(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001223#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001224 RLOGD("getClir: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001225#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001226 dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_CLIR);
1227 return Void();
1228}
1229
1230Return<void> RadioImpl::setClir(int32_t serial, int32_t status) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001231#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001232 RLOGD("setClir: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001233#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001234 dispatchInts(serial, mSlotId, RIL_REQUEST_SET_CLIR, 1, status);
1235 return Void();
1236}
1237
1238Return<void> RadioImpl::getCallForwardStatus(int32_t serial, const CallForwardInfo& callInfo) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001239#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001240 RLOGD("getCallForwardStatus: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001241#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001242 dispatchCallForwardStatus(serial, mSlotId, RIL_REQUEST_QUERY_CALL_FORWARD_STATUS,
1243 callInfo);
1244 return Void();
1245}
1246
1247Return<void> RadioImpl::setCallForward(int32_t serial, const CallForwardInfo& callInfo) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001248#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001249 RLOGD("setCallForward: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001250#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001251 dispatchCallForwardStatus(serial, mSlotId, RIL_REQUEST_SET_CALL_FORWARD,
1252 callInfo);
1253 return Void();
1254}
1255
1256Return<void> RadioImpl::getCallWaiting(int32_t serial, int32_t serviceClass) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001257#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001258 RLOGD("getCallWaiting: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001259#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001260 dispatchInts(serial, mSlotId, RIL_REQUEST_QUERY_CALL_WAITING, 1, serviceClass);
1261 return Void();
1262}
1263
1264Return<void> RadioImpl::setCallWaiting(int32_t serial, bool enable, int32_t serviceClass) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001265#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001266 RLOGD("setCallWaiting: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001267#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001268 dispatchInts(serial, mSlotId, RIL_REQUEST_SET_CALL_WAITING, 2, BOOL_TO_INT(enable),
1269 serviceClass);
1270 return Void();
1271}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001272
1273Return<void> RadioImpl::acknowledgeLastIncomingGsmSms(int32_t serial,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001274 bool success, SmsAcknowledgeFailCause cause) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001275#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001276 RLOGD("acknowledgeLastIncomingGsmSms: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001277#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001278 dispatchInts(serial, mSlotId, RIL_REQUEST_SMS_ACKNOWLEDGE, 2, BOOL_TO_INT(success),
1279 cause);
1280 return Void();
1281}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001282
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001283Return<void> RadioImpl::acceptCall(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001284#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001285 RLOGD("acceptCall: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001286#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001287 dispatchVoid(serial, mSlotId, RIL_REQUEST_ANSWER);
1288 return Void();
1289}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001290
1291Return<void> RadioImpl::deactivateDataCall(int32_t serial,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001292 int32_t cid, bool reasonRadioShutDown) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001293#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001294 RLOGD("deactivateDataCall: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001295#endif
Ruthwar Kumar Ambeer7c373812017-03-23 17:38:56 +05301296 dispatchStrings(serial, mSlotId, RIL_REQUEST_DEACTIVATE_DATA_CALL, false,
Scott Randolphc7213312017-04-03 14:06:40 -07001297 2, (std::to_string(cid)).c_str(), reasonRadioShutDown ? "1" : "0");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001298 return Void();
1299}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001300
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001301Return<void> RadioImpl::getFacilityLockForApp(int32_t serial, const hidl_string& facility,
1302 const hidl_string& password, int32_t serviceClass,
1303 const hidl_string& appId) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001304#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001305 RLOGD("getFacilityLockForApp: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001306#endif
Ruthwar Kumar Ambeer7c373812017-03-23 17:38:56 +05301307 dispatchStrings(serial, mSlotId, RIL_REQUEST_QUERY_FACILITY_LOCK, true,
Scott Randolphc7213312017-04-03 14:06:40 -07001308 4, facility.c_str(), password.c_str(),
1309 (std::to_string(serviceClass)).c_str(), appId.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001310 return Void();
1311}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001312
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001313Return<void> RadioImpl::setFacilityLockForApp(int32_t serial, const hidl_string& facility,
1314 bool lockState, const hidl_string& password,
1315 int32_t serviceClass, const hidl_string& appId) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001316#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001317 RLOGD("setFacilityLockForApp: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001318#endif
Ruthwar Kumar Ambeer7c373812017-03-23 17:38:56 +05301319 dispatchStrings(serial, mSlotId, RIL_REQUEST_SET_FACILITY_LOCK, true,
Scott Randolphc7213312017-04-03 14:06:40 -07001320 5, facility.c_str(), lockState ? "1" : "0", password.c_str(),
1321 (std::to_string(serviceClass)).c_str(), appId.c_str() );
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001322 return Void();
1323}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001324
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001325Return<void> RadioImpl::setBarringPassword(int32_t serial, const hidl_string& facility,
1326 const hidl_string& oldPassword,
1327 const hidl_string& newPassword) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001328#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001329 RLOGD("setBarringPassword: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001330#endif
Ruthwar Kumar Ambeer7c373812017-03-23 17:38:56 +05301331 dispatchStrings(serial, mSlotId, RIL_REQUEST_CHANGE_BARRING_PASSWORD, true,
Sanket Padawe75e42a52017-05-24 10:03:55 -07001332 3, facility.c_str(), oldPassword.c_str(), newPassword.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001333 return Void();
1334}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001335
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001336Return<void> RadioImpl::getNetworkSelectionMode(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001337#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001338 RLOGD("getNetworkSelectionMode: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001339#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001340 dispatchVoid(serial, mSlotId, RIL_REQUEST_QUERY_NETWORK_SELECTION_MODE);
1341 return Void();
1342}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001343
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001344Return<void> RadioImpl::setNetworkSelectionModeAutomatic(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001345#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001346 RLOGD("setNetworkSelectionModeAutomatic: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001347#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001348 dispatchVoid(serial, mSlotId, RIL_REQUEST_SET_NETWORK_SELECTION_AUTOMATIC);
1349 return Void();
1350}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001351
1352Return<void> RadioImpl::setNetworkSelectionModeManual(int32_t serial,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001353 const hidl_string& operatorNumeric) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001354#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001355 RLOGD("setNetworkSelectionModeManual: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001356#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001357 dispatchString(serial, mSlotId, RIL_REQUEST_SET_NETWORK_SELECTION_MANUAL,
Scott Randolphc7213312017-04-03 14:06:40 -07001358 operatorNumeric.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001359 return Void();
1360}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001361
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001362Return<void> RadioImpl::getAvailableNetworks(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001363#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001364 RLOGD("getAvailableNetworks: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001365#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001366 dispatchVoid(serial, mSlotId, RIL_REQUEST_QUERY_AVAILABLE_NETWORKS);
1367 return Void();
1368}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001369
Nathan Harold6a8809d2017-07-07 19:28:58 -07001370Return<void> RadioImpl::startNetworkScan(int32_t serial, const V1_1::NetworkScanRequest& request) {
yinxu3abe7c72017-05-03 15:15:19 -07001371#if VDBG
1372 RLOGD("startNetworkScan: serial %d", serial);
1373#endif
yinxu8688abd2017-05-22 11:26:45 -07001374
1375 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_START_NETWORK_SCAN);
1376 if (pRI == NULL) {
1377 return Void();
1378 }
1379
pitchaiah57b203f2020-10-13 09:25:02 +02001380#ifdef NETWORK_SCAN_NOT_SUPPORTED /* Qualcomm ril doesn't support RIL_REQUEST_START_NETWORK_SCAN */
1381 RLOGD("RIL_REQUEST_START_NETWORK_SCAN not supported");
1382 sendErrorResponse(pRI, RIL_E_REQUEST_NOT_SUPPORTED);
1383 return Void();
1384#else
1385
yinxu8688abd2017-05-22 11:26:45 -07001386 if (request.specifiers.size() > MAX_RADIO_ACCESS_NETWORKS) {
1387 sendErrorResponse(pRI, RIL_E_INVALID_ARGUMENTS);
1388 return Void();
1389 }
1390
1391 RIL_NetworkScanRequest scan_request = {};
1392
1393 scan_request.type = (RIL_ScanType) request.type;
1394 scan_request.interval = request.interval;
1395 scan_request.specifiers_length = request.specifiers.size();
1396 for (size_t i = 0; i < request.specifiers.size(); ++i) {
1397 if (request.specifiers[i].geranBands.size() > MAX_BANDS ||
1398 request.specifiers[i].utranBands.size() > MAX_BANDS ||
1399 request.specifiers[i].eutranBands.size() > MAX_BANDS ||
1400 request.specifiers[i].channels.size() > MAX_CHANNELS) {
1401 sendErrorResponse(pRI, RIL_E_INVALID_ARGUMENTS);
1402 return Void();
1403 }
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07001404 const V1_1::RadioAccessSpecifier& ras_from =
yinxu8688abd2017-05-22 11:26:45 -07001405 request.specifiers[i];
1406 RIL_RadioAccessSpecifier& ras_to = scan_request.specifiers[i];
1407
1408 ras_to.radio_access_network = (RIL_RadioAccessNetworks) ras_from.radioAccessNetwork;
1409 ras_to.channels_length = ras_from.channels.size();
1410
1411 std::copy(ras_from.channels.begin(), ras_from.channels.end(), ras_to.channels);
1412 const std::vector<uint32_t> * bands = nullptr;
1413 switch (request.specifiers[i].radioAccessNetwork) {
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07001414 case V1_1::RadioAccessNetworks::GERAN:
yinxu8688abd2017-05-22 11:26:45 -07001415 ras_to.bands_length = ras_from.geranBands.size();
1416 bands = (std::vector<uint32_t> *) &ras_from.geranBands;
1417 break;
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07001418 case V1_1::RadioAccessNetworks::UTRAN:
yinxu8688abd2017-05-22 11:26:45 -07001419 ras_to.bands_length = ras_from.utranBands.size();
1420 bands = (std::vector<uint32_t> *) &ras_from.utranBands;
1421 break;
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07001422 case V1_1::RadioAccessNetworks::EUTRAN:
yinxu8688abd2017-05-22 11:26:45 -07001423 ras_to.bands_length = ras_from.eutranBands.size();
1424 bands = (std::vector<uint32_t> *) &ras_from.eutranBands;
1425 break;
1426 default:
1427 sendErrorResponse(pRI, RIL_E_INVALID_ARGUMENTS);
1428 return Void();
1429 }
1430 // safe to copy to geran_bands because it's a union member
yinxu9c7ad932017-06-22 17:10:59 -07001431 for (size_t idx = 0; idx < ras_to.bands_length; ++idx) {
1432 ras_to.bands.geran_bands[idx] = (RIL_GeranBands) (*bands)[idx];
1433 }
yinxu8688abd2017-05-22 11:26:45 -07001434 }
1435
Mathieu Chartierf65b2c92017-06-05 13:59:25 -07001436 CALL_ONREQUEST(RIL_REQUEST_START_NETWORK_SCAN, &scan_request, sizeof(scan_request), pRI,
1437 mSlotId);
yinxu8688abd2017-05-22 11:26:45 -07001438
yinxu3abe7c72017-05-03 15:15:19 -07001439 return Void();
pitchaiah57b203f2020-10-13 09:25:02 +02001440#endif
yinxu3abe7c72017-05-03 15:15:19 -07001441}
1442
1443Return<void> RadioImpl::stopNetworkScan(int32_t serial) {
1444#if VDBG
1445 RLOGD("stopNetworkScan: serial %d", serial);
1446#endif
yinxu3abe7c72017-05-03 15:15:19 -07001447 dispatchVoid(serial, mSlotId, RIL_REQUEST_STOP_NETWORK_SCAN);
1448 return Void();
1449}
1450
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001451Return<void> RadioImpl::startDtmf(int32_t serial, const hidl_string& s) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001452#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001453 RLOGD("startDtmf: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001454#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001455 dispatchString(serial, mSlotId, RIL_REQUEST_DTMF_START,
Scott Randolphc7213312017-04-03 14:06:40 -07001456 s.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001457 return Void();
1458}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001459
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001460Return<void> RadioImpl::stopDtmf(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001461#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001462 RLOGD("stopDtmf: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001463#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001464 dispatchVoid(serial, mSlotId, RIL_REQUEST_DTMF_STOP);
1465 return Void();
1466}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001467
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001468Return<void> RadioImpl::getBasebandVersion(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001469#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001470 RLOGD("getBasebandVersion: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001471#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001472 dispatchVoid(serial, mSlotId, RIL_REQUEST_BASEBAND_VERSION);
1473 return Void();
1474}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001475
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001476Return<void> RadioImpl::separateConnection(int32_t serial, int32_t gsmIndex) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001477#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001478 RLOGD("separateConnection: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001479#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001480 dispatchInts(serial, mSlotId, RIL_REQUEST_SEPARATE_CONNECTION, 1, gsmIndex);
1481 return Void();
1482}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001483
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001484Return<void> RadioImpl::setMute(int32_t serial, bool enable) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001485#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001486 RLOGD("setMute: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001487#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001488 dispatchInts(serial, mSlotId, RIL_REQUEST_SET_MUTE, 1, BOOL_TO_INT(enable));
1489 return Void();
1490}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001491
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001492Return<void> RadioImpl::getMute(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001493#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001494 RLOGD("getMute: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001495#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001496 dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_MUTE);
1497 return Void();
1498}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001499
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001500Return<void> RadioImpl::getClip(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001501#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001502 RLOGD("getClip: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001503#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001504 dispatchVoid(serial, mSlotId, RIL_REQUEST_QUERY_CLIP);
1505 return Void();
1506}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001507
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001508Return<void> RadioImpl::getDataCallList(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001509#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001510 RLOGD("getDataCallList: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001511#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001512 dispatchVoid(serial, mSlotId, RIL_REQUEST_DATA_CALL_LIST);
1513 return Void();
1514}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001515
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001516Return<void> RadioImpl::setSuppServiceNotifications(int32_t serial, bool enable) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001517#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001518 RLOGD("setSuppServiceNotifications: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001519#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001520 dispatchInts(serial, mSlotId, RIL_REQUEST_SET_SUPP_SVC_NOTIFICATION, 1,
1521 BOOL_TO_INT(enable));
1522 return Void();
1523}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001524
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001525Return<void> RadioImpl::writeSmsToSim(int32_t serial, const SmsWriteArgs& smsWriteArgs) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001526#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001527 RLOGD("writeSmsToSim: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001528#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001529 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_WRITE_SMS_TO_SIM);
1530 if (pRI == NULL) {
1531 return Void();
1532 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001533
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001534 RIL_SMS_WriteArgs args;
1535 args.status = (int) smsWriteArgs.status;
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001536
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001537 if (!copyHidlStringToRil(&args.pdu, smsWriteArgs.pdu, pRI)) {
1538 return Void();
1539 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001540
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001541 if (!copyHidlStringToRil(&args.smsc, smsWriteArgs.smsc, pRI)) {
1542 memsetAndFreeStrings(1, args.pdu);
1543 return Void();
1544 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001545
Amit Mahajanb3a11bb2017-05-15 16:41:44 -07001546 CALL_ONREQUEST(RIL_REQUEST_WRITE_SMS_TO_SIM, &args, sizeof(args), pRI, mSlotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001547
1548 memsetAndFreeStrings(2, args.smsc, args.pdu);
1549
1550 return Void();
1551}
1552
1553Return<void> RadioImpl::deleteSmsOnSim(int32_t serial, int32_t index) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001554#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001555 RLOGD("deleteSmsOnSim: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001556#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001557 dispatchInts(serial, mSlotId, RIL_REQUEST_DELETE_SMS_ON_SIM, 1, index);
1558 return Void();
1559}
1560
1561Return<void> RadioImpl::setBandMode(int32_t serial, RadioBandMode mode) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001562#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001563 RLOGD("setBandMode: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001564#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001565 dispatchInts(serial, mSlotId, RIL_REQUEST_SET_BAND_MODE, 1, mode);
1566 return Void();
1567}
1568
1569Return<void> RadioImpl::getAvailableBandModes(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001570#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001571 RLOGD("getAvailableBandModes: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001572#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001573 dispatchVoid(serial, mSlotId, RIL_REQUEST_QUERY_AVAILABLE_BAND_MODE);
1574 return Void();
1575}
1576
1577Return<void> RadioImpl::sendEnvelope(int32_t serial, const hidl_string& command) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001578#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001579 RLOGD("sendEnvelope: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001580#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001581 dispatchString(serial, mSlotId, RIL_REQUEST_STK_SEND_ENVELOPE_COMMAND,
Scott Randolphc7213312017-04-03 14:06:40 -07001582 command.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001583 return Void();
1584}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001585
1586Return<void> RadioImpl::sendTerminalResponseToSim(int32_t serial,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001587 const hidl_string& commandResponse) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001588#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001589 RLOGD("sendTerminalResponseToSim: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001590#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001591 dispatchString(serial, mSlotId, RIL_REQUEST_STK_SEND_TERMINAL_RESPONSE,
Scott Randolphc7213312017-04-03 14:06:40 -07001592 commandResponse.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001593 return Void();
1594}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001595
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001596Return<void> RadioImpl::handleStkCallSetupRequestFromSim(int32_t serial, bool accept) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001597#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001598 RLOGD("handleStkCallSetupRequestFromSim: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001599#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001600 dispatchInts(serial, mSlotId, RIL_REQUEST_STK_HANDLE_CALL_SETUP_REQUESTED_FROM_SIM,
1601 1, BOOL_TO_INT(accept));
1602 return Void();
1603}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001604
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001605Return<void> RadioImpl::explicitCallTransfer(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001606#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001607 RLOGD("explicitCallTransfer: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001608#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001609 dispatchVoid(serial, mSlotId, RIL_REQUEST_EXPLICIT_CALL_TRANSFER);
1610 return Void();
1611}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001612
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001613Return<void> RadioImpl::setPreferredNetworkType(int32_t serial, PreferredNetworkType nwType) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001614#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001615 RLOGD("setPreferredNetworkType: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001616#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001617 dispatchInts(serial, mSlotId, RIL_REQUEST_SET_PREFERRED_NETWORK_TYPE, 1, nwType);
1618 return Void();
1619}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001620
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001621Return<void> RadioImpl::getPreferredNetworkType(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001622#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001623 RLOGD("getPreferredNetworkType: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001624#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001625 dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_PREFERRED_NETWORK_TYPE);
1626 return Void();
1627}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001628
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001629Return<void> RadioImpl::getNeighboringCids(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001630#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001631 RLOGD("getNeighboringCids: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001632#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001633 dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_NEIGHBORING_CELL_IDS);
1634 return Void();
1635}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001636
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001637Return<void> RadioImpl::setLocationUpdates(int32_t serial, bool enable) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001638#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001639 RLOGD("setLocationUpdates: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001640#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001641 dispatchInts(serial, mSlotId, RIL_REQUEST_SET_LOCATION_UPDATES, 1, BOOL_TO_INT(enable));
1642 return Void();
1643}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001644
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001645Return<void> RadioImpl::setCdmaSubscriptionSource(int32_t serial, CdmaSubscriptionSource cdmaSub) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001646#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001647 RLOGD("setCdmaSubscriptionSource: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001648#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001649 dispatchInts(serial, mSlotId, RIL_REQUEST_CDMA_SET_SUBSCRIPTION_SOURCE, 1, cdmaSub);
1650 return Void();
1651}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001652
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001653Return<void> RadioImpl::setCdmaRoamingPreference(int32_t serial, CdmaRoamingType type) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001654#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001655 RLOGD("setCdmaRoamingPreference: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001656#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001657 dispatchInts(serial, mSlotId, RIL_REQUEST_CDMA_SET_ROAMING_PREFERENCE, 1, type);
1658 return Void();
1659}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001660
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001661Return<void> RadioImpl::getCdmaRoamingPreference(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001662#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001663 RLOGD("getCdmaRoamingPreference: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001664#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001665 dispatchVoid(serial, mSlotId, RIL_REQUEST_CDMA_QUERY_ROAMING_PREFERENCE);
1666 return Void();
1667}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001668
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001669Return<void> RadioImpl::setTTYMode(int32_t serial, TtyMode mode) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001670#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001671 RLOGD("setTTYMode: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001672#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001673 dispatchInts(serial, mSlotId, RIL_REQUEST_SET_TTY_MODE, 1, mode);
1674 return Void();
1675}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001676
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001677Return<void> RadioImpl::getTTYMode(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001678#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001679 RLOGD("getTTYMode: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001680#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001681 dispatchVoid(serial, mSlotId, RIL_REQUEST_QUERY_TTY_MODE);
1682 return Void();
1683}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001684
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001685Return<void> RadioImpl::setPreferredVoicePrivacy(int32_t serial, bool enable) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001686#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001687 RLOGD("setPreferredVoicePrivacy: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001688#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001689 dispatchInts(serial, mSlotId, RIL_REQUEST_CDMA_SET_PREFERRED_VOICE_PRIVACY_MODE,
1690 1, BOOL_TO_INT(enable));
1691 return Void();
1692}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001693
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001694Return<void> RadioImpl::getPreferredVoicePrivacy(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001695#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001696 RLOGD("getPreferredVoicePrivacy: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001697#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001698 dispatchVoid(serial, mSlotId, RIL_REQUEST_CDMA_QUERY_PREFERRED_VOICE_PRIVACY_MODE);
1699 return Void();
1700}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001701
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001702Return<void> RadioImpl::sendCDMAFeatureCode(int32_t serial, const hidl_string& featureCode) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001703#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001704 RLOGD("sendCDMAFeatureCode: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001705#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001706 dispatchString(serial, mSlotId, RIL_REQUEST_CDMA_FLASH,
Scott Randolphc7213312017-04-03 14:06:40 -07001707 featureCode.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001708 return Void();
1709}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001710
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001711Return<void> RadioImpl::sendBurstDtmf(int32_t serial, const hidl_string& dtmf, int32_t on,
1712 int32_t off) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001713#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001714 RLOGD("sendBurstDtmf: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001715#endif
Ruthwar Kumar Ambeer7c373812017-03-23 17:38:56 +05301716 dispatchStrings(serial, mSlotId, RIL_REQUEST_CDMA_BURST_DTMF, false,
Scott Randolphc7213312017-04-03 14:06:40 -07001717 3, dtmf.c_str(), (std::to_string(on)).c_str(),
1718 (std::to_string(off)).c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001719 return Void();
1720}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001721
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001722void constructCdmaSms(RIL_CDMA_SMS_Message &rcsm, const CdmaSmsMessage& sms) {
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001723 rcsm.uTeleserviceID = sms.teleserviceId;
1724 rcsm.bIsServicePresent = BOOL_TO_INT(sms.isServicePresent);
1725 rcsm.uServicecategory = sms.serviceCategory;
1726 rcsm.sAddress.digit_mode = (RIL_CDMA_SMS_DigitMode) sms.address.digitMode;
1727 rcsm.sAddress.number_mode = (RIL_CDMA_SMS_NumberMode) sms.address.numberMode;
1728 rcsm.sAddress.number_type = (RIL_CDMA_SMS_NumberType) sms.address.numberType;
1729 rcsm.sAddress.number_plan = (RIL_CDMA_SMS_NumberPlan) sms.address.numberPlan;
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001730
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001731 rcsm.sAddress.number_of_digits = sms.address.digits.size();
1732 int digitLimit= MIN((rcsm.sAddress.number_of_digits), RIL_CDMA_SMS_ADDRESS_MAX);
1733 for (int i = 0; i < digitLimit; i++) {
1734 rcsm.sAddress.digits[i] = sms.address.digits[i];
1735 }
1736
1737 rcsm.sSubAddress.subaddressType = (RIL_CDMA_SMS_SubaddressType) sms.subAddress.subaddressType;
1738 rcsm.sSubAddress.odd = BOOL_TO_INT(sms.subAddress.odd);
1739
1740 rcsm.sSubAddress.number_of_digits = sms.subAddress.digits.size();
1741 digitLimit= MIN((rcsm.sSubAddress.number_of_digits), RIL_CDMA_SMS_SUBADDRESS_MAX);
1742 for (int i = 0; i < digitLimit; i++) {
1743 rcsm.sSubAddress.digits[i] = sms.subAddress.digits[i];
1744 }
1745
1746 rcsm.uBearerDataLen = sms.bearerData.size();
1747 digitLimit= MIN((rcsm.uBearerDataLen), RIL_CDMA_SMS_BEARER_DATA_MAX);
1748 for (int i = 0; i < digitLimit; i++) {
1749 rcsm.aBearerData[i] = sms.bearerData[i];
1750 }
1751}
1752
1753Return<void> RadioImpl::sendCdmaSms(int32_t serial, const CdmaSmsMessage& sms) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001754#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001755 RLOGD("sendCdmaSms: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001756#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001757 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_CDMA_SEND_SMS);
1758 if (pRI == NULL) {
1759 return Void();
1760 }
1761
Jack Yu8e732d42017-04-14 00:08:06 -07001762 RIL_CDMA_SMS_Message rcsm = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001763 constructCdmaSms(rcsm, sms);
1764
Amit Mahajanb3a11bb2017-05-15 16:41:44 -07001765 CALL_ONREQUEST(pRI->pCI->requestNumber, &rcsm, sizeof(rcsm), pRI, mSlotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001766 return Void();
1767}
1768
1769Return<void> RadioImpl::acknowledgeLastIncomingCdmaSms(int32_t serial, const CdmaSmsAck& smsAck) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001770#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001771 RLOGD("acknowledgeLastIncomingCdmaSms: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001772#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001773 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_CDMA_SMS_ACKNOWLEDGE);
1774 if (pRI == NULL) {
1775 return Void();
1776 }
1777
Jack Yuf68e0da2017-02-07 14:53:09 -08001778 RIL_CDMA_SMS_Ack rcsa = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001779
1780 rcsa.uErrorClass = (RIL_CDMA_SMS_ErrorClass) smsAck.errorClass;
1781 rcsa.uSMSCauseCode = smsAck.smsCauseCode;
1782
Amit Mahajanb3a11bb2017-05-15 16:41:44 -07001783 CALL_ONREQUEST(pRI->pCI->requestNumber, &rcsa, sizeof(rcsa), pRI, mSlotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001784 return Void();
1785}
1786
1787Return<void> RadioImpl::getGsmBroadcastConfig(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001788#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001789 RLOGD("getGsmBroadcastConfig: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001790#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001791 dispatchVoid(serial, mSlotId, RIL_REQUEST_GSM_GET_BROADCAST_SMS_CONFIG);
1792 return Void();
1793}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001794
1795Return<void> RadioImpl::setGsmBroadcastConfig(int32_t serial,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001796 const hidl_vec<GsmBroadcastSmsConfigInfo>&
1797 configInfo) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001798#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001799 RLOGD("setGsmBroadcastConfig: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001800#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001801 RequestInfo *pRI = android::addRequestToList(serial, mSlotId,
1802 RIL_REQUEST_GSM_SET_BROADCAST_SMS_CONFIG);
1803 if (pRI == NULL) {
1804 return Void();
1805 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001806
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001807 int num = configInfo.size();
1808 RIL_GSM_BroadcastSmsConfigInfo gsmBci[num];
1809 RIL_GSM_BroadcastSmsConfigInfo *gsmBciPtrs[num];
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001810
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001811 for (int i = 0 ; i < num ; i++ ) {
1812 gsmBciPtrs[i] = &gsmBci[i];
1813 gsmBci[i].fromServiceId = configInfo[i].fromServiceId;
1814 gsmBci[i].toServiceId = configInfo[i].toServiceId;
1815 gsmBci[i].fromCodeScheme = configInfo[i].fromCodeScheme;
1816 gsmBci[i].toCodeScheme = configInfo[i].toCodeScheme;
1817 gsmBci[i].selected = BOOL_TO_INT(configInfo[i].selected);
1818 }
1819
Amit Mahajanb3a11bb2017-05-15 16:41:44 -07001820 CALL_ONREQUEST(pRI->pCI->requestNumber, gsmBciPtrs,
1821 num * sizeof(RIL_GSM_BroadcastSmsConfigInfo *), pRI, mSlotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001822 return Void();
1823}
1824
1825Return<void> RadioImpl::setGsmBroadcastActivation(int32_t serial, bool activate) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001826#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001827 RLOGD("setGsmBroadcastActivation: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001828#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001829 dispatchInts(serial, mSlotId, RIL_REQUEST_GSM_SMS_BROADCAST_ACTIVATION,
Sanket Padawe0de29d12017-02-10 13:19:47 -08001830 1, BOOL_TO_INT(!activate));
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001831 return Void();
1832}
1833
1834Return<void> RadioImpl::getCdmaBroadcastConfig(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001835#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001836 RLOGD("getCdmaBroadcastConfig: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001837#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001838 dispatchVoid(serial, mSlotId, RIL_REQUEST_CDMA_GET_BROADCAST_SMS_CONFIG);
1839 return Void();
1840}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001841
1842Return<void> RadioImpl::setCdmaBroadcastConfig(int32_t serial,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001843 const hidl_vec<CdmaBroadcastSmsConfigInfo>&
1844 configInfo) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001845#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001846 RLOGD("setCdmaBroadcastConfig: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001847#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001848 RequestInfo *pRI = android::addRequestToList(serial, mSlotId,
1849 RIL_REQUEST_CDMA_SET_BROADCAST_SMS_CONFIG);
1850 if (pRI == NULL) {
1851 return Void();
1852 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001853
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001854 int num = configInfo.size();
1855 RIL_CDMA_BroadcastSmsConfigInfo cdmaBci[num];
1856 RIL_CDMA_BroadcastSmsConfigInfo *cdmaBciPtrs[num];
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001857
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001858 for (int i = 0 ; i < num ; i++ ) {
1859 cdmaBciPtrs[i] = &cdmaBci[i];
1860 cdmaBci[i].service_category = configInfo[i].serviceCategory;
1861 cdmaBci[i].language = configInfo[i].language;
1862 cdmaBci[i].selected = BOOL_TO_INT(configInfo[i].selected);
1863 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001864
Amit Mahajanb3a11bb2017-05-15 16:41:44 -07001865 CALL_ONREQUEST(pRI->pCI->requestNumber, cdmaBciPtrs,
1866 num * sizeof(RIL_CDMA_BroadcastSmsConfigInfo *), pRI, mSlotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001867 return Void();
1868}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001869
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001870Return<void> RadioImpl::setCdmaBroadcastActivation(int32_t serial, bool activate) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001871#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001872 RLOGD("setCdmaBroadcastActivation: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001873#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001874 dispatchInts(serial, mSlotId, RIL_REQUEST_CDMA_SMS_BROADCAST_ACTIVATION,
Sanket Padawe0de29d12017-02-10 13:19:47 -08001875 1, BOOL_TO_INT(!activate));
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001876 return Void();
1877}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001878
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001879Return<void> RadioImpl::getCDMASubscription(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001880#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001881 RLOGD("getCDMASubscription: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001882#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001883 dispatchVoid(serial, mSlotId, RIL_REQUEST_CDMA_SUBSCRIPTION);
1884 return Void();
1885}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001886
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001887Return<void> RadioImpl::writeSmsToRuim(int32_t serial, const CdmaSmsWriteArgs& cdmaSms) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001888#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001889 RLOGD("writeSmsToRuim: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001890#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001891 RequestInfo *pRI = android::addRequestToList(serial, mSlotId,
1892 RIL_REQUEST_CDMA_WRITE_SMS_TO_RUIM);
1893 if (pRI == NULL) {
1894 return Void();
1895 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001896
Jack Yuf68e0da2017-02-07 14:53:09 -08001897 RIL_CDMA_SMS_WriteArgs rcsw = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001898 rcsw.status = (int) cdmaSms.status;
1899 constructCdmaSms(rcsw.message, cdmaSms.message);
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001900
Amit Mahajanb3a11bb2017-05-15 16:41:44 -07001901 CALL_ONREQUEST(pRI->pCI->requestNumber, &rcsw, sizeof(rcsw), pRI, mSlotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001902 return Void();
1903}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001904
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001905Return<void> RadioImpl::deleteSmsOnRuim(int32_t serial, int32_t index) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001906#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001907 RLOGD("deleteSmsOnRuim: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001908#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001909 dispatchInts(serial, mSlotId, RIL_REQUEST_CDMA_DELETE_SMS_ON_RUIM, 1, index);
1910 return Void();
1911}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001912
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001913Return<void> RadioImpl::getDeviceIdentity(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001914#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001915 RLOGD("getDeviceIdentity: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001916#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001917 dispatchVoid(serial, mSlotId, RIL_REQUEST_DEVICE_IDENTITY);
1918 return Void();
1919}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001920
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001921Return<void> RadioImpl::exitEmergencyCallbackMode(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001922#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001923 RLOGD("exitEmergencyCallbackMode: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001924#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001925 dispatchVoid(serial, mSlotId, RIL_REQUEST_EXIT_EMERGENCY_CALLBACK_MODE);
1926 return Void();
1927}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001928
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001929Return<void> RadioImpl::getSmscAddress(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001930#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001931 RLOGD("getSmscAddress: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001932#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001933 dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_SMSC_ADDRESS);
1934 return Void();
1935}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001936
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001937Return<void> RadioImpl::setSmscAddress(int32_t serial, const hidl_string& smsc) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001938#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001939 RLOGD("setSmscAddress: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001940#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001941 dispatchString(serial, mSlotId, RIL_REQUEST_SET_SMSC_ADDRESS,
Scott Randolphc7213312017-04-03 14:06:40 -07001942 smsc.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001943 return Void();
1944}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001945
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001946Return<void> RadioImpl::reportSmsMemoryStatus(int32_t serial, bool available) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001947#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001948 RLOGD("reportSmsMemoryStatus: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001949#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001950 dispatchInts(serial, mSlotId, RIL_REQUEST_REPORT_SMS_MEMORY_STATUS, 1,
1951 BOOL_TO_INT(available));
1952 return Void();
1953}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001954
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001955Return<void> RadioImpl::reportStkServiceIsRunning(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001956#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001957 RLOGD("reportStkServiceIsRunning: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001958#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001959 dispatchVoid(serial, mSlotId, RIL_REQUEST_REPORT_STK_SERVICE_IS_RUNNING);
1960 return Void();
1961}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001962
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001963Return<void> RadioImpl::getCdmaSubscriptionSource(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001964#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001965 RLOGD("getCdmaSubscriptionSource: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001966#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001967 dispatchVoid(serial, mSlotId, RIL_REQUEST_CDMA_GET_SUBSCRIPTION_SOURCE);
1968 return Void();
1969}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001970
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001971Return<void> RadioImpl::requestIsimAuthentication(int32_t serial, const hidl_string& challenge) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001972#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001973 RLOGD("requestIsimAuthentication: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001974#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001975 dispatchString(serial, mSlotId, RIL_REQUEST_ISIM_AUTHENTICATION,
Scott Randolphc7213312017-04-03 14:06:40 -07001976 challenge.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001977 return Void();
1978}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001979
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001980Return<void> RadioImpl::acknowledgeIncomingGsmSmsWithPdu(int32_t serial, bool success,
1981 const hidl_string& ackPdu) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001982#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001983 RLOGD("acknowledgeIncomingGsmSmsWithPdu: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001984#endif
Ruthwar Kumar Ambeer7c373812017-03-23 17:38:56 +05301985 dispatchStrings(serial, mSlotId, RIL_REQUEST_ACKNOWLEDGE_INCOMING_GSM_SMS_WITH_PDU, false,
Scott Randolphc7213312017-04-03 14:06:40 -07001986 2, success ? "1" : "0", ackPdu.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001987 return Void();
1988}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001989
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001990Return<void> RadioImpl::sendEnvelopeWithStatus(int32_t serial, const hidl_string& contents) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001991#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001992 RLOGD("sendEnvelopeWithStatus: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001993#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001994 dispatchString(serial, mSlotId, RIL_REQUEST_STK_SEND_ENVELOPE_WITH_STATUS,
Scott Randolphc7213312017-04-03 14:06:40 -07001995 contents.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001996 return Void();
1997}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001998
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001999Return<void> RadioImpl::getVoiceRadioTechnology(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002000#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002001 RLOGD("getVoiceRadioTechnology: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002002#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002003 dispatchVoid(serial, mSlotId, RIL_REQUEST_VOICE_RADIO_TECH);
2004 return Void();
2005}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002006
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002007Return<void> RadioImpl::getCellInfoList(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002008#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002009 RLOGD("getCellInfoList: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002010#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002011 dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_CELL_INFO_LIST);
2012 return Void();
2013}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002014
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002015Return<void> RadioImpl::setCellInfoListRate(int32_t serial, int32_t rate) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002016#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002017 RLOGD("setCellInfoListRate: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002018#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002019 dispatchInts(serial, mSlotId, RIL_REQUEST_SET_UNSOL_CELL_INFO_LIST_RATE, 1, rate);
2020 return Void();
2021}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002022
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002023Return<void> RadioImpl::setInitialAttachApn(int32_t serial, const DataProfileInfo& dataProfileInfo,
Jack Yuffc06452017-02-13 11:21:00 -08002024 bool modemCognitive, bool isRoaming) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002025#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002026 RLOGD("setInitialAttachApn: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002027#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002028 RequestInfo *pRI = android::addRequestToList(serial, mSlotId,
2029 RIL_REQUEST_SET_INITIAL_ATTACH_APN);
2030 if (pRI == NULL) {
2031 return Void();
2032 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002033
Jack Yuffc06452017-02-13 11:21:00 -08002034 if (s_vendorFunctions->version <= 14) {
2035 RIL_InitialAttachApn iaa = {};
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002036
Ruthwar Kumar Ambeer7c373812017-03-23 17:38:56 +05302037 if (!copyHidlStringToRil(&iaa.apn, dataProfileInfo.apn, pRI, true)) {
2038 return Void();
Jack Yuffc06452017-02-13 11:21:00 -08002039 }
2040
2041 const hidl_string &protocol =
2042 (isRoaming ? dataProfileInfo.roamingProtocol : dataProfileInfo.protocol);
2043
2044 if (!copyHidlStringToRil(&iaa.protocol, protocol, pRI)) {
Jack Yu8e732d42017-04-14 00:08:06 -07002045 memsetAndFreeStrings(1, iaa.apn);
Jack Yuffc06452017-02-13 11:21:00 -08002046 return Void();
2047 }
2048 iaa.authtype = (int) dataProfileInfo.authType;
2049 if (!copyHidlStringToRil(&iaa.username, dataProfileInfo.user, pRI)) {
Jack Yu8e732d42017-04-14 00:08:06 -07002050 memsetAndFreeStrings(2, iaa.apn, iaa.protocol);
Jack Yuffc06452017-02-13 11:21:00 -08002051 return Void();
2052 }
2053 if (!copyHidlStringToRil(&iaa.password, dataProfileInfo.password, pRI)) {
Jack Yu8e732d42017-04-14 00:08:06 -07002054 memsetAndFreeStrings(3, iaa.apn, iaa.protocol, iaa.username);
Jack Yuffc06452017-02-13 11:21:00 -08002055 return Void();
2056 }
2057
Amit Mahajanb3a11bb2017-05-15 16:41:44 -07002058 CALL_ONREQUEST(RIL_REQUEST_SET_INITIAL_ATTACH_APN, &iaa, sizeof(iaa), pRI, mSlotId);
Jack Yuffc06452017-02-13 11:21:00 -08002059
2060 memsetAndFreeStrings(4, iaa.apn, iaa.protocol, iaa.username, iaa.password);
2061 } else {
2062 RIL_InitialAttachApn_v15 iaa = {};
2063
Ruthwar Kumar Ambeer7c373812017-03-23 17:38:56 +05302064 if (!copyHidlStringToRil(&iaa.apn, dataProfileInfo.apn, pRI, true)) {
2065 return Void();
Jack Yuffc06452017-02-13 11:21:00 -08002066 }
Sanket Padawe46e9ee32017-06-20 12:40:19 -07002067
Jack Yuffc06452017-02-13 11:21:00 -08002068 if (!copyHidlStringToRil(&iaa.protocol, dataProfileInfo.protocol, pRI)) {
Jack Yu8e732d42017-04-14 00:08:06 -07002069 memsetAndFreeStrings(1, iaa.apn);
Jack Yuffc06452017-02-13 11:21:00 -08002070 return Void();
2071 }
2072 if (!copyHidlStringToRil(&iaa.roamingProtocol, dataProfileInfo.roamingProtocol, pRI)) {
Jack Yu8e732d42017-04-14 00:08:06 -07002073 memsetAndFreeStrings(2, iaa.apn, iaa.protocol);
Jack Yuffc06452017-02-13 11:21:00 -08002074 return Void();
2075 }
2076 iaa.authtype = (int) dataProfileInfo.authType;
2077 if (!copyHidlStringToRil(&iaa.username, dataProfileInfo.user, pRI)) {
Jack Yu8e732d42017-04-14 00:08:06 -07002078 memsetAndFreeStrings(3, iaa.apn, iaa.protocol, iaa.roamingProtocol);
Jack Yuffc06452017-02-13 11:21:00 -08002079 return Void();
2080 }
2081 if (!copyHidlStringToRil(&iaa.password, dataProfileInfo.password, pRI)) {
Jack Yu8e732d42017-04-14 00:08:06 -07002082 memsetAndFreeStrings(4, iaa.apn, iaa.protocol, iaa.roamingProtocol, iaa.username);
Jack Yuffc06452017-02-13 11:21:00 -08002083 return Void();
2084 }
2085 iaa.supportedTypesBitmask = dataProfileInfo.supportedApnTypesBitmap;
2086 iaa.bearerBitmask = dataProfileInfo.bearerBitmap;
2087 iaa.modemCognitive = BOOL_TO_INT(modemCognitive);
2088 iaa.mtu = dataProfileInfo.mtu;
2089
Jack Yuc13645e2017-04-13 20:55:03 -07002090 if (!convertMvnoTypeToString(dataProfileInfo.mvnoType, iaa.mvnoType)) {
Jack Yuffc06452017-02-13 11:21:00 -08002091 sendErrorResponse(pRI, RIL_E_INVALID_ARGUMENTS);
Jack Yu8e732d42017-04-14 00:08:06 -07002092 memsetAndFreeStrings(5, iaa.apn, iaa.protocol, iaa.roamingProtocol, iaa.username,
2093 iaa.password);
Jack Yuffc06452017-02-13 11:21:00 -08002094 return Void();
2095 }
2096
2097 if (!copyHidlStringToRil(&iaa.mvnoMatchData, dataProfileInfo.mvnoMatchData, pRI)) {
Jack Yu8e732d42017-04-14 00:08:06 -07002098 memsetAndFreeStrings(5, iaa.apn, iaa.protocol, iaa.roamingProtocol, iaa.username,
2099 iaa.password);
Jack Yuffc06452017-02-13 11:21:00 -08002100 return Void();
2101 }
2102
Amit Mahajanb3a11bb2017-05-15 16:41:44 -07002103 CALL_ONREQUEST(RIL_REQUEST_SET_INITIAL_ATTACH_APN, &iaa, sizeof(iaa), pRI, mSlotId);
Jack Yuffc06452017-02-13 11:21:00 -08002104
2105 memsetAndFreeStrings(6, iaa.apn, iaa.protocol, iaa.roamingProtocol, iaa.username,
2106 iaa.password, iaa.mvnoMatchData);
2107 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002108
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002109 return Void();
2110}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002111
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002112Return<void> RadioImpl::getImsRegistrationState(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002113#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002114 RLOGD("getImsRegistrationState: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002115#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002116 dispatchVoid(serial, mSlotId, RIL_REQUEST_IMS_REGISTRATION_STATE);
2117 return Void();
2118}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002119
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002120bool dispatchImsGsmSms(const ImsSmsMessage& message, RequestInfo *pRI) {
Jack Yuf68e0da2017-02-07 14:53:09 -08002121 RIL_IMS_SMS_Message rism = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002122 char **pStrings;
2123 int countStrings = 2;
2124 int dataLen = sizeof(char *) * countStrings;
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002125
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002126 rism.tech = RADIO_TECH_3GPP;
2127 rism.retry = BOOL_TO_INT(message.retry);
2128 rism.messageRef = message.messageRef;
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002129
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002130 if (message.gsmMessage.size() != 1) {
2131 RLOGE("dispatchImsGsmSms: Invalid len %s", requestToString(pRI->pCI->requestNumber));
Jack Yuffc06452017-02-13 11:21:00 -08002132 sendErrorResponse(pRI, RIL_E_INVALID_ARGUMENTS);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002133 return false;
2134 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002135
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002136 pStrings = (char **)calloc(countStrings, sizeof(char *));
2137 if (pStrings == NULL) {
2138 RLOGE("dispatchImsGsmSms: Memory allocation failed for request %s",
2139 requestToString(pRI->pCI->requestNumber));
Jack Yuffc06452017-02-13 11:21:00 -08002140 sendErrorResponse(pRI, RIL_E_NO_MEMORY);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002141 return false;
2142 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002143
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002144 if (!copyHidlStringToRil(&pStrings[0], message.gsmMessage[0].smscPdu, pRI)) {
2145#ifdef MEMSET_FREED
Jack Yub4295a42017-04-14 12:51:49 -07002146 memset(pStrings, 0, dataLen);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002147#endif
2148 free(pStrings);
2149 return false;
2150 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002151
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002152 if (!copyHidlStringToRil(&pStrings[1], message.gsmMessage[0].pdu, pRI)) {
2153 memsetAndFreeStrings(1, pStrings[0]);
2154#ifdef MEMSET_FREED
Jack Yub4295a42017-04-14 12:51:49 -07002155 memset(pStrings, 0, dataLen);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002156#endif
2157 free(pStrings);
2158 return false;
2159 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002160
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002161 rism.message.gsmMessage = pStrings;
Amit Mahajanb3a11bb2017-05-15 16:41:44 -07002162 CALL_ONREQUEST(pRI->pCI->requestNumber, &rism, sizeof(RIL_RadioTechnologyFamily) +
2163 sizeof(uint8_t) + sizeof(int32_t) + dataLen, pRI, pRI->socket_id);
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002164
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002165 for (int i = 0 ; i < countStrings ; i++) {
2166 memsetAndFreeStrings(1, pStrings[i]);
2167 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002168
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002169#ifdef MEMSET_FREED
Jack Yub4295a42017-04-14 12:51:49 -07002170 memset(pStrings, 0, dataLen);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002171#endif
2172 free(pStrings);
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002173
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002174 return true;
2175}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002176
Sanket Padawec4195802017-06-27 14:53:22 -07002177struct ImsCdmaSms {
2178 RIL_IMS_SMS_Message imsSms;
2179 RIL_CDMA_SMS_Message cdmaSms;
2180};
2181
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002182bool dispatchImsCdmaSms(const ImsSmsMessage& message, RequestInfo *pRI) {
Sanket Padawec4195802017-06-27 14:53:22 -07002183 ImsCdmaSms temp = {};
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002184
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002185 if (message.cdmaMessage.size() != 1) {
2186 RLOGE("dispatchImsCdmaSms: Invalid len %s", requestToString(pRI->pCI->requestNumber));
Jack Yuffc06452017-02-13 11:21:00 -08002187 sendErrorResponse(pRI, RIL_E_INVALID_ARGUMENTS);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002188 return false;
2189 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002190
Sanket Padawec4195802017-06-27 14:53:22 -07002191 temp.imsSms.tech = RADIO_TECH_3GPP2;
2192 temp.imsSms.retry = BOOL_TO_INT(message.retry);
2193 temp.imsSms.messageRef = message.messageRef;
2194 temp.imsSms.message.cdmaMessage = &temp.cdmaSms;
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002195
Sanket Padawec4195802017-06-27 14:53:22 -07002196 constructCdmaSms(temp.cdmaSms, message.cdmaMessage[0]);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002197
Sanket Padawec4195802017-06-27 14:53:22 -07002198 // Vendor code expects payload length to include actual msg payload
2199 // (sizeof(RIL_CDMA_SMS_Message)) instead of (RIL_CDMA_SMS_Message *) + size of other fields in
2200 // RIL_IMS_SMS_Message
2201 int payloadLen = sizeof(RIL_RadioTechnologyFamily) + sizeof(uint8_t) + sizeof(int32_t)
2202 + sizeof(RIL_CDMA_SMS_Message);
2203
2204 CALL_ONREQUEST(pRI->pCI->requestNumber, &temp.imsSms, payloadLen, pRI, pRI->socket_id);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002205
2206 return true;
2207}
2208
2209Return<void> RadioImpl::sendImsSms(int32_t serial, const ImsSmsMessage& message) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002210#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002211 RLOGD("sendImsSms: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002212#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002213 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_IMS_SEND_SMS);
2214 if (pRI == NULL) {
2215 return Void();
2216 }
2217
2218 RIL_RadioTechnologyFamily format = (RIL_RadioTechnologyFamily) message.tech;
2219
2220 if (RADIO_TECH_3GPP == format) {
2221 dispatchImsGsmSms(message, pRI);
2222 } else if (RADIO_TECH_3GPP2 == format) {
2223 dispatchImsCdmaSms(message, pRI);
2224 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08002225 RLOGE("sendImsSms: Invalid radio tech %s",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002226 requestToString(pRI->pCI->requestNumber));
Jack Yuffc06452017-02-13 11:21:00 -08002227 sendErrorResponse(pRI, RIL_E_INVALID_ARGUMENTS);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002228 }
2229 return Void();
2230}
2231
2232Return<void> RadioImpl::iccTransmitApduBasicChannel(int32_t serial, const SimApdu& message) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002233#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002234 RLOGD("iccTransmitApduBasicChannel: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002235#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002236 dispatchIccApdu(serial, mSlotId, RIL_REQUEST_SIM_TRANSMIT_APDU_BASIC, message);
2237 return Void();
2238}
2239
Wileen Chiu410b7562015-11-23 14:25:22 -08002240Return<void> RadioImpl::iccOpenLogicalChannel(int32_t serial, const hidl_string& aid, int32_t p2) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002241#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002242 RLOGD("iccOpenLogicalChannel: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002243#endif
Wileen Chiu410b7562015-11-23 14:25:22 -08002244 if (s_vendorFunctions->version < 15) {
2245 dispatchString(serial, mSlotId, RIL_REQUEST_SIM_OPEN_CHANNEL, aid.c_str());
2246 } else {
2247 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_SIM_OPEN_CHANNEL);
2248 if (pRI == NULL) {
2249 return Void();
2250 }
2251
Jack Yu8e732d42017-04-14 00:08:06 -07002252 RIL_OpenChannelParams params = {};
Wileen Chiu410b7562015-11-23 14:25:22 -08002253
2254 params.p2 = p2;
2255
2256 if (!copyHidlStringToRil(&params.aidPtr, aid, pRI)) {
2257 return Void();
2258 }
2259
Amit Mahajanb3a11bb2017-05-15 16:41:44 -07002260 CALL_ONREQUEST(pRI->pCI->requestNumber, &params, sizeof(params), pRI, mSlotId);
Wileen Chiu410b7562015-11-23 14:25:22 -08002261
2262 memsetAndFreeStrings(1, params.aidPtr);
2263 }
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002264 return Void();
2265}
2266
2267Return<void> RadioImpl::iccCloseLogicalChannel(int32_t serial, int32_t channelId) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002268#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002269 RLOGD("iccCloseLogicalChannel: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002270#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002271 dispatchInts(serial, mSlotId, RIL_REQUEST_SIM_CLOSE_CHANNEL, 1, channelId);
2272 return Void();
2273}
2274
2275Return<void> RadioImpl::iccTransmitApduLogicalChannel(int32_t serial, const SimApdu& message) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002276#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002277 RLOGD("iccTransmitApduLogicalChannel: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002278#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002279 dispatchIccApdu(serial, mSlotId, RIL_REQUEST_SIM_TRANSMIT_APDU_CHANNEL, message);
2280 return Void();
2281}
2282
2283Return<void> RadioImpl::nvReadItem(int32_t serial, NvItem itemId) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002284#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002285 RLOGD("nvReadItem: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002286#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002287 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_NV_READ_ITEM);
2288 if (pRI == NULL) {
2289 return Void();
2290 }
2291
Jack Yu8e732d42017-04-14 00:08:06 -07002292 RIL_NV_ReadItem nvri = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002293 nvri.itemID = (RIL_NV_Item) itemId;
2294
Amit Mahajanb3a11bb2017-05-15 16:41:44 -07002295 CALL_ONREQUEST(pRI->pCI->requestNumber, &nvri, sizeof(nvri), pRI, mSlotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002296 return Void();
2297}
2298
2299Return<void> RadioImpl::nvWriteItem(int32_t serial, const NvWriteItem& item) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002300#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002301 RLOGD("nvWriteItem: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002302#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002303 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_NV_WRITE_ITEM);
2304 if (pRI == NULL) {
2305 return Void();
2306 }
2307
Jack Yu8e732d42017-04-14 00:08:06 -07002308 RIL_NV_WriteItem nvwi = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002309
2310 nvwi.itemID = (RIL_NV_Item) item.itemId;
2311
2312 if (!copyHidlStringToRil(&nvwi.value, item.value, pRI)) {
2313 return Void();
2314 }
2315
Amit Mahajanb3a11bb2017-05-15 16:41:44 -07002316 CALL_ONREQUEST(pRI->pCI->requestNumber, &nvwi, sizeof(nvwi), pRI, mSlotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002317
2318 memsetAndFreeStrings(1, nvwi.value);
2319 return Void();
2320}
2321
2322Return<void> RadioImpl::nvWriteCdmaPrl(int32_t serial, const hidl_vec<uint8_t>& prl) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002323#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002324 RLOGD("nvWriteCdmaPrl: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002325#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002326 dispatchRaw(serial, mSlotId, RIL_REQUEST_NV_WRITE_CDMA_PRL, prl);
2327 return Void();
2328}
2329
2330Return<void> RadioImpl::nvResetConfig(int32_t serial, ResetNvType resetType) {
Jayachandran C32763f02017-04-30 10:21:14 -07002331 int rilResetType = -1;
Jayachandran C572f2f42017-03-25 14:30:13 -07002332#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002333 RLOGD("nvResetConfig: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002334#endif
Jayachandran C32763f02017-04-30 10:21:14 -07002335 /* Convert ResetNvType to RIL.h values
2336 * RIL_REQUEST_NV_RESET_CONFIG
2337 * 1 - reload all NV items
2338 * 2 - erase NV reset (SCRTN)
2339 * 3 - factory reset (RTN)
2340 */
2341 switch(resetType) {
2342 case ResetNvType::RELOAD:
2343 rilResetType = 1;
2344 break;
2345 case ResetNvType::ERASE:
2346 rilResetType = 2;
2347 break;
2348 case ResetNvType::FACTORY_RESET:
2349 rilResetType = 3;
2350 break;
2351 }
2352 dispatchInts(serial, mSlotId, RIL_REQUEST_NV_RESET_CONFIG, 1, rilResetType);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002353 return Void();
2354}
2355
2356Return<void> RadioImpl::setUiccSubscription(int32_t serial, const SelectUiccSub& uiccSub) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002357#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002358 RLOGD("setUiccSubscription: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002359#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002360 RequestInfo *pRI = android::addRequestToList(serial, mSlotId,
2361 RIL_REQUEST_SET_UICC_SUBSCRIPTION);
2362 if (pRI == NULL) {
2363 return Void();
2364 }
2365
Jack Yuf68e0da2017-02-07 14:53:09 -08002366 RIL_SelectUiccSub rilUiccSub = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002367
2368 rilUiccSub.slot = uiccSub.slot;
2369 rilUiccSub.app_index = uiccSub.appIndex;
2370 rilUiccSub.sub_type = (RIL_SubscriptionType) uiccSub.subType;
2371 rilUiccSub.act_status = (RIL_UiccSubActStatus) uiccSub.actStatus;
2372
Amit Mahajanb3a11bb2017-05-15 16:41:44 -07002373 CALL_ONREQUEST(pRI->pCI->requestNumber, &rilUiccSub, sizeof(rilUiccSub), pRI, mSlotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002374 return Void();
2375}
2376
2377Return<void> RadioImpl::setDataAllowed(int32_t serial, bool allow) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002378#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002379 RLOGD("setDataAllowed: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002380#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002381 dispatchInts(serial, mSlotId, RIL_REQUEST_ALLOW_DATA, 1, BOOL_TO_INT(allow));
2382 return Void();
2383}
2384
2385Return<void> RadioImpl::getHardwareConfig(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002386#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002387 RLOGD("getHardwareConfig: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002388#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002389 dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_HARDWARE_CONFIG);
2390 return Void();
2391}
2392
2393Return<void> RadioImpl::requestIccSimAuthentication(int32_t serial, int32_t authContext,
2394 const hidl_string& authData, const hidl_string& aid) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002395#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002396 RLOGD("requestIccSimAuthentication: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002397#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002398 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_SIM_AUTHENTICATION);
2399 if (pRI == NULL) {
2400 return Void();
2401 }
2402
Jack Yu8e732d42017-04-14 00:08:06 -07002403 RIL_SimAuthentication pf = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002404
2405 pf.authContext = authContext;
2406
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002407 if (!copyHidlStringToRil(&pf.authData, authData, pRI)) {
2408 return Void();
2409 }
2410
2411 if (!copyHidlStringToRil(&pf.aid, aid, pRI)) {
2412 memsetAndFreeStrings(1, pf.authData);
2413 return Void();
2414 }
2415
Amit Mahajanb3a11bb2017-05-15 16:41:44 -07002416 CALL_ONREQUEST(pRI->pCI->requestNumber, &pf, sizeof(pf), pRI, mSlotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002417
2418 memsetAndFreeStrings(2, pf.authData, pf.aid);
2419 return Void();
2420}
2421
2422/**
Jack Yuffc06452017-02-13 11:21:00 -08002423 * @param numProfiles number of data profile
2424 * @param dataProfiles the pointer to the actual data profiles. The acceptable type is
2425 RIL_DataProfileInfo or RIL_DataProfileInfo_v15.
2426 * @param dataProfilePtrs the pointer to the pointers that point to each data profile structure
2427 * @param numfields number of string-type member in the data profile structure
2428 * @param ... the variadic parameters are pointers to each string-type member
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002429 **/
Jack Yuffc06452017-02-13 11:21:00 -08002430template <typename T>
2431void freeSetDataProfileData(int numProfiles, T *dataProfiles, T **dataProfilePtrs,
2432 int numfields, ...) {
2433 va_list args;
2434 va_start(args, numfields);
2435
2436 // Iterate through each string-type field that need to be free.
2437 for (int i = 0; i < numfields; i++) {
2438 // Iterate through each data profile and free that specific string-type field.
2439 // The type 'char *T::*' is a type of pointer to a 'char *' member inside T structure.
2440 char *T::*ptr = va_arg(args, char *T::*);
2441 for (int j = 0; j < numProfiles; j++) {
2442 memsetAndFreeStrings(1, dataProfiles[j].*ptr);
2443 }
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002444 }
2445
Jack Yuffc06452017-02-13 11:21:00 -08002446 va_end(args);
2447
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002448#ifdef MEMSET_FREED
Jack Yuffc06452017-02-13 11:21:00 -08002449 memset(dataProfiles, 0, numProfiles * sizeof(T));
2450 memset(dataProfilePtrs, 0, numProfiles * sizeof(T *));
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002451#endif
2452 free(dataProfiles);
2453 free(dataProfilePtrs);
2454}
2455
Jack Yuffc06452017-02-13 11:21:00 -08002456Return<void> RadioImpl::setDataProfile(int32_t serial, const hidl_vec<DataProfileInfo>& profiles,
2457 bool isRoaming) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002458#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002459 RLOGD("setDataProfile: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002460#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002461 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_SET_DATA_PROFILE);
2462 if (pRI == NULL) {
2463 return Void();
2464 }
2465
Jack Yuffc06452017-02-13 11:21:00 -08002466 size_t num = profiles.size();
2467 bool success = false;
2468
2469 if (s_vendorFunctions->version <= 14) {
2470
2471 RIL_DataProfileInfo *dataProfiles =
2472 (RIL_DataProfileInfo *) calloc(num, sizeof(RIL_DataProfileInfo));
2473
2474 if (dataProfiles == NULL) {
2475 RLOGE("Memory allocation failed for request %s",
2476 requestToString(pRI->pCI->requestNumber));
2477 sendErrorResponse(pRI, RIL_E_NO_MEMORY);
2478 return Void();
2479 }
2480
2481 RIL_DataProfileInfo **dataProfilePtrs =
2482 (RIL_DataProfileInfo **) calloc(num, sizeof(RIL_DataProfileInfo *));
2483 if (dataProfilePtrs == NULL) {
2484 RLOGE("Memory allocation failed for request %s",
2485 requestToString(pRI->pCI->requestNumber));
2486 free(dataProfiles);
2487 sendErrorResponse(pRI, RIL_E_NO_MEMORY);
2488 return Void();
2489 }
2490
2491 for (size_t i = 0; i < num; i++) {
2492 dataProfilePtrs[i] = &dataProfiles[i];
2493
Ruthwar Kumar Ambeer7c373812017-03-23 17:38:56 +05302494 success = copyHidlStringToRil(&dataProfiles[i].apn, profiles[i].apn, pRI, true);
Jack Yuffc06452017-02-13 11:21:00 -08002495
2496 const hidl_string &protocol =
2497 (isRoaming ? profiles[i].roamingProtocol : profiles[i].protocol);
2498
Ruthwar Kumar Ambeer7c373812017-03-23 17:38:56 +05302499 if (success && !copyHidlStringToRil(&dataProfiles[i].protocol, protocol, pRI, true)) {
Jack Yuffc06452017-02-13 11:21:00 -08002500 success = false;
2501 }
2502
Ruthwar Kumar Ambeer7c373812017-03-23 17:38:56 +05302503 if (success && !copyHidlStringToRil(&dataProfiles[i].user, profiles[i].user, pRI,
2504 true)) {
Jack Yuffc06452017-02-13 11:21:00 -08002505 success = false;
2506 }
2507 if (success && !copyHidlStringToRil(&dataProfiles[i].password, profiles[i].password,
Ruthwar Kumar Ambeer7c373812017-03-23 17:38:56 +05302508 pRI, true)) {
Jack Yuffc06452017-02-13 11:21:00 -08002509 success = false;
2510 }
2511
2512 if (!success) {
2513 freeSetDataProfileData(num, dataProfiles, dataProfilePtrs, 4,
2514 &RIL_DataProfileInfo::apn, &RIL_DataProfileInfo::protocol,
2515 &RIL_DataProfileInfo::user, &RIL_DataProfileInfo::password);
2516 return Void();
2517 }
2518
2519 dataProfiles[i].profileId = (RIL_DataProfile) profiles[i].profileId;
2520 dataProfiles[i].authType = (int) profiles[i].authType;
2521 dataProfiles[i].type = (int) profiles[i].type;
2522 dataProfiles[i].maxConnsTime = profiles[i].maxConnsTime;
2523 dataProfiles[i].maxConns = profiles[i].maxConns;
2524 dataProfiles[i].waitTime = profiles[i].waitTime;
2525 dataProfiles[i].enabled = BOOL_TO_INT(profiles[i].enabled);
2526 }
2527
Amit Mahajanb3a11bb2017-05-15 16:41:44 -07002528 CALL_ONREQUEST(RIL_REQUEST_SET_DATA_PROFILE, dataProfilePtrs,
2529 num * sizeof(RIL_DataProfileInfo *), pRI, mSlotId);
Jack Yuffc06452017-02-13 11:21:00 -08002530
2531 freeSetDataProfileData(num, dataProfiles, dataProfilePtrs, 4,
2532 &RIL_DataProfileInfo::apn, &RIL_DataProfileInfo::protocol,
2533 &RIL_DataProfileInfo::user, &RIL_DataProfileInfo::password);
2534 } else {
2535 RIL_DataProfileInfo_v15 *dataProfiles =
2536 (RIL_DataProfileInfo_v15 *) calloc(num, sizeof(RIL_DataProfileInfo_v15));
2537
2538 if (dataProfiles == NULL) {
2539 RLOGE("Memory allocation failed for request %s",
2540 requestToString(pRI->pCI->requestNumber));
2541 sendErrorResponse(pRI, RIL_E_NO_MEMORY);
2542 return Void();
2543 }
2544
2545 RIL_DataProfileInfo_v15 **dataProfilePtrs =
2546 (RIL_DataProfileInfo_v15 **) calloc(num, sizeof(RIL_DataProfileInfo_v15 *));
2547 if (dataProfilePtrs == NULL) {
2548 RLOGE("Memory allocation failed for request %s",
2549 requestToString(pRI->pCI->requestNumber));
2550 free(dataProfiles);
2551 sendErrorResponse(pRI, RIL_E_NO_MEMORY);
2552 return Void();
2553 }
2554
2555 for (size_t i = 0; i < num; i++) {
2556 dataProfilePtrs[i] = &dataProfiles[i];
2557
Ruthwar Kumar Ambeer7c373812017-03-23 17:38:56 +05302558 success = copyHidlStringToRil(&dataProfiles[i].apn, profiles[i].apn, pRI, true);
Jack Yuffc06452017-02-13 11:21:00 -08002559 if (success && !copyHidlStringToRil(&dataProfiles[i].protocol, profiles[i].protocol,
2560 pRI)) {
2561 success = false;
2562 }
2563 if (success && !copyHidlStringToRil(&dataProfiles[i].roamingProtocol,
Ruthwar Kumar Ambeer7c373812017-03-23 17:38:56 +05302564 profiles[i].roamingProtocol, pRI, true)) {
Jack Yuffc06452017-02-13 11:21:00 -08002565 success = false;
2566 }
Ruthwar Kumar Ambeer7c373812017-03-23 17:38:56 +05302567 if (success && !copyHidlStringToRil(&dataProfiles[i].user, profiles[i].user, pRI,
2568 true)) {
Jack Yuffc06452017-02-13 11:21:00 -08002569 success = false;
2570 }
2571 if (success && !copyHidlStringToRil(&dataProfiles[i].password, profiles[i].password,
Ruthwar Kumar Ambeer7c373812017-03-23 17:38:56 +05302572 pRI, true)) {
Jack Yuffc06452017-02-13 11:21:00 -08002573 success = false;
2574 }
Jack Yuffc06452017-02-13 11:21:00 -08002575 if (success && !copyHidlStringToRil(&dataProfiles[i].mvnoMatchData,
Ruthwar Kumar Ambeer7c373812017-03-23 17:38:56 +05302576 profiles[i].mvnoMatchData, pRI, true)) {
Jack Yuffc06452017-02-13 11:21:00 -08002577 success = false;
2578 }
2579
Jack Yuc13645e2017-04-13 20:55:03 -07002580 if (success && !convertMvnoTypeToString(profiles[i].mvnoType,
2581 dataProfiles[i].mvnoType)) {
2582 sendErrorResponse(pRI, RIL_E_INVALID_ARGUMENTS);
2583 success = false;
Jack Yuffc06452017-02-13 11:21:00 -08002584 }
2585
2586 if (!success) {
2587 freeSetDataProfileData(num, dataProfiles, dataProfilePtrs, 6,
2588 &RIL_DataProfileInfo_v15::apn, &RIL_DataProfileInfo_v15::protocol,
2589 &RIL_DataProfileInfo_v15::roamingProtocol, &RIL_DataProfileInfo_v15::user,
2590 &RIL_DataProfileInfo_v15::password, &RIL_DataProfileInfo_v15::mvnoMatchData);
2591 return Void();
2592 }
2593
2594 dataProfiles[i].profileId = (RIL_DataProfile) profiles[i].profileId;
2595 dataProfiles[i].authType = (int) profiles[i].authType;
2596 dataProfiles[i].type = (int) profiles[i].type;
2597 dataProfiles[i].maxConnsTime = profiles[i].maxConnsTime;
2598 dataProfiles[i].maxConns = profiles[i].maxConns;
2599 dataProfiles[i].waitTime = profiles[i].waitTime;
2600 dataProfiles[i].enabled = BOOL_TO_INT(profiles[i].enabled);
2601 dataProfiles[i].supportedTypesBitmask = profiles[i].supportedApnTypesBitmap;
2602 dataProfiles[i].bearerBitmask = profiles[i].bearerBitmap;
2603 dataProfiles[i].mtu = profiles[i].mtu;
2604 }
2605
Amit Mahajanb3a11bb2017-05-15 16:41:44 -07002606 CALL_ONREQUEST(RIL_REQUEST_SET_DATA_PROFILE, dataProfilePtrs,
2607 num * sizeof(RIL_DataProfileInfo_v15 *), pRI, mSlotId);
Jack Yuffc06452017-02-13 11:21:00 -08002608
2609 freeSetDataProfileData(num, dataProfiles, dataProfilePtrs, 6,
2610 &RIL_DataProfileInfo_v15::apn, &RIL_DataProfileInfo_v15::protocol,
2611 &RIL_DataProfileInfo_v15::roamingProtocol, &RIL_DataProfileInfo_v15::user,
2612 &RIL_DataProfileInfo_v15::password, &RIL_DataProfileInfo_v15::mvnoMatchData);
2613 }
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002614
2615 return Void();
2616}
2617
2618Return<void> RadioImpl::requestShutdown(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002619#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002620 RLOGD("requestShutdown: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002621#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002622 dispatchVoid(serial, mSlotId, RIL_REQUEST_SHUTDOWN);
2623 return Void();
2624}
2625
2626Return<void> RadioImpl::getRadioCapability(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002627#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002628 RLOGD("getRadioCapability: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002629#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002630 dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_RADIO_CAPABILITY);
2631 return Void();
2632}
2633
2634Return<void> RadioImpl::setRadioCapability(int32_t serial, const RadioCapability& rc) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002635#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002636 RLOGD("setRadioCapability: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002637#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002638 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_SET_RADIO_CAPABILITY);
2639 if (pRI == NULL) {
2640 return Void();
2641 }
2642
Jack Yu8e732d42017-04-14 00:08:06 -07002643 RIL_RadioCapability rilRc = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002644
2645 // TODO : set rilRc.version using HIDL version ?
2646 rilRc.session = rc.session;
2647 rilRc.phase = (int) rc.phase;
2648 rilRc.rat = (int) rc.raf;
2649 rilRc.status = (int) rc.status;
Ashit Sood169fc262018-09-06 14:10:34 -07002650 strlcpy(rilRc.logicalModemUuid, rc.logicalModemUuid.c_str(), sizeof(rilRc.logicalModemUuid));
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002651
Amit Mahajanb3a11bb2017-05-15 16:41:44 -07002652 CALL_ONREQUEST(pRI->pCI->requestNumber, &rilRc, sizeof(rilRc), pRI, mSlotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002653
2654 return Void();
2655}
2656
2657Return<void> RadioImpl::startLceService(int32_t serial, int32_t reportInterval, bool pullMode) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002658#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002659 RLOGD("startLceService: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002660#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002661 dispatchInts(serial, mSlotId, RIL_REQUEST_START_LCE, 2, reportInterval,
2662 BOOL_TO_INT(pullMode));
2663 return Void();
2664}
2665
2666Return<void> RadioImpl::stopLceService(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002667#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002668 RLOGD("stopLceService: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002669#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002670 dispatchVoid(serial, mSlotId, RIL_REQUEST_STOP_LCE);
2671 return Void();
2672}
2673
2674Return<void> RadioImpl::pullLceData(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002675#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002676 RLOGD("pullLceData: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002677#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002678 dispatchVoid(serial, mSlotId, RIL_REQUEST_PULL_LCEDATA);
2679 return Void();
2680}
2681
2682Return<void> RadioImpl::getModemActivityInfo(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002683#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002684 RLOGD("getModemActivityInfo: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002685#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002686 dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_ACTIVITY_INFO);
2687 return Void();
2688}
2689
2690Return<void> RadioImpl::setAllowedCarriers(int32_t serial, bool allAllowed,
2691 const CarrierRestrictions& carriers) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002692#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002693 RLOGD("setAllowedCarriers: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002694#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002695 RequestInfo *pRI = android::addRequestToList(serial, mSlotId,
2696 RIL_REQUEST_SET_CARRIER_RESTRICTIONS);
2697 if (pRI == NULL) {
2698 return Void();
2699 }
2700
Jack Yuf68e0da2017-02-07 14:53:09 -08002701 RIL_CarrierRestrictions cr = {};
Jack Yu11ab4042017-02-21 17:08:01 -08002702 RIL_Carrier *allowedCarriers = NULL;
2703 RIL_Carrier *excludedCarriers = NULL;
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002704
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002705 cr.len_allowed_carriers = carriers.allowedCarriers.size();
2706 allowedCarriers = (RIL_Carrier *)calloc(cr.len_allowed_carriers, sizeof(RIL_Carrier));
2707 if (allowedCarriers == NULL) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08002708 RLOGE("setAllowedCarriers: Memory allocation failed for request %s",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002709 requestToString(pRI->pCI->requestNumber));
Jack Yuffc06452017-02-13 11:21:00 -08002710 sendErrorResponse(pRI, RIL_E_NO_MEMORY);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002711 return Void();
2712 }
2713 cr.allowed_carriers = allowedCarriers;
2714
2715 cr.len_excluded_carriers = carriers.excludedCarriers.size();
2716 excludedCarriers = (RIL_Carrier *)calloc(cr.len_excluded_carriers, sizeof(RIL_Carrier));
2717 if (excludedCarriers == NULL) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08002718 RLOGE("setAllowedCarriers: Memory allocation failed for request %s",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002719 requestToString(pRI->pCI->requestNumber));
Jack Yuffc06452017-02-13 11:21:00 -08002720 sendErrorResponse(pRI, RIL_E_NO_MEMORY);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002721#ifdef MEMSET_FREED
2722 memset(allowedCarriers, 0, cr.len_allowed_carriers * sizeof(RIL_Carrier));
2723#endif
2724 free(allowedCarriers);
2725 return Void();
2726 }
2727 cr.excluded_carriers = excludedCarriers;
2728
2729 for (int i = 0; i < cr.len_allowed_carriers; i++) {
Scott Randolphc7213312017-04-03 14:06:40 -07002730 allowedCarriers[i].mcc = carriers.allowedCarriers[i].mcc.c_str();
2731 allowedCarriers[i].mnc = carriers.allowedCarriers[i].mnc.c_str();
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002732 allowedCarriers[i].match_type = (RIL_CarrierMatchType) carriers.allowedCarriers[i].matchType;
Scott Randolphc7213312017-04-03 14:06:40 -07002733 allowedCarriers[i].match_data = carriers.allowedCarriers[i].matchData.c_str();
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002734 }
2735
Amit Mahajan3f510f62017-03-01 10:26:58 -08002736 for (int i = 0; i < cr.len_excluded_carriers; i++) {
Scott Randolphc7213312017-04-03 14:06:40 -07002737 excludedCarriers[i].mcc = carriers.excludedCarriers[i].mcc.c_str();
2738 excludedCarriers[i].mnc = carriers.excludedCarriers[i].mnc.c_str();
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002739 excludedCarriers[i].match_type =
2740 (RIL_CarrierMatchType) carriers.excludedCarriers[i].matchType;
Scott Randolphc7213312017-04-03 14:06:40 -07002741 excludedCarriers[i].match_data = carriers.excludedCarriers[i].matchData.c_str();
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002742 }
2743
Amit Mahajanb3a11bb2017-05-15 16:41:44 -07002744 CALL_ONREQUEST(pRI->pCI->requestNumber, &cr, sizeof(RIL_CarrierRestrictions), pRI, mSlotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002745
2746#ifdef MEMSET_FREED
2747 memset(allowedCarriers, 0, cr.len_allowed_carriers * sizeof(RIL_Carrier));
2748 memset(excludedCarriers, 0, cr.len_excluded_carriers * sizeof(RIL_Carrier));
2749#endif
2750 free(allowedCarriers);
2751 free(excludedCarriers);
2752 return Void();
2753}
2754
2755Return<void> RadioImpl::getAllowedCarriers(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002756#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002757 RLOGD("getAllowedCarriers: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002758#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002759 dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_CARRIER_RESTRICTIONS);
2760 return Void();
2761}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002762
Jack Yu11ab4042017-02-21 17:08:01 -08002763Return<void> RadioImpl::sendDeviceState(int32_t serial, DeviceStateType deviceStateType,
2764 bool state) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002765#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002766 RLOGD("sendDeviceState: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002767#endif
Jack Yu11ab4042017-02-21 17:08:01 -08002768 if (s_vendorFunctions->version < 15) {
2769 if (deviceStateType == DeviceStateType::LOW_DATA_EXPECTED) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08002770 RLOGD("sendDeviceState: calling screen state %d", BOOL_TO_INT(!state));
Jack Yu11ab4042017-02-21 17:08:01 -08002771 dispatchInts(serial, mSlotId, RIL_REQUEST_SCREEN_STATE, 1, BOOL_TO_INT(!state));
2772 } else {
2773 RequestInfo *pRI = android::addRequestToList(serial, mSlotId,
2774 RIL_REQUEST_SEND_DEVICE_STATE);
2775 sendErrorResponse(pRI, RIL_E_REQUEST_NOT_SUPPORTED);
2776 }
2777 return Void();
2778 }
2779 dispatchInts(serial, mSlotId, RIL_REQUEST_SEND_DEVICE_STATE, 2, (int) deviceStateType,
2780 BOOL_TO_INT(state));
2781 return Void();
2782}
2783
2784Return<void> RadioImpl::setIndicationFilter(int32_t serial, int32_t indicationFilter) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002785#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002786 RLOGD("setIndicationFilter: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002787#endif
Jack Yu11ab4042017-02-21 17:08:01 -08002788 if (s_vendorFunctions->version < 15) {
2789 RequestInfo *pRI = android::addRequestToList(serial, mSlotId,
2790 RIL_REQUEST_SET_UNSOLICITED_RESPONSE_FILTER);
2791 sendErrorResponse(pRI, RIL_E_REQUEST_NOT_SUPPORTED);
2792 return Void();
2793 }
2794 dispatchInts(serial, mSlotId, RIL_REQUEST_SET_UNSOLICITED_RESPONSE_FILTER, 1, indicationFilter);
2795 return Void();
2796}
2797
Wileen Chiu718c0bf2017-01-04 11:37:19 -08002798Return<void> RadioImpl::setSimCardPower(int32_t serial, bool powerUp) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002799#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002800 RLOGD("setSimCardPower: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002801#endif
Wileen Chiu718c0bf2017-01-04 11:37:19 -08002802 dispatchInts(serial, mSlotId, RIL_REQUEST_SET_SIM_CARD_POWER, 1, BOOL_TO_INT(powerUp));
2803 return Void();
2804}
2805
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07002806Return<void> RadioImpl::setSimCardPower_1_1(int32_t serial, const V1_1::CardPowerState state) {
Grace Chen08eb6542017-03-23 18:39:48 -07002807#if VDBG
2808 RLOGD("setSimCardPower_1_1: serial %d state %d", serial, state);
2809#endif
2810 dispatchInts(serial, mSlotId, RIL_REQUEST_SET_SIM_CARD_POWER, 1, state);
2811 return Void();
2812}
2813
Nathan Harold6a8809d2017-07-07 19:28:58 -07002814Return<void> RadioImpl::setCarrierInfoForImsiEncryption(int32_t serial,
2815 const V1_1::ImsiEncryptionInfo& data) {
2816#if VDBG
2817 RLOGD("setCarrierInfoForImsiEncryption: serial %d", serial);
2818#endif
2819 RequestInfo *pRI = android::addRequestToList(
2820 serial, mSlotId, RIL_REQUEST_SET_CARRIER_INFO_IMSI_ENCRYPTION);
2821 if (pRI == NULL) {
2822 return Void();
2823 }
2824
2825 RIL_CarrierInfoForImsiEncryption imsiEncryption = {};
2826
2827 if (!copyHidlStringToRil(&imsiEncryption.mnc, data.mnc, pRI)) {
2828 return Void();
2829 }
2830 if (!copyHidlStringToRil(&imsiEncryption.mcc, data.mcc, pRI)) {
2831 memsetAndFreeStrings(1, imsiEncryption.mnc);
2832 return Void();
2833 }
2834 if (!copyHidlStringToRil(&imsiEncryption.keyIdentifier, data.keyIdentifier, pRI)) {
2835 memsetAndFreeStrings(2, imsiEncryption.mnc, imsiEncryption.mcc);
2836 return Void();
2837 }
Youngrak Leee6f16f22017-12-03 10:50:37 -08002838 imsiEncryption.carrierKeyLength = data.carrierKey.size();
2839 imsiEncryption.carrierKey = new uint8_t[imsiEncryption.carrierKeyLength];
2840 memcpy(imsiEncryption.carrierKey, data.carrierKey.data(), imsiEncryption.carrierKeyLength);
Nathan Harold6a8809d2017-07-07 19:28:58 -07002841 imsiEncryption.expirationTime = data.expirationTime;
2842 CALL_ONREQUEST(pRI->pCI->requestNumber, &imsiEncryption,
2843 sizeof(RIL_CarrierInfoForImsiEncryption), pRI, mSlotId);
2844 delete(imsiEncryption.carrierKey);
2845 return Void();
2846}
2847
2848Return<void> RadioImpl::startKeepalive(int32_t serial, const V1_1::KeepaliveRequest& keepalive) {
2849#if VDBG
2850 RLOGD("%s(): %d", __FUNCTION__, serial);
2851#endif
2852 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_START_KEEPALIVE);
2853 if (pRI == NULL) {
2854 return Void();
2855 }
2856
2857 RIL_KeepaliveRequest kaReq = {};
2858
2859 kaReq.type = static_cast<RIL_KeepaliveType>(keepalive.type);
2860 switch(kaReq.type) {
2861 case NATT_IPV4:
2862 if (keepalive.sourceAddress.size() != 4 ||
2863 keepalive.destinationAddress.size() != 4) {
2864 RLOGE("Invalid address for keepalive!");
2865 sendErrorResponse(pRI, RIL_E_INVALID_ARGUMENTS);
2866 return Void();
2867 }
2868 break;
2869 case NATT_IPV6:
2870 if (keepalive.sourceAddress.size() != 16 ||
2871 keepalive.destinationAddress.size() != 16) {
2872 RLOGE("Invalid address for keepalive!");
2873 sendErrorResponse(pRI, RIL_E_INVALID_ARGUMENTS);
2874 return Void();
2875 }
2876 break;
2877 default:
2878 RLOGE("Unknown packet keepalive type!");
2879 sendErrorResponse(pRI, RIL_E_INVALID_ARGUMENTS);
2880 return Void();
2881 }
2882
2883 ::memcpy(kaReq.sourceAddress, keepalive.sourceAddress.data(), keepalive.sourceAddress.size());
2884 kaReq.sourcePort = keepalive.sourcePort;
2885
2886 ::memcpy(kaReq.destinationAddress,
2887 keepalive.destinationAddress.data(), keepalive.destinationAddress.size());
2888 kaReq.destinationPort = keepalive.destinationPort;
2889
2890 kaReq.maxKeepaliveIntervalMillis = keepalive.maxKeepaliveIntervalMillis;
2891 kaReq.cid = keepalive.cid; // This is the context ID of the data call
2892
2893 CALL_ONREQUEST(pRI->pCI->requestNumber, &kaReq, sizeof(RIL_KeepaliveRequest), pRI, mSlotId);
2894 return Void();
2895}
2896
2897Return<void> RadioImpl::stopKeepalive(int32_t serial, int32_t sessionHandle) {
2898#if VDBG
2899 RLOGD("%s(): %d", __FUNCTION__, serial);
2900#endif
2901 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_STOP_KEEPALIVE);
2902 if (pRI == NULL) {
2903 return Void();
2904 }
2905
2906 CALL_ONREQUEST(pRI->pCI->requestNumber, &sessionHandle, sizeof(uint32_t), pRI, mSlotId);
2907 return Void();
2908}
2909
Sanket Padawef220dc52017-01-02 23:46:00 -08002910Return<void> RadioImpl::responseAcknowledgement() {
2911 android::releaseWakeLock();
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002912 return Void();
Sanket Padawef220dc52017-01-02 23:46:00 -08002913}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002914
Amit Mahajan439da362017-02-13 17:43:04 -08002915Return<void> OemHookImpl::setResponseFunctions(
2916 const ::android::sp<IOemHookResponse>& oemHookResponseParam,
2917 const ::android::sp<IOemHookIndication>& oemHookIndicationParam) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002918#if VDBG
Amit Mahajan439da362017-02-13 17:43:04 -08002919 RLOGD("OemHookImpl::setResponseFunctions");
Jayachandran C572f2f42017-03-25 14:30:13 -07002920#endif
Amit Mahajan439da362017-02-13 17:43:04 -08002921
2922 pthread_rwlock_t *radioServiceRwlockPtr = radio::getRadioServiceRwlock(mSlotId);
2923 int ret = pthread_rwlock_wrlock(radioServiceRwlockPtr);
2924 assert(ret == 0);
2925
2926 mOemHookResponse = oemHookResponseParam;
2927 mOemHookIndication = oemHookIndicationParam;
Amit Mahajand423d192017-03-16 17:04:01 -07002928 mCounterOemHook[mSlotId]++;
Amit Mahajan439da362017-02-13 17:43:04 -08002929
2930 ret = pthread_rwlock_unlock(radioServiceRwlockPtr);
2931 assert(ret == 0);
2932
2933 return Void();
2934}
2935
2936Return<void> OemHookImpl::sendRequestRaw(int32_t serial, const hidl_vec<uint8_t>& data) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002937#if VDBG
Amit Mahajan439da362017-02-13 17:43:04 -08002938 RLOGD("OemHookImpl::sendRequestRaw: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002939#endif
Amit Mahajan439da362017-02-13 17:43:04 -08002940 dispatchRaw(serial, mSlotId, RIL_REQUEST_OEM_HOOK_RAW, data);
2941 return Void();
2942}
2943
2944Return<void> OemHookImpl::sendRequestStrings(int32_t serial,
2945 const hidl_vec<hidl_string>& data) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002946#if VDBG
Amit Mahajan439da362017-02-13 17:43:04 -08002947 RLOGD("OemHookImpl::sendRequestStrings: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002948#endif
Amit Mahajan439da362017-02-13 17:43:04 -08002949 dispatchStrings(serial, mSlotId, RIL_REQUEST_OEM_HOOK_STRINGS, data);
2950 return Void();
2951}
2952
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002953/***************************************************************************************************
2954 * RESPONSE FUNCTIONS
2955 * Functions above are used for requests going from framework to vendor code. The ones below are
2956 * responses for those requests coming back from the vendor code.
2957 **************************************************************************************************/
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002958
Sanket Padawef220dc52017-01-02 23:46:00 -08002959void radio::acknowledgeRequest(int slotId, int serial) {
2960 if (radioService[slotId]->mRadioResponse != NULL) {
Amit Mahajan17249842017-01-19 15:05:45 -08002961 Return<void> retStatus = radioService[slotId]->mRadioResponse->acknowledgeRequest(serial);
2962 radioService[slotId]->checkReturnStatus(retStatus);
Sanket Padawef220dc52017-01-02 23:46:00 -08002963 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08002964 RLOGE("acknowledgeRequest: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawef220dc52017-01-02 23:46:00 -08002965 }
2966}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002967
Sanket Padawef220dc52017-01-02 23:46:00 -08002968void populateResponseInfo(RadioResponseInfo& responseInfo, int serial, int responseType,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002969 RIL_Errno e) {
Sanket Padawef220dc52017-01-02 23:46:00 -08002970 responseInfo.serial = serial;
2971 switch (responseType) {
2972 case RESPONSE_SOLICITED:
2973 responseInfo.type = RadioResponseType::SOLICITED;
2974 break;
2975 case RESPONSE_SOLICITED_ACK_EXP:
2976 responseInfo.type = RadioResponseType::SOLICITED_ACK_EXP;
2977 break;
2978 }
2979 responseInfo.error = (RadioError) e;
2980}
2981
Naveen Kalla346bbc02017-03-16 12:55:55 -07002982int responseIntOrEmpty(RadioResponseInfo& responseInfo, int serial, int responseType, RIL_Errno e,
2983 void *response, size_t responseLen) {
2984 populateResponseInfo(responseInfo, serial, responseType, e);
2985 int ret = -1;
2986
2987 if (response == NULL && responseLen == 0) {
2988 // Earlier RILs did not send a response for some cases although the interface
2989 // expected an integer as response. Do not return error if response is empty. Instead
2990 // Return -1 in those cases to maintain backward compatibility.
2991 } else if (response == NULL || responseLen != sizeof(int)) {
2992 RLOGE("responseIntOrEmpty: Invalid response");
2993 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
2994 } else {
2995 int *p_int = (int *) response;
2996 ret = p_int[0];
2997 }
2998 return ret;
2999}
3000
Sanket Padawef220dc52017-01-02 23:46:00 -08003001int responseInt(RadioResponseInfo& responseInfo, int serial, int responseType, RIL_Errno e,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003002 void *response, size_t responseLen) {
Sanket Padawef220dc52017-01-02 23:46:00 -08003003 populateResponseInfo(responseInfo, serial, responseType, e);
3004 int ret = -1;
3005
3006 if (response == NULL || responseLen != sizeof(int)) {
3007 RLOGE("responseInt: Invalid response");
3008 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
3009 } else {
3010 int *p_int = (int *) response;
3011 ret = p_int[0];
3012 }
3013 return ret;
3014}
3015
Amit Mahajan759786a2017-03-03 17:35:47 -08003016int radio::getIccCardStatusResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003017 int responseType, int serial, RIL_Errno e,
3018 void *response, size_t responseLen) {
Sanket Padawef220dc52017-01-02 23:46:00 -08003019 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003020 RadioResponseInfo responseInfo = {};
Sanket Padawef220dc52017-01-02 23:46:00 -08003021 populateResponseInfo(responseInfo, serial, responseType, e);
Ryuto Sawada1879d102017-07-21 23:18:50 +09003022 CardStatus cardStatus = {CardState::ABSENT, PinState::UNKNOWN, -1, -1, -1, {}};
Nathan Harold7da5dd62017-06-08 16:41:52 -07003023 RIL_CardStatus_v6 *p_cur = ((RIL_CardStatus_v6 *) response);
3024 if (response == NULL || responseLen != sizeof(RIL_CardStatus_v6)
3025 || p_cur->gsm_umts_subscription_app_index >= p_cur->num_applications
3026 || p_cur->cdma_subscription_app_index >= p_cur->num_applications
3027 || p_cur->ims_subscription_app_index >= p_cur->num_applications) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003028 RLOGE("getIccCardStatusResponse: Invalid response");
Sanket Padawef220dc52017-01-02 23:46:00 -08003029 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
Amit Mahajancd77a5b2016-08-25 11:19:21 -07003030 } else {
Amit Mahajancd77a5b2016-08-25 11:19:21 -07003031 cardStatus.cardState = (CardState) p_cur->card_state;
3032 cardStatus.universalPinState = (PinState) p_cur->universal_pin_state;
3033 cardStatus.gsmUmtsSubscriptionAppIndex = p_cur->gsm_umts_subscription_app_index;
3034 cardStatus.cdmaSubscriptionAppIndex = p_cur->cdma_subscription_app_index;
3035 cardStatus.imsSubscriptionAppIndex = p_cur->ims_subscription_app_index;
3036
3037 RIL_AppStatus *rilAppStatus = p_cur->applications;
3038 cardStatus.applications.resize(p_cur->num_applications);
3039 AppStatus *appStatus = cardStatus.applications.data();
Jayachandran C572f2f42017-03-25 14:30:13 -07003040#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003041 RLOGD("getIccCardStatusResponse: num_applications %d", p_cur->num_applications);
Jayachandran C572f2f42017-03-25 14:30:13 -07003042#endif
Amit Mahajancd77a5b2016-08-25 11:19:21 -07003043 for (int i = 0; i < p_cur->num_applications; i++) {
3044 appStatus[i].appType = (AppType) rilAppStatus[i].app_type;
3045 appStatus[i].appState = (AppState) rilAppStatus[i].app_state;
3046 appStatus[i].persoSubstate = (PersoSubstate) rilAppStatus[i].perso_substate;
3047 appStatus[i].aidPtr = convertCharPtrToHidlString(rilAppStatus[i].aid_ptr);
3048 appStatus[i].appLabelPtr = convertCharPtrToHidlString(
3049 rilAppStatus[i].app_label_ptr);
3050 appStatus[i].pin1Replaced = rilAppStatus[i].pin1_replaced;
3051 appStatus[i].pin1 = (PinState) rilAppStatus[i].pin1;
3052 appStatus[i].pin2 = (PinState) rilAppStatus[i].pin2;
3053 }
3054 }
3055
Amit Mahajan17249842017-01-19 15:05:45 -08003056 Return<void> retStatus = radioService[slotId]->mRadioResponse->
3057 getIccCardStatusResponse(responseInfo, cardStatus);
3058 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajancd77a5b2016-08-25 11:19:21 -07003059 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003060 RLOGE("getIccCardStatusResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawef220dc52017-01-02 23:46:00 -08003061 }
3062
3063 return 0;
3064}
3065
Amit Mahajan759786a2017-03-03 17:35:47 -08003066int radio::supplyIccPinForAppResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003067 int responseType, int serial, RIL_Errno e,
3068 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003069#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003070 RLOGD("supplyIccPinForAppResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003071#endif
Sanket Padawef220dc52017-01-02 23:46:00 -08003072
3073 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003074 RadioResponseInfo responseInfo = {};
Naveen Kalla346bbc02017-03-16 12:55:55 -07003075 int ret = responseIntOrEmpty(responseInfo, serial, responseType, e, response, responseLen);
Amit Mahajan17249842017-01-19 15:05:45 -08003076 Return<void> retStatus = radioService[slotId]->mRadioResponse->
3077 supplyIccPinForAppResponse(responseInfo, ret);
Amit Mahajanb3a11bb2017-05-15 16:41:44 -07003078 RLOGE("supplyIccPinForAppResponse: amit ret %d", ret);
Amit Mahajan17249842017-01-19 15:05:45 -08003079 radioService[slotId]->checkReturnStatus(retStatus);
Sanket Padawef220dc52017-01-02 23:46:00 -08003080 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003081 RLOGE("supplyIccPinForAppResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawef220dc52017-01-02 23:46:00 -08003082 slotId);
3083 }
3084
3085 return 0;
3086}
3087
Amit Mahajan759786a2017-03-03 17:35:47 -08003088int radio::supplyIccPukForAppResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003089 int responseType, int serial, RIL_Errno e,
3090 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003091#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003092 RLOGD("supplyIccPukForAppResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003093#endif
Sanket Padawef220dc52017-01-02 23:46:00 -08003094
3095 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003096 RadioResponseInfo responseInfo = {};
Naveen Kalla346bbc02017-03-16 12:55:55 -07003097 int ret = responseIntOrEmpty(responseInfo, serial, responseType, e, response, responseLen);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003098 Return<void> retStatus = radioService[slotId]->mRadioResponse->supplyIccPukForAppResponse(
3099 responseInfo, ret);
Amit Mahajan17249842017-01-19 15:05:45 -08003100 radioService[slotId]->checkReturnStatus(retStatus);
Sanket Padawef220dc52017-01-02 23:46:00 -08003101 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003102 RLOGE("supplyIccPukForAppResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawef220dc52017-01-02 23:46:00 -08003103 slotId);
3104 }
3105
3106 return 0;
3107}
3108
Amit Mahajan759786a2017-03-03 17:35:47 -08003109int radio::supplyIccPin2ForAppResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003110 int responseType, int serial, RIL_Errno e,
3111 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003112#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003113 RLOGD("supplyIccPin2ForAppResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003114#endif
Sanket Padawef220dc52017-01-02 23:46:00 -08003115
3116 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003117 RadioResponseInfo responseInfo = {};
Naveen Kalla346bbc02017-03-16 12:55:55 -07003118 int ret = responseIntOrEmpty(responseInfo, serial, responseType, e, response, responseLen);
Amit Mahajan17249842017-01-19 15:05:45 -08003119 Return<void> retStatus = radioService[slotId]->mRadioResponse->
3120 supplyIccPin2ForAppResponse(responseInfo, ret);
3121 radioService[slotId]->checkReturnStatus(retStatus);
Sanket Padawef220dc52017-01-02 23:46:00 -08003122 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003123 RLOGE("supplyIccPin2ForAppResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawef220dc52017-01-02 23:46:00 -08003124 slotId);
3125 }
3126
3127 return 0;
3128}
3129
Amit Mahajan759786a2017-03-03 17:35:47 -08003130int radio::supplyIccPuk2ForAppResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003131 int responseType, int serial, RIL_Errno e,
3132 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003133#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003134 RLOGD("supplyIccPuk2ForAppResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003135#endif
Sanket Padawef220dc52017-01-02 23:46:00 -08003136
3137 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003138 RadioResponseInfo responseInfo = {};
Naveen Kalla346bbc02017-03-16 12:55:55 -07003139 int ret = responseIntOrEmpty(responseInfo, serial, responseType, e, response, responseLen);
Amit Mahajan17249842017-01-19 15:05:45 -08003140 Return<void> retStatus = radioService[slotId]->mRadioResponse->
3141 supplyIccPuk2ForAppResponse(responseInfo, ret);
3142 radioService[slotId]->checkReturnStatus(retStatus);
Sanket Padawef220dc52017-01-02 23:46:00 -08003143 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003144 RLOGE("supplyIccPuk2ForAppResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawef220dc52017-01-02 23:46:00 -08003145 slotId);
3146 }
3147
3148 return 0;
3149}
3150
Amit Mahajan759786a2017-03-03 17:35:47 -08003151int radio::changeIccPinForAppResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003152 int responseType, int serial, RIL_Errno e,
3153 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003154#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003155 RLOGD("changeIccPinForAppResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003156#endif
Sanket Padawef220dc52017-01-02 23:46:00 -08003157
3158 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003159 RadioResponseInfo responseInfo = {};
Naveen Kalla346bbc02017-03-16 12:55:55 -07003160 int ret = responseIntOrEmpty(responseInfo, serial, responseType, e, response, responseLen);
Amit Mahajan17249842017-01-19 15:05:45 -08003161 Return<void> retStatus = radioService[slotId]->mRadioResponse->
3162 changeIccPinForAppResponse(responseInfo, ret);
3163 radioService[slotId]->checkReturnStatus(retStatus);
Sanket Padawef220dc52017-01-02 23:46:00 -08003164 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003165 RLOGE("changeIccPinForAppResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawef220dc52017-01-02 23:46:00 -08003166 slotId);
3167 }
3168
3169 return 0;
3170}
3171
Amit Mahajan759786a2017-03-03 17:35:47 -08003172int radio::changeIccPin2ForAppResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003173 int responseType, int serial, RIL_Errno e,
3174 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003175#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003176 RLOGD("changeIccPin2ForAppResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003177#endif
Sanket Padawef220dc52017-01-02 23:46:00 -08003178
3179 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003180 RadioResponseInfo responseInfo = {};
Naveen Kalla346bbc02017-03-16 12:55:55 -07003181 int ret = responseIntOrEmpty(responseInfo, serial, responseType, e, response, responseLen);
Amit Mahajan17249842017-01-19 15:05:45 -08003182 Return<void> retStatus = radioService[slotId]->mRadioResponse->
3183 changeIccPin2ForAppResponse(responseInfo, ret);
3184 radioService[slotId]->checkReturnStatus(retStatus);
Sanket Padawef220dc52017-01-02 23:46:00 -08003185 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003186 RLOGE("changeIccPin2ForAppResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawef220dc52017-01-02 23:46:00 -08003187 slotId);
3188 }
3189
3190 return 0;
3191}
3192
Amit Mahajan759786a2017-03-03 17:35:47 -08003193int radio::supplyNetworkDepersonalizationResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003194 int responseType, int serial, RIL_Errno e,
3195 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003196#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003197 RLOGD("supplyNetworkDepersonalizationResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003198#endif
Sanket Padawef220dc52017-01-02 23:46:00 -08003199
3200 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003201 RadioResponseInfo responseInfo = {};
Naveen Kalla346bbc02017-03-16 12:55:55 -07003202 int ret = responseIntOrEmpty(responseInfo, serial, responseType, e, response, responseLen);
Amit Mahajan17249842017-01-19 15:05:45 -08003203 Return<void> retStatus = radioService[slotId]->mRadioResponse->
3204 supplyNetworkDepersonalizationResponse(responseInfo, ret);
3205 radioService[slotId]->checkReturnStatus(retStatus);
Sanket Padawef220dc52017-01-02 23:46:00 -08003206 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003207 RLOGE("supplyNetworkDepersonalizationResponse: radioService[%d]->mRadioResponse == "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003208 "NULL", slotId);
Sanket Padawef220dc52017-01-02 23:46:00 -08003209 }
3210
3211 return 0;
3212}
3213
Amit Mahajan759786a2017-03-03 17:35:47 -08003214int radio::getCurrentCallsResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003215 int responseType, int serial, RIL_Errno e,
3216 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003217#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003218 RLOGD("getCurrentCallsResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003219#endif
Sanket Padawef220dc52017-01-02 23:46:00 -08003220
3221 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003222 RadioResponseInfo responseInfo = {};
Sanket Padawef220dc52017-01-02 23:46:00 -08003223 populateResponseInfo(responseInfo, serial, responseType, e);
3224
3225 hidl_vec<Call> calls;
Amit Mahajan13058cb2017-06-07 23:10:27 -07003226 if ((response == NULL && responseLen != 0)
3227 || (responseLen % sizeof(RIL_Call *)) != 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003228 RLOGE("getCurrentCallsResponse: Invalid response");
Amit Mahajan5829a472016-12-28 17:28:07 -08003229 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
Sanket Padawef220dc52017-01-02 23:46:00 -08003230 } else {
3231 int num = responseLen / sizeof(RIL_Call *);
3232 calls.resize(num);
3233
3234 for (int i = 0 ; i < num ; i++) {
3235 RIL_Call *p_cur = ((RIL_Call **) response)[i];
3236 /* each call info */
3237 calls[i].state = (CallState) p_cur->state;
3238 calls[i].index = p_cur->index;
3239 calls[i].toa = p_cur->toa;
3240 calls[i].isMpty = p_cur->isMpty;
3241 calls[i].isMT = p_cur->isMT;
3242 calls[i].als = p_cur->als;
3243 calls[i].isVoice = p_cur->isVoice;
3244 calls[i].isVoicePrivacy = p_cur->isVoicePrivacy;
3245 calls[i].number = convertCharPtrToHidlString(p_cur->number);
3246 calls[i].numberPresentation = (CallPresentation) p_cur->numberPresentation;
3247 calls[i].name = convertCharPtrToHidlString(p_cur->name);
3248 calls[i].namePresentation = (CallPresentation) p_cur->namePresentation;
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003249 if (p_cur->uusInfo != NULL && p_cur->uusInfo->uusData != NULL) {
Sanket Padawef220dc52017-01-02 23:46:00 -08003250 RIL_UUS_Info *uusInfo = p_cur->uusInfo;
Ajay Nambi83e7acd2017-09-05 15:06:22 +05303251 calls[i].uusInfo.resize(1);
Sanket Padawef220dc52017-01-02 23:46:00 -08003252 calls[i].uusInfo[0].uusType = (UusType) uusInfo->uusType;
3253 calls[i].uusInfo[0].uusDcs = (UusDcs) uusInfo->uusDcs;
3254 // convert uusInfo->uusData to a null-terminated string
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003255 char *nullTermStr = strndup(uusInfo->uusData, uusInfo->uusLength);
3256 calls[i].uusInfo[0].uusData = nullTermStr;
3257 free(nullTermStr);
Sanket Padawef220dc52017-01-02 23:46:00 -08003258 }
3259 }
3260 }
3261
Amit Mahajan17249842017-01-19 15:05:45 -08003262 Return<void> retStatus = radioService[slotId]->mRadioResponse->
3263 getCurrentCallsResponse(responseInfo, calls);
3264 radioService[slotId]->checkReturnStatus(retStatus);
Sanket Padawef220dc52017-01-02 23:46:00 -08003265 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003266 RLOGE("getCurrentCallsResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawef220dc52017-01-02 23:46:00 -08003267 }
3268
3269 return 0;
3270}
3271
Amit Mahajan759786a2017-03-03 17:35:47 -08003272int radio::dialResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003273 int responseType, int serial, RIL_Errno e, void *response,
3274 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003275#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003276 RLOGD("dialResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003277#endif
Sanket Padawef220dc52017-01-02 23:46:00 -08003278
3279 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003280 RadioResponseInfo responseInfo = {};
Sanket Padawef220dc52017-01-02 23:46:00 -08003281 populateResponseInfo(responseInfo, serial, responseType, e);
Amit Mahajan17249842017-01-19 15:05:45 -08003282 Return<void> retStatus = radioService[slotId]->mRadioResponse->dialResponse(responseInfo);
3283 radioService[slotId]->checkReturnStatus(retStatus);
Sanket Padawef220dc52017-01-02 23:46:00 -08003284 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003285 RLOGE("dialResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Amit Mahajancd77a5b2016-08-25 11:19:21 -07003286 }
3287
3288 return 0;
3289}
3290
Amit Mahajan759786a2017-03-03 17:35:47 -08003291int radio::getIMSIForAppResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003292 int responseType, int serial, RIL_Errno e, void *response,
3293 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003294#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003295 RLOGD("getIMSIForAppResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003296#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003297
3298 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003299 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003300 populateResponseInfo(responseInfo, serial, responseType, e);
3301 Return<void> retStatus = radioService[slotId]->mRadioResponse->getIMSIForAppResponse(
3302 responseInfo, convertCharPtrToHidlString((char *) response));
3303 radioService[slotId]->checkReturnStatus(retStatus);
3304 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003305 RLOGE("getIMSIForAppResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003306 slotId);
3307 }
3308
3309 return 0;
3310}
3311
Amit Mahajan759786a2017-03-03 17:35:47 -08003312int radio::hangupConnectionResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003313 int responseType, int serial, RIL_Errno e,
3314 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003315#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003316 RLOGD("hangupConnectionResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003317#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003318
3319 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003320 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003321 populateResponseInfo(responseInfo, serial, responseType, e);
3322 Return<void> retStatus = radioService[slotId]->mRadioResponse->hangupConnectionResponse(
3323 responseInfo);
3324 radioService[slotId]->checkReturnStatus(retStatus);
3325 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003326 RLOGE("hangupConnectionResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003327 slotId);
3328 }
3329
3330 return 0;
3331}
3332
Amit Mahajan759786a2017-03-03 17:35:47 -08003333int radio::hangupWaitingOrBackgroundResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003334 int responseType, int serial, RIL_Errno e,
3335 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003336#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003337 RLOGD("hangupWaitingOrBackgroundResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003338#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003339
3340 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003341 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003342 populateResponseInfo(responseInfo, serial, responseType, e);
3343 Return<void> retStatus =
3344 radioService[slotId]->mRadioResponse->hangupWaitingOrBackgroundResponse(
3345 responseInfo);
3346 radioService[slotId]->checkReturnStatus(retStatus);
3347 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003348 RLOGE("hangupWaitingOrBackgroundResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003349 slotId);
3350 }
3351
3352 return 0;
3353}
3354
Amit Mahajan759786a2017-03-03 17:35:47 -08003355int radio::hangupForegroundResumeBackgroundResponse(int slotId, int responseType, int serial,
3356 RIL_Errno e, void *response,
3357 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003358#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003359 RLOGD("hangupWaitingOrBackgroundResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003360#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003361
3362 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003363 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003364 populateResponseInfo(responseInfo, serial, responseType, e);
3365 Return<void> retStatus =
3366 radioService[slotId]->mRadioResponse->hangupWaitingOrBackgroundResponse(
3367 responseInfo);
3368 radioService[slotId]->checkReturnStatus(retStatus);
3369 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003370 RLOGE("hangupWaitingOrBackgroundResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003371 slotId);
3372 }
3373
3374 return 0;
3375}
3376
Amit Mahajan759786a2017-03-03 17:35:47 -08003377int radio::switchWaitingOrHoldingAndActiveResponse(int slotId, int responseType, int serial,
3378 RIL_Errno e, void *response,
3379 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003380#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003381 RLOGD("switchWaitingOrHoldingAndActiveResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003382#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003383
3384 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003385 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003386 populateResponseInfo(responseInfo, serial, responseType, e);
3387 Return<void> retStatus =
3388 radioService[slotId]->mRadioResponse->switchWaitingOrHoldingAndActiveResponse(
3389 responseInfo);
3390 radioService[slotId]->checkReturnStatus(retStatus);
3391 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003392 RLOGE("switchWaitingOrHoldingAndActiveResponse: radioService[%d]->mRadioResponse "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003393 "== NULL", slotId);
3394 }
3395
3396 return 0;
3397}
3398
Amit Mahajan759786a2017-03-03 17:35:47 -08003399int radio::conferenceResponse(int slotId, int responseType,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003400 int serial, RIL_Errno e, void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003401#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003402 RLOGD("conferenceResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003403#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003404
3405 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003406 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003407 populateResponseInfo(responseInfo, serial, responseType, e);
3408 Return<void> retStatus = radioService[slotId]->mRadioResponse->conferenceResponse(
3409 responseInfo);
3410 radioService[slotId]->checkReturnStatus(retStatus);
3411 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003412 RLOGE("conferenceResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003413 slotId);
3414 }
3415
3416 return 0;
3417}
3418
Amit Mahajan759786a2017-03-03 17:35:47 -08003419int radio::rejectCallResponse(int slotId, int responseType,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003420 int serial, RIL_Errno e, void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003421#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003422 RLOGD("rejectCallResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003423#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003424
3425 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003426 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003427 populateResponseInfo(responseInfo, serial, responseType, e);
3428 Return<void> retStatus = radioService[slotId]->mRadioResponse->rejectCallResponse(
3429 responseInfo);
3430 radioService[slotId]->checkReturnStatus(retStatus);
3431 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003432 RLOGE("rejectCallResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003433 slotId);
3434 }
3435
3436 return 0;
3437}
3438
Amit Mahajan759786a2017-03-03 17:35:47 -08003439int radio::getLastCallFailCauseResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003440 int responseType, int serial, RIL_Errno e, void *response,
3441 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003442#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003443 RLOGD("getLastCallFailCauseResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003444#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003445
3446 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003447 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003448 populateResponseInfo(responseInfo, serial, responseType, e);
Jack Yuf68e0da2017-02-07 14:53:09 -08003449
3450 LastCallFailCauseInfo info = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003451 info.vendorCause = hidl_string();
3452 if (response == NULL) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003453 RLOGE("getCurrentCallsResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003454 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
3455 } else if (responseLen == sizeof(int)) {
3456 int *pInt = (int *) response;
3457 info.causeCode = (LastCallFailCause) pInt[0];
3458 } else if (responseLen == sizeof(RIL_LastCallFailCauseInfo)) {
3459 RIL_LastCallFailCauseInfo *pFailCauseInfo = (RIL_LastCallFailCauseInfo *) response;
3460 info.causeCode = (LastCallFailCause) pFailCauseInfo->cause_code;
3461 info.vendorCause = convertCharPtrToHidlString(pFailCauseInfo->vendor_cause);
3462 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003463 RLOGE("getCurrentCallsResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003464 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
3465 }
3466
3467 Return<void> retStatus = radioService[slotId]->mRadioResponse->getLastCallFailCauseResponse(
3468 responseInfo, info);
3469 radioService[slotId]->checkReturnStatus(retStatus);
3470 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003471 RLOGE("getLastCallFailCauseResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003472 slotId);
3473 }
3474
3475 return 0;
3476}
3477
Amit Mahajan759786a2017-03-03 17:35:47 -08003478int radio::getSignalStrengthResponse(int slotId,
Amit Mahajan3df62912017-02-10 01:35:55 +00003479 int responseType, int serial, RIL_Errno e,
3480 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003481#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003482 RLOGD("getSignalStrengthResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003483#endif
Amit Mahajan3df62912017-02-10 01:35:55 +00003484
3485 if (radioService[slotId]->mRadioResponse != NULL) {
Amit Mahajan3da9ac02017-02-13 13:41:28 -08003486 RadioResponseInfo responseInfo = {};
Amit Mahajan3df62912017-02-10 01:35:55 +00003487 populateResponseInfo(responseInfo, serial, responseType, e);
Amit Mahajan3da9ac02017-02-13 13:41:28 -08003488 SignalStrength signalStrength = {};
Amit Mahajan3df62912017-02-10 01:35:55 +00003489 if (response == NULL || responseLen != sizeof(RIL_SignalStrength_v10)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003490 RLOGE("getSignalStrengthResponse: Invalid response");
Amit Mahajan3df62912017-02-10 01:35:55 +00003491 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
3492 } else {
3493 convertRilSignalStrengthToHal(response, responseLen, signalStrength);
3494 }
3495
3496 Return<void> retStatus = radioService[slotId]->mRadioResponse->getSignalStrengthResponse(
3497 responseInfo, signalStrength);
3498 radioService[slotId]->checkReturnStatus(retStatus);
3499 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003500 RLOGE("getSignalStrengthResponse: radioService[%d]->mRadioResponse == NULL",
Amit Mahajan3df62912017-02-10 01:35:55 +00003501 slotId);
3502 }
3503
3504 return 0;
3505}
3506
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003507RIL_CellInfoType getCellInfoTypeRadioTechnology(char *rat) {
3508 if (rat == NULL) {
3509 return RIL_CELL_INFO_TYPE_NONE;
3510 }
3511
3512 int radioTech = atoi(rat);
3513
3514 switch(radioTech) {
3515
3516 case RADIO_TECH_GPRS:
3517 case RADIO_TECH_EDGE:
3518 case RADIO_TECH_GSM: {
3519 return RIL_CELL_INFO_TYPE_GSM;
3520 }
3521
3522 case RADIO_TECH_UMTS:
3523 case RADIO_TECH_HSDPA:
3524 case RADIO_TECH_HSUPA:
3525 case RADIO_TECH_HSPA:
3526 case RADIO_TECH_HSPAP: {
3527 return RIL_CELL_INFO_TYPE_WCDMA;
3528 }
3529
3530 case RADIO_TECH_IS95A:
3531 case RADIO_TECH_IS95B:
3532 case RADIO_TECH_1xRTT:
3533 case RADIO_TECH_EVDO_0:
3534 case RADIO_TECH_EVDO_A:
3535 case RADIO_TECH_EVDO_B:
3536 case RADIO_TECH_EHRPD: {
3537 return RIL_CELL_INFO_TYPE_CDMA;
3538 }
3539
3540 case RADIO_TECH_LTE:
3541 case RADIO_TECH_LTE_CA: {
3542 return RIL_CELL_INFO_TYPE_LTE;
3543 }
3544
3545 case RADIO_TECH_TD_SCDMA: {
3546 return RIL_CELL_INFO_TYPE_TD_SCDMA;
3547 }
3548
3549 default: {
3550 break;
3551 }
3552 }
3553
3554 return RIL_CELL_INFO_TYPE_NONE;
3555
3556}
3557
3558void fillCellIdentityResponse(CellIdentity &cellIdentity, RIL_CellIdentity_v16 &rilCellIdentity) {
3559
3560 cellIdentity.cellIdentityGsm.resize(0);
3561 cellIdentity.cellIdentityWcdma.resize(0);
3562 cellIdentity.cellIdentityCdma.resize(0);
3563 cellIdentity.cellIdentityTdscdma.resize(0);
3564 cellIdentity.cellIdentityLte.resize(0);
3565 cellIdentity.cellInfoType = (CellInfoType)rilCellIdentity.cellInfoType;
3566 switch(rilCellIdentity.cellInfoType) {
3567
3568 case RIL_CELL_INFO_TYPE_GSM: {
3569 cellIdentity.cellIdentityGsm.resize(1);
3570 cellIdentity.cellIdentityGsm[0].mcc =
3571 std::to_string(rilCellIdentity.cellIdentityGsm.mcc);
3572 cellIdentity.cellIdentityGsm[0].mnc =
Nathan Harold98cfcee2018-08-20 11:38:27 -07003573 ril::util::mnc::decode(rilCellIdentity.cellIdentityGsm.mnc);
Gohulan Balachandran453c8352019-02-05 11:20:46 -08003574
3575 if (cellIdentity.cellIdentityGsm[0].mcc == "-1") {
3576 cellIdentity.cellIdentityGsm[0].mcc = "";
3577 }
3578
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003579 cellIdentity.cellIdentityGsm[0].lac = rilCellIdentity.cellIdentityGsm.lac;
3580 cellIdentity.cellIdentityGsm[0].cid = rilCellIdentity.cellIdentityGsm.cid;
3581 cellIdentity.cellIdentityGsm[0].arfcn = rilCellIdentity.cellIdentityGsm.arfcn;
3582 cellIdentity.cellIdentityGsm[0].bsic = rilCellIdentity.cellIdentityGsm.bsic;
3583 break;
3584 }
3585
3586 case RIL_CELL_INFO_TYPE_WCDMA: {
3587 cellIdentity.cellIdentityWcdma.resize(1);
3588 cellIdentity.cellIdentityWcdma[0].mcc =
3589 std::to_string(rilCellIdentity.cellIdentityWcdma.mcc);
3590 cellIdentity.cellIdentityWcdma[0].mnc =
Nathan Harold98cfcee2018-08-20 11:38:27 -07003591 ril::util::mnc::decode(rilCellIdentity.cellIdentityWcdma.mnc);
Gohulan Balachandran453c8352019-02-05 11:20:46 -08003592
3593 if (cellIdentity.cellIdentityWcdma[0].mcc == "-1") {
3594 cellIdentity.cellIdentityWcdma[0].mcc = "";
3595 }
3596
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003597 cellIdentity.cellIdentityWcdma[0].lac = rilCellIdentity.cellIdentityWcdma.lac;
3598 cellIdentity.cellIdentityWcdma[0].cid = rilCellIdentity.cellIdentityWcdma.cid;
3599 cellIdentity.cellIdentityWcdma[0].psc = rilCellIdentity.cellIdentityWcdma.psc;
3600 cellIdentity.cellIdentityWcdma[0].uarfcn = rilCellIdentity.cellIdentityWcdma.uarfcn;
3601 break;
3602 }
3603
3604 case RIL_CELL_INFO_TYPE_CDMA: {
3605 cellIdentity.cellIdentityCdma.resize(1);
3606 cellIdentity.cellIdentityCdma[0].networkId = rilCellIdentity.cellIdentityCdma.networkId;
3607 cellIdentity.cellIdentityCdma[0].systemId = rilCellIdentity.cellIdentityCdma.systemId;
3608 cellIdentity.cellIdentityCdma[0].baseStationId =
3609 rilCellIdentity.cellIdentityCdma.basestationId;
3610 cellIdentity.cellIdentityCdma[0].longitude = rilCellIdentity.cellIdentityCdma.longitude;
3611 cellIdentity.cellIdentityCdma[0].latitude = rilCellIdentity.cellIdentityCdma.latitude;
3612 break;
3613 }
3614
3615 case RIL_CELL_INFO_TYPE_LTE: {
3616 cellIdentity.cellIdentityLte.resize(1);
3617 cellIdentity.cellIdentityLte[0].mcc =
3618 std::to_string(rilCellIdentity.cellIdentityLte.mcc);
3619 cellIdentity.cellIdentityLte[0].mnc =
Nathan Harold98cfcee2018-08-20 11:38:27 -07003620 ril::util::mnc::decode(rilCellIdentity.cellIdentityLte.mnc);
Gohulan Balachandran453c8352019-02-05 11:20:46 -08003621
3622 if (cellIdentity.cellIdentityLte[0].mcc == "-1") {
3623 cellIdentity.cellIdentityLte[0].mcc = "";
3624 }
3625
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003626 cellIdentity.cellIdentityLte[0].ci = rilCellIdentity.cellIdentityLte.ci;
3627 cellIdentity.cellIdentityLte[0].pci = rilCellIdentity.cellIdentityLte.pci;
3628 cellIdentity.cellIdentityLte[0].tac = rilCellIdentity.cellIdentityLte.tac;
3629 cellIdentity.cellIdentityLte[0].earfcn = rilCellIdentity.cellIdentityLte.earfcn;
3630 break;
3631 }
3632
3633 case RIL_CELL_INFO_TYPE_TD_SCDMA: {
3634 cellIdentity.cellIdentityTdscdma.resize(1);
3635 cellIdentity.cellIdentityTdscdma[0].mcc =
3636 std::to_string(rilCellIdentity.cellIdentityTdscdma.mcc);
3637 cellIdentity.cellIdentityTdscdma[0].mnc =
Nathan Harold98cfcee2018-08-20 11:38:27 -07003638 ril::util::mnc::decode(rilCellIdentity.cellIdentityTdscdma.mnc);
Gohulan Balachandran453c8352019-02-05 11:20:46 -08003639
3640 if (cellIdentity.cellIdentityTdscdma[0].mcc == "-1") {
3641 cellIdentity.cellIdentityTdscdma[0].mcc = "";
3642 }
3643
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003644 cellIdentity.cellIdentityTdscdma[0].lac = rilCellIdentity.cellIdentityTdscdma.lac;
3645 cellIdentity.cellIdentityTdscdma[0].cid = rilCellIdentity.cellIdentityTdscdma.cid;
3646 cellIdentity.cellIdentityTdscdma[0].cpid = rilCellIdentity.cellIdentityTdscdma.cpid;
3647 break;
3648 }
3649
3650 default: {
3651 break;
3652 }
3653 }
3654}
3655
3656int convertResponseStringEntryToInt(char **response, int index, int numStrings) {
3657 if ((response != NULL) && (numStrings > index) && (response[index] != NULL)) {
3658 return atoi(response[index]);
3659 }
3660
3661 return -1;
3662}
3663
Sooraj Sasindran758ee462017-06-07 16:30:18 -07003664int convertResponseHexStringEntryToInt(char **response, int index, int numStrings) {
3665 const int hexBase = 16;
3666 if ((response != NULL) && (numStrings > index) && (response[index] != NULL)) {
3667 return strtol(response[index], NULL, hexBase);
3668 }
3669
3670 return -1;
3671}
3672
3673/* Fill Cell Identity info from Voice Registration State Response.
3674 * This fucntion is applicable only for RIL Version < 15.
3675 * Response is a "char **".
3676 * First and Second entries are in hex string format
3677 * and rest are integers represented in ascii format. */
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003678void fillCellIdentityFromVoiceRegStateResponseString(CellIdentity &cellIdentity,
3679 int numStrings, char** response) {
3680
3681 RIL_CellIdentity_v16 rilCellIdentity;
Jack Yu8e732d42017-04-14 00:08:06 -07003682 memset(&rilCellIdentity, -1, sizeof(RIL_CellIdentity_v16));
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003683
3684 rilCellIdentity.cellInfoType = getCellInfoTypeRadioTechnology(response[3]);
3685 switch(rilCellIdentity.cellInfoType) {
3686
3687 case RIL_CELL_INFO_TYPE_GSM: {
Sooraj Sasindran758ee462017-06-07 16:30:18 -07003688 /* valid LAC are hexstrings in the range 0x0000 - 0xffff */
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003689 rilCellIdentity.cellIdentityGsm.lac =
Sooraj Sasindran758ee462017-06-07 16:30:18 -07003690 convertResponseHexStringEntryToInt(response, 1, numStrings);
3691
3692 /* valid CID are hexstrings in the range 0x00000000 - 0xffffffff */
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003693 rilCellIdentity.cellIdentityGsm.cid =
Sooraj Sasindran758ee462017-06-07 16:30:18 -07003694 convertResponseHexStringEntryToInt(response, 2, numStrings);
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003695 break;
3696 }
3697
3698 case RIL_CELL_INFO_TYPE_WCDMA: {
Sooraj Sasindran758ee462017-06-07 16:30:18 -07003699 /* valid LAC are hexstrings in the range 0x0000 - 0xffff */
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003700 rilCellIdentity.cellIdentityWcdma.lac =
Sooraj Sasindran758ee462017-06-07 16:30:18 -07003701 convertResponseHexStringEntryToInt(response, 1, numStrings);
3702
3703 /* valid CID are hexstrings in the range 0x00000000 - 0xffffffff */
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003704 rilCellIdentity.cellIdentityWcdma.cid =
Sooraj Sasindran758ee462017-06-07 16:30:18 -07003705 convertResponseHexStringEntryToInt(response, 2, numStrings);
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003706 rilCellIdentity.cellIdentityWcdma.psc =
3707 convertResponseStringEntryToInt(response, 14, numStrings);
3708 break;
3709 }
3710
3711 case RIL_CELL_INFO_TYPE_TD_SCDMA:{
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.cellIdentityTdscdma.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.cellIdentityTdscdma.cid =
Sooraj Sasindran758ee462017-06-07 16:30:18 -07003718 convertResponseHexStringEntryToInt(response, 2, numStrings);
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003719 break;
3720 }
3721
3722 case RIL_CELL_INFO_TYPE_CDMA:{
3723 rilCellIdentity.cellIdentityCdma.basestationId =
3724 convertResponseStringEntryToInt(response, 4, numStrings);
Nathan Harold35afd642017-07-07 17:12:04 -07003725 /* Order of Lat. and Long. swapped between RIL and HIDL interface versions. */
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003726 rilCellIdentity.cellIdentityCdma.latitude =
Nathan Harold35afd642017-07-07 17:12:04 -07003727 convertResponseStringEntryToInt(response, 5, numStrings);
3728 rilCellIdentity.cellIdentityCdma.longitude =
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003729 convertResponseStringEntryToInt(response, 6, numStrings);
3730 rilCellIdentity.cellIdentityCdma.systemId =
3731 convertResponseStringEntryToInt(response, 8, numStrings);
3732 rilCellIdentity.cellIdentityCdma.networkId =
3733 convertResponseStringEntryToInt(response, 9, numStrings);
3734 break;
3735 }
3736
Sooraj Sasindranf28e42a2017-03-06 23:07:22 -08003737 case RIL_CELL_INFO_TYPE_LTE:{
Sooraj Sasindran758ee462017-06-07 16:30:18 -07003738 /* valid TAC are hexstrings in the range 0x0000 - 0xffff */
Sooraj Sasindranf28e42a2017-03-06 23:07:22 -08003739 rilCellIdentity.cellIdentityLte.tac =
Sooraj Sasindran758ee462017-06-07 16:30:18 -07003740 convertResponseHexStringEntryToInt(response, 1, numStrings);
3741
3742 /* valid CID are hexstrings in the range 0x00000000 - 0xffffffff */
Sooraj Sasindranf28e42a2017-03-06 23:07:22 -08003743 rilCellIdentity.cellIdentityLte.ci =
Sooraj Sasindran758ee462017-06-07 16:30:18 -07003744 convertResponseHexStringEntryToInt(response, 2, numStrings);
Sooraj Sasindranf28e42a2017-03-06 23:07:22 -08003745 break;
3746 }
3747
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003748 default: {
3749 break;
3750 }
3751 }
3752
3753 fillCellIdentityResponse(cellIdentity, rilCellIdentity);
3754}
3755
Sooraj Sasindran758ee462017-06-07 16:30:18 -07003756/* Fill Cell Identity info from Data Registration State Response.
3757 * This fucntion is applicable only for RIL Version < 15.
3758 * Response is a "char **".
3759 * First and Second entries are in hex string format
3760 * and rest are integers represented in ascii format. */
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003761void fillCellIdentityFromDataRegStateResponseString(CellIdentity &cellIdentity,
3762 int numStrings, char** response) {
3763
3764 RIL_CellIdentity_v16 rilCellIdentity;
Jack Yu8e732d42017-04-14 00:08:06 -07003765 memset(&rilCellIdentity, -1, sizeof(RIL_CellIdentity_v16));
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003766
3767 rilCellIdentity.cellInfoType = getCellInfoTypeRadioTechnology(response[3]);
3768 switch(rilCellIdentity.cellInfoType) {
3769 case RIL_CELL_INFO_TYPE_GSM: {
Sooraj Sasindran758ee462017-06-07 16:30:18 -07003770 /* valid LAC are hexstrings in the range 0x0000 - 0xffff */
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003771 rilCellIdentity.cellIdentityGsm.lac =
Sooraj Sasindran758ee462017-06-07 16:30:18 -07003772 convertResponseHexStringEntryToInt(response, 1, numStrings);
3773
3774 /* valid CID are hexstrings in the range 0x00000000 - 0xffffffff */
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003775 rilCellIdentity.cellIdentityGsm.cid =
Sooraj Sasindran758ee462017-06-07 16:30:18 -07003776 convertResponseHexStringEntryToInt(response, 2, numStrings);
Gohulan Balachandran453c8352019-02-05 11:20:46 -08003777
3778 if (numStrings >= 13) {
3779 rilCellIdentity.cellIdentityGsm.mcc =
3780 convertResponseStringEntryToInt(response, 11, numStrings);
3781
3782 rilCellIdentity.cellIdentityGsm.mnc =
3783 convertResponseStringEntryToInt(response, 12, numStrings);
3784 }
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003785 break;
3786 }
3787 case RIL_CELL_INFO_TYPE_WCDMA: {
Sooraj Sasindran758ee462017-06-07 16:30:18 -07003788 /* valid LAC are hexstrings in the range 0x0000 - 0xffff */
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003789 rilCellIdentity.cellIdentityWcdma.lac =
Sooraj Sasindran758ee462017-06-07 16:30:18 -07003790 convertResponseHexStringEntryToInt(response, 1, numStrings);
3791
3792 /* valid CID are hexstrings in the range 0x00000000 - 0xffffffff */
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003793 rilCellIdentity.cellIdentityWcdma.cid =
Sooraj Sasindran758ee462017-06-07 16:30:18 -07003794 convertResponseHexStringEntryToInt(response, 2, numStrings);
Gohulan Balachandran453c8352019-02-05 11:20:46 -08003795
3796 if (numStrings >= 13) {
3797 rilCellIdentity.cellIdentityWcdma.mcc =
3798 convertResponseStringEntryToInt(response, 11, numStrings);
3799
3800 rilCellIdentity.cellIdentityWcdma.mnc =
3801 convertResponseStringEntryToInt(response, 12, numStrings);
3802 }
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003803 break;
3804 }
3805 case RIL_CELL_INFO_TYPE_TD_SCDMA:{
Sooraj Sasindran758ee462017-06-07 16:30:18 -07003806 /* valid LAC are hexstrings in the range 0x0000 - 0xffff */
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003807 rilCellIdentity.cellIdentityTdscdma.lac =
Sooraj Sasindran758ee462017-06-07 16:30:18 -07003808 convertResponseHexStringEntryToInt(response, 1, numStrings);
3809
3810 /* valid CID are hexstrings in the range 0x00000000 - 0xffffffff */
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003811 rilCellIdentity.cellIdentityTdscdma.cid =
Sooraj Sasindran758ee462017-06-07 16:30:18 -07003812 convertResponseHexStringEntryToInt(response, 2, numStrings);
Gohulan Balachandran453c8352019-02-05 11:20:46 -08003813
3814 if (numStrings >= 13) {
3815 rilCellIdentity.cellIdentityTdscdma.mcc =
3816 convertResponseStringEntryToInt(response, 11, numStrings);
3817
3818 rilCellIdentity.cellIdentityTdscdma.mnc =
3819 convertResponseStringEntryToInt(response, 12, numStrings);
3820 }
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003821 break;
3822 }
3823 case RIL_CELL_INFO_TYPE_LTE: {
3824 rilCellIdentity.cellIdentityLte.tac =
3825 convertResponseStringEntryToInt(response, 6, numStrings);
3826 rilCellIdentity.cellIdentityLte.pci =
3827 convertResponseStringEntryToInt(response, 7, numStrings);
3828 rilCellIdentity.cellIdentityLte.ci =
3829 convertResponseStringEntryToInt(response, 8, numStrings);
Gohulan Balachandran453c8352019-02-05 11:20:46 -08003830
3831 if (numStrings >= 13) {
3832 rilCellIdentity.cellIdentityLte.mcc =
3833 convertResponseStringEntryToInt(response, 11, numStrings);
3834
3835 rilCellIdentity.cellIdentityLte.mnc =
3836 convertResponseStringEntryToInt(response, 12, numStrings);
3837 }
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003838 break;
3839 }
3840 default: {
3841 break;
3842 }
3843 }
3844
3845 fillCellIdentityResponse(cellIdentity, rilCellIdentity);
3846}
3847
Amit Mahajan759786a2017-03-03 17:35:47 -08003848int radio::getVoiceRegistrationStateResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003849 int responseType, int serial, RIL_Errno e,
3850 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003851#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003852 RLOGD("getVoiceRegistrationStateResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003853#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003854
3855 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003856 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003857 populateResponseInfo(responseInfo, serial, responseType, e);
3858
Jack Yuf68e0da2017-02-07 14:53:09 -08003859 VoiceRegStateResult voiceRegResponse = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003860 int numStrings = responseLen / sizeof(char *);
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003861 if (response == NULL) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003862 RLOGE("getVoiceRegistrationStateResponse Invalid response: NULL");
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003863 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
3864 } else if (s_vendorFunctions->version <= 14) {
3865 if (numStrings != 15) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003866 RLOGE("getVoiceRegistrationStateResponse Invalid response: NULL");
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003867 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
3868 } else {
3869 char **resp = (char **) response;
3870 voiceRegResponse.regState = (RegState) ATOI_NULL_HANDLED_DEF(resp[0], 4);
3871 voiceRegResponse.rat = ATOI_NULL_HANDLED(resp[3]);
3872 voiceRegResponse.cssSupported = ATOI_NULL_HANDLED_DEF(resp[7], 0);
3873 voiceRegResponse.roamingIndicator = ATOI_NULL_HANDLED(resp[10]);
3874 voiceRegResponse.systemIsInPrl = ATOI_NULL_HANDLED_DEF(resp[11], 0);
3875 voiceRegResponse.defaultRoamingIndicator = ATOI_NULL_HANDLED_DEF(resp[12], 0);
3876 voiceRegResponse.reasonForDenial = ATOI_NULL_HANDLED_DEF(resp[13], 0);
3877 fillCellIdentityFromVoiceRegStateResponseString(voiceRegResponse.cellIdentity,
3878 numStrings, resp);
3879 }
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003880 } else {
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003881 RIL_VoiceRegistrationStateResponse *voiceRegState =
3882 (RIL_VoiceRegistrationStateResponse *)response;
3883
3884 if (responseLen != sizeof(RIL_VoiceRegistrationStateResponse)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003885 RLOGE("getVoiceRegistrationStateResponse Invalid response: NULL");
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003886 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
3887 } else {
3888 voiceRegResponse.regState = (RegState) voiceRegState->regState;
3889 voiceRegResponse.rat = voiceRegState->rat;;
3890 voiceRegResponse.cssSupported = voiceRegState->cssSupported;
3891 voiceRegResponse.roamingIndicator = voiceRegState->roamingIndicator;
3892 voiceRegResponse.systemIsInPrl = voiceRegState->systemIsInPrl;
3893 voiceRegResponse.defaultRoamingIndicator = voiceRegState->defaultRoamingIndicator;
3894 voiceRegResponse.reasonForDenial = voiceRegState->reasonForDenial;
3895 fillCellIdentityResponse(voiceRegResponse.cellIdentity,
3896 voiceRegState->cellIdentity);
3897 }
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003898 }
3899
3900 Return<void> retStatus =
3901 radioService[slotId]->mRadioResponse->getVoiceRegistrationStateResponse(
3902 responseInfo, voiceRegResponse);
3903 radioService[slotId]->checkReturnStatus(retStatus);
3904 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003905 RLOGE("getVoiceRegistrationStateResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003906 slotId);
3907 }
3908
3909 return 0;
3910}
3911
Amit Mahajan759786a2017-03-03 17:35:47 -08003912int radio::getDataRegistrationStateResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003913 int responseType, int serial, RIL_Errno e,
3914 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003915#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003916 RLOGD("getDataRegistrationStateResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003917#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003918
3919 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003920 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003921 populateResponseInfo(responseInfo, serial, responseType, e);
Jack Yuf68e0da2017-02-07 14:53:09 -08003922 DataRegStateResult dataRegResponse = {};
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003923 if (response == NULL) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003924 RLOGE("getDataRegistrationStateResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003925 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003926 } else if (s_vendorFunctions->version <= 14) {
3927 int numStrings = responseLen / sizeof(char *);
Gohulan Balachandran453c8352019-02-05 11:20:46 -08003928 if ((numStrings != 6) && (numStrings != 11) && (numStrings != 13)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003929 RLOGE("getDataRegistrationStateResponse Invalid response: NULL");
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003930 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
3931 } else {
3932 char **resp = (char **) response;
3933 dataRegResponse.regState = (RegState) ATOI_NULL_HANDLED_DEF(resp[0], 4);
3934 dataRegResponse.rat = ATOI_NULL_HANDLED_DEF(resp[3], 0);
3935 dataRegResponse.reasonDataDenied = ATOI_NULL_HANDLED(resp[4]);
3936 dataRegResponse.maxDataCalls = ATOI_NULL_HANDLED_DEF(resp[5], 1);
3937 fillCellIdentityFromDataRegStateResponseString(dataRegResponse.cellIdentity,
3938 numStrings, resp);
3939 }
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003940 } else {
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003941 RIL_DataRegistrationStateResponse *dataRegState =
3942 (RIL_DataRegistrationStateResponse *)response;
3943
3944 if (responseLen != sizeof(RIL_DataRegistrationStateResponse)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003945 RLOGE("getDataRegistrationStateResponse Invalid response: NULL");
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003946 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
3947 } else {
3948 dataRegResponse.regState = (RegState) dataRegState->regState;
3949 dataRegResponse.rat = dataRegState->rat;;
3950 dataRegResponse.reasonDataDenied = dataRegState->reasonDataDenied;
3951 dataRegResponse.maxDataCalls = dataRegState->maxDataCalls;
3952 fillCellIdentityResponse(dataRegResponse.cellIdentity, dataRegState->cellIdentity);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003953 }
3954 }
3955
3956 Return<void> retStatus =
3957 radioService[slotId]->mRadioResponse->getDataRegistrationStateResponse(responseInfo,
3958 dataRegResponse);
3959 radioService[slotId]->checkReturnStatus(retStatus);
3960 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003961 RLOGE("getDataRegistrationStateResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003962 slotId);
3963 }
3964
3965 return 0;
3966}
3967
Amit Mahajan759786a2017-03-03 17:35:47 -08003968int radio::getOperatorResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003969 int responseType, int serial, RIL_Errno e, void *response,
3970 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003971#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003972 RLOGD("getOperatorResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003973#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003974
3975 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003976 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003977 populateResponseInfo(responseInfo, serial, responseType, e);
3978 hidl_string longName;
3979 hidl_string shortName;
3980 hidl_string numeric;
3981 int numStrings = responseLen / sizeof(char *);
3982 if (response == NULL || numStrings != 3) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003983 RLOGE("getOperatorResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003984 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
3985
3986 } else {
3987 char **resp = (char **) response;
3988 longName = convertCharPtrToHidlString(resp[0]);
3989 shortName = convertCharPtrToHidlString(resp[1]);
3990 numeric = convertCharPtrToHidlString(resp[2]);
3991 }
3992 Return<void> retStatus = radioService[slotId]->mRadioResponse->getOperatorResponse(
3993 responseInfo, longName, shortName, numeric);
3994 radioService[slotId]->checkReturnStatus(retStatus);
3995 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003996 RLOGE("getOperatorResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003997 slotId);
3998 }
3999
4000 return 0;
4001}
4002
Amit Mahajan759786a2017-03-03 17:35:47 -08004003int radio::setRadioPowerResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004004 int responseType, int serial, RIL_Errno e, void *response,
4005 size_t responseLen) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004006 RLOGD("setRadioPowerResponse: serial %d", serial);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004007
4008 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004009 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004010 populateResponseInfo(responseInfo, serial, responseType, e);
4011 Return<void> retStatus = radioService[slotId]->mRadioResponse->setRadioPowerResponse(
4012 responseInfo);
4013 radioService[slotId]->checkReturnStatus(retStatus);
4014 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004015 RLOGE("setRadioPowerResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004016 slotId);
4017 }
4018
4019 return 0;
4020}
4021
Amit Mahajan759786a2017-03-03 17:35:47 -08004022int radio::sendDtmfResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004023 int responseType, int serial, RIL_Errno e, void *response,
4024 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004025#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004026 RLOGD("sendDtmfResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004027#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004028
4029 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004030 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004031 populateResponseInfo(responseInfo, serial, responseType, e);
4032 Return<void> retStatus = radioService[slotId]->mRadioResponse->sendDtmfResponse(
4033 responseInfo);
4034 radioService[slotId]->checkReturnStatus(retStatus);
4035 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004036 RLOGE("sendDtmfResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004037 slotId);
4038 }
4039
4040 return 0;
4041}
4042
4043SendSmsResult makeSendSmsResult(RadioResponseInfo& responseInfo, int serial, int responseType,
4044 RIL_Errno e, void *response, size_t responseLen) {
4045 populateResponseInfo(responseInfo, serial, responseType, e);
Jack Yuf68e0da2017-02-07 14:53:09 -08004046 SendSmsResult result = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004047
4048 if (response == NULL || responseLen != sizeof(RIL_SMS_Response)) {
4049 RLOGE("Invalid response: NULL");
4050 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004051 result.ackPDU = hidl_string();
4052 } else {
4053 RIL_SMS_Response *resp = (RIL_SMS_Response *) response;
4054 result.messageRef = resp->messageRef;
4055 result.ackPDU = convertCharPtrToHidlString(resp->ackPDU);
4056 result.errorCode = resp->errorCode;
4057 }
4058 return result;
4059}
4060
Amit Mahajan759786a2017-03-03 17:35:47 -08004061int radio::sendSmsResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004062 int responseType, int serial, RIL_Errno e, void *response,
4063 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004064#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004065 RLOGD("sendSmsResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004066#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004067
4068 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004069 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004070 SendSmsResult result = makeSendSmsResult(responseInfo, serial, responseType, e, response,
4071 responseLen);
4072
4073 Return<void> retStatus = radioService[slotId]->mRadioResponse->sendSmsResponse(responseInfo,
4074 result);
4075 radioService[slotId]->checkReturnStatus(retStatus);
4076 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004077 RLOGE("sendSmsResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004078 }
4079
4080 return 0;
4081}
4082
Amit Mahajan759786a2017-03-03 17:35:47 -08004083int radio::sendSMSExpectMoreResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004084 int responseType, int serial, RIL_Errno e, void *response,
4085 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004086#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004087 RLOGD("sendSMSExpectMoreResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004088#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004089
4090 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004091 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004092 SendSmsResult result = makeSendSmsResult(responseInfo, serial, responseType, e, response,
4093 responseLen);
4094
4095 Return<void> retStatus = radioService[slotId]->mRadioResponse->sendSMSExpectMoreResponse(
4096 responseInfo, result);
4097 radioService[slotId]->checkReturnStatus(retStatus);
4098 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004099 RLOGE("sendSMSExpectMoreResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004100 }
4101
4102 return 0;
4103}
4104
Amit Mahajan759786a2017-03-03 17:35:47 -08004105int radio::setupDataCallResponse(int slotId,
Amit Mahajan3df62912017-02-10 01:35:55 +00004106 int responseType, int serial, RIL_Errno e, void *response,
4107 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004108#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004109 RLOGD("setupDataCallResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004110#endif
Amit Mahajan3df62912017-02-10 01:35:55 +00004111
4112 if (radioService[slotId]->mRadioResponse != NULL) {
Amit Mahajan3da9ac02017-02-13 13:41:28 -08004113 RadioResponseInfo responseInfo = {};
Amit Mahajan3df62912017-02-10 01:35:55 +00004114 populateResponseInfo(responseInfo, serial, responseType, e);
4115
Amit Mahajan3da9ac02017-02-13 13:41:28 -08004116 SetupDataCallResult result = {};
Amit Mahajan13058cb2017-06-07 23:10:27 -07004117 if (response == NULL || (responseLen % sizeof(RIL_Data_Call_Response_v11)) != 0) {
4118 if (response != NULL) {
4119 RLOGE("setupDataCallResponse: Invalid response");
4120 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
4121 }
Jack Yu5079e182017-02-28 15:21:18 -08004122 result.status = DataCallFailCause::ERROR_UNSPECIFIED;
Amit Mahajan3da9ac02017-02-13 13:41:28 -08004123 result.type = hidl_string();
4124 result.ifname = hidl_string();
4125 result.addresses = hidl_string();
4126 result.dnses = hidl_string();
4127 result.gateways = hidl_string();
4128 result.pcscf = hidl_string();
Amit Mahajan3df62912017-02-10 01:35:55 +00004129 } else {
4130 convertRilDataCallToHal((RIL_Data_Call_Response_v11 *) response, result);
4131 }
4132
4133 Return<void> retStatus = radioService[slotId]->mRadioResponse->setupDataCallResponse(
4134 responseInfo, result);
4135 radioService[slotId]->checkReturnStatus(retStatus);
4136 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004137 RLOGE("setupDataCallResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Amit Mahajan3df62912017-02-10 01:35:55 +00004138 }
4139
4140 return 0;
4141}
4142
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004143IccIoResult responseIccIo(RadioResponseInfo& responseInfo, int serial, int responseType,
4144 RIL_Errno e, void *response, size_t responseLen) {
4145 populateResponseInfo(responseInfo, serial, responseType, e);
Jack Yuf68e0da2017-02-07 14:53:09 -08004146 IccIoResult result = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004147
4148 if (response == NULL || responseLen != sizeof(RIL_SIM_IO_Response)) {
4149 RLOGE("Invalid response: NULL");
4150 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004151 result.simResponse = hidl_string();
4152 } else {
4153 RIL_SIM_IO_Response *resp = (RIL_SIM_IO_Response *) response;
4154 result.sw1 = resp->sw1;
4155 result.sw2 = resp->sw2;
4156 result.simResponse = convertCharPtrToHidlString(resp->simResponse);
4157 }
4158 return result;
4159}
4160
Amit Mahajan759786a2017-03-03 17:35:47 -08004161int radio::iccIOForAppResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004162 int responseType, int serial, RIL_Errno e, void *response,
4163 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004164#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004165 RLOGD("iccIOForAppResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004166#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004167
4168 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004169 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004170 IccIoResult result = responseIccIo(responseInfo, serial, responseType, e, response,
4171 responseLen);
4172
4173 Return<void> retStatus = radioService[slotId]->mRadioResponse->iccIOForAppResponse(
4174 responseInfo, result);
4175 radioService[slotId]->checkReturnStatus(retStatus);
4176 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004177 RLOGE("iccIOForAppResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004178 }
4179
4180 return 0;
4181}
4182
Amit Mahajan759786a2017-03-03 17:35:47 -08004183int radio::sendUssdResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004184 int responseType, int serial, RIL_Errno e, void *response,
4185 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004186#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004187 RLOGD("sendUssdResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004188#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004189
4190 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004191 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004192 populateResponseInfo(responseInfo, serial, responseType, e);
4193 Return<void> retStatus = radioService[slotId]->mRadioResponse->sendUssdResponse(
4194 responseInfo);
4195 radioService[slotId]->checkReturnStatus(retStatus);
4196 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004197 RLOGE("sendUssdResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004198 slotId);
4199 }
4200
4201 return 0;
4202}
4203
Amit Mahajan759786a2017-03-03 17:35:47 -08004204int radio::cancelPendingUssdResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004205 int responseType, int serial, RIL_Errno e, void *response,
4206 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004207#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004208 RLOGD("cancelPendingUssdResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004209#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004210
4211 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004212 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004213 populateResponseInfo(responseInfo, serial, responseType, e);
4214 Return<void> retStatus = radioService[slotId]->mRadioResponse->cancelPendingUssdResponse(
4215 responseInfo);
4216 radioService[slotId]->checkReturnStatus(retStatus);
4217 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004218 RLOGE("cancelPendingUssdResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004219 slotId);
4220 }
4221
4222 return 0;
4223}
4224
Amit Mahajan759786a2017-03-03 17:35:47 -08004225int radio::getClirResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004226 int responseType, int serial, RIL_Errno e, void *response,
4227 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004228#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004229 RLOGD("getClirResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004230#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004231
4232 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004233 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004234 populateResponseInfo(responseInfo, serial, responseType, e);
4235 int n = -1, m = -1;
4236 int numInts = responseLen / sizeof(int);
4237 if (response == NULL || numInts != 2) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004238 RLOGE("getClirResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004239 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
4240 } else {
4241 int *pInt = (int *) response;
4242 n = pInt[0];
4243 m = pInt[1];
4244 }
4245 Return<void> retStatus = radioService[slotId]->mRadioResponse->getClirResponse(responseInfo,
4246 n, m);
4247 radioService[slotId]->checkReturnStatus(retStatus);
4248 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004249 RLOGE("getClirResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004250 }
4251
4252 return 0;
4253}
4254
Amit Mahajan759786a2017-03-03 17:35:47 -08004255int radio::setClirResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004256 int responseType, int serial, RIL_Errno e, void *response,
4257 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004258#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004259 RLOGD("setClirResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004260#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004261
4262 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004263 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004264 populateResponseInfo(responseInfo, serial, responseType, e);
4265 Return<void> retStatus = radioService[slotId]->mRadioResponse->setClirResponse(
4266 responseInfo);
4267 radioService[slotId]->checkReturnStatus(retStatus);
4268 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004269 RLOGE("setClirResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004270 }
4271
4272 return 0;
4273}
4274
Amit Mahajan759786a2017-03-03 17:35:47 -08004275int radio::getCallForwardStatusResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004276 int responseType, int serial, RIL_Errno e,
4277 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004278#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004279 RLOGD("getCallForwardStatusResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004280#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004281
4282 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004283 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004284 populateResponseInfo(responseInfo, serial, responseType, e);
4285 hidl_vec<CallForwardInfo> callForwardInfos;
4286
Amit Mahajan13058cb2017-06-07 23:10:27 -07004287 if ((response == NULL && responseLen != 0)
4288 || responseLen % sizeof(RIL_CallForwardInfo *) != 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004289 RLOGE("getCallForwardStatusResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004290 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
4291 } else {
4292 int num = responseLen / sizeof(RIL_CallForwardInfo *);
4293 callForwardInfos.resize(num);
4294 for (int i = 0 ; i < num; i++) {
4295 RIL_CallForwardInfo *resp = ((RIL_CallForwardInfo **) response)[i];
4296 callForwardInfos[i].status = (CallForwardInfoStatus) resp->status;
4297 callForwardInfos[i].reason = resp->reason;
4298 callForwardInfos[i].serviceClass = resp->serviceClass;
4299 callForwardInfos[i].toa = resp->toa;
4300 callForwardInfos[i].number = convertCharPtrToHidlString(resp->number);
4301 callForwardInfos[i].timeSeconds = resp->timeSeconds;
4302 }
4303 }
4304
4305 Return<void> retStatus = radioService[slotId]->mRadioResponse->getCallForwardStatusResponse(
4306 responseInfo, callForwardInfos);
4307 radioService[slotId]->checkReturnStatus(retStatus);
4308 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004309 RLOGE("getCallForwardStatusResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004310 slotId);
4311 }
4312
4313 return 0;
4314}
4315
Amit Mahajan759786a2017-03-03 17:35:47 -08004316int radio::setCallForwardResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004317 int responseType, int serial, RIL_Errno e, void *response,
4318 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004319#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004320 RLOGD("setCallForwardResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004321#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004322
4323 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004324 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004325 populateResponseInfo(responseInfo, serial, responseType, e);
4326 Return<void> retStatus = radioService[slotId]->mRadioResponse->setCallForwardResponse(
4327 responseInfo);
4328 radioService[slotId]->checkReturnStatus(retStatus);
4329 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004330 RLOGE("setCallForwardResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004331 }
4332
4333 return 0;
4334}
4335
Amit Mahajan759786a2017-03-03 17:35:47 -08004336int radio::getCallWaitingResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004337 int responseType, int serial, RIL_Errno e, void *response,
4338 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004339#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004340 RLOGD("getCallWaitingResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004341#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004342
4343 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004344 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004345 populateResponseInfo(responseInfo, serial, responseType, e);
4346 bool enable = false;
4347 int serviceClass = -1;
4348 int numInts = responseLen / sizeof(int);
4349 if (response == NULL || numInts != 2) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004350 RLOGE("getCallWaitingResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004351 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
4352 } else {
4353 int *pInt = (int *) response;
4354 enable = pInt[0] == 1 ? true : false;
4355 serviceClass = pInt[1];
4356 }
Sanket Padawe5375bfa2017-03-07 17:21:05 -08004357 Return<void> retStatus = radioService[slotId]->mRadioResponse->getCallWaitingResponse(
4358 responseInfo, enable, serviceClass);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004359 radioService[slotId]->checkReturnStatus(retStatus);
4360 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004361 RLOGE("getCallWaitingResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004362 }
4363
4364 return 0;
4365}
4366
Amit Mahajan759786a2017-03-03 17:35:47 -08004367int radio::setCallWaitingResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004368 int responseType, int serial, RIL_Errno e, void *response,
4369 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004370#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004371 RLOGD("setCallWaitingResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004372#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004373
4374 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004375 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004376 populateResponseInfo(responseInfo, serial, responseType, e);
4377 Return<void> retStatus = radioService[slotId]->mRadioResponse->setCallWaitingResponse(
4378 responseInfo);
4379 radioService[slotId]->checkReturnStatus(retStatus);
4380 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004381 RLOGE("setCallWaitingResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004382 }
4383
4384 return 0;
4385}
4386
Amit Mahajan759786a2017-03-03 17:35:47 -08004387int radio::acknowledgeLastIncomingGsmSmsResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004388 int responseType, int serial, RIL_Errno e,
4389 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004390#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004391 RLOGD("acknowledgeLastIncomingGsmSmsResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004392#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004393
4394 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004395 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004396 populateResponseInfo(responseInfo, serial, responseType, e);
4397 Return<void> retStatus =
4398 radioService[slotId]->mRadioResponse->acknowledgeLastIncomingGsmSmsResponse(
4399 responseInfo);
4400 radioService[slotId]->checkReturnStatus(retStatus);
4401 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004402 RLOGE("acknowledgeLastIncomingGsmSmsResponse: radioService[%d]->mRadioResponse "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004403 "== NULL", slotId);
4404 }
4405
4406 return 0;
4407}
4408
Amit Mahajan759786a2017-03-03 17:35:47 -08004409int radio::acceptCallResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004410 int responseType, int serial, RIL_Errno e,
4411 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004412#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004413 RLOGD("acceptCallResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004414#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004415
4416 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004417 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004418 populateResponseInfo(responseInfo, serial, responseType, e);
4419 Return<void> retStatus = radioService[slotId]->mRadioResponse->acceptCallResponse(
4420 responseInfo);
4421 radioService[slotId]->checkReturnStatus(retStatus);
4422 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004423 RLOGE("acceptCallResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004424 slotId);
4425 }
4426
4427 return 0;
4428}
4429
Amit Mahajan759786a2017-03-03 17:35:47 -08004430int radio::deactivateDataCallResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004431 int responseType, int serial, RIL_Errno e,
4432 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004433#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004434 RLOGD("deactivateDataCallResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004435#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004436
4437 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004438 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004439 populateResponseInfo(responseInfo, serial, responseType, e);
4440 Return<void> retStatus = radioService[slotId]->mRadioResponse->deactivateDataCallResponse(
4441 responseInfo);
4442 radioService[slotId]->checkReturnStatus(retStatus);
4443 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004444 RLOGE("deactivateDataCallResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004445 slotId);
4446 }
4447
4448 return 0;
4449}
4450
Amit Mahajan759786a2017-03-03 17:35:47 -08004451int radio::getFacilityLockForAppResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004452 int responseType, int serial, RIL_Errno e,
4453 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004454#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004455 RLOGD("getFacilityLockForAppResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004456#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004457
4458 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004459 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004460 int ret = responseInt(responseInfo, serial, responseType, e, response, responseLen);
4461 Return<void> retStatus = radioService[slotId]->mRadioResponse->
4462 getFacilityLockForAppResponse(responseInfo, ret);
4463 radioService[slotId]->checkReturnStatus(retStatus);
4464 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004465 RLOGE("getFacilityLockForAppResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004466 slotId);
4467 }
4468
4469 return 0;
4470}
4471
Amit Mahajan759786a2017-03-03 17:35:47 -08004472int radio::setFacilityLockForAppResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004473 int responseType, int serial, RIL_Errno e,
4474 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004475#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004476 RLOGD("setFacilityLockForAppResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004477#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004478
4479 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004480 RadioResponseInfo responseInfo = {};
Naveen Kalla346bbc02017-03-16 12:55:55 -07004481 int ret = responseIntOrEmpty(responseInfo, serial, responseType, e, response, responseLen);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004482 Return<void> retStatus
4483 = radioService[slotId]->mRadioResponse->setFacilityLockForAppResponse(responseInfo,
4484 ret);
4485 radioService[slotId]->checkReturnStatus(retStatus);
4486 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004487 RLOGE("setFacilityLockForAppResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004488 slotId);
4489 }
4490
4491 return 0;
4492}
4493
Amit Mahajan759786a2017-03-03 17:35:47 -08004494int radio::setBarringPasswordResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004495 int responseType, int serial, RIL_Errno e,
4496 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004497#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004498 RLOGD("acceptCallResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004499#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004500
4501 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004502 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004503 populateResponseInfo(responseInfo, serial, responseType, e);
4504 Return<void> retStatus
4505 = radioService[slotId]->mRadioResponse->setBarringPasswordResponse(responseInfo);
4506 radioService[slotId]->checkReturnStatus(retStatus);
4507 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004508 RLOGE("setBarringPasswordResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004509 slotId);
4510 }
4511
4512 return 0;
4513}
4514
Amit Mahajan759786a2017-03-03 17:35:47 -08004515int radio::getNetworkSelectionModeResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004516 int responseType, int serial, RIL_Errno e, void *response,
4517 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004518#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004519 RLOGD("getNetworkSelectionModeResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004520#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004521
4522 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004523 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004524 populateResponseInfo(responseInfo, serial, responseType, e);
4525 bool manual = false;
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004526 if (response == NULL || responseLen != sizeof(int)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004527 RLOGE("getNetworkSelectionModeResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004528 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
4529 } else {
4530 int *pInt = (int *) response;
4531 manual = pInt[0] == 1 ? true : false;
4532 }
4533 Return<void> retStatus
4534 = radioService[slotId]->mRadioResponse->getNetworkSelectionModeResponse(
4535 responseInfo,
4536 manual);
4537 radioService[slotId]->checkReturnStatus(retStatus);
4538 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004539 RLOGE("getNetworkSelectionModeResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004540 slotId);
4541 }
4542
4543 return 0;
4544}
4545
Amit Mahajan759786a2017-03-03 17:35:47 -08004546int radio::setNetworkSelectionModeAutomaticResponse(int slotId, int responseType, int serial,
4547 RIL_Errno e, void *response,
4548 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004549#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004550 RLOGD("setNetworkSelectionModeAutomaticResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004551#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004552
4553 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004554 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004555 populateResponseInfo(responseInfo, serial, responseType, e);
4556 Return<void> retStatus
4557 = radioService[slotId]->mRadioResponse->setNetworkSelectionModeAutomaticResponse(
4558 responseInfo);
4559 radioService[slotId]->checkReturnStatus(retStatus);
4560 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004561 RLOGE("setNetworkSelectionModeAutomaticResponse: radioService[%d]->mRadioResponse "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004562 "== NULL", slotId);
4563 }
4564
4565 return 0;
4566}
4567
Amit Mahajan759786a2017-03-03 17:35:47 -08004568int radio::setNetworkSelectionModeManualResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004569 int responseType, int serial, RIL_Errno e,
4570 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004571#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004572 RLOGD("setNetworkSelectionModeManualResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004573#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004574
4575 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004576 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004577 populateResponseInfo(responseInfo, serial, responseType, e);
4578 Return<void> retStatus
4579 = radioService[slotId]->mRadioResponse->setNetworkSelectionModeManualResponse(
4580 responseInfo);
4581 radioService[slotId]->checkReturnStatus(retStatus);
4582 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004583 RLOGE("acceptCallResponse: radioService[%d]->setNetworkSelectionModeManualResponse "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004584 "== NULL", slotId);
4585 }
4586
4587 return 0;
4588}
4589
Jack Yuf68e0da2017-02-07 14:53:09 -08004590int convertOperatorStatusToInt(const char *str) {
4591 if (strncmp("unknown", str, 9) == 0) {
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004592 return (int) OperatorStatus::UNKNOWN;
Jack Yuf68e0da2017-02-07 14:53:09 -08004593 } else if (strncmp("available", str, 9) == 0) {
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004594 return (int) OperatorStatus::AVAILABLE;
Jack Yuf68e0da2017-02-07 14:53:09 -08004595 } else if (strncmp("current", str, 9) == 0) {
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004596 return (int) OperatorStatus::CURRENT;
Jack Yuf68e0da2017-02-07 14:53:09 -08004597 } else if (strncmp("forbidden", str, 9) == 0) {
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004598 return (int) OperatorStatus::FORBIDDEN;
4599 } else {
4600 return -1;
4601 }
4602}
4603
Amit Mahajan759786a2017-03-03 17:35:47 -08004604int radio::getAvailableNetworksResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004605 int responseType, int serial, RIL_Errno e, void *response,
4606 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004607#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004608 RLOGD("getAvailableNetworksResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004609#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004610
4611 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004612 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004613 populateResponseInfo(responseInfo, serial, responseType, e);
4614 hidl_vec<OperatorInfo> networks;
Amit Mahajan13058cb2017-06-07 23:10:27 -07004615 if ((response == NULL && responseLen != 0)
4616 || responseLen % (4 * sizeof(char *))!= 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004617 RLOGE("getAvailableNetworksResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004618 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
4619 } else {
4620 char **resp = (char **) response;
4621 int numStrings = responseLen / sizeof(char *);
4622 networks.resize(numStrings/4);
Jayachandran Ce0d755c2017-03-01 18:26:50 -08004623 for (int i = 0, j = 0; i < numStrings; i = i + 4, j++) {
4624 networks[j].alphaLong = convertCharPtrToHidlString(resp[i]);
4625 networks[j].alphaShort = convertCharPtrToHidlString(resp[i + 1]);
4626 networks[j].operatorNumeric = convertCharPtrToHidlString(resp[i + 2]);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004627 int status = convertOperatorStatusToInt(resp[i + 3]);
4628 if (status == -1) {
4629 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
4630 } else {
Jayachandran Ce0d755c2017-03-01 18:26:50 -08004631 networks[j].status = (OperatorStatus) status;
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004632 }
4633 }
4634 }
4635 Return<void> retStatus
4636 = radioService[slotId]->mRadioResponse->getAvailableNetworksResponse(responseInfo,
4637 networks);
4638 radioService[slotId]->checkReturnStatus(retStatus);
4639 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004640 RLOGE("getAvailableNetworksResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004641 slotId);
4642 }
4643
4644 return 0;
4645}
4646
Amit Mahajan759786a2017-03-03 17:35:47 -08004647int radio::startDtmfResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004648 int responseType, int serial, RIL_Errno e,
4649 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004650#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004651 RLOGD("startDtmfResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004652#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004653
4654 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004655 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004656 populateResponseInfo(responseInfo, serial, responseType, e);
4657 Return<void> retStatus
4658 = radioService[slotId]->mRadioResponse->startDtmfResponse(responseInfo);
4659 radioService[slotId]->checkReturnStatus(retStatus);
4660 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004661 RLOGE("startDtmfResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004662 }
4663
4664 return 0;
4665}
4666
Amit Mahajan759786a2017-03-03 17:35:47 -08004667int radio::stopDtmfResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004668 int responseType, int serial, RIL_Errno e,
4669 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004670#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004671 RLOGD("stopDtmfResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004672#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004673
4674 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004675 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004676 populateResponseInfo(responseInfo, serial, responseType, e);
4677 Return<void> retStatus
4678 = radioService[slotId]->mRadioResponse->stopDtmfResponse(responseInfo);
4679 radioService[slotId]->checkReturnStatus(retStatus);
4680 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004681 RLOGE("stopDtmfResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004682 }
4683
4684 return 0;
4685}
4686
Amit Mahajan759786a2017-03-03 17:35:47 -08004687int radio::getBasebandVersionResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004688 int responseType, int serial, RIL_Errno e,
4689 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004690#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004691 RLOGD("getBasebandVersionResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004692#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004693
4694 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004695 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004696 populateResponseInfo(responseInfo, serial, responseType, e);
4697 Return<void> retStatus
4698 = radioService[slotId]->mRadioResponse->getBasebandVersionResponse(responseInfo,
4699 convertCharPtrToHidlString((char *) response));
4700 radioService[slotId]->checkReturnStatus(retStatus);
4701 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004702 RLOGE("getBasebandVersionResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004703 }
4704
4705 return 0;
4706}
4707
Amit Mahajan759786a2017-03-03 17:35:47 -08004708int radio::separateConnectionResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004709 int responseType, int serial, RIL_Errno e,
4710 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004711#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004712 RLOGD("separateConnectionResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004713#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004714
4715 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004716 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004717 populateResponseInfo(responseInfo, serial, responseType, e);
4718 Return<void> retStatus
4719 = radioService[slotId]->mRadioResponse->separateConnectionResponse(responseInfo);
4720 radioService[slotId]->checkReturnStatus(retStatus);
4721 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004722 RLOGE("separateConnectionResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004723 slotId);
4724 }
4725
4726 return 0;
4727}
4728
Amit Mahajan759786a2017-03-03 17:35:47 -08004729int radio::setMuteResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004730 int responseType, int serial, RIL_Errno e,
4731 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004732#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004733 RLOGD("setMuteResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004734#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004735
4736 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004737 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004738 populateResponseInfo(responseInfo, serial, responseType, e);
4739 Return<void> retStatus
4740 = radioService[slotId]->mRadioResponse->setMuteResponse(responseInfo);
4741 radioService[slotId]->checkReturnStatus(retStatus);
4742 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004743 RLOGE("setMuteResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004744 }
4745
4746 return 0;
4747}
4748
Amit Mahajan759786a2017-03-03 17:35:47 -08004749int radio::getMuteResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004750 int responseType, int serial, RIL_Errno e, void *response,
4751 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004752#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004753 RLOGD("getMuteResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004754#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004755
4756 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004757 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004758 populateResponseInfo(responseInfo, serial, responseType, e);
4759 bool enable = false;
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004760 if (response == NULL || responseLen != sizeof(int)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004761 RLOGE("getMuteResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004762 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
4763 } else {
4764 int *pInt = (int *) response;
4765 enable = pInt[0] == 1 ? true : false;
4766 }
4767 Return<void> retStatus = radioService[slotId]->mRadioResponse->getMuteResponse(responseInfo,
4768 enable);
4769 radioService[slotId]->checkReturnStatus(retStatus);
4770 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004771 RLOGE("getMuteResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004772 }
4773
4774 return 0;
4775}
4776
Amit Mahajan759786a2017-03-03 17:35:47 -08004777int radio::getClipResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004778 int responseType, int serial, RIL_Errno e,
4779 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004780#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004781 RLOGD("getClipResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004782#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004783
4784 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004785 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004786 int ret = responseInt(responseInfo, serial, responseType, e, response, responseLen);
4787 Return<void> retStatus = radioService[slotId]->mRadioResponse->getClipResponse(responseInfo,
4788 (ClipStatus) ret);
4789 radioService[slotId]->checkReturnStatus(retStatus);
4790 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004791 RLOGE("getClipResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004792 }
4793
4794 return 0;
4795}
4796
Amit Mahajan759786a2017-03-03 17:35:47 -08004797int radio::getDataCallListResponse(int slotId,
Amit Mahajan3df62912017-02-10 01:35:55 +00004798 int responseType, int serial, RIL_Errno e,
4799 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004800#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004801 RLOGD("getDataCallListResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004802#endif
Amit Mahajan3df62912017-02-10 01:35:55 +00004803
4804 if (radioService[slotId]->mRadioResponse != NULL) {
Amit Mahajan3da9ac02017-02-13 13:41:28 -08004805 RadioResponseInfo responseInfo = {};
Amit Mahajan3df62912017-02-10 01:35:55 +00004806 populateResponseInfo(responseInfo, serial, responseType, e);
4807
4808 hidl_vec<SetupDataCallResult> ret;
Amit Mahajan13058cb2017-06-07 23:10:27 -07004809 if ((response == NULL && responseLen != 0)
4810 || responseLen % sizeof(RIL_Data_Call_Response_v11) != 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004811 RLOGE("getDataCallListResponse: invalid response");
Amit Mahajan3df62912017-02-10 01:35:55 +00004812 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
4813 } else {
4814 convertRilDataCallListToHal(response, responseLen, ret);
4815 }
4816
4817 Return<void> retStatus = radioService[slotId]->mRadioResponse->getDataCallListResponse(
4818 responseInfo, ret);
4819 radioService[slotId]->checkReturnStatus(retStatus);
4820 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004821 RLOGE("getDataCallListResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Amit Mahajan3df62912017-02-10 01:35:55 +00004822 }
4823
4824 return 0;
4825}
4826
Amit Mahajan759786a2017-03-03 17:35:47 -08004827int radio::setSuppServiceNotificationsResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004828 int responseType, int serial, RIL_Errno e,
4829 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004830#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004831 RLOGD("setSuppServiceNotificationsResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004832#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004833
4834 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004835 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004836 populateResponseInfo(responseInfo, serial, responseType, e);
4837 Return<void> retStatus
4838 = radioService[slotId]->mRadioResponse->setSuppServiceNotificationsResponse(
4839 responseInfo);
4840 radioService[slotId]->checkReturnStatus(retStatus);
4841 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004842 RLOGE("setSuppServiceNotificationsResponse: radioService[%d]->mRadioResponse "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004843 "== NULL", slotId);
4844 }
4845
4846 return 0;
4847}
4848
Amit Mahajan759786a2017-03-03 17:35:47 -08004849int radio::deleteSmsOnSimResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004850 int responseType, int serial, RIL_Errno e,
4851 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004852#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004853 RLOGD("deleteSmsOnSimResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004854#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004855
4856 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004857 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004858 populateResponseInfo(responseInfo, serial, responseType, e);
4859 Return<void> retStatus
4860 = radioService[slotId]->mRadioResponse->deleteSmsOnSimResponse(responseInfo);
4861 radioService[slotId]->checkReturnStatus(retStatus);
4862 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004863 RLOGE("deleteSmsOnSimResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004864 }
4865
4866 return 0;
4867}
4868
Amit Mahajan759786a2017-03-03 17:35:47 -08004869int radio::setBandModeResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004870 int responseType, int serial, RIL_Errno e,
4871 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004872#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004873 RLOGD("setBandModeResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004874#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004875
4876 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004877 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004878 populateResponseInfo(responseInfo, serial, responseType, e);
4879 Return<void> retStatus
4880 = radioService[slotId]->mRadioResponse->setBandModeResponse(responseInfo);
4881 radioService[slotId]->checkReturnStatus(retStatus);
4882 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004883 RLOGE("setBandModeResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004884 }
4885
4886 return 0;
4887}
4888
Amit Mahajan759786a2017-03-03 17:35:47 -08004889int radio::writeSmsToSimResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004890 int responseType, int serial, RIL_Errno e,
4891 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004892#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004893 RLOGD("writeSmsToSimResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004894#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004895
4896 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004897 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004898 int ret = responseInt(responseInfo, serial, responseType, e, response, responseLen);
4899 Return<void> retStatus
4900 = radioService[slotId]->mRadioResponse->writeSmsToSimResponse(responseInfo, ret);
4901 radioService[slotId]->checkReturnStatus(retStatus);
4902 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004903 RLOGE("writeSmsToSimResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004904 }
4905
4906 return 0;
4907}
4908
Amit Mahajan759786a2017-03-03 17:35:47 -08004909int radio::getAvailableBandModesResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004910 int responseType, int serial, RIL_Errno e, void *response,
4911 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004912#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004913 RLOGD("getAvailableBandModesResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004914#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004915
4916 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004917 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004918 populateResponseInfo(responseInfo, serial, responseType, e);
4919 hidl_vec<RadioBandMode> modes;
Amit Mahajan13058cb2017-06-07 23:10:27 -07004920 if ((response == NULL && responseLen != 0)|| responseLen % sizeof(int) != 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004921 RLOGE("getAvailableBandModesResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004922 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
4923 } else {
4924 int *pInt = (int *) response;
4925 int numInts = responseLen / sizeof(int);
4926 modes.resize(numInts);
4927 for (int i = 0; i < numInts; i++) {
4928 modes[i] = (RadioBandMode) pInt[i];
4929 }
4930 }
4931 Return<void> retStatus
4932 = radioService[slotId]->mRadioResponse->getAvailableBandModesResponse(responseInfo,
4933 modes);
4934 radioService[slotId]->checkReturnStatus(retStatus);
4935 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004936 RLOGE("getAvailableBandModesResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004937 slotId);
4938 }
4939
4940 return 0;
4941}
4942
Amit Mahajan759786a2017-03-03 17:35:47 -08004943int radio::sendEnvelopeResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004944 int responseType, int serial, RIL_Errno e,
4945 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004946#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004947 RLOGD("sendEnvelopeResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004948#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004949
4950 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004951 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004952 populateResponseInfo(responseInfo, serial, responseType, e);
4953 Return<void> retStatus
4954 = radioService[slotId]->mRadioResponse->sendEnvelopeResponse(responseInfo,
4955 convertCharPtrToHidlString((char *) response));
4956 radioService[slotId]->checkReturnStatus(retStatus);
4957 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004958 RLOGE("sendEnvelopeResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004959 }
4960
4961 return 0;
4962}
4963
Amit Mahajan759786a2017-03-03 17:35:47 -08004964int radio::sendTerminalResponseToSimResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004965 int responseType, int serial, RIL_Errno e,
4966 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004967#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004968 RLOGD("sendTerminalResponseToSimResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004969#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004970
4971 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004972 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004973 populateResponseInfo(responseInfo, serial, responseType, e);
4974 Return<void> retStatus
4975 = radioService[slotId]->mRadioResponse->sendTerminalResponseToSimResponse(
4976 responseInfo);
4977 radioService[slotId]->checkReturnStatus(retStatus);
4978 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004979 RLOGE("sendTerminalResponseToSimResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004980 slotId);
4981 }
4982
4983 return 0;
4984}
4985
Amit Mahajan759786a2017-03-03 17:35:47 -08004986int radio::handleStkCallSetupRequestFromSimResponse(int slotId,
4987 int responseType, int serial,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004988 RIL_Errno e, void *response,
4989 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004990#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004991 RLOGD("handleStkCallSetupRequestFromSimResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004992#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004993
4994 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004995 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004996 populateResponseInfo(responseInfo, serial, responseType, e);
4997 Return<void> retStatus
4998 = radioService[slotId]->mRadioResponse->handleStkCallSetupRequestFromSimResponse(
4999 responseInfo);
5000 radioService[slotId]->checkReturnStatus(retStatus);
5001 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005002 RLOGE("handleStkCallSetupRequestFromSimResponse: radioService[%d]->mRadioResponse "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005003 "== NULL", slotId);
5004 }
5005
5006 return 0;
5007}
5008
Amit Mahajan759786a2017-03-03 17:35:47 -08005009int radio::explicitCallTransferResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005010 int responseType, int serial, RIL_Errno e,
5011 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005012#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005013 RLOGD("explicitCallTransferResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005014#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005015
5016 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005017 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005018 populateResponseInfo(responseInfo, serial, responseType, e);
5019 Return<void> retStatus
5020 = radioService[slotId]->mRadioResponse->explicitCallTransferResponse(responseInfo);
5021 radioService[slotId]->checkReturnStatus(retStatus);
5022 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005023 RLOGE("explicitCallTransferResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005024 slotId);
5025 }
5026
5027 return 0;
5028}
5029
Amit Mahajan759786a2017-03-03 17:35:47 -08005030int radio::setPreferredNetworkTypeResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005031 int responseType, int serial, RIL_Errno e,
5032 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005033#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005034 RLOGD("setPreferredNetworkTypeResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005035#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005036
5037 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005038 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005039 populateResponseInfo(responseInfo, serial, responseType, e);
5040 Return<void> retStatus
5041 = radioService[slotId]->mRadioResponse->setPreferredNetworkTypeResponse(
5042 responseInfo);
5043 radioService[slotId]->checkReturnStatus(retStatus);
5044 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005045 RLOGE("setPreferredNetworkTypeResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005046 slotId);
5047 }
5048
5049 return 0;
5050}
5051
5052
Amit Mahajan759786a2017-03-03 17:35:47 -08005053int radio::getPreferredNetworkTypeResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005054 int responseType, int serial, RIL_Errno e,
5055 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005056#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005057 RLOGD("getPreferredNetworkTypeResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005058#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005059
5060 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005061 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005062 int ret = responseInt(responseInfo, serial, responseType, e, response, responseLen);
5063 Return<void> retStatus
5064 = radioService[slotId]->mRadioResponse->getPreferredNetworkTypeResponse(
5065 responseInfo, (PreferredNetworkType) ret);
5066 radioService[slotId]->checkReturnStatus(retStatus);
5067 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005068 RLOGE("getPreferredNetworkTypeResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005069 slotId);
5070 }
5071
5072 return 0;
5073}
5074
Amit Mahajan759786a2017-03-03 17:35:47 -08005075int radio::getNeighboringCidsResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005076 int responseType, int serial, RIL_Errno e,
5077 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005078#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005079 RLOGD("getNeighboringCidsResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005080#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005081
5082 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005083 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005084 populateResponseInfo(responseInfo, serial, responseType, e);
5085 hidl_vec<NeighboringCell> cells;
5086
Amit Mahajan13058cb2017-06-07 23:10:27 -07005087 if ((response == NULL && responseLen != 0)
5088 || responseLen % sizeof(RIL_NeighboringCell *) != 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005089 RLOGE("getNeighboringCidsResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005090 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
5091 } else {
5092 int num = responseLen / sizeof(RIL_NeighboringCell *);
5093 cells.resize(num);
5094 for (int i = 0 ; i < num; i++) {
5095 RIL_NeighboringCell *resp = ((RIL_NeighboringCell **) response)[i];
5096 cells[i].cid = convertCharPtrToHidlString(resp->cid);
5097 cells[i].rssi = resp->rssi;
5098 }
5099 }
5100
5101 Return<void> retStatus
5102 = radioService[slotId]->mRadioResponse->getNeighboringCidsResponse(responseInfo,
5103 cells);
5104 radioService[slotId]->checkReturnStatus(retStatus);
5105 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005106 RLOGE("getNeighboringCidsResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005107 slotId);
5108 }
5109
5110 return 0;
5111}
5112
Amit Mahajan759786a2017-03-03 17:35:47 -08005113int radio::setLocationUpdatesResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005114 int responseType, int serial, RIL_Errno e,
5115 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005116#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005117 RLOGD("setLocationUpdatesResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005118#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005119
5120 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005121 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005122 populateResponseInfo(responseInfo, serial, responseType, e);
5123 Return<void> retStatus
5124 = radioService[slotId]->mRadioResponse->setLocationUpdatesResponse(responseInfo);
5125 radioService[slotId]->checkReturnStatus(retStatus);
5126 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005127 RLOGE("setLocationUpdatesResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005128 slotId);
5129 }
5130
5131 return 0;
5132}
5133
Amit Mahajan759786a2017-03-03 17:35:47 -08005134int radio::setCdmaSubscriptionSourceResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005135 int responseType, int serial, RIL_Errno e,
5136 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005137#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005138 RLOGD("setCdmaSubscriptionSourceResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005139#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005140
5141 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005142 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005143 populateResponseInfo(responseInfo, serial, responseType, e);
5144 Return<void> retStatus
5145 = radioService[slotId]->mRadioResponse->setCdmaSubscriptionSourceResponse(
5146 responseInfo);
5147 radioService[slotId]->checkReturnStatus(retStatus);
5148 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005149 RLOGE("setCdmaSubscriptionSourceResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005150 slotId);
5151 }
5152
5153 return 0;
5154}
5155
Amit Mahajan759786a2017-03-03 17:35:47 -08005156int radio::setCdmaRoamingPreferenceResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005157 int responseType, int serial, RIL_Errno e,
5158 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005159#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005160 RLOGD("setCdmaRoamingPreferenceResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005161#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005162
5163 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005164 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005165 populateResponseInfo(responseInfo, serial, responseType, e);
5166 Return<void> retStatus
5167 = radioService[slotId]->mRadioResponse->setCdmaRoamingPreferenceResponse(
5168 responseInfo);
5169 radioService[slotId]->checkReturnStatus(retStatus);
5170 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005171 RLOGE("setCdmaRoamingPreferenceResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005172 slotId);
5173 }
5174
5175 return 0;
5176}
5177
Amit Mahajan759786a2017-03-03 17:35:47 -08005178int radio::getCdmaRoamingPreferenceResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005179 int responseType, int serial, RIL_Errno e,
5180 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005181#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005182 RLOGD("getCdmaRoamingPreferenceResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005183#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005184
5185 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005186 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005187 int ret = responseInt(responseInfo, serial, responseType, e, response, responseLen);
5188 Return<void> retStatus
5189 = radioService[slotId]->mRadioResponse->getCdmaRoamingPreferenceResponse(
5190 responseInfo, (CdmaRoamingType) ret);
5191 radioService[slotId]->checkReturnStatus(retStatus);
5192 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005193 RLOGE("getCdmaRoamingPreferenceResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005194 slotId);
5195 }
5196
5197 return 0;
5198}
5199
Amit Mahajan759786a2017-03-03 17:35:47 -08005200int radio::setTTYModeResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005201 int responseType, int serial, RIL_Errno e,
5202 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005203#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005204 RLOGD("setTTYModeResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005205#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005206
5207 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005208 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005209 populateResponseInfo(responseInfo, serial, responseType, e);
5210 Return<void> retStatus
5211 = radioService[slotId]->mRadioResponse->setTTYModeResponse(responseInfo);
5212 radioService[slotId]->checkReturnStatus(retStatus);
5213 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005214 RLOGE("setTTYModeResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005215 }
5216
5217 return 0;
5218}
5219
Amit Mahajan759786a2017-03-03 17:35:47 -08005220int radio::getTTYModeResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005221 int responseType, int serial, RIL_Errno e,
5222 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005223#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005224 RLOGD("getTTYModeResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005225#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005226
5227 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005228 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005229 int ret = responseInt(responseInfo, serial, responseType, e, response, responseLen);
5230 Return<void> retStatus
5231 = radioService[slotId]->mRadioResponse->getTTYModeResponse(responseInfo,
5232 (TtyMode) ret);
5233 radioService[slotId]->checkReturnStatus(retStatus);
5234 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005235 RLOGE("getTTYModeResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005236 }
5237
5238 return 0;
5239}
5240
Amit Mahajan759786a2017-03-03 17:35:47 -08005241int radio::setPreferredVoicePrivacyResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005242 int responseType, int serial, RIL_Errno e,
5243 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005244#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005245 RLOGD("setPreferredVoicePrivacyResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005246#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005247
5248 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005249 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005250 populateResponseInfo(responseInfo, serial, responseType, e);
5251 Return<void> retStatus
5252 = radioService[slotId]->mRadioResponse->setPreferredVoicePrivacyResponse(
5253 responseInfo);
5254 radioService[slotId]->checkReturnStatus(retStatus);
5255 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005256 RLOGE("setPreferredVoicePrivacyResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005257 slotId);
5258 }
5259
5260 return 0;
5261}
5262
Amit Mahajan759786a2017-03-03 17:35:47 -08005263int radio::getPreferredVoicePrivacyResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005264 int responseType, int serial, RIL_Errno e,
5265 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005266#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005267 RLOGD("getPreferredVoicePrivacyResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005268#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005269
5270 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005271 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005272 populateResponseInfo(responseInfo, serial, responseType, e);
5273 bool enable = false;
5274 int numInts = responseLen / sizeof(int);
5275 if (response == NULL || numInts != 1) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005276 RLOGE("getPreferredVoicePrivacyResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005277 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
5278 } else {
5279 int *pInt = (int *) response;
5280 enable = pInt[0] == 1 ? true : false;
5281 }
5282 Return<void> retStatus
5283 = radioService[slotId]->mRadioResponse->getPreferredVoicePrivacyResponse(
5284 responseInfo, enable);
5285 radioService[slotId]->checkReturnStatus(retStatus);
5286 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005287 RLOGE("getPreferredVoicePrivacyResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005288 slotId);
5289 }
5290
5291 return 0;
5292}
5293
Amit Mahajan759786a2017-03-03 17:35:47 -08005294int radio::sendCDMAFeatureCodeResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005295 int responseType, int serial, RIL_Errno e,
5296 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005297#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005298 RLOGD("sendCDMAFeatureCodeResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005299#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005300
5301 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005302 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005303 populateResponseInfo(responseInfo, serial, responseType, e);
5304 Return<void> retStatus
5305 = radioService[slotId]->mRadioResponse->sendCDMAFeatureCodeResponse(responseInfo);
5306 radioService[slotId]->checkReturnStatus(retStatus);
5307 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005308 RLOGE("sendCDMAFeatureCodeResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005309 slotId);
5310 }
5311
5312 return 0;
5313}
5314
Amit Mahajan759786a2017-03-03 17:35:47 -08005315int radio::sendBurstDtmfResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005316 int responseType, int serial, RIL_Errno e,
5317 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005318#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005319 RLOGD("sendBurstDtmfResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005320#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005321
5322 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005323 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005324 populateResponseInfo(responseInfo, serial, responseType, e);
5325 Return<void> retStatus
5326 = radioService[slotId]->mRadioResponse->sendBurstDtmfResponse(responseInfo);
5327 radioService[slotId]->checkReturnStatus(retStatus);
5328 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005329 RLOGE("sendBurstDtmfResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005330 }
5331
5332 return 0;
5333}
5334
Amit Mahajan759786a2017-03-03 17:35:47 -08005335int radio::sendCdmaSmsResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005336 int responseType, int serial, RIL_Errno e, void *response,
5337 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005338#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005339 RLOGD("sendCdmaSmsResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005340#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005341
5342 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005343 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005344 SendSmsResult result = makeSendSmsResult(responseInfo, serial, responseType, e, response,
5345 responseLen);
5346
5347 Return<void> retStatus
5348 = radioService[slotId]->mRadioResponse->sendCdmaSmsResponse(responseInfo, result);
5349 radioService[slotId]->checkReturnStatus(retStatus);
5350 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005351 RLOGE("sendCdmaSmsResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005352 }
5353
5354 return 0;
5355}
5356
Amit Mahajan759786a2017-03-03 17:35:47 -08005357int radio::acknowledgeLastIncomingCdmaSmsResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005358 int responseType, int serial, RIL_Errno e,
5359 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005360#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005361 RLOGD("acknowledgeLastIncomingCdmaSmsResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005362#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005363
5364 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005365 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005366 populateResponseInfo(responseInfo, serial, responseType, e);
5367 Return<void> retStatus
5368 = radioService[slotId]->mRadioResponse->acknowledgeLastIncomingCdmaSmsResponse(
5369 responseInfo);
5370 radioService[slotId]->checkReturnStatus(retStatus);
5371 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005372 RLOGE("acknowledgeLastIncomingCdmaSmsResponse: radioService[%d]->mRadioResponse "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005373 "== NULL", slotId);
5374 }
5375
5376 return 0;
5377}
5378
Amit Mahajan759786a2017-03-03 17:35:47 -08005379int radio::getGsmBroadcastConfigResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005380 int responseType, int serial, RIL_Errno e,
5381 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005382#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005383 RLOGD("getGsmBroadcastConfigResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005384#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005385
5386 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005387 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005388 populateResponseInfo(responseInfo, serial, responseType, e);
5389 hidl_vec<GsmBroadcastSmsConfigInfo> configs;
5390
Amit Mahajan13058cb2017-06-07 23:10:27 -07005391 if ((response == NULL && responseLen != 0)
5392 || responseLen % sizeof(RIL_GSM_BroadcastSmsConfigInfo *) != 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005393 RLOGE("getGsmBroadcastConfigResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005394 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
5395 } else {
5396 int num = responseLen / sizeof(RIL_GSM_BroadcastSmsConfigInfo *);
5397 configs.resize(num);
5398 for (int i = 0 ; i < num; i++) {
5399 RIL_GSM_BroadcastSmsConfigInfo *resp =
5400 ((RIL_GSM_BroadcastSmsConfigInfo **) response)[i];
5401 configs[i].fromServiceId = resp->fromServiceId;
5402 configs[i].toServiceId = resp->toServiceId;
5403 configs[i].fromCodeScheme = resp->fromCodeScheme;
5404 configs[i].toCodeScheme = resp->toCodeScheme;
5405 configs[i].selected = resp->selected == 1 ? true : false;
5406 }
5407 }
5408
5409 Return<void> retStatus
5410 = radioService[slotId]->mRadioResponse->getGsmBroadcastConfigResponse(responseInfo,
5411 configs);
5412 radioService[slotId]->checkReturnStatus(retStatus);
5413 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005414 RLOGE("getGsmBroadcastConfigResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005415 slotId);
5416 }
5417
5418 return 0;
5419}
5420
Amit Mahajan759786a2017-03-03 17:35:47 -08005421int radio::setGsmBroadcastConfigResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005422 int responseType, int serial, RIL_Errno e,
5423 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005424#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005425 RLOGD("setGsmBroadcastConfigResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005426#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005427
5428 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005429 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005430 populateResponseInfo(responseInfo, serial, responseType, e);
5431 Return<void> retStatus
5432 = radioService[slotId]->mRadioResponse->setGsmBroadcastConfigResponse(responseInfo);
5433 radioService[slotId]->checkReturnStatus(retStatus);
5434 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005435 RLOGE("setGsmBroadcastConfigResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005436 slotId);
5437 }
5438
5439 return 0;
5440}
5441
Amit Mahajan759786a2017-03-03 17:35:47 -08005442int radio::setGsmBroadcastActivationResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005443 int responseType, int serial, RIL_Errno e,
5444 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005445#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005446 RLOGD("setGsmBroadcastActivationResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005447#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005448
5449 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005450 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005451 populateResponseInfo(responseInfo, serial, responseType, e);
5452 Return<void> retStatus
5453 = radioService[slotId]->mRadioResponse->setGsmBroadcastActivationResponse(
5454 responseInfo);
5455 radioService[slotId]->checkReturnStatus(retStatus);
5456 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005457 RLOGE("setGsmBroadcastActivationResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005458 slotId);
5459 }
5460
5461 return 0;
5462}
5463
Amit Mahajan759786a2017-03-03 17:35:47 -08005464int radio::getCdmaBroadcastConfigResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005465 int responseType, int serial, RIL_Errno e,
5466 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005467#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005468 RLOGD("getCdmaBroadcastConfigResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005469#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005470
5471 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005472 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005473 populateResponseInfo(responseInfo, serial, responseType, e);
5474 hidl_vec<CdmaBroadcastSmsConfigInfo> configs;
5475
Amit Mahajan13058cb2017-06-07 23:10:27 -07005476 if ((response == NULL && responseLen != 0)
5477 || responseLen % sizeof(RIL_CDMA_BroadcastSmsConfigInfo *) != 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005478 RLOGE("getCdmaBroadcastConfigResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005479 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
5480 } else {
5481 int num = responseLen / sizeof(RIL_CDMA_BroadcastSmsConfigInfo *);
5482 configs.resize(num);
5483 for (int i = 0 ; i < num; i++) {
5484 RIL_CDMA_BroadcastSmsConfigInfo *resp =
5485 ((RIL_CDMA_BroadcastSmsConfigInfo **) response)[i];
5486 configs[i].serviceCategory = resp->service_category;
5487 configs[i].language = resp->language;
5488 configs[i].selected = resp->selected == 1 ? true : false;
5489 }
5490 }
5491
5492 Return<void> retStatus
5493 = radioService[slotId]->mRadioResponse->getCdmaBroadcastConfigResponse(responseInfo,
5494 configs);
5495 radioService[slotId]->checkReturnStatus(retStatus);
5496 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005497 RLOGE("getCdmaBroadcastConfigResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005498 slotId);
5499 }
5500
5501 return 0;
5502}
5503
Amit Mahajan759786a2017-03-03 17:35:47 -08005504int radio::setCdmaBroadcastConfigResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005505 int responseType, int serial, RIL_Errno e,
5506 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005507#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005508 RLOGD("setCdmaBroadcastConfigResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005509#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005510
5511 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005512 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005513 populateResponseInfo(responseInfo, serial, responseType, e);
5514 Return<void> retStatus
5515 = radioService[slotId]->mRadioResponse->setCdmaBroadcastConfigResponse(
5516 responseInfo);
5517 radioService[slotId]->checkReturnStatus(retStatus);
5518 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005519 RLOGE("setCdmaBroadcastConfigResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005520 slotId);
5521 }
5522
5523 return 0;
5524}
5525
Amit Mahajan759786a2017-03-03 17:35:47 -08005526int radio::setCdmaBroadcastActivationResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005527 int responseType, int serial, RIL_Errno e,
5528 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005529#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005530 RLOGD("setCdmaBroadcastActivationResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005531#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005532
5533 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005534 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005535 populateResponseInfo(responseInfo, serial, responseType, e);
5536 Return<void> retStatus
5537 = radioService[slotId]->mRadioResponse->setCdmaBroadcastActivationResponse(
5538 responseInfo);
5539 radioService[slotId]->checkReturnStatus(retStatus);
5540 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005541 RLOGE("setCdmaBroadcastActivationResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005542 slotId);
5543 }
5544
5545 return 0;
5546}
5547
Amit Mahajan759786a2017-03-03 17:35:47 -08005548int radio::getCDMASubscriptionResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005549 int responseType, int serial, RIL_Errno e, void *response,
5550 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005551#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005552 RLOGD("getCDMASubscriptionResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005553#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005554
5555 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005556 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005557 populateResponseInfo(responseInfo, serial, responseType, e);
5558
5559 int numStrings = responseLen / sizeof(char *);
5560 hidl_string emptyString;
5561 if (response == NULL || numStrings != 5) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005562 RLOGE("getOperatorResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005563 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
5564 Return<void> retStatus
5565 = radioService[slotId]->mRadioResponse->getCDMASubscriptionResponse(
5566 responseInfo, emptyString, emptyString, emptyString, emptyString, emptyString);
5567 radioService[slotId]->checkReturnStatus(retStatus);
5568 } else {
5569 char **resp = (char **) response;
5570 Return<void> retStatus
5571 = radioService[slotId]->mRadioResponse->getCDMASubscriptionResponse(
5572 responseInfo,
5573 convertCharPtrToHidlString(resp[0]),
5574 convertCharPtrToHidlString(resp[1]),
5575 convertCharPtrToHidlString(resp[2]),
5576 convertCharPtrToHidlString(resp[3]),
5577 convertCharPtrToHidlString(resp[4]));
5578 radioService[slotId]->checkReturnStatus(retStatus);
5579 }
5580 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005581 RLOGE("getCDMASubscriptionResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005582 slotId);
5583 }
5584
5585 return 0;
5586}
5587
Amit Mahajan759786a2017-03-03 17:35:47 -08005588int radio::writeSmsToRuimResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005589 int responseType, int serial, RIL_Errno e,
5590 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005591#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005592 RLOGD("writeSmsToRuimResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005593#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005594
5595 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005596 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005597 int ret = responseInt(responseInfo, serial, responseType, e, response, responseLen);
5598 Return<void> retStatus
5599 = radioService[slotId]->mRadioResponse->writeSmsToRuimResponse(responseInfo, ret);
5600 radioService[slotId]->checkReturnStatus(retStatus);
5601 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005602 RLOGE("writeSmsToRuimResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005603 }
5604
5605 return 0;
5606}
5607
Amit Mahajan759786a2017-03-03 17:35:47 -08005608int radio::deleteSmsOnRuimResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005609 int responseType, int serial, RIL_Errno e,
5610 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005611#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005612 RLOGD("deleteSmsOnRuimResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005613#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005614
5615 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005616 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005617 populateResponseInfo(responseInfo, serial, responseType, e);
5618 Return<void> retStatus
5619 = radioService[slotId]->mRadioResponse->deleteSmsOnRuimResponse(responseInfo);
5620 radioService[slotId]->checkReturnStatus(retStatus);
5621 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005622 RLOGE("deleteSmsOnRuimResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005623 }
5624
5625 return 0;
5626}
5627
Amit Mahajan759786a2017-03-03 17:35:47 -08005628int radio::getDeviceIdentityResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005629 int responseType, int serial, RIL_Errno e, void *response,
5630 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005631#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005632 RLOGD("getDeviceIdentityResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005633#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005634
5635 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005636 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005637 populateResponseInfo(responseInfo, serial, responseType, e);
5638
5639 int numStrings = responseLen / sizeof(char *);
5640 hidl_string emptyString;
5641 if (response == NULL || numStrings != 4) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005642 RLOGE("getDeviceIdentityResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005643 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
5644 Return<void> retStatus
5645 = radioService[slotId]->mRadioResponse->getDeviceIdentityResponse(responseInfo,
5646 emptyString, emptyString, emptyString, emptyString);
5647 radioService[slotId]->checkReturnStatus(retStatus);
5648 } else {
5649 char **resp = (char **) response;
5650 Return<void> retStatus
5651 = radioService[slotId]->mRadioResponse->getDeviceIdentityResponse(responseInfo,
5652 convertCharPtrToHidlString(resp[0]),
5653 convertCharPtrToHidlString(resp[1]),
5654 convertCharPtrToHidlString(resp[2]),
5655 convertCharPtrToHidlString(resp[3]));
5656 radioService[slotId]->checkReturnStatus(retStatus);
5657 }
5658 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005659 RLOGE("getDeviceIdentityResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005660 slotId);
5661 }
5662
5663 return 0;
5664}
5665
Amit Mahajan759786a2017-03-03 17:35:47 -08005666int radio::exitEmergencyCallbackModeResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005667 int responseType, int serial, RIL_Errno e,
5668 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005669#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005670 RLOGD("exitEmergencyCallbackModeResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005671#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005672
5673 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005674 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005675 populateResponseInfo(responseInfo, serial, responseType, e);
5676 Return<void> retStatus
5677 = radioService[slotId]->mRadioResponse->exitEmergencyCallbackModeResponse(
5678 responseInfo);
5679 radioService[slotId]->checkReturnStatus(retStatus);
5680 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005681 RLOGE("exitEmergencyCallbackModeResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005682 slotId);
5683 }
5684
5685 return 0;
5686}
5687
Amit Mahajan759786a2017-03-03 17:35:47 -08005688int radio::getSmscAddressResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005689 int responseType, int serial, RIL_Errno e,
5690 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005691#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005692 RLOGD("getSmscAddressResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005693#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005694
5695 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005696 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005697 populateResponseInfo(responseInfo, serial, responseType, e);
5698 Return<void> retStatus
5699 = radioService[slotId]->mRadioResponse->getSmscAddressResponse(responseInfo,
5700 convertCharPtrToHidlString((char *) response));
5701 radioService[slotId]->checkReturnStatus(retStatus);
5702 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005703 RLOGE("getSmscAddressResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005704 }
5705
5706 return 0;
5707}
5708
Amit Mahajan759786a2017-03-03 17:35:47 -08005709int radio::setSmscAddressResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005710 int responseType, int serial, RIL_Errno e,
5711 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005712#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005713 RLOGD("setSmscAddressResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005714#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005715
5716 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005717 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005718 populateResponseInfo(responseInfo, serial, responseType, e);
5719 Return<void> retStatus
5720 = radioService[slotId]->mRadioResponse->setSmscAddressResponse(responseInfo);
5721 radioService[slotId]->checkReturnStatus(retStatus);
5722 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005723 RLOGE("setSmscAddressResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005724 }
5725
5726 return 0;
5727}
5728
Amit Mahajan759786a2017-03-03 17:35:47 -08005729int radio::reportSmsMemoryStatusResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005730 int responseType, int serial, RIL_Errno e,
5731 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005732#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005733 RLOGD("reportSmsMemoryStatusResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005734#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005735
5736 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005737 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005738 populateResponseInfo(responseInfo, serial, responseType, e);
5739 Return<void> retStatus
5740 = radioService[slotId]->mRadioResponse->reportSmsMemoryStatusResponse(responseInfo);
5741 radioService[slotId]->checkReturnStatus(retStatus);
5742 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005743 RLOGE("reportSmsMemoryStatusResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005744 slotId);
5745 }
5746
5747 return 0;
5748}
5749
Amit Mahajan759786a2017-03-03 17:35:47 -08005750int radio::reportStkServiceIsRunningResponse(int slotId,
Amit Mahajan5007ffa2017-01-31 17:14:42 -08005751 int responseType, int serial, RIL_Errno e,
5752 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005753#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005754 RLOGD("reportStkServiceIsRunningResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005755#endif
Amit Mahajan5007ffa2017-01-31 17:14:42 -08005756
5757 if (radioService[slotId]->mRadioResponse != NULL) {
Amit Mahajan3da9ac02017-02-13 13:41:28 -08005758 RadioResponseInfo responseInfo = {};
Amit Mahajan5007ffa2017-01-31 17:14:42 -08005759 populateResponseInfo(responseInfo, serial, responseType, e);
5760 Return<void> retStatus = radioService[slotId]->mRadioResponse->
5761 reportStkServiceIsRunningResponse(responseInfo);
5762 radioService[slotId]->checkReturnStatus(retStatus);
5763 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005764 RLOGE("reportStkServiceIsRunningResponse: radioService[%d]->mRadioResponse == NULL",
Amit Mahajan5007ffa2017-01-31 17:14:42 -08005765 slotId);
5766 }
5767
5768 return 0;
5769}
5770
Amit Mahajan759786a2017-03-03 17:35:47 -08005771int radio::getCdmaSubscriptionSourceResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005772 int responseType, int serial, RIL_Errno e,
5773 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005774#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005775 RLOGD("getCdmaSubscriptionSourceResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005776#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005777
5778 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005779 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005780 int ret = responseInt(responseInfo, serial, responseType, e, response, responseLen);
5781 Return<void> retStatus
5782 = radioService[slotId]->mRadioResponse->getCdmaSubscriptionSourceResponse(
5783 responseInfo, (CdmaSubscriptionSource) ret);
5784 radioService[slotId]->checkReturnStatus(retStatus);
5785 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005786 RLOGE("getCdmaSubscriptionSourceResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005787 slotId);
5788 }
5789
5790 return 0;
5791}
5792
Amit Mahajan759786a2017-03-03 17:35:47 -08005793int radio::requestIsimAuthenticationResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005794 int responseType, int serial, RIL_Errno e,
5795 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005796#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005797 RLOGD("requestIsimAuthenticationResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005798#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005799
5800 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005801 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005802 populateResponseInfo(responseInfo, serial, responseType, e);
5803 Return<void> retStatus
5804 = radioService[slotId]->mRadioResponse->requestIsimAuthenticationResponse(
5805 responseInfo,
5806 convertCharPtrToHidlString((char *) response));
5807 radioService[slotId]->checkReturnStatus(retStatus);
5808 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005809 RLOGE("requestIsimAuthenticationResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005810 slotId);
5811 }
5812
5813 return 0;
5814}
5815
Amit Mahajan759786a2017-03-03 17:35:47 -08005816int radio::acknowledgeIncomingGsmSmsWithPduResponse(int slotId,
5817 int responseType,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005818 int serial, RIL_Errno e, void *response,
5819 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005820#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005821 RLOGD("acknowledgeIncomingGsmSmsWithPduResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005822#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005823
5824 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005825 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005826 populateResponseInfo(responseInfo, serial, responseType, e);
5827 Return<void> retStatus
5828 = radioService[slotId]->mRadioResponse->acknowledgeIncomingGsmSmsWithPduResponse(
5829 responseInfo);
5830 radioService[slotId]->checkReturnStatus(retStatus);
5831 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005832 RLOGE("acknowledgeIncomingGsmSmsWithPduResponse: radioService[%d]->mRadioResponse "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005833 "== NULL", slotId);
5834 }
5835
5836 return 0;
5837}
5838
Amit Mahajan759786a2017-03-03 17:35:47 -08005839int radio::sendEnvelopeWithStatusResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005840 int responseType, int serial, RIL_Errno e, void *response,
5841 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005842#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005843 RLOGD("sendEnvelopeWithStatusResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005844#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005845
5846 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005847 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005848 IccIoResult result = responseIccIo(responseInfo, serial, responseType, e,
5849 response, responseLen);
5850
5851 Return<void> retStatus
5852 = radioService[slotId]->mRadioResponse->sendEnvelopeWithStatusResponse(responseInfo,
5853 result);
5854 radioService[slotId]->checkReturnStatus(retStatus);
5855 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005856 RLOGE("sendEnvelopeWithStatusResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005857 slotId);
5858 }
5859
5860 return 0;
5861}
5862
Amit Mahajan759786a2017-03-03 17:35:47 -08005863int radio::getVoiceRadioTechnologyResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005864 int responseType, int serial, RIL_Errno e,
5865 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005866#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005867 RLOGD("getVoiceRadioTechnologyResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005868#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005869
5870 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005871 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005872 int ret = responseInt(responseInfo, serial, responseType, e, response, responseLen);
5873 Return<void> retStatus
5874 = radioService[slotId]->mRadioResponse->getVoiceRadioTechnologyResponse(
5875 responseInfo, (RadioTechnology) ret);
5876 radioService[slotId]->checkReturnStatus(retStatus);
5877 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005878 RLOGE("getVoiceRadioTechnologyResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005879 slotId);
5880 }
5881
5882 return 0;
5883}
5884
Amit Mahajan759786a2017-03-03 17:35:47 -08005885int radio::getCellInfoListResponse(int slotId,
5886 int responseType,
Amit Mahajan3df62912017-02-10 01:35:55 +00005887 int serial, RIL_Errno e, void *response,
5888 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005889#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005890 RLOGD("getCellInfoListResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005891#endif
Amit Mahajan3df62912017-02-10 01:35:55 +00005892
5893 if (radioService[slotId]->mRadioResponse != NULL) {
Amit Mahajan3da9ac02017-02-13 13:41:28 -08005894 RadioResponseInfo responseInfo = {};
Amit Mahajan3df62912017-02-10 01:35:55 +00005895 populateResponseInfo(responseInfo, serial, responseType, e);
5896
5897 hidl_vec<CellInfo> ret;
Amit Mahajan13058cb2017-06-07 23:10:27 -07005898 if ((response == NULL && responseLen != 0)
5899 || responseLen % sizeof(RIL_CellInfo_v12) != 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005900 RLOGE("getCellInfoListResponse: Invalid response");
Amit Mahajan3df62912017-02-10 01:35:55 +00005901 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
5902 } else {
5903 convertRilCellInfoListToHal(response, responseLen, ret);
5904 }
5905
5906 Return<void> retStatus = radioService[slotId]->mRadioResponse->getCellInfoListResponse(
5907 responseInfo, ret);
5908 radioService[slotId]->checkReturnStatus(retStatus);
5909 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005910 RLOGE("getCellInfoListResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Amit Mahajan3df62912017-02-10 01:35:55 +00005911 }
5912
5913 return 0;
5914}
5915
Amit Mahajan759786a2017-03-03 17:35:47 -08005916int radio::setCellInfoListRateResponse(int slotId,
5917 int responseType,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005918 int serial, RIL_Errno e, void *response,
5919 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005920#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005921 RLOGD("setCellInfoListRateResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005922#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005923
5924 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005925 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005926 populateResponseInfo(responseInfo, serial, responseType, e);
5927 Return<void> retStatus
5928 = radioService[slotId]->mRadioResponse->setCellInfoListRateResponse(responseInfo);
5929 radioService[slotId]->checkReturnStatus(retStatus);
5930 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005931 RLOGE("setCellInfoListRateResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005932 slotId);
5933 }
5934
5935 return 0;
5936}
5937
Amit Mahajan759786a2017-03-03 17:35:47 -08005938int radio::setInitialAttachApnResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005939 int responseType, int serial, RIL_Errno e,
5940 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005941#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005942 RLOGD("setInitialAttachApnResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005943#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005944
5945 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005946 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005947 populateResponseInfo(responseInfo, serial, responseType, e);
5948 Return<void> retStatus
5949 = radioService[slotId]->mRadioResponse->setInitialAttachApnResponse(responseInfo);
5950 radioService[slotId]->checkReturnStatus(retStatus);
5951 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005952 RLOGE("setInitialAttachApnResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005953 slotId);
5954 }
5955
5956 return 0;
5957}
5958
Amit Mahajan759786a2017-03-03 17:35:47 -08005959int radio::getImsRegistrationStateResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005960 int responseType, int serial, RIL_Errno e,
5961 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005962#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005963 RLOGD("getImsRegistrationStateResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005964#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005965
5966 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005967 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005968 populateResponseInfo(responseInfo, serial, responseType, e);
5969 bool isRegistered = false;
5970 int ratFamily = 0;
5971 int numInts = responseLen / sizeof(int);
5972 if (response == NULL || numInts != 2) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005973 RLOGE("getImsRegistrationStateResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005974 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
5975 } else {
5976 int *pInt = (int *) response;
5977 isRegistered = pInt[0] == 1 ? true : false;
5978 ratFamily = pInt[1];
5979 }
5980 Return<void> retStatus
5981 = radioService[slotId]->mRadioResponse->getImsRegistrationStateResponse(
5982 responseInfo, isRegistered, (RadioTechnologyFamily) ratFamily);
5983 radioService[slotId]->checkReturnStatus(retStatus);
5984 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005985 RLOGE("getImsRegistrationStateResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005986 slotId);
5987 }
5988
5989 return 0;
5990}
5991
Amit Mahajan759786a2017-03-03 17:35:47 -08005992int radio::sendImsSmsResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005993 int responseType, int serial, RIL_Errno e, void *response,
5994 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005995#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005996 RLOGD("sendImsSmsResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005997#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005998
5999 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08006000 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006001 SendSmsResult result = makeSendSmsResult(responseInfo, serial, responseType, e, response,
6002 responseLen);
6003
6004 Return<void> retStatus
6005 = radioService[slotId]->mRadioResponse->sendImsSmsResponse(responseInfo, result);
6006 radioService[slotId]->checkReturnStatus(retStatus);
6007 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006008 RLOGE("sendSmsResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006009 }
6010
6011 return 0;
6012}
6013
Amit Mahajan759786a2017-03-03 17:35:47 -08006014int radio::iccTransmitApduBasicChannelResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006015 int responseType, int serial, RIL_Errno e,
6016 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006017#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006018 RLOGD("iccTransmitApduBasicChannelResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006019#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006020
6021 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08006022 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006023 IccIoResult result = responseIccIo(responseInfo, serial, responseType, e, response,
6024 responseLen);
6025
6026 Return<void> retStatus
6027 = radioService[slotId]->mRadioResponse->iccTransmitApduBasicChannelResponse(
6028 responseInfo, result);
6029 radioService[slotId]->checkReturnStatus(retStatus);
6030 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006031 RLOGE("iccTransmitApduBasicChannelResponse: radioService[%d]->mRadioResponse "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006032 "== NULL", slotId);
6033 }
6034
6035 return 0;
6036}
6037
Amit Mahajan759786a2017-03-03 17:35:47 -08006038int radio::iccOpenLogicalChannelResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006039 int responseType, int serial, RIL_Errno e, void *response,
6040 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006041#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006042 RLOGD("iccOpenLogicalChannelResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006043#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006044
6045 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08006046 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006047 populateResponseInfo(responseInfo, serial, responseType, e);
6048 int channelId = -1;
6049 hidl_vec<int8_t> selectResponse;
6050 int numInts = responseLen / sizeof(int);
6051 if (response == NULL || responseLen % sizeof(int) != 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006052 RLOGE("iccOpenLogicalChannelResponse Invalid response: NULL");
Amit Mahajan13058cb2017-06-07 23:10:27 -07006053 if (response != NULL) {
6054 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
6055 }
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006056 } else {
6057 int *pInt = (int *) response;
6058 channelId = pInt[0];
6059 selectResponse.resize(numInts - 1);
6060 for (int i = 1; i < numInts; i++) {
6061 selectResponse[i - 1] = (int8_t) pInt[i];
6062 }
6063 }
6064 Return<void> retStatus
6065 = radioService[slotId]->mRadioResponse->iccOpenLogicalChannelResponse(responseInfo,
6066 channelId, selectResponse);
6067 radioService[slotId]->checkReturnStatus(retStatus);
6068 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006069 RLOGE("iccOpenLogicalChannelResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006070 slotId);
6071 }
6072
6073 return 0;
6074}
6075
Amit Mahajan759786a2017-03-03 17:35:47 -08006076int radio::iccCloseLogicalChannelResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006077 int responseType, int serial, RIL_Errno e,
6078 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006079#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006080 RLOGD("iccCloseLogicalChannelResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006081#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006082
6083 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08006084 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006085 populateResponseInfo(responseInfo, serial, responseType, e);
6086 Return<void> retStatus
6087 = radioService[slotId]->mRadioResponse->iccCloseLogicalChannelResponse(
6088 responseInfo);
6089 radioService[slotId]->checkReturnStatus(retStatus);
6090 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006091 RLOGE("iccCloseLogicalChannelResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006092 slotId);
6093 }
6094
6095 return 0;
6096}
6097
Amit Mahajan759786a2017-03-03 17:35:47 -08006098int radio::iccTransmitApduLogicalChannelResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006099 int responseType, int serial, RIL_Errno e,
6100 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006101#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006102 RLOGD("iccTransmitApduLogicalChannelResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006103#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006104
6105 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08006106 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006107 IccIoResult result = responseIccIo(responseInfo, serial, responseType, e, response,
6108 responseLen);
6109
6110 Return<void> retStatus
6111 = radioService[slotId]->mRadioResponse->iccTransmitApduLogicalChannelResponse(
6112 responseInfo, result);
6113 radioService[slotId]->checkReturnStatus(retStatus);
6114 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006115 RLOGE("iccTransmitApduLogicalChannelResponse: radioService[%d]->mRadioResponse "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006116 "== NULL", slotId);
6117 }
6118
6119 return 0;
6120}
6121
Amit Mahajan759786a2017-03-03 17:35:47 -08006122int radio::nvReadItemResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006123 int responseType, int serial, RIL_Errno e,
6124 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006125#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006126 RLOGD("nvReadItemResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006127#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006128
6129 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08006130 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006131 populateResponseInfo(responseInfo, serial, responseType, e);
6132 Return<void> retStatus = radioService[slotId]->mRadioResponse->nvReadItemResponse(
6133 responseInfo,
6134 convertCharPtrToHidlString((char *) response));
6135 radioService[slotId]->checkReturnStatus(retStatus);
6136 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006137 RLOGE("nvReadItemResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006138 }
6139
6140 return 0;
6141}
6142
Amit Mahajan759786a2017-03-03 17:35:47 -08006143int radio::nvWriteItemResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006144 int responseType, int serial, RIL_Errno e,
6145 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006146#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006147 RLOGD("nvWriteItemResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006148#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006149
6150 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08006151 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006152 populateResponseInfo(responseInfo, serial, responseType, e);
6153 Return<void> retStatus
6154 = radioService[slotId]->mRadioResponse->nvWriteItemResponse(responseInfo);
6155 radioService[slotId]->checkReturnStatus(retStatus);
6156 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006157 RLOGE("nvWriteItemResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006158 }
6159
6160 return 0;
6161}
6162
Amit Mahajan759786a2017-03-03 17:35:47 -08006163int radio::nvWriteCdmaPrlResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006164 int responseType, int serial, RIL_Errno e,
6165 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006166#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006167 RLOGD("nvWriteCdmaPrlResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006168#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006169
6170 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08006171 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006172 populateResponseInfo(responseInfo, serial, responseType, e);
6173 Return<void> retStatus
6174 = radioService[slotId]->mRadioResponse->nvWriteCdmaPrlResponse(responseInfo);
6175 radioService[slotId]->checkReturnStatus(retStatus);
6176 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006177 RLOGE("nvWriteCdmaPrlResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006178 }
6179
6180 return 0;
6181}
6182
Amit Mahajan759786a2017-03-03 17:35:47 -08006183int radio::nvResetConfigResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006184 int responseType, int serial, RIL_Errno e,
6185 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006186#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006187 RLOGD("nvResetConfigResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006188#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006189
6190 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08006191 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006192 populateResponseInfo(responseInfo, serial, responseType, e);
6193 Return<void> retStatus
6194 = radioService[slotId]->mRadioResponse->nvResetConfigResponse(responseInfo);
6195 radioService[slotId]->checkReturnStatus(retStatus);
6196 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006197 RLOGE("nvResetConfigResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006198 }
6199
6200 return 0;
6201}
6202
Amit Mahajan759786a2017-03-03 17:35:47 -08006203int radio::setUiccSubscriptionResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006204 int responseType, int serial, RIL_Errno e,
6205 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006206#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006207 RLOGD("setUiccSubscriptionResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006208#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006209
6210 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08006211 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006212 populateResponseInfo(responseInfo, serial, responseType, e);
6213 Return<void> retStatus
6214 = radioService[slotId]->mRadioResponse->setUiccSubscriptionResponse(responseInfo);
6215 radioService[slotId]->checkReturnStatus(retStatus);
6216 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006217 RLOGE("setUiccSubscriptionResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006218 slotId);
6219 }
6220
6221 return 0;
6222}
6223
Amit Mahajan759786a2017-03-03 17:35:47 -08006224int radio::setDataAllowedResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006225 int responseType, int serial, RIL_Errno e,
6226 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006227#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006228 RLOGD("setDataAllowedResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006229#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006230
6231 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08006232 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006233 populateResponseInfo(responseInfo, serial, responseType, e);
6234 Return<void> retStatus
6235 = radioService[slotId]->mRadioResponse->setDataAllowedResponse(responseInfo);
6236 radioService[slotId]->checkReturnStatus(retStatus);
6237 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006238 RLOGE("setDataAllowedResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006239 }
6240
6241 return 0;
6242}
6243
Amit Mahajan759786a2017-03-03 17:35:47 -08006244int radio::getHardwareConfigResponse(int slotId,
Amit Mahajan3df62912017-02-10 01:35:55 +00006245 int responseType, int serial, RIL_Errno e,
6246 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006247#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006248 RLOGD("getHardwareConfigResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006249#endif
Amit Mahajan3df62912017-02-10 01:35:55 +00006250
6251 if (radioService[slotId]->mRadioResponse != NULL) {
Amit Mahajan3da9ac02017-02-13 13:41:28 -08006252 RadioResponseInfo responseInfo = {};
Amit Mahajan3df62912017-02-10 01:35:55 +00006253 populateResponseInfo(responseInfo, serial, responseType, e);
6254
6255 hidl_vec<HardwareConfig> result;
Amit Mahajan13058cb2017-06-07 23:10:27 -07006256 if ((response == NULL && responseLen != 0)
6257 || responseLen % sizeof(RIL_HardwareConfig) != 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006258 RLOGE("hardwareConfigChangedInd: invalid response");
Amit Mahajan3df62912017-02-10 01:35:55 +00006259 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
6260 } else {
6261 convertRilHardwareConfigListToHal(response, responseLen, result);
6262 }
6263
6264 Return<void> retStatus = radioService[slotId]->mRadioResponse->getHardwareConfigResponse(
6265 responseInfo, result);
6266 radioService[slotId]->checkReturnStatus(retStatus);
6267 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006268 RLOGE("getHardwareConfigResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Amit Mahajan3df62912017-02-10 01:35:55 +00006269 }
6270
6271 return 0;
6272}
6273
Amit Mahajan759786a2017-03-03 17:35:47 -08006274int radio::requestIccSimAuthenticationResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006275 int responseType, int serial, RIL_Errno e,
6276 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006277#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006278 RLOGD("requestIccSimAuthenticationResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006279#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006280
6281 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08006282 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006283 IccIoResult result = responseIccIo(responseInfo, serial, responseType, e, response,
6284 responseLen);
6285
6286 Return<void> retStatus
6287 = radioService[slotId]->mRadioResponse->requestIccSimAuthenticationResponse(
6288 responseInfo, result);
6289 radioService[slotId]->checkReturnStatus(retStatus);
6290 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006291 RLOGE("requestIccSimAuthenticationResponse: radioService[%d]->mRadioResponse "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006292 "== NULL", slotId);
6293 }
6294
6295 return 0;
6296}
6297
Amit Mahajan759786a2017-03-03 17:35:47 -08006298int radio::setDataProfileResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006299 int responseType, int serial, RIL_Errno e,
6300 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006301#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006302 RLOGD("setDataProfileResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006303#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006304
6305 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08006306 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006307 populateResponseInfo(responseInfo, serial, responseType, e);
6308 Return<void> retStatus
6309 = radioService[slotId]->mRadioResponse->setDataProfileResponse(responseInfo);
6310 radioService[slotId]->checkReturnStatus(retStatus);
6311 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006312 RLOGE("setDataProfileResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006313 }
6314
6315 return 0;
6316}
6317
Amit Mahajan759786a2017-03-03 17:35:47 -08006318int radio::requestShutdownResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006319 int responseType, int serial, RIL_Errno e,
6320 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006321#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006322 RLOGD("requestShutdownResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006323#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006324
6325 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08006326 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006327 populateResponseInfo(responseInfo, serial, responseType, e);
6328 Return<void> retStatus
6329 = radioService[slotId]->mRadioResponse->requestShutdownResponse(responseInfo);
6330 radioService[slotId]->checkReturnStatus(retStatus);
6331 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006332 RLOGE("requestShutdownResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006333 }
6334
6335 return 0;
6336}
6337
Amit Mahajan3df62912017-02-10 01:35:55 +00006338void responseRadioCapability(RadioResponseInfo& responseInfo, int serial,
6339 int responseType, RIL_Errno e, void *response, size_t responseLen, RadioCapability& rc) {
6340 populateResponseInfo(responseInfo, serial, responseType, e);
6341
Amit Mahajan1fbff082017-02-24 11:24:39 -08006342 if (response == NULL || responseLen != sizeof(RIL_RadioCapability)) {
Amit Mahajan3df62912017-02-10 01:35:55 +00006343 RLOGE("responseRadioCapability: Invalid response");
6344 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
Amit Mahajan3da9ac02017-02-13 13:41:28 -08006345 rc.logicalModemUuid = hidl_string();
Amit Mahajan3df62912017-02-10 01:35:55 +00006346 } else {
6347 convertRilRadioCapabilityToHal(response, responseLen, rc);
6348 }
6349}
6350
Amit Mahajan759786a2017-03-03 17:35:47 -08006351int radio::getRadioCapabilityResponse(int slotId,
Amit Mahajan3df62912017-02-10 01:35:55 +00006352 int responseType, int serial, RIL_Errno e,
6353 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006354#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006355 RLOGD("getRadioCapabilityResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006356#endif
Amit Mahajan3df62912017-02-10 01:35:55 +00006357
6358 if (radioService[slotId]->mRadioResponse != NULL) {
Amit Mahajan3da9ac02017-02-13 13:41:28 -08006359 RadioResponseInfo responseInfo = {};
6360 RadioCapability result = {};
Amit Mahajan3df62912017-02-10 01:35:55 +00006361 responseRadioCapability(responseInfo, serial, responseType, e, response, responseLen,
6362 result);
6363 Return<void> retStatus = radioService[slotId]->mRadioResponse->getRadioCapabilityResponse(
6364 responseInfo, result);
6365 radioService[slotId]->checkReturnStatus(retStatus);
6366 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006367 RLOGE("getRadioCapabilityResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Amit Mahajan3df62912017-02-10 01:35:55 +00006368 }
6369
6370 return 0;
6371}
6372
Amit Mahajan759786a2017-03-03 17:35:47 -08006373int radio::setRadioCapabilityResponse(int slotId,
Amit Mahajan3df62912017-02-10 01:35:55 +00006374 int responseType, int serial, RIL_Errno e,
6375 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006376#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006377 RLOGD("setRadioCapabilityResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006378#endif
Amit Mahajan3df62912017-02-10 01:35:55 +00006379
6380 if (radioService[slotId]->mRadioResponse != NULL) {
Amit Mahajan3da9ac02017-02-13 13:41:28 -08006381 RadioResponseInfo responseInfo = {};
6382 RadioCapability result = {};
Amit Mahajan3df62912017-02-10 01:35:55 +00006383 responseRadioCapability(responseInfo, serial, responseType, e, response, responseLen,
6384 result);
6385 Return<void> retStatus = radioService[slotId]->mRadioResponse->setRadioCapabilityResponse(
6386 responseInfo, result);
6387 radioService[slotId]->checkReturnStatus(retStatus);
6388 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006389 RLOGE("setRadioCapabilityResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Amit Mahajan3df62912017-02-10 01:35:55 +00006390 }
6391
6392 return 0;
6393}
6394
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006395LceStatusInfo responseLceStatusInfo(RadioResponseInfo& responseInfo, int serial, int responseType,
6396 RIL_Errno e, void *response, size_t responseLen) {
6397 populateResponseInfo(responseInfo, serial, responseType, e);
Jack Yuf68e0da2017-02-07 14:53:09 -08006398 LceStatusInfo result = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006399
6400 if (response == NULL || responseLen != sizeof(RIL_LceStatusInfo)) {
6401 RLOGE("Invalid response: NULL");
6402 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006403 } else {
6404 RIL_LceStatusInfo *resp = (RIL_LceStatusInfo *) response;
6405 result.lceStatus = (LceStatus) resp->lce_status;
6406 result.actualIntervalMs = (uint8_t) resp->actual_interval_ms;
6407 }
6408 return result;
6409}
6410
Amit Mahajan759786a2017-03-03 17:35:47 -08006411int radio::startLceServiceResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006412 int responseType, int serial, RIL_Errno e,
6413 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006414#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006415 RLOGD("startLceServiceResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006416#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006417
6418 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08006419 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006420 LceStatusInfo result = responseLceStatusInfo(responseInfo, serial, responseType, e,
6421 response, responseLen);
6422
6423 Return<void> retStatus
6424 = radioService[slotId]->mRadioResponse->startLceServiceResponse(responseInfo,
6425 result);
6426 radioService[slotId]->checkReturnStatus(retStatus);
6427 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006428 RLOGE("startLceServiceResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006429 }
6430
6431 return 0;
6432}
6433
Amit Mahajan759786a2017-03-03 17:35:47 -08006434int radio::stopLceServiceResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006435 int responseType, int serial, RIL_Errno e,
6436 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006437#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006438 RLOGD("stopLceServiceResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006439#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006440
6441 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08006442 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006443 LceStatusInfo result = responseLceStatusInfo(responseInfo, serial, responseType, e,
6444 response, responseLen);
6445
6446 Return<void> retStatus
6447 = radioService[slotId]->mRadioResponse->stopLceServiceResponse(responseInfo,
6448 result);
6449 radioService[slotId]->checkReturnStatus(retStatus);
6450 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006451 RLOGE("stopLceServiceResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006452 }
6453
6454 return 0;
6455}
6456
Amit Mahajan759786a2017-03-03 17:35:47 -08006457int radio::pullLceDataResponse(int slotId,
Amit Mahajan3df62912017-02-10 01:35:55 +00006458 int responseType, int serial, RIL_Errno e,
6459 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006460#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006461 RLOGD("pullLceDataResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006462#endif
Amit Mahajan3df62912017-02-10 01:35:55 +00006463
6464 if (radioService[slotId]->mRadioResponse != NULL) {
Amit Mahajan3da9ac02017-02-13 13:41:28 -08006465 RadioResponseInfo responseInfo = {};
Amit Mahajan3df62912017-02-10 01:35:55 +00006466 populateResponseInfo(responseInfo, serial, responseType, e);
6467
Amit Mahajan3da9ac02017-02-13 13:41:28 -08006468 LceDataInfo result = {};
Amit Mahajan3df62912017-02-10 01:35:55 +00006469 if (response == NULL || responseLen != sizeof(RIL_LceDataInfo)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006470 RLOGE("pullLceDataResponse: Invalid response");
Amit Mahajan3df62912017-02-10 01:35:55 +00006471 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
Amit Mahajan3df62912017-02-10 01:35:55 +00006472 } else {
6473 convertRilLceDataInfoToHal(response, responseLen, result);
6474 }
6475
6476 Return<void> retStatus = radioService[slotId]->mRadioResponse->pullLceDataResponse(
6477 responseInfo, result);
6478 radioService[slotId]->checkReturnStatus(retStatus);
6479 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006480 RLOGE("pullLceDataResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Amit Mahajan3df62912017-02-10 01:35:55 +00006481 }
6482
6483 return 0;
6484}
6485
Amit Mahajan759786a2017-03-03 17:35:47 -08006486int radio::getModemActivityInfoResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006487 int responseType, int serial, RIL_Errno e,
6488 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006489#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006490 RLOGD("getModemActivityInfoResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006491#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006492
6493 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08006494 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006495 populateResponseInfo(responseInfo, serial, responseType, e);
6496 ActivityStatsInfo info;
6497 if (response == NULL || responseLen != sizeof(RIL_ActivityStatsInfo)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006498 RLOGE("getModemActivityInfoResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006499 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006500 } else {
6501 RIL_ActivityStatsInfo *resp = (RIL_ActivityStatsInfo *)response;
6502 info.sleepModeTimeMs = resp->sleep_mode_time_ms;
6503 info.idleModeTimeMs = resp->idle_mode_time_ms;
6504 for(int i = 0; i < RIL_NUM_TX_POWER_LEVELS; i++) {
6505 info.txmModetimeMs[i] = resp->tx_mode_time_ms[i];
6506 }
6507 info.rxModeTimeMs = resp->rx_mode_time_ms;
6508 }
6509
6510 Return<void> retStatus
6511 = radioService[slotId]->mRadioResponse->getModemActivityInfoResponse(responseInfo,
6512 info);
6513 radioService[slotId]->checkReturnStatus(retStatus);
6514 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006515 RLOGE("getModemActivityInfoResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006516 slotId);
6517 }
6518
6519 return 0;
6520}
6521
Amit Mahajan759786a2017-03-03 17:35:47 -08006522int radio::setAllowedCarriersResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006523 int responseType, int serial, RIL_Errno e,
6524 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006525#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006526 RLOGD("setAllowedCarriersResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006527#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006528
6529 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08006530 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006531 int ret = responseInt(responseInfo, serial, responseType, e, response, responseLen);
6532 Return<void> retStatus
6533 = radioService[slotId]->mRadioResponse->setAllowedCarriersResponse(responseInfo,
6534 ret);
6535 radioService[slotId]->checkReturnStatus(retStatus);
6536 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006537 RLOGE("setAllowedCarriersResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006538 slotId);
6539 }
6540
6541 return 0;
6542}
6543
Amit Mahajan759786a2017-03-03 17:35:47 -08006544int radio::getAllowedCarriersResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006545 int responseType, int serial, RIL_Errno e,
6546 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006547#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006548 RLOGD("getAllowedCarriersResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006549#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006550
6551 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08006552 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006553 populateResponseInfo(responseInfo, serial, responseType, e);
Jack Yuf68e0da2017-02-07 14:53:09 -08006554 CarrierRestrictions carrierInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006555 bool allAllowed = true;
Jayachandran C70f7d2e2017-04-28 00:57:13 -07006556 if (response == NULL) {
6557#if VDBG
6558 RLOGD("getAllowedCarriersResponse response is NULL: all allowed");
6559#endif
6560 carrierInfo.allowedCarriers.resize(0);
6561 carrierInfo.excludedCarriers.resize(0);
6562 } else if (responseLen != sizeof(RIL_CarrierRestrictions)) {
6563 RLOGE("getAllowedCarriersResponse Invalid response");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006564 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
6565 } else {
6566 RIL_CarrierRestrictions *pCr = (RIL_CarrierRestrictions *)response;
6567 if (pCr->len_allowed_carriers > 0 || pCr->len_excluded_carriers > 0) {
6568 allAllowed = false;
6569 }
6570
6571 carrierInfo.allowedCarriers.resize(pCr->len_allowed_carriers);
6572 for(int i = 0; i < pCr->len_allowed_carriers; i++) {
6573 RIL_Carrier *carrier = pCr->allowed_carriers + i;
6574 carrierInfo.allowedCarriers[i].mcc = convertCharPtrToHidlString(carrier->mcc);
6575 carrierInfo.allowedCarriers[i].mnc = convertCharPtrToHidlString(carrier->mnc);
6576 carrierInfo.allowedCarriers[i].matchType = (CarrierMatchType) carrier->match_type;
6577 carrierInfo.allowedCarriers[i].matchData =
6578 convertCharPtrToHidlString(carrier->match_data);
6579 }
6580
6581 carrierInfo.excludedCarriers.resize(pCr->len_excluded_carriers);
6582 for(int i = 0; i < pCr->len_excluded_carriers; i++) {
6583 RIL_Carrier *carrier = pCr->excluded_carriers + i;
6584 carrierInfo.excludedCarriers[i].mcc = convertCharPtrToHidlString(carrier->mcc);
6585 carrierInfo.excludedCarriers[i].mnc = convertCharPtrToHidlString(carrier->mnc);
6586 carrierInfo.excludedCarriers[i].matchType = (CarrierMatchType) carrier->match_type;
6587 carrierInfo.excludedCarriers[i].matchData =
6588 convertCharPtrToHidlString(carrier->match_data);
6589 }
6590 }
6591
6592 Return<void> retStatus
6593 = radioService[slotId]->mRadioResponse->getAllowedCarriersResponse(responseInfo,
6594 allAllowed, carrierInfo);
6595 radioService[slotId]->checkReturnStatus(retStatus);
6596 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006597 RLOGE("getAllowedCarriersResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006598 slotId);
6599 }
6600
6601 return 0;
6602}
6603
Amit Mahajan759786a2017-03-03 17:35:47 -08006604int radio::sendDeviceStateResponse(int slotId,
Jack Yu11ab4042017-02-21 17:08:01 -08006605 int responseType, int serial, RIL_Errno e,
6606 void *response, size_t responselen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006607#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006608 RLOGD("sendDeviceStateResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006609#endif
Jack Yu11ab4042017-02-21 17:08:01 -08006610
6611 if (radioService[slotId]->mRadioResponse != NULL) {
6612 RadioResponseInfo responseInfo = {};
6613 populateResponseInfo(responseInfo, serial, responseType, e);
6614 Return<void> retStatus
6615 = radioService[slotId]->mRadioResponse->sendDeviceStateResponse(responseInfo);
6616 radioService[slotId]->checkReturnStatus(retStatus);
6617 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006618 RLOGE("sendDeviceStateResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Jack Yu11ab4042017-02-21 17:08:01 -08006619 }
6620
6621 return 0;
6622}
6623
pkanwardb8e0942017-03-17 12:49:34 -07006624int radio::setCarrierInfoForImsiEncryptionResponse(int slotId,
6625 int responseType, int serial, RIL_Errno e,
6626 void *response, size_t responseLen) {
6627 RLOGD("setCarrierInfoForImsiEncryptionResponse: serial %d", serial);
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07006628 if (radioService[slotId]->mRadioResponseV1_1 != NULL) {
pkanwardb8e0942017-03-17 12:49:34 -07006629 RadioResponseInfo responseInfo = {};
6630 populateResponseInfo(responseInfo, serial, responseType, e);
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07006631 Return<void> retStatus = radioService[slotId]->mRadioResponseV1_1->
6632 setCarrierInfoForImsiEncryptionResponse(responseInfo);
6633 radioService[slotId]->checkReturnStatus(retStatus);
pkanwardb8e0942017-03-17 12:49:34 -07006634 } else {
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07006635 RLOGE("setCarrierInfoForImsiEncryptionResponse: radioService[%d]->mRadioResponseV1_1 == "
6636 "NULL", slotId);
pkanwardb8e0942017-03-17 12:49:34 -07006637 }
6638 return 0;
6639}
6640
Amit Mahajan759786a2017-03-03 17:35:47 -08006641int radio::setIndicationFilterResponse(int slotId,
Jack Yu11ab4042017-02-21 17:08:01 -08006642 int responseType, int serial, RIL_Errno e,
6643 void *response, size_t responselen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006644#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006645 RLOGD("setIndicationFilterResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006646#endif
Jack Yu11ab4042017-02-21 17:08:01 -08006647
6648 if (radioService[slotId]->mRadioResponse != NULL) {
6649 RadioResponseInfo responseInfo = {};
6650 populateResponseInfo(responseInfo, serial, responseType, e);
6651 Return<void> retStatus
6652 = radioService[slotId]->mRadioResponse->setIndicationFilterResponse(responseInfo);
6653 radioService[slotId]->checkReturnStatus(retStatus);
6654 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006655 RLOGE("setIndicationFilterResponse: radioService[%d]->mRadioResponse == NULL",
Jack Yu11ab4042017-02-21 17:08:01 -08006656 slotId);
6657 }
6658
6659 return 0;
6660}
6661
Amit Mahajan759786a2017-03-03 17:35:47 -08006662int radio::setSimCardPowerResponse(int slotId,
Wileen Chiu718c0bf2017-01-04 11:37:19 -08006663 int responseType, int serial, RIL_Errno e,
6664 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006665#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006666 RLOGD("setSimCardPowerResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006667#endif
Wileen Chiu718c0bf2017-01-04 11:37:19 -08006668
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07006669 if (radioService[slotId]->mRadioResponse != NULL
6670 || radioService[slotId]->mRadioResponseV1_1 != NULL) {
Wileen Chiu718c0bf2017-01-04 11:37:19 -08006671 RadioResponseInfo responseInfo = {};
6672 populateResponseInfo(responseInfo, serial, responseType, e);
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07006673 if (radioService[slotId]->mRadioResponseV1_1 != NULL) {
6674 Return<void> retStatus = radioService[slotId]->mRadioResponseV1_1->
6675 setSimCardPowerResponse_1_1(responseInfo);
Grace Chen08eb6542017-03-23 18:39:48 -07006676 radioService[slotId]->checkReturnStatus(retStatus);
6677 } else {
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07006678 RLOGD("setSimCardPowerResponse: radioService[%d]->mRadioResponseV1_1 == NULL",
Grace Chen08eb6542017-03-23 18:39:48 -07006679 slotId);
6680 Return<void> retStatus
6681 = radioService[slotId]->mRadioResponse->setSimCardPowerResponse(responseInfo);
6682 radioService[slotId]->checkReturnStatus(retStatus);
6683 }
Wileen Chiu718c0bf2017-01-04 11:37:19 -08006684 } else {
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07006685 RLOGE("setSimCardPowerResponse: radioService[%d]->mRadioResponse == NULL && "
6686 "radioService[%d]->mRadioResponseV1_1 == NULL", slotId, slotId);
Wileen Chiu718c0bf2017-01-04 11:37:19 -08006687 }
Wileen Chiu718c0bf2017-01-04 11:37:19 -08006688 return 0;
6689}
6690
yinxu8688abd2017-05-22 11:26:45 -07006691int radio::startNetworkScanResponse(int slotId, int responseType, int serial, RIL_Errno e,
6692 void *response, size_t responseLen) {
6693#if VDBG
6694 RLOGD("startNetworkScanResponse: serial %d", serial);
6695#endif
6696
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07006697 if (radioService[slotId]->mRadioResponseV1_1 != NULL) {
yinxu8688abd2017-05-22 11:26:45 -07006698 RadioResponseInfo responseInfo = {};
6699 populateResponseInfo(responseInfo, serial, responseType, e);
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07006700 Return<void> retStatus
6701 = radioService[slotId]->mRadioResponseV1_1->startNetworkScanResponse(responseInfo);
6702 radioService[slotId]->checkReturnStatus(retStatus);
yinxu8688abd2017-05-22 11:26:45 -07006703 } else {
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07006704 RLOGE("startNetworkScanResponse: radioService[%d]->mRadioResponseV1_1 == NULL", slotId);
yinxu8688abd2017-05-22 11:26:45 -07006705 }
6706
6707 return 0;
6708}
6709
6710int radio::stopNetworkScanResponse(int slotId, int responseType, int serial, RIL_Errno e,
6711 void *response, size_t responseLen) {
6712#if VDBG
6713 RLOGD("stopNetworkScanResponse: serial %d", serial);
6714#endif
6715
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07006716 if (radioService[slotId]->mRadioResponseV1_1 != NULL) {
yinxu8688abd2017-05-22 11:26:45 -07006717 RadioResponseInfo responseInfo = {};
6718 populateResponseInfo(responseInfo, serial, responseType, e);
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07006719 Return<void> retStatus
6720 = radioService[slotId]->mRadioResponseV1_1->stopNetworkScanResponse(responseInfo);
6721 radioService[slotId]->checkReturnStatus(retStatus);
yinxu8688abd2017-05-22 11:26:45 -07006722 } else {
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07006723 RLOGE("stopNetworkScanResponse: radioService[%d]->mRadioResponseV1_1 == NULL", slotId);
yinxu8688abd2017-05-22 11:26:45 -07006724 }
6725
6726 return 0;
6727}
6728
Nathan Harold6a8809d2017-07-07 19:28:58 -07006729void convertRilKeepaliveStatusToHal(const RIL_KeepaliveStatus *rilStatus,
6730 V1_1::KeepaliveStatus& halStatus) {
6731 halStatus.sessionHandle = rilStatus->sessionHandle;
6732 halStatus.code = static_cast<V1_1::KeepaliveStatusCode>(rilStatus->code);
6733}
6734
6735int radio::startKeepaliveResponse(int slotId, int responseType, int serial, RIL_Errno e,
6736 void *response, size_t responseLen) {
6737#if VDBG
6738 RLOGD("%s(): %d", __FUNCTION__, serial);
6739#endif
6740 RadioResponseInfo responseInfo = {};
6741 populateResponseInfo(responseInfo, serial, responseType, e);
6742
6743 // If we don't have a radio service, there's nothing we can do
6744 if (radioService[slotId]->mRadioResponseV1_1 == NULL) {
6745 RLOGE("%s: radioService[%d]->mRadioResponseV1_1 == NULL", __FUNCTION__, slotId);
6746 return 0;
6747 }
6748
6749 V1_1::KeepaliveStatus ks = {};
6750 if (response == NULL || responseLen != sizeof(V1_1::KeepaliveStatus)) {
6751 RLOGE("%s: invalid response - %d", __FUNCTION__, static_cast<int>(e));
6752 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
6753 } else {
6754 convertRilKeepaliveStatusToHal(static_cast<RIL_KeepaliveStatus*>(response), ks);
6755 }
6756
6757 Return<void> retStatus =
6758 radioService[slotId]->mRadioResponseV1_1->startKeepaliveResponse(responseInfo, ks);
6759 radioService[slotId]->checkReturnStatus(retStatus);
6760 return 0;
6761}
6762
6763int radio::stopKeepaliveResponse(int slotId, int responseType, int serial, RIL_Errno e,
6764 void *response, size_t responseLen) {
6765#if VDBG
6766 RLOGD("%s(): %d", __FUNCTION__, serial);
6767#endif
6768 RadioResponseInfo responseInfo = {};
6769 populateResponseInfo(responseInfo, serial, responseType, e);
6770
6771 // If we don't have a radio service, there's nothing we can do
6772 if (radioService[slotId]->mRadioResponseV1_1 == NULL) {
6773 RLOGE("%s: radioService[%d]->mRadioResponseV1_1 == NULL", __FUNCTION__, slotId);
6774 return 0;
6775 }
6776
6777 Return<void> retStatus =
6778 radioService[slotId]->mRadioResponseV1_1->stopKeepaliveResponse(responseInfo);
6779 radioService[slotId]->checkReturnStatus(retStatus);
6780 return 0;
6781}
6782
Amit Mahajan759786a2017-03-03 17:35:47 -08006783int radio::sendRequestRawResponse(int slotId,
Amit Mahajan439da362017-02-13 17:43:04 -08006784 int responseType, int serial, RIL_Errno e,
6785 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006786#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006787 RLOGD("sendRequestRawResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006788#endif
Amit Mahajan439da362017-02-13 17:43:04 -08006789
Steven Moreland6cc40042018-03-20 11:20:05 -07006790 if (!kOemHookEnabled) return 0;
6791
Amit Mahajan439da362017-02-13 17:43:04 -08006792 if (oemHookService[slotId]->mOemHookResponse != NULL) {
6793 RadioResponseInfo responseInfo = {};
6794 populateResponseInfo(responseInfo, serial, responseType, e);
6795 hidl_vec<uint8_t> data;
6796
6797 if (response == NULL) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006798 RLOGE("sendRequestRawResponse: Invalid response");
Amit Mahajan439da362017-02-13 17:43:04 -08006799 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
6800 } else {
6801 data.setToExternal((uint8_t *) response, responseLen);
6802 }
6803 Return<void> retStatus = oemHookService[slotId]->mOemHookResponse->
6804 sendRequestRawResponse(responseInfo, data);
Amit Mahajand423d192017-03-16 17:04:01 -07006805 checkReturnStatus(slotId, retStatus, false);
Amit Mahajan439da362017-02-13 17:43:04 -08006806 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006807 RLOGE("sendRequestRawResponse: oemHookService[%d]->mOemHookResponse == NULL",
Amit Mahajan439da362017-02-13 17:43:04 -08006808 slotId);
6809 }
6810
6811 return 0;
6812}
6813
Amit Mahajan759786a2017-03-03 17:35:47 -08006814int radio::sendRequestStringsResponse(int slotId,
Amit Mahajan439da362017-02-13 17:43:04 -08006815 int responseType, int serial, RIL_Errno e,
6816 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006817#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006818 RLOGD("sendRequestStringsResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006819#endif
Amit Mahajan439da362017-02-13 17:43:04 -08006820
Steven Moreland6cc40042018-03-20 11:20:05 -07006821 if (!kOemHookEnabled) return 0;
6822
Amit Mahajan439da362017-02-13 17:43:04 -08006823 if (oemHookService[slotId]->mOemHookResponse != NULL) {
6824 RadioResponseInfo responseInfo = {};
6825 populateResponseInfo(responseInfo, serial, responseType, e);
6826 hidl_vec<hidl_string> data;
6827
Amit Mahajan13058cb2017-06-07 23:10:27 -07006828 if ((response == NULL && responseLen != 0) || responseLen % sizeof(char *) != 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006829 RLOGE("sendRequestStringsResponse Invalid response: NULL");
Amit Mahajan439da362017-02-13 17:43:04 -08006830 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
6831 } else {
6832 char **resp = (char **) response;
6833 int numStrings = responseLen / sizeof(char *);
6834 data.resize(numStrings);
6835 for (int i = 0; i < numStrings; i++) {
6836 data[i] = convertCharPtrToHidlString(resp[i]);
6837 }
6838 }
6839 Return<void> retStatus
6840 = oemHookService[slotId]->mOemHookResponse->sendRequestStringsResponse(
6841 responseInfo, data);
Amit Mahajand423d192017-03-16 17:04:01 -07006842 checkReturnStatus(slotId, retStatus, false);
Amit Mahajan439da362017-02-13 17:43:04 -08006843 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006844 RLOGE("sendRequestStringsResponse: oemHookService[%d]->mOemHookResponse == "
Amit Mahajan439da362017-02-13 17:43:04 -08006845 "NULL", slotId);
6846 }
6847
6848 return 0;
6849}
6850
Nathan Harold6a8809d2017-07-07 19:28:58 -07006851/***************************************************************************************************
6852 * INDICATION FUNCTIONS
6853 * The below function handle unsolicited messages coming from the Radio
6854 * (messages for which there is no pending request)
6855 **************************************************************************************************/
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006856
Amit Mahajan5829a472016-12-28 17:28:07 -08006857RadioIndicationType convertIntToRadioIndicationType(int indicationType) {
6858 return indicationType == RESPONSE_UNSOLICITED ? (RadioIndicationType::UNSOLICITED) :
6859 (RadioIndicationType::UNSOLICITED_ACK_EXP);
6860}
6861
Amit Mahajan759786a2017-03-03 17:35:47 -08006862int radio::radioStateChangedInd(int slotId,
Amit Mahajan1f652692017-03-01 12:08:46 -08006863 int indicationType, int token, RIL_Errno e, void *response,
6864 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08006865 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajanb3a11bb2017-05-15 16:41:44 -07006866 RadioState radioState =
6867 (RadioState) CALL_ONSTATEREQUEST(slotId);
Amit Mahajan111ddca2017-03-03 12:05:13 -08006868 RLOGD("radioStateChangedInd: radioState %d", radioState);
Amit Mahajan17249842017-01-19 15:05:45 -08006869 Return<void> retStatus = radioService[slotId]->mRadioIndication->radioStateChanged(
Amit Mahajan1f652692017-03-01 12:08:46 -08006870 convertIntToRadioIndicationType(indicationType), radioState);
Amit Mahajan17249842017-01-19 15:05:45 -08006871 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajancd77a5b2016-08-25 11:19:21 -07006872 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006873 RLOGE("radioStateChangedInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajancd77a5b2016-08-25 11:19:21 -07006874 }
Amit Mahajan1f652692017-03-01 12:08:46 -08006875
6876 return 0;
Amit Mahajancd77a5b2016-08-25 11:19:21 -07006877}
6878
Amit Mahajan759786a2017-03-03 17:35:47 -08006879int radio::callStateChangedInd(int slotId,
Amit Mahajan5829a472016-12-28 17:28:07 -08006880 int indicationType, int token, RIL_Errno e, void *response,
6881 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08006882 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006883#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006884 RLOGD("callStateChangedInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07006885#endif
Amit Mahajan17249842017-01-19 15:05:45 -08006886 Return<void> retStatus = radioService[slotId]->mRadioIndication->callStateChanged(
Amit Mahajan5829a472016-12-28 17:28:07 -08006887 convertIntToRadioIndicationType(indicationType));
Amit Mahajan17249842017-01-19 15:05:45 -08006888 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08006889 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006890 RLOGE("callStateChangedInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08006891 }
6892
6893 return 0;
6894}
6895
Amit Mahajan759786a2017-03-03 17:35:47 -08006896int radio::networkStateChangedInd(int slotId,
Amit Mahajan1f652692017-03-01 12:08:46 -08006897 int indicationType, int token, RIL_Errno e, void *response,
6898 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08006899 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006900#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006901 RLOGD("networkStateChangedInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07006902#endif
Jack Yu06181bb2017-01-10 12:10:41 -08006903 Return<void> retStatus = radioService[slotId]->mRadioIndication->networkStateChanged(
Amit Mahajan5829a472016-12-28 17:28:07 -08006904 convertIntToRadioIndicationType(indicationType));
Amit Mahajan17249842017-01-19 15:05:45 -08006905 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08006906 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006907 RLOGE("networkStateChangedInd: radioService[%d]->mRadioIndication == NULL",
Amit Mahajan2fa9e632017-01-06 16:55:33 -08006908 slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08006909 }
6910
6911 return 0;
6912}
6913
6914uint8_t hexCharToInt(uint8_t c) {
6915 if (c >= '0' && c <= '9') return (c - '0');
6916 if (c >= 'A' && c <= 'F') return (c - 'A' + 10);
6917 if (c >= 'a' && c <= 'f') return (c - 'a' + 10);
6918
6919 return INVALID_HEX_CHAR;
6920}
6921
6922uint8_t * convertHexStringToBytes(void *response, size_t responseLen) {
6923 if (responseLen % 2 != 0) {
6924 return NULL;
6925 }
6926
6927 uint8_t *bytes = (uint8_t *)calloc(responseLen/2, sizeof(uint8_t));
6928 if (bytes == NULL) {
6929 RLOGE("convertHexStringToBytes: cannot allocate memory for bytes string");
6930 return NULL;
6931 }
6932 uint8_t *hexString = (uint8_t *)response;
6933
Wei Wang100ac9b2017-02-03 14:18:07 -08006934 for (size_t i = 0; i < responseLen; i += 2) {
Amit Mahajan5829a472016-12-28 17:28:07 -08006935 uint8_t hexChar1 = hexCharToInt(hexString[i]);
6936 uint8_t hexChar2 = hexCharToInt(hexString[i + 1]);
6937
6938 if (hexChar1 == INVALID_HEX_CHAR || hexChar2 == INVALID_HEX_CHAR) {
6939 RLOGE("convertHexStringToBytes: invalid hex char %d %d",
6940 hexString[i], hexString[i + 1]);
6941 free(bytes);
6942 return NULL;
6943 }
6944 bytes[i/2] = ((hexChar1 << 4) | hexChar2);
6945 }
6946
6947 return bytes;
6948}
6949
Amit Mahajan759786a2017-03-03 17:35:47 -08006950int radio::newSmsInd(int slotId, int indicationType,
Amit Mahajan5829a472016-12-28 17:28:07 -08006951 int token, RIL_Errno e, void *response, size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08006952 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan5829a472016-12-28 17:28:07 -08006953 if (response == NULL || responseLen == 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006954 RLOGE("newSmsInd: invalid response");
Amit Mahajan5829a472016-12-28 17:28:07 -08006955 return 0;
6956 }
6957
6958 uint8_t *bytes = convertHexStringToBytes(response, responseLen);
6959 if (bytes == NULL) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006960 RLOGE("newSmsInd: convertHexStringToBytes failed");
Amit Mahajan5829a472016-12-28 17:28:07 -08006961 return 0;
6962 }
6963
6964 hidl_vec<uint8_t> pdu;
6965 pdu.setToExternal(bytes, responseLen/2);
Jayachandran C572f2f42017-03-25 14:30:13 -07006966#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006967 RLOGD("newSmsInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07006968#endif
Amit Mahajan17249842017-01-19 15:05:45 -08006969 Return<void> retStatus = radioService[slotId]->mRadioIndication->newSms(
Amit Mahajan5829a472016-12-28 17:28:07 -08006970 convertIntToRadioIndicationType(indicationType), pdu);
Amit Mahajan17249842017-01-19 15:05:45 -08006971 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08006972 free(bytes);
6973 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006974 RLOGE("newSmsInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08006975 }
6976
6977 return 0;
6978}
6979
Amit Mahajan759786a2017-03-03 17:35:47 -08006980int radio::newSmsStatusReportInd(int slotId,
Amit Mahajan5829a472016-12-28 17:28:07 -08006981 int indicationType, int token, RIL_Errno e, void *response,
6982 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08006983 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan5829a472016-12-28 17:28:07 -08006984 if (response == NULL || responseLen == 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006985 RLOGE("newSmsStatusReportInd: invalid response");
Amit Mahajan5829a472016-12-28 17:28:07 -08006986 return 0;
6987 }
6988
6989 uint8_t *bytes = convertHexStringToBytes(response, responseLen);
6990 if (bytes == NULL) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006991 RLOGE("newSmsStatusReportInd: convertHexStringToBytes failed");
Amit Mahajan5829a472016-12-28 17:28:07 -08006992 return 0;
6993 }
6994
6995 hidl_vec<uint8_t> pdu;
6996 pdu.setToExternal(bytes, responseLen/2);
Jayachandran C572f2f42017-03-25 14:30:13 -07006997#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006998 RLOGD("newSmsStatusReportInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07006999#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007000 Return<void> retStatus = radioService[slotId]->mRadioIndication->newSmsStatusReport(
Amit Mahajan5829a472016-12-28 17:28:07 -08007001 convertIntToRadioIndicationType(indicationType), pdu);
Amit Mahajan17249842017-01-19 15:05:45 -08007002 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08007003 free(bytes);
7004 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007005 RLOGE("newSmsStatusReportInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08007006 }
7007
7008 return 0;
7009}
7010
Amit Mahajan759786a2017-03-03 17:35:47 -08007011int radio::newSmsOnSimInd(int slotId, int indicationType,
Amit Mahajan5829a472016-12-28 17:28:07 -08007012 int token, RIL_Errno e, void *response, size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007013 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan5829a472016-12-28 17:28:07 -08007014 if (response == NULL || responseLen != sizeof(int)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007015 RLOGE("newSmsOnSimInd: invalid response");
Amit Mahajan5829a472016-12-28 17:28:07 -08007016 return 0;
7017 }
7018 int32_t recordNumber = ((int32_t *) response)[0];
Jayachandran C572f2f42017-03-25 14:30:13 -07007019#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007020 RLOGD("newSmsOnSimInd: slotIndex %d", recordNumber);
Jayachandran C572f2f42017-03-25 14:30:13 -07007021#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007022 Return<void> retStatus = radioService[slotId]->mRadioIndication->newSmsOnSim(
Amit Mahajan5829a472016-12-28 17:28:07 -08007023 convertIntToRadioIndicationType(indicationType), recordNumber);
Amit Mahajan17249842017-01-19 15:05:45 -08007024 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08007025 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007026 RLOGE("newSmsOnSimInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08007027 }
7028
7029 return 0;
7030}
7031
Amit Mahajan759786a2017-03-03 17:35:47 -08007032int radio::onUssdInd(int slotId, int indicationType,
Amit Mahajan5829a472016-12-28 17:28:07 -08007033 int token, RIL_Errno e, void *response, size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007034 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan5829a472016-12-28 17:28:07 -08007035 if (response == NULL || responseLen != 2 * sizeof(char *)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007036 RLOGE("onUssdInd: invalid response");
Amit Mahajan5829a472016-12-28 17:28:07 -08007037 return 0;
7038 }
7039 char **strings = (char **) response;
7040 char *mode = strings[0];
7041 hidl_string msg = convertCharPtrToHidlString(strings[1]);
7042 UssdModeType modeType = (UssdModeType) atoi(mode);
Jayachandran C572f2f42017-03-25 14:30:13 -07007043#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007044 RLOGD("onUssdInd: mode %s", mode);
Jayachandran C572f2f42017-03-25 14:30:13 -07007045#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007046 Return<void> retStatus = radioService[slotId]->mRadioIndication->onUssd(
Amit Mahajan5829a472016-12-28 17:28:07 -08007047 convertIntToRadioIndicationType(indicationType), modeType, msg);
Amit Mahajan17249842017-01-19 15:05:45 -08007048 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08007049 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007050 RLOGE("onUssdInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08007051 }
7052
7053 return 0;
7054}
7055
Amit Mahajan759786a2017-03-03 17:35:47 -08007056int radio::nitzTimeReceivedInd(int slotId,
Amit Mahajan5829a472016-12-28 17:28:07 -08007057 int indicationType, int token, RIL_Errno e, void *response,
7058 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007059 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan5829a472016-12-28 17:28:07 -08007060 if (response == NULL || responseLen == 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007061 RLOGE("nitzTimeReceivedInd: invalid response");
Amit Mahajan5829a472016-12-28 17:28:07 -08007062 return 0;
7063 }
7064 hidl_string nitzTime = convertCharPtrToHidlString((char *) response);
Jayachandran C572f2f42017-03-25 14:30:13 -07007065#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007066 RLOGD("nitzTimeReceivedInd: nitzTime %s receivedTime %" PRId64, nitzTime.c_str(),
Amit Mahajane9a10e62018-02-23 17:12:15 -08007067 nitzTimeReceived[slotId]);
Jayachandran C572f2f42017-03-25 14:30:13 -07007068#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007069 Return<void> retStatus = radioService[slotId]->mRadioIndication->nitzTimeReceived(
Amit Mahajane9a10e62018-02-23 17:12:15 -08007070 convertIntToRadioIndicationType(indicationType), nitzTime,
7071 nitzTimeReceived[slotId]);
Amit Mahajan17249842017-01-19 15:05:45 -08007072 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08007073 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007074 RLOGE("nitzTimeReceivedInd: radioService[%d]->mRadioIndication == NULL", slotId);
Weilun Dud2c30932017-02-09 12:32:42 -08007075 return -1;
Amit Mahajan5829a472016-12-28 17:28:07 -08007076 }
7077
7078 return 0;
7079}
7080
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007081void convertRilSignalStrengthToHal(void *response, size_t responseLen,
7082 SignalStrength& signalStrength) {
7083 RIL_SignalStrength_v10 *rilSignalStrength = (RIL_SignalStrength_v10 *) response;
7084
7085 // Fixup LTE for backwards compatibility
7086 // signalStrength: -1 -> 99
7087 if (rilSignalStrength->LTE_SignalStrength.signalStrength == -1) {
7088 rilSignalStrength->LTE_SignalStrength.signalStrength = 99;
7089 }
7090 // rsrp: -1 -> INT_MAX all other negative value to positive.
7091 // So remap here
7092 if (rilSignalStrength->LTE_SignalStrength.rsrp == -1) {
7093 rilSignalStrength->LTE_SignalStrength.rsrp = INT_MAX;
7094 } else if (rilSignalStrength->LTE_SignalStrength.rsrp < -1) {
7095 rilSignalStrength->LTE_SignalStrength.rsrp = -rilSignalStrength->LTE_SignalStrength.rsrp;
7096 }
7097 // rsrq: -1 -> INT_MAX
7098 if (rilSignalStrength->LTE_SignalStrength.rsrq == -1) {
7099 rilSignalStrength->LTE_SignalStrength.rsrq = INT_MAX;
7100 }
7101 // Not remapping rssnr is already using INT_MAX
7102 // cqi: -1 -> INT_MAX
7103 if (rilSignalStrength->LTE_SignalStrength.cqi == -1) {
7104 rilSignalStrength->LTE_SignalStrength.cqi = INT_MAX;
7105 }
7106
7107 signalStrength.gw.signalStrength = rilSignalStrength->GW_SignalStrength.signalStrength;
7108 signalStrength.gw.bitErrorRate = rilSignalStrength->GW_SignalStrength.bitErrorRate;
Tim Lin87316482019-01-22 17:17:51 +08007109 // RIL_SignalStrength_v10 not support gw.timingAdvance. Set to INT_MAX as
7110 // invalid value.
7111 signalStrength.gw.timingAdvance = INT_MAX;
7112
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007113 signalStrength.cdma.dbm = rilSignalStrength->CDMA_SignalStrength.dbm;
7114 signalStrength.cdma.ecio = rilSignalStrength->CDMA_SignalStrength.ecio;
7115 signalStrength.evdo.dbm = rilSignalStrength->EVDO_SignalStrength.dbm;
7116 signalStrength.evdo.ecio = rilSignalStrength->EVDO_SignalStrength.ecio;
7117 signalStrength.evdo.signalNoiseRatio =
7118 rilSignalStrength->EVDO_SignalStrength.signalNoiseRatio;
7119 signalStrength.lte.signalStrength = rilSignalStrength->LTE_SignalStrength.signalStrength;
7120 signalStrength.lte.rsrp = rilSignalStrength->LTE_SignalStrength.rsrp;
7121 signalStrength.lte.rsrq = rilSignalStrength->LTE_SignalStrength.rsrq;
7122 signalStrength.lte.rssnr = rilSignalStrength->LTE_SignalStrength.rssnr;
7123 signalStrength.lte.cqi = rilSignalStrength->LTE_SignalStrength.cqi;
7124 signalStrength.lte.timingAdvance = rilSignalStrength->LTE_SignalStrength.timingAdvance;
7125 signalStrength.tdScdma.rscp = rilSignalStrength->TD_SCDMA_SignalStrength.rscp;
7126}
7127
Amit Mahajan759786a2017-03-03 17:35:47 -08007128int radio::currentSignalStrengthInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007129 int indicationType, int token, RIL_Errno e,
7130 void *response, size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007131 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007132 if (response == NULL || responseLen != sizeof(RIL_SignalStrength_v10)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007133 RLOGE("currentSignalStrengthInd: invalid response");
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007134 return 0;
7135 }
7136
Jack Yuf68e0da2017-02-07 14:53:09 -08007137 SignalStrength signalStrength = {};
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007138 convertRilSignalStrengthToHal(response, responseLen, signalStrength);
7139
Jayachandran C572f2f42017-03-25 14:30:13 -07007140#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007141 RLOGD("currentSignalStrengthInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07007142#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007143 Return<void> retStatus = radioService[slotId]->mRadioIndication->currentSignalStrength(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007144 convertIntToRadioIndicationType(indicationType), signalStrength);
Amit Mahajan17249842017-01-19 15:05:45 -08007145 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007146 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007147 RLOGE("currentSignalStrengthInd: radioService[%d]->mRadioIndication == NULL",
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007148 slotId);
7149 }
7150
7151 return 0;
7152}
7153
Amit Mahajan5829a472016-12-28 17:28:07 -08007154void convertRilDataCallToHal(RIL_Data_Call_Response_v11 *dcResponse,
7155 SetupDataCallResult& dcResult) {
Jack Yu5079e182017-02-28 15:21:18 -08007156 dcResult.status = (DataCallFailCause) dcResponse->status;
Amit Mahajan5829a472016-12-28 17:28:07 -08007157 dcResult.suggestedRetryTime = dcResponse->suggestedRetryTime;
7158 dcResult.cid = dcResponse->cid;
7159 dcResult.active = dcResponse->active;
7160 dcResult.type = convertCharPtrToHidlString(dcResponse->type);
7161 dcResult.ifname = convertCharPtrToHidlString(dcResponse->ifname);
7162 dcResult.addresses = convertCharPtrToHidlString(dcResponse->addresses);
7163 dcResult.dnses = convertCharPtrToHidlString(dcResponse->dnses);
7164 dcResult.gateways = convertCharPtrToHidlString(dcResponse->gateways);
7165 dcResult.pcscf = convertCharPtrToHidlString(dcResponse->pcscf);
7166 dcResult.mtu = dcResponse->mtu;
7167}
7168
7169void convertRilDataCallListToHal(void *response, size_t responseLen,
7170 hidl_vec<SetupDataCallResult>& dcResultList) {
7171 int num = responseLen / sizeof(RIL_Data_Call_Response_v11);
7172
7173 RIL_Data_Call_Response_v11 *dcResponse = (RIL_Data_Call_Response_v11 *) response;
7174 dcResultList.resize(num);
7175 for (int i = 0; i < num; i++) {
7176 convertRilDataCallToHal(&dcResponse[i], dcResultList[i]);
7177 }
7178}
7179
Amit Mahajan759786a2017-03-03 17:35:47 -08007180int radio::dataCallListChangedInd(int slotId,
Amit Mahajan5829a472016-12-28 17:28:07 -08007181 int indicationType, int token, RIL_Errno e, void *response,
7182 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007183 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan13058cb2017-06-07 23:10:27 -07007184 if ((response == NULL && responseLen != 0)
7185 || responseLen % sizeof(RIL_Data_Call_Response_v11) != 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007186 RLOGE("dataCallListChangedInd: invalid response");
Amit Mahajan5829a472016-12-28 17:28:07 -08007187 return 0;
7188 }
7189 hidl_vec<SetupDataCallResult> dcList;
7190 convertRilDataCallListToHal(response, responseLen, dcList);
Jayachandran C572f2f42017-03-25 14:30:13 -07007191#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007192 RLOGD("dataCallListChangedInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07007193#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007194 Return<void> retStatus = radioService[slotId]->mRadioIndication->dataCallListChanged(
Amit Mahajan5829a472016-12-28 17:28:07 -08007195 convertIntToRadioIndicationType(indicationType), dcList);
Amit Mahajan17249842017-01-19 15:05:45 -08007196 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08007197 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007198 RLOGE("dataCallListChangedInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08007199 }
7200
7201 return 0;
7202}
7203
Amit Mahajan759786a2017-03-03 17:35:47 -08007204int radio::suppSvcNotifyInd(int slotId, int indicationType,
Amit Mahajan5829a472016-12-28 17:28:07 -08007205 int token, RIL_Errno e, void *response, size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007206 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan5829a472016-12-28 17:28:07 -08007207 if (response == NULL || responseLen != sizeof(RIL_SuppSvcNotification)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007208 RLOGE("suppSvcNotifyInd: invalid response");
Amit Mahajan5829a472016-12-28 17:28:07 -08007209 return 0;
7210 }
7211
Jack Yuf68e0da2017-02-07 14:53:09 -08007212 SuppSvcNotification suppSvc = {};
Amit Mahajan5829a472016-12-28 17:28:07 -08007213 RIL_SuppSvcNotification *ssn = (RIL_SuppSvcNotification *) response;
7214 suppSvc.isMT = ssn->notificationType;
7215 suppSvc.code = ssn->code;
7216 suppSvc.index = ssn->index;
7217 suppSvc.type = ssn->type;
7218 suppSvc.number = convertCharPtrToHidlString(ssn->number);
7219
Jayachandran C572f2f42017-03-25 14:30:13 -07007220#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007221 RLOGD("suppSvcNotifyInd: isMT %d code %d index %d type %d",
Amit Mahajan5829a472016-12-28 17:28:07 -08007222 suppSvc.isMT, suppSvc.code, suppSvc.index, suppSvc.type);
Jayachandran C572f2f42017-03-25 14:30:13 -07007223#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007224 Return<void> retStatus = radioService[slotId]->mRadioIndication->suppSvcNotify(
Amit Mahajan5829a472016-12-28 17:28:07 -08007225 convertIntToRadioIndicationType(indicationType), suppSvc);
Amit Mahajan17249842017-01-19 15:05:45 -08007226 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08007227 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007228 RLOGE("suppSvcNotifyInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08007229 }
7230
7231 return 0;
7232}
7233
Amit Mahajan759786a2017-03-03 17:35:47 -08007234int radio::stkSessionEndInd(int slotId, int indicationType,
Amit Mahajan5829a472016-12-28 17:28:07 -08007235 int token, RIL_Errno e, void *response, size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007236 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Jayachandran C572f2f42017-03-25 14:30:13 -07007237#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007238 RLOGD("stkSessionEndInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07007239#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007240 Return<void> retStatus = radioService[slotId]->mRadioIndication->stkSessionEnd(
Amit Mahajan5829a472016-12-28 17:28:07 -08007241 convertIntToRadioIndicationType(indicationType));
Amit Mahajan17249842017-01-19 15:05:45 -08007242 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08007243 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007244 RLOGE("stkSessionEndInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08007245 }
7246
7247 return 0;
7248}
7249
Amit Mahajan759786a2017-03-03 17:35:47 -08007250int radio::stkProactiveCommandInd(int slotId,
Amit Mahajan5829a472016-12-28 17:28:07 -08007251 int indicationType, int token, RIL_Errno e, void *response,
7252 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007253 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan5829a472016-12-28 17:28:07 -08007254 if (response == NULL || responseLen == 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007255 RLOGE("stkProactiveCommandInd: invalid response");
Amit Mahajan5829a472016-12-28 17:28:07 -08007256 return 0;
7257 }
Jayachandran C572f2f42017-03-25 14:30:13 -07007258#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007259 RLOGD("stkProactiveCommandInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07007260#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007261 Return<void> retStatus = radioService[slotId]->mRadioIndication->stkProactiveCommand(
Amit Mahajan5829a472016-12-28 17:28:07 -08007262 convertIntToRadioIndicationType(indicationType),
7263 convertCharPtrToHidlString((char *) response));
Amit Mahajan17249842017-01-19 15:05:45 -08007264 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08007265 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007266 RLOGE("stkProactiveCommandInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08007267 }
7268
7269 return 0;
7270}
7271
Amit Mahajan759786a2017-03-03 17:35:47 -08007272int radio::stkEventNotifyInd(int slotId, int indicationType,
Amit Mahajan5829a472016-12-28 17:28:07 -08007273 int token, RIL_Errno e, void *response, size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007274 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan5829a472016-12-28 17:28:07 -08007275 if (response == NULL || responseLen == 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007276 RLOGE("stkEventNotifyInd: invalid response");
Amit Mahajan5829a472016-12-28 17:28:07 -08007277 return 0;
7278 }
Jayachandran C572f2f42017-03-25 14:30:13 -07007279#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007280 RLOGD("stkEventNotifyInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07007281#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007282 Return<void> retStatus = radioService[slotId]->mRadioIndication->stkEventNotify(
Amit Mahajan5829a472016-12-28 17:28:07 -08007283 convertIntToRadioIndicationType(indicationType),
7284 convertCharPtrToHidlString((char *) response));
Amit Mahajan17249842017-01-19 15:05:45 -08007285 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08007286 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007287 RLOGE("stkEventNotifyInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08007288 }
7289
7290 return 0;
7291}
7292
Amit Mahajan759786a2017-03-03 17:35:47 -08007293int radio::stkCallSetupInd(int slotId, int indicationType,
Amit Mahajan5829a472016-12-28 17:28:07 -08007294 int token, RIL_Errno e, void *response, size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007295 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan5829a472016-12-28 17:28:07 -08007296 if (response == NULL || responseLen != sizeof(int)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007297 RLOGE("stkCallSetupInd: invalid response");
Amit Mahajan5829a472016-12-28 17:28:07 -08007298 return 0;
7299 }
7300 int32_t timeout = ((int32_t *) response)[0];
Jayachandran C572f2f42017-03-25 14:30:13 -07007301#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007302 RLOGD("stkCallSetupInd: timeout %d", timeout);
Jayachandran C572f2f42017-03-25 14:30:13 -07007303#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007304 Return<void> retStatus = radioService[slotId]->mRadioIndication->stkCallSetup(
Amit Mahajan5829a472016-12-28 17:28:07 -08007305 convertIntToRadioIndicationType(indicationType), timeout);
Amit Mahajan17249842017-01-19 15:05:45 -08007306 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08007307 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007308 RLOGE("stkCallSetupInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08007309 }
7310
7311 return 0;
7312}
7313
Amit Mahajan759786a2017-03-03 17:35:47 -08007314int radio::simSmsStorageFullInd(int slotId,
Amit Mahajan5829a472016-12-28 17:28:07 -08007315 int indicationType, int token, RIL_Errno e, void *response,
7316 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007317 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Jayachandran C572f2f42017-03-25 14:30:13 -07007318#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007319 RLOGD("simSmsStorageFullInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07007320#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007321 Return<void> retStatus = radioService[slotId]->mRadioIndication->simSmsStorageFull(
Amit Mahajan5829a472016-12-28 17:28:07 -08007322 convertIntToRadioIndicationType(indicationType));
Amit Mahajan17249842017-01-19 15:05:45 -08007323 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08007324 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007325 RLOGE("simSmsStorageFullInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08007326 }
7327
7328 return 0;
7329}
7330
Amit Mahajan759786a2017-03-03 17:35:47 -08007331int radio::simRefreshInd(int slotId, int indicationType,
Amit Mahajan5829a472016-12-28 17:28:07 -08007332 int token, RIL_Errno e, void *response, size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007333 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan5829a472016-12-28 17:28:07 -08007334 if (response == NULL || responseLen != sizeof(RIL_SimRefreshResponse_v7)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007335 RLOGE("simRefreshInd: invalid response");
Amit Mahajan5829a472016-12-28 17:28:07 -08007336 return 0;
7337 }
7338
Jack Yuf68e0da2017-02-07 14:53:09 -08007339 SimRefreshResult refreshResult = {};
Amit Mahajan5829a472016-12-28 17:28:07 -08007340 RIL_SimRefreshResponse_v7 *simRefreshResponse = ((RIL_SimRefreshResponse_v7 *) response);
7341 refreshResult.type =
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07007342 (V1_0::SimRefreshType) simRefreshResponse->result;
Amit Mahajan5829a472016-12-28 17:28:07 -08007343 refreshResult.efId = simRefreshResponse->ef_id;
7344 refreshResult.aid = convertCharPtrToHidlString(simRefreshResponse->aid);
7345
Jayachandran C572f2f42017-03-25 14:30:13 -07007346#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007347 RLOGD("simRefreshInd: type %d efId %d", refreshResult.type, refreshResult.efId);
Jayachandran C572f2f42017-03-25 14:30:13 -07007348#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007349 Return<void> retStatus = radioService[slotId]->mRadioIndication->simRefresh(
Amit Mahajan5829a472016-12-28 17:28:07 -08007350 convertIntToRadioIndicationType(indicationType), refreshResult);
Amit Mahajan17249842017-01-19 15:05:45 -08007351 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08007352 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007353 RLOGE("simRefreshInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08007354 }
7355
7356 return 0;
7357}
7358
7359void convertRilCdmaSignalInfoRecordToHal(RIL_CDMA_SignalInfoRecord *signalInfoRecord,
7360 CdmaSignalInfoRecord& record) {
7361 record.isPresent = signalInfoRecord->isPresent;
7362 record.signalType = signalInfoRecord->signalType;
7363 record.alertPitch = signalInfoRecord->alertPitch;
7364 record.signal = signalInfoRecord->signal;
7365}
7366
Amit Mahajan759786a2017-03-03 17:35:47 -08007367int radio::callRingInd(int slotId, int indicationType,
Amit Mahajan5829a472016-12-28 17:28:07 -08007368 int token, RIL_Errno e, void *response, size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007369 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan5829a472016-12-28 17:28:07 -08007370 bool isGsm;
Jack Yuf68e0da2017-02-07 14:53:09 -08007371 CdmaSignalInfoRecord record = {};
Amit Mahajan5829a472016-12-28 17:28:07 -08007372 if (response == NULL || responseLen == 0) {
7373 isGsm = true;
7374 } else {
7375 isGsm = false;
7376 if (responseLen != sizeof (RIL_CDMA_SignalInfoRecord)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007377 RLOGE("callRingInd: invalid response");
Amit Mahajan5829a472016-12-28 17:28:07 -08007378 return 0;
7379 }
7380 convertRilCdmaSignalInfoRecordToHal((RIL_CDMA_SignalInfoRecord *) response, record);
7381 }
7382
Jayachandran C572f2f42017-03-25 14:30:13 -07007383#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007384 RLOGD("callRingInd: isGsm %d", isGsm);
Jayachandran C572f2f42017-03-25 14:30:13 -07007385#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007386 Return<void> retStatus = radioService[slotId]->mRadioIndication->callRing(
Amit Mahajan5829a472016-12-28 17:28:07 -08007387 convertIntToRadioIndicationType(indicationType), isGsm, record);
Amit Mahajan17249842017-01-19 15:05:45 -08007388 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08007389 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007390 RLOGE("callRingInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08007391 }
7392
7393 return 0;
7394}
7395
Amit Mahajan759786a2017-03-03 17:35:47 -08007396int radio::simStatusChangedInd(int slotId,
Amit Mahajan5829a472016-12-28 17:28:07 -08007397 int indicationType, int token, RIL_Errno e, void *response,
7398 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007399 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Jayachandran C572f2f42017-03-25 14:30:13 -07007400#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007401 RLOGD("simStatusChangedInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07007402#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007403 Return<void> retStatus = radioService[slotId]->mRadioIndication->simStatusChanged(
Amit Mahajan5829a472016-12-28 17:28:07 -08007404 convertIntToRadioIndicationType(indicationType));
Amit Mahajan17249842017-01-19 15:05:45 -08007405 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08007406 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007407 RLOGE("simStatusChangedInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08007408 }
7409
7410 return 0;
7411}
7412
Amit Mahajan759786a2017-03-03 17:35:47 -08007413int radio::cdmaNewSmsInd(int slotId, int indicationType,
Amit Mahajan5829a472016-12-28 17:28:07 -08007414 int token, RIL_Errno e, void *response, size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007415 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan5829a472016-12-28 17:28:07 -08007416 if (response == NULL || responseLen != sizeof(RIL_CDMA_SMS_Message)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007417 RLOGE("cdmaNewSmsInd: invalid response");
Amit Mahajan5829a472016-12-28 17:28:07 -08007418 return 0;
7419 }
7420
Jack Yuf68e0da2017-02-07 14:53:09 -08007421 CdmaSmsMessage msg = {};
Amit Mahajan5829a472016-12-28 17:28:07 -08007422 RIL_CDMA_SMS_Message *rilMsg = (RIL_CDMA_SMS_Message *) response;
7423 msg.teleserviceId = rilMsg->uTeleserviceID;
7424 msg.isServicePresent = rilMsg->bIsServicePresent;
7425 msg.serviceCategory = rilMsg->uServicecategory;
7426 msg.address.digitMode =
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07007427 (V1_0::CdmaSmsDigitMode) rilMsg->sAddress.digit_mode;
Amit Mahajan5829a472016-12-28 17:28:07 -08007428 msg.address.numberMode =
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07007429 (V1_0::CdmaSmsNumberMode) rilMsg->sAddress.number_mode;
Amit Mahajan5829a472016-12-28 17:28:07 -08007430 msg.address.numberType =
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07007431 (V1_0::CdmaSmsNumberType) rilMsg->sAddress.number_type;
Amit Mahajan5829a472016-12-28 17:28:07 -08007432 msg.address.numberPlan =
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07007433 (V1_0::CdmaSmsNumberPlan) rilMsg->sAddress.number_plan;
Amit Mahajan5829a472016-12-28 17:28:07 -08007434
7435 int digitLimit = MIN((rilMsg->sAddress.number_of_digits), RIL_CDMA_SMS_ADDRESS_MAX);
7436 msg.address.digits.setToExternal(rilMsg->sAddress.digits, digitLimit);
7437
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07007438 msg.subAddress.subaddressType = (V1_0::CdmaSmsSubaddressType)
Amit Mahajan5829a472016-12-28 17:28:07 -08007439 rilMsg->sSubAddress.subaddressType;
7440 msg.subAddress.odd = rilMsg->sSubAddress.odd;
7441
7442 digitLimit= MIN((rilMsg->sSubAddress.number_of_digits), RIL_CDMA_SMS_SUBADDRESS_MAX);
7443 msg.subAddress.digits.setToExternal(rilMsg->sSubAddress.digits, digitLimit);
7444
7445 digitLimit = MIN((rilMsg->uBearerDataLen), RIL_CDMA_SMS_BEARER_DATA_MAX);
7446 msg.bearerData.setToExternal(rilMsg->aBearerData, digitLimit);
7447
Jayachandran C572f2f42017-03-25 14:30:13 -07007448#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007449 RLOGD("cdmaNewSmsInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07007450#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007451 Return<void> retStatus = radioService[slotId]->mRadioIndication->cdmaNewSms(
Amit Mahajan5829a472016-12-28 17:28:07 -08007452 convertIntToRadioIndicationType(indicationType), msg);
Amit Mahajan17249842017-01-19 15:05:45 -08007453 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08007454 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007455 RLOGE("cdmaNewSmsInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08007456 }
7457
7458 return 0;
7459}
7460
Amit Mahajan759786a2017-03-03 17:35:47 -08007461int radio::newBroadcastSmsInd(int slotId,
Amit Mahajan1955c742016-12-29 07:07:54 -08007462 int indicationType, int token, RIL_Errno e, void *response,
7463 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007464 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan1955c742016-12-29 07:07:54 -08007465 if (response == NULL || responseLen == 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007466 RLOGE("newBroadcastSmsInd: invalid response");
Amit Mahajan1955c742016-12-29 07:07:54 -08007467 return 0;
7468 }
7469
7470 hidl_vec<uint8_t> data;
7471 data.setToExternal((uint8_t *) response, responseLen);
Jayachandran C572f2f42017-03-25 14:30:13 -07007472#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007473 RLOGD("newBroadcastSmsInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07007474#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007475 Return<void> retStatus = radioService[slotId]->mRadioIndication->newBroadcastSms(
Amit Mahajan1955c742016-12-29 07:07:54 -08007476 convertIntToRadioIndicationType(indicationType), data);
Amit Mahajan17249842017-01-19 15:05:45 -08007477 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan1955c742016-12-29 07:07:54 -08007478 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007479 RLOGE("newBroadcastSmsInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan1955c742016-12-29 07:07:54 -08007480 }
7481
7482 return 0;
7483}
7484
Amit Mahajan759786a2017-03-03 17:35:47 -08007485int radio::cdmaRuimSmsStorageFullInd(int slotId,
Amit Mahajan1955c742016-12-29 07:07:54 -08007486 int indicationType, int token, RIL_Errno e, void *response,
7487 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007488 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Jayachandran C572f2f42017-03-25 14:30:13 -07007489#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007490 RLOGD("cdmaRuimSmsStorageFullInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07007491#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007492 Return<void> retStatus = radioService[slotId]->mRadioIndication->cdmaRuimSmsStorageFull(
Amit Mahajan1955c742016-12-29 07:07:54 -08007493 convertIntToRadioIndicationType(indicationType));
Amit Mahajan17249842017-01-19 15:05:45 -08007494 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan1955c742016-12-29 07:07:54 -08007495 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007496 RLOGE("cdmaRuimSmsStorageFullInd: radioService[%d]->mRadioIndication == NULL",
Amit Mahajan1955c742016-12-29 07:07:54 -08007497 slotId);
7498 }
7499
7500 return 0;
7501}
7502
Amit Mahajan759786a2017-03-03 17:35:47 -08007503int radio::restrictedStateChangedInd(int slotId,
Amit Mahajan1955c742016-12-29 07:07:54 -08007504 int indicationType, int token, RIL_Errno e, void *response,
7505 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007506 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan1955c742016-12-29 07:07:54 -08007507 if (response == NULL || responseLen != sizeof(int)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007508 RLOGE("restrictedStateChangedInd: invalid response");
Amit Mahajan1955c742016-12-29 07:07:54 -08007509 return 0;
7510 }
7511 int32_t state = ((int32_t *) response)[0];
Jayachandran C572f2f42017-03-25 14:30:13 -07007512#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007513 RLOGD("restrictedStateChangedInd: state %d", state);
Jayachandran C572f2f42017-03-25 14:30:13 -07007514#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007515 Return<void> retStatus = radioService[slotId]->mRadioIndication->restrictedStateChanged(
Amit Mahajan1955c742016-12-29 07:07:54 -08007516 convertIntToRadioIndicationType(indicationType), (PhoneRestrictedState) state);
Amit Mahajan17249842017-01-19 15:05:45 -08007517 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan1955c742016-12-29 07:07:54 -08007518 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007519 RLOGE("restrictedStateChangedInd: radioService[%d]->mRadioIndication == NULL",
Amit Mahajan1955c742016-12-29 07:07:54 -08007520 slotId);
7521 }
7522
7523 return 0;
7524}
7525
Amit Mahajan759786a2017-03-03 17:35:47 -08007526int radio::enterEmergencyCallbackModeInd(int slotId,
Amit Mahajan1955c742016-12-29 07:07:54 -08007527 int indicationType, int token, RIL_Errno e, void *response,
7528 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007529 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Jayachandran C572f2f42017-03-25 14:30:13 -07007530#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007531 RLOGD("enterEmergencyCallbackModeInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07007532#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007533 Return<void> retStatus = radioService[slotId]->mRadioIndication->enterEmergencyCallbackMode(
Amit Mahajan1955c742016-12-29 07:07:54 -08007534 convertIntToRadioIndicationType(indicationType));
Amit Mahajan17249842017-01-19 15:05:45 -08007535 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan1955c742016-12-29 07:07:54 -08007536 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007537 RLOGE("enterEmergencyCallbackModeInd: radioService[%d]->mRadioIndication == NULL",
Amit Mahajan1955c742016-12-29 07:07:54 -08007538 slotId);
7539 }
7540
7541 return 0;
7542}
7543
Amit Mahajan759786a2017-03-03 17:35:47 -08007544int radio::cdmaCallWaitingInd(int slotId,
Amit Mahajan1955c742016-12-29 07:07:54 -08007545 int indicationType, int token, RIL_Errno e, void *response,
7546 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007547 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan1955c742016-12-29 07:07:54 -08007548 if (response == NULL || responseLen != sizeof(RIL_CDMA_CallWaiting_v6)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007549 RLOGE("cdmaCallWaitingInd: invalid response");
Amit Mahajan1955c742016-12-29 07:07:54 -08007550 return 0;
7551 }
7552
Jack Yuf68e0da2017-02-07 14:53:09 -08007553 CdmaCallWaiting callWaitingRecord = {};
Amit Mahajan1955c742016-12-29 07:07:54 -08007554 RIL_CDMA_CallWaiting_v6 *callWaitingRil = ((RIL_CDMA_CallWaiting_v6 *) response);
7555 callWaitingRecord.number = convertCharPtrToHidlString(callWaitingRil->number);
7556 callWaitingRecord.numberPresentation =
7557 (CdmaCallWaitingNumberPresentation) callWaitingRil->numberPresentation;
7558 callWaitingRecord.name = convertCharPtrToHidlString(callWaitingRil->name);
7559 convertRilCdmaSignalInfoRecordToHal(&callWaitingRil->signalInfoRecord,
7560 callWaitingRecord.signalInfoRecord);
7561 callWaitingRecord.numberType = (CdmaCallWaitingNumberType) callWaitingRil->number_type;
7562 callWaitingRecord.numberPlan = (CdmaCallWaitingNumberPlan) callWaitingRil->number_plan;
7563
Jayachandran C572f2f42017-03-25 14:30:13 -07007564#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007565 RLOGD("cdmaCallWaitingInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07007566#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007567 Return<void> retStatus = radioService[slotId]->mRadioIndication->cdmaCallWaiting(
Amit Mahajan1955c742016-12-29 07:07:54 -08007568 convertIntToRadioIndicationType(indicationType), callWaitingRecord);
Amit Mahajan17249842017-01-19 15:05:45 -08007569 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan1955c742016-12-29 07:07:54 -08007570 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007571 RLOGE("cdmaCallWaitingInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan1955c742016-12-29 07:07:54 -08007572 }
7573
7574 return 0;
7575}
7576
Amit Mahajan759786a2017-03-03 17:35:47 -08007577int radio::cdmaOtaProvisionStatusInd(int slotId,
Amit Mahajan1955c742016-12-29 07:07:54 -08007578 int indicationType, int token, RIL_Errno e, void *response,
7579 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007580 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan1955c742016-12-29 07:07:54 -08007581 if (response == NULL || responseLen != sizeof(int)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007582 RLOGE("cdmaOtaProvisionStatusInd: invalid response");
Amit Mahajan1955c742016-12-29 07:07:54 -08007583 return 0;
7584 }
7585 int32_t status = ((int32_t *) response)[0];
Jayachandran C572f2f42017-03-25 14:30:13 -07007586#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007587 RLOGD("cdmaOtaProvisionStatusInd: status %d", status);
Jayachandran C572f2f42017-03-25 14:30:13 -07007588#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007589 Return<void> retStatus = radioService[slotId]->mRadioIndication->cdmaOtaProvisionStatus(
Amit Mahajan1955c742016-12-29 07:07:54 -08007590 convertIntToRadioIndicationType(indicationType), (CdmaOtaProvisionStatus) status);
Amit Mahajan17249842017-01-19 15:05:45 -08007591 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan1955c742016-12-29 07:07:54 -08007592 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007593 RLOGE("cdmaOtaProvisionStatusInd: radioService[%d]->mRadioIndication == NULL",
Amit Mahajan1955c742016-12-29 07:07:54 -08007594 slotId);
7595 }
7596
7597 return 0;
7598}
7599
Amit Mahajan759786a2017-03-03 17:35:47 -08007600int radio::cdmaInfoRecInd(int slotId,
Amit Mahajan1955c742016-12-29 07:07:54 -08007601 int indicationType, int token, RIL_Errno e, void *response,
7602 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007603 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan1955c742016-12-29 07:07:54 -08007604 if (response == NULL || responseLen != sizeof(RIL_CDMA_InformationRecords)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007605 RLOGE("cdmaInfoRecInd: invalid response");
Amit Mahajan1955c742016-12-29 07:07:54 -08007606 return 0;
7607 }
7608
Jack Yuf68e0da2017-02-07 14:53:09 -08007609 CdmaInformationRecords records = {};
Amit Mahajan1955c742016-12-29 07:07:54 -08007610 RIL_CDMA_InformationRecords *recordsRil = (RIL_CDMA_InformationRecords *) response;
7611
7612 char* string8 = NULL;
7613 int num = MIN(recordsRil->numberOfInfoRecs, RIL_CDMA_MAX_NUMBER_OF_INFO_RECS);
7614 if (recordsRil->numberOfInfoRecs > RIL_CDMA_MAX_NUMBER_OF_INFO_RECS) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007615 RLOGE("cdmaInfoRecInd: received %d recs which is more than %d, dropping "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08007616 "additional ones", recordsRil->numberOfInfoRecs,
Amit Mahajan1955c742016-12-29 07:07:54 -08007617 RIL_CDMA_MAX_NUMBER_OF_INFO_RECS);
7618 }
7619 records.infoRec.resize(num);
7620 for (int i = 0 ; i < num ; i++) {
7621 CdmaInformationRecord *record = &records.infoRec[i];
7622 RIL_CDMA_InformationRecord *infoRec = &recordsRil->infoRec[i];
7623 record->name = (CdmaInfoRecName) infoRec->name;
Sanket Padawe378ccdd2017-01-24 14:11:12 -08007624 // All vectors should be size 0 except one which will be size 1. Set everything to
7625 // size 0 initially.
7626 record->display.resize(0);
7627 record->number.resize(0);
7628 record->signal.resize(0);
7629 record->redir.resize(0);
7630 record->lineCtrl.resize(0);
7631 record->clir.resize(0);
7632 record->audioCtrl.resize(0);
Amit Mahajan1955c742016-12-29 07:07:54 -08007633 switch (infoRec->name) {
7634 case RIL_CDMA_DISPLAY_INFO_REC:
7635 case RIL_CDMA_EXTENDED_DISPLAY_INFO_REC: {
7636 if (infoRec->rec.display.alpha_len > CDMA_ALPHA_INFO_BUFFER_LENGTH) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007637 RLOGE("cdmaInfoRecInd: invalid display info response length %d "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08007638 "expected not more than %d", (int) infoRec->rec.display.alpha_len,
Amit Mahajan1955c742016-12-29 07:07:54 -08007639 CDMA_ALPHA_INFO_BUFFER_LENGTH);
7640 return 0;
7641 }
7642 string8 = (char*) malloc((infoRec->rec.display.alpha_len + 1) * sizeof(char));
7643 if (string8 == NULL) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007644 RLOGE("cdmaInfoRecInd: Memory allocation failed for "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08007645 "responseCdmaInformationRecords");
Amit Mahajan1955c742016-12-29 07:07:54 -08007646 return 0;
7647 }
7648 memcpy(string8, infoRec->rec.display.alpha_buf, infoRec->rec.display.alpha_len);
7649 string8[(int)infoRec->rec.display.alpha_len] = '\0';
7650
7651 record->display.resize(1);
7652 record->display[0].alphaBuf = string8;
7653 free(string8);
7654 string8 = NULL;
7655 break;
7656 }
7657
7658 case RIL_CDMA_CALLED_PARTY_NUMBER_INFO_REC:
7659 case RIL_CDMA_CALLING_PARTY_NUMBER_INFO_REC:
7660 case RIL_CDMA_CONNECTED_NUMBER_INFO_REC: {
7661 if (infoRec->rec.number.len > CDMA_NUMBER_INFO_BUFFER_LENGTH) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007662 RLOGE("cdmaInfoRecInd: invalid display info response length %d "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08007663 "expected not more than %d", (int) infoRec->rec.number.len,
Amit Mahajan1955c742016-12-29 07:07:54 -08007664 CDMA_NUMBER_INFO_BUFFER_LENGTH);
7665 return 0;
7666 }
7667 string8 = (char*) malloc((infoRec->rec.number.len + 1) * sizeof(char));
7668 if (string8 == NULL) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007669 RLOGE("cdmaInfoRecInd: Memory allocation failed for "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08007670 "responseCdmaInformationRecords");
Amit Mahajan1955c742016-12-29 07:07:54 -08007671 return 0;
7672 }
7673 memcpy(string8, infoRec->rec.number.buf, infoRec->rec.number.len);
7674 string8[(int)infoRec->rec.number.len] = '\0';
7675
7676 record->number.resize(1);
7677 record->number[0].number = string8;
7678 free(string8);
7679 string8 = NULL;
7680 record->number[0].numberType = infoRec->rec.number.number_type;
7681 record->number[0].numberPlan = infoRec->rec.number.number_plan;
7682 record->number[0].pi = infoRec->rec.number.pi;
7683 record->number[0].si = infoRec->rec.number.si;
7684 break;
7685 }
7686
7687 case RIL_CDMA_SIGNAL_INFO_REC: {
7688 record->signal.resize(1);
7689 record->signal[0].isPresent = infoRec->rec.signal.isPresent;
7690 record->signal[0].signalType = infoRec->rec.signal.signalType;
7691 record->signal[0].alertPitch = infoRec->rec.signal.alertPitch;
7692 record->signal[0].signal = infoRec->rec.signal.signal;
7693 break;
7694 }
7695
7696 case RIL_CDMA_REDIRECTING_NUMBER_INFO_REC: {
7697 if (infoRec->rec.redir.redirectingNumber.len >
7698 CDMA_NUMBER_INFO_BUFFER_LENGTH) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007699 RLOGE("cdmaInfoRecInd: invalid display info response length %d "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08007700 "expected not more than %d\n",
Amit Mahajan1955c742016-12-29 07:07:54 -08007701 (int)infoRec->rec.redir.redirectingNumber.len,
7702 CDMA_NUMBER_INFO_BUFFER_LENGTH);
7703 return 0;
7704 }
7705 string8 = (char*) malloc((infoRec->rec.redir.redirectingNumber.len + 1) *
7706 sizeof(char));
7707 if (string8 == NULL) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007708 RLOGE("cdmaInfoRecInd: Memory allocation failed for "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08007709 "responseCdmaInformationRecords");
Amit Mahajan1955c742016-12-29 07:07:54 -08007710 return 0;
7711 }
7712 memcpy(string8, infoRec->rec.redir.redirectingNumber.buf,
7713 infoRec->rec.redir.redirectingNumber.len);
7714 string8[(int)infoRec->rec.redir.redirectingNumber.len] = '\0';
7715
7716 record->redir.resize(1);
7717 record->redir[0].redirectingNumber.number = string8;
7718 free(string8);
7719 string8 = NULL;
7720 record->redir[0].redirectingNumber.numberType =
7721 infoRec->rec.redir.redirectingNumber.number_type;
7722 record->redir[0].redirectingNumber.numberPlan =
7723 infoRec->rec.redir.redirectingNumber.number_plan;
7724 record->redir[0].redirectingNumber.pi = infoRec->rec.redir.redirectingNumber.pi;
7725 record->redir[0].redirectingNumber.si = infoRec->rec.redir.redirectingNumber.si;
7726 record->redir[0].redirectingReason =
7727 (CdmaRedirectingReason) infoRec->rec.redir.redirectingReason;
7728 break;
7729 }
7730
7731 case RIL_CDMA_LINE_CONTROL_INFO_REC: {
7732 record->lineCtrl.resize(1);
7733 record->lineCtrl[0].lineCtrlPolarityIncluded =
7734 infoRec->rec.lineCtrl.lineCtrlPolarityIncluded;
7735 record->lineCtrl[0].lineCtrlToggle = infoRec->rec.lineCtrl.lineCtrlToggle;
7736 record->lineCtrl[0].lineCtrlReverse = infoRec->rec.lineCtrl.lineCtrlReverse;
7737 record->lineCtrl[0].lineCtrlPowerDenial =
7738 infoRec->rec.lineCtrl.lineCtrlPowerDenial;
7739 break;
7740 }
7741
7742 case RIL_CDMA_T53_CLIR_INFO_REC: {
7743 record->clir.resize(1);
7744 record->clir[0].cause = infoRec->rec.clir.cause;
7745 break;
7746 }
7747
7748 case RIL_CDMA_T53_AUDIO_CONTROL_INFO_REC: {
7749 record->audioCtrl.resize(1);
7750 record->audioCtrl[0].upLink = infoRec->rec.audioCtrl.upLink;
7751 record->audioCtrl[0].downLink = infoRec->rec.audioCtrl.downLink;
7752 break;
7753 }
7754
7755 case RIL_CDMA_T53_RELEASE_INFO_REC:
Amit Mahajan111ddca2017-03-03 12:05:13 -08007756 RLOGE("cdmaInfoRecInd: RIL_CDMA_T53_RELEASE_INFO_REC: INVALID");
Amit Mahajan1955c742016-12-29 07:07:54 -08007757 return 0;
7758
7759 default:
Amit Mahajan111ddca2017-03-03 12:05:13 -08007760 RLOGE("cdmaInfoRecInd: Incorrect name value");
Amit Mahajan1955c742016-12-29 07:07:54 -08007761 return 0;
7762 }
7763 }
7764
Jayachandran C572f2f42017-03-25 14:30:13 -07007765#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007766 RLOGD("cdmaInfoRecInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07007767#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007768 Return<void> retStatus = radioService[slotId]->mRadioIndication->cdmaInfoRec(
Amit Mahajan1955c742016-12-29 07:07:54 -08007769 convertIntToRadioIndicationType(indicationType), records);
Amit Mahajan17249842017-01-19 15:05:45 -08007770 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan1955c742016-12-29 07:07:54 -08007771 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007772 RLOGE("cdmaInfoRecInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan1955c742016-12-29 07:07:54 -08007773 }
7774
7775 return 0;
7776}
7777
Amit Mahajan759786a2017-03-03 17:35:47 -08007778int radio::indicateRingbackToneInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007779 int indicationType, int token, RIL_Errno e, void *response,
7780 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007781 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007782 if (response == NULL || responseLen != sizeof(int)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007783 RLOGE("indicateRingbackToneInd: invalid response");
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007784 return 0;
7785 }
7786 bool start = ((int32_t *) response)[0];
Jayachandran C572f2f42017-03-25 14:30:13 -07007787#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007788 RLOGD("indicateRingbackToneInd: start %d", start);
Jayachandran C572f2f42017-03-25 14:30:13 -07007789#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007790 Return<void> retStatus = radioService[slotId]->mRadioIndication->indicateRingbackTone(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007791 convertIntToRadioIndicationType(indicationType), start);
Amit Mahajan17249842017-01-19 15:05:45 -08007792 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007793 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007794 RLOGE("indicateRingbackToneInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007795 }
7796
7797 return 0;
7798}
7799
Amit Mahajan759786a2017-03-03 17:35:47 -08007800int radio::resendIncallMuteInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007801 int indicationType, int token, RIL_Errno e, void *response,
7802 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007803 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Jayachandran C572f2f42017-03-25 14:30:13 -07007804#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007805 RLOGD("resendIncallMuteInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07007806#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007807 Return<void> retStatus = radioService[slotId]->mRadioIndication->resendIncallMute(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007808 convertIntToRadioIndicationType(indicationType));
Amit Mahajan17249842017-01-19 15:05:45 -08007809 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007810 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007811 RLOGE("resendIncallMuteInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007812 }
7813
7814 return 0;
7815}
7816
Amit Mahajan759786a2017-03-03 17:35:47 -08007817int radio::cdmaSubscriptionSourceChangedInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007818 int indicationType, int token, RIL_Errno e,
7819 void *response, size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007820 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007821 if (response == NULL || responseLen != sizeof(int)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007822 RLOGE("cdmaSubscriptionSourceChangedInd: invalid response");
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007823 return 0;
7824 }
7825 int32_t cdmaSource = ((int32_t *) response)[0];
Jayachandran C572f2f42017-03-25 14:30:13 -07007826#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007827 RLOGD("cdmaSubscriptionSourceChangedInd: cdmaSource %d", cdmaSource);
Jayachandran C572f2f42017-03-25 14:30:13 -07007828#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007829 Return<void> retStatus = radioService[slotId]->mRadioIndication->
7830 cdmaSubscriptionSourceChanged(convertIntToRadioIndicationType(indicationType),
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007831 (CdmaSubscriptionSource) cdmaSource);
Amit Mahajan17249842017-01-19 15:05:45 -08007832 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007833 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007834 RLOGE("cdmaSubscriptionSourceChangedInd: radioService[%d]->mRadioIndication == NULL",
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007835 slotId);
7836 }
7837
7838 return 0;
7839}
7840
Amit Mahajan759786a2017-03-03 17:35:47 -08007841int radio::cdmaPrlChangedInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007842 int indicationType, int token, RIL_Errno e, void *response,
7843 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007844 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007845 if (response == NULL || responseLen != sizeof(int)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007846 RLOGE("cdmaPrlChangedInd: invalid response");
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007847 return 0;
7848 }
7849 int32_t version = ((int32_t *) response)[0];
Jayachandran C572f2f42017-03-25 14:30:13 -07007850#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007851 RLOGD("cdmaPrlChangedInd: version %d", version);
Jayachandran C572f2f42017-03-25 14:30:13 -07007852#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007853 Return<void> retStatus = radioService[slotId]->mRadioIndication->cdmaPrlChanged(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007854 convertIntToRadioIndicationType(indicationType), version);
Amit Mahajan17249842017-01-19 15:05:45 -08007855 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007856 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007857 RLOGE("cdmaPrlChangedInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007858 }
7859
7860 return 0;
7861}
7862
Amit Mahajan759786a2017-03-03 17:35:47 -08007863int radio::exitEmergencyCallbackModeInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007864 int indicationType, int token, RIL_Errno e, void *response,
7865 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007866 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Jayachandran C572f2f42017-03-25 14:30:13 -07007867#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007868 RLOGD("exitEmergencyCallbackModeInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07007869#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007870 Return<void> retStatus = radioService[slotId]->mRadioIndication->exitEmergencyCallbackMode(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007871 convertIntToRadioIndicationType(indicationType));
Amit Mahajan17249842017-01-19 15:05:45 -08007872 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007873 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007874 RLOGE("exitEmergencyCallbackModeInd: radioService[%d]->mRadioIndication == NULL",
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007875 slotId);
7876 }
7877
7878 return 0;
7879}
7880
Amit Mahajan759786a2017-03-03 17:35:47 -08007881int radio::rilConnectedInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007882 int indicationType, int token, RIL_Errno e, void *response,
7883 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007884 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007885 RLOGD("rilConnectedInd");
Amit Mahajan17249842017-01-19 15:05:45 -08007886 Return<void> retStatus = radioService[slotId]->mRadioIndication->rilConnected(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007887 convertIntToRadioIndicationType(indicationType));
Amit Mahajan17249842017-01-19 15:05:45 -08007888 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007889 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007890 RLOGE("rilConnectedInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007891 }
7892
7893 return 0;
7894}
7895
Amit Mahajan759786a2017-03-03 17:35:47 -08007896int radio::voiceRadioTechChangedInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007897 int indicationType, int token, RIL_Errno e, void *response,
7898 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007899 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007900 if (response == NULL || responseLen != sizeof(int)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007901 RLOGE("voiceRadioTechChangedInd: invalid response");
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007902 return 0;
7903 }
7904 int32_t rat = ((int32_t *) response)[0];
Jayachandran C572f2f42017-03-25 14:30:13 -07007905#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007906 RLOGD("voiceRadioTechChangedInd: rat %d", rat);
Jayachandran C572f2f42017-03-25 14:30:13 -07007907#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007908 Return<void> retStatus = radioService[slotId]->mRadioIndication->voiceRadioTechChanged(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007909 convertIntToRadioIndicationType(indicationType), (RadioTechnology) rat);
Amit Mahajan17249842017-01-19 15:05:45 -08007910 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007911 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007912 RLOGE("voiceRadioTechChangedInd: radioService[%d]->mRadioIndication == NULL",
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007913 slotId);
7914 }
7915
7916 return 0;
7917}
7918
7919void convertRilCellInfoListToHal(void *response, size_t responseLen, hidl_vec<CellInfo>& records) {
7920 int num = responseLen / sizeof(RIL_CellInfo_v12);
7921 records.resize(num);
7922
7923 RIL_CellInfo_v12 *rillCellInfo = (RIL_CellInfo_v12 *) response;
7924 for (int i = 0; i < num; i++) {
7925 records[i].cellInfoType = (CellInfoType) rillCellInfo->cellInfoType;
7926 records[i].registered = rillCellInfo->registered;
7927 records[i].timeStampType = (TimeStampType) rillCellInfo->timeStampType;
7928 records[i].timeStamp = rillCellInfo->timeStamp;
Sanket Padawe378ccdd2017-01-24 14:11:12 -08007929 // All vectors should be size 0 except one which will be size 1. Set everything to
7930 // size 0 initially.
7931 records[i].gsm.resize(0);
7932 records[i].wcdma.resize(0);
7933 records[i].cdma.resize(0);
7934 records[i].lte.resize(0);
7935 records[i].tdscdma.resize(0);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007936 switch(rillCellInfo->cellInfoType) {
7937 case RIL_CELL_INFO_TYPE_GSM: {
7938 records[i].gsm.resize(1);
7939 CellInfoGsm *cellInfoGsm = &records[i].gsm[0];
7940 cellInfoGsm->cellIdentityGsm.mcc =
7941 std::to_string(rillCellInfo->CellInfo.gsm.cellIdentityGsm.mcc);
7942 cellInfoGsm->cellIdentityGsm.mnc =
Nathan Harold98cfcee2018-08-20 11:38:27 -07007943 ril::util::mnc::decode(rillCellInfo->CellInfo.gsm.cellIdentityGsm.mnc);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007944 cellInfoGsm->cellIdentityGsm.lac =
7945 rillCellInfo->CellInfo.gsm.cellIdentityGsm.lac;
7946 cellInfoGsm->cellIdentityGsm.cid =
7947 rillCellInfo->CellInfo.gsm.cellIdentityGsm.cid;
7948 cellInfoGsm->cellIdentityGsm.arfcn =
7949 rillCellInfo->CellInfo.gsm.cellIdentityGsm.arfcn;
7950 cellInfoGsm->cellIdentityGsm.bsic =
7951 rillCellInfo->CellInfo.gsm.cellIdentityGsm.bsic;
7952 cellInfoGsm->signalStrengthGsm.signalStrength =
7953 rillCellInfo->CellInfo.gsm.signalStrengthGsm.signalStrength;
7954 cellInfoGsm->signalStrengthGsm.bitErrorRate =
7955 rillCellInfo->CellInfo.gsm.signalStrengthGsm.bitErrorRate;
7956 cellInfoGsm->signalStrengthGsm.timingAdvance =
7957 rillCellInfo->CellInfo.gsm.signalStrengthGsm.timingAdvance;
7958 break;
7959 }
7960
7961 case RIL_CELL_INFO_TYPE_WCDMA: {
7962 records[i].wcdma.resize(1);
7963 CellInfoWcdma *cellInfoWcdma = &records[i].wcdma[0];
7964 cellInfoWcdma->cellIdentityWcdma.mcc =
7965 std::to_string(rillCellInfo->CellInfo.wcdma.cellIdentityWcdma.mcc);
7966 cellInfoWcdma->cellIdentityWcdma.mnc =
Nathan Harold98cfcee2018-08-20 11:38:27 -07007967 ril::util::mnc::decode(rillCellInfo->CellInfo.wcdma.cellIdentityWcdma.mnc);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007968 cellInfoWcdma->cellIdentityWcdma.lac =
7969 rillCellInfo->CellInfo.wcdma.cellIdentityWcdma.lac;
7970 cellInfoWcdma->cellIdentityWcdma.cid =
7971 rillCellInfo->CellInfo.wcdma.cellIdentityWcdma.cid;
7972 cellInfoWcdma->cellIdentityWcdma.psc =
7973 rillCellInfo->CellInfo.wcdma.cellIdentityWcdma.psc;
7974 cellInfoWcdma->cellIdentityWcdma.uarfcn =
7975 rillCellInfo->CellInfo.wcdma.cellIdentityWcdma.uarfcn;
7976 cellInfoWcdma->signalStrengthWcdma.signalStrength =
7977 rillCellInfo->CellInfo.wcdma.signalStrengthWcdma.signalStrength;
7978 cellInfoWcdma->signalStrengthWcdma.bitErrorRate =
7979 rillCellInfo->CellInfo.wcdma.signalStrengthWcdma.bitErrorRate;
7980 break;
7981 }
7982
7983 case RIL_CELL_INFO_TYPE_CDMA: {
7984 records[i].cdma.resize(1);
7985 CellInfoCdma *cellInfoCdma = &records[i].cdma[0];
7986 cellInfoCdma->cellIdentityCdma.networkId =
7987 rillCellInfo->CellInfo.cdma.cellIdentityCdma.networkId;
7988 cellInfoCdma->cellIdentityCdma.systemId =
7989 rillCellInfo->CellInfo.cdma.cellIdentityCdma.systemId;
7990 cellInfoCdma->cellIdentityCdma.baseStationId =
7991 rillCellInfo->CellInfo.cdma.cellIdentityCdma.basestationId;
7992 cellInfoCdma->cellIdentityCdma.longitude =
7993 rillCellInfo->CellInfo.cdma.cellIdentityCdma.longitude;
7994 cellInfoCdma->cellIdentityCdma.latitude =
7995 rillCellInfo->CellInfo.cdma.cellIdentityCdma.latitude;
7996 cellInfoCdma->signalStrengthCdma.dbm =
7997 rillCellInfo->CellInfo.cdma.signalStrengthCdma.dbm;
7998 cellInfoCdma->signalStrengthCdma.ecio =
7999 rillCellInfo->CellInfo.cdma.signalStrengthCdma.ecio;
8000 cellInfoCdma->signalStrengthEvdo.dbm =
8001 rillCellInfo->CellInfo.cdma.signalStrengthEvdo.dbm;
8002 cellInfoCdma->signalStrengthEvdo.ecio =
8003 rillCellInfo->CellInfo.cdma.signalStrengthEvdo.ecio;
8004 cellInfoCdma->signalStrengthEvdo.signalNoiseRatio =
8005 rillCellInfo->CellInfo.cdma.signalStrengthEvdo.signalNoiseRatio;
8006 break;
8007 }
8008
8009 case RIL_CELL_INFO_TYPE_LTE: {
8010 records[i].lte.resize(1);
8011 CellInfoLte *cellInfoLte = &records[i].lte[0];
8012 cellInfoLte->cellIdentityLte.mcc =
8013 std::to_string(rillCellInfo->CellInfo.lte.cellIdentityLte.mcc);
8014 cellInfoLte->cellIdentityLte.mnc =
Nathan Harold98cfcee2018-08-20 11:38:27 -07008015 ril::util::mnc::decode(rillCellInfo->CellInfo.lte.cellIdentityLte.mnc);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008016 cellInfoLte->cellIdentityLte.ci =
8017 rillCellInfo->CellInfo.lte.cellIdentityLte.ci;
8018 cellInfoLte->cellIdentityLte.pci =
8019 rillCellInfo->CellInfo.lte.cellIdentityLte.pci;
8020 cellInfoLte->cellIdentityLte.tac =
8021 rillCellInfo->CellInfo.lte.cellIdentityLte.tac;
8022 cellInfoLte->cellIdentityLte.earfcn =
8023 rillCellInfo->CellInfo.lte.cellIdentityLte.earfcn;
8024 cellInfoLte->signalStrengthLte.signalStrength =
8025 rillCellInfo->CellInfo.lte.signalStrengthLte.signalStrength;
8026 cellInfoLte->signalStrengthLte.rsrp =
8027 rillCellInfo->CellInfo.lte.signalStrengthLte.rsrp;
8028 cellInfoLte->signalStrengthLte.rsrq =
8029 rillCellInfo->CellInfo.lte.signalStrengthLte.rsrq;
8030 cellInfoLte->signalStrengthLte.rssnr =
8031 rillCellInfo->CellInfo.lte.signalStrengthLte.rssnr;
8032 cellInfoLte->signalStrengthLte.cqi =
8033 rillCellInfo->CellInfo.lte.signalStrengthLte.cqi;
8034 cellInfoLte->signalStrengthLte.timingAdvance =
8035 rillCellInfo->CellInfo.lte.signalStrengthLte.timingAdvance;
8036 break;
8037 }
8038
8039 case RIL_CELL_INFO_TYPE_TD_SCDMA: {
8040 records[i].tdscdma.resize(1);
8041 CellInfoTdscdma *cellInfoTdscdma = &records[i].tdscdma[0];
8042 cellInfoTdscdma->cellIdentityTdscdma.mcc =
8043 std::to_string(rillCellInfo->CellInfo.tdscdma.cellIdentityTdscdma.mcc);
8044 cellInfoTdscdma->cellIdentityTdscdma.mnc =
Nathan Harold98cfcee2018-08-20 11:38:27 -07008045 ril::util::mnc::decode(
8046 rillCellInfo->CellInfo.tdscdma.cellIdentityTdscdma.mnc);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008047 cellInfoTdscdma->cellIdentityTdscdma.lac =
8048 rillCellInfo->CellInfo.tdscdma.cellIdentityTdscdma.lac;
8049 cellInfoTdscdma->cellIdentityTdscdma.cid =
8050 rillCellInfo->CellInfo.tdscdma.cellIdentityTdscdma.cid;
8051 cellInfoTdscdma->cellIdentityTdscdma.cpid =
8052 rillCellInfo->CellInfo.tdscdma.cellIdentityTdscdma.cpid;
8053 cellInfoTdscdma->signalStrengthTdscdma.rscp =
8054 rillCellInfo->CellInfo.tdscdma.signalStrengthTdscdma.rscp;
8055 break;
8056 }
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08008057 default: {
8058 break;
8059 }
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008060 }
8061 rillCellInfo += 1;
8062 }
8063}
8064
Amit Mahajan759786a2017-03-03 17:35:47 -08008065int radio::cellInfoListInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008066 int indicationType, int token, RIL_Errno e, void *response,
8067 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08008068 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan13058cb2017-06-07 23:10:27 -07008069 if ((response == NULL && responseLen != 0) || responseLen % sizeof(RIL_CellInfo_v12) != 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008070 RLOGE("cellInfoListInd: invalid response");
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008071 return 0;
8072 }
8073
8074 hidl_vec<CellInfo> records;
8075 convertRilCellInfoListToHal(response, responseLen, records);
8076
Jayachandran C572f2f42017-03-25 14:30:13 -07008077#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08008078 RLOGD("cellInfoListInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07008079#endif
Amit Mahajan17249842017-01-19 15:05:45 -08008080 Return<void> retStatus = radioService[slotId]->mRadioIndication->cellInfoList(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008081 convertIntToRadioIndicationType(indicationType), records);
Amit Mahajan17249842017-01-19 15:05:45 -08008082 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008083 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008084 RLOGE("cellInfoListInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008085 }
8086
8087 return 0;
8088}
8089
Amit Mahajan759786a2017-03-03 17:35:47 -08008090int radio::imsNetworkStateChangedInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008091 int indicationType, int token, RIL_Errno e, void *response,
8092 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08008093 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Jayachandran C572f2f42017-03-25 14:30:13 -07008094#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08008095 RLOGD("imsNetworkStateChangedInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07008096#endif
Amit Mahajan17249842017-01-19 15:05:45 -08008097 Return<void> retStatus = radioService[slotId]->mRadioIndication->imsNetworkStateChanged(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008098 convertIntToRadioIndicationType(indicationType));
Amit Mahajan17249842017-01-19 15:05:45 -08008099 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008100 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008101 RLOGE("imsNetworkStateChangedInd: radioService[%d]->mRadioIndication == NULL",
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008102 slotId);
8103 }
8104
8105 return 0;
8106}
8107
Amit Mahajan759786a2017-03-03 17:35:47 -08008108int radio::subscriptionStatusChangedInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008109 int indicationType, int token, RIL_Errno e, void *response,
8110 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08008111 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008112 if (response == NULL || responseLen != sizeof(int)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008113 RLOGE("subscriptionStatusChangedInd: invalid response");
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008114 return 0;
8115 }
8116 bool activate = ((int32_t *) response)[0];
Jayachandran C572f2f42017-03-25 14:30:13 -07008117#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08008118 RLOGD("subscriptionStatusChangedInd: activate %d", activate);
Jayachandran C572f2f42017-03-25 14:30:13 -07008119#endif
Amit Mahajan17249842017-01-19 15:05:45 -08008120 Return<void> retStatus = radioService[slotId]->mRadioIndication->subscriptionStatusChanged(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008121 convertIntToRadioIndicationType(indicationType), activate);
Amit Mahajan17249842017-01-19 15:05:45 -08008122 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008123 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008124 RLOGE("subscriptionStatusChangedInd: radioService[%d]->mRadioIndication == NULL",
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008125 slotId);
8126 }
8127
8128 return 0;
8129}
8130
Amit Mahajan759786a2017-03-03 17:35:47 -08008131int radio::srvccStateNotifyInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008132 int indicationType, int token, RIL_Errno e, void *response,
8133 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08008134 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008135 if (response == NULL || responseLen != sizeof(int)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008136 RLOGE("srvccStateNotifyInd: invalid response");
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008137 return 0;
8138 }
8139 int32_t state = ((int32_t *) response)[0];
Jayachandran C572f2f42017-03-25 14:30:13 -07008140#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08008141 RLOGD("srvccStateNotifyInd: rat %d", state);
Jayachandran C572f2f42017-03-25 14:30:13 -07008142#endif
Amit Mahajan17249842017-01-19 15:05:45 -08008143 Return<void> retStatus = radioService[slotId]->mRadioIndication->srvccStateNotify(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008144 convertIntToRadioIndicationType(indicationType), (SrvccState) state);
Amit Mahajan17249842017-01-19 15:05:45 -08008145 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008146 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008147 RLOGE("srvccStateNotifyInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008148 }
8149
8150 return 0;
8151}
8152
8153void convertRilHardwareConfigListToHal(void *response, size_t responseLen,
8154 hidl_vec<HardwareConfig>& records) {
8155 int num = responseLen / sizeof(RIL_HardwareConfig);
8156 records.resize(num);
8157
8158 RIL_HardwareConfig *rilHardwareConfig = (RIL_HardwareConfig *) response;
8159 for (int i = 0; i < num; i++) {
8160 records[i].type = (HardwareConfigType) rilHardwareConfig[i].type;
8161 records[i].uuid = convertCharPtrToHidlString(rilHardwareConfig[i].uuid);
8162 records[i].state = (HardwareConfigState) rilHardwareConfig[i].state;
8163 switch (rilHardwareConfig[i].type) {
8164 case RIL_HARDWARE_CONFIG_MODEM: {
8165 records[i].modem.resize(1);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08008166 records[i].sim.resize(0);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008167 HardwareConfigModem *hwConfigModem = &records[i].modem[0];
8168 hwConfigModem->rat = rilHardwareConfig[i].cfg.modem.rat;
8169 hwConfigModem->maxVoice = rilHardwareConfig[i].cfg.modem.maxVoice;
8170 hwConfigModem->maxData = rilHardwareConfig[i].cfg.modem.maxData;
8171 hwConfigModem->maxStandby = rilHardwareConfig[i].cfg.modem.maxStandby;
8172 break;
8173 }
8174
8175 case RIL_HARDWARE_CONFIG_SIM: {
8176 records[i].sim.resize(1);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08008177 records[i].modem.resize(0);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008178 records[i].sim[0].modemUuid =
8179 convertCharPtrToHidlString(rilHardwareConfig[i].cfg.sim.modemUuid);
8180 break;
8181 }
8182 }
8183 }
8184}
8185
Amit Mahajan759786a2017-03-03 17:35:47 -08008186int radio::hardwareConfigChangedInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008187 int indicationType, int token, RIL_Errno e, void *response,
8188 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08008189 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan13058cb2017-06-07 23:10:27 -07008190 if ((response == NULL && responseLen != 0)
8191 || responseLen % sizeof(RIL_HardwareConfig) != 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008192 RLOGE("hardwareConfigChangedInd: invalid response");
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008193 return 0;
8194 }
8195
8196 hidl_vec<HardwareConfig> configs;
8197 convertRilHardwareConfigListToHal(response, responseLen, configs);
8198
Jayachandran C572f2f42017-03-25 14:30:13 -07008199#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08008200 RLOGD("hardwareConfigChangedInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07008201#endif
Amit Mahajan17249842017-01-19 15:05:45 -08008202 Return<void> retStatus = radioService[slotId]->mRadioIndication->hardwareConfigChanged(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008203 convertIntToRadioIndicationType(indicationType), configs);
Amit Mahajan17249842017-01-19 15:05:45 -08008204 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008205 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008206 RLOGE("hardwareConfigChangedInd: radioService[%d]->mRadioIndication == NULL",
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008207 slotId);
8208 }
8209
8210 return 0;
8211}
8212
8213void convertRilRadioCapabilityToHal(void *response, size_t responseLen, RadioCapability& rc) {
8214 RIL_RadioCapability *rilRadioCapability = (RIL_RadioCapability *) response;
8215 rc.session = rilRadioCapability->session;
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07008216 rc.phase = (V1_0::RadioCapabilityPhase) rilRadioCapability->phase;
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008217 rc.raf = rilRadioCapability->rat;
8218 rc.logicalModemUuid = convertCharPtrToHidlString(rilRadioCapability->logicalModemUuid);
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07008219 rc.status = (V1_0::RadioCapabilityStatus) rilRadioCapability->status;
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008220}
8221
Amit Mahajan759786a2017-03-03 17:35:47 -08008222int radio::radioCapabilityIndicationInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008223 int indicationType, int token, RIL_Errno e, void *response,
8224 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08008225 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008226 if (response == NULL || responseLen != sizeof(RIL_RadioCapability)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008227 RLOGE("radioCapabilityIndicationInd: invalid response");
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008228 return 0;
8229 }
8230
Jack Yuf68e0da2017-02-07 14:53:09 -08008231 RadioCapability rc = {};
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008232 convertRilRadioCapabilityToHal(response, responseLen, rc);
8233
Jayachandran C572f2f42017-03-25 14:30:13 -07008234#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08008235 RLOGD("radioCapabilityIndicationInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07008236#endif
Amit Mahajan17249842017-01-19 15:05:45 -08008237 Return<void> retStatus = radioService[slotId]->mRadioIndication->radioCapabilityIndication(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008238 convertIntToRadioIndicationType(indicationType), rc);
Amit Mahajan17249842017-01-19 15:05:45 -08008239 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008240 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008241 RLOGE("radioCapabilityIndicationInd: radioService[%d]->mRadioIndication == NULL",
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008242 slotId);
8243 }
8244
8245 return 0;
8246}
8247
8248bool isServiceTypeCfQuery(RIL_SsServiceType serType, RIL_SsRequestType reqType) {
8249 if ((reqType == SS_INTERROGATION) &&
8250 (serType == SS_CFU ||
8251 serType == SS_CF_BUSY ||
8252 serType == SS_CF_NO_REPLY ||
8253 serType == SS_CF_NOT_REACHABLE ||
8254 serType == SS_CF_ALL ||
8255 serType == SS_CF_ALL_CONDITIONAL)) {
8256 return true;
8257 }
8258 return false;
8259}
8260
Amit Mahajan759786a2017-03-03 17:35:47 -08008261int radio::onSupplementaryServiceIndicationInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008262 int indicationType, int token, RIL_Errno e,
8263 void *response, size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08008264 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008265 if (response == NULL || responseLen != sizeof(RIL_StkCcUnsolSsResponse)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008266 RLOGE("onSupplementaryServiceIndicationInd: invalid response");
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008267 return 0;
8268 }
8269
8270 RIL_StkCcUnsolSsResponse *rilSsResponse = (RIL_StkCcUnsolSsResponse *) response;
Jack Yuf68e0da2017-02-07 14:53:09 -08008271 StkCcUnsolSsResult ss = {};
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008272 ss.serviceType = (SsServiceType) rilSsResponse->serviceType;
8273 ss.requestType = (SsRequestType) rilSsResponse->requestType;
8274 ss.teleserviceType = (SsTeleserviceType) rilSsResponse->teleserviceType;
8275 ss.serviceClass = rilSsResponse->serviceClass;
8276 ss.result = (RadioError) rilSsResponse->result;
8277
8278 if (isServiceTypeCfQuery(rilSsResponse->serviceType, rilSsResponse->requestType)) {
Jayachandran C572f2f42017-03-25 14:30:13 -07008279#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08008280 RLOGD("onSupplementaryServiceIndicationInd CF type, num of Cf elements %d",
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008281 rilSsResponse->cfData.numValidIndexes);
Jayachandran C572f2f42017-03-25 14:30:13 -07008282#endif
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008283 if (rilSsResponse->cfData.numValidIndexes > NUM_SERVICE_CLASSES) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008284 RLOGE("onSupplementaryServiceIndicationInd numValidIndexes is greater than "
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008285 "max value %d, truncating it to max value", NUM_SERVICE_CLASSES);
8286 rilSsResponse->cfData.numValidIndexes = NUM_SERVICE_CLASSES;
8287 }
8288
8289 ss.cfData.resize(1);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08008290 ss.ssInfo.resize(0);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008291
8292 /* number of call info's */
8293 ss.cfData[0].cfInfo.resize(rilSsResponse->cfData.numValidIndexes);
8294
8295 for (int i = 0; i < rilSsResponse->cfData.numValidIndexes; i++) {
8296 RIL_CallForwardInfo cf = rilSsResponse->cfData.cfInfo[i];
8297 CallForwardInfo *cfInfo = &ss.cfData[0].cfInfo[i];
8298
8299 cfInfo->status = (CallForwardInfoStatus) cf.status;
8300 cfInfo->reason = cf.reason;
8301 cfInfo->serviceClass = cf.serviceClass;
8302 cfInfo->toa = cf.toa;
8303 cfInfo->number = convertCharPtrToHidlString(cf.number);
8304 cfInfo->timeSeconds = cf.timeSeconds;
Jayachandran C572f2f42017-03-25 14:30:13 -07008305#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08008306 RLOGD("onSupplementaryServiceIndicationInd: "
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008307 "Data: %d,reason=%d,cls=%d,toa=%d,num=%s,tout=%d],", cf.status,
8308 cf.reason, cf.serviceClass, cf.toa, (char*)cf.number, cf.timeSeconds);
Jayachandran C572f2f42017-03-25 14:30:13 -07008309#endif
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008310 }
8311 } else {
8312 ss.ssInfo.resize(1);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08008313 ss.cfData.resize(0);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008314
8315 /* each int */
8316 ss.ssInfo[0].ssInfo.resize(SS_INFO_MAX);
8317 for (int i = 0; i < SS_INFO_MAX; i++) {
Jayachandran C572f2f42017-03-25 14:30:13 -07008318#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08008319 RLOGD("onSupplementaryServiceIndicationInd: Data: %d",
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008320 rilSsResponse->ssInfo[i]);
Jayachandran C572f2f42017-03-25 14:30:13 -07008321#endif
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008322 ss.ssInfo[0].ssInfo[i] = rilSsResponse->ssInfo[i];
8323 }
8324 }
8325
Jayachandran C572f2f42017-03-25 14:30:13 -07008326#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08008327 RLOGD("onSupplementaryServiceIndicationInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07008328#endif
Amit Mahajan17249842017-01-19 15:05:45 -08008329 Return<void> retStatus = radioService[slotId]->mRadioIndication->
8330 onSupplementaryServiceIndication(convertIntToRadioIndicationType(indicationType),
8331 ss);
8332 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008333 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008334 RLOGE("onSupplementaryServiceIndicationInd: "
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008335 "radioService[%d]->mRadioIndication == NULL", slotId);
8336 }
8337
8338 return 0;
8339}
8340
Amit Mahajan759786a2017-03-03 17:35:47 -08008341int radio::stkCallControlAlphaNotifyInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008342 int indicationType, int token, RIL_Errno e, void *response,
8343 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08008344 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008345 if (response == NULL || responseLen == 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008346 RLOGE("stkCallControlAlphaNotifyInd: invalid response");
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008347 return 0;
8348 }
Jayachandran C572f2f42017-03-25 14:30:13 -07008349#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08008350 RLOGD("stkCallControlAlphaNotifyInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07008351#endif
Amit Mahajan17249842017-01-19 15:05:45 -08008352 Return<void> retStatus = radioService[slotId]->mRadioIndication->stkCallControlAlphaNotify(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008353 convertIntToRadioIndicationType(indicationType),
8354 convertCharPtrToHidlString((char *) response));
Amit Mahajan17249842017-01-19 15:05:45 -08008355 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008356 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008357 RLOGE("stkCallControlAlphaNotifyInd: radioService[%d]->mRadioIndication == NULL",
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008358 slotId);
8359 }
8360
8361 return 0;
8362}
8363
8364void convertRilLceDataInfoToHal(void *response, size_t responseLen, LceDataInfo& lce) {
8365 RIL_LceDataInfo *rilLceDataInfo = (RIL_LceDataInfo *)response;
8366 lce.lastHopCapacityKbps = rilLceDataInfo->last_hop_capacity_kbps;
8367 lce.confidenceLevel = rilLceDataInfo->confidence_level;
8368 lce.lceSuspended = rilLceDataInfo->lce_suspended;
8369}
8370
Amit Mahajan759786a2017-03-03 17:35:47 -08008371int radio::lceDataInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008372 int indicationType, int token, RIL_Errno e, void *response,
8373 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08008374 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008375 if (response == NULL || responseLen != sizeof(RIL_LceDataInfo)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008376 RLOGE("lceDataInd: invalid response");
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008377 return 0;
8378 }
8379
Jack Yuf68e0da2017-02-07 14:53:09 -08008380 LceDataInfo lce = {};
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008381 convertRilLceDataInfoToHal(response, responseLen, lce);
Jayachandran C572f2f42017-03-25 14:30:13 -07008382#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08008383 RLOGD("lceDataInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07008384#endif
Amit Mahajan17249842017-01-19 15:05:45 -08008385 Return<void> retStatus = radioService[slotId]->mRadioIndication->lceData(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008386 convertIntToRadioIndicationType(indicationType), lce);
Amit Mahajan17249842017-01-19 15:05:45 -08008387 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008388 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008389 RLOGE("lceDataInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008390 }
8391
8392 return 0;
8393}
8394
Amit Mahajan759786a2017-03-03 17:35:47 -08008395int radio::pcoDataInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008396 int indicationType, int token, RIL_Errno e, void *response,
8397 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08008398 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008399 if (response == NULL || responseLen != sizeof(RIL_PCO_Data)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008400 RLOGE("pcoDataInd: invalid response");
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008401 return 0;
8402 }
8403
Jack Yuf68e0da2017-02-07 14:53:09 -08008404 PcoDataInfo pco = {};
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008405 RIL_PCO_Data *rilPcoData = (RIL_PCO_Data *)response;
8406 pco.cid = rilPcoData->cid;
8407 pco.bearerProto = convertCharPtrToHidlString(rilPcoData->bearer_proto);
8408 pco.pcoId = rilPcoData->pco_id;
8409 pco.contents.setToExternal((uint8_t *) rilPcoData->contents, rilPcoData->contents_length);
8410
Jayachandran C572f2f42017-03-25 14:30:13 -07008411#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08008412 RLOGD("pcoDataInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07008413#endif
Amit Mahajan17249842017-01-19 15:05:45 -08008414 Return<void> retStatus = radioService[slotId]->mRadioIndication->pcoData(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008415 convertIntToRadioIndicationType(indicationType), pco);
Amit Mahajan17249842017-01-19 15:05:45 -08008416 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008417 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008418 RLOGE("pcoDataInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008419 }
8420
8421 return 0;
8422}
8423
Amit Mahajan759786a2017-03-03 17:35:47 -08008424int radio::modemResetInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008425 int indicationType, int token, RIL_Errno e, void *response,
8426 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08008427 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008428 if (response == NULL || responseLen == 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008429 RLOGE("modemResetInd: invalid response");
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008430 return 0;
8431 }
Jayachandran C572f2f42017-03-25 14:30:13 -07008432#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08008433 RLOGD("modemResetInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07008434#endif
Amit Mahajan17249842017-01-19 15:05:45 -08008435 Return<void> retStatus = radioService[slotId]->mRadioIndication->modemReset(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008436 convertIntToRadioIndicationType(indicationType),
8437 convertCharPtrToHidlString((char *) response));
Amit Mahajan17249842017-01-19 15:05:45 -08008438 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008439 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008440 RLOGE("modemResetInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008441 }
8442
8443 return 0;
8444}
8445
yinxu3abe7c72017-05-03 15:15:19 -07008446int radio::networkScanResultInd(int slotId,
8447 int indicationType, int token, RIL_Errno e, void *response,
yinxu8688abd2017-05-22 11:26:45 -07008448 size_t responseLen) {
yinxu3abe7c72017-05-03 15:15:19 -07008449#if VDBG
8450 RLOGD("networkScanResultInd");
8451#endif
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07008452 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndicationV1_1 != NULL) {
yinxu8688abd2017-05-22 11:26:45 -07008453 if (response == NULL || responseLen == 0) {
8454 RLOGE("networkScanResultInd: invalid response");
8455 return 0;
8456 }
8457 RLOGD("networkScanResultInd");
8458
8459#if VDBG
8460 RLOGD("networkScanResultInd");
8461#endif
8462
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07008463 RIL_NetworkScanResult *networkScanResult = (RIL_NetworkScanResult *) response;
yinxu8688abd2017-05-22 11:26:45 -07008464
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07008465 V1_1::NetworkScanResult result;
8466 result.status = (V1_1::ScanStatus) networkScanResult->status;
Sooraj Sasindran982ba7a2018-05-07 21:20:43 -07008467 result.error = (RadioError) networkScanResult->error;
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07008468 convertRilCellInfoListToHal(
8469 networkScanResult->network_infos,
8470 networkScanResult->network_infos_length * sizeof(RIL_CellInfo_v12),
8471 result.networkInfos);
yinxu8688abd2017-05-22 11:26:45 -07008472
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07008473 Return<void> retStatus = radioService[slotId]->mRadioIndicationV1_1->networkScanResult(
8474 convertIntToRadioIndicationType(indicationType), result);
8475 radioService[slotId]->checkReturnStatus(retStatus);
yinxu8688abd2017-05-22 11:26:45 -07008476 } else {
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07008477 RLOGE("networkScanResultInd: radioService[%d]->mRadioIndicationV1_1 == NULL", slotId);
yinxu8688abd2017-05-22 11:26:45 -07008478 }
yinxu3abe7c72017-05-03 15:15:19 -07008479 return 0;
8480}
8481
pkanwardb8e0942017-03-17 12:49:34 -07008482int radio::carrierInfoForImsiEncryption(int slotId,
8483 int indicationType, int token, RIL_Errno e, void *response,
8484 size_t responseLen) {
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07008485 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndicationV1_1 != NULL) {
pkanwardb8e0942017-03-17 12:49:34 -07008486 if (response == NULL || responseLen == 0) {
8487 RLOGE("carrierInfoForImsiEncryption: invalid response");
8488 return 0;
8489 }
8490 RLOGD("carrierInfoForImsiEncryption");
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07008491 Return<void> retStatus = radioService[slotId]->mRadioIndicationV1_1->
8492 carrierInfoForImsiEncryption(convertIntToRadioIndicationType(indicationType));
8493 radioService[slotId]->checkReturnStatus(retStatus);
pkanwardb8e0942017-03-17 12:49:34 -07008494 } else {
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07008495 RLOGE("carrierInfoForImsiEncryption: radioService[%d]->mRadioIndicationV1_1 == NULL",
8496 slotId);
pkanwardb8e0942017-03-17 12:49:34 -07008497 }
8498
8499 return 0;
8500}
8501
Nathan Harold6a8809d2017-07-07 19:28:58 -07008502int radio::keepaliveStatusInd(int slotId,
8503 int indicationType, int token, RIL_Errno e, void *response,
8504 size_t responseLen) {
8505#if VDBG
8506 RLOGD("%s(): token=%d", __FUNCTION__, token);
8507#endif
8508 if (radioService[slotId] == NULL || radioService[slotId]->mRadioIndication == NULL) {
8509 RLOGE("%s: radioService[%d]->mRadioIndication == NULL", __FUNCTION__, slotId);
8510 return 0;
8511 }
8512
8513 auto ret = V1_1::IRadioIndication::castFrom(
8514 radioService[slotId]->mRadioIndication);
8515 if (!ret.isOk()) {
8516 RLOGE("%s: ret.isOk() == false for radioService[%d]", __FUNCTION__, slotId);
8517 return 0;
8518 }
8519 sp<V1_1::IRadioIndication> radioIndicationV1_1 = ret;
8520
8521 if (response == NULL || responseLen != sizeof(V1_1::KeepaliveStatus)) {
8522 RLOGE("%s: invalid response", __FUNCTION__);
8523 return 0;
8524 }
8525
8526 V1_1::KeepaliveStatus ks;
8527 convertRilKeepaliveStatusToHal(static_cast<RIL_KeepaliveStatus*>(response), ks);
8528
8529 Return<void> retStatus = radioIndicationV1_1->keepaliveStatus(
8530 convertIntToRadioIndicationType(indicationType), ks);
8531 radioService[slotId]->checkReturnStatus(retStatus);
8532 return 0;
8533}
8534
Amit Mahajan759786a2017-03-03 17:35:47 -08008535int radio::oemHookRawInd(int slotId,
Amit Mahajan439da362017-02-13 17:43:04 -08008536 int indicationType, int token, RIL_Errno e, void *response,
8537 size_t responseLen) {
Steven Moreland6cc40042018-03-20 11:20:05 -07008538 if (!kOemHookEnabled) return 0;
8539
Amit Mahajan439da362017-02-13 17:43:04 -08008540 if (oemHookService[slotId] != NULL && oemHookService[slotId]->mOemHookIndication != NULL) {
8541 if (response == NULL || responseLen == 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008542 RLOGE("oemHookRawInd: invalid response");
Amit Mahajan439da362017-02-13 17:43:04 -08008543 return 0;
8544 }
8545
8546 hidl_vec<uint8_t> data;
8547 data.setToExternal((uint8_t *) response, responseLen);
Jayachandran C572f2f42017-03-25 14:30:13 -07008548#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08008549 RLOGD("oemHookRawInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07008550#endif
Amit Mahajan439da362017-02-13 17:43:04 -08008551 Return<void> retStatus = oemHookService[slotId]->mOemHookIndication->oemHookRaw(
8552 convertIntToRadioIndicationType(indicationType), data);
Amit Mahajand423d192017-03-16 17:04:01 -07008553 checkReturnStatus(slotId, retStatus, false);
Amit Mahajan439da362017-02-13 17:43:04 -08008554 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008555 RLOGE("oemHookRawInd: oemHookService[%d]->mOemHookIndication == NULL", slotId);
Amit Mahajan439da362017-02-13 17:43:04 -08008556 }
8557
8558 return 0;
8559}
8560
Amit Mahajancd77a5b2016-08-25 11:19:21 -07008561void radio::registerService(RIL_RadioFunctions *callbacks, CommandInfo *commands) {
8562 using namespace android::hardware;
8563 int simCount = 1;
Amit Mahajan439da362017-02-13 17:43:04 -08008564 const char *serviceNames[] = {
Amit Mahajan7955c432017-03-28 11:17:55 -07008565 android::RIL_getServiceName()
Amit Mahajancd77a5b2016-08-25 11:19:21 -07008566 #if (SIM_COUNT >= 2)
Amit Mahajan7955c432017-03-28 11:17:55 -07008567 , RIL2_SERVICE_NAME
Amit Mahajancd77a5b2016-08-25 11:19:21 -07008568 #if (SIM_COUNT >= 3)
Amit Mahajan7955c432017-03-28 11:17:55 -07008569 , RIL3_SERVICE_NAME
Amit Mahajancd77a5b2016-08-25 11:19:21 -07008570 #if (SIM_COUNT >= 4)
Amit Mahajan7955c432017-03-28 11:17:55 -07008571 , RIL4_SERVICE_NAME
Amit Mahajan439da362017-02-13 17:43:04 -08008572 #endif
8573 #endif
8574 #endif
8575 };
8576
Amit Mahajancd77a5b2016-08-25 11:19:21 -07008577 #if (SIM_COUNT >= 2)
8578 simCount = SIM_COUNT;
8579 #endif
8580
terrycrhuang456df1b2018-05-04 13:47:06 +08008581 s_vendorFunctions = callbacks;
8582 s_commands = commands;
8583
Amit Mahajancd77a5b2016-08-25 11:19:21 -07008584 configureRpcThreadpool(1, true /* callerWillJoin */);
8585 for (int i = 0; i < simCount; i++) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08008586 pthread_rwlock_t *radioServiceRwlockPtr = getRadioServiceRwlock(i);
8587 int ret = pthread_rwlock_wrlock(radioServiceRwlockPtr);
8588 assert(ret == 0);
8589
Amit Mahajancd77a5b2016-08-25 11:19:21 -07008590 radioService[i] = new RadioImpl;
Sanket Padawef220dc52017-01-02 23:46:00 -08008591 radioService[i]->mSlotId = i;
pkanwardb8e0942017-03-17 12:49:34 -07008592 RLOGD("registerService: starting android::hardware::radio::V1_1::IRadio %s",
8593 serviceNames[i]);
Amit Mahajancd77a5b2016-08-25 11:19:21 -07008594 android::status_t status = radioService[i]->registerAsService(serviceNames[i]);
Steven Moreland6cc40042018-03-20 11:20:05 -07008595
8596 if (kOemHookEnabled) {
8597 oemHookService[i] = new OemHookImpl;
8598 oemHookService[i]->mSlotId = i;
8599 status = oemHookService[i]->registerAsService(serviceNames[i]);
8600 }
Amit Mahajan932e08e2017-01-24 05:45:02 -08008601
8602 ret = pthread_rwlock_unlock(radioServiceRwlockPtr);
8603 assert(ret == 0);
Amit Mahajancd77a5b2016-08-25 11:19:21 -07008604 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07008605}
8606
8607void rilc_thread_pool() {
8608 joinRpcThreadpool();
Amit Mahajan932e08e2017-01-24 05:45:02 -08008609}
8610
8611pthread_rwlock_t * radio::getRadioServiceRwlock(int slotId) {
8612 pthread_rwlock_t *radioServiceRwlockPtr = &radioServiceRwlock;
8613
8614 #if (SIM_COUNT >= 2)
8615 if (slotId == 2) radioServiceRwlockPtr = &radioServiceRwlock2;
8616 #if (SIM_COUNT >= 3)
8617 if (slotId == 3) radioServiceRwlockPtr = &radioServiceRwlock3;
8618 #if (SIM_COUNT >= 4)
8619 if (slotId == 4) radioServiceRwlockPtr = &radioServiceRwlock4;
8620 #endif
8621 #endif
8622 #endif
8623
8624 return radioServiceRwlockPtr;
Sanket Padawe0de29d12017-02-10 13:19:47 -08008625}
Amit Mahajane9a10e62018-02-23 17:12:15 -08008626
8627// should acquire write lock for the corresponding service before calling this
8628void radio::setNitzTimeReceived(int slotId, long timeReceived) {
8629 nitzTimeReceived[slotId] = timeReceived;
8630}