blob: e35230dbce4393fe0bab3d450fdf0fa97e709de3 [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
1380 if (request.specifiers.size() > MAX_RADIO_ACCESS_NETWORKS) {
1381 sendErrorResponse(pRI, RIL_E_INVALID_ARGUMENTS);
1382 return Void();
1383 }
1384
1385 RIL_NetworkScanRequest scan_request = {};
1386
1387 scan_request.type = (RIL_ScanType) request.type;
1388 scan_request.interval = request.interval;
1389 scan_request.specifiers_length = request.specifiers.size();
1390 for (size_t i = 0; i < request.specifiers.size(); ++i) {
1391 if (request.specifiers[i].geranBands.size() > MAX_BANDS ||
1392 request.specifiers[i].utranBands.size() > MAX_BANDS ||
1393 request.specifiers[i].eutranBands.size() > MAX_BANDS ||
1394 request.specifiers[i].channels.size() > MAX_CHANNELS) {
1395 sendErrorResponse(pRI, RIL_E_INVALID_ARGUMENTS);
1396 return Void();
1397 }
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07001398 const V1_1::RadioAccessSpecifier& ras_from =
yinxu8688abd2017-05-22 11:26:45 -07001399 request.specifiers[i];
1400 RIL_RadioAccessSpecifier& ras_to = scan_request.specifiers[i];
1401
1402 ras_to.radio_access_network = (RIL_RadioAccessNetworks) ras_from.radioAccessNetwork;
1403 ras_to.channels_length = ras_from.channels.size();
1404
1405 std::copy(ras_from.channels.begin(), ras_from.channels.end(), ras_to.channels);
1406 const std::vector<uint32_t> * bands = nullptr;
1407 switch (request.specifiers[i].radioAccessNetwork) {
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07001408 case V1_1::RadioAccessNetworks::GERAN:
yinxu8688abd2017-05-22 11:26:45 -07001409 ras_to.bands_length = ras_from.geranBands.size();
1410 bands = (std::vector<uint32_t> *) &ras_from.geranBands;
1411 break;
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07001412 case V1_1::RadioAccessNetworks::UTRAN:
yinxu8688abd2017-05-22 11:26:45 -07001413 ras_to.bands_length = ras_from.utranBands.size();
1414 bands = (std::vector<uint32_t> *) &ras_from.utranBands;
1415 break;
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07001416 case V1_1::RadioAccessNetworks::EUTRAN:
yinxu8688abd2017-05-22 11:26:45 -07001417 ras_to.bands_length = ras_from.eutranBands.size();
1418 bands = (std::vector<uint32_t> *) &ras_from.eutranBands;
1419 break;
1420 default:
1421 sendErrorResponse(pRI, RIL_E_INVALID_ARGUMENTS);
1422 return Void();
1423 }
1424 // safe to copy to geran_bands because it's a union member
yinxu9c7ad932017-06-22 17:10:59 -07001425 for (size_t idx = 0; idx < ras_to.bands_length; ++idx) {
1426 ras_to.bands.geran_bands[idx] = (RIL_GeranBands) (*bands)[idx];
1427 }
yinxu8688abd2017-05-22 11:26:45 -07001428 }
1429
Mathieu Chartierf65b2c92017-06-05 13:59:25 -07001430 CALL_ONREQUEST(RIL_REQUEST_START_NETWORK_SCAN, &scan_request, sizeof(scan_request), pRI,
1431 mSlotId);
yinxu8688abd2017-05-22 11:26:45 -07001432
yinxu3abe7c72017-05-03 15:15:19 -07001433 return Void();
1434}
1435
1436Return<void> RadioImpl::stopNetworkScan(int32_t serial) {
1437#if VDBG
1438 RLOGD("stopNetworkScan: serial %d", serial);
1439#endif
yinxu3abe7c72017-05-03 15:15:19 -07001440 dispatchVoid(serial, mSlotId, RIL_REQUEST_STOP_NETWORK_SCAN);
1441 return Void();
1442}
1443
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001444Return<void> RadioImpl::startDtmf(int32_t serial, const hidl_string& s) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001445#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001446 RLOGD("startDtmf: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001447#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001448 dispatchString(serial, mSlotId, RIL_REQUEST_DTMF_START,
Scott Randolphc7213312017-04-03 14:06:40 -07001449 s.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001450 return Void();
1451}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001452
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001453Return<void> RadioImpl::stopDtmf(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001454#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001455 RLOGD("stopDtmf: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001456#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001457 dispatchVoid(serial, mSlotId, RIL_REQUEST_DTMF_STOP);
1458 return Void();
1459}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001460
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001461Return<void> RadioImpl::getBasebandVersion(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001462#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001463 RLOGD("getBasebandVersion: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001464#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001465 dispatchVoid(serial, mSlotId, RIL_REQUEST_BASEBAND_VERSION);
1466 return Void();
1467}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001468
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001469Return<void> RadioImpl::separateConnection(int32_t serial, int32_t gsmIndex) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001470#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001471 RLOGD("separateConnection: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001472#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001473 dispatchInts(serial, mSlotId, RIL_REQUEST_SEPARATE_CONNECTION, 1, gsmIndex);
1474 return Void();
1475}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001476
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001477Return<void> RadioImpl::setMute(int32_t serial, bool enable) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001478#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001479 RLOGD("setMute: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001480#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001481 dispatchInts(serial, mSlotId, RIL_REQUEST_SET_MUTE, 1, BOOL_TO_INT(enable));
1482 return Void();
1483}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001484
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001485Return<void> RadioImpl::getMute(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001486#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001487 RLOGD("getMute: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001488#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001489 dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_MUTE);
1490 return Void();
1491}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001492
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001493Return<void> RadioImpl::getClip(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001494#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001495 RLOGD("getClip: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001496#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001497 dispatchVoid(serial, mSlotId, RIL_REQUEST_QUERY_CLIP);
1498 return Void();
1499}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001500
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001501Return<void> RadioImpl::getDataCallList(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001502#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001503 RLOGD("getDataCallList: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001504#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001505 dispatchVoid(serial, mSlotId, RIL_REQUEST_DATA_CALL_LIST);
1506 return Void();
1507}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001508
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001509Return<void> RadioImpl::setSuppServiceNotifications(int32_t serial, bool enable) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001510#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001511 RLOGD("setSuppServiceNotifications: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001512#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001513 dispatchInts(serial, mSlotId, RIL_REQUEST_SET_SUPP_SVC_NOTIFICATION, 1,
1514 BOOL_TO_INT(enable));
1515 return Void();
1516}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001517
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001518Return<void> RadioImpl::writeSmsToSim(int32_t serial, const SmsWriteArgs& smsWriteArgs) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001519#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001520 RLOGD("writeSmsToSim: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001521#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001522 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_WRITE_SMS_TO_SIM);
1523 if (pRI == NULL) {
1524 return Void();
1525 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001526
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001527 RIL_SMS_WriteArgs args;
1528 args.status = (int) smsWriteArgs.status;
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001529
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001530 if (!copyHidlStringToRil(&args.pdu, smsWriteArgs.pdu, pRI)) {
1531 return Void();
1532 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001533
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001534 if (!copyHidlStringToRil(&args.smsc, smsWriteArgs.smsc, pRI)) {
1535 memsetAndFreeStrings(1, args.pdu);
1536 return Void();
1537 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001538
Amit Mahajanb3a11bb2017-05-15 16:41:44 -07001539 CALL_ONREQUEST(RIL_REQUEST_WRITE_SMS_TO_SIM, &args, sizeof(args), pRI, mSlotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001540
1541 memsetAndFreeStrings(2, args.smsc, args.pdu);
1542
1543 return Void();
1544}
1545
1546Return<void> RadioImpl::deleteSmsOnSim(int32_t serial, int32_t index) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001547#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001548 RLOGD("deleteSmsOnSim: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001549#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001550 dispatchInts(serial, mSlotId, RIL_REQUEST_DELETE_SMS_ON_SIM, 1, index);
1551 return Void();
1552}
1553
1554Return<void> RadioImpl::setBandMode(int32_t serial, RadioBandMode mode) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001555#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001556 RLOGD("setBandMode: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001557#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001558 dispatchInts(serial, mSlotId, RIL_REQUEST_SET_BAND_MODE, 1, mode);
1559 return Void();
1560}
1561
1562Return<void> RadioImpl::getAvailableBandModes(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001563#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001564 RLOGD("getAvailableBandModes: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001565#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001566 dispatchVoid(serial, mSlotId, RIL_REQUEST_QUERY_AVAILABLE_BAND_MODE);
1567 return Void();
1568}
1569
1570Return<void> RadioImpl::sendEnvelope(int32_t serial, const hidl_string& command) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001571#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001572 RLOGD("sendEnvelope: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001573#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001574 dispatchString(serial, mSlotId, RIL_REQUEST_STK_SEND_ENVELOPE_COMMAND,
Scott Randolphc7213312017-04-03 14:06:40 -07001575 command.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001576 return Void();
1577}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001578
1579Return<void> RadioImpl::sendTerminalResponseToSim(int32_t serial,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001580 const hidl_string& commandResponse) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001581#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001582 RLOGD("sendTerminalResponseToSim: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001583#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001584 dispatchString(serial, mSlotId, RIL_REQUEST_STK_SEND_TERMINAL_RESPONSE,
Scott Randolphc7213312017-04-03 14:06:40 -07001585 commandResponse.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001586 return Void();
1587}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001588
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001589Return<void> RadioImpl::handleStkCallSetupRequestFromSim(int32_t serial, bool accept) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001590#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001591 RLOGD("handleStkCallSetupRequestFromSim: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001592#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001593 dispatchInts(serial, mSlotId, RIL_REQUEST_STK_HANDLE_CALL_SETUP_REQUESTED_FROM_SIM,
1594 1, BOOL_TO_INT(accept));
1595 return Void();
1596}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001597
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001598Return<void> RadioImpl::explicitCallTransfer(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001599#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001600 RLOGD("explicitCallTransfer: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001601#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001602 dispatchVoid(serial, mSlotId, RIL_REQUEST_EXPLICIT_CALL_TRANSFER);
1603 return Void();
1604}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001605
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001606Return<void> RadioImpl::setPreferredNetworkType(int32_t serial, PreferredNetworkType nwType) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001607#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001608 RLOGD("setPreferredNetworkType: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001609#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001610 dispatchInts(serial, mSlotId, RIL_REQUEST_SET_PREFERRED_NETWORK_TYPE, 1, nwType);
1611 return Void();
1612}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001613
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001614Return<void> RadioImpl::getPreferredNetworkType(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001615#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001616 RLOGD("getPreferredNetworkType: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001617#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001618 dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_PREFERRED_NETWORK_TYPE);
1619 return Void();
1620}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001621
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001622Return<void> RadioImpl::getNeighboringCids(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001623#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001624 RLOGD("getNeighboringCids: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001625#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001626 dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_NEIGHBORING_CELL_IDS);
1627 return Void();
1628}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001629
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001630Return<void> RadioImpl::setLocationUpdates(int32_t serial, bool enable) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001631#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001632 RLOGD("setLocationUpdates: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001633#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001634 dispatchInts(serial, mSlotId, RIL_REQUEST_SET_LOCATION_UPDATES, 1, BOOL_TO_INT(enable));
1635 return Void();
1636}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001637
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001638Return<void> RadioImpl::setCdmaSubscriptionSource(int32_t serial, CdmaSubscriptionSource cdmaSub) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001639#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001640 RLOGD("setCdmaSubscriptionSource: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001641#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001642 dispatchInts(serial, mSlotId, RIL_REQUEST_CDMA_SET_SUBSCRIPTION_SOURCE, 1, cdmaSub);
1643 return Void();
1644}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001645
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001646Return<void> RadioImpl::setCdmaRoamingPreference(int32_t serial, CdmaRoamingType type) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001647#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001648 RLOGD("setCdmaRoamingPreference: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001649#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001650 dispatchInts(serial, mSlotId, RIL_REQUEST_CDMA_SET_ROAMING_PREFERENCE, 1, type);
1651 return Void();
1652}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001653
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001654Return<void> RadioImpl::getCdmaRoamingPreference(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001655#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001656 RLOGD("getCdmaRoamingPreference: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001657#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001658 dispatchVoid(serial, mSlotId, RIL_REQUEST_CDMA_QUERY_ROAMING_PREFERENCE);
1659 return Void();
1660}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001661
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001662Return<void> RadioImpl::setTTYMode(int32_t serial, TtyMode mode) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001663#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001664 RLOGD("setTTYMode: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001665#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001666 dispatchInts(serial, mSlotId, RIL_REQUEST_SET_TTY_MODE, 1, mode);
1667 return Void();
1668}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001669
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001670Return<void> RadioImpl::getTTYMode(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001671#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001672 RLOGD("getTTYMode: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001673#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001674 dispatchVoid(serial, mSlotId, RIL_REQUEST_QUERY_TTY_MODE);
1675 return Void();
1676}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001677
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001678Return<void> RadioImpl::setPreferredVoicePrivacy(int32_t serial, bool enable) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001679#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001680 RLOGD("setPreferredVoicePrivacy: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001681#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001682 dispatchInts(serial, mSlotId, RIL_REQUEST_CDMA_SET_PREFERRED_VOICE_PRIVACY_MODE,
1683 1, BOOL_TO_INT(enable));
1684 return Void();
1685}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001686
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001687Return<void> RadioImpl::getPreferredVoicePrivacy(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001688#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001689 RLOGD("getPreferredVoicePrivacy: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001690#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001691 dispatchVoid(serial, mSlotId, RIL_REQUEST_CDMA_QUERY_PREFERRED_VOICE_PRIVACY_MODE);
1692 return Void();
1693}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001694
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001695Return<void> RadioImpl::sendCDMAFeatureCode(int32_t serial, const hidl_string& featureCode) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001696#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001697 RLOGD("sendCDMAFeatureCode: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001698#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001699 dispatchString(serial, mSlotId, RIL_REQUEST_CDMA_FLASH,
Scott Randolphc7213312017-04-03 14:06:40 -07001700 featureCode.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001701 return Void();
1702}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001703
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001704Return<void> RadioImpl::sendBurstDtmf(int32_t serial, const hidl_string& dtmf, int32_t on,
1705 int32_t off) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001706#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001707 RLOGD("sendBurstDtmf: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001708#endif
Ruthwar Kumar Ambeer7c373812017-03-23 17:38:56 +05301709 dispatchStrings(serial, mSlotId, RIL_REQUEST_CDMA_BURST_DTMF, false,
Scott Randolphc7213312017-04-03 14:06:40 -07001710 3, dtmf.c_str(), (std::to_string(on)).c_str(),
1711 (std::to_string(off)).c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001712 return Void();
1713}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001714
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001715void constructCdmaSms(RIL_CDMA_SMS_Message &rcsm, const CdmaSmsMessage& sms) {
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001716 rcsm.uTeleserviceID = sms.teleserviceId;
1717 rcsm.bIsServicePresent = BOOL_TO_INT(sms.isServicePresent);
1718 rcsm.uServicecategory = sms.serviceCategory;
1719 rcsm.sAddress.digit_mode = (RIL_CDMA_SMS_DigitMode) sms.address.digitMode;
1720 rcsm.sAddress.number_mode = (RIL_CDMA_SMS_NumberMode) sms.address.numberMode;
1721 rcsm.sAddress.number_type = (RIL_CDMA_SMS_NumberType) sms.address.numberType;
1722 rcsm.sAddress.number_plan = (RIL_CDMA_SMS_NumberPlan) sms.address.numberPlan;
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001723
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001724 rcsm.sAddress.number_of_digits = sms.address.digits.size();
1725 int digitLimit= MIN((rcsm.sAddress.number_of_digits), RIL_CDMA_SMS_ADDRESS_MAX);
1726 for (int i = 0; i < digitLimit; i++) {
1727 rcsm.sAddress.digits[i] = sms.address.digits[i];
1728 }
1729
1730 rcsm.sSubAddress.subaddressType = (RIL_CDMA_SMS_SubaddressType) sms.subAddress.subaddressType;
1731 rcsm.sSubAddress.odd = BOOL_TO_INT(sms.subAddress.odd);
1732
1733 rcsm.sSubAddress.number_of_digits = sms.subAddress.digits.size();
1734 digitLimit= MIN((rcsm.sSubAddress.number_of_digits), RIL_CDMA_SMS_SUBADDRESS_MAX);
1735 for (int i = 0; i < digitLimit; i++) {
1736 rcsm.sSubAddress.digits[i] = sms.subAddress.digits[i];
1737 }
1738
1739 rcsm.uBearerDataLen = sms.bearerData.size();
1740 digitLimit= MIN((rcsm.uBearerDataLen), RIL_CDMA_SMS_BEARER_DATA_MAX);
1741 for (int i = 0; i < digitLimit; i++) {
1742 rcsm.aBearerData[i] = sms.bearerData[i];
1743 }
1744}
1745
1746Return<void> RadioImpl::sendCdmaSms(int32_t serial, const CdmaSmsMessage& sms) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001747#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001748 RLOGD("sendCdmaSms: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001749#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001750 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_CDMA_SEND_SMS);
1751 if (pRI == NULL) {
1752 return Void();
1753 }
1754
Jack Yu8e732d42017-04-14 00:08:06 -07001755 RIL_CDMA_SMS_Message rcsm = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001756 constructCdmaSms(rcsm, sms);
1757
Amit Mahajanb3a11bb2017-05-15 16:41:44 -07001758 CALL_ONREQUEST(pRI->pCI->requestNumber, &rcsm, sizeof(rcsm), pRI, mSlotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001759 return Void();
1760}
1761
1762Return<void> RadioImpl::acknowledgeLastIncomingCdmaSms(int32_t serial, const CdmaSmsAck& smsAck) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001763#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001764 RLOGD("acknowledgeLastIncomingCdmaSms: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001765#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001766 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_CDMA_SMS_ACKNOWLEDGE);
1767 if (pRI == NULL) {
1768 return Void();
1769 }
1770
Jack Yuf68e0da2017-02-07 14:53:09 -08001771 RIL_CDMA_SMS_Ack rcsa = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001772
1773 rcsa.uErrorClass = (RIL_CDMA_SMS_ErrorClass) smsAck.errorClass;
1774 rcsa.uSMSCauseCode = smsAck.smsCauseCode;
1775
Amit Mahajanb3a11bb2017-05-15 16:41:44 -07001776 CALL_ONREQUEST(pRI->pCI->requestNumber, &rcsa, sizeof(rcsa), pRI, mSlotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001777 return Void();
1778}
1779
1780Return<void> RadioImpl::getGsmBroadcastConfig(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001781#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001782 RLOGD("getGsmBroadcastConfig: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001783#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001784 dispatchVoid(serial, mSlotId, RIL_REQUEST_GSM_GET_BROADCAST_SMS_CONFIG);
1785 return Void();
1786}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001787
1788Return<void> RadioImpl::setGsmBroadcastConfig(int32_t serial,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001789 const hidl_vec<GsmBroadcastSmsConfigInfo>&
1790 configInfo) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001791#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001792 RLOGD("setGsmBroadcastConfig: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001793#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001794 RequestInfo *pRI = android::addRequestToList(serial, mSlotId,
1795 RIL_REQUEST_GSM_SET_BROADCAST_SMS_CONFIG);
1796 if (pRI == NULL) {
1797 return Void();
1798 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001799
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001800 int num = configInfo.size();
1801 RIL_GSM_BroadcastSmsConfigInfo gsmBci[num];
1802 RIL_GSM_BroadcastSmsConfigInfo *gsmBciPtrs[num];
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001803
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001804 for (int i = 0 ; i < num ; i++ ) {
1805 gsmBciPtrs[i] = &gsmBci[i];
1806 gsmBci[i].fromServiceId = configInfo[i].fromServiceId;
1807 gsmBci[i].toServiceId = configInfo[i].toServiceId;
1808 gsmBci[i].fromCodeScheme = configInfo[i].fromCodeScheme;
1809 gsmBci[i].toCodeScheme = configInfo[i].toCodeScheme;
1810 gsmBci[i].selected = BOOL_TO_INT(configInfo[i].selected);
1811 }
1812
Amit Mahajanb3a11bb2017-05-15 16:41:44 -07001813 CALL_ONREQUEST(pRI->pCI->requestNumber, gsmBciPtrs,
1814 num * sizeof(RIL_GSM_BroadcastSmsConfigInfo *), pRI, mSlotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001815 return Void();
1816}
1817
1818Return<void> RadioImpl::setGsmBroadcastActivation(int32_t serial, bool activate) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001819#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001820 RLOGD("setGsmBroadcastActivation: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001821#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001822 dispatchInts(serial, mSlotId, RIL_REQUEST_GSM_SMS_BROADCAST_ACTIVATION,
Sanket Padawe0de29d12017-02-10 13:19:47 -08001823 1, BOOL_TO_INT(!activate));
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001824 return Void();
1825}
1826
1827Return<void> RadioImpl::getCdmaBroadcastConfig(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001828#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001829 RLOGD("getCdmaBroadcastConfig: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001830#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001831 dispatchVoid(serial, mSlotId, RIL_REQUEST_CDMA_GET_BROADCAST_SMS_CONFIG);
1832 return Void();
1833}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001834
1835Return<void> RadioImpl::setCdmaBroadcastConfig(int32_t serial,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001836 const hidl_vec<CdmaBroadcastSmsConfigInfo>&
1837 configInfo) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001838#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001839 RLOGD("setCdmaBroadcastConfig: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001840#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001841 RequestInfo *pRI = android::addRequestToList(serial, mSlotId,
1842 RIL_REQUEST_CDMA_SET_BROADCAST_SMS_CONFIG);
1843 if (pRI == NULL) {
1844 return Void();
1845 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001846
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001847 int num = configInfo.size();
1848 RIL_CDMA_BroadcastSmsConfigInfo cdmaBci[num];
1849 RIL_CDMA_BroadcastSmsConfigInfo *cdmaBciPtrs[num];
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001850
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001851 for (int i = 0 ; i < num ; i++ ) {
1852 cdmaBciPtrs[i] = &cdmaBci[i];
1853 cdmaBci[i].service_category = configInfo[i].serviceCategory;
1854 cdmaBci[i].language = configInfo[i].language;
1855 cdmaBci[i].selected = BOOL_TO_INT(configInfo[i].selected);
1856 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001857
Amit Mahajanb3a11bb2017-05-15 16:41:44 -07001858 CALL_ONREQUEST(pRI->pCI->requestNumber, cdmaBciPtrs,
1859 num * sizeof(RIL_CDMA_BroadcastSmsConfigInfo *), pRI, mSlotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001860 return Void();
1861}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001862
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001863Return<void> RadioImpl::setCdmaBroadcastActivation(int32_t serial, bool activate) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001864#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001865 RLOGD("setCdmaBroadcastActivation: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001866#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001867 dispatchInts(serial, mSlotId, RIL_REQUEST_CDMA_SMS_BROADCAST_ACTIVATION,
Sanket Padawe0de29d12017-02-10 13:19:47 -08001868 1, BOOL_TO_INT(!activate));
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001869 return Void();
1870}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001871
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001872Return<void> RadioImpl::getCDMASubscription(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001873#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001874 RLOGD("getCDMASubscription: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001875#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001876 dispatchVoid(serial, mSlotId, RIL_REQUEST_CDMA_SUBSCRIPTION);
1877 return Void();
1878}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001879
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001880Return<void> RadioImpl::writeSmsToRuim(int32_t serial, const CdmaSmsWriteArgs& cdmaSms) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001881#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001882 RLOGD("writeSmsToRuim: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001883#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001884 RequestInfo *pRI = android::addRequestToList(serial, mSlotId,
1885 RIL_REQUEST_CDMA_WRITE_SMS_TO_RUIM);
1886 if (pRI == NULL) {
1887 return Void();
1888 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001889
Jack Yuf68e0da2017-02-07 14:53:09 -08001890 RIL_CDMA_SMS_WriteArgs rcsw = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001891 rcsw.status = (int) cdmaSms.status;
1892 constructCdmaSms(rcsw.message, cdmaSms.message);
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001893
Amit Mahajanb3a11bb2017-05-15 16:41:44 -07001894 CALL_ONREQUEST(pRI->pCI->requestNumber, &rcsw, sizeof(rcsw), pRI, mSlotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001895 return Void();
1896}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001897
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001898Return<void> RadioImpl::deleteSmsOnRuim(int32_t serial, int32_t index) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001899#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001900 RLOGD("deleteSmsOnRuim: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001901#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001902 dispatchInts(serial, mSlotId, RIL_REQUEST_CDMA_DELETE_SMS_ON_RUIM, 1, index);
1903 return Void();
1904}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001905
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001906Return<void> RadioImpl::getDeviceIdentity(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001907#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001908 RLOGD("getDeviceIdentity: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001909#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001910 dispatchVoid(serial, mSlotId, RIL_REQUEST_DEVICE_IDENTITY);
1911 return Void();
1912}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001913
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001914Return<void> RadioImpl::exitEmergencyCallbackMode(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001915#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001916 RLOGD("exitEmergencyCallbackMode: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001917#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001918 dispatchVoid(serial, mSlotId, RIL_REQUEST_EXIT_EMERGENCY_CALLBACK_MODE);
1919 return Void();
1920}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001921
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001922Return<void> RadioImpl::getSmscAddress(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001923#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001924 RLOGD("getSmscAddress: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001925#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001926 dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_SMSC_ADDRESS);
1927 return Void();
1928}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001929
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001930Return<void> RadioImpl::setSmscAddress(int32_t serial, const hidl_string& smsc) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001931#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001932 RLOGD("setSmscAddress: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001933#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001934 dispatchString(serial, mSlotId, RIL_REQUEST_SET_SMSC_ADDRESS,
Scott Randolphc7213312017-04-03 14:06:40 -07001935 smsc.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001936 return Void();
1937}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001938
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001939Return<void> RadioImpl::reportSmsMemoryStatus(int32_t serial, bool available) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001940#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001941 RLOGD("reportSmsMemoryStatus: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001942#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001943 dispatchInts(serial, mSlotId, RIL_REQUEST_REPORT_SMS_MEMORY_STATUS, 1,
1944 BOOL_TO_INT(available));
1945 return Void();
1946}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001947
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001948Return<void> RadioImpl::reportStkServiceIsRunning(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001949#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001950 RLOGD("reportStkServiceIsRunning: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001951#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001952 dispatchVoid(serial, mSlotId, RIL_REQUEST_REPORT_STK_SERVICE_IS_RUNNING);
1953 return Void();
1954}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001955
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001956Return<void> RadioImpl::getCdmaSubscriptionSource(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001957#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001958 RLOGD("getCdmaSubscriptionSource: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001959#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001960 dispatchVoid(serial, mSlotId, RIL_REQUEST_CDMA_GET_SUBSCRIPTION_SOURCE);
1961 return Void();
1962}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001963
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001964Return<void> RadioImpl::requestIsimAuthentication(int32_t serial, const hidl_string& challenge) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001965#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001966 RLOGD("requestIsimAuthentication: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001967#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001968 dispatchString(serial, mSlotId, RIL_REQUEST_ISIM_AUTHENTICATION,
Scott Randolphc7213312017-04-03 14:06:40 -07001969 challenge.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001970 return Void();
1971}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001972
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001973Return<void> RadioImpl::acknowledgeIncomingGsmSmsWithPdu(int32_t serial, bool success,
1974 const hidl_string& ackPdu) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001975#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001976 RLOGD("acknowledgeIncomingGsmSmsWithPdu: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001977#endif
Ruthwar Kumar Ambeer7c373812017-03-23 17:38:56 +05301978 dispatchStrings(serial, mSlotId, RIL_REQUEST_ACKNOWLEDGE_INCOMING_GSM_SMS_WITH_PDU, false,
Scott Randolphc7213312017-04-03 14:06:40 -07001979 2, success ? "1" : "0", ackPdu.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001980 return Void();
1981}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001982
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001983Return<void> RadioImpl::sendEnvelopeWithStatus(int32_t serial, const hidl_string& contents) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001984#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001985 RLOGD("sendEnvelopeWithStatus: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001986#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001987 dispatchString(serial, mSlotId, RIL_REQUEST_STK_SEND_ENVELOPE_WITH_STATUS,
Scott Randolphc7213312017-04-03 14:06:40 -07001988 contents.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001989 return Void();
1990}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001991
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001992Return<void> RadioImpl::getVoiceRadioTechnology(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001993#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001994 RLOGD("getVoiceRadioTechnology: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001995#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001996 dispatchVoid(serial, mSlotId, RIL_REQUEST_VOICE_RADIO_TECH);
1997 return Void();
1998}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001999
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002000Return<void> RadioImpl::getCellInfoList(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002001#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002002 RLOGD("getCellInfoList: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002003#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002004 dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_CELL_INFO_LIST);
2005 return Void();
2006}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002007
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002008Return<void> RadioImpl::setCellInfoListRate(int32_t serial, int32_t rate) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002009#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002010 RLOGD("setCellInfoListRate: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002011#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002012 dispatchInts(serial, mSlotId, RIL_REQUEST_SET_UNSOL_CELL_INFO_LIST_RATE, 1, rate);
2013 return Void();
2014}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002015
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002016Return<void> RadioImpl::setInitialAttachApn(int32_t serial, const DataProfileInfo& dataProfileInfo,
Jack Yuffc06452017-02-13 11:21:00 -08002017 bool modemCognitive, bool isRoaming) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002018#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002019 RLOGD("setInitialAttachApn: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002020#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002021 RequestInfo *pRI = android::addRequestToList(serial, mSlotId,
2022 RIL_REQUEST_SET_INITIAL_ATTACH_APN);
2023 if (pRI == NULL) {
2024 return Void();
2025 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002026
Jack Yuffc06452017-02-13 11:21:00 -08002027 if (s_vendorFunctions->version <= 14) {
2028 RIL_InitialAttachApn iaa = {};
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002029
Ruthwar Kumar Ambeer7c373812017-03-23 17:38:56 +05302030 if (!copyHidlStringToRil(&iaa.apn, dataProfileInfo.apn, pRI, true)) {
2031 return Void();
Jack Yuffc06452017-02-13 11:21:00 -08002032 }
2033
2034 const hidl_string &protocol =
2035 (isRoaming ? dataProfileInfo.roamingProtocol : dataProfileInfo.protocol);
2036
2037 if (!copyHidlStringToRil(&iaa.protocol, protocol, pRI)) {
Jack Yu8e732d42017-04-14 00:08:06 -07002038 memsetAndFreeStrings(1, iaa.apn);
Jack Yuffc06452017-02-13 11:21:00 -08002039 return Void();
2040 }
2041 iaa.authtype = (int) dataProfileInfo.authType;
2042 if (!copyHidlStringToRil(&iaa.username, dataProfileInfo.user, pRI)) {
Jack Yu8e732d42017-04-14 00:08:06 -07002043 memsetAndFreeStrings(2, iaa.apn, iaa.protocol);
Jack Yuffc06452017-02-13 11:21:00 -08002044 return Void();
2045 }
2046 if (!copyHidlStringToRil(&iaa.password, dataProfileInfo.password, pRI)) {
Jack Yu8e732d42017-04-14 00:08:06 -07002047 memsetAndFreeStrings(3, iaa.apn, iaa.protocol, iaa.username);
Jack Yuffc06452017-02-13 11:21:00 -08002048 return Void();
2049 }
2050
Amit Mahajanb3a11bb2017-05-15 16:41:44 -07002051 CALL_ONREQUEST(RIL_REQUEST_SET_INITIAL_ATTACH_APN, &iaa, sizeof(iaa), pRI, mSlotId);
Jack Yuffc06452017-02-13 11:21:00 -08002052
2053 memsetAndFreeStrings(4, iaa.apn, iaa.protocol, iaa.username, iaa.password);
2054 } else {
2055 RIL_InitialAttachApn_v15 iaa = {};
2056
Ruthwar Kumar Ambeer7c373812017-03-23 17:38:56 +05302057 if (!copyHidlStringToRil(&iaa.apn, dataProfileInfo.apn, pRI, true)) {
2058 return Void();
Jack Yuffc06452017-02-13 11:21:00 -08002059 }
Sanket Padawe46e9ee32017-06-20 12:40:19 -07002060
Jack Yuffc06452017-02-13 11:21:00 -08002061 if (!copyHidlStringToRil(&iaa.protocol, dataProfileInfo.protocol, pRI)) {
Jack Yu8e732d42017-04-14 00:08:06 -07002062 memsetAndFreeStrings(1, iaa.apn);
Jack Yuffc06452017-02-13 11:21:00 -08002063 return Void();
2064 }
2065 if (!copyHidlStringToRil(&iaa.roamingProtocol, dataProfileInfo.roamingProtocol, pRI)) {
Jack Yu8e732d42017-04-14 00:08:06 -07002066 memsetAndFreeStrings(2, iaa.apn, iaa.protocol);
Jack Yuffc06452017-02-13 11:21:00 -08002067 return Void();
2068 }
2069 iaa.authtype = (int) dataProfileInfo.authType;
2070 if (!copyHidlStringToRil(&iaa.username, dataProfileInfo.user, pRI)) {
Jack Yu8e732d42017-04-14 00:08:06 -07002071 memsetAndFreeStrings(3, iaa.apn, iaa.protocol, iaa.roamingProtocol);
Jack Yuffc06452017-02-13 11:21:00 -08002072 return Void();
2073 }
2074 if (!copyHidlStringToRil(&iaa.password, dataProfileInfo.password, pRI)) {
Jack Yu8e732d42017-04-14 00:08:06 -07002075 memsetAndFreeStrings(4, iaa.apn, iaa.protocol, iaa.roamingProtocol, iaa.username);
Jack Yuffc06452017-02-13 11:21:00 -08002076 return Void();
2077 }
2078 iaa.supportedTypesBitmask = dataProfileInfo.supportedApnTypesBitmap;
2079 iaa.bearerBitmask = dataProfileInfo.bearerBitmap;
2080 iaa.modemCognitive = BOOL_TO_INT(modemCognitive);
2081 iaa.mtu = dataProfileInfo.mtu;
2082
Jack Yuc13645e2017-04-13 20:55:03 -07002083 if (!convertMvnoTypeToString(dataProfileInfo.mvnoType, iaa.mvnoType)) {
Jack Yuffc06452017-02-13 11:21:00 -08002084 sendErrorResponse(pRI, RIL_E_INVALID_ARGUMENTS);
Jack Yu8e732d42017-04-14 00:08:06 -07002085 memsetAndFreeStrings(5, iaa.apn, iaa.protocol, iaa.roamingProtocol, iaa.username,
2086 iaa.password);
Jack Yuffc06452017-02-13 11:21:00 -08002087 return Void();
2088 }
2089
2090 if (!copyHidlStringToRil(&iaa.mvnoMatchData, dataProfileInfo.mvnoMatchData, pRI)) {
Jack Yu8e732d42017-04-14 00:08:06 -07002091 memsetAndFreeStrings(5, iaa.apn, iaa.protocol, iaa.roamingProtocol, iaa.username,
2092 iaa.password);
Jack Yuffc06452017-02-13 11:21:00 -08002093 return Void();
2094 }
2095
Amit Mahajanb3a11bb2017-05-15 16:41:44 -07002096 CALL_ONREQUEST(RIL_REQUEST_SET_INITIAL_ATTACH_APN, &iaa, sizeof(iaa), pRI, mSlotId);
Jack Yuffc06452017-02-13 11:21:00 -08002097
2098 memsetAndFreeStrings(6, iaa.apn, iaa.protocol, iaa.roamingProtocol, iaa.username,
2099 iaa.password, iaa.mvnoMatchData);
2100 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002101
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002102 return Void();
2103}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002104
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002105Return<void> RadioImpl::getImsRegistrationState(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002106#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002107 RLOGD("getImsRegistrationState: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002108#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002109 dispatchVoid(serial, mSlotId, RIL_REQUEST_IMS_REGISTRATION_STATE);
2110 return Void();
2111}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002112
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002113bool dispatchImsGsmSms(const ImsSmsMessage& message, RequestInfo *pRI) {
Jack Yuf68e0da2017-02-07 14:53:09 -08002114 RIL_IMS_SMS_Message rism = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002115 char **pStrings;
2116 int countStrings = 2;
2117 int dataLen = sizeof(char *) * countStrings;
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002118
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002119 rism.tech = RADIO_TECH_3GPP;
2120 rism.retry = BOOL_TO_INT(message.retry);
2121 rism.messageRef = message.messageRef;
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002122
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002123 if (message.gsmMessage.size() != 1) {
2124 RLOGE("dispatchImsGsmSms: Invalid len %s", requestToString(pRI->pCI->requestNumber));
Jack Yuffc06452017-02-13 11:21:00 -08002125 sendErrorResponse(pRI, RIL_E_INVALID_ARGUMENTS);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002126 return false;
2127 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002128
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002129 pStrings = (char **)calloc(countStrings, sizeof(char *));
2130 if (pStrings == NULL) {
2131 RLOGE("dispatchImsGsmSms: Memory allocation failed for request %s",
2132 requestToString(pRI->pCI->requestNumber));
Jack Yuffc06452017-02-13 11:21:00 -08002133 sendErrorResponse(pRI, RIL_E_NO_MEMORY);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002134 return false;
2135 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002136
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002137 if (!copyHidlStringToRil(&pStrings[0], message.gsmMessage[0].smscPdu, pRI)) {
2138#ifdef MEMSET_FREED
Jack Yub4295a42017-04-14 12:51:49 -07002139 memset(pStrings, 0, dataLen);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002140#endif
2141 free(pStrings);
2142 return false;
2143 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002144
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002145 if (!copyHidlStringToRil(&pStrings[1], message.gsmMessage[0].pdu, pRI)) {
2146 memsetAndFreeStrings(1, pStrings[0]);
2147#ifdef MEMSET_FREED
Jack Yub4295a42017-04-14 12:51:49 -07002148 memset(pStrings, 0, dataLen);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002149#endif
2150 free(pStrings);
2151 return false;
2152 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002153
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002154 rism.message.gsmMessage = pStrings;
Amit Mahajanb3a11bb2017-05-15 16:41:44 -07002155 CALL_ONREQUEST(pRI->pCI->requestNumber, &rism, sizeof(RIL_RadioTechnologyFamily) +
2156 sizeof(uint8_t) + sizeof(int32_t) + dataLen, pRI, pRI->socket_id);
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002157
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002158 for (int i = 0 ; i < countStrings ; i++) {
2159 memsetAndFreeStrings(1, pStrings[i]);
2160 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002161
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002162#ifdef MEMSET_FREED
Jack Yub4295a42017-04-14 12:51:49 -07002163 memset(pStrings, 0, dataLen);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002164#endif
2165 free(pStrings);
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002166
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002167 return true;
2168}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002169
Sanket Padawec4195802017-06-27 14:53:22 -07002170struct ImsCdmaSms {
2171 RIL_IMS_SMS_Message imsSms;
2172 RIL_CDMA_SMS_Message cdmaSms;
2173};
2174
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002175bool dispatchImsCdmaSms(const ImsSmsMessage& message, RequestInfo *pRI) {
Sanket Padawec4195802017-06-27 14:53:22 -07002176 ImsCdmaSms temp = {};
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002177
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002178 if (message.cdmaMessage.size() != 1) {
2179 RLOGE("dispatchImsCdmaSms: Invalid len %s", requestToString(pRI->pCI->requestNumber));
Jack Yuffc06452017-02-13 11:21:00 -08002180 sendErrorResponse(pRI, RIL_E_INVALID_ARGUMENTS);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002181 return false;
2182 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002183
Sanket Padawec4195802017-06-27 14:53:22 -07002184 temp.imsSms.tech = RADIO_TECH_3GPP2;
2185 temp.imsSms.retry = BOOL_TO_INT(message.retry);
2186 temp.imsSms.messageRef = message.messageRef;
2187 temp.imsSms.message.cdmaMessage = &temp.cdmaSms;
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002188
Sanket Padawec4195802017-06-27 14:53:22 -07002189 constructCdmaSms(temp.cdmaSms, message.cdmaMessage[0]);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002190
Sanket Padawec4195802017-06-27 14:53:22 -07002191 // Vendor code expects payload length to include actual msg payload
2192 // (sizeof(RIL_CDMA_SMS_Message)) instead of (RIL_CDMA_SMS_Message *) + size of other fields in
2193 // RIL_IMS_SMS_Message
2194 int payloadLen = sizeof(RIL_RadioTechnologyFamily) + sizeof(uint8_t) + sizeof(int32_t)
2195 + sizeof(RIL_CDMA_SMS_Message);
2196
2197 CALL_ONREQUEST(pRI->pCI->requestNumber, &temp.imsSms, payloadLen, pRI, pRI->socket_id);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002198
2199 return true;
2200}
2201
2202Return<void> RadioImpl::sendImsSms(int32_t serial, const ImsSmsMessage& message) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002203#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002204 RLOGD("sendImsSms: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002205#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002206 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_IMS_SEND_SMS);
2207 if (pRI == NULL) {
2208 return Void();
2209 }
2210
2211 RIL_RadioTechnologyFamily format = (RIL_RadioTechnologyFamily) message.tech;
2212
2213 if (RADIO_TECH_3GPP == format) {
2214 dispatchImsGsmSms(message, pRI);
2215 } else if (RADIO_TECH_3GPP2 == format) {
2216 dispatchImsCdmaSms(message, pRI);
2217 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08002218 RLOGE("sendImsSms: Invalid radio tech %s",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002219 requestToString(pRI->pCI->requestNumber));
Jack Yuffc06452017-02-13 11:21:00 -08002220 sendErrorResponse(pRI, RIL_E_INVALID_ARGUMENTS);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002221 }
2222 return Void();
2223}
2224
2225Return<void> RadioImpl::iccTransmitApduBasicChannel(int32_t serial, const SimApdu& message) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002226#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002227 RLOGD("iccTransmitApduBasicChannel: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002228#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002229 dispatchIccApdu(serial, mSlotId, RIL_REQUEST_SIM_TRANSMIT_APDU_BASIC, message);
2230 return Void();
2231}
2232
Wileen Chiu410b7562015-11-23 14:25:22 -08002233Return<void> RadioImpl::iccOpenLogicalChannel(int32_t serial, const hidl_string& aid, int32_t p2) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002234#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002235 RLOGD("iccOpenLogicalChannel: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002236#endif
Wileen Chiu410b7562015-11-23 14:25:22 -08002237 if (s_vendorFunctions->version < 15) {
2238 dispatchString(serial, mSlotId, RIL_REQUEST_SIM_OPEN_CHANNEL, aid.c_str());
2239 } else {
2240 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_SIM_OPEN_CHANNEL);
2241 if (pRI == NULL) {
2242 return Void();
2243 }
2244
Jack Yu8e732d42017-04-14 00:08:06 -07002245 RIL_OpenChannelParams params = {};
Wileen Chiu410b7562015-11-23 14:25:22 -08002246
2247 params.p2 = p2;
2248
2249 if (!copyHidlStringToRil(&params.aidPtr, aid, pRI)) {
2250 return Void();
2251 }
2252
Amit Mahajanb3a11bb2017-05-15 16:41:44 -07002253 CALL_ONREQUEST(pRI->pCI->requestNumber, &params, sizeof(params), pRI, mSlotId);
Wileen Chiu410b7562015-11-23 14:25:22 -08002254
2255 memsetAndFreeStrings(1, params.aidPtr);
2256 }
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002257 return Void();
2258}
2259
2260Return<void> RadioImpl::iccCloseLogicalChannel(int32_t serial, int32_t channelId) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002261#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002262 RLOGD("iccCloseLogicalChannel: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002263#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002264 dispatchInts(serial, mSlotId, RIL_REQUEST_SIM_CLOSE_CHANNEL, 1, channelId);
2265 return Void();
2266}
2267
2268Return<void> RadioImpl::iccTransmitApduLogicalChannel(int32_t serial, const SimApdu& message) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002269#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002270 RLOGD("iccTransmitApduLogicalChannel: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002271#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002272 dispatchIccApdu(serial, mSlotId, RIL_REQUEST_SIM_TRANSMIT_APDU_CHANNEL, message);
2273 return Void();
2274}
2275
2276Return<void> RadioImpl::nvReadItem(int32_t serial, NvItem itemId) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002277#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002278 RLOGD("nvReadItem: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002279#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002280 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_NV_READ_ITEM);
2281 if (pRI == NULL) {
2282 return Void();
2283 }
2284
Jack Yu8e732d42017-04-14 00:08:06 -07002285 RIL_NV_ReadItem nvri = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002286 nvri.itemID = (RIL_NV_Item) itemId;
2287
Amit Mahajanb3a11bb2017-05-15 16:41:44 -07002288 CALL_ONREQUEST(pRI->pCI->requestNumber, &nvri, sizeof(nvri), pRI, mSlotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002289 return Void();
2290}
2291
2292Return<void> RadioImpl::nvWriteItem(int32_t serial, const NvWriteItem& item) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002293#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002294 RLOGD("nvWriteItem: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002295#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002296 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_NV_WRITE_ITEM);
2297 if (pRI == NULL) {
2298 return Void();
2299 }
2300
Jack Yu8e732d42017-04-14 00:08:06 -07002301 RIL_NV_WriteItem nvwi = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002302
2303 nvwi.itemID = (RIL_NV_Item) item.itemId;
2304
2305 if (!copyHidlStringToRil(&nvwi.value, item.value, pRI)) {
2306 return Void();
2307 }
2308
Amit Mahajanb3a11bb2017-05-15 16:41:44 -07002309 CALL_ONREQUEST(pRI->pCI->requestNumber, &nvwi, sizeof(nvwi), pRI, mSlotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002310
2311 memsetAndFreeStrings(1, nvwi.value);
2312 return Void();
2313}
2314
2315Return<void> RadioImpl::nvWriteCdmaPrl(int32_t serial, const hidl_vec<uint8_t>& prl) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002316#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002317 RLOGD("nvWriteCdmaPrl: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002318#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002319 dispatchRaw(serial, mSlotId, RIL_REQUEST_NV_WRITE_CDMA_PRL, prl);
2320 return Void();
2321}
2322
2323Return<void> RadioImpl::nvResetConfig(int32_t serial, ResetNvType resetType) {
Jayachandran C32763f02017-04-30 10:21:14 -07002324 int rilResetType = -1;
Jayachandran C572f2f42017-03-25 14:30:13 -07002325#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002326 RLOGD("nvResetConfig: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002327#endif
Jayachandran C32763f02017-04-30 10:21:14 -07002328 /* Convert ResetNvType to RIL.h values
2329 * RIL_REQUEST_NV_RESET_CONFIG
2330 * 1 - reload all NV items
2331 * 2 - erase NV reset (SCRTN)
2332 * 3 - factory reset (RTN)
2333 */
2334 switch(resetType) {
2335 case ResetNvType::RELOAD:
2336 rilResetType = 1;
2337 break;
2338 case ResetNvType::ERASE:
2339 rilResetType = 2;
2340 break;
2341 case ResetNvType::FACTORY_RESET:
2342 rilResetType = 3;
2343 break;
2344 }
2345 dispatchInts(serial, mSlotId, RIL_REQUEST_NV_RESET_CONFIG, 1, rilResetType);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002346 return Void();
2347}
2348
2349Return<void> RadioImpl::setUiccSubscription(int32_t serial, const SelectUiccSub& uiccSub) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002350#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002351 RLOGD("setUiccSubscription: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002352#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002353 RequestInfo *pRI = android::addRequestToList(serial, mSlotId,
2354 RIL_REQUEST_SET_UICC_SUBSCRIPTION);
2355 if (pRI == NULL) {
2356 return Void();
2357 }
2358
Jack Yuf68e0da2017-02-07 14:53:09 -08002359 RIL_SelectUiccSub rilUiccSub = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002360
2361 rilUiccSub.slot = uiccSub.slot;
2362 rilUiccSub.app_index = uiccSub.appIndex;
2363 rilUiccSub.sub_type = (RIL_SubscriptionType) uiccSub.subType;
2364 rilUiccSub.act_status = (RIL_UiccSubActStatus) uiccSub.actStatus;
2365
Amit Mahajanb3a11bb2017-05-15 16:41:44 -07002366 CALL_ONREQUEST(pRI->pCI->requestNumber, &rilUiccSub, sizeof(rilUiccSub), pRI, mSlotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002367 return Void();
2368}
2369
2370Return<void> RadioImpl::setDataAllowed(int32_t serial, bool allow) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002371#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002372 RLOGD("setDataAllowed: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002373#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002374 dispatchInts(serial, mSlotId, RIL_REQUEST_ALLOW_DATA, 1, BOOL_TO_INT(allow));
2375 return Void();
2376}
2377
2378Return<void> RadioImpl::getHardwareConfig(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002379#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002380 RLOGD("getHardwareConfig: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002381#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002382 dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_HARDWARE_CONFIG);
2383 return Void();
2384}
2385
2386Return<void> RadioImpl::requestIccSimAuthentication(int32_t serial, int32_t authContext,
2387 const hidl_string& authData, const hidl_string& aid) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002388#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002389 RLOGD("requestIccSimAuthentication: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002390#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002391 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_SIM_AUTHENTICATION);
2392 if (pRI == NULL) {
2393 return Void();
2394 }
2395
Jack Yu8e732d42017-04-14 00:08:06 -07002396 RIL_SimAuthentication pf = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002397
2398 pf.authContext = authContext;
2399
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002400 if (!copyHidlStringToRil(&pf.authData, authData, pRI)) {
2401 return Void();
2402 }
2403
2404 if (!copyHidlStringToRil(&pf.aid, aid, pRI)) {
2405 memsetAndFreeStrings(1, pf.authData);
2406 return Void();
2407 }
2408
Amit Mahajanb3a11bb2017-05-15 16:41:44 -07002409 CALL_ONREQUEST(pRI->pCI->requestNumber, &pf, sizeof(pf), pRI, mSlotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002410
2411 memsetAndFreeStrings(2, pf.authData, pf.aid);
2412 return Void();
2413}
2414
2415/**
Jack Yuffc06452017-02-13 11:21:00 -08002416 * @param numProfiles number of data profile
2417 * @param dataProfiles the pointer to the actual data profiles. The acceptable type is
2418 RIL_DataProfileInfo or RIL_DataProfileInfo_v15.
2419 * @param dataProfilePtrs the pointer to the pointers that point to each data profile structure
2420 * @param numfields number of string-type member in the data profile structure
2421 * @param ... the variadic parameters are pointers to each string-type member
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002422 **/
Jack Yuffc06452017-02-13 11:21:00 -08002423template <typename T>
2424void freeSetDataProfileData(int numProfiles, T *dataProfiles, T **dataProfilePtrs,
2425 int numfields, ...) {
2426 va_list args;
2427 va_start(args, numfields);
2428
2429 // Iterate through each string-type field that need to be free.
2430 for (int i = 0; i < numfields; i++) {
2431 // Iterate through each data profile and free that specific string-type field.
2432 // The type 'char *T::*' is a type of pointer to a 'char *' member inside T structure.
2433 char *T::*ptr = va_arg(args, char *T::*);
2434 for (int j = 0; j < numProfiles; j++) {
2435 memsetAndFreeStrings(1, dataProfiles[j].*ptr);
2436 }
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002437 }
2438
Jack Yuffc06452017-02-13 11:21:00 -08002439 va_end(args);
2440
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002441#ifdef MEMSET_FREED
Jack Yuffc06452017-02-13 11:21:00 -08002442 memset(dataProfiles, 0, numProfiles * sizeof(T));
2443 memset(dataProfilePtrs, 0, numProfiles * sizeof(T *));
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002444#endif
2445 free(dataProfiles);
2446 free(dataProfilePtrs);
2447}
2448
Jack Yuffc06452017-02-13 11:21:00 -08002449Return<void> RadioImpl::setDataProfile(int32_t serial, const hidl_vec<DataProfileInfo>& profiles,
2450 bool isRoaming) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002451#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002452 RLOGD("setDataProfile: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002453#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002454 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_SET_DATA_PROFILE);
2455 if (pRI == NULL) {
2456 return Void();
2457 }
2458
Jack Yuffc06452017-02-13 11:21:00 -08002459 size_t num = profiles.size();
2460 bool success = false;
2461
2462 if (s_vendorFunctions->version <= 14) {
2463
2464 RIL_DataProfileInfo *dataProfiles =
2465 (RIL_DataProfileInfo *) calloc(num, sizeof(RIL_DataProfileInfo));
2466
2467 if (dataProfiles == NULL) {
2468 RLOGE("Memory allocation failed for request %s",
2469 requestToString(pRI->pCI->requestNumber));
2470 sendErrorResponse(pRI, RIL_E_NO_MEMORY);
2471 return Void();
2472 }
2473
2474 RIL_DataProfileInfo **dataProfilePtrs =
2475 (RIL_DataProfileInfo **) calloc(num, sizeof(RIL_DataProfileInfo *));
2476 if (dataProfilePtrs == NULL) {
2477 RLOGE("Memory allocation failed for request %s",
2478 requestToString(pRI->pCI->requestNumber));
2479 free(dataProfiles);
2480 sendErrorResponse(pRI, RIL_E_NO_MEMORY);
2481 return Void();
2482 }
2483
2484 for (size_t i = 0; i < num; i++) {
2485 dataProfilePtrs[i] = &dataProfiles[i];
2486
Ruthwar Kumar Ambeer7c373812017-03-23 17:38:56 +05302487 success = copyHidlStringToRil(&dataProfiles[i].apn, profiles[i].apn, pRI, true);
Jack Yuffc06452017-02-13 11:21:00 -08002488
2489 const hidl_string &protocol =
2490 (isRoaming ? profiles[i].roamingProtocol : profiles[i].protocol);
2491
Ruthwar Kumar Ambeer7c373812017-03-23 17:38:56 +05302492 if (success && !copyHidlStringToRil(&dataProfiles[i].protocol, protocol, pRI, true)) {
Jack Yuffc06452017-02-13 11:21:00 -08002493 success = false;
2494 }
2495
Ruthwar Kumar Ambeer7c373812017-03-23 17:38:56 +05302496 if (success && !copyHidlStringToRil(&dataProfiles[i].user, profiles[i].user, pRI,
2497 true)) {
Jack Yuffc06452017-02-13 11:21:00 -08002498 success = false;
2499 }
2500 if (success && !copyHidlStringToRil(&dataProfiles[i].password, profiles[i].password,
Ruthwar Kumar Ambeer7c373812017-03-23 17:38:56 +05302501 pRI, true)) {
Jack Yuffc06452017-02-13 11:21:00 -08002502 success = false;
2503 }
2504
2505 if (!success) {
2506 freeSetDataProfileData(num, dataProfiles, dataProfilePtrs, 4,
2507 &RIL_DataProfileInfo::apn, &RIL_DataProfileInfo::protocol,
2508 &RIL_DataProfileInfo::user, &RIL_DataProfileInfo::password);
2509 return Void();
2510 }
2511
2512 dataProfiles[i].profileId = (RIL_DataProfile) profiles[i].profileId;
2513 dataProfiles[i].authType = (int) profiles[i].authType;
2514 dataProfiles[i].type = (int) profiles[i].type;
2515 dataProfiles[i].maxConnsTime = profiles[i].maxConnsTime;
2516 dataProfiles[i].maxConns = profiles[i].maxConns;
2517 dataProfiles[i].waitTime = profiles[i].waitTime;
2518 dataProfiles[i].enabled = BOOL_TO_INT(profiles[i].enabled);
2519 }
2520
Amit Mahajanb3a11bb2017-05-15 16:41:44 -07002521 CALL_ONREQUEST(RIL_REQUEST_SET_DATA_PROFILE, dataProfilePtrs,
2522 num * sizeof(RIL_DataProfileInfo *), pRI, mSlotId);
Jack Yuffc06452017-02-13 11:21:00 -08002523
2524 freeSetDataProfileData(num, dataProfiles, dataProfilePtrs, 4,
2525 &RIL_DataProfileInfo::apn, &RIL_DataProfileInfo::protocol,
2526 &RIL_DataProfileInfo::user, &RIL_DataProfileInfo::password);
2527 } else {
2528 RIL_DataProfileInfo_v15 *dataProfiles =
2529 (RIL_DataProfileInfo_v15 *) calloc(num, sizeof(RIL_DataProfileInfo_v15));
2530
2531 if (dataProfiles == NULL) {
2532 RLOGE("Memory allocation failed for request %s",
2533 requestToString(pRI->pCI->requestNumber));
2534 sendErrorResponse(pRI, RIL_E_NO_MEMORY);
2535 return Void();
2536 }
2537
2538 RIL_DataProfileInfo_v15 **dataProfilePtrs =
2539 (RIL_DataProfileInfo_v15 **) calloc(num, sizeof(RIL_DataProfileInfo_v15 *));
2540 if (dataProfilePtrs == NULL) {
2541 RLOGE("Memory allocation failed for request %s",
2542 requestToString(pRI->pCI->requestNumber));
2543 free(dataProfiles);
2544 sendErrorResponse(pRI, RIL_E_NO_MEMORY);
2545 return Void();
2546 }
2547
2548 for (size_t i = 0; i < num; i++) {
2549 dataProfilePtrs[i] = &dataProfiles[i];
2550
Ruthwar Kumar Ambeer7c373812017-03-23 17:38:56 +05302551 success = copyHidlStringToRil(&dataProfiles[i].apn, profiles[i].apn, pRI, true);
Jack Yuffc06452017-02-13 11:21:00 -08002552 if (success && !copyHidlStringToRil(&dataProfiles[i].protocol, profiles[i].protocol,
2553 pRI)) {
2554 success = false;
2555 }
2556 if (success && !copyHidlStringToRil(&dataProfiles[i].roamingProtocol,
Ruthwar Kumar Ambeer7c373812017-03-23 17:38:56 +05302557 profiles[i].roamingProtocol, pRI, true)) {
Jack Yuffc06452017-02-13 11:21:00 -08002558 success = false;
2559 }
Ruthwar Kumar Ambeer7c373812017-03-23 17:38:56 +05302560 if (success && !copyHidlStringToRil(&dataProfiles[i].user, profiles[i].user, pRI,
2561 true)) {
Jack Yuffc06452017-02-13 11:21:00 -08002562 success = false;
2563 }
2564 if (success && !copyHidlStringToRil(&dataProfiles[i].password, profiles[i].password,
Ruthwar Kumar Ambeer7c373812017-03-23 17:38:56 +05302565 pRI, true)) {
Jack Yuffc06452017-02-13 11:21:00 -08002566 success = false;
2567 }
Jack Yuffc06452017-02-13 11:21:00 -08002568 if (success && !copyHidlStringToRil(&dataProfiles[i].mvnoMatchData,
Ruthwar Kumar Ambeer7c373812017-03-23 17:38:56 +05302569 profiles[i].mvnoMatchData, pRI, true)) {
Jack Yuffc06452017-02-13 11:21:00 -08002570 success = false;
2571 }
2572
Jack Yuc13645e2017-04-13 20:55:03 -07002573 if (success && !convertMvnoTypeToString(profiles[i].mvnoType,
2574 dataProfiles[i].mvnoType)) {
2575 sendErrorResponse(pRI, RIL_E_INVALID_ARGUMENTS);
2576 success = false;
Jack Yuffc06452017-02-13 11:21:00 -08002577 }
2578
2579 if (!success) {
2580 freeSetDataProfileData(num, dataProfiles, dataProfilePtrs, 6,
2581 &RIL_DataProfileInfo_v15::apn, &RIL_DataProfileInfo_v15::protocol,
2582 &RIL_DataProfileInfo_v15::roamingProtocol, &RIL_DataProfileInfo_v15::user,
2583 &RIL_DataProfileInfo_v15::password, &RIL_DataProfileInfo_v15::mvnoMatchData);
2584 return Void();
2585 }
2586
2587 dataProfiles[i].profileId = (RIL_DataProfile) profiles[i].profileId;
2588 dataProfiles[i].authType = (int) profiles[i].authType;
2589 dataProfiles[i].type = (int) profiles[i].type;
2590 dataProfiles[i].maxConnsTime = profiles[i].maxConnsTime;
2591 dataProfiles[i].maxConns = profiles[i].maxConns;
2592 dataProfiles[i].waitTime = profiles[i].waitTime;
2593 dataProfiles[i].enabled = BOOL_TO_INT(profiles[i].enabled);
2594 dataProfiles[i].supportedTypesBitmask = profiles[i].supportedApnTypesBitmap;
2595 dataProfiles[i].bearerBitmask = profiles[i].bearerBitmap;
2596 dataProfiles[i].mtu = profiles[i].mtu;
2597 }
2598
Amit Mahajanb3a11bb2017-05-15 16:41:44 -07002599 CALL_ONREQUEST(RIL_REQUEST_SET_DATA_PROFILE, dataProfilePtrs,
2600 num * sizeof(RIL_DataProfileInfo_v15 *), pRI, mSlotId);
Jack Yuffc06452017-02-13 11:21:00 -08002601
2602 freeSetDataProfileData(num, dataProfiles, dataProfilePtrs, 6,
2603 &RIL_DataProfileInfo_v15::apn, &RIL_DataProfileInfo_v15::protocol,
2604 &RIL_DataProfileInfo_v15::roamingProtocol, &RIL_DataProfileInfo_v15::user,
2605 &RIL_DataProfileInfo_v15::password, &RIL_DataProfileInfo_v15::mvnoMatchData);
2606 }
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002607
2608 return Void();
2609}
2610
2611Return<void> RadioImpl::requestShutdown(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002612#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002613 RLOGD("requestShutdown: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002614#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002615 dispatchVoid(serial, mSlotId, RIL_REQUEST_SHUTDOWN);
2616 return Void();
2617}
2618
2619Return<void> RadioImpl::getRadioCapability(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002620#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002621 RLOGD("getRadioCapability: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002622#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002623 dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_RADIO_CAPABILITY);
2624 return Void();
2625}
2626
2627Return<void> RadioImpl::setRadioCapability(int32_t serial, const RadioCapability& rc) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002628#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002629 RLOGD("setRadioCapability: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002630#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002631 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_SET_RADIO_CAPABILITY);
2632 if (pRI == NULL) {
2633 return Void();
2634 }
2635
Jack Yu8e732d42017-04-14 00:08:06 -07002636 RIL_RadioCapability rilRc = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002637
2638 // TODO : set rilRc.version using HIDL version ?
2639 rilRc.session = rc.session;
2640 rilRc.phase = (int) rc.phase;
2641 rilRc.rat = (int) rc.raf;
2642 rilRc.status = (int) rc.status;
Ashit Sood169fc262018-09-06 14:10:34 -07002643 strlcpy(rilRc.logicalModemUuid, rc.logicalModemUuid.c_str(), sizeof(rilRc.logicalModemUuid));
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002644
Amit Mahajanb3a11bb2017-05-15 16:41:44 -07002645 CALL_ONREQUEST(pRI->pCI->requestNumber, &rilRc, sizeof(rilRc), pRI, mSlotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002646
2647 return Void();
2648}
2649
2650Return<void> RadioImpl::startLceService(int32_t serial, int32_t reportInterval, bool pullMode) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002651#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002652 RLOGD("startLceService: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002653#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002654 dispatchInts(serial, mSlotId, RIL_REQUEST_START_LCE, 2, reportInterval,
2655 BOOL_TO_INT(pullMode));
2656 return Void();
2657}
2658
2659Return<void> RadioImpl::stopLceService(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002660#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002661 RLOGD("stopLceService: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002662#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002663 dispatchVoid(serial, mSlotId, RIL_REQUEST_STOP_LCE);
2664 return Void();
2665}
2666
2667Return<void> RadioImpl::pullLceData(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002668#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002669 RLOGD("pullLceData: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002670#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002671 dispatchVoid(serial, mSlotId, RIL_REQUEST_PULL_LCEDATA);
2672 return Void();
2673}
2674
2675Return<void> RadioImpl::getModemActivityInfo(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002676#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002677 RLOGD("getModemActivityInfo: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002678#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002679 dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_ACTIVITY_INFO);
2680 return Void();
2681}
2682
2683Return<void> RadioImpl::setAllowedCarriers(int32_t serial, bool allAllowed,
2684 const CarrierRestrictions& carriers) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002685#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002686 RLOGD("setAllowedCarriers: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002687#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002688 RequestInfo *pRI = android::addRequestToList(serial, mSlotId,
2689 RIL_REQUEST_SET_CARRIER_RESTRICTIONS);
2690 if (pRI == NULL) {
2691 return Void();
2692 }
2693
Jack Yuf68e0da2017-02-07 14:53:09 -08002694 RIL_CarrierRestrictions cr = {};
Jack Yu11ab4042017-02-21 17:08:01 -08002695 RIL_Carrier *allowedCarriers = NULL;
2696 RIL_Carrier *excludedCarriers = NULL;
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002697
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002698 cr.len_allowed_carriers = carriers.allowedCarriers.size();
2699 allowedCarriers = (RIL_Carrier *)calloc(cr.len_allowed_carriers, sizeof(RIL_Carrier));
2700 if (allowedCarriers == NULL) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08002701 RLOGE("setAllowedCarriers: Memory allocation failed for request %s",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002702 requestToString(pRI->pCI->requestNumber));
Jack Yuffc06452017-02-13 11:21:00 -08002703 sendErrorResponse(pRI, RIL_E_NO_MEMORY);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002704 return Void();
2705 }
2706 cr.allowed_carriers = allowedCarriers;
2707
2708 cr.len_excluded_carriers = carriers.excludedCarriers.size();
2709 excludedCarriers = (RIL_Carrier *)calloc(cr.len_excluded_carriers, sizeof(RIL_Carrier));
2710 if (excludedCarriers == NULL) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08002711 RLOGE("setAllowedCarriers: Memory allocation failed for request %s",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002712 requestToString(pRI->pCI->requestNumber));
Jack Yuffc06452017-02-13 11:21:00 -08002713 sendErrorResponse(pRI, RIL_E_NO_MEMORY);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002714#ifdef MEMSET_FREED
2715 memset(allowedCarriers, 0, cr.len_allowed_carriers * sizeof(RIL_Carrier));
2716#endif
2717 free(allowedCarriers);
2718 return Void();
2719 }
2720 cr.excluded_carriers = excludedCarriers;
2721
2722 for (int i = 0; i < cr.len_allowed_carriers; i++) {
Scott Randolphc7213312017-04-03 14:06:40 -07002723 allowedCarriers[i].mcc = carriers.allowedCarriers[i].mcc.c_str();
2724 allowedCarriers[i].mnc = carriers.allowedCarriers[i].mnc.c_str();
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002725 allowedCarriers[i].match_type = (RIL_CarrierMatchType) carriers.allowedCarriers[i].matchType;
Scott Randolphc7213312017-04-03 14:06:40 -07002726 allowedCarriers[i].match_data = carriers.allowedCarriers[i].matchData.c_str();
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002727 }
2728
Amit Mahajan3f510f62017-03-01 10:26:58 -08002729 for (int i = 0; i < cr.len_excluded_carriers; i++) {
Scott Randolphc7213312017-04-03 14:06:40 -07002730 excludedCarriers[i].mcc = carriers.excludedCarriers[i].mcc.c_str();
2731 excludedCarriers[i].mnc = carriers.excludedCarriers[i].mnc.c_str();
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002732 excludedCarriers[i].match_type =
2733 (RIL_CarrierMatchType) carriers.excludedCarriers[i].matchType;
Scott Randolphc7213312017-04-03 14:06:40 -07002734 excludedCarriers[i].match_data = carriers.excludedCarriers[i].matchData.c_str();
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002735 }
2736
Amit Mahajanb3a11bb2017-05-15 16:41:44 -07002737 CALL_ONREQUEST(pRI->pCI->requestNumber, &cr, sizeof(RIL_CarrierRestrictions), pRI, mSlotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002738
2739#ifdef MEMSET_FREED
2740 memset(allowedCarriers, 0, cr.len_allowed_carriers * sizeof(RIL_Carrier));
2741 memset(excludedCarriers, 0, cr.len_excluded_carriers * sizeof(RIL_Carrier));
2742#endif
2743 free(allowedCarriers);
2744 free(excludedCarriers);
2745 return Void();
2746}
2747
2748Return<void> RadioImpl::getAllowedCarriers(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002749#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002750 RLOGD("getAllowedCarriers: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002751#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002752 dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_CARRIER_RESTRICTIONS);
2753 return Void();
2754}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002755
Jack Yu11ab4042017-02-21 17:08:01 -08002756Return<void> RadioImpl::sendDeviceState(int32_t serial, DeviceStateType deviceStateType,
2757 bool state) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002758#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002759 RLOGD("sendDeviceState: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002760#endif
Jack Yu11ab4042017-02-21 17:08:01 -08002761 if (s_vendorFunctions->version < 15) {
2762 if (deviceStateType == DeviceStateType::LOW_DATA_EXPECTED) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08002763 RLOGD("sendDeviceState: calling screen state %d", BOOL_TO_INT(!state));
Jack Yu11ab4042017-02-21 17:08:01 -08002764 dispatchInts(serial, mSlotId, RIL_REQUEST_SCREEN_STATE, 1, BOOL_TO_INT(!state));
2765 } else {
2766 RequestInfo *pRI = android::addRequestToList(serial, mSlotId,
2767 RIL_REQUEST_SEND_DEVICE_STATE);
2768 sendErrorResponse(pRI, RIL_E_REQUEST_NOT_SUPPORTED);
2769 }
2770 return Void();
2771 }
2772 dispatchInts(serial, mSlotId, RIL_REQUEST_SEND_DEVICE_STATE, 2, (int) deviceStateType,
2773 BOOL_TO_INT(state));
2774 return Void();
2775}
2776
2777Return<void> RadioImpl::setIndicationFilter(int32_t serial, int32_t indicationFilter) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002778#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002779 RLOGD("setIndicationFilter: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002780#endif
Jack Yu11ab4042017-02-21 17:08:01 -08002781 if (s_vendorFunctions->version < 15) {
2782 RequestInfo *pRI = android::addRequestToList(serial, mSlotId,
2783 RIL_REQUEST_SET_UNSOLICITED_RESPONSE_FILTER);
2784 sendErrorResponse(pRI, RIL_E_REQUEST_NOT_SUPPORTED);
2785 return Void();
2786 }
2787 dispatchInts(serial, mSlotId, RIL_REQUEST_SET_UNSOLICITED_RESPONSE_FILTER, 1, indicationFilter);
2788 return Void();
2789}
2790
Wileen Chiu718c0bf2017-01-04 11:37:19 -08002791Return<void> RadioImpl::setSimCardPower(int32_t serial, bool powerUp) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002792#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002793 RLOGD("setSimCardPower: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002794#endif
Wileen Chiu718c0bf2017-01-04 11:37:19 -08002795 dispatchInts(serial, mSlotId, RIL_REQUEST_SET_SIM_CARD_POWER, 1, BOOL_TO_INT(powerUp));
2796 return Void();
2797}
2798
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07002799Return<void> RadioImpl::setSimCardPower_1_1(int32_t serial, const V1_1::CardPowerState state) {
Grace Chen08eb6542017-03-23 18:39:48 -07002800#if VDBG
2801 RLOGD("setSimCardPower_1_1: serial %d state %d", serial, state);
2802#endif
2803 dispatchInts(serial, mSlotId, RIL_REQUEST_SET_SIM_CARD_POWER, 1, state);
2804 return Void();
2805}
2806
Nathan Harold6a8809d2017-07-07 19:28:58 -07002807Return<void> RadioImpl::setCarrierInfoForImsiEncryption(int32_t serial,
2808 const V1_1::ImsiEncryptionInfo& data) {
2809#if VDBG
2810 RLOGD("setCarrierInfoForImsiEncryption: serial %d", serial);
2811#endif
2812 RequestInfo *pRI = android::addRequestToList(
2813 serial, mSlotId, RIL_REQUEST_SET_CARRIER_INFO_IMSI_ENCRYPTION);
2814 if (pRI == NULL) {
2815 return Void();
2816 }
2817
2818 RIL_CarrierInfoForImsiEncryption imsiEncryption = {};
2819
2820 if (!copyHidlStringToRil(&imsiEncryption.mnc, data.mnc, pRI)) {
2821 return Void();
2822 }
2823 if (!copyHidlStringToRil(&imsiEncryption.mcc, data.mcc, pRI)) {
2824 memsetAndFreeStrings(1, imsiEncryption.mnc);
2825 return Void();
2826 }
2827 if (!copyHidlStringToRil(&imsiEncryption.keyIdentifier, data.keyIdentifier, pRI)) {
2828 memsetAndFreeStrings(2, imsiEncryption.mnc, imsiEncryption.mcc);
2829 return Void();
2830 }
Youngrak Leee6f16f22017-12-03 10:50:37 -08002831 imsiEncryption.carrierKeyLength = data.carrierKey.size();
2832 imsiEncryption.carrierKey = new uint8_t[imsiEncryption.carrierKeyLength];
2833 memcpy(imsiEncryption.carrierKey, data.carrierKey.data(), imsiEncryption.carrierKeyLength);
Nathan Harold6a8809d2017-07-07 19:28:58 -07002834 imsiEncryption.expirationTime = data.expirationTime;
2835 CALL_ONREQUEST(pRI->pCI->requestNumber, &imsiEncryption,
2836 sizeof(RIL_CarrierInfoForImsiEncryption), pRI, mSlotId);
2837 delete(imsiEncryption.carrierKey);
2838 return Void();
2839}
2840
2841Return<void> RadioImpl::startKeepalive(int32_t serial, const V1_1::KeepaliveRequest& keepalive) {
2842#if VDBG
2843 RLOGD("%s(): %d", __FUNCTION__, serial);
2844#endif
2845 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_START_KEEPALIVE);
2846 if (pRI == NULL) {
2847 return Void();
2848 }
2849
2850 RIL_KeepaliveRequest kaReq = {};
2851
2852 kaReq.type = static_cast<RIL_KeepaliveType>(keepalive.type);
2853 switch(kaReq.type) {
2854 case NATT_IPV4:
2855 if (keepalive.sourceAddress.size() != 4 ||
2856 keepalive.destinationAddress.size() != 4) {
2857 RLOGE("Invalid address for keepalive!");
2858 sendErrorResponse(pRI, RIL_E_INVALID_ARGUMENTS);
2859 return Void();
2860 }
2861 break;
2862 case NATT_IPV6:
2863 if (keepalive.sourceAddress.size() != 16 ||
2864 keepalive.destinationAddress.size() != 16) {
2865 RLOGE("Invalid address for keepalive!");
2866 sendErrorResponse(pRI, RIL_E_INVALID_ARGUMENTS);
2867 return Void();
2868 }
2869 break;
2870 default:
2871 RLOGE("Unknown packet keepalive type!");
2872 sendErrorResponse(pRI, RIL_E_INVALID_ARGUMENTS);
2873 return Void();
2874 }
2875
2876 ::memcpy(kaReq.sourceAddress, keepalive.sourceAddress.data(), keepalive.sourceAddress.size());
2877 kaReq.sourcePort = keepalive.sourcePort;
2878
2879 ::memcpy(kaReq.destinationAddress,
2880 keepalive.destinationAddress.data(), keepalive.destinationAddress.size());
2881 kaReq.destinationPort = keepalive.destinationPort;
2882
2883 kaReq.maxKeepaliveIntervalMillis = keepalive.maxKeepaliveIntervalMillis;
2884 kaReq.cid = keepalive.cid; // This is the context ID of the data call
2885
2886 CALL_ONREQUEST(pRI->pCI->requestNumber, &kaReq, sizeof(RIL_KeepaliveRequest), pRI, mSlotId);
2887 return Void();
2888}
2889
2890Return<void> RadioImpl::stopKeepalive(int32_t serial, int32_t sessionHandle) {
2891#if VDBG
2892 RLOGD("%s(): %d", __FUNCTION__, serial);
2893#endif
2894 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_STOP_KEEPALIVE);
2895 if (pRI == NULL) {
2896 return Void();
2897 }
2898
2899 CALL_ONREQUEST(pRI->pCI->requestNumber, &sessionHandle, sizeof(uint32_t), pRI, mSlotId);
2900 return Void();
2901}
2902
Sanket Padawef220dc52017-01-02 23:46:00 -08002903Return<void> RadioImpl::responseAcknowledgement() {
2904 android::releaseWakeLock();
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002905 return Void();
Sanket Padawef220dc52017-01-02 23:46:00 -08002906}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002907
Amit Mahajan439da362017-02-13 17:43:04 -08002908Return<void> OemHookImpl::setResponseFunctions(
2909 const ::android::sp<IOemHookResponse>& oemHookResponseParam,
2910 const ::android::sp<IOemHookIndication>& oemHookIndicationParam) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002911#if VDBG
Amit Mahajan439da362017-02-13 17:43:04 -08002912 RLOGD("OemHookImpl::setResponseFunctions");
Jayachandran C572f2f42017-03-25 14:30:13 -07002913#endif
Amit Mahajan439da362017-02-13 17:43:04 -08002914
2915 pthread_rwlock_t *radioServiceRwlockPtr = radio::getRadioServiceRwlock(mSlotId);
2916 int ret = pthread_rwlock_wrlock(radioServiceRwlockPtr);
2917 assert(ret == 0);
2918
2919 mOemHookResponse = oemHookResponseParam;
2920 mOemHookIndication = oemHookIndicationParam;
Amit Mahajand423d192017-03-16 17:04:01 -07002921 mCounterOemHook[mSlotId]++;
Amit Mahajan439da362017-02-13 17:43:04 -08002922
2923 ret = pthread_rwlock_unlock(radioServiceRwlockPtr);
2924 assert(ret == 0);
2925
2926 return Void();
2927}
2928
2929Return<void> OemHookImpl::sendRequestRaw(int32_t serial, const hidl_vec<uint8_t>& data) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002930#if VDBG
Amit Mahajan439da362017-02-13 17:43:04 -08002931 RLOGD("OemHookImpl::sendRequestRaw: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002932#endif
Amit Mahajan439da362017-02-13 17:43:04 -08002933 dispatchRaw(serial, mSlotId, RIL_REQUEST_OEM_HOOK_RAW, data);
2934 return Void();
2935}
2936
2937Return<void> OemHookImpl::sendRequestStrings(int32_t serial,
2938 const hidl_vec<hidl_string>& data) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002939#if VDBG
Amit Mahajan439da362017-02-13 17:43:04 -08002940 RLOGD("OemHookImpl::sendRequestStrings: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002941#endif
Amit Mahajan439da362017-02-13 17:43:04 -08002942 dispatchStrings(serial, mSlotId, RIL_REQUEST_OEM_HOOK_STRINGS, data);
2943 return Void();
2944}
2945
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002946/***************************************************************************************************
2947 * RESPONSE FUNCTIONS
2948 * Functions above are used for requests going from framework to vendor code. The ones below are
2949 * responses for those requests coming back from the vendor code.
2950 **************************************************************************************************/
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002951
Sanket Padawef220dc52017-01-02 23:46:00 -08002952void radio::acknowledgeRequest(int slotId, int serial) {
2953 if (radioService[slotId]->mRadioResponse != NULL) {
Amit Mahajan17249842017-01-19 15:05:45 -08002954 Return<void> retStatus = radioService[slotId]->mRadioResponse->acknowledgeRequest(serial);
2955 radioService[slotId]->checkReturnStatus(retStatus);
Sanket Padawef220dc52017-01-02 23:46:00 -08002956 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08002957 RLOGE("acknowledgeRequest: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawef220dc52017-01-02 23:46:00 -08002958 }
2959}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002960
Sanket Padawef220dc52017-01-02 23:46:00 -08002961void populateResponseInfo(RadioResponseInfo& responseInfo, int serial, int responseType,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002962 RIL_Errno e) {
Sanket Padawef220dc52017-01-02 23:46:00 -08002963 responseInfo.serial = serial;
2964 switch (responseType) {
2965 case RESPONSE_SOLICITED:
2966 responseInfo.type = RadioResponseType::SOLICITED;
2967 break;
2968 case RESPONSE_SOLICITED_ACK_EXP:
2969 responseInfo.type = RadioResponseType::SOLICITED_ACK_EXP;
2970 break;
2971 }
2972 responseInfo.error = (RadioError) e;
2973}
2974
Naveen Kalla346bbc02017-03-16 12:55:55 -07002975int responseIntOrEmpty(RadioResponseInfo& responseInfo, int serial, int responseType, RIL_Errno e,
2976 void *response, size_t responseLen) {
2977 populateResponseInfo(responseInfo, serial, responseType, e);
2978 int ret = -1;
2979
2980 if (response == NULL && responseLen == 0) {
2981 // Earlier RILs did not send a response for some cases although the interface
2982 // expected an integer as response. Do not return error if response is empty. Instead
2983 // Return -1 in those cases to maintain backward compatibility.
2984 } else if (response == NULL || responseLen != sizeof(int)) {
2985 RLOGE("responseIntOrEmpty: Invalid response");
2986 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
2987 } else {
2988 int *p_int = (int *) response;
2989 ret = p_int[0];
2990 }
2991 return ret;
2992}
2993
Sanket Padawef220dc52017-01-02 23:46:00 -08002994int responseInt(RadioResponseInfo& responseInfo, int serial, int responseType, RIL_Errno e,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002995 void *response, size_t responseLen) {
Sanket Padawef220dc52017-01-02 23:46:00 -08002996 populateResponseInfo(responseInfo, serial, responseType, e);
2997 int ret = -1;
2998
2999 if (response == NULL || responseLen != sizeof(int)) {
3000 RLOGE("responseInt: Invalid response");
3001 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
3002 } else {
3003 int *p_int = (int *) response;
3004 ret = p_int[0];
3005 }
3006 return ret;
3007}
3008
Amit Mahajan759786a2017-03-03 17:35:47 -08003009int radio::getIccCardStatusResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003010 int responseType, int serial, RIL_Errno e,
3011 void *response, size_t responseLen) {
Sanket Padawef220dc52017-01-02 23:46:00 -08003012 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003013 RadioResponseInfo responseInfo = {};
Sanket Padawef220dc52017-01-02 23:46:00 -08003014 populateResponseInfo(responseInfo, serial, responseType, e);
Ryuto Sawada1879d102017-07-21 23:18:50 +09003015 CardStatus cardStatus = {CardState::ABSENT, PinState::UNKNOWN, -1, -1, -1, {}};
Nathan Harold7da5dd62017-06-08 16:41:52 -07003016 RIL_CardStatus_v6 *p_cur = ((RIL_CardStatus_v6 *) response);
3017 if (response == NULL || responseLen != sizeof(RIL_CardStatus_v6)
3018 || p_cur->gsm_umts_subscription_app_index >= p_cur->num_applications
3019 || p_cur->cdma_subscription_app_index >= p_cur->num_applications
3020 || p_cur->ims_subscription_app_index >= p_cur->num_applications) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003021 RLOGE("getIccCardStatusResponse: Invalid response");
Sanket Padawef220dc52017-01-02 23:46:00 -08003022 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
Amit Mahajancd77a5b2016-08-25 11:19:21 -07003023 } else {
Amit Mahajancd77a5b2016-08-25 11:19:21 -07003024 cardStatus.cardState = (CardState) p_cur->card_state;
3025 cardStatus.universalPinState = (PinState) p_cur->universal_pin_state;
3026 cardStatus.gsmUmtsSubscriptionAppIndex = p_cur->gsm_umts_subscription_app_index;
3027 cardStatus.cdmaSubscriptionAppIndex = p_cur->cdma_subscription_app_index;
3028 cardStatus.imsSubscriptionAppIndex = p_cur->ims_subscription_app_index;
3029
3030 RIL_AppStatus *rilAppStatus = p_cur->applications;
3031 cardStatus.applications.resize(p_cur->num_applications);
3032 AppStatus *appStatus = cardStatus.applications.data();
Jayachandran C572f2f42017-03-25 14:30:13 -07003033#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003034 RLOGD("getIccCardStatusResponse: num_applications %d", p_cur->num_applications);
Jayachandran C572f2f42017-03-25 14:30:13 -07003035#endif
Amit Mahajancd77a5b2016-08-25 11:19:21 -07003036 for (int i = 0; i < p_cur->num_applications; i++) {
3037 appStatus[i].appType = (AppType) rilAppStatus[i].app_type;
3038 appStatus[i].appState = (AppState) rilAppStatus[i].app_state;
3039 appStatus[i].persoSubstate = (PersoSubstate) rilAppStatus[i].perso_substate;
3040 appStatus[i].aidPtr = convertCharPtrToHidlString(rilAppStatus[i].aid_ptr);
3041 appStatus[i].appLabelPtr = convertCharPtrToHidlString(
3042 rilAppStatus[i].app_label_ptr);
3043 appStatus[i].pin1Replaced = rilAppStatus[i].pin1_replaced;
3044 appStatus[i].pin1 = (PinState) rilAppStatus[i].pin1;
3045 appStatus[i].pin2 = (PinState) rilAppStatus[i].pin2;
3046 }
3047 }
3048
Amit Mahajan17249842017-01-19 15:05:45 -08003049 Return<void> retStatus = radioService[slotId]->mRadioResponse->
3050 getIccCardStatusResponse(responseInfo, cardStatus);
3051 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajancd77a5b2016-08-25 11:19:21 -07003052 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003053 RLOGE("getIccCardStatusResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawef220dc52017-01-02 23:46:00 -08003054 }
3055
3056 return 0;
3057}
3058
Amit Mahajan759786a2017-03-03 17:35:47 -08003059int radio::supplyIccPinForAppResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003060 int responseType, int serial, RIL_Errno e,
3061 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003062#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003063 RLOGD("supplyIccPinForAppResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003064#endif
Sanket Padawef220dc52017-01-02 23:46:00 -08003065
3066 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003067 RadioResponseInfo responseInfo = {};
Naveen Kalla346bbc02017-03-16 12:55:55 -07003068 int ret = responseIntOrEmpty(responseInfo, serial, responseType, e, response, responseLen);
Amit Mahajan17249842017-01-19 15:05:45 -08003069 Return<void> retStatus = radioService[slotId]->mRadioResponse->
3070 supplyIccPinForAppResponse(responseInfo, ret);
Amit Mahajanb3a11bb2017-05-15 16:41:44 -07003071 RLOGE("supplyIccPinForAppResponse: amit ret %d", ret);
Amit Mahajan17249842017-01-19 15:05:45 -08003072 radioService[slotId]->checkReturnStatus(retStatus);
Sanket Padawef220dc52017-01-02 23:46:00 -08003073 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003074 RLOGE("supplyIccPinForAppResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawef220dc52017-01-02 23:46:00 -08003075 slotId);
3076 }
3077
3078 return 0;
3079}
3080
Amit Mahajan759786a2017-03-03 17:35:47 -08003081int radio::supplyIccPukForAppResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003082 int responseType, int serial, RIL_Errno e,
3083 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003084#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003085 RLOGD("supplyIccPukForAppResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003086#endif
Sanket Padawef220dc52017-01-02 23:46:00 -08003087
3088 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003089 RadioResponseInfo responseInfo = {};
Naveen Kalla346bbc02017-03-16 12:55:55 -07003090 int ret = responseIntOrEmpty(responseInfo, serial, responseType, e, response, responseLen);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003091 Return<void> retStatus = radioService[slotId]->mRadioResponse->supplyIccPukForAppResponse(
3092 responseInfo, ret);
Amit Mahajan17249842017-01-19 15:05:45 -08003093 radioService[slotId]->checkReturnStatus(retStatus);
Sanket Padawef220dc52017-01-02 23:46:00 -08003094 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003095 RLOGE("supplyIccPukForAppResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawef220dc52017-01-02 23:46:00 -08003096 slotId);
3097 }
3098
3099 return 0;
3100}
3101
Amit Mahajan759786a2017-03-03 17:35:47 -08003102int radio::supplyIccPin2ForAppResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003103 int responseType, int serial, RIL_Errno e,
3104 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003105#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003106 RLOGD("supplyIccPin2ForAppResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003107#endif
Sanket Padawef220dc52017-01-02 23:46:00 -08003108
3109 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003110 RadioResponseInfo responseInfo = {};
Naveen Kalla346bbc02017-03-16 12:55:55 -07003111 int ret = responseIntOrEmpty(responseInfo, serial, responseType, e, response, responseLen);
Amit Mahajan17249842017-01-19 15:05:45 -08003112 Return<void> retStatus = radioService[slotId]->mRadioResponse->
3113 supplyIccPin2ForAppResponse(responseInfo, ret);
3114 radioService[slotId]->checkReturnStatus(retStatus);
Sanket Padawef220dc52017-01-02 23:46:00 -08003115 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003116 RLOGE("supplyIccPin2ForAppResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawef220dc52017-01-02 23:46:00 -08003117 slotId);
3118 }
3119
3120 return 0;
3121}
3122
Amit Mahajan759786a2017-03-03 17:35:47 -08003123int radio::supplyIccPuk2ForAppResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003124 int responseType, int serial, RIL_Errno e,
3125 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003126#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003127 RLOGD("supplyIccPuk2ForAppResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003128#endif
Sanket Padawef220dc52017-01-02 23:46:00 -08003129
3130 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003131 RadioResponseInfo responseInfo = {};
Naveen Kalla346bbc02017-03-16 12:55:55 -07003132 int ret = responseIntOrEmpty(responseInfo, serial, responseType, e, response, responseLen);
Amit Mahajan17249842017-01-19 15:05:45 -08003133 Return<void> retStatus = radioService[slotId]->mRadioResponse->
3134 supplyIccPuk2ForAppResponse(responseInfo, ret);
3135 radioService[slotId]->checkReturnStatus(retStatus);
Sanket Padawef220dc52017-01-02 23:46:00 -08003136 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003137 RLOGE("supplyIccPuk2ForAppResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawef220dc52017-01-02 23:46:00 -08003138 slotId);
3139 }
3140
3141 return 0;
3142}
3143
Amit Mahajan759786a2017-03-03 17:35:47 -08003144int radio::changeIccPinForAppResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003145 int responseType, int serial, RIL_Errno e,
3146 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003147#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003148 RLOGD("changeIccPinForAppResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003149#endif
Sanket Padawef220dc52017-01-02 23:46:00 -08003150
3151 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003152 RadioResponseInfo responseInfo = {};
Naveen Kalla346bbc02017-03-16 12:55:55 -07003153 int ret = responseIntOrEmpty(responseInfo, serial, responseType, e, response, responseLen);
Amit Mahajan17249842017-01-19 15:05:45 -08003154 Return<void> retStatus = radioService[slotId]->mRadioResponse->
3155 changeIccPinForAppResponse(responseInfo, ret);
3156 radioService[slotId]->checkReturnStatus(retStatus);
Sanket Padawef220dc52017-01-02 23:46:00 -08003157 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003158 RLOGE("changeIccPinForAppResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawef220dc52017-01-02 23:46:00 -08003159 slotId);
3160 }
3161
3162 return 0;
3163}
3164
Amit Mahajan759786a2017-03-03 17:35:47 -08003165int radio::changeIccPin2ForAppResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003166 int responseType, int serial, RIL_Errno e,
3167 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003168#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003169 RLOGD("changeIccPin2ForAppResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003170#endif
Sanket Padawef220dc52017-01-02 23:46:00 -08003171
3172 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003173 RadioResponseInfo responseInfo = {};
Naveen Kalla346bbc02017-03-16 12:55:55 -07003174 int ret = responseIntOrEmpty(responseInfo, serial, responseType, e, response, responseLen);
Amit Mahajan17249842017-01-19 15:05:45 -08003175 Return<void> retStatus = radioService[slotId]->mRadioResponse->
3176 changeIccPin2ForAppResponse(responseInfo, ret);
3177 radioService[slotId]->checkReturnStatus(retStatus);
Sanket Padawef220dc52017-01-02 23:46:00 -08003178 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003179 RLOGE("changeIccPin2ForAppResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawef220dc52017-01-02 23:46:00 -08003180 slotId);
3181 }
3182
3183 return 0;
3184}
3185
Amit Mahajan759786a2017-03-03 17:35:47 -08003186int radio::supplyNetworkDepersonalizationResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003187 int responseType, int serial, RIL_Errno e,
3188 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003189#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003190 RLOGD("supplyNetworkDepersonalizationResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003191#endif
Sanket Padawef220dc52017-01-02 23:46:00 -08003192
3193 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003194 RadioResponseInfo responseInfo = {};
Naveen Kalla346bbc02017-03-16 12:55:55 -07003195 int ret = responseIntOrEmpty(responseInfo, serial, responseType, e, response, responseLen);
Amit Mahajan17249842017-01-19 15:05:45 -08003196 Return<void> retStatus = radioService[slotId]->mRadioResponse->
3197 supplyNetworkDepersonalizationResponse(responseInfo, ret);
3198 radioService[slotId]->checkReturnStatus(retStatus);
Sanket Padawef220dc52017-01-02 23:46:00 -08003199 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003200 RLOGE("supplyNetworkDepersonalizationResponse: radioService[%d]->mRadioResponse == "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003201 "NULL", slotId);
Sanket Padawef220dc52017-01-02 23:46:00 -08003202 }
3203
3204 return 0;
3205}
3206
Amit Mahajan759786a2017-03-03 17:35:47 -08003207int radio::getCurrentCallsResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003208 int responseType, int serial, RIL_Errno e,
3209 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003210#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003211 RLOGD("getCurrentCallsResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003212#endif
Sanket Padawef220dc52017-01-02 23:46:00 -08003213
3214 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003215 RadioResponseInfo responseInfo = {};
Sanket Padawef220dc52017-01-02 23:46:00 -08003216 populateResponseInfo(responseInfo, serial, responseType, e);
3217
3218 hidl_vec<Call> calls;
Amit Mahajan13058cb2017-06-07 23:10:27 -07003219 if ((response == NULL && responseLen != 0)
3220 || (responseLen % sizeof(RIL_Call *)) != 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003221 RLOGE("getCurrentCallsResponse: Invalid response");
Amit Mahajan5829a472016-12-28 17:28:07 -08003222 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
Sanket Padawef220dc52017-01-02 23:46:00 -08003223 } else {
3224 int num = responseLen / sizeof(RIL_Call *);
3225 calls.resize(num);
3226
3227 for (int i = 0 ; i < num ; i++) {
3228 RIL_Call *p_cur = ((RIL_Call **) response)[i];
3229 /* each call info */
3230 calls[i].state = (CallState) p_cur->state;
3231 calls[i].index = p_cur->index;
3232 calls[i].toa = p_cur->toa;
3233 calls[i].isMpty = p_cur->isMpty;
3234 calls[i].isMT = p_cur->isMT;
3235 calls[i].als = p_cur->als;
3236 calls[i].isVoice = p_cur->isVoice;
3237 calls[i].isVoicePrivacy = p_cur->isVoicePrivacy;
3238 calls[i].number = convertCharPtrToHidlString(p_cur->number);
3239 calls[i].numberPresentation = (CallPresentation) p_cur->numberPresentation;
3240 calls[i].name = convertCharPtrToHidlString(p_cur->name);
3241 calls[i].namePresentation = (CallPresentation) p_cur->namePresentation;
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003242 if (p_cur->uusInfo != NULL && p_cur->uusInfo->uusData != NULL) {
Sanket Padawef220dc52017-01-02 23:46:00 -08003243 RIL_UUS_Info *uusInfo = p_cur->uusInfo;
Ajay Nambi83e7acd2017-09-05 15:06:22 +05303244 calls[i].uusInfo.resize(1);
Sanket Padawef220dc52017-01-02 23:46:00 -08003245 calls[i].uusInfo[0].uusType = (UusType) uusInfo->uusType;
3246 calls[i].uusInfo[0].uusDcs = (UusDcs) uusInfo->uusDcs;
3247 // convert uusInfo->uusData to a null-terminated string
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003248 char *nullTermStr = strndup(uusInfo->uusData, uusInfo->uusLength);
3249 calls[i].uusInfo[0].uusData = nullTermStr;
3250 free(nullTermStr);
Sanket Padawef220dc52017-01-02 23:46:00 -08003251 }
3252 }
3253 }
3254
Amit Mahajan17249842017-01-19 15:05:45 -08003255 Return<void> retStatus = radioService[slotId]->mRadioResponse->
3256 getCurrentCallsResponse(responseInfo, calls);
3257 radioService[slotId]->checkReturnStatus(retStatus);
Sanket Padawef220dc52017-01-02 23:46:00 -08003258 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003259 RLOGE("getCurrentCallsResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawef220dc52017-01-02 23:46:00 -08003260 }
3261
3262 return 0;
3263}
3264
Amit Mahajan759786a2017-03-03 17:35:47 -08003265int radio::dialResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003266 int responseType, int serial, RIL_Errno e, void *response,
3267 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003268#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003269 RLOGD("dialResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003270#endif
Sanket Padawef220dc52017-01-02 23:46:00 -08003271
3272 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003273 RadioResponseInfo responseInfo = {};
Sanket Padawef220dc52017-01-02 23:46:00 -08003274 populateResponseInfo(responseInfo, serial, responseType, e);
Amit Mahajan17249842017-01-19 15:05:45 -08003275 Return<void> retStatus = radioService[slotId]->mRadioResponse->dialResponse(responseInfo);
3276 radioService[slotId]->checkReturnStatus(retStatus);
Sanket Padawef220dc52017-01-02 23:46:00 -08003277 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003278 RLOGE("dialResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Amit Mahajancd77a5b2016-08-25 11:19:21 -07003279 }
3280
3281 return 0;
3282}
3283
Amit Mahajan759786a2017-03-03 17:35:47 -08003284int radio::getIMSIForAppResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003285 int responseType, int serial, RIL_Errno e, void *response,
3286 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003287#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003288 RLOGD("getIMSIForAppResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003289#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003290
3291 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003292 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003293 populateResponseInfo(responseInfo, serial, responseType, e);
3294 Return<void> retStatus = radioService[slotId]->mRadioResponse->getIMSIForAppResponse(
3295 responseInfo, convertCharPtrToHidlString((char *) response));
3296 radioService[slotId]->checkReturnStatus(retStatus);
3297 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003298 RLOGE("getIMSIForAppResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003299 slotId);
3300 }
3301
3302 return 0;
3303}
3304
Amit Mahajan759786a2017-03-03 17:35:47 -08003305int radio::hangupConnectionResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003306 int responseType, int serial, RIL_Errno e,
3307 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003308#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003309 RLOGD("hangupConnectionResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003310#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003311
3312 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003313 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003314 populateResponseInfo(responseInfo, serial, responseType, e);
3315 Return<void> retStatus = radioService[slotId]->mRadioResponse->hangupConnectionResponse(
3316 responseInfo);
3317 radioService[slotId]->checkReturnStatus(retStatus);
3318 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003319 RLOGE("hangupConnectionResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003320 slotId);
3321 }
3322
3323 return 0;
3324}
3325
Amit Mahajan759786a2017-03-03 17:35:47 -08003326int radio::hangupWaitingOrBackgroundResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003327 int responseType, int serial, RIL_Errno e,
3328 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003329#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003330 RLOGD("hangupWaitingOrBackgroundResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003331#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003332
3333 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003334 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003335 populateResponseInfo(responseInfo, serial, responseType, e);
3336 Return<void> retStatus =
3337 radioService[slotId]->mRadioResponse->hangupWaitingOrBackgroundResponse(
3338 responseInfo);
3339 radioService[slotId]->checkReturnStatus(retStatus);
3340 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003341 RLOGE("hangupWaitingOrBackgroundResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003342 slotId);
3343 }
3344
3345 return 0;
3346}
3347
Amit Mahajan759786a2017-03-03 17:35:47 -08003348int radio::hangupForegroundResumeBackgroundResponse(int slotId, int responseType, int serial,
3349 RIL_Errno e, void *response,
3350 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003351#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003352 RLOGD("hangupWaitingOrBackgroundResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003353#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003354
3355 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003356 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003357 populateResponseInfo(responseInfo, serial, responseType, e);
3358 Return<void> retStatus =
3359 radioService[slotId]->mRadioResponse->hangupWaitingOrBackgroundResponse(
3360 responseInfo);
3361 radioService[slotId]->checkReturnStatus(retStatus);
3362 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003363 RLOGE("hangupWaitingOrBackgroundResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003364 slotId);
3365 }
3366
3367 return 0;
3368}
3369
Amit Mahajan759786a2017-03-03 17:35:47 -08003370int radio::switchWaitingOrHoldingAndActiveResponse(int slotId, int responseType, int serial,
3371 RIL_Errno e, void *response,
3372 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003373#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003374 RLOGD("switchWaitingOrHoldingAndActiveResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003375#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003376
3377 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003378 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003379 populateResponseInfo(responseInfo, serial, responseType, e);
3380 Return<void> retStatus =
3381 radioService[slotId]->mRadioResponse->switchWaitingOrHoldingAndActiveResponse(
3382 responseInfo);
3383 radioService[slotId]->checkReturnStatus(retStatus);
3384 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003385 RLOGE("switchWaitingOrHoldingAndActiveResponse: radioService[%d]->mRadioResponse "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003386 "== NULL", slotId);
3387 }
3388
3389 return 0;
3390}
3391
Amit Mahajan759786a2017-03-03 17:35:47 -08003392int radio::conferenceResponse(int slotId, int responseType,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003393 int serial, RIL_Errno e, void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003394#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003395 RLOGD("conferenceResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003396#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003397
3398 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003399 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003400 populateResponseInfo(responseInfo, serial, responseType, e);
3401 Return<void> retStatus = radioService[slotId]->mRadioResponse->conferenceResponse(
3402 responseInfo);
3403 radioService[slotId]->checkReturnStatus(retStatus);
3404 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003405 RLOGE("conferenceResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003406 slotId);
3407 }
3408
3409 return 0;
3410}
3411
Amit Mahajan759786a2017-03-03 17:35:47 -08003412int radio::rejectCallResponse(int slotId, int responseType,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003413 int serial, RIL_Errno e, void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003414#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003415 RLOGD("rejectCallResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003416#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003417
3418 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003419 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003420 populateResponseInfo(responseInfo, serial, responseType, e);
3421 Return<void> retStatus = radioService[slotId]->mRadioResponse->rejectCallResponse(
3422 responseInfo);
3423 radioService[slotId]->checkReturnStatus(retStatus);
3424 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003425 RLOGE("rejectCallResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003426 slotId);
3427 }
3428
3429 return 0;
3430}
3431
Amit Mahajan759786a2017-03-03 17:35:47 -08003432int radio::getLastCallFailCauseResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003433 int responseType, int serial, RIL_Errno e, void *response,
3434 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003435#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003436 RLOGD("getLastCallFailCauseResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003437#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003438
3439 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003440 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003441 populateResponseInfo(responseInfo, serial, responseType, e);
Jack Yuf68e0da2017-02-07 14:53:09 -08003442
3443 LastCallFailCauseInfo info = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003444 info.vendorCause = hidl_string();
3445 if (response == NULL) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003446 RLOGE("getCurrentCallsResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003447 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
3448 } else if (responseLen == sizeof(int)) {
3449 int *pInt = (int *) response;
3450 info.causeCode = (LastCallFailCause) pInt[0];
3451 } else if (responseLen == sizeof(RIL_LastCallFailCauseInfo)) {
3452 RIL_LastCallFailCauseInfo *pFailCauseInfo = (RIL_LastCallFailCauseInfo *) response;
3453 info.causeCode = (LastCallFailCause) pFailCauseInfo->cause_code;
3454 info.vendorCause = convertCharPtrToHidlString(pFailCauseInfo->vendor_cause);
3455 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003456 RLOGE("getCurrentCallsResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003457 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
3458 }
3459
3460 Return<void> retStatus = radioService[slotId]->mRadioResponse->getLastCallFailCauseResponse(
3461 responseInfo, info);
3462 radioService[slotId]->checkReturnStatus(retStatus);
3463 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003464 RLOGE("getLastCallFailCauseResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003465 slotId);
3466 }
3467
3468 return 0;
3469}
3470
Amit Mahajan759786a2017-03-03 17:35:47 -08003471int radio::getSignalStrengthResponse(int slotId,
Amit Mahajan3df62912017-02-10 01:35:55 +00003472 int responseType, int serial, RIL_Errno e,
3473 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003474#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003475 RLOGD("getSignalStrengthResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003476#endif
Amit Mahajan3df62912017-02-10 01:35:55 +00003477
3478 if (radioService[slotId]->mRadioResponse != NULL) {
Amit Mahajan3da9ac02017-02-13 13:41:28 -08003479 RadioResponseInfo responseInfo = {};
Amit Mahajan3df62912017-02-10 01:35:55 +00003480 populateResponseInfo(responseInfo, serial, responseType, e);
Amit Mahajan3da9ac02017-02-13 13:41:28 -08003481 SignalStrength signalStrength = {};
Amit Mahajan3df62912017-02-10 01:35:55 +00003482 if (response == NULL || responseLen != sizeof(RIL_SignalStrength_v10)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003483 RLOGE("getSignalStrengthResponse: Invalid response");
Amit Mahajan3df62912017-02-10 01:35:55 +00003484 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
3485 } else {
3486 convertRilSignalStrengthToHal(response, responseLen, signalStrength);
3487 }
3488
3489 Return<void> retStatus = radioService[slotId]->mRadioResponse->getSignalStrengthResponse(
3490 responseInfo, signalStrength);
3491 radioService[slotId]->checkReturnStatus(retStatus);
3492 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003493 RLOGE("getSignalStrengthResponse: radioService[%d]->mRadioResponse == NULL",
Amit Mahajan3df62912017-02-10 01:35:55 +00003494 slotId);
3495 }
3496
3497 return 0;
3498}
3499
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003500RIL_CellInfoType getCellInfoTypeRadioTechnology(char *rat) {
3501 if (rat == NULL) {
3502 return RIL_CELL_INFO_TYPE_NONE;
3503 }
3504
3505 int radioTech = atoi(rat);
3506
3507 switch(radioTech) {
3508
3509 case RADIO_TECH_GPRS:
3510 case RADIO_TECH_EDGE:
3511 case RADIO_TECH_GSM: {
3512 return RIL_CELL_INFO_TYPE_GSM;
3513 }
3514
3515 case RADIO_TECH_UMTS:
3516 case RADIO_TECH_HSDPA:
3517 case RADIO_TECH_HSUPA:
3518 case RADIO_TECH_HSPA:
3519 case RADIO_TECH_HSPAP: {
3520 return RIL_CELL_INFO_TYPE_WCDMA;
3521 }
3522
3523 case RADIO_TECH_IS95A:
3524 case RADIO_TECH_IS95B:
3525 case RADIO_TECH_1xRTT:
3526 case RADIO_TECH_EVDO_0:
3527 case RADIO_TECH_EVDO_A:
3528 case RADIO_TECH_EVDO_B:
3529 case RADIO_TECH_EHRPD: {
3530 return RIL_CELL_INFO_TYPE_CDMA;
3531 }
3532
3533 case RADIO_TECH_LTE:
3534 case RADIO_TECH_LTE_CA: {
3535 return RIL_CELL_INFO_TYPE_LTE;
3536 }
3537
3538 case RADIO_TECH_TD_SCDMA: {
3539 return RIL_CELL_INFO_TYPE_TD_SCDMA;
3540 }
3541
3542 default: {
3543 break;
3544 }
3545 }
3546
3547 return RIL_CELL_INFO_TYPE_NONE;
3548
3549}
3550
3551void fillCellIdentityResponse(CellIdentity &cellIdentity, RIL_CellIdentity_v16 &rilCellIdentity) {
3552
3553 cellIdentity.cellIdentityGsm.resize(0);
3554 cellIdentity.cellIdentityWcdma.resize(0);
3555 cellIdentity.cellIdentityCdma.resize(0);
3556 cellIdentity.cellIdentityTdscdma.resize(0);
3557 cellIdentity.cellIdentityLte.resize(0);
3558 cellIdentity.cellInfoType = (CellInfoType)rilCellIdentity.cellInfoType;
3559 switch(rilCellIdentity.cellInfoType) {
3560
3561 case RIL_CELL_INFO_TYPE_GSM: {
3562 cellIdentity.cellIdentityGsm.resize(1);
3563 cellIdentity.cellIdentityGsm[0].mcc =
3564 std::to_string(rilCellIdentity.cellIdentityGsm.mcc);
3565 cellIdentity.cellIdentityGsm[0].mnc =
Nathan Harold98cfcee2018-08-20 11:38:27 -07003566 ril::util::mnc::decode(rilCellIdentity.cellIdentityGsm.mnc);
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003567 cellIdentity.cellIdentityGsm[0].lac = rilCellIdentity.cellIdentityGsm.lac;
3568 cellIdentity.cellIdentityGsm[0].cid = rilCellIdentity.cellIdentityGsm.cid;
3569 cellIdentity.cellIdentityGsm[0].arfcn = rilCellIdentity.cellIdentityGsm.arfcn;
3570 cellIdentity.cellIdentityGsm[0].bsic = rilCellIdentity.cellIdentityGsm.bsic;
3571 break;
3572 }
3573
3574 case RIL_CELL_INFO_TYPE_WCDMA: {
3575 cellIdentity.cellIdentityWcdma.resize(1);
3576 cellIdentity.cellIdentityWcdma[0].mcc =
3577 std::to_string(rilCellIdentity.cellIdentityWcdma.mcc);
3578 cellIdentity.cellIdentityWcdma[0].mnc =
Nathan Harold98cfcee2018-08-20 11:38:27 -07003579 ril::util::mnc::decode(rilCellIdentity.cellIdentityWcdma.mnc);
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003580 cellIdentity.cellIdentityWcdma[0].lac = rilCellIdentity.cellIdentityWcdma.lac;
3581 cellIdentity.cellIdentityWcdma[0].cid = rilCellIdentity.cellIdentityWcdma.cid;
3582 cellIdentity.cellIdentityWcdma[0].psc = rilCellIdentity.cellIdentityWcdma.psc;
3583 cellIdentity.cellIdentityWcdma[0].uarfcn = rilCellIdentity.cellIdentityWcdma.uarfcn;
3584 break;
3585 }
3586
3587 case RIL_CELL_INFO_TYPE_CDMA: {
3588 cellIdentity.cellIdentityCdma.resize(1);
3589 cellIdentity.cellIdentityCdma[0].networkId = rilCellIdentity.cellIdentityCdma.networkId;
3590 cellIdentity.cellIdentityCdma[0].systemId = rilCellIdentity.cellIdentityCdma.systemId;
3591 cellIdentity.cellIdentityCdma[0].baseStationId =
3592 rilCellIdentity.cellIdentityCdma.basestationId;
3593 cellIdentity.cellIdentityCdma[0].longitude = rilCellIdentity.cellIdentityCdma.longitude;
3594 cellIdentity.cellIdentityCdma[0].latitude = rilCellIdentity.cellIdentityCdma.latitude;
3595 break;
3596 }
3597
3598 case RIL_CELL_INFO_TYPE_LTE: {
3599 cellIdentity.cellIdentityLte.resize(1);
3600 cellIdentity.cellIdentityLte[0].mcc =
3601 std::to_string(rilCellIdentity.cellIdentityLte.mcc);
3602 cellIdentity.cellIdentityLte[0].mnc =
Nathan Harold98cfcee2018-08-20 11:38:27 -07003603 ril::util::mnc::decode(rilCellIdentity.cellIdentityLte.mnc);
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003604 cellIdentity.cellIdentityLte[0].ci = rilCellIdentity.cellIdentityLte.ci;
3605 cellIdentity.cellIdentityLte[0].pci = rilCellIdentity.cellIdentityLte.pci;
3606 cellIdentity.cellIdentityLte[0].tac = rilCellIdentity.cellIdentityLte.tac;
3607 cellIdentity.cellIdentityLte[0].earfcn = rilCellIdentity.cellIdentityLte.earfcn;
3608 break;
3609 }
3610
3611 case RIL_CELL_INFO_TYPE_TD_SCDMA: {
3612 cellIdentity.cellIdentityTdscdma.resize(1);
3613 cellIdentity.cellIdentityTdscdma[0].mcc =
3614 std::to_string(rilCellIdentity.cellIdentityTdscdma.mcc);
3615 cellIdentity.cellIdentityTdscdma[0].mnc =
Nathan Harold98cfcee2018-08-20 11:38:27 -07003616 ril::util::mnc::decode(rilCellIdentity.cellIdentityTdscdma.mnc);
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003617 cellIdentity.cellIdentityTdscdma[0].lac = rilCellIdentity.cellIdentityTdscdma.lac;
3618 cellIdentity.cellIdentityTdscdma[0].cid = rilCellIdentity.cellIdentityTdscdma.cid;
3619 cellIdentity.cellIdentityTdscdma[0].cpid = rilCellIdentity.cellIdentityTdscdma.cpid;
3620 break;
3621 }
3622
3623 default: {
3624 break;
3625 }
3626 }
3627}
3628
3629int convertResponseStringEntryToInt(char **response, int index, int numStrings) {
3630 if ((response != NULL) && (numStrings > index) && (response[index] != NULL)) {
3631 return atoi(response[index]);
3632 }
3633
3634 return -1;
3635}
3636
Sooraj Sasindran758ee462017-06-07 16:30:18 -07003637int convertResponseHexStringEntryToInt(char **response, int index, int numStrings) {
3638 const int hexBase = 16;
3639 if ((response != NULL) && (numStrings > index) && (response[index] != NULL)) {
3640 return strtol(response[index], NULL, hexBase);
3641 }
3642
3643 return -1;
3644}
3645
3646/* Fill Cell Identity info from Voice Registration State Response.
3647 * This fucntion is applicable only for RIL Version < 15.
3648 * Response is a "char **".
3649 * First and Second entries are in hex string format
3650 * and rest are integers represented in ascii format. */
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003651void fillCellIdentityFromVoiceRegStateResponseString(CellIdentity &cellIdentity,
3652 int numStrings, char** response) {
3653
3654 RIL_CellIdentity_v16 rilCellIdentity;
Jack Yu8e732d42017-04-14 00:08:06 -07003655 memset(&rilCellIdentity, -1, sizeof(RIL_CellIdentity_v16));
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003656
3657 rilCellIdentity.cellInfoType = getCellInfoTypeRadioTechnology(response[3]);
3658 switch(rilCellIdentity.cellInfoType) {
3659
3660 case RIL_CELL_INFO_TYPE_GSM: {
Sooraj Sasindran758ee462017-06-07 16:30:18 -07003661 /* valid LAC are hexstrings in the range 0x0000 - 0xffff */
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003662 rilCellIdentity.cellIdentityGsm.lac =
Sooraj Sasindran758ee462017-06-07 16:30:18 -07003663 convertResponseHexStringEntryToInt(response, 1, numStrings);
3664
3665 /* valid CID are hexstrings in the range 0x00000000 - 0xffffffff */
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003666 rilCellIdentity.cellIdentityGsm.cid =
Sooraj Sasindran758ee462017-06-07 16:30:18 -07003667 convertResponseHexStringEntryToInt(response, 2, numStrings);
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003668 break;
3669 }
3670
3671 case RIL_CELL_INFO_TYPE_WCDMA: {
Sooraj Sasindran758ee462017-06-07 16:30:18 -07003672 /* valid LAC are hexstrings in the range 0x0000 - 0xffff */
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003673 rilCellIdentity.cellIdentityWcdma.lac =
Sooraj Sasindran758ee462017-06-07 16:30:18 -07003674 convertResponseHexStringEntryToInt(response, 1, numStrings);
3675
3676 /* valid CID are hexstrings in the range 0x00000000 - 0xffffffff */
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003677 rilCellIdentity.cellIdentityWcdma.cid =
Sooraj Sasindran758ee462017-06-07 16:30:18 -07003678 convertResponseHexStringEntryToInt(response, 2, numStrings);
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003679 rilCellIdentity.cellIdentityWcdma.psc =
3680 convertResponseStringEntryToInt(response, 14, numStrings);
3681 break;
3682 }
3683
3684 case RIL_CELL_INFO_TYPE_TD_SCDMA:{
Sooraj Sasindran758ee462017-06-07 16:30:18 -07003685 /* valid LAC are hexstrings in the range 0x0000 - 0xffff */
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003686 rilCellIdentity.cellIdentityTdscdma.lac =
Sooraj Sasindran758ee462017-06-07 16:30:18 -07003687 convertResponseHexStringEntryToInt(response, 1, numStrings);
3688
3689 /* valid CID are hexstrings in the range 0x00000000 - 0xffffffff */
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003690 rilCellIdentity.cellIdentityTdscdma.cid =
Sooraj Sasindran758ee462017-06-07 16:30:18 -07003691 convertResponseHexStringEntryToInt(response, 2, numStrings);
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003692 break;
3693 }
3694
3695 case RIL_CELL_INFO_TYPE_CDMA:{
3696 rilCellIdentity.cellIdentityCdma.basestationId =
3697 convertResponseStringEntryToInt(response, 4, numStrings);
Nathan Harold35afd642017-07-07 17:12:04 -07003698 /* Order of Lat. and Long. swapped between RIL and HIDL interface versions. */
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003699 rilCellIdentity.cellIdentityCdma.latitude =
Nathan Harold35afd642017-07-07 17:12:04 -07003700 convertResponseStringEntryToInt(response, 5, numStrings);
3701 rilCellIdentity.cellIdentityCdma.longitude =
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003702 convertResponseStringEntryToInt(response, 6, numStrings);
3703 rilCellIdentity.cellIdentityCdma.systemId =
3704 convertResponseStringEntryToInt(response, 8, numStrings);
3705 rilCellIdentity.cellIdentityCdma.networkId =
3706 convertResponseStringEntryToInt(response, 9, numStrings);
3707 break;
3708 }
3709
Sooraj Sasindranf28e42a2017-03-06 23:07:22 -08003710 case RIL_CELL_INFO_TYPE_LTE:{
Sooraj Sasindran758ee462017-06-07 16:30:18 -07003711 /* valid TAC are hexstrings in the range 0x0000 - 0xffff */
Sooraj Sasindranf28e42a2017-03-06 23:07:22 -08003712 rilCellIdentity.cellIdentityLte.tac =
Sooraj Sasindran758ee462017-06-07 16:30:18 -07003713 convertResponseHexStringEntryToInt(response, 1, numStrings);
3714
3715 /* valid CID are hexstrings in the range 0x00000000 - 0xffffffff */
Sooraj Sasindranf28e42a2017-03-06 23:07:22 -08003716 rilCellIdentity.cellIdentityLte.ci =
Sooraj Sasindran758ee462017-06-07 16:30:18 -07003717 convertResponseHexStringEntryToInt(response, 2, numStrings);
Sooraj Sasindranf28e42a2017-03-06 23:07:22 -08003718 break;
3719 }
3720
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003721 default: {
3722 break;
3723 }
3724 }
3725
3726 fillCellIdentityResponse(cellIdentity, rilCellIdentity);
3727}
3728
Sooraj Sasindran758ee462017-06-07 16:30:18 -07003729/* Fill Cell Identity info from Data Registration State Response.
3730 * This fucntion is applicable only for RIL Version < 15.
3731 * Response is a "char **".
3732 * First and Second entries are in hex string format
3733 * and rest are integers represented in ascii format. */
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003734void fillCellIdentityFromDataRegStateResponseString(CellIdentity &cellIdentity,
3735 int numStrings, char** response) {
3736
3737 RIL_CellIdentity_v16 rilCellIdentity;
Jack Yu8e732d42017-04-14 00:08:06 -07003738 memset(&rilCellIdentity, -1, sizeof(RIL_CellIdentity_v16));
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003739
3740 rilCellIdentity.cellInfoType = getCellInfoTypeRadioTechnology(response[3]);
3741 switch(rilCellIdentity.cellInfoType) {
3742 case RIL_CELL_INFO_TYPE_GSM: {
Sooraj Sasindran758ee462017-06-07 16:30:18 -07003743 /* valid LAC are hexstrings in the range 0x0000 - 0xffff */
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003744 rilCellIdentity.cellIdentityGsm.lac =
Sooraj Sasindran758ee462017-06-07 16:30:18 -07003745 convertResponseHexStringEntryToInt(response, 1, numStrings);
3746
3747 /* valid CID are hexstrings in the range 0x00000000 - 0xffffffff */
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003748 rilCellIdentity.cellIdentityGsm.cid =
Sooraj Sasindran758ee462017-06-07 16:30:18 -07003749 convertResponseHexStringEntryToInt(response, 2, numStrings);
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003750 break;
3751 }
3752 case RIL_CELL_INFO_TYPE_WCDMA: {
Sooraj Sasindran758ee462017-06-07 16:30:18 -07003753 /* valid LAC are hexstrings in the range 0x0000 - 0xffff */
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003754 rilCellIdentity.cellIdentityWcdma.lac =
Sooraj Sasindran758ee462017-06-07 16:30:18 -07003755 convertResponseHexStringEntryToInt(response, 1, numStrings);
3756
3757 /* valid CID are hexstrings in the range 0x00000000 - 0xffffffff */
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003758 rilCellIdentity.cellIdentityWcdma.cid =
Sooraj Sasindran758ee462017-06-07 16:30:18 -07003759 convertResponseHexStringEntryToInt(response, 2, numStrings);
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003760 break;
3761 }
3762 case RIL_CELL_INFO_TYPE_TD_SCDMA:{
Sooraj Sasindran758ee462017-06-07 16:30:18 -07003763 /* valid LAC are hexstrings in the range 0x0000 - 0xffff */
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003764 rilCellIdentity.cellIdentityTdscdma.lac =
Sooraj Sasindran758ee462017-06-07 16:30:18 -07003765 convertResponseHexStringEntryToInt(response, 1, numStrings);
3766
3767 /* valid CID are hexstrings in the range 0x00000000 - 0xffffffff */
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003768 rilCellIdentity.cellIdentityTdscdma.cid =
Sooraj Sasindran758ee462017-06-07 16:30:18 -07003769 convertResponseHexStringEntryToInt(response, 2, numStrings);
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003770 break;
3771 }
3772 case RIL_CELL_INFO_TYPE_LTE: {
3773 rilCellIdentity.cellIdentityLte.tac =
3774 convertResponseStringEntryToInt(response, 6, numStrings);
3775 rilCellIdentity.cellIdentityLte.pci =
3776 convertResponseStringEntryToInt(response, 7, numStrings);
3777 rilCellIdentity.cellIdentityLte.ci =
3778 convertResponseStringEntryToInt(response, 8, numStrings);
3779 break;
3780 }
3781 default: {
3782 break;
3783 }
3784 }
3785
3786 fillCellIdentityResponse(cellIdentity, rilCellIdentity);
3787}
3788
Amit Mahajan759786a2017-03-03 17:35:47 -08003789int radio::getVoiceRegistrationStateResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003790 int responseType, int serial, RIL_Errno e,
3791 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003792#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003793 RLOGD("getVoiceRegistrationStateResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003794#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003795
3796 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003797 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003798 populateResponseInfo(responseInfo, serial, responseType, e);
3799
Jack Yuf68e0da2017-02-07 14:53:09 -08003800 VoiceRegStateResult voiceRegResponse = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003801 int numStrings = responseLen / sizeof(char *);
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003802 if (response == NULL) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003803 RLOGE("getVoiceRegistrationStateResponse Invalid response: NULL");
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003804 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
3805 } else if (s_vendorFunctions->version <= 14) {
3806 if (numStrings != 15) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003807 RLOGE("getVoiceRegistrationStateResponse Invalid response: NULL");
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003808 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
3809 } else {
3810 char **resp = (char **) response;
3811 voiceRegResponse.regState = (RegState) ATOI_NULL_HANDLED_DEF(resp[0], 4);
3812 voiceRegResponse.rat = ATOI_NULL_HANDLED(resp[3]);
3813 voiceRegResponse.cssSupported = ATOI_NULL_HANDLED_DEF(resp[7], 0);
3814 voiceRegResponse.roamingIndicator = ATOI_NULL_HANDLED(resp[10]);
3815 voiceRegResponse.systemIsInPrl = ATOI_NULL_HANDLED_DEF(resp[11], 0);
3816 voiceRegResponse.defaultRoamingIndicator = ATOI_NULL_HANDLED_DEF(resp[12], 0);
3817 voiceRegResponse.reasonForDenial = ATOI_NULL_HANDLED_DEF(resp[13], 0);
3818 fillCellIdentityFromVoiceRegStateResponseString(voiceRegResponse.cellIdentity,
3819 numStrings, resp);
3820 }
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003821 } else {
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003822 RIL_VoiceRegistrationStateResponse *voiceRegState =
3823 (RIL_VoiceRegistrationStateResponse *)response;
3824
3825 if (responseLen != sizeof(RIL_VoiceRegistrationStateResponse)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003826 RLOGE("getVoiceRegistrationStateResponse Invalid response: NULL");
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003827 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
3828 } else {
3829 voiceRegResponse.regState = (RegState) voiceRegState->regState;
3830 voiceRegResponse.rat = voiceRegState->rat;;
3831 voiceRegResponse.cssSupported = voiceRegState->cssSupported;
3832 voiceRegResponse.roamingIndicator = voiceRegState->roamingIndicator;
3833 voiceRegResponse.systemIsInPrl = voiceRegState->systemIsInPrl;
3834 voiceRegResponse.defaultRoamingIndicator = voiceRegState->defaultRoamingIndicator;
3835 voiceRegResponse.reasonForDenial = voiceRegState->reasonForDenial;
3836 fillCellIdentityResponse(voiceRegResponse.cellIdentity,
3837 voiceRegState->cellIdentity);
3838 }
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003839 }
3840
3841 Return<void> retStatus =
3842 radioService[slotId]->mRadioResponse->getVoiceRegistrationStateResponse(
3843 responseInfo, voiceRegResponse);
3844 radioService[slotId]->checkReturnStatus(retStatus);
3845 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003846 RLOGE("getVoiceRegistrationStateResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003847 slotId);
3848 }
3849
3850 return 0;
3851}
3852
Amit Mahajan759786a2017-03-03 17:35:47 -08003853int radio::getDataRegistrationStateResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003854 int responseType, int serial, RIL_Errno e,
3855 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003856#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003857 RLOGD("getDataRegistrationStateResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003858#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003859
3860 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003861 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003862 populateResponseInfo(responseInfo, serial, responseType, e);
Jack Yuf68e0da2017-02-07 14:53:09 -08003863 DataRegStateResult dataRegResponse = {};
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003864 if (response == NULL) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003865 RLOGE("getDataRegistrationStateResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003866 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003867 } else if (s_vendorFunctions->version <= 14) {
3868 int numStrings = responseLen / sizeof(char *);
3869 if ((numStrings != 6) && (numStrings != 11)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003870 RLOGE("getDataRegistrationStateResponse Invalid response: NULL");
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003871 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
3872 } else {
3873 char **resp = (char **) response;
3874 dataRegResponse.regState = (RegState) ATOI_NULL_HANDLED_DEF(resp[0], 4);
3875 dataRegResponse.rat = ATOI_NULL_HANDLED_DEF(resp[3], 0);
3876 dataRegResponse.reasonDataDenied = ATOI_NULL_HANDLED(resp[4]);
3877 dataRegResponse.maxDataCalls = ATOI_NULL_HANDLED_DEF(resp[5], 1);
3878 fillCellIdentityFromDataRegStateResponseString(dataRegResponse.cellIdentity,
3879 numStrings, resp);
3880 }
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003881 } else {
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003882 RIL_DataRegistrationStateResponse *dataRegState =
3883 (RIL_DataRegistrationStateResponse *)response;
3884
3885 if (responseLen != sizeof(RIL_DataRegistrationStateResponse)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003886 RLOGE("getDataRegistrationStateResponse Invalid response: NULL");
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003887 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
3888 } else {
3889 dataRegResponse.regState = (RegState) dataRegState->regState;
3890 dataRegResponse.rat = dataRegState->rat;;
3891 dataRegResponse.reasonDataDenied = dataRegState->reasonDataDenied;
3892 dataRegResponse.maxDataCalls = dataRegState->maxDataCalls;
3893 fillCellIdentityResponse(dataRegResponse.cellIdentity, dataRegState->cellIdentity);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003894 }
3895 }
3896
3897 Return<void> retStatus =
3898 radioService[slotId]->mRadioResponse->getDataRegistrationStateResponse(responseInfo,
3899 dataRegResponse);
3900 radioService[slotId]->checkReturnStatus(retStatus);
3901 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003902 RLOGE("getDataRegistrationStateResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003903 slotId);
3904 }
3905
3906 return 0;
3907}
3908
Amit Mahajan759786a2017-03-03 17:35:47 -08003909int radio::getOperatorResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003910 int responseType, int serial, RIL_Errno e, void *response,
3911 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003912#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003913 RLOGD("getOperatorResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003914#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003915
3916 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003917 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003918 populateResponseInfo(responseInfo, serial, responseType, e);
3919 hidl_string longName;
3920 hidl_string shortName;
3921 hidl_string numeric;
3922 int numStrings = responseLen / sizeof(char *);
3923 if (response == NULL || numStrings != 3) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003924 RLOGE("getOperatorResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003925 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
3926
3927 } else {
3928 char **resp = (char **) response;
3929 longName = convertCharPtrToHidlString(resp[0]);
3930 shortName = convertCharPtrToHidlString(resp[1]);
3931 numeric = convertCharPtrToHidlString(resp[2]);
3932 }
3933 Return<void> retStatus = radioService[slotId]->mRadioResponse->getOperatorResponse(
3934 responseInfo, longName, shortName, numeric);
3935 radioService[slotId]->checkReturnStatus(retStatus);
3936 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003937 RLOGE("getOperatorResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003938 slotId);
3939 }
3940
3941 return 0;
3942}
3943
Amit Mahajan759786a2017-03-03 17:35:47 -08003944int radio::setRadioPowerResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003945 int responseType, int serial, RIL_Errno e, void *response,
3946 size_t responseLen) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003947 RLOGD("setRadioPowerResponse: serial %d", serial);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003948
3949 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003950 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003951 populateResponseInfo(responseInfo, serial, responseType, e);
3952 Return<void> retStatus = radioService[slotId]->mRadioResponse->setRadioPowerResponse(
3953 responseInfo);
3954 radioService[slotId]->checkReturnStatus(retStatus);
3955 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003956 RLOGE("setRadioPowerResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003957 slotId);
3958 }
3959
3960 return 0;
3961}
3962
Amit Mahajan759786a2017-03-03 17:35:47 -08003963int radio::sendDtmfResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003964 int responseType, int serial, RIL_Errno e, void *response,
3965 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003966#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003967 RLOGD("sendDtmfResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003968#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003969
3970 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003971 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003972 populateResponseInfo(responseInfo, serial, responseType, e);
3973 Return<void> retStatus = radioService[slotId]->mRadioResponse->sendDtmfResponse(
3974 responseInfo);
3975 radioService[slotId]->checkReturnStatus(retStatus);
3976 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003977 RLOGE("sendDtmfResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003978 slotId);
3979 }
3980
3981 return 0;
3982}
3983
3984SendSmsResult makeSendSmsResult(RadioResponseInfo& responseInfo, int serial, int responseType,
3985 RIL_Errno e, void *response, size_t responseLen) {
3986 populateResponseInfo(responseInfo, serial, responseType, e);
Jack Yuf68e0da2017-02-07 14:53:09 -08003987 SendSmsResult result = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003988
3989 if (response == NULL || responseLen != sizeof(RIL_SMS_Response)) {
3990 RLOGE("Invalid response: NULL");
3991 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003992 result.ackPDU = hidl_string();
3993 } else {
3994 RIL_SMS_Response *resp = (RIL_SMS_Response *) response;
3995 result.messageRef = resp->messageRef;
3996 result.ackPDU = convertCharPtrToHidlString(resp->ackPDU);
3997 result.errorCode = resp->errorCode;
3998 }
3999 return result;
4000}
4001
Amit Mahajan759786a2017-03-03 17:35:47 -08004002int radio::sendSmsResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004003 int responseType, int serial, RIL_Errno e, void *response,
4004 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004005#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004006 RLOGD("sendSmsResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004007#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004008
4009 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004010 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004011 SendSmsResult result = makeSendSmsResult(responseInfo, serial, responseType, e, response,
4012 responseLen);
4013
4014 Return<void> retStatus = radioService[slotId]->mRadioResponse->sendSmsResponse(responseInfo,
4015 result);
4016 radioService[slotId]->checkReturnStatus(retStatus);
4017 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004018 RLOGE("sendSmsResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004019 }
4020
4021 return 0;
4022}
4023
Amit Mahajan759786a2017-03-03 17:35:47 -08004024int radio::sendSMSExpectMoreResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004025 int responseType, int serial, RIL_Errno e, void *response,
4026 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004027#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004028 RLOGD("sendSMSExpectMoreResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004029#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004030
4031 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004032 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004033 SendSmsResult result = makeSendSmsResult(responseInfo, serial, responseType, e, response,
4034 responseLen);
4035
4036 Return<void> retStatus = radioService[slotId]->mRadioResponse->sendSMSExpectMoreResponse(
4037 responseInfo, result);
4038 radioService[slotId]->checkReturnStatus(retStatus);
4039 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004040 RLOGE("sendSMSExpectMoreResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004041 }
4042
4043 return 0;
4044}
4045
Amit Mahajan759786a2017-03-03 17:35:47 -08004046int radio::setupDataCallResponse(int slotId,
Amit Mahajan3df62912017-02-10 01:35:55 +00004047 int responseType, int serial, RIL_Errno e, void *response,
4048 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004049#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004050 RLOGD("setupDataCallResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004051#endif
Amit Mahajan3df62912017-02-10 01:35:55 +00004052
4053 if (radioService[slotId]->mRadioResponse != NULL) {
Amit Mahajan3da9ac02017-02-13 13:41:28 -08004054 RadioResponseInfo responseInfo = {};
Amit Mahajan3df62912017-02-10 01:35:55 +00004055 populateResponseInfo(responseInfo, serial, responseType, e);
4056
Amit Mahajan3da9ac02017-02-13 13:41:28 -08004057 SetupDataCallResult result = {};
Amit Mahajan13058cb2017-06-07 23:10:27 -07004058 if (response == NULL || (responseLen % sizeof(RIL_Data_Call_Response_v11)) != 0) {
4059 if (response != NULL) {
4060 RLOGE("setupDataCallResponse: Invalid response");
4061 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
4062 }
Jack Yu5079e182017-02-28 15:21:18 -08004063 result.status = DataCallFailCause::ERROR_UNSPECIFIED;
Amit Mahajan3da9ac02017-02-13 13:41:28 -08004064 result.type = hidl_string();
4065 result.ifname = hidl_string();
4066 result.addresses = hidl_string();
4067 result.dnses = hidl_string();
4068 result.gateways = hidl_string();
4069 result.pcscf = hidl_string();
Amit Mahajan3df62912017-02-10 01:35:55 +00004070 } else {
4071 convertRilDataCallToHal((RIL_Data_Call_Response_v11 *) response, result);
4072 }
4073
4074 Return<void> retStatus = radioService[slotId]->mRadioResponse->setupDataCallResponse(
4075 responseInfo, result);
4076 radioService[slotId]->checkReturnStatus(retStatus);
4077 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004078 RLOGE("setupDataCallResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Amit Mahajan3df62912017-02-10 01:35:55 +00004079 }
4080
4081 return 0;
4082}
4083
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004084IccIoResult responseIccIo(RadioResponseInfo& responseInfo, int serial, int responseType,
4085 RIL_Errno e, void *response, size_t responseLen) {
4086 populateResponseInfo(responseInfo, serial, responseType, e);
Jack Yuf68e0da2017-02-07 14:53:09 -08004087 IccIoResult result = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004088
4089 if (response == NULL || responseLen != sizeof(RIL_SIM_IO_Response)) {
4090 RLOGE("Invalid response: NULL");
4091 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004092 result.simResponse = hidl_string();
4093 } else {
4094 RIL_SIM_IO_Response *resp = (RIL_SIM_IO_Response *) response;
4095 result.sw1 = resp->sw1;
4096 result.sw2 = resp->sw2;
4097 result.simResponse = convertCharPtrToHidlString(resp->simResponse);
4098 }
4099 return result;
4100}
4101
Amit Mahajan759786a2017-03-03 17:35:47 -08004102int radio::iccIOForAppResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004103 int responseType, int serial, RIL_Errno e, void *response,
4104 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004105#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004106 RLOGD("iccIOForAppResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004107#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004108
4109 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004110 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004111 IccIoResult result = responseIccIo(responseInfo, serial, responseType, e, response,
4112 responseLen);
4113
4114 Return<void> retStatus = radioService[slotId]->mRadioResponse->iccIOForAppResponse(
4115 responseInfo, result);
4116 radioService[slotId]->checkReturnStatus(retStatus);
4117 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004118 RLOGE("iccIOForAppResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004119 }
4120
4121 return 0;
4122}
4123
Amit Mahajan759786a2017-03-03 17:35:47 -08004124int radio::sendUssdResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004125 int responseType, int serial, RIL_Errno e, void *response,
4126 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004127#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004128 RLOGD("sendUssdResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004129#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004130
4131 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004132 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004133 populateResponseInfo(responseInfo, serial, responseType, e);
4134 Return<void> retStatus = radioService[slotId]->mRadioResponse->sendUssdResponse(
4135 responseInfo);
4136 radioService[slotId]->checkReturnStatus(retStatus);
4137 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004138 RLOGE("sendUssdResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004139 slotId);
4140 }
4141
4142 return 0;
4143}
4144
Amit Mahajan759786a2017-03-03 17:35:47 -08004145int radio::cancelPendingUssdResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004146 int responseType, int serial, RIL_Errno e, void *response,
4147 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004148#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004149 RLOGD("cancelPendingUssdResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004150#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004151
4152 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004153 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004154 populateResponseInfo(responseInfo, serial, responseType, e);
4155 Return<void> retStatus = radioService[slotId]->mRadioResponse->cancelPendingUssdResponse(
4156 responseInfo);
4157 radioService[slotId]->checkReturnStatus(retStatus);
4158 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004159 RLOGE("cancelPendingUssdResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004160 slotId);
4161 }
4162
4163 return 0;
4164}
4165
Amit Mahajan759786a2017-03-03 17:35:47 -08004166int radio::getClirResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004167 int responseType, int serial, RIL_Errno e, void *response,
4168 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004169#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004170 RLOGD("getClirResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004171#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004172
4173 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004174 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004175 populateResponseInfo(responseInfo, serial, responseType, e);
4176 int n = -1, m = -1;
4177 int numInts = responseLen / sizeof(int);
4178 if (response == NULL || numInts != 2) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004179 RLOGE("getClirResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004180 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
4181 } else {
4182 int *pInt = (int *) response;
4183 n = pInt[0];
4184 m = pInt[1];
4185 }
4186 Return<void> retStatus = radioService[slotId]->mRadioResponse->getClirResponse(responseInfo,
4187 n, m);
4188 radioService[slotId]->checkReturnStatus(retStatus);
4189 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004190 RLOGE("getClirResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004191 }
4192
4193 return 0;
4194}
4195
Amit Mahajan759786a2017-03-03 17:35:47 -08004196int radio::setClirResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004197 int responseType, int serial, RIL_Errno e, void *response,
4198 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004199#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004200 RLOGD("setClirResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004201#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004202
4203 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004204 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004205 populateResponseInfo(responseInfo, serial, responseType, e);
4206 Return<void> retStatus = radioService[slotId]->mRadioResponse->setClirResponse(
4207 responseInfo);
4208 radioService[slotId]->checkReturnStatus(retStatus);
4209 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004210 RLOGE("setClirResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004211 }
4212
4213 return 0;
4214}
4215
Amit Mahajan759786a2017-03-03 17:35:47 -08004216int radio::getCallForwardStatusResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004217 int responseType, int serial, RIL_Errno e,
4218 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004219#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004220 RLOGD("getCallForwardStatusResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004221#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004222
4223 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004224 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004225 populateResponseInfo(responseInfo, serial, responseType, e);
4226 hidl_vec<CallForwardInfo> callForwardInfos;
4227
Amit Mahajan13058cb2017-06-07 23:10:27 -07004228 if ((response == NULL && responseLen != 0)
4229 || responseLen % sizeof(RIL_CallForwardInfo *) != 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004230 RLOGE("getCallForwardStatusResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004231 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
4232 } else {
4233 int num = responseLen / sizeof(RIL_CallForwardInfo *);
4234 callForwardInfos.resize(num);
4235 for (int i = 0 ; i < num; i++) {
4236 RIL_CallForwardInfo *resp = ((RIL_CallForwardInfo **) response)[i];
4237 callForwardInfos[i].status = (CallForwardInfoStatus) resp->status;
4238 callForwardInfos[i].reason = resp->reason;
4239 callForwardInfos[i].serviceClass = resp->serviceClass;
4240 callForwardInfos[i].toa = resp->toa;
4241 callForwardInfos[i].number = convertCharPtrToHidlString(resp->number);
4242 callForwardInfos[i].timeSeconds = resp->timeSeconds;
4243 }
4244 }
4245
4246 Return<void> retStatus = radioService[slotId]->mRadioResponse->getCallForwardStatusResponse(
4247 responseInfo, callForwardInfos);
4248 radioService[slotId]->checkReturnStatus(retStatus);
4249 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004250 RLOGE("getCallForwardStatusResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004251 slotId);
4252 }
4253
4254 return 0;
4255}
4256
Amit Mahajan759786a2017-03-03 17:35:47 -08004257int radio::setCallForwardResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004258 int responseType, int serial, RIL_Errno e, void *response,
4259 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004260#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004261 RLOGD("setCallForwardResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004262#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004263
4264 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004265 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004266 populateResponseInfo(responseInfo, serial, responseType, e);
4267 Return<void> retStatus = radioService[slotId]->mRadioResponse->setCallForwardResponse(
4268 responseInfo);
4269 radioService[slotId]->checkReturnStatus(retStatus);
4270 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004271 RLOGE("setCallForwardResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004272 }
4273
4274 return 0;
4275}
4276
Amit Mahajan759786a2017-03-03 17:35:47 -08004277int radio::getCallWaitingResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004278 int responseType, int serial, RIL_Errno e, void *response,
4279 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004280#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004281 RLOGD("getCallWaitingResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004282#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004283
4284 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004285 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004286 populateResponseInfo(responseInfo, serial, responseType, e);
4287 bool enable = false;
4288 int serviceClass = -1;
4289 int numInts = responseLen / sizeof(int);
4290 if (response == NULL || numInts != 2) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004291 RLOGE("getCallWaitingResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004292 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
4293 } else {
4294 int *pInt = (int *) response;
4295 enable = pInt[0] == 1 ? true : false;
4296 serviceClass = pInt[1];
4297 }
Sanket Padawe5375bfa2017-03-07 17:21:05 -08004298 Return<void> retStatus = radioService[slotId]->mRadioResponse->getCallWaitingResponse(
4299 responseInfo, enable, serviceClass);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004300 radioService[slotId]->checkReturnStatus(retStatus);
4301 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004302 RLOGE("getCallWaitingResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004303 }
4304
4305 return 0;
4306}
4307
Amit Mahajan759786a2017-03-03 17:35:47 -08004308int radio::setCallWaitingResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004309 int responseType, int serial, RIL_Errno e, void *response,
4310 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004311#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004312 RLOGD("setCallWaitingResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004313#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004314
4315 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004316 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004317 populateResponseInfo(responseInfo, serial, responseType, e);
4318 Return<void> retStatus = radioService[slotId]->mRadioResponse->setCallWaitingResponse(
4319 responseInfo);
4320 radioService[slotId]->checkReturnStatus(retStatus);
4321 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004322 RLOGE("setCallWaitingResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004323 }
4324
4325 return 0;
4326}
4327
Amit Mahajan759786a2017-03-03 17:35:47 -08004328int radio::acknowledgeLastIncomingGsmSmsResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004329 int responseType, int serial, RIL_Errno e,
4330 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004331#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004332 RLOGD("acknowledgeLastIncomingGsmSmsResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004333#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004334
4335 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004336 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004337 populateResponseInfo(responseInfo, serial, responseType, e);
4338 Return<void> retStatus =
4339 radioService[slotId]->mRadioResponse->acknowledgeLastIncomingGsmSmsResponse(
4340 responseInfo);
4341 radioService[slotId]->checkReturnStatus(retStatus);
4342 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004343 RLOGE("acknowledgeLastIncomingGsmSmsResponse: radioService[%d]->mRadioResponse "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004344 "== NULL", slotId);
4345 }
4346
4347 return 0;
4348}
4349
Amit Mahajan759786a2017-03-03 17:35:47 -08004350int radio::acceptCallResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004351 int responseType, int serial, RIL_Errno e,
4352 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004353#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004354 RLOGD("acceptCallResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004355#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004356
4357 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004358 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004359 populateResponseInfo(responseInfo, serial, responseType, e);
4360 Return<void> retStatus = radioService[slotId]->mRadioResponse->acceptCallResponse(
4361 responseInfo);
4362 radioService[slotId]->checkReturnStatus(retStatus);
4363 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004364 RLOGE("acceptCallResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004365 slotId);
4366 }
4367
4368 return 0;
4369}
4370
Amit Mahajan759786a2017-03-03 17:35:47 -08004371int radio::deactivateDataCallResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004372 int responseType, int serial, RIL_Errno e,
4373 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004374#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004375 RLOGD("deactivateDataCallResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004376#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004377
4378 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004379 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004380 populateResponseInfo(responseInfo, serial, responseType, e);
4381 Return<void> retStatus = radioService[slotId]->mRadioResponse->deactivateDataCallResponse(
4382 responseInfo);
4383 radioService[slotId]->checkReturnStatus(retStatus);
4384 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004385 RLOGE("deactivateDataCallResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004386 slotId);
4387 }
4388
4389 return 0;
4390}
4391
Amit Mahajan759786a2017-03-03 17:35:47 -08004392int radio::getFacilityLockForAppResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004393 int responseType, int serial, RIL_Errno e,
4394 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004395#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004396 RLOGD("getFacilityLockForAppResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004397#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004398
4399 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004400 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004401 int ret = responseInt(responseInfo, serial, responseType, e, response, responseLen);
4402 Return<void> retStatus = radioService[slotId]->mRadioResponse->
4403 getFacilityLockForAppResponse(responseInfo, ret);
4404 radioService[slotId]->checkReturnStatus(retStatus);
4405 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004406 RLOGE("getFacilityLockForAppResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004407 slotId);
4408 }
4409
4410 return 0;
4411}
4412
Amit Mahajan759786a2017-03-03 17:35:47 -08004413int radio::setFacilityLockForAppResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004414 int responseType, int serial, RIL_Errno e,
4415 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004416#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004417 RLOGD("setFacilityLockForAppResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004418#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004419
4420 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004421 RadioResponseInfo responseInfo = {};
Naveen Kalla346bbc02017-03-16 12:55:55 -07004422 int ret = responseIntOrEmpty(responseInfo, serial, responseType, e, response, responseLen);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004423 Return<void> retStatus
4424 = radioService[slotId]->mRadioResponse->setFacilityLockForAppResponse(responseInfo,
4425 ret);
4426 radioService[slotId]->checkReturnStatus(retStatus);
4427 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004428 RLOGE("setFacilityLockForAppResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004429 slotId);
4430 }
4431
4432 return 0;
4433}
4434
Amit Mahajan759786a2017-03-03 17:35:47 -08004435int radio::setBarringPasswordResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004436 int responseType, int serial, RIL_Errno e,
4437 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004438#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004439 RLOGD("acceptCallResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004440#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004441
4442 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004443 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004444 populateResponseInfo(responseInfo, serial, responseType, e);
4445 Return<void> retStatus
4446 = radioService[slotId]->mRadioResponse->setBarringPasswordResponse(responseInfo);
4447 radioService[slotId]->checkReturnStatus(retStatus);
4448 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004449 RLOGE("setBarringPasswordResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004450 slotId);
4451 }
4452
4453 return 0;
4454}
4455
Amit Mahajan759786a2017-03-03 17:35:47 -08004456int radio::getNetworkSelectionModeResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004457 int responseType, int serial, RIL_Errno e, void *response,
4458 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004459#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004460 RLOGD("getNetworkSelectionModeResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004461#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004462
4463 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004464 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004465 populateResponseInfo(responseInfo, serial, responseType, e);
4466 bool manual = false;
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004467 if (response == NULL || responseLen != sizeof(int)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004468 RLOGE("getNetworkSelectionModeResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004469 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
4470 } else {
4471 int *pInt = (int *) response;
4472 manual = pInt[0] == 1 ? true : false;
4473 }
4474 Return<void> retStatus
4475 = radioService[slotId]->mRadioResponse->getNetworkSelectionModeResponse(
4476 responseInfo,
4477 manual);
4478 radioService[slotId]->checkReturnStatus(retStatus);
4479 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004480 RLOGE("getNetworkSelectionModeResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004481 slotId);
4482 }
4483
4484 return 0;
4485}
4486
Amit Mahajan759786a2017-03-03 17:35:47 -08004487int radio::setNetworkSelectionModeAutomaticResponse(int slotId, int responseType, int serial,
4488 RIL_Errno e, void *response,
4489 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004490#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004491 RLOGD("setNetworkSelectionModeAutomaticResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004492#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004493
4494 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004495 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004496 populateResponseInfo(responseInfo, serial, responseType, e);
4497 Return<void> retStatus
4498 = radioService[slotId]->mRadioResponse->setNetworkSelectionModeAutomaticResponse(
4499 responseInfo);
4500 radioService[slotId]->checkReturnStatus(retStatus);
4501 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004502 RLOGE("setNetworkSelectionModeAutomaticResponse: radioService[%d]->mRadioResponse "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004503 "== NULL", slotId);
4504 }
4505
4506 return 0;
4507}
4508
Amit Mahajan759786a2017-03-03 17:35:47 -08004509int radio::setNetworkSelectionModeManualResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004510 int responseType, int serial, RIL_Errno e,
4511 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004512#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004513 RLOGD("setNetworkSelectionModeManualResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004514#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004515
4516 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004517 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004518 populateResponseInfo(responseInfo, serial, responseType, e);
4519 Return<void> retStatus
4520 = radioService[slotId]->mRadioResponse->setNetworkSelectionModeManualResponse(
4521 responseInfo);
4522 radioService[slotId]->checkReturnStatus(retStatus);
4523 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004524 RLOGE("acceptCallResponse: radioService[%d]->setNetworkSelectionModeManualResponse "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004525 "== NULL", slotId);
4526 }
4527
4528 return 0;
4529}
4530
Jack Yuf68e0da2017-02-07 14:53:09 -08004531int convertOperatorStatusToInt(const char *str) {
4532 if (strncmp("unknown", str, 9) == 0) {
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004533 return (int) OperatorStatus::UNKNOWN;
Jack Yuf68e0da2017-02-07 14:53:09 -08004534 } else if (strncmp("available", str, 9) == 0) {
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004535 return (int) OperatorStatus::AVAILABLE;
Jack Yuf68e0da2017-02-07 14:53:09 -08004536 } else if (strncmp("current", str, 9) == 0) {
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004537 return (int) OperatorStatus::CURRENT;
Jack Yuf68e0da2017-02-07 14:53:09 -08004538 } else if (strncmp("forbidden", str, 9) == 0) {
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004539 return (int) OperatorStatus::FORBIDDEN;
4540 } else {
4541 return -1;
4542 }
4543}
4544
Amit Mahajan759786a2017-03-03 17:35:47 -08004545int radio::getAvailableNetworksResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004546 int responseType, int serial, RIL_Errno e, void *response,
4547 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004548#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004549 RLOGD("getAvailableNetworksResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004550#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004551
4552 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004553 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004554 populateResponseInfo(responseInfo, serial, responseType, e);
4555 hidl_vec<OperatorInfo> networks;
Amit Mahajan13058cb2017-06-07 23:10:27 -07004556 if ((response == NULL && responseLen != 0)
4557 || responseLen % (4 * sizeof(char *))!= 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004558 RLOGE("getAvailableNetworksResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004559 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
4560 } else {
4561 char **resp = (char **) response;
4562 int numStrings = responseLen / sizeof(char *);
4563 networks.resize(numStrings/4);
Jayachandran Ce0d755c2017-03-01 18:26:50 -08004564 for (int i = 0, j = 0; i < numStrings; i = i + 4, j++) {
4565 networks[j].alphaLong = convertCharPtrToHidlString(resp[i]);
4566 networks[j].alphaShort = convertCharPtrToHidlString(resp[i + 1]);
4567 networks[j].operatorNumeric = convertCharPtrToHidlString(resp[i + 2]);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004568 int status = convertOperatorStatusToInt(resp[i + 3]);
4569 if (status == -1) {
4570 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
4571 } else {
Jayachandran Ce0d755c2017-03-01 18:26:50 -08004572 networks[j].status = (OperatorStatus) status;
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004573 }
4574 }
4575 }
4576 Return<void> retStatus
4577 = radioService[slotId]->mRadioResponse->getAvailableNetworksResponse(responseInfo,
4578 networks);
4579 radioService[slotId]->checkReturnStatus(retStatus);
4580 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004581 RLOGE("getAvailableNetworksResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004582 slotId);
4583 }
4584
4585 return 0;
4586}
4587
Amit Mahajan759786a2017-03-03 17:35:47 -08004588int radio::startDtmfResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004589 int responseType, int serial, RIL_Errno e,
4590 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004591#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004592 RLOGD("startDtmfResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004593#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004594
4595 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004596 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004597 populateResponseInfo(responseInfo, serial, responseType, e);
4598 Return<void> retStatus
4599 = radioService[slotId]->mRadioResponse->startDtmfResponse(responseInfo);
4600 radioService[slotId]->checkReturnStatus(retStatus);
4601 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004602 RLOGE("startDtmfResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004603 }
4604
4605 return 0;
4606}
4607
Amit Mahajan759786a2017-03-03 17:35:47 -08004608int radio::stopDtmfResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004609 int responseType, int serial, RIL_Errno e,
4610 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004611#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004612 RLOGD("stopDtmfResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004613#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004614
4615 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004616 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004617 populateResponseInfo(responseInfo, serial, responseType, e);
4618 Return<void> retStatus
4619 = radioService[slotId]->mRadioResponse->stopDtmfResponse(responseInfo);
4620 radioService[slotId]->checkReturnStatus(retStatus);
4621 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004622 RLOGE("stopDtmfResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004623 }
4624
4625 return 0;
4626}
4627
Amit Mahajan759786a2017-03-03 17:35:47 -08004628int radio::getBasebandVersionResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004629 int responseType, int serial, RIL_Errno e,
4630 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004631#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004632 RLOGD("getBasebandVersionResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004633#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004634
4635 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004636 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004637 populateResponseInfo(responseInfo, serial, responseType, e);
4638 Return<void> retStatus
4639 = radioService[slotId]->mRadioResponse->getBasebandVersionResponse(responseInfo,
4640 convertCharPtrToHidlString((char *) response));
4641 radioService[slotId]->checkReturnStatus(retStatus);
4642 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004643 RLOGE("getBasebandVersionResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004644 }
4645
4646 return 0;
4647}
4648
Amit Mahajan759786a2017-03-03 17:35:47 -08004649int radio::separateConnectionResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004650 int responseType, int serial, RIL_Errno e,
4651 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004652#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004653 RLOGD("separateConnectionResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004654#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004655
4656 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004657 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004658 populateResponseInfo(responseInfo, serial, responseType, e);
4659 Return<void> retStatus
4660 = radioService[slotId]->mRadioResponse->separateConnectionResponse(responseInfo);
4661 radioService[slotId]->checkReturnStatus(retStatus);
4662 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004663 RLOGE("separateConnectionResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004664 slotId);
4665 }
4666
4667 return 0;
4668}
4669
Amit Mahajan759786a2017-03-03 17:35:47 -08004670int radio::setMuteResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004671 int responseType, int serial, RIL_Errno e,
4672 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004673#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004674 RLOGD("setMuteResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004675#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004676
4677 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004678 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004679 populateResponseInfo(responseInfo, serial, responseType, e);
4680 Return<void> retStatus
4681 = radioService[slotId]->mRadioResponse->setMuteResponse(responseInfo);
4682 radioService[slotId]->checkReturnStatus(retStatus);
4683 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004684 RLOGE("setMuteResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004685 }
4686
4687 return 0;
4688}
4689
Amit Mahajan759786a2017-03-03 17:35:47 -08004690int radio::getMuteResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004691 int responseType, int serial, RIL_Errno e, void *response,
4692 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004693#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004694 RLOGD("getMuteResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004695#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004696
4697 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004698 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004699 populateResponseInfo(responseInfo, serial, responseType, e);
4700 bool enable = false;
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004701 if (response == NULL || responseLen != sizeof(int)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004702 RLOGE("getMuteResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004703 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
4704 } else {
4705 int *pInt = (int *) response;
4706 enable = pInt[0] == 1 ? true : false;
4707 }
4708 Return<void> retStatus = radioService[slotId]->mRadioResponse->getMuteResponse(responseInfo,
4709 enable);
4710 radioService[slotId]->checkReturnStatus(retStatus);
4711 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004712 RLOGE("getMuteResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004713 }
4714
4715 return 0;
4716}
4717
Amit Mahajan759786a2017-03-03 17:35:47 -08004718int radio::getClipResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004719 int responseType, int serial, RIL_Errno e,
4720 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004721#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004722 RLOGD("getClipResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004723#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004724
4725 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004726 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004727 int ret = responseInt(responseInfo, serial, responseType, e, response, responseLen);
4728 Return<void> retStatus = radioService[slotId]->mRadioResponse->getClipResponse(responseInfo,
4729 (ClipStatus) ret);
4730 radioService[slotId]->checkReturnStatus(retStatus);
4731 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004732 RLOGE("getClipResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004733 }
4734
4735 return 0;
4736}
4737
Amit Mahajan759786a2017-03-03 17:35:47 -08004738int radio::getDataCallListResponse(int slotId,
Amit Mahajan3df62912017-02-10 01:35:55 +00004739 int responseType, int serial, RIL_Errno e,
4740 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004741#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004742 RLOGD("getDataCallListResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004743#endif
Amit Mahajan3df62912017-02-10 01:35:55 +00004744
4745 if (radioService[slotId]->mRadioResponse != NULL) {
Amit Mahajan3da9ac02017-02-13 13:41:28 -08004746 RadioResponseInfo responseInfo = {};
Amit Mahajan3df62912017-02-10 01:35:55 +00004747 populateResponseInfo(responseInfo, serial, responseType, e);
4748
4749 hidl_vec<SetupDataCallResult> ret;
Amit Mahajan13058cb2017-06-07 23:10:27 -07004750 if ((response == NULL && responseLen != 0)
4751 || responseLen % sizeof(RIL_Data_Call_Response_v11) != 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004752 RLOGE("getDataCallListResponse: invalid response");
Amit Mahajan3df62912017-02-10 01:35:55 +00004753 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
4754 } else {
4755 convertRilDataCallListToHal(response, responseLen, ret);
4756 }
4757
4758 Return<void> retStatus = radioService[slotId]->mRadioResponse->getDataCallListResponse(
4759 responseInfo, ret);
4760 radioService[slotId]->checkReturnStatus(retStatus);
4761 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004762 RLOGE("getDataCallListResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Amit Mahajan3df62912017-02-10 01:35:55 +00004763 }
4764
4765 return 0;
4766}
4767
Amit Mahajan759786a2017-03-03 17:35:47 -08004768int radio::setSuppServiceNotificationsResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004769 int responseType, int serial, RIL_Errno e,
4770 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004771#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004772 RLOGD("setSuppServiceNotificationsResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004773#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004774
4775 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004776 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004777 populateResponseInfo(responseInfo, serial, responseType, e);
4778 Return<void> retStatus
4779 = radioService[slotId]->mRadioResponse->setSuppServiceNotificationsResponse(
4780 responseInfo);
4781 radioService[slotId]->checkReturnStatus(retStatus);
4782 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004783 RLOGE("setSuppServiceNotificationsResponse: radioService[%d]->mRadioResponse "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004784 "== NULL", slotId);
4785 }
4786
4787 return 0;
4788}
4789
Amit Mahajan759786a2017-03-03 17:35:47 -08004790int radio::deleteSmsOnSimResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004791 int responseType, int serial, RIL_Errno e,
4792 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004793#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004794 RLOGD("deleteSmsOnSimResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004795#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004796
4797 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004798 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004799 populateResponseInfo(responseInfo, serial, responseType, e);
4800 Return<void> retStatus
4801 = radioService[slotId]->mRadioResponse->deleteSmsOnSimResponse(responseInfo);
4802 radioService[slotId]->checkReturnStatus(retStatus);
4803 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004804 RLOGE("deleteSmsOnSimResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004805 }
4806
4807 return 0;
4808}
4809
Amit Mahajan759786a2017-03-03 17:35:47 -08004810int radio::setBandModeResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004811 int responseType, int serial, RIL_Errno e,
4812 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004813#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004814 RLOGD("setBandModeResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004815#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004816
4817 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004818 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004819 populateResponseInfo(responseInfo, serial, responseType, e);
4820 Return<void> retStatus
4821 = radioService[slotId]->mRadioResponse->setBandModeResponse(responseInfo);
4822 radioService[slotId]->checkReturnStatus(retStatus);
4823 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004824 RLOGE("setBandModeResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004825 }
4826
4827 return 0;
4828}
4829
Amit Mahajan759786a2017-03-03 17:35:47 -08004830int radio::writeSmsToSimResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004831 int responseType, int serial, RIL_Errno e,
4832 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004833#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004834 RLOGD("writeSmsToSimResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004835#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004836
4837 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004838 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004839 int ret = responseInt(responseInfo, serial, responseType, e, response, responseLen);
4840 Return<void> retStatus
4841 = radioService[slotId]->mRadioResponse->writeSmsToSimResponse(responseInfo, ret);
4842 radioService[slotId]->checkReturnStatus(retStatus);
4843 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004844 RLOGE("writeSmsToSimResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004845 }
4846
4847 return 0;
4848}
4849
Amit Mahajan759786a2017-03-03 17:35:47 -08004850int radio::getAvailableBandModesResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004851 int responseType, int serial, RIL_Errno e, void *response,
4852 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004853#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004854 RLOGD("getAvailableBandModesResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004855#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004856
4857 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004858 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004859 populateResponseInfo(responseInfo, serial, responseType, e);
4860 hidl_vec<RadioBandMode> modes;
Amit Mahajan13058cb2017-06-07 23:10:27 -07004861 if ((response == NULL && responseLen != 0)|| responseLen % sizeof(int) != 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004862 RLOGE("getAvailableBandModesResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004863 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
4864 } else {
4865 int *pInt = (int *) response;
4866 int numInts = responseLen / sizeof(int);
4867 modes.resize(numInts);
4868 for (int i = 0; i < numInts; i++) {
4869 modes[i] = (RadioBandMode) pInt[i];
4870 }
4871 }
4872 Return<void> retStatus
4873 = radioService[slotId]->mRadioResponse->getAvailableBandModesResponse(responseInfo,
4874 modes);
4875 radioService[slotId]->checkReturnStatus(retStatus);
4876 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004877 RLOGE("getAvailableBandModesResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004878 slotId);
4879 }
4880
4881 return 0;
4882}
4883
Amit Mahajan759786a2017-03-03 17:35:47 -08004884int radio::sendEnvelopeResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004885 int responseType, int serial, RIL_Errno e,
4886 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004887#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004888 RLOGD("sendEnvelopeResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004889#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004890
4891 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004892 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004893 populateResponseInfo(responseInfo, serial, responseType, e);
4894 Return<void> retStatus
4895 = radioService[slotId]->mRadioResponse->sendEnvelopeResponse(responseInfo,
4896 convertCharPtrToHidlString((char *) response));
4897 radioService[slotId]->checkReturnStatus(retStatus);
4898 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004899 RLOGE("sendEnvelopeResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004900 }
4901
4902 return 0;
4903}
4904
Amit Mahajan759786a2017-03-03 17:35:47 -08004905int radio::sendTerminalResponseToSimResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004906 int responseType, int serial, RIL_Errno e,
4907 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004908#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004909 RLOGD("sendTerminalResponseToSimResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004910#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004911
4912 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004913 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004914 populateResponseInfo(responseInfo, serial, responseType, e);
4915 Return<void> retStatus
4916 = radioService[slotId]->mRadioResponse->sendTerminalResponseToSimResponse(
4917 responseInfo);
4918 radioService[slotId]->checkReturnStatus(retStatus);
4919 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004920 RLOGE("sendTerminalResponseToSimResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004921 slotId);
4922 }
4923
4924 return 0;
4925}
4926
Amit Mahajan759786a2017-03-03 17:35:47 -08004927int radio::handleStkCallSetupRequestFromSimResponse(int slotId,
4928 int responseType, int serial,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004929 RIL_Errno e, void *response,
4930 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004931#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004932 RLOGD("handleStkCallSetupRequestFromSimResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004933#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004934
4935 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004936 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004937 populateResponseInfo(responseInfo, serial, responseType, e);
4938 Return<void> retStatus
4939 = radioService[slotId]->mRadioResponse->handleStkCallSetupRequestFromSimResponse(
4940 responseInfo);
4941 radioService[slotId]->checkReturnStatus(retStatus);
4942 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004943 RLOGE("handleStkCallSetupRequestFromSimResponse: radioService[%d]->mRadioResponse "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004944 "== NULL", slotId);
4945 }
4946
4947 return 0;
4948}
4949
Amit Mahajan759786a2017-03-03 17:35:47 -08004950int radio::explicitCallTransferResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004951 int responseType, int serial, RIL_Errno e,
4952 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004953#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004954 RLOGD("explicitCallTransferResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004955#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004956
4957 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004958 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004959 populateResponseInfo(responseInfo, serial, responseType, e);
4960 Return<void> retStatus
4961 = radioService[slotId]->mRadioResponse->explicitCallTransferResponse(responseInfo);
4962 radioService[slotId]->checkReturnStatus(retStatus);
4963 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004964 RLOGE("explicitCallTransferResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004965 slotId);
4966 }
4967
4968 return 0;
4969}
4970
Amit Mahajan759786a2017-03-03 17:35:47 -08004971int radio::setPreferredNetworkTypeResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004972 int responseType, int serial, RIL_Errno e,
4973 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004974#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004975 RLOGD("setPreferredNetworkTypeResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004976#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004977
4978 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004979 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004980 populateResponseInfo(responseInfo, serial, responseType, e);
4981 Return<void> retStatus
4982 = radioService[slotId]->mRadioResponse->setPreferredNetworkTypeResponse(
4983 responseInfo);
4984 radioService[slotId]->checkReturnStatus(retStatus);
4985 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004986 RLOGE("setPreferredNetworkTypeResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004987 slotId);
4988 }
4989
4990 return 0;
4991}
4992
4993
Amit Mahajan759786a2017-03-03 17:35:47 -08004994int radio::getPreferredNetworkTypeResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004995 int responseType, int serial, RIL_Errno e,
4996 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004997#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004998 RLOGD("getPreferredNetworkTypeResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004999#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005000
5001 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005002 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005003 int ret = responseInt(responseInfo, serial, responseType, e, response, responseLen);
5004 Return<void> retStatus
5005 = radioService[slotId]->mRadioResponse->getPreferredNetworkTypeResponse(
5006 responseInfo, (PreferredNetworkType) ret);
5007 radioService[slotId]->checkReturnStatus(retStatus);
5008 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005009 RLOGE("getPreferredNetworkTypeResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005010 slotId);
5011 }
5012
5013 return 0;
5014}
5015
Amit Mahajan759786a2017-03-03 17:35:47 -08005016int radio::getNeighboringCidsResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005017 int responseType, int serial, RIL_Errno e,
5018 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005019#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005020 RLOGD("getNeighboringCidsResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005021#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005022
5023 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005024 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005025 populateResponseInfo(responseInfo, serial, responseType, e);
5026 hidl_vec<NeighboringCell> cells;
5027
Amit Mahajan13058cb2017-06-07 23:10:27 -07005028 if ((response == NULL && responseLen != 0)
5029 || responseLen % sizeof(RIL_NeighboringCell *) != 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005030 RLOGE("getNeighboringCidsResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005031 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
5032 } else {
5033 int num = responseLen / sizeof(RIL_NeighboringCell *);
5034 cells.resize(num);
5035 for (int i = 0 ; i < num; i++) {
5036 RIL_NeighboringCell *resp = ((RIL_NeighboringCell **) response)[i];
5037 cells[i].cid = convertCharPtrToHidlString(resp->cid);
5038 cells[i].rssi = resp->rssi;
5039 }
5040 }
5041
5042 Return<void> retStatus
5043 = radioService[slotId]->mRadioResponse->getNeighboringCidsResponse(responseInfo,
5044 cells);
5045 radioService[slotId]->checkReturnStatus(retStatus);
5046 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005047 RLOGE("getNeighboringCidsResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005048 slotId);
5049 }
5050
5051 return 0;
5052}
5053
Amit Mahajan759786a2017-03-03 17:35:47 -08005054int radio::setLocationUpdatesResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005055 int responseType, int serial, RIL_Errno e,
5056 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005057#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005058 RLOGD("setLocationUpdatesResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005059#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005060
5061 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005062 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005063 populateResponseInfo(responseInfo, serial, responseType, e);
5064 Return<void> retStatus
5065 = radioService[slotId]->mRadioResponse->setLocationUpdatesResponse(responseInfo);
5066 radioService[slotId]->checkReturnStatus(retStatus);
5067 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005068 RLOGE("setLocationUpdatesResponse: 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::setCdmaSubscriptionSourceResponse(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("setCdmaSubscriptionSourceResponse: 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 Return<void> retStatus
5086 = radioService[slotId]->mRadioResponse->setCdmaSubscriptionSourceResponse(
5087 responseInfo);
5088 radioService[slotId]->checkReturnStatus(retStatus);
5089 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005090 RLOGE("setCdmaSubscriptionSourceResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005091 slotId);
5092 }
5093
5094 return 0;
5095}
5096
Amit Mahajan759786a2017-03-03 17:35:47 -08005097int radio::setCdmaRoamingPreferenceResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005098 int responseType, int serial, RIL_Errno e,
5099 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005100#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005101 RLOGD("setCdmaRoamingPreferenceResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005102#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005103
5104 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005105 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005106 populateResponseInfo(responseInfo, serial, responseType, e);
5107 Return<void> retStatus
5108 = radioService[slotId]->mRadioResponse->setCdmaRoamingPreferenceResponse(
5109 responseInfo);
5110 radioService[slotId]->checkReturnStatus(retStatus);
5111 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005112 RLOGE("setCdmaRoamingPreferenceResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005113 slotId);
5114 }
5115
5116 return 0;
5117}
5118
Amit Mahajan759786a2017-03-03 17:35:47 -08005119int radio::getCdmaRoamingPreferenceResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005120 int responseType, int serial, RIL_Errno e,
5121 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005122#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005123 RLOGD("getCdmaRoamingPreferenceResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005124#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005125
5126 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005127 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005128 int ret = responseInt(responseInfo, serial, responseType, e, response, responseLen);
5129 Return<void> retStatus
5130 = radioService[slotId]->mRadioResponse->getCdmaRoamingPreferenceResponse(
5131 responseInfo, (CdmaRoamingType) ret);
5132 radioService[slotId]->checkReturnStatus(retStatus);
5133 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005134 RLOGE("getCdmaRoamingPreferenceResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005135 slotId);
5136 }
5137
5138 return 0;
5139}
5140
Amit Mahajan759786a2017-03-03 17:35:47 -08005141int radio::setTTYModeResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005142 int responseType, int serial, RIL_Errno e,
5143 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005144#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005145 RLOGD("setTTYModeResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005146#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005147
5148 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005149 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005150 populateResponseInfo(responseInfo, serial, responseType, e);
5151 Return<void> retStatus
5152 = radioService[slotId]->mRadioResponse->setTTYModeResponse(responseInfo);
5153 radioService[slotId]->checkReturnStatus(retStatus);
5154 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005155 RLOGE("setTTYModeResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005156 }
5157
5158 return 0;
5159}
5160
Amit Mahajan759786a2017-03-03 17:35:47 -08005161int radio::getTTYModeResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005162 int responseType, int serial, RIL_Errno e,
5163 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005164#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005165 RLOGD("getTTYModeResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005166#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005167
5168 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005169 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005170 int ret = responseInt(responseInfo, serial, responseType, e, response, responseLen);
5171 Return<void> retStatus
5172 = radioService[slotId]->mRadioResponse->getTTYModeResponse(responseInfo,
5173 (TtyMode) ret);
5174 radioService[slotId]->checkReturnStatus(retStatus);
5175 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005176 RLOGE("getTTYModeResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005177 }
5178
5179 return 0;
5180}
5181
Amit Mahajan759786a2017-03-03 17:35:47 -08005182int radio::setPreferredVoicePrivacyResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005183 int responseType, int serial, RIL_Errno e,
5184 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005185#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005186 RLOGD("setPreferredVoicePrivacyResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005187#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005188
5189 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005190 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005191 populateResponseInfo(responseInfo, serial, responseType, e);
5192 Return<void> retStatus
5193 = radioService[slotId]->mRadioResponse->setPreferredVoicePrivacyResponse(
5194 responseInfo);
5195 radioService[slotId]->checkReturnStatus(retStatus);
5196 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005197 RLOGE("setPreferredVoicePrivacyResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005198 slotId);
5199 }
5200
5201 return 0;
5202}
5203
Amit Mahajan759786a2017-03-03 17:35:47 -08005204int radio::getPreferredVoicePrivacyResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005205 int responseType, int serial, RIL_Errno e,
5206 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005207#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005208 RLOGD("getPreferredVoicePrivacyResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005209#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005210
5211 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005212 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005213 populateResponseInfo(responseInfo, serial, responseType, e);
5214 bool enable = false;
5215 int numInts = responseLen / sizeof(int);
5216 if (response == NULL || numInts != 1) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005217 RLOGE("getPreferredVoicePrivacyResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005218 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
5219 } else {
5220 int *pInt = (int *) response;
5221 enable = pInt[0] == 1 ? true : false;
5222 }
5223 Return<void> retStatus
5224 = radioService[slotId]->mRadioResponse->getPreferredVoicePrivacyResponse(
5225 responseInfo, enable);
5226 radioService[slotId]->checkReturnStatus(retStatus);
5227 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005228 RLOGE("getPreferredVoicePrivacyResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005229 slotId);
5230 }
5231
5232 return 0;
5233}
5234
Amit Mahajan759786a2017-03-03 17:35:47 -08005235int radio::sendCDMAFeatureCodeResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005236 int responseType, int serial, RIL_Errno e,
5237 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005238#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005239 RLOGD("sendCDMAFeatureCodeResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005240#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005241
5242 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005243 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005244 populateResponseInfo(responseInfo, serial, responseType, e);
5245 Return<void> retStatus
5246 = radioService[slotId]->mRadioResponse->sendCDMAFeatureCodeResponse(responseInfo);
5247 radioService[slotId]->checkReturnStatus(retStatus);
5248 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005249 RLOGE("sendCDMAFeatureCodeResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005250 slotId);
5251 }
5252
5253 return 0;
5254}
5255
Amit Mahajan759786a2017-03-03 17:35:47 -08005256int radio::sendBurstDtmfResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005257 int responseType, int serial, RIL_Errno e,
5258 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005259#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005260 RLOGD("sendBurstDtmfResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005261#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005262
5263 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005264 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005265 populateResponseInfo(responseInfo, serial, responseType, e);
5266 Return<void> retStatus
5267 = radioService[slotId]->mRadioResponse->sendBurstDtmfResponse(responseInfo);
5268 radioService[slotId]->checkReturnStatus(retStatus);
5269 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005270 RLOGE("sendBurstDtmfResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005271 }
5272
5273 return 0;
5274}
5275
Amit Mahajan759786a2017-03-03 17:35:47 -08005276int radio::sendCdmaSmsResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005277 int responseType, int serial, RIL_Errno e, void *response,
5278 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005279#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005280 RLOGD("sendCdmaSmsResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005281#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005282
5283 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005284 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005285 SendSmsResult result = makeSendSmsResult(responseInfo, serial, responseType, e, response,
5286 responseLen);
5287
5288 Return<void> retStatus
5289 = radioService[slotId]->mRadioResponse->sendCdmaSmsResponse(responseInfo, result);
5290 radioService[slotId]->checkReturnStatus(retStatus);
5291 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005292 RLOGE("sendCdmaSmsResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005293 }
5294
5295 return 0;
5296}
5297
Amit Mahajan759786a2017-03-03 17:35:47 -08005298int radio::acknowledgeLastIncomingCdmaSmsResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005299 int responseType, int serial, RIL_Errno e,
5300 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005301#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005302 RLOGD("acknowledgeLastIncomingCdmaSmsResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005303#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005304
5305 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005306 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005307 populateResponseInfo(responseInfo, serial, responseType, e);
5308 Return<void> retStatus
5309 = radioService[slotId]->mRadioResponse->acknowledgeLastIncomingCdmaSmsResponse(
5310 responseInfo);
5311 radioService[slotId]->checkReturnStatus(retStatus);
5312 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005313 RLOGE("acknowledgeLastIncomingCdmaSmsResponse: radioService[%d]->mRadioResponse "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005314 "== NULL", slotId);
5315 }
5316
5317 return 0;
5318}
5319
Amit Mahajan759786a2017-03-03 17:35:47 -08005320int radio::getGsmBroadcastConfigResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005321 int responseType, int serial, RIL_Errno e,
5322 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005323#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005324 RLOGD("getGsmBroadcastConfigResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005325#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005326
5327 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005328 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005329 populateResponseInfo(responseInfo, serial, responseType, e);
5330 hidl_vec<GsmBroadcastSmsConfigInfo> configs;
5331
Amit Mahajan13058cb2017-06-07 23:10:27 -07005332 if ((response == NULL && responseLen != 0)
5333 || responseLen % sizeof(RIL_GSM_BroadcastSmsConfigInfo *) != 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005334 RLOGE("getGsmBroadcastConfigResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005335 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
5336 } else {
5337 int num = responseLen / sizeof(RIL_GSM_BroadcastSmsConfigInfo *);
5338 configs.resize(num);
5339 for (int i = 0 ; i < num; i++) {
5340 RIL_GSM_BroadcastSmsConfigInfo *resp =
5341 ((RIL_GSM_BroadcastSmsConfigInfo **) response)[i];
5342 configs[i].fromServiceId = resp->fromServiceId;
5343 configs[i].toServiceId = resp->toServiceId;
5344 configs[i].fromCodeScheme = resp->fromCodeScheme;
5345 configs[i].toCodeScheme = resp->toCodeScheme;
5346 configs[i].selected = resp->selected == 1 ? true : false;
5347 }
5348 }
5349
5350 Return<void> retStatus
5351 = radioService[slotId]->mRadioResponse->getGsmBroadcastConfigResponse(responseInfo,
5352 configs);
5353 radioService[slotId]->checkReturnStatus(retStatus);
5354 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005355 RLOGE("getGsmBroadcastConfigResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005356 slotId);
5357 }
5358
5359 return 0;
5360}
5361
Amit Mahajan759786a2017-03-03 17:35:47 -08005362int radio::setGsmBroadcastConfigResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005363 int responseType, int serial, RIL_Errno e,
5364 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005365#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005366 RLOGD("setGsmBroadcastConfigResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005367#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005368
5369 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005370 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005371 populateResponseInfo(responseInfo, serial, responseType, e);
5372 Return<void> retStatus
5373 = radioService[slotId]->mRadioResponse->setGsmBroadcastConfigResponse(responseInfo);
5374 radioService[slotId]->checkReturnStatus(retStatus);
5375 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005376 RLOGE("setGsmBroadcastConfigResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005377 slotId);
5378 }
5379
5380 return 0;
5381}
5382
Amit Mahajan759786a2017-03-03 17:35:47 -08005383int radio::setGsmBroadcastActivationResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005384 int responseType, int serial, RIL_Errno e,
5385 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005386#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005387 RLOGD("setGsmBroadcastActivationResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005388#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005389
5390 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005391 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005392 populateResponseInfo(responseInfo, serial, responseType, e);
5393 Return<void> retStatus
5394 = radioService[slotId]->mRadioResponse->setGsmBroadcastActivationResponse(
5395 responseInfo);
5396 radioService[slotId]->checkReturnStatus(retStatus);
5397 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005398 RLOGE("setGsmBroadcastActivationResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005399 slotId);
5400 }
5401
5402 return 0;
5403}
5404
Amit Mahajan759786a2017-03-03 17:35:47 -08005405int radio::getCdmaBroadcastConfigResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005406 int responseType, int serial, RIL_Errno e,
5407 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005408#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005409 RLOGD("getCdmaBroadcastConfigResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005410#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005411
5412 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005413 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005414 populateResponseInfo(responseInfo, serial, responseType, e);
5415 hidl_vec<CdmaBroadcastSmsConfigInfo> configs;
5416
Amit Mahajan13058cb2017-06-07 23:10:27 -07005417 if ((response == NULL && responseLen != 0)
5418 || responseLen % sizeof(RIL_CDMA_BroadcastSmsConfigInfo *) != 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005419 RLOGE("getCdmaBroadcastConfigResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005420 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
5421 } else {
5422 int num = responseLen / sizeof(RIL_CDMA_BroadcastSmsConfigInfo *);
5423 configs.resize(num);
5424 for (int i = 0 ; i < num; i++) {
5425 RIL_CDMA_BroadcastSmsConfigInfo *resp =
5426 ((RIL_CDMA_BroadcastSmsConfigInfo **) response)[i];
5427 configs[i].serviceCategory = resp->service_category;
5428 configs[i].language = resp->language;
5429 configs[i].selected = resp->selected == 1 ? true : false;
5430 }
5431 }
5432
5433 Return<void> retStatus
5434 = radioService[slotId]->mRadioResponse->getCdmaBroadcastConfigResponse(responseInfo,
5435 configs);
5436 radioService[slotId]->checkReturnStatus(retStatus);
5437 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005438 RLOGE("getCdmaBroadcastConfigResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005439 slotId);
5440 }
5441
5442 return 0;
5443}
5444
Amit Mahajan759786a2017-03-03 17:35:47 -08005445int radio::setCdmaBroadcastConfigResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005446 int responseType, int serial, RIL_Errno e,
5447 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005448#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005449 RLOGD("setCdmaBroadcastConfigResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005450#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005451
5452 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005453 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005454 populateResponseInfo(responseInfo, serial, responseType, e);
5455 Return<void> retStatus
5456 = radioService[slotId]->mRadioResponse->setCdmaBroadcastConfigResponse(
5457 responseInfo);
5458 radioService[slotId]->checkReturnStatus(retStatus);
5459 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005460 RLOGE("setCdmaBroadcastConfigResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005461 slotId);
5462 }
5463
5464 return 0;
5465}
5466
Amit Mahajan759786a2017-03-03 17:35:47 -08005467int radio::setCdmaBroadcastActivationResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005468 int responseType, int serial, RIL_Errno e,
5469 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005470#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005471 RLOGD("setCdmaBroadcastActivationResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005472#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005473
5474 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005475 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005476 populateResponseInfo(responseInfo, serial, responseType, e);
5477 Return<void> retStatus
5478 = radioService[slotId]->mRadioResponse->setCdmaBroadcastActivationResponse(
5479 responseInfo);
5480 radioService[slotId]->checkReturnStatus(retStatus);
5481 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005482 RLOGE("setCdmaBroadcastActivationResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005483 slotId);
5484 }
5485
5486 return 0;
5487}
5488
Amit Mahajan759786a2017-03-03 17:35:47 -08005489int radio::getCDMASubscriptionResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005490 int responseType, int serial, RIL_Errno e, void *response,
5491 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005492#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005493 RLOGD("getCDMASubscriptionResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005494#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005495
5496 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005497 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005498 populateResponseInfo(responseInfo, serial, responseType, e);
5499
5500 int numStrings = responseLen / sizeof(char *);
5501 hidl_string emptyString;
5502 if (response == NULL || numStrings != 5) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005503 RLOGE("getOperatorResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005504 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
5505 Return<void> retStatus
5506 = radioService[slotId]->mRadioResponse->getCDMASubscriptionResponse(
5507 responseInfo, emptyString, emptyString, emptyString, emptyString, emptyString);
5508 radioService[slotId]->checkReturnStatus(retStatus);
5509 } else {
5510 char **resp = (char **) response;
5511 Return<void> retStatus
5512 = radioService[slotId]->mRadioResponse->getCDMASubscriptionResponse(
5513 responseInfo,
5514 convertCharPtrToHidlString(resp[0]),
5515 convertCharPtrToHidlString(resp[1]),
5516 convertCharPtrToHidlString(resp[2]),
5517 convertCharPtrToHidlString(resp[3]),
5518 convertCharPtrToHidlString(resp[4]));
5519 radioService[slotId]->checkReturnStatus(retStatus);
5520 }
5521 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005522 RLOGE("getCDMASubscriptionResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005523 slotId);
5524 }
5525
5526 return 0;
5527}
5528
Amit Mahajan759786a2017-03-03 17:35:47 -08005529int radio::writeSmsToRuimResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005530 int responseType, int serial, RIL_Errno e,
5531 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005532#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005533 RLOGD("writeSmsToRuimResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005534#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005535
5536 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005537 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005538 int ret = responseInt(responseInfo, serial, responseType, e, response, responseLen);
5539 Return<void> retStatus
5540 = radioService[slotId]->mRadioResponse->writeSmsToRuimResponse(responseInfo, ret);
5541 radioService[slotId]->checkReturnStatus(retStatus);
5542 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005543 RLOGE("writeSmsToRuimResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005544 }
5545
5546 return 0;
5547}
5548
Amit Mahajan759786a2017-03-03 17:35:47 -08005549int radio::deleteSmsOnRuimResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005550 int responseType, int serial, RIL_Errno e,
5551 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005552#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005553 RLOGD("deleteSmsOnRuimResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005554#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005555
5556 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005557 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005558 populateResponseInfo(responseInfo, serial, responseType, e);
5559 Return<void> retStatus
5560 = radioService[slotId]->mRadioResponse->deleteSmsOnRuimResponse(responseInfo);
5561 radioService[slotId]->checkReturnStatus(retStatus);
5562 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005563 RLOGE("deleteSmsOnRuimResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005564 }
5565
5566 return 0;
5567}
5568
Amit Mahajan759786a2017-03-03 17:35:47 -08005569int radio::getDeviceIdentityResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005570 int responseType, int serial, RIL_Errno e, void *response,
5571 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005572#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005573 RLOGD("getDeviceIdentityResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005574#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005575
5576 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005577 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005578 populateResponseInfo(responseInfo, serial, responseType, e);
5579
5580 int numStrings = responseLen / sizeof(char *);
5581 hidl_string emptyString;
5582 if (response == NULL || numStrings != 4) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005583 RLOGE("getDeviceIdentityResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005584 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
5585 Return<void> retStatus
5586 = radioService[slotId]->mRadioResponse->getDeviceIdentityResponse(responseInfo,
5587 emptyString, emptyString, emptyString, emptyString);
5588 radioService[slotId]->checkReturnStatus(retStatus);
5589 } else {
5590 char **resp = (char **) response;
5591 Return<void> retStatus
5592 = radioService[slotId]->mRadioResponse->getDeviceIdentityResponse(responseInfo,
5593 convertCharPtrToHidlString(resp[0]),
5594 convertCharPtrToHidlString(resp[1]),
5595 convertCharPtrToHidlString(resp[2]),
5596 convertCharPtrToHidlString(resp[3]));
5597 radioService[slotId]->checkReturnStatus(retStatus);
5598 }
5599 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005600 RLOGE("getDeviceIdentityResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005601 slotId);
5602 }
5603
5604 return 0;
5605}
5606
Amit Mahajan759786a2017-03-03 17:35:47 -08005607int radio::exitEmergencyCallbackModeResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005608 int responseType, int serial, RIL_Errno e,
5609 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005610#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005611 RLOGD("exitEmergencyCallbackModeResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005612#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005613
5614 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005615 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005616 populateResponseInfo(responseInfo, serial, responseType, e);
5617 Return<void> retStatus
5618 = radioService[slotId]->mRadioResponse->exitEmergencyCallbackModeResponse(
5619 responseInfo);
5620 radioService[slotId]->checkReturnStatus(retStatus);
5621 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005622 RLOGE("exitEmergencyCallbackModeResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005623 slotId);
5624 }
5625
5626 return 0;
5627}
5628
Amit Mahajan759786a2017-03-03 17:35:47 -08005629int radio::getSmscAddressResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005630 int responseType, int serial, RIL_Errno e,
5631 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005632#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005633 RLOGD("getSmscAddressResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005634#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005635
5636 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005637 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005638 populateResponseInfo(responseInfo, serial, responseType, e);
5639 Return<void> retStatus
5640 = radioService[slotId]->mRadioResponse->getSmscAddressResponse(responseInfo,
5641 convertCharPtrToHidlString((char *) response));
5642 radioService[slotId]->checkReturnStatus(retStatus);
5643 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005644 RLOGE("getSmscAddressResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005645 }
5646
5647 return 0;
5648}
5649
Amit Mahajan759786a2017-03-03 17:35:47 -08005650int radio::setSmscAddressResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005651 int responseType, int serial, RIL_Errno e,
5652 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005653#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005654 RLOGD("setSmscAddressResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005655#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005656
5657 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005658 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005659 populateResponseInfo(responseInfo, serial, responseType, e);
5660 Return<void> retStatus
5661 = radioService[slotId]->mRadioResponse->setSmscAddressResponse(responseInfo);
5662 radioService[slotId]->checkReturnStatus(retStatus);
5663 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005664 RLOGE("setSmscAddressResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005665 }
5666
5667 return 0;
5668}
5669
Amit Mahajan759786a2017-03-03 17:35:47 -08005670int radio::reportSmsMemoryStatusResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005671 int responseType, int serial, RIL_Errno e,
5672 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005673#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005674 RLOGD("reportSmsMemoryStatusResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005675#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005676
5677 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005678 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005679 populateResponseInfo(responseInfo, serial, responseType, e);
5680 Return<void> retStatus
5681 = radioService[slotId]->mRadioResponse->reportSmsMemoryStatusResponse(responseInfo);
5682 radioService[slotId]->checkReturnStatus(retStatus);
5683 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005684 RLOGE("reportSmsMemoryStatusResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005685 slotId);
5686 }
5687
5688 return 0;
5689}
5690
Amit Mahajan759786a2017-03-03 17:35:47 -08005691int radio::reportStkServiceIsRunningResponse(int slotId,
Amit Mahajan5007ffa2017-01-31 17:14:42 -08005692 int responseType, int serial, RIL_Errno e,
5693 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005694#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005695 RLOGD("reportStkServiceIsRunningResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005696#endif
Amit Mahajan5007ffa2017-01-31 17:14:42 -08005697
5698 if (radioService[slotId]->mRadioResponse != NULL) {
Amit Mahajan3da9ac02017-02-13 13:41:28 -08005699 RadioResponseInfo responseInfo = {};
Amit Mahajan5007ffa2017-01-31 17:14:42 -08005700 populateResponseInfo(responseInfo, serial, responseType, e);
5701 Return<void> retStatus = radioService[slotId]->mRadioResponse->
5702 reportStkServiceIsRunningResponse(responseInfo);
5703 radioService[slotId]->checkReturnStatus(retStatus);
5704 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005705 RLOGE("reportStkServiceIsRunningResponse: radioService[%d]->mRadioResponse == NULL",
Amit Mahajan5007ffa2017-01-31 17:14:42 -08005706 slotId);
5707 }
5708
5709 return 0;
5710}
5711
Amit Mahajan759786a2017-03-03 17:35:47 -08005712int radio::getCdmaSubscriptionSourceResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005713 int responseType, int serial, RIL_Errno e,
5714 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005715#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005716 RLOGD("getCdmaSubscriptionSourceResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005717#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005718
5719 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005720 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005721 int ret = responseInt(responseInfo, serial, responseType, e, response, responseLen);
5722 Return<void> retStatus
5723 = radioService[slotId]->mRadioResponse->getCdmaSubscriptionSourceResponse(
5724 responseInfo, (CdmaSubscriptionSource) ret);
5725 radioService[slotId]->checkReturnStatus(retStatus);
5726 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005727 RLOGE("getCdmaSubscriptionSourceResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005728 slotId);
5729 }
5730
5731 return 0;
5732}
5733
Amit Mahajan759786a2017-03-03 17:35:47 -08005734int radio::requestIsimAuthenticationResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005735 int responseType, int serial, RIL_Errno e,
5736 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005737#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005738 RLOGD("requestIsimAuthenticationResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005739#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005740
5741 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005742 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005743 populateResponseInfo(responseInfo, serial, responseType, e);
5744 Return<void> retStatus
5745 = radioService[slotId]->mRadioResponse->requestIsimAuthenticationResponse(
5746 responseInfo,
5747 convertCharPtrToHidlString((char *) response));
5748 radioService[slotId]->checkReturnStatus(retStatus);
5749 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005750 RLOGE("requestIsimAuthenticationResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005751 slotId);
5752 }
5753
5754 return 0;
5755}
5756
Amit Mahajan759786a2017-03-03 17:35:47 -08005757int radio::acknowledgeIncomingGsmSmsWithPduResponse(int slotId,
5758 int responseType,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005759 int serial, RIL_Errno e, void *response,
5760 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005761#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005762 RLOGD("acknowledgeIncomingGsmSmsWithPduResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005763#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005764
5765 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005766 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005767 populateResponseInfo(responseInfo, serial, responseType, e);
5768 Return<void> retStatus
5769 = radioService[slotId]->mRadioResponse->acknowledgeIncomingGsmSmsWithPduResponse(
5770 responseInfo);
5771 radioService[slotId]->checkReturnStatus(retStatus);
5772 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005773 RLOGE("acknowledgeIncomingGsmSmsWithPduResponse: radioService[%d]->mRadioResponse "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005774 "== NULL", slotId);
5775 }
5776
5777 return 0;
5778}
5779
Amit Mahajan759786a2017-03-03 17:35:47 -08005780int radio::sendEnvelopeWithStatusResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005781 int responseType, int serial, RIL_Errno e, void *response,
5782 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005783#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005784 RLOGD("sendEnvelopeWithStatusResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005785#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005786
5787 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005788 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005789 IccIoResult result = responseIccIo(responseInfo, serial, responseType, e,
5790 response, responseLen);
5791
5792 Return<void> retStatus
5793 = radioService[slotId]->mRadioResponse->sendEnvelopeWithStatusResponse(responseInfo,
5794 result);
5795 radioService[slotId]->checkReturnStatus(retStatus);
5796 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005797 RLOGE("sendEnvelopeWithStatusResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005798 slotId);
5799 }
5800
5801 return 0;
5802}
5803
Amit Mahajan759786a2017-03-03 17:35:47 -08005804int radio::getVoiceRadioTechnologyResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005805 int responseType, int serial, RIL_Errno e,
5806 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005807#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005808 RLOGD("getVoiceRadioTechnologyResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005809#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005810
5811 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005812 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005813 int ret = responseInt(responseInfo, serial, responseType, e, response, responseLen);
5814 Return<void> retStatus
5815 = radioService[slotId]->mRadioResponse->getVoiceRadioTechnologyResponse(
5816 responseInfo, (RadioTechnology) ret);
5817 radioService[slotId]->checkReturnStatus(retStatus);
5818 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005819 RLOGE("getVoiceRadioTechnologyResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005820 slotId);
5821 }
5822
5823 return 0;
5824}
5825
Amit Mahajan759786a2017-03-03 17:35:47 -08005826int radio::getCellInfoListResponse(int slotId,
5827 int responseType,
Amit Mahajan3df62912017-02-10 01:35:55 +00005828 int serial, RIL_Errno e, void *response,
5829 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005830#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005831 RLOGD("getCellInfoListResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005832#endif
Amit Mahajan3df62912017-02-10 01:35:55 +00005833
5834 if (radioService[slotId]->mRadioResponse != NULL) {
Amit Mahajan3da9ac02017-02-13 13:41:28 -08005835 RadioResponseInfo responseInfo = {};
Amit Mahajan3df62912017-02-10 01:35:55 +00005836 populateResponseInfo(responseInfo, serial, responseType, e);
5837
5838 hidl_vec<CellInfo> ret;
Amit Mahajan13058cb2017-06-07 23:10:27 -07005839 if ((response == NULL && responseLen != 0)
5840 || responseLen % sizeof(RIL_CellInfo_v12) != 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005841 RLOGE("getCellInfoListResponse: Invalid response");
Amit Mahajan3df62912017-02-10 01:35:55 +00005842 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
5843 } else {
5844 convertRilCellInfoListToHal(response, responseLen, ret);
5845 }
5846
5847 Return<void> retStatus = radioService[slotId]->mRadioResponse->getCellInfoListResponse(
5848 responseInfo, ret);
5849 radioService[slotId]->checkReturnStatus(retStatus);
5850 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005851 RLOGE("getCellInfoListResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Amit Mahajan3df62912017-02-10 01:35:55 +00005852 }
5853
5854 return 0;
5855}
5856
Amit Mahajan759786a2017-03-03 17:35:47 -08005857int radio::setCellInfoListRateResponse(int slotId,
5858 int responseType,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005859 int serial, RIL_Errno e, void *response,
5860 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005861#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005862 RLOGD("setCellInfoListRateResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005863#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005864
5865 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005866 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005867 populateResponseInfo(responseInfo, serial, responseType, e);
5868 Return<void> retStatus
5869 = radioService[slotId]->mRadioResponse->setCellInfoListRateResponse(responseInfo);
5870 radioService[slotId]->checkReturnStatus(retStatus);
5871 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005872 RLOGE("setCellInfoListRateResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005873 slotId);
5874 }
5875
5876 return 0;
5877}
5878
Amit Mahajan759786a2017-03-03 17:35:47 -08005879int radio::setInitialAttachApnResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005880 int responseType, int serial, RIL_Errno e,
5881 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005882#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005883 RLOGD("setInitialAttachApnResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005884#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005885
5886 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005887 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005888 populateResponseInfo(responseInfo, serial, responseType, e);
5889 Return<void> retStatus
5890 = radioService[slotId]->mRadioResponse->setInitialAttachApnResponse(responseInfo);
5891 radioService[slotId]->checkReturnStatus(retStatus);
5892 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005893 RLOGE("setInitialAttachApnResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005894 slotId);
5895 }
5896
5897 return 0;
5898}
5899
Amit Mahajan759786a2017-03-03 17:35:47 -08005900int radio::getImsRegistrationStateResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005901 int responseType, int serial, RIL_Errno e,
5902 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005903#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005904 RLOGD("getImsRegistrationStateResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005905#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005906
5907 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005908 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005909 populateResponseInfo(responseInfo, serial, responseType, e);
5910 bool isRegistered = false;
5911 int ratFamily = 0;
5912 int numInts = responseLen / sizeof(int);
5913 if (response == NULL || numInts != 2) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005914 RLOGE("getImsRegistrationStateResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005915 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
5916 } else {
5917 int *pInt = (int *) response;
5918 isRegistered = pInt[0] == 1 ? true : false;
5919 ratFamily = pInt[1];
5920 }
5921 Return<void> retStatus
5922 = radioService[slotId]->mRadioResponse->getImsRegistrationStateResponse(
5923 responseInfo, isRegistered, (RadioTechnologyFamily) ratFamily);
5924 radioService[slotId]->checkReturnStatus(retStatus);
5925 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005926 RLOGE("getImsRegistrationStateResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005927 slotId);
5928 }
5929
5930 return 0;
5931}
5932
Amit Mahajan759786a2017-03-03 17:35:47 -08005933int radio::sendImsSmsResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005934 int responseType, int serial, RIL_Errno e, void *response,
5935 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005936#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005937 RLOGD("sendImsSmsResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005938#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005939
5940 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005941 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005942 SendSmsResult result = makeSendSmsResult(responseInfo, serial, responseType, e, response,
5943 responseLen);
5944
5945 Return<void> retStatus
5946 = radioService[slotId]->mRadioResponse->sendImsSmsResponse(responseInfo, result);
5947 radioService[slotId]->checkReturnStatus(retStatus);
5948 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005949 RLOGE("sendSmsResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005950 }
5951
5952 return 0;
5953}
5954
Amit Mahajan759786a2017-03-03 17:35:47 -08005955int radio::iccTransmitApduBasicChannelResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005956 int responseType, int serial, RIL_Errno e,
5957 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005958#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005959 RLOGD("iccTransmitApduBasicChannelResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005960#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005961
5962 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005963 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005964 IccIoResult result = responseIccIo(responseInfo, serial, responseType, e, response,
5965 responseLen);
5966
5967 Return<void> retStatus
5968 = radioService[slotId]->mRadioResponse->iccTransmitApduBasicChannelResponse(
5969 responseInfo, result);
5970 radioService[slotId]->checkReturnStatus(retStatus);
5971 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005972 RLOGE("iccTransmitApduBasicChannelResponse: radioService[%d]->mRadioResponse "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005973 "== NULL", slotId);
5974 }
5975
5976 return 0;
5977}
5978
Amit Mahajan759786a2017-03-03 17:35:47 -08005979int radio::iccOpenLogicalChannelResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005980 int responseType, int serial, RIL_Errno e, void *response,
5981 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005982#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005983 RLOGD("iccOpenLogicalChannelResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005984#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005985
5986 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005987 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005988 populateResponseInfo(responseInfo, serial, responseType, e);
5989 int channelId = -1;
5990 hidl_vec<int8_t> selectResponse;
5991 int numInts = responseLen / sizeof(int);
5992 if (response == NULL || responseLen % sizeof(int) != 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005993 RLOGE("iccOpenLogicalChannelResponse Invalid response: NULL");
Amit Mahajan13058cb2017-06-07 23:10:27 -07005994 if (response != NULL) {
5995 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
5996 }
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005997 } else {
5998 int *pInt = (int *) response;
5999 channelId = pInt[0];
6000 selectResponse.resize(numInts - 1);
6001 for (int i = 1; i < numInts; i++) {
6002 selectResponse[i - 1] = (int8_t) pInt[i];
6003 }
6004 }
6005 Return<void> retStatus
6006 = radioService[slotId]->mRadioResponse->iccOpenLogicalChannelResponse(responseInfo,
6007 channelId, selectResponse);
6008 radioService[slotId]->checkReturnStatus(retStatus);
6009 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006010 RLOGE("iccOpenLogicalChannelResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006011 slotId);
6012 }
6013
6014 return 0;
6015}
6016
Amit Mahajan759786a2017-03-03 17:35:47 -08006017int radio::iccCloseLogicalChannelResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006018 int responseType, int serial, RIL_Errno e,
6019 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006020#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006021 RLOGD("iccCloseLogicalChannelResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006022#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006023
6024 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08006025 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006026 populateResponseInfo(responseInfo, serial, responseType, e);
6027 Return<void> retStatus
6028 = radioService[slotId]->mRadioResponse->iccCloseLogicalChannelResponse(
6029 responseInfo);
6030 radioService[slotId]->checkReturnStatus(retStatus);
6031 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006032 RLOGE("iccCloseLogicalChannelResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006033 slotId);
6034 }
6035
6036 return 0;
6037}
6038
Amit Mahajan759786a2017-03-03 17:35:47 -08006039int radio::iccTransmitApduLogicalChannelResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006040 int responseType, int serial, RIL_Errno e,
6041 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006042#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006043 RLOGD("iccTransmitApduLogicalChannelResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006044#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006045
6046 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08006047 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006048 IccIoResult result = responseIccIo(responseInfo, serial, responseType, e, response,
6049 responseLen);
6050
6051 Return<void> retStatus
6052 = radioService[slotId]->mRadioResponse->iccTransmitApduLogicalChannelResponse(
6053 responseInfo, result);
6054 radioService[slotId]->checkReturnStatus(retStatus);
6055 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006056 RLOGE("iccTransmitApduLogicalChannelResponse: radioService[%d]->mRadioResponse "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006057 "== NULL", slotId);
6058 }
6059
6060 return 0;
6061}
6062
Amit Mahajan759786a2017-03-03 17:35:47 -08006063int radio::nvReadItemResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006064 int responseType, int serial, RIL_Errno e,
6065 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006066#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006067 RLOGD("nvReadItemResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006068#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006069
6070 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08006071 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006072 populateResponseInfo(responseInfo, serial, responseType, e);
6073 Return<void> retStatus = radioService[slotId]->mRadioResponse->nvReadItemResponse(
6074 responseInfo,
6075 convertCharPtrToHidlString((char *) response));
6076 radioService[slotId]->checkReturnStatus(retStatus);
6077 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006078 RLOGE("nvReadItemResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006079 }
6080
6081 return 0;
6082}
6083
Amit Mahajan759786a2017-03-03 17:35:47 -08006084int radio::nvWriteItemResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006085 int responseType, int serial, RIL_Errno e,
6086 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006087#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006088 RLOGD("nvWriteItemResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006089#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006090
6091 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08006092 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006093 populateResponseInfo(responseInfo, serial, responseType, e);
6094 Return<void> retStatus
6095 = radioService[slotId]->mRadioResponse->nvWriteItemResponse(responseInfo);
6096 radioService[slotId]->checkReturnStatus(retStatus);
6097 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006098 RLOGE("nvWriteItemResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006099 }
6100
6101 return 0;
6102}
6103
Amit Mahajan759786a2017-03-03 17:35:47 -08006104int radio::nvWriteCdmaPrlResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006105 int responseType, int serial, RIL_Errno e,
6106 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006107#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006108 RLOGD("nvWriteCdmaPrlResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006109#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006110
6111 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08006112 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006113 populateResponseInfo(responseInfo, serial, responseType, e);
6114 Return<void> retStatus
6115 = radioService[slotId]->mRadioResponse->nvWriteCdmaPrlResponse(responseInfo);
6116 radioService[slotId]->checkReturnStatus(retStatus);
6117 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006118 RLOGE("nvWriteCdmaPrlResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006119 }
6120
6121 return 0;
6122}
6123
Amit Mahajan759786a2017-03-03 17:35:47 -08006124int radio::nvResetConfigResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006125 int responseType, int serial, RIL_Errno e,
6126 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006127#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006128 RLOGD("nvResetConfigResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006129#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006130
6131 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08006132 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006133 populateResponseInfo(responseInfo, serial, responseType, e);
6134 Return<void> retStatus
6135 = radioService[slotId]->mRadioResponse->nvResetConfigResponse(responseInfo);
6136 radioService[slotId]->checkReturnStatus(retStatus);
6137 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006138 RLOGE("nvResetConfigResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006139 }
6140
6141 return 0;
6142}
6143
Amit Mahajan759786a2017-03-03 17:35:47 -08006144int radio::setUiccSubscriptionResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006145 int responseType, int serial, RIL_Errno e,
6146 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006147#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006148 RLOGD("setUiccSubscriptionResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006149#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006150
6151 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08006152 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006153 populateResponseInfo(responseInfo, serial, responseType, e);
6154 Return<void> retStatus
6155 = radioService[slotId]->mRadioResponse->setUiccSubscriptionResponse(responseInfo);
6156 radioService[slotId]->checkReturnStatus(retStatus);
6157 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006158 RLOGE("setUiccSubscriptionResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006159 slotId);
6160 }
6161
6162 return 0;
6163}
6164
Amit Mahajan759786a2017-03-03 17:35:47 -08006165int radio::setDataAllowedResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006166 int responseType, int serial, RIL_Errno e,
6167 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006168#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006169 RLOGD("setDataAllowedResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006170#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006171
6172 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08006173 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006174 populateResponseInfo(responseInfo, serial, responseType, e);
6175 Return<void> retStatus
6176 = radioService[slotId]->mRadioResponse->setDataAllowedResponse(responseInfo);
6177 radioService[slotId]->checkReturnStatus(retStatus);
6178 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006179 RLOGE("setDataAllowedResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006180 }
6181
6182 return 0;
6183}
6184
Amit Mahajan759786a2017-03-03 17:35:47 -08006185int radio::getHardwareConfigResponse(int slotId,
Amit Mahajan3df62912017-02-10 01:35:55 +00006186 int responseType, int serial, RIL_Errno e,
6187 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006188#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006189 RLOGD("getHardwareConfigResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006190#endif
Amit Mahajan3df62912017-02-10 01:35:55 +00006191
6192 if (radioService[slotId]->mRadioResponse != NULL) {
Amit Mahajan3da9ac02017-02-13 13:41:28 -08006193 RadioResponseInfo responseInfo = {};
Amit Mahajan3df62912017-02-10 01:35:55 +00006194 populateResponseInfo(responseInfo, serial, responseType, e);
6195
6196 hidl_vec<HardwareConfig> result;
Amit Mahajan13058cb2017-06-07 23:10:27 -07006197 if ((response == NULL && responseLen != 0)
6198 || responseLen % sizeof(RIL_HardwareConfig) != 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006199 RLOGE("hardwareConfigChangedInd: invalid response");
Amit Mahajan3df62912017-02-10 01:35:55 +00006200 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
6201 } else {
6202 convertRilHardwareConfigListToHal(response, responseLen, result);
6203 }
6204
6205 Return<void> retStatus = radioService[slotId]->mRadioResponse->getHardwareConfigResponse(
6206 responseInfo, result);
6207 radioService[slotId]->checkReturnStatus(retStatus);
6208 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006209 RLOGE("getHardwareConfigResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Amit Mahajan3df62912017-02-10 01:35:55 +00006210 }
6211
6212 return 0;
6213}
6214
Amit Mahajan759786a2017-03-03 17:35:47 -08006215int radio::requestIccSimAuthenticationResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006216 int responseType, int serial, RIL_Errno e,
6217 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006218#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006219 RLOGD("requestIccSimAuthenticationResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006220#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006221
6222 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08006223 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006224 IccIoResult result = responseIccIo(responseInfo, serial, responseType, e, response,
6225 responseLen);
6226
6227 Return<void> retStatus
6228 = radioService[slotId]->mRadioResponse->requestIccSimAuthenticationResponse(
6229 responseInfo, result);
6230 radioService[slotId]->checkReturnStatus(retStatus);
6231 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006232 RLOGE("requestIccSimAuthenticationResponse: radioService[%d]->mRadioResponse "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006233 "== NULL", slotId);
6234 }
6235
6236 return 0;
6237}
6238
Amit Mahajan759786a2017-03-03 17:35:47 -08006239int radio::setDataProfileResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006240 int responseType, int serial, RIL_Errno e,
6241 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006242#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006243 RLOGD("setDataProfileResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006244#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006245
6246 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08006247 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006248 populateResponseInfo(responseInfo, serial, responseType, e);
6249 Return<void> retStatus
6250 = radioService[slotId]->mRadioResponse->setDataProfileResponse(responseInfo);
6251 radioService[slotId]->checkReturnStatus(retStatus);
6252 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006253 RLOGE("setDataProfileResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006254 }
6255
6256 return 0;
6257}
6258
Amit Mahajan759786a2017-03-03 17:35:47 -08006259int radio::requestShutdownResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006260 int responseType, int serial, RIL_Errno e,
6261 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006262#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006263 RLOGD("requestShutdownResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006264#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006265
6266 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08006267 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006268 populateResponseInfo(responseInfo, serial, responseType, e);
6269 Return<void> retStatus
6270 = radioService[slotId]->mRadioResponse->requestShutdownResponse(responseInfo);
6271 radioService[slotId]->checkReturnStatus(retStatus);
6272 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006273 RLOGE("requestShutdownResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006274 }
6275
6276 return 0;
6277}
6278
Amit Mahajan3df62912017-02-10 01:35:55 +00006279void responseRadioCapability(RadioResponseInfo& responseInfo, int serial,
6280 int responseType, RIL_Errno e, void *response, size_t responseLen, RadioCapability& rc) {
6281 populateResponseInfo(responseInfo, serial, responseType, e);
6282
Amit Mahajan1fbff082017-02-24 11:24:39 -08006283 if (response == NULL || responseLen != sizeof(RIL_RadioCapability)) {
Amit Mahajan3df62912017-02-10 01:35:55 +00006284 RLOGE("responseRadioCapability: Invalid response");
6285 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
Amit Mahajan3da9ac02017-02-13 13:41:28 -08006286 rc.logicalModemUuid = hidl_string();
Amit Mahajan3df62912017-02-10 01:35:55 +00006287 } else {
6288 convertRilRadioCapabilityToHal(response, responseLen, rc);
6289 }
6290}
6291
Amit Mahajan759786a2017-03-03 17:35:47 -08006292int radio::getRadioCapabilityResponse(int slotId,
Amit Mahajan3df62912017-02-10 01:35:55 +00006293 int responseType, int serial, RIL_Errno e,
6294 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006295#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006296 RLOGD("getRadioCapabilityResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006297#endif
Amit Mahajan3df62912017-02-10 01:35:55 +00006298
6299 if (radioService[slotId]->mRadioResponse != NULL) {
Amit Mahajan3da9ac02017-02-13 13:41:28 -08006300 RadioResponseInfo responseInfo = {};
6301 RadioCapability result = {};
Amit Mahajan3df62912017-02-10 01:35:55 +00006302 responseRadioCapability(responseInfo, serial, responseType, e, response, responseLen,
6303 result);
6304 Return<void> retStatus = radioService[slotId]->mRadioResponse->getRadioCapabilityResponse(
6305 responseInfo, result);
6306 radioService[slotId]->checkReturnStatus(retStatus);
6307 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006308 RLOGE("getRadioCapabilityResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Amit Mahajan3df62912017-02-10 01:35:55 +00006309 }
6310
6311 return 0;
6312}
6313
Amit Mahajan759786a2017-03-03 17:35:47 -08006314int radio::setRadioCapabilityResponse(int slotId,
Amit Mahajan3df62912017-02-10 01:35:55 +00006315 int responseType, int serial, RIL_Errno e,
6316 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006317#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006318 RLOGD("setRadioCapabilityResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006319#endif
Amit Mahajan3df62912017-02-10 01:35:55 +00006320
6321 if (radioService[slotId]->mRadioResponse != NULL) {
Amit Mahajan3da9ac02017-02-13 13:41:28 -08006322 RadioResponseInfo responseInfo = {};
6323 RadioCapability result = {};
Amit Mahajan3df62912017-02-10 01:35:55 +00006324 responseRadioCapability(responseInfo, serial, responseType, e, response, responseLen,
6325 result);
6326 Return<void> retStatus = radioService[slotId]->mRadioResponse->setRadioCapabilityResponse(
6327 responseInfo, result);
6328 radioService[slotId]->checkReturnStatus(retStatus);
6329 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006330 RLOGE("setRadioCapabilityResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Amit Mahajan3df62912017-02-10 01:35:55 +00006331 }
6332
6333 return 0;
6334}
6335
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006336LceStatusInfo responseLceStatusInfo(RadioResponseInfo& responseInfo, int serial, int responseType,
6337 RIL_Errno e, void *response, size_t responseLen) {
6338 populateResponseInfo(responseInfo, serial, responseType, e);
Jack Yuf68e0da2017-02-07 14:53:09 -08006339 LceStatusInfo result = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006340
6341 if (response == NULL || responseLen != sizeof(RIL_LceStatusInfo)) {
6342 RLOGE("Invalid response: NULL");
6343 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006344 } else {
6345 RIL_LceStatusInfo *resp = (RIL_LceStatusInfo *) response;
6346 result.lceStatus = (LceStatus) resp->lce_status;
6347 result.actualIntervalMs = (uint8_t) resp->actual_interval_ms;
6348 }
6349 return result;
6350}
6351
Amit Mahajan759786a2017-03-03 17:35:47 -08006352int radio::startLceServiceResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006353 int responseType, int serial, RIL_Errno e,
6354 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006355#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006356 RLOGD("startLceServiceResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006357#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006358
6359 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08006360 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006361 LceStatusInfo result = responseLceStatusInfo(responseInfo, serial, responseType, e,
6362 response, responseLen);
6363
6364 Return<void> retStatus
6365 = radioService[slotId]->mRadioResponse->startLceServiceResponse(responseInfo,
6366 result);
6367 radioService[slotId]->checkReturnStatus(retStatus);
6368 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006369 RLOGE("startLceServiceResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006370 }
6371
6372 return 0;
6373}
6374
Amit Mahajan759786a2017-03-03 17:35:47 -08006375int radio::stopLceServiceResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006376 int responseType, int serial, RIL_Errno e,
6377 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006378#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006379 RLOGD("stopLceServiceResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006380#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006381
6382 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08006383 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006384 LceStatusInfo result = responseLceStatusInfo(responseInfo, serial, responseType, e,
6385 response, responseLen);
6386
6387 Return<void> retStatus
6388 = radioService[slotId]->mRadioResponse->stopLceServiceResponse(responseInfo,
6389 result);
6390 radioService[slotId]->checkReturnStatus(retStatus);
6391 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006392 RLOGE("stopLceServiceResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006393 }
6394
6395 return 0;
6396}
6397
Amit Mahajan759786a2017-03-03 17:35:47 -08006398int radio::pullLceDataResponse(int slotId,
Amit Mahajan3df62912017-02-10 01:35:55 +00006399 int responseType, int serial, RIL_Errno e,
6400 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006401#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006402 RLOGD("pullLceDataResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006403#endif
Amit Mahajan3df62912017-02-10 01:35:55 +00006404
6405 if (radioService[slotId]->mRadioResponse != NULL) {
Amit Mahajan3da9ac02017-02-13 13:41:28 -08006406 RadioResponseInfo responseInfo = {};
Amit Mahajan3df62912017-02-10 01:35:55 +00006407 populateResponseInfo(responseInfo, serial, responseType, e);
6408
Amit Mahajan3da9ac02017-02-13 13:41:28 -08006409 LceDataInfo result = {};
Amit Mahajan3df62912017-02-10 01:35:55 +00006410 if (response == NULL || responseLen != sizeof(RIL_LceDataInfo)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006411 RLOGE("pullLceDataResponse: Invalid response");
Amit Mahajan3df62912017-02-10 01:35:55 +00006412 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
Amit Mahajan3df62912017-02-10 01:35:55 +00006413 } else {
6414 convertRilLceDataInfoToHal(response, responseLen, result);
6415 }
6416
6417 Return<void> retStatus = radioService[slotId]->mRadioResponse->pullLceDataResponse(
6418 responseInfo, result);
6419 radioService[slotId]->checkReturnStatus(retStatus);
6420 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006421 RLOGE("pullLceDataResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Amit Mahajan3df62912017-02-10 01:35:55 +00006422 }
6423
6424 return 0;
6425}
6426
Amit Mahajan759786a2017-03-03 17:35:47 -08006427int radio::getModemActivityInfoResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006428 int responseType, int serial, RIL_Errno e,
6429 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006430#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006431 RLOGD("getModemActivityInfoResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006432#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006433
6434 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08006435 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006436 populateResponseInfo(responseInfo, serial, responseType, e);
6437 ActivityStatsInfo info;
6438 if (response == NULL || responseLen != sizeof(RIL_ActivityStatsInfo)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006439 RLOGE("getModemActivityInfoResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006440 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006441 } else {
6442 RIL_ActivityStatsInfo *resp = (RIL_ActivityStatsInfo *)response;
6443 info.sleepModeTimeMs = resp->sleep_mode_time_ms;
6444 info.idleModeTimeMs = resp->idle_mode_time_ms;
6445 for(int i = 0; i < RIL_NUM_TX_POWER_LEVELS; i++) {
6446 info.txmModetimeMs[i] = resp->tx_mode_time_ms[i];
6447 }
6448 info.rxModeTimeMs = resp->rx_mode_time_ms;
6449 }
6450
6451 Return<void> retStatus
6452 = radioService[slotId]->mRadioResponse->getModemActivityInfoResponse(responseInfo,
6453 info);
6454 radioService[slotId]->checkReturnStatus(retStatus);
6455 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006456 RLOGE("getModemActivityInfoResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006457 slotId);
6458 }
6459
6460 return 0;
6461}
6462
Amit Mahajan759786a2017-03-03 17:35:47 -08006463int radio::setAllowedCarriersResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006464 int responseType, int serial, RIL_Errno e,
6465 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006466#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006467 RLOGD("setAllowedCarriersResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006468#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006469
6470 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08006471 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006472 int ret = responseInt(responseInfo, serial, responseType, e, response, responseLen);
6473 Return<void> retStatus
6474 = radioService[slotId]->mRadioResponse->setAllowedCarriersResponse(responseInfo,
6475 ret);
6476 radioService[slotId]->checkReturnStatus(retStatus);
6477 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006478 RLOGE("setAllowedCarriersResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006479 slotId);
6480 }
6481
6482 return 0;
6483}
6484
Amit Mahajan759786a2017-03-03 17:35:47 -08006485int radio::getAllowedCarriersResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006486 int responseType, int serial, RIL_Errno e,
6487 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006488#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006489 RLOGD("getAllowedCarriersResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006490#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006491
6492 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08006493 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006494 populateResponseInfo(responseInfo, serial, responseType, e);
Jack Yuf68e0da2017-02-07 14:53:09 -08006495 CarrierRestrictions carrierInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006496 bool allAllowed = true;
Jayachandran C70f7d2e2017-04-28 00:57:13 -07006497 if (response == NULL) {
6498#if VDBG
6499 RLOGD("getAllowedCarriersResponse response is NULL: all allowed");
6500#endif
6501 carrierInfo.allowedCarriers.resize(0);
6502 carrierInfo.excludedCarriers.resize(0);
6503 } else if (responseLen != sizeof(RIL_CarrierRestrictions)) {
6504 RLOGE("getAllowedCarriersResponse Invalid response");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006505 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
6506 } else {
6507 RIL_CarrierRestrictions *pCr = (RIL_CarrierRestrictions *)response;
6508 if (pCr->len_allowed_carriers > 0 || pCr->len_excluded_carriers > 0) {
6509 allAllowed = false;
6510 }
6511
6512 carrierInfo.allowedCarriers.resize(pCr->len_allowed_carriers);
6513 for(int i = 0; i < pCr->len_allowed_carriers; i++) {
6514 RIL_Carrier *carrier = pCr->allowed_carriers + i;
6515 carrierInfo.allowedCarriers[i].mcc = convertCharPtrToHidlString(carrier->mcc);
6516 carrierInfo.allowedCarriers[i].mnc = convertCharPtrToHidlString(carrier->mnc);
6517 carrierInfo.allowedCarriers[i].matchType = (CarrierMatchType) carrier->match_type;
6518 carrierInfo.allowedCarriers[i].matchData =
6519 convertCharPtrToHidlString(carrier->match_data);
6520 }
6521
6522 carrierInfo.excludedCarriers.resize(pCr->len_excluded_carriers);
6523 for(int i = 0; i < pCr->len_excluded_carriers; i++) {
6524 RIL_Carrier *carrier = pCr->excluded_carriers + i;
6525 carrierInfo.excludedCarriers[i].mcc = convertCharPtrToHidlString(carrier->mcc);
6526 carrierInfo.excludedCarriers[i].mnc = convertCharPtrToHidlString(carrier->mnc);
6527 carrierInfo.excludedCarriers[i].matchType = (CarrierMatchType) carrier->match_type;
6528 carrierInfo.excludedCarriers[i].matchData =
6529 convertCharPtrToHidlString(carrier->match_data);
6530 }
6531 }
6532
6533 Return<void> retStatus
6534 = radioService[slotId]->mRadioResponse->getAllowedCarriersResponse(responseInfo,
6535 allAllowed, carrierInfo);
6536 radioService[slotId]->checkReturnStatus(retStatus);
6537 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006538 RLOGE("getAllowedCarriersResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006539 slotId);
6540 }
6541
6542 return 0;
6543}
6544
Amit Mahajan759786a2017-03-03 17:35:47 -08006545int radio::sendDeviceStateResponse(int slotId,
Jack Yu11ab4042017-02-21 17:08:01 -08006546 int responseType, int serial, RIL_Errno e,
6547 void *response, size_t responselen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006548#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006549 RLOGD("sendDeviceStateResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006550#endif
Jack Yu11ab4042017-02-21 17:08:01 -08006551
6552 if (radioService[slotId]->mRadioResponse != NULL) {
6553 RadioResponseInfo responseInfo = {};
6554 populateResponseInfo(responseInfo, serial, responseType, e);
6555 Return<void> retStatus
6556 = radioService[slotId]->mRadioResponse->sendDeviceStateResponse(responseInfo);
6557 radioService[slotId]->checkReturnStatus(retStatus);
6558 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006559 RLOGE("sendDeviceStateResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Jack Yu11ab4042017-02-21 17:08:01 -08006560 }
6561
6562 return 0;
6563}
6564
pkanwardb8e0942017-03-17 12:49:34 -07006565int radio::setCarrierInfoForImsiEncryptionResponse(int slotId,
6566 int responseType, int serial, RIL_Errno e,
6567 void *response, size_t responseLen) {
6568 RLOGD("setCarrierInfoForImsiEncryptionResponse: serial %d", serial);
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07006569 if (radioService[slotId]->mRadioResponseV1_1 != NULL) {
pkanwardb8e0942017-03-17 12:49:34 -07006570 RadioResponseInfo responseInfo = {};
6571 populateResponseInfo(responseInfo, serial, responseType, e);
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07006572 Return<void> retStatus = radioService[slotId]->mRadioResponseV1_1->
6573 setCarrierInfoForImsiEncryptionResponse(responseInfo);
6574 radioService[slotId]->checkReturnStatus(retStatus);
pkanwardb8e0942017-03-17 12:49:34 -07006575 } else {
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07006576 RLOGE("setCarrierInfoForImsiEncryptionResponse: radioService[%d]->mRadioResponseV1_1 == "
6577 "NULL", slotId);
pkanwardb8e0942017-03-17 12:49:34 -07006578 }
6579 return 0;
6580}
6581
Amit Mahajan759786a2017-03-03 17:35:47 -08006582int radio::setIndicationFilterResponse(int slotId,
Jack Yu11ab4042017-02-21 17:08:01 -08006583 int responseType, int serial, RIL_Errno e,
6584 void *response, size_t responselen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006585#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006586 RLOGD("setIndicationFilterResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006587#endif
Jack Yu11ab4042017-02-21 17:08:01 -08006588
6589 if (radioService[slotId]->mRadioResponse != NULL) {
6590 RadioResponseInfo responseInfo = {};
6591 populateResponseInfo(responseInfo, serial, responseType, e);
6592 Return<void> retStatus
6593 = radioService[slotId]->mRadioResponse->setIndicationFilterResponse(responseInfo);
6594 radioService[slotId]->checkReturnStatus(retStatus);
6595 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006596 RLOGE("setIndicationFilterResponse: radioService[%d]->mRadioResponse == NULL",
Jack Yu11ab4042017-02-21 17:08:01 -08006597 slotId);
6598 }
6599
6600 return 0;
6601}
6602
Amit Mahajan759786a2017-03-03 17:35:47 -08006603int radio::setSimCardPowerResponse(int slotId,
Wileen Chiu718c0bf2017-01-04 11:37:19 -08006604 int responseType, int serial, RIL_Errno e,
6605 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006606#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006607 RLOGD("setSimCardPowerResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006608#endif
Wileen Chiu718c0bf2017-01-04 11:37:19 -08006609
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07006610 if (radioService[slotId]->mRadioResponse != NULL
6611 || radioService[slotId]->mRadioResponseV1_1 != NULL) {
Wileen Chiu718c0bf2017-01-04 11:37:19 -08006612 RadioResponseInfo responseInfo = {};
6613 populateResponseInfo(responseInfo, serial, responseType, e);
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07006614 if (radioService[slotId]->mRadioResponseV1_1 != NULL) {
6615 Return<void> retStatus = radioService[slotId]->mRadioResponseV1_1->
6616 setSimCardPowerResponse_1_1(responseInfo);
Grace Chen08eb6542017-03-23 18:39:48 -07006617 radioService[slotId]->checkReturnStatus(retStatus);
6618 } else {
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07006619 RLOGD("setSimCardPowerResponse: radioService[%d]->mRadioResponseV1_1 == NULL",
Grace Chen08eb6542017-03-23 18:39:48 -07006620 slotId);
6621 Return<void> retStatus
6622 = radioService[slotId]->mRadioResponse->setSimCardPowerResponse(responseInfo);
6623 radioService[slotId]->checkReturnStatus(retStatus);
6624 }
Wileen Chiu718c0bf2017-01-04 11:37:19 -08006625 } else {
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07006626 RLOGE("setSimCardPowerResponse: radioService[%d]->mRadioResponse == NULL && "
6627 "radioService[%d]->mRadioResponseV1_1 == NULL", slotId, slotId);
Wileen Chiu718c0bf2017-01-04 11:37:19 -08006628 }
Wileen Chiu718c0bf2017-01-04 11:37:19 -08006629 return 0;
6630}
6631
yinxu8688abd2017-05-22 11:26:45 -07006632int radio::startNetworkScanResponse(int slotId, int responseType, int serial, RIL_Errno e,
6633 void *response, size_t responseLen) {
6634#if VDBG
6635 RLOGD("startNetworkScanResponse: serial %d", serial);
6636#endif
6637
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07006638 if (radioService[slotId]->mRadioResponseV1_1 != NULL) {
yinxu8688abd2017-05-22 11:26:45 -07006639 RadioResponseInfo responseInfo = {};
6640 populateResponseInfo(responseInfo, serial, responseType, e);
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07006641 Return<void> retStatus
6642 = radioService[slotId]->mRadioResponseV1_1->startNetworkScanResponse(responseInfo);
6643 radioService[slotId]->checkReturnStatus(retStatus);
yinxu8688abd2017-05-22 11:26:45 -07006644 } else {
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07006645 RLOGE("startNetworkScanResponse: radioService[%d]->mRadioResponseV1_1 == NULL", slotId);
yinxu8688abd2017-05-22 11:26:45 -07006646 }
6647
6648 return 0;
6649}
6650
6651int radio::stopNetworkScanResponse(int slotId, int responseType, int serial, RIL_Errno e,
6652 void *response, size_t responseLen) {
6653#if VDBG
6654 RLOGD("stopNetworkScanResponse: serial %d", serial);
6655#endif
6656
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07006657 if (radioService[slotId]->mRadioResponseV1_1 != NULL) {
yinxu8688abd2017-05-22 11:26:45 -07006658 RadioResponseInfo responseInfo = {};
6659 populateResponseInfo(responseInfo, serial, responseType, e);
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07006660 Return<void> retStatus
6661 = radioService[slotId]->mRadioResponseV1_1->stopNetworkScanResponse(responseInfo);
6662 radioService[slotId]->checkReturnStatus(retStatus);
yinxu8688abd2017-05-22 11:26:45 -07006663 } else {
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07006664 RLOGE("stopNetworkScanResponse: radioService[%d]->mRadioResponseV1_1 == NULL", slotId);
yinxu8688abd2017-05-22 11:26:45 -07006665 }
6666
6667 return 0;
6668}
6669
Nathan Harold6a8809d2017-07-07 19:28:58 -07006670void convertRilKeepaliveStatusToHal(const RIL_KeepaliveStatus *rilStatus,
6671 V1_1::KeepaliveStatus& halStatus) {
6672 halStatus.sessionHandle = rilStatus->sessionHandle;
6673 halStatus.code = static_cast<V1_1::KeepaliveStatusCode>(rilStatus->code);
6674}
6675
6676int radio::startKeepaliveResponse(int slotId, int responseType, int serial, RIL_Errno e,
6677 void *response, size_t responseLen) {
6678#if VDBG
6679 RLOGD("%s(): %d", __FUNCTION__, serial);
6680#endif
6681 RadioResponseInfo responseInfo = {};
6682 populateResponseInfo(responseInfo, serial, responseType, e);
6683
6684 // If we don't have a radio service, there's nothing we can do
6685 if (radioService[slotId]->mRadioResponseV1_1 == NULL) {
6686 RLOGE("%s: radioService[%d]->mRadioResponseV1_1 == NULL", __FUNCTION__, slotId);
6687 return 0;
6688 }
6689
6690 V1_1::KeepaliveStatus ks = {};
6691 if (response == NULL || responseLen != sizeof(V1_1::KeepaliveStatus)) {
6692 RLOGE("%s: invalid response - %d", __FUNCTION__, static_cast<int>(e));
6693 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
6694 } else {
6695 convertRilKeepaliveStatusToHal(static_cast<RIL_KeepaliveStatus*>(response), ks);
6696 }
6697
6698 Return<void> retStatus =
6699 radioService[slotId]->mRadioResponseV1_1->startKeepaliveResponse(responseInfo, ks);
6700 radioService[slotId]->checkReturnStatus(retStatus);
6701 return 0;
6702}
6703
6704int radio::stopKeepaliveResponse(int slotId, int responseType, int serial, RIL_Errno e,
6705 void *response, size_t responseLen) {
6706#if VDBG
6707 RLOGD("%s(): %d", __FUNCTION__, serial);
6708#endif
6709 RadioResponseInfo responseInfo = {};
6710 populateResponseInfo(responseInfo, serial, responseType, e);
6711
6712 // If we don't have a radio service, there's nothing we can do
6713 if (radioService[slotId]->mRadioResponseV1_1 == NULL) {
6714 RLOGE("%s: radioService[%d]->mRadioResponseV1_1 == NULL", __FUNCTION__, slotId);
6715 return 0;
6716 }
6717
6718 Return<void> retStatus =
6719 radioService[slotId]->mRadioResponseV1_1->stopKeepaliveResponse(responseInfo);
6720 radioService[slotId]->checkReturnStatus(retStatus);
6721 return 0;
6722}
6723
Amit Mahajan759786a2017-03-03 17:35:47 -08006724int radio::sendRequestRawResponse(int slotId,
Amit Mahajan439da362017-02-13 17:43:04 -08006725 int responseType, int serial, RIL_Errno e,
6726 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006727#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006728 RLOGD("sendRequestRawResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006729#endif
Amit Mahajan439da362017-02-13 17:43:04 -08006730
Steven Moreland6cc40042018-03-20 11:20:05 -07006731 if (!kOemHookEnabled) return 0;
6732
Amit Mahajan439da362017-02-13 17:43:04 -08006733 if (oemHookService[slotId]->mOemHookResponse != NULL) {
6734 RadioResponseInfo responseInfo = {};
6735 populateResponseInfo(responseInfo, serial, responseType, e);
6736 hidl_vec<uint8_t> data;
6737
6738 if (response == NULL) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006739 RLOGE("sendRequestRawResponse: Invalid response");
Amit Mahajan439da362017-02-13 17:43:04 -08006740 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
6741 } else {
6742 data.setToExternal((uint8_t *) response, responseLen);
6743 }
6744 Return<void> retStatus = oemHookService[slotId]->mOemHookResponse->
6745 sendRequestRawResponse(responseInfo, data);
Amit Mahajand423d192017-03-16 17:04:01 -07006746 checkReturnStatus(slotId, retStatus, false);
Amit Mahajan439da362017-02-13 17:43:04 -08006747 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006748 RLOGE("sendRequestRawResponse: oemHookService[%d]->mOemHookResponse == NULL",
Amit Mahajan439da362017-02-13 17:43:04 -08006749 slotId);
6750 }
6751
6752 return 0;
6753}
6754
Amit Mahajan759786a2017-03-03 17:35:47 -08006755int radio::sendRequestStringsResponse(int slotId,
Amit Mahajan439da362017-02-13 17:43:04 -08006756 int responseType, int serial, RIL_Errno e,
6757 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006758#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006759 RLOGD("sendRequestStringsResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006760#endif
Amit Mahajan439da362017-02-13 17:43:04 -08006761
Steven Moreland6cc40042018-03-20 11:20:05 -07006762 if (!kOemHookEnabled) return 0;
6763
Amit Mahajan439da362017-02-13 17:43:04 -08006764 if (oemHookService[slotId]->mOemHookResponse != NULL) {
6765 RadioResponseInfo responseInfo = {};
6766 populateResponseInfo(responseInfo, serial, responseType, e);
6767 hidl_vec<hidl_string> data;
6768
Amit Mahajan13058cb2017-06-07 23:10:27 -07006769 if ((response == NULL && responseLen != 0) || responseLen % sizeof(char *) != 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006770 RLOGE("sendRequestStringsResponse Invalid response: NULL");
Amit Mahajan439da362017-02-13 17:43:04 -08006771 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
6772 } else {
6773 char **resp = (char **) response;
6774 int numStrings = responseLen / sizeof(char *);
6775 data.resize(numStrings);
6776 for (int i = 0; i < numStrings; i++) {
6777 data[i] = convertCharPtrToHidlString(resp[i]);
6778 }
6779 }
6780 Return<void> retStatus
6781 = oemHookService[slotId]->mOemHookResponse->sendRequestStringsResponse(
6782 responseInfo, data);
Amit Mahajand423d192017-03-16 17:04:01 -07006783 checkReturnStatus(slotId, retStatus, false);
Amit Mahajan439da362017-02-13 17:43:04 -08006784 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006785 RLOGE("sendRequestStringsResponse: oemHookService[%d]->mOemHookResponse == "
Amit Mahajan439da362017-02-13 17:43:04 -08006786 "NULL", slotId);
6787 }
6788
6789 return 0;
6790}
6791
Nathan Harold6a8809d2017-07-07 19:28:58 -07006792/***************************************************************************************************
6793 * INDICATION FUNCTIONS
6794 * The below function handle unsolicited messages coming from the Radio
6795 * (messages for which there is no pending request)
6796 **************************************************************************************************/
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006797
Amit Mahajan5829a472016-12-28 17:28:07 -08006798RadioIndicationType convertIntToRadioIndicationType(int indicationType) {
6799 return indicationType == RESPONSE_UNSOLICITED ? (RadioIndicationType::UNSOLICITED) :
6800 (RadioIndicationType::UNSOLICITED_ACK_EXP);
6801}
6802
Amit Mahajan759786a2017-03-03 17:35:47 -08006803int radio::radioStateChangedInd(int slotId,
Amit Mahajan1f652692017-03-01 12:08:46 -08006804 int indicationType, int token, RIL_Errno e, void *response,
6805 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08006806 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajanb3a11bb2017-05-15 16:41:44 -07006807 RadioState radioState =
6808 (RadioState) CALL_ONSTATEREQUEST(slotId);
Amit Mahajan111ddca2017-03-03 12:05:13 -08006809 RLOGD("radioStateChangedInd: radioState %d", radioState);
Amit Mahajan17249842017-01-19 15:05:45 -08006810 Return<void> retStatus = radioService[slotId]->mRadioIndication->radioStateChanged(
Amit Mahajan1f652692017-03-01 12:08:46 -08006811 convertIntToRadioIndicationType(indicationType), radioState);
Amit Mahajan17249842017-01-19 15:05:45 -08006812 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajancd77a5b2016-08-25 11:19:21 -07006813 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006814 RLOGE("radioStateChangedInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajancd77a5b2016-08-25 11:19:21 -07006815 }
Amit Mahajan1f652692017-03-01 12:08:46 -08006816
6817 return 0;
Amit Mahajancd77a5b2016-08-25 11:19:21 -07006818}
6819
Amit Mahajan759786a2017-03-03 17:35:47 -08006820int radio::callStateChangedInd(int slotId,
Amit Mahajan5829a472016-12-28 17:28:07 -08006821 int indicationType, int token, RIL_Errno e, void *response,
6822 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08006823 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006824#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006825 RLOGD("callStateChangedInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07006826#endif
Amit Mahajan17249842017-01-19 15:05:45 -08006827 Return<void> retStatus = radioService[slotId]->mRadioIndication->callStateChanged(
Amit Mahajan5829a472016-12-28 17:28:07 -08006828 convertIntToRadioIndicationType(indicationType));
Amit Mahajan17249842017-01-19 15:05:45 -08006829 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08006830 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006831 RLOGE("callStateChangedInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08006832 }
6833
6834 return 0;
6835}
6836
Amit Mahajan759786a2017-03-03 17:35:47 -08006837int radio::networkStateChangedInd(int slotId,
Amit Mahajan1f652692017-03-01 12:08:46 -08006838 int indicationType, int token, RIL_Errno e, void *response,
6839 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08006840 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006841#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006842 RLOGD("networkStateChangedInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07006843#endif
Jack Yu06181bb2017-01-10 12:10:41 -08006844 Return<void> retStatus = radioService[slotId]->mRadioIndication->networkStateChanged(
Amit Mahajan5829a472016-12-28 17:28:07 -08006845 convertIntToRadioIndicationType(indicationType));
Amit Mahajan17249842017-01-19 15:05:45 -08006846 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08006847 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006848 RLOGE("networkStateChangedInd: radioService[%d]->mRadioIndication == NULL",
Amit Mahajan2fa9e632017-01-06 16:55:33 -08006849 slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08006850 }
6851
6852 return 0;
6853}
6854
6855uint8_t hexCharToInt(uint8_t c) {
6856 if (c >= '0' && c <= '9') return (c - '0');
6857 if (c >= 'A' && c <= 'F') return (c - 'A' + 10);
6858 if (c >= 'a' && c <= 'f') return (c - 'a' + 10);
6859
6860 return INVALID_HEX_CHAR;
6861}
6862
6863uint8_t * convertHexStringToBytes(void *response, size_t responseLen) {
6864 if (responseLen % 2 != 0) {
6865 return NULL;
6866 }
6867
6868 uint8_t *bytes = (uint8_t *)calloc(responseLen/2, sizeof(uint8_t));
6869 if (bytes == NULL) {
6870 RLOGE("convertHexStringToBytes: cannot allocate memory for bytes string");
6871 return NULL;
6872 }
6873 uint8_t *hexString = (uint8_t *)response;
6874
Wei Wang100ac9b2017-02-03 14:18:07 -08006875 for (size_t i = 0; i < responseLen; i += 2) {
Amit Mahajan5829a472016-12-28 17:28:07 -08006876 uint8_t hexChar1 = hexCharToInt(hexString[i]);
6877 uint8_t hexChar2 = hexCharToInt(hexString[i + 1]);
6878
6879 if (hexChar1 == INVALID_HEX_CHAR || hexChar2 == INVALID_HEX_CHAR) {
6880 RLOGE("convertHexStringToBytes: invalid hex char %d %d",
6881 hexString[i], hexString[i + 1]);
6882 free(bytes);
6883 return NULL;
6884 }
6885 bytes[i/2] = ((hexChar1 << 4) | hexChar2);
6886 }
6887
6888 return bytes;
6889}
6890
Amit Mahajan759786a2017-03-03 17:35:47 -08006891int radio::newSmsInd(int slotId, int indicationType,
Amit Mahajan5829a472016-12-28 17:28:07 -08006892 int token, RIL_Errno e, void *response, size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08006893 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan5829a472016-12-28 17:28:07 -08006894 if (response == NULL || responseLen == 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006895 RLOGE("newSmsInd: invalid response");
Amit Mahajan5829a472016-12-28 17:28:07 -08006896 return 0;
6897 }
6898
6899 uint8_t *bytes = convertHexStringToBytes(response, responseLen);
6900 if (bytes == NULL) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006901 RLOGE("newSmsInd: convertHexStringToBytes failed");
Amit Mahajan5829a472016-12-28 17:28:07 -08006902 return 0;
6903 }
6904
6905 hidl_vec<uint8_t> pdu;
6906 pdu.setToExternal(bytes, responseLen/2);
Jayachandran C572f2f42017-03-25 14:30:13 -07006907#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006908 RLOGD("newSmsInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07006909#endif
Amit Mahajan17249842017-01-19 15:05:45 -08006910 Return<void> retStatus = radioService[slotId]->mRadioIndication->newSms(
Amit Mahajan5829a472016-12-28 17:28:07 -08006911 convertIntToRadioIndicationType(indicationType), pdu);
Amit Mahajan17249842017-01-19 15:05:45 -08006912 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08006913 free(bytes);
6914 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006915 RLOGE("newSmsInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08006916 }
6917
6918 return 0;
6919}
6920
Amit Mahajan759786a2017-03-03 17:35:47 -08006921int radio::newSmsStatusReportInd(int slotId,
Amit Mahajan5829a472016-12-28 17:28:07 -08006922 int indicationType, int token, RIL_Errno e, void *response,
6923 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08006924 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan5829a472016-12-28 17:28:07 -08006925 if (response == NULL || responseLen == 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006926 RLOGE("newSmsStatusReportInd: invalid response");
Amit Mahajan5829a472016-12-28 17:28:07 -08006927 return 0;
6928 }
6929
6930 uint8_t *bytes = convertHexStringToBytes(response, responseLen);
6931 if (bytes == NULL) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006932 RLOGE("newSmsStatusReportInd: convertHexStringToBytes failed");
Amit Mahajan5829a472016-12-28 17:28:07 -08006933 return 0;
6934 }
6935
6936 hidl_vec<uint8_t> pdu;
6937 pdu.setToExternal(bytes, responseLen/2);
Jayachandran C572f2f42017-03-25 14:30:13 -07006938#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006939 RLOGD("newSmsStatusReportInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07006940#endif
Amit Mahajan17249842017-01-19 15:05:45 -08006941 Return<void> retStatus = radioService[slotId]->mRadioIndication->newSmsStatusReport(
Amit Mahajan5829a472016-12-28 17:28:07 -08006942 convertIntToRadioIndicationType(indicationType), pdu);
Amit Mahajan17249842017-01-19 15:05:45 -08006943 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08006944 free(bytes);
6945 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006946 RLOGE("newSmsStatusReportInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08006947 }
6948
6949 return 0;
6950}
6951
Amit Mahajan759786a2017-03-03 17:35:47 -08006952int radio::newSmsOnSimInd(int slotId, int indicationType,
Amit Mahajan5829a472016-12-28 17:28:07 -08006953 int token, RIL_Errno e, void *response, size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08006954 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan5829a472016-12-28 17:28:07 -08006955 if (response == NULL || responseLen != sizeof(int)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006956 RLOGE("newSmsOnSimInd: invalid response");
Amit Mahajan5829a472016-12-28 17:28:07 -08006957 return 0;
6958 }
6959 int32_t recordNumber = ((int32_t *) response)[0];
Jayachandran C572f2f42017-03-25 14:30:13 -07006960#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006961 RLOGD("newSmsOnSimInd: slotIndex %d", recordNumber);
Jayachandran C572f2f42017-03-25 14:30:13 -07006962#endif
Amit Mahajan17249842017-01-19 15:05:45 -08006963 Return<void> retStatus = radioService[slotId]->mRadioIndication->newSmsOnSim(
Amit Mahajan5829a472016-12-28 17:28:07 -08006964 convertIntToRadioIndicationType(indicationType), recordNumber);
Amit Mahajan17249842017-01-19 15:05:45 -08006965 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08006966 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006967 RLOGE("newSmsOnSimInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08006968 }
6969
6970 return 0;
6971}
6972
Amit Mahajan759786a2017-03-03 17:35:47 -08006973int radio::onUssdInd(int slotId, int indicationType,
Amit Mahajan5829a472016-12-28 17:28:07 -08006974 int token, RIL_Errno e, void *response, size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08006975 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan5829a472016-12-28 17:28:07 -08006976 if (response == NULL || responseLen != 2 * sizeof(char *)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006977 RLOGE("onUssdInd: invalid response");
Amit Mahajan5829a472016-12-28 17:28:07 -08006978 return 0;
6979 }
6980 char **strings = (char **) response;
6981 char *mode = strings[0];
6982 hidl_string msg = convertCharPtrToHidlString(strings[1]);
6983 UssdModeType modeType = (UssdModeType) atoi(mode);
Jayachandran C572f2f42017-03-25 14:30:13 -07006984#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006985 RLOGD("onUssdInd: mode %s", mode);
Jayachandran C572f2f42017-03-25 14:30:13 -07006986#endif
Amit Mahajan17249842017-01-19 15:05:45 -08006987 Return<void> retStatus = radioService[slotId]->mRadioIndication->onUssd(
Amit Mahajan5829a472016-12-28 17:28:07 -08006988 convertIntToRadioIndicationType(indicationType), modeType, msg);
Amit Mahajan17249842017-01-19 15:05:45 -08006989 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08006990 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006991 RLOGE("onUssdInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08006992 }
6993
6994 return 0;
6995}
6996
Amit Mahajan759786a2017-03-03 17:35:47 -08006997int radio::nitzTimeReceivedInd(int slotId,
Amit Mahajan5829a472016-12-28 17:28:07 -08006998 int indicationType, int token, RIL_Errno e, void *response,
6999 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007000 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan5829a472016-12-28 17:28:07 -08007001 if (response == NULL || responseLen == 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007002 RLOGE("nitzTimeReceivedInd: invalid response");
Amit Mahajan5829a472016-12-28 17:28:07 -08007003 return 0;
7004 }
7005 hidl_string nitzTime = convertCharPtrToHidlString((char *) response);
Jayachandran C572f2f42017-03-25 14:30:13 -07007006#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007007 RLOGD("nitzTimeReceivedInd: nitzTime %s receivedTime %" PRId64, nitzTime.c_str(),
Amit Mahajane9a10e62018-02-23 17:12:15 -08007008 nitzTimeReceived[slotId]);
Jayachandran C572f2f42017-03-25 14:30:13 -07007009#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007010 Return<void> retStatus = radioService[slotId]->mRadioIndication->nitzTimeReceived(
Amit Mahajane9a10e62018-02-23 17:12:15 -08007011 convertIntToRadioIndicationType(indicationType), nitzTime,
7012 nitzTimeReceived[slotId]);
Amit Mahajan17249842017-01-19 15:05:45 -08007013 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08007014 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007015 RLOGE("nitzTimeReceivedInd: radioService[%d]->mRadioIndication == NULL", slotId);
Weilun Dud2c30932017-02-09 12:32:42 -08007016 return -1;
Amit Mahajan5829a472016-12-28 17:28:07 -08007017 }
7018
7019 return 0;
7020}
7021
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007022void convertRilSignalStrengthToHal(void *response, size_t responseLen,
7023 SignalStrength& signalStrength) {
7024 RIL_SignalStrength_v10 *rilSignalStrength = (RIL_SignalStrength_v10 *) response;
7025
7026 // Fixup LTE for backwards compatibility
7027 // signalStrength: -1 -> 99
7028 if (rilSignalStrength->LTE_SignalStrength.signalStrength == -1) {
7029 rilSignalStrength->LTE_SignalStrength.signalStrength = 99;
7030 }
7031 // rsrp: -1 -> INT_MAX all other negative value to positive.
7032 // So remap here
7033 if (rilSignalStrength->LTE_SignalStrength.rsrp == -1) {
7034 rilSignalStrength->LTE_SignalStrength.rsrp = INT_MAX;
7035 } else if (rilSignalStrength->LTE_SignalStrength.rsrp < -1) {
7036 rilSignalStrength->LTE_SignalStrength.rsrp = -rilSignalStrength->LTE_SignalStrength.rsrp;
7037 }
7038 // rsrq: -1 -> INT_MAX
7039 if (rilSignalStrength->LTE_SignalStrength.rsrq == -1) {
7040 rilSignalStrength->LTE_SignalStrength.rsrq = INT_MAX;
7041 }
7042 // Not remapping rssnr is already using INT_MAX
7043 // cqi: -1 -> INT_MAX
7044 if (rilSignalStrength->LTE_SignalStrength.cqi == -1) {
7045 rilSignalStrength->LTE_SignalStrength.cqi = INT_MAX;
7046 }
7047
7048 signalStrength.gw.signalStrength = rilSignalStrength->GW_SignalStrength.signalStrength;
7049 signalStrength.gw.bitErrorRate = rilSignalStrength->GW_SignalStrength.bitErrorRate;
7050 signalStrength.cdma.dbm = rilSignalStrength->CDMA_SignalStrength.dbm;
7051 signalStrength.cdma.ecio = rilSignalStrength->CDMA_SignalStrength.ecio;
7052 signalStrength.evdo.dbm = rilSignalStrength->EVDO_SignalStrength.dbm;
7053 signalStrength.evdo.ecio = rilSignalStrength->EVDO_SignalStrength.ecio;
7054 signalStrength.evdo.signalNoiseRatio =
7055 rilSignalStrength->EVDO_SignalStrength.signalNoiseRatio;
7056 signalStrength.lte.signalStrength = rilSignalStrength->LTE_SignalStrength.signalStrength;
7057 signalStrength.lte.rsrp = rilSignalStrength->LTE_SignalStrength.rsrp;
7058 signalStrength.lte.rsrq = rilSignalStrength->LTE_SignalStrength.rsrq;
7059 signalStrength.lte.rssnr = rilSignalStrength->LTE_SignalStrength.rssnr;
7060 signalStrength.lte.cqi = rilSignalStrength->LTE_SignalStrength.cqi;
7061 signalStrength.lte.timingAdvance = rilSignalStrength->LTE_SignalStrength.timingAdvance;
7062 signalStrength.tdScdma.rscp = rilSignalStrength->TD_SCDMA_SignalStrength.rscp;
7063}
7064
Amit Mahajan759786a2017-03-03 17:35:47 -08007065int radio::currentSignalStrengthInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007066 int indicationType, int token, RIL_Errno e,
7067 void *response, size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007068 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007069 if (response == NULL || responseLen != sizeof(RIL_SignalStrength_v10)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007070 RLOGE("currentSignalStrengthInd: invalid response");
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007071 return 0;
7072 }
7073
Jack Yuf68e0da2017-02-07 14:53:09 -08007074 SignalStrength signalStrength = {};
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007075 convertRilSignalStrengthToHal(response, responseLen, signalStrength);
7076
Jayachandran C572f2f42017-03-25 14:30:13 -07007077#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007078 RLOGD("currentSignalStrengthInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07007079#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007080 Return<void> retStatus = radioService[slotId]->mRadioIndication->currentSignalStrength(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007081 convertIntToRadioIndicationType(indicationType), signalStrength);
Amit Mahajan17249842017-01-19 15:05:45 -08007082 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007083 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007084 RLOGE("currentSignalStrengthInd: radioService[%d]->mRadioIndication == NULL",
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007085 slotId);
7086 }
7087
7088 return 0;
7089}
7090
Amit Mahajan5829a472016-12-28 17:28:07 -08007091void convertRilDataCallToHal(RIL_Data_Call_Response_v11 *dcResponse,
7092 SetupDataCallResult& dcResult) {
Jack Yu5079e182017-02-28 15:21:18 -08007093 dcResult.status = (DataCallFailCause) dcResponse->status;
Amit Mahajan5829a472016-12-28 17:28:07 -08007094 dcResult.suggestedRetryTime = dcResponse->suggestedRetryTime;
7095 dcResult.cid = dcResponse->cid;
7096 dcResult.active = dcResponse->active;
7097 dcResult.type = convertCharPtrToHidlString(dcResponse->type);
7098 dcResult.ifname = convertCharPtrToHidlString(dcResponse->ifname);
7099 dcResult.addresses = convertCharPtrToHidlString(dcResponse->addresses);
7100 dcResult.dnses = convertCharPtrToHidlString(dcResponse->dnses);
7101 dcResult.gateways = convertCharPtrToHidlString(dcResponse->gateways);
7102 dcResult.pcscf = convertCharPtrToHidlString(dcResponse->pcscf);
7103 dcResult.mtu = dcResponse->mtu;
7104}
7105
7106void convertRilDataCallListToHal(void *response, size_t responseLen,
7107 hidl_vec<SetupDataCallResult>& dcResultList) {
7108 int num = responseLen / sizeof(RIL_Data_Call_Response_v11);
7109
7110 RIL_Data_Call_Response_v11 *dcResponse = (RIL_Data_Call_Response_v11 *) response;
7111 dcResultList.resize(num);
7112 for (int i = 0; i < num; i++) {
7113 convertRilDataCallToHal(&dcResponse[i], dcResultList[i]);
7114 }
7115}
7116
Amit Mahajan759786a2017-03-03 17:35:47 -08007117int radio::dataCallListChangedInd(int slotId,
Amit Mahajan5829a472016-12-28 17:28:07 -08007118 int indicationType, int token, RIL_Errno e, void *response,
7119 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007120 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan13058cb2017-06-07 23:10:27 -07007121 if ((response == NULL && responseLen != 0)
7122 || responseLen % sizeof(RIL_Data_Call_Response_v11) != 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007123 RLOGE("dataCallListChangedInd: invalid response");
Amit Mahajan5829a472016-12-28 17:28:07 -08007124 return 0;
7125 }
7126 hidl_vec<SetupDataCallResult> dcList;
7127 convertRilDataCallListToHal(response, responseLen, dcList);
Jayachandran C572f2f42017-03-25 14:30:13 -07007128#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007129 RLOGD("dataCallListChangedInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07007130#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007131 Return<void> retStatus = radioService[slotId]->mRadioIndication->dataCallListChanged(
Amit Mahajan5829a472016-12-28 17:28:07 -08007132 convertIntToRadioIndicationType(indicationType), dcList);
Amit Mahajan17249842017-01-19 15:05:45 -08007133 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08007134 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007135 RLOGE("dataCallListChangedInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08007136 }
7137
7138 return 0;
7139}
7140
Amit Mahajan759786a2017-03-03 17:35:47 -08007141int radio::suppSvcNotifyInd(int slotId, int indicationType,
Amit Mahajan5829a472016-12-28 17:28:07 -08007142 int token, RIL_Errno e, void *response, size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007143 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan5829a472016-12-28 17:28:07 -08007144 if (response == NULL || responseLen != sizeof(RIL_SuppSvcNotification)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007145 RLOGE("suppSvcNotifyInd: invalid response");
Amit Mahajan5829a472016-12-28 17:28:07 -08007146 return 0;
7147 }
7148
Jack Yuf68e0da2017-02-07 14:53:09 -08007149 SuppSvcNotification suppSvc = {};
Amit Mahajan5829a472016-12-28 17:28:07 -08007150 RIL_SuppSvcNotification *ssn = (RIL_SuppSvcNotification *) response;
7151 suppSvc.isMT = ssn->notificationType;
7152 suppSvc.code = ssn->code;
7153 suppSvc.index = ssn->index;
7154 suppSvc.type = ssn->type;
7155 suppSvc.number = convertCharPtrToHidlString(ssn->number);
7156
Jayachandran C572f2f42017-03-25 14:30:13 -07007157#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007158 RLOGD("suppSvcNotifyInd: isMT %d code %d index %d type %d",
Amit Mahajan5829a472016-12-28 17:28:07 -08007159 suppSvc.isMT, suppSvc.code, suppSvc.index, suppSvc.type);
Jayachandran C572f2f42017-03-25 14:30:13 -07007160#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007161 Return<void> retStatus = radioService[slotId]->mRadioIndication->suppSvcNotify(
Amit Mahajan5829a472016-12-28 17:28:07 -08007162 convertIntToRadioIndicationType(indicationType), suppSvc);
Amit Mahajan17249842017-01-19 15:05:45 -08007163 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08007164 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007165 RLOGE("suppSvcNotifyInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08007166 }
7167
7168 return 0;
7169}
7170
Amit Mahajan759786a2017-03-03 17:35:47 -08007171int radio::stkSessionEndInd(int slotId, int indicationType,
Amit Mahajan5829a472016-12-28 17:28:07 -08007172 int token, RIL_Errno e, void *response, size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007173 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Jayachandran C572f2f42017-03-25 14:30:13 -07007174#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007175 RLOGD("stkSessionEndInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07007176#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007177 Return<void> retStatus = radioService[slotId]->mRadioIndication->stkSessionEnd(
Amit Mahajan5829a472016-12-28 17:28:07 -08007178 convertIntToRadioIndicationType(indicationType));
Amit Mahajan17249842017-01-19 15:05:45 -08007179 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08007180 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007181 RLOGE("stkSessionEndInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08007182 }
7183
7184 return 0;
7185}
7186
Amit Mahajan759786a2017-03-03 17:35:47 -08007187int radio::stkProactiveCommandInd(int slotId,
Amit Mahajan5829a472016-12-28 17:28:07 -08007188 int indicationType, int token, RIL_Errno e, void *response,
7189 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007190 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan5829a472016-12-28 17:28:07 -08007191 if (response == NULL || responseLen == 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007192 RLOGE("stkProactiveCommandInd: invalid response");
Amit Mahajan5829a472016-12-28 17:28:07 -08007193 return 0;
7194 }
Jayachandran C572f2f42017-03-25 14:30:13 -07007195#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007196 RLOGD("stkProactiveCommandInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07007197#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007198 Return<void> retStatus = radioService[slotId]->mRadioIndication->stkProactiveCommand(
Amit Mahajan5829a472016-12-28 17:28:07 -08007199 convertIntToRadioIndicationType(indicationType),
7200 convertCharPtrToHidlString((char *) response));
Amit Mahajan17249842017-01-19 15:05:45 -08007201 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08007202 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007203 RLOGE("stkProactiveCommandInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08007204 }
7205
7206 return 0;
7207}
7208
Amit Mahajan759786a2017-03-03 17:35:47 -08007209int radio::stkEventNotifyInd(int slotId, int indicationType,
Amit Mahajan5829a472016-12-28 17:28:07 -08007210 int token, RIL_Errno e, void *response, size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007211 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan5829a472016-12-28 17:28:07 -08007212 if (response == NULL || responseLen == 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007213 RLOGE("stkEventNotifyInd: invalid response");
Amit Mahajan5829a472016-12-28 17:28:07 -08007214 return 0;
7215 }
Jayachandran C572f2f42017-03-25 14:30:13 -07007216#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007217 RLOGD("stkEventNotifyInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07007218#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007219 Return<void> retStatus = radioService[slotId]->mRadioIndication->stkEventNotify(
Amit Mahajan5829a472016-12-28 17:28:07 -08007220 convertIntToRadioIndicationType(indicationType),
7221 convertCharPtrToHidlString((char *) response));
Amit Mahajan17249842017-01-19 15:05:45 -08007222 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08007223 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007224 RLOGE("stkEventNotifyInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08007225 }
7226
7227 return 0;
7228}
7229
Amit Mahajan759786a2017-03-03 17:35:47 -08007230int radio::stkCallSetupInd(int slotId, int indicationType,
Amit Mahajan5829a472016-12-28 17:28:07 -08007231 int token, RIL_Errno e, void *response, size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007232 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan5829a472016-12-28 17:28:07 -08007233 if (response == NULL || responseLen != sizeof(int)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007234 RLOGE("stkCallSetupInd: invalid response");
Amit Mahajan5829a472016-12-28 17:28:07 -08007235 return 0;
7236 }
7237 int32_t timeout = ((int32_t *) response)[0];
Jayachandran C572f2f42017-03-25 14:30:13 -07007238#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007239 RLOGD("stkCallSetupInd: timeout %d", timeout);
Jayachandran C572f2f42017-03-25 14:30:13 -07007240#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007241 Return<void> retStatus = radioService[slotId]->mRadioIndication->stkCallSetup(
Amit Mahajan5829a472016-12-28 17:28:07 -08007242 convertIntToRadioIndicationType(indicationType), timeout);
Amit Mahajan17249842017-01-19 15:05:45 -08007243 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08007244 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007245 RLOGE("stkCallSetupInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08007246 }
7247
7248 return 0;
7249}
7250
Amit Mahajan759786a2017-03-03 17:35:47 -08007251int radio::simSmsStorageFullInd(int slotId,
Amit Mahajan5829a472016-12-28 17:28:07 -08007252 int indicationType, int token, RIL_Errno e, void *response,
7253 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007254 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Jayachandran C572f2f42017-03-25 14:30:13 -07007255#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007256 RLOGD("simSmsStorageFullInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07007257#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007258 Return<void> retStatus = radioService[slotId]->mRadioIndication->simSmsStorageFull(
Amit Mahajan5829a472016-12-28 17:28:07 -08007259 convertIntToRadioIndicationType(indicationType));
Amit Mahajan17249842017-01-19 15:05:45 -08007260 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08007261 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007262 RLOGE("simSmsStorageFullInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08007263 }
7264
7265 return 0;
7266}
7267
Amit Mahajan759786a2017-03-03 17:35:47 -08007268int radio::simRefreshInd(int slotId, int indicationType,
Amit Mahajan5829a472016-12-28 17:28:07 -08007269 int token, RIL_Errno e, void *response, size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007270 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan5829a472016-12-28 17:28:07 -08007271 if (response == NULL || responseLen != sizeof(RIL_SimRefreshResponse_v7)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007272 RLOGE("simRefreshInd: invalid response");
Amit Mahajan5829a472016-12-28 17:28:07 -08007273 return 0;
7274 }
7275
Jack Yuf68e0da2017-02-07 14:53:09 -08007276 SimRefreshResult refreshResult = {};
Amit Mahajan5829a472016-12-28 17:28:07 -08007277 RIL_SimRefreshResponse_v7 *simRefreshResponse = ((RIL_SimRefreshResponse_v7 *) response);
7278 refreshResult.type =
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07007279 (V1_0::SimRefreshType) simRefreshResponse->result;
Amit Mahajan5829a472016-12-28 17:28:07 -08007280 refreshResult.efId = simRefreshResponse->ef_id;
7281 refreshResult.aid = convertCharPtrToHidlString(simRefreshResponse->aid);
7282
Jayachandran C572f2f42017-03-25 14:30:13 -07007283#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007284 RLOGD("simRefreshInd: type %d efId %d", refreshResult.type, refreshResult.efId);
Jayachandran C572f2f42017-03-25 14:30:13 -07007285#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007286 Return<void> retStatus = radioService[slotId]->mRadioIndication->simRefresh(
Amit Mahajan5829a472016-12-28 17:28:07 -08007287 convertIntToRadioIndicationType(indicationType), refreshResult);
Amit Mahajan17249842017-01-19 15:05:45 -08007288 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08007289 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007290 RLOGE("simRefreshInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08007291 }
7292
7293 return 0;
7294}
7295
7296void convertRilCdmaSignalInfoRecordToHal(RIL_CDMA_SignalInfoRecord *signalInfoRecord,
7297 CdmaSignalInfoRecord& record) {
7298 record.isPresent = signalInfoRecord->isPresent;
7299 record.signalType = signalInfoRecord->signalType;
7300 record.alertPitch = signalInfoRecord->alertPitch;
7301 record.signal = signalInfoRecord->signal;
7302}
7303
Amit Mahajan759786a2017-03-03 17:35:47 -08007304int radio::callRingInd(int slotId, int indicationType,
Amit Mahajan5829a472016-12-28 17:28:07 -08007305 int token, RIL_Errno e, void *response, size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007306 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan5829a472016-12-28 17:28:07 -08007307 bool isGsm;
Jack Yuf68e0da2017-02-07 14:53:09 -08007308 CdmaSignalInfoRecord record = {};
Amit Mahajan5829a472016-12-28 17:28:07 -08007309 if (response == NULL || responseLen == 0) {
7310 isGsm = true;
7311 } else {
7312 isGsm = false;
7313 if (responseLen != sizeof (RIL_CDMA_SignalInfoRecord)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007314 RLOGE("callRingInd: invalid response");
Amit Mahajan5829a472016-12-28 17:28:07 -08007315 return 0;
7316 }
7317 convertRilCdmaSignalInfoRecordToHal((RIL_CDMA_SignalInfoRecord *) response, record);
7318 }
7319
Jayachandran C572f2f42017-03-25 14:30:13 -07007320#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007321 RLOGD("callRingInd: isGsm %d", isGsm);
Jayachandran C572f2f42017-03-25 14:30:13 -07007322#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007323 Return<void> retStatus = radioService[slotId]->mRadioIndication->callRing(
Amit Mahajan5829a472016-12-28 17:28:07 -08007324 convertIntToRadioIndicationType(indicationType), isGsm, record);
Amit Mahajan17249842017-01-19 15:05:45 -08007325 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08007326 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007327 RLOGE("callRingInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08007328 }
7329
7330 return 0;
7331}
7332
Amit Mahajan759786a2017-03-03 17:35:47 -08007333int radio::simStatusChangedInd(int slotId,
Amit Mahajan5829a472016-12-28 17:28:07 -08007334 int indicationType, int token, RIL_Errno e, void *response,
7335 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007336 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Jayachandran C572f2f42017-03-25 14:30:13 -07007337#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007338 RLOGD("simStatusChangedInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07007339#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007340 Return<void> retStatus = radioService[slotId]->mRadioIndication->simStatusChanged(
Amit Mahajan5829a472016-12-28 17:28:07 -08007341 convertIntToRadioIndicationType(indicationType));
Amit Mahajan17249842017-01-19 15:05:45 -08007342 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08007343 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007344 RLOGE("simStatusChangedInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08007345 }
7346
7347 return 0;
7348}
7349
Amit Mahajan759786a2017-03-03 17:35:47 -08007350int radio::cdmaNewSmsInd(int slotId, int indicationType,
Amit Mahajan5829a472016-12-28 17:28:07 -08007351 int token, RIL_Errno e, void *response, size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007352 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan5829a472016-12-28 17:28:07 -08007353 if (response == NULL || responseLen != sizeof(RIL_CDMA_SMS_Message)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007354 RLOGE("cdmaNewSmsInd: invalid response");
Amit Mahajan5829a472016-12-28 17:28:07 -08007355 return 0;
7356 }
7357
Jack Yuf68e0da2017-02-07 14:53:09 -08007358 CdmaSmsMessage msg = {};
Amit Mahajan5829a472016-12-28 17:28:07 -08007359 RIL_CDMA_SMS_Message *rilMsg = (RIL_CDMA_SMS_Message *) response;
7360 msg.teleserviceId = rilMsg->uTeleserviceID;
7361 msg.isServicePresent = rilMsg->bIsServicePresent;
7362 msg.serviceCategory = rilMsg->uServicecategory;
7363 msg.address.digitMode =
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07007364 (V1_0::CdmaSmsDigitMode) rilMsg->sAddress.digit_mode;
Amit Mahajan5829a472016-12-28 17:28:07 -08007365 msg.address.numberMode =
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07007366 (V1_0::CdmaSmsNumberMode) rilMsg->sAddress.number_mode;
Amit Mahajan5829a472016-12-28 17:28:07 -08007367 msg.address.numberType =
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07007368 (V1_0::CdmaSmsNumberType) rilMsg->sAddress.number_type;
Amit Mahajan5829a472016-12-28 17:28:07 -08007369 msg.address.numberPlan =
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07007370 (V1_0::CdmaSmsNumberPlan) rilMsg->sAddress.number_plan;
Amit Mahajan5829a472016-12-28 17:28:07 -08007371
7372 int digitLimit = MIN((rilMsg->sAddress.number_of_digits), RIL_CDMA_SMS_ADDRESS_MAX);
7373 msg.address.digits.setToExternal(rilMsg->sAddress.digits, digitLimit);
7374
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07007375 msg.subAddress.subaddressType = (V1_0::CdmaSmsSubaddressType)
Amit Mahajan5829a472016-12-28 17:28:07 -08007376 rilMsg->sSubAddress.subaddressType;
7377 msg.subAddress.odd = rilMsg->sSubAddress.odd;
7378
7379 digitLimit= MIN((rilMsg->sSubAddress.number_of_digits), RIL_CDMA_SMS_SUBADDRESS_MAX);
7380 msg.subAddress.digits.setToExternal(rilMsg->sSubAddress.digits, digitLimit);
7381
7382 digitLimit = MIN((rilMsg->uBearerDataLen), RIL_CDMA_SMS_BEARER_DATA_MAX);
7383 msg.bearerData.setToExternal(rilMsg->aBearerData, digitLimit);
7384
Jayachandran C572f2f42017-03-25 14:30:13 -07007385#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007386 RLOGD("cdmaNewSmsInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07007387#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007388 Return<void> retStatus = radioService[slotId]->mRadioIndication->cdmaNewSms(
Amit Mahajan5829a472016-12-28 17:28:07 -08007389 convertIntToRadioIndicationType(indicationType), msg);
Amit Mahajan17249842017-01-19 15:05:45 -08007390 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08007391 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007392 RLOGE("cdmaNewSmsInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08007393 }
7394
7395 return 0;
7396}
7397
Amit Mahajan759786a2017-03-03 17:35:47 -08007398int radio::newBroadcastSmsInd(int slotId,
Amit Mahajan1955c742016-12-29 07:07:54 -08007399 int indicationType, int token, RIL_Errno e, void *response,
7400 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007401 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan1955c742016-12-29 07:07:54 -08007402 if (response == NULL || responseLen == 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007403 RLOGE("newBroadcastSmsInd: invalid response");
Amit Mahajan1955c742016-12-29 07:07:54 -08007404 return 0;
7405 }
7406
7407 hidl_vec<uint8_t> data;
7408 data.setToExternal((uint8_t *) response, responseLen);
Jayachandran C572f2f42017-03-25 14:30:13 -07007409#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007410 RLOGD("newBroadcastSmsInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07007411#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007412 Return<void> retStatus = radioService[slotId]->mRadioIndication->newBroadcastSms(
Amit Mahajan1955c742016-12-29 07:07:54 -08007413 convertIntToRadioIndicationType(indicationType), data);
Amit Mahajan17249842017-01-19 15:05:45 -08007414 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan1955c742016-12-29 07:07:54 -08007415 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007416 RLOGE("newBroadcastSmsInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan1955c742016-12-29 07:07:54 -08007417 }
7418
7419 return 0;
7420}
7421
Amit Mahajan759786a2017-03-03 17:35:47 -08007422int radio::cdmaRuimSmsStorageFullInd(int slotId,
Amit Mahajan1955c742016-12-29 07:07:54 -08007423 int indicationType, int token, RIL_Errno e, void *response,
7424 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007425 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Jayachandran C572f2f42017-03-25 14:30:13 -07007426#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007427 RLOGD("cdmaRuimSmsStorageFullInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07007428#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007429 Return<void> retStatus = radioService[slotId]->mRadioIndication->cdmaRuimSmsStorageFull(
Amit Mahajan1955c742016-12-29 07:07:54 -08007430 convertIntToRadioIndicationType(indicationType));
Amit Mahajan17249842017-01-19 15:05:45 -08007431 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan1955c742016-12-29 07:07:54 -08007432 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007433 RLOGE("cdmaRuimSmsStorageFullInd: radioService[%d]->mRadioIndication == NULL",
Amit Mahajan1955c742016-12-29 07:07:54 -08007434 slotId);
7435 }
7436
7437 return 0;
7438}
7439
Amit Mahajan759786a2017-03-03 17:35:47 -08007440int radio::restrictedStateChangedInd(int slotId,
Amit Mahajan1955c742016-12-29 07:07:54 -08007441 int indicationType, int token, RIL_Errno e, void *response,
7442 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007443 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan1955c742016-12-29 07:07:54 -08007444 if (response == NULL || responseLen != sizeof(int)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007445 RLOGE("restrictedStateChangedInd: invalid response");
Amit Mahajan1955c742016-12-29 07:07:54 -08007446 return 0;
7447 }
7448 int32_t state = ((int32_t *) response)[0];
Jayachandran C572f2f42017-03-25 14:30:13 -07007449#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007450 RLOGD("restrictedStateChangedInd: state %d", state);
Jayachandran C572f2f42017-03-25 14:30:13 -07007451#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007452 Return<void> retStatus = radioService[slotId]->mRadioIndication->restrictedStateChanged(
Amit Mahajan1955c742016-12-29 07:07:54 -08007453 convertIntToRadioIndicationType(indicationType), (PhoneRestrictedState) state);
Amit Mahajan17249842017-01-19 15:05:45 -08007454 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan1955c742016-12-29 07:07:54 -08007455 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007456 RLOGE("restrictedStateChangedInd: radioService[%d]->mRadioIndication == NULL",
Amit Mahajan1955c742016-12-29 07:07:54 -08007457 slotId);
7458 }
7459
7460 return 0;
7461}
7462
Amit Mahajan759786a2017-03-03 17:35:47 -08007463int radio::enterEmergencyCallbackModeInd(int slotId,
Amit Mahajan1955c742016-12-29 07:07:54 -08007464 int indicationType, int token, RIL_Errno e, void *response,
7465 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007466 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Jayachandran C572f2f42017-03-25 14:30:13 -07007467#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007468 RLOGD("enterEmergencyCallbackModeInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07007469#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007470 Return<void> retStatus = radioService[slotId]->mRadioIndication->enterEmergencyCallbackMode(
Amit Mahajan1955c742016-12-29 07:07:54 -08007471 convertIntToRadioIndicationType(indicationType));
Amit Mahajan17249842017-01-19 15:05:45 -08007472 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan1955c742016-12-29 07:07:54 -08007473 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007474 RLOGE("enterEmergencyCallbackModeInd: radioService[%d]->mRadioIndication == NULL",
Amit Mahajan1955c742016-12-29 07:07:54 -08007475 slotId);
7476 }
7477
7478 return 0;
7479}
7480
Amit Mahajan759786a2017-03-03 17:35:47 -08007481int radio::cdmaCallWaitingInd(int slotId,
Amit Mahajan1955c742016-12-29 07:07:54 -08007482 int indicationType, int token, RIL_Errno e, void *response,
7483 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007484 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan1955c742016-12-29 07:07:54 -08007485 if (response == NULL || responseLen != sizeof(RIL_CDMA_CallWaiting_v6)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007486 RLOGE("cdmaCallWaitingInd: invalid response");
Amit Mahajan1955c742016-12-29 07:07:54 -08007487 return 0;
7488 }
7489
Jack Yuf68e0da2017-02-07 14:53:09 -08007490 CdmaCallWaiting callWaitingRecord = {};
Amit Mahajan1955c742016-12-29 07:07:54 -08007491 RIL_CDMA_CallWaiting_v6 *callWaitingRil = ((RIL_CDMA_CallWaiting_v6 *) response);
7492 callWaitingRecord.number = convertCharPtrToHidlString(callWaitingRil->number);
7493 callWaitingRecord.numberPresentation =
7494 (CdmaCallWaitingNumberPresentation) callWaitingRil->numberPresentation;
7495 callWaitingRecord.name = convertCharPtrToHidlString(callWaitingRil->name);
7496 convertRilCdmaSignalInfoRecordToHal(&callWaitingRil->signalInfoRecord,
7497 callWaitingRecord.signalInfoRecord);
7498 callWaitingRecord.numberType = (CdmaCallWaitingNumberType) callWaitingRil->number_type;
7499 callWaitingRecord.numberPlan = (CdmaCallWaitingNumberPlan) callWaitingRil->number_plan;
7500
Jayachandran C572f2f42017-03-25 14:30:13 -07007501#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007502 RLOGD("cdmaCallWaitingInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07007503#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007504 Return<void> retStatus = radioService[slotId]->mRadioIndication->cdmaCallWaiting(
Amit Mahajan1955c742016-12-29 07:07:54 -08007505 convertIntToRadioIndicationType(indicationType), callWaitingRecord);
Amit Mahajan17249842017-01-19 15:05:45 -08007506 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan1955c742016-12-29 07:07:54 -08007507 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007508 RLOGE("cdmaCallWaitingInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan1955c742016-12-29 07:07:54 -08007509 }
7510
7511 return 0;
7512}
7513
Amit Mahajan759786a2017-03-03 17:35:47 -08007514int radio::cdmaOtaProvisionStatusInd(int slotId,
Amit Mahajan1955c742016-12-29 07:07:54 -08007515 int indicationType, int token, RIL_Errno e, void *response,
7516 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007517 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan1955c742016-12-29 07:07:54 -08007518 if (response == NULL || responseLen != sizeof(int)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007519 RLOGE("cdmaOtaProvisionStatusInd: invalid response");
Amit Mahajan1955c742016-12-29 07:07:54 -08007520 return 0;
7521 }
7522 int32_t status = ((int32_t *) response)[0];
Jayachandran C572f2f42017-03-25 14:30:13 -07007523#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007524 RLOGD("cdmaOtaProvisionStatusInd: status %d", status);
Jayachandran C572f2f42017-03-25 14:30:13 -07007525#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007526 Return<void> retStatus = radioService[slotId]->mRadioIndication->cdmaOtaProvisionStatus(
Amit Mahajan1955c742016-12-29 07:07:54 -08007527 convertIntToRadioIndicationType(indicationType), (CdmaOtaProvisionStatus) status);
Amit Mahajan17249842017-01-19 15:05:45 -08007528 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan1955c742016-12-29 07:07:54 -08007529 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007530 RLOGE("cdmaOtaProvisionStatusInd: radioService[%d]->mRadioIndication == NULL",
Amit Mahajan1955c742016-12-29 07:07:54 -08007531 slotId);
7532 }
7533
7534 return 0;
7535}
7536
Amit Mahajan759786a2017-03-03 17:35:47 -08007537int radio::cdmaInfoRecInd(int slotId,
Amit Mahajan1955c742016-12-29 07:07:54 -08007538 int indicationType, int token, RIL_Errno e, void *response,
7539 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007540 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan1955c742016-12-29 07:07:54 -08007541 if (response == NULL || responseLen != sizeof(RIL_CDMA_InformationRecords)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007542 RLOGE("cdmaInfoRecInd: invalid response");
Amit Mahajan1955c742016-12-29 07:07:54 -08007543 return 0;
7544 }
7545
Jack Yuf68e0da2017-02-07 14:53:09 -08007546 CdmaInformationRecords records = {};
Amit Mahajan1955c742016-12-29 07:07:54 -08007547 RIL_CDMA_InformationRecords *recordsRil = (RIL_CDMA_InformationRecords *) response;
7548
7549 char* string8 = NULL;
7550 int num = MIN(recordsRil->numberOfInfoRecs, RIL_CDMA_MAX_NUMBER_OF_INFO_RECS);
7551 if (recordsRil->numberOfInfoRecs > RIL_CDMA_MAX_NUMBER_OF_INFO_RECS) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007552 RLOGE("cdmaInfoRecInd: received %d recs which is more than %d, dropping "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08007553 "additional ones", recordsRil->numberOfInfoRecs,
Amit Mahajan1955c742016-12-29 07:07:54 -08007554 RIL_CDMA_MAX_NUMBER_OF_INFO_RECS);
7555 }
7556 records.infoRec.resize(num);
7557 for (int i = 0 ; i < num ; i++) {
7558 CdmaInformationRecord *record = &records.infoRec[i];
7559 RIL_CDMA_InformationRecord *infoRec = &recordsRil->infoRec[i];
7560 record->name = (CdmaInfoRecName) infoRec->name;
Sanket Padawe378ccdd2017-01-24 14:11:12 -08007561 // All vectors should be size 0 except one which will be size 1. Set everything to
7562 // size 0 initially.
7563 record->display.resize(0);
7564 record->number.resize(0);
7565 record->signal.resize(0);
7566 record->redir.resize(0);
7567 record->lineCtrl.resize(0);
7568 record->clir.resize(0);
7569 record->audioCtrl.resize(0);
Amit Mahajan1955c742016-12-29 07:07:54 -08007570 switch (infoRec->name) {
7571 case RIL_CDMA_DISPLAY_INFO_REC:
7572 case RIL_CDMA_EXTENDED_DISPLAY_INFO_REC: {
7573 if (infoRec->rec.display.alpha_len > CDMA_ALPHA_INFO_BUFFER_LENGTH) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007574 RLOGE("cdmaInfoRecInd: invalid display info response length %d "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08007575 "expected not more than %d", (int) infoRec->rec.display.alpha_len,
Amit Mahajan1955c742016-12-29 07:07:54 -08007576 CDMA_ALPHA_INFO_BUFFER_LENGTH);
7577 return 0;
7578 }
7579 string8 = (char*) malloc((infoRec->rec.display.alpha_len + 1) * sizeof(char));
7580 if (string8 == NULL) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007581 RLOGE("cdmaInfoRecInd: Memory allocation failed for "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08007582 "responseCdmaInformationRecords");
Amit Mahajan1955c742016-12-29 07:07:54 -08007583 return 0;
7584 }
7585 memcpy(string8, infoRec->rec.display.alpha_buf, infoRec->rec.display.alpha_len);
7586 string8[(int)infoRec->rec.display.alpha_len] = '\0';
7587
7588 record->display.resize(1);
7589 record->display[0].alphaBuf = string8;
7590 free(string8);
7591 string8 = NULL;
7592 break;
7593 }
7594
7595 case RIL_CDMA_CALLED_PARTY_NUMBER_INFO_REC:
7596 case RIL_CDMA_CALLING_PARTY_NUMBER_INFO_REC:
7597 case RIL_CDMA_CONNECTED_NUMBER_INFO_REC: {
7598 if (infoRec->rec.number.len > CDMA_NUMBER_INFO_BUFFER_LENGTH) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007599 RLOGE("cdmaInfoRecInd: invalid display info response length %d "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08007600 "expected not more than %d", (int) infoRec->rec.number.len,
Amit Mahajan1955c742016-12-29 07:07:54 -08007601 CDMA_NUMBER_INFO_BUFFER_LENGTH);
7602 return 0;
7603 }
7604 string8 = (char*) malloc((infoRec->rec.number.len + 1) * sizeof(char));
7605 if (string8 == NULL) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007606 RLOGE("cdmaInfoRecInd: Memory allocation failed for "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08007607 "responseCdmaInformationRecords");
Amit Mahajan1955c742016-12-29 07:07:54 -08007608 return 0;
7609 }
7610 memcpy(string8, infoRec->rec.number.buf, infoRec->rec.number.len);
7611 string8[(int)infoRec->rec.number.len] = '\0';
7612
7613 record->number.resize(1);
7614 record->number[0].number = string8;
7615 free(string8);
7616 string8 = NULL;
7617 record->number[0].numberType = infoRec->rec.number.number_type;
7618 record->number[0].numberPlan = infoRec->rec.number.number_plan;
7619 record->number[0].pi = infoRec->rec.number.pi;
7620 record->number[0].si = infoRec->rec.number.si;
7621 break;
7622 }
7623
7624 case RIL_CDMA_SIGNAL_INFO_REC: {
7625 record->signal.resize(1);
7626 record->signal[0].isPresent = infoRec->rec.signal.isPresent;
7627 record->signal[0].signalType = infoRec->rec.signal.signalType;
7628 record->signal[0].alertPitch = infoRec->rec.signal.alertPitch;
7629 record->signal[0].signal = infoRec->rec.signal.signal;
7630 break;
7631 }
7632
7633 case RIL_CDMA_REDIRECTING_NUMBER_INFO_REC: {
7634 if (infoRec->rec.redir.redirectingNumber.len >
7635 CDMA_NUMBER_INFO_BUFFER_LENGTH) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007636 RLOGE("cdmaInfoRecInd: invalid display info response length %d "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08007637 "expected not more than %d\n",
Amit Mahajan1955c742016-12-29 07:07:54 -08007638 (int)infoRec->rec.redir.redirectingNumber.len,
7639 CDMA_NUMBER_INFO_BUFFER_LENGTH);
7640 return 0;
7641 }
7642 string8 = (char*) malloc((infoRec->rec.redir.redirectingNumber.len + 1) *
7643 sizeof(char));
7644 if (string8 == NULL) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007645 RLOGE("cdmaInfoRecInd: Memory allocation failed for "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08007646 "responseCdmaInformationRecords");
Amit Mahajan1955c742016-12-29 07:07:54 -08007647 return 0;
7648 }
7649 memcpy(string8, infoRec->rec.redir.redirectingNumber.buf,
7650 infoRec->rec.redir.redirectingNumber.len);
7651 string8[(int)infoRec->rec.redir.redirectingNumber.len] = '\0';
7652
7653 record->redir.resize(1);
7654 record->redir[0].redirectingNumber.number = string8;
7655 free(string8);
7656 string8 = NULL;
7657 record->redir[0].redirectingNumber.numberType =
7658 infoRec->rec.redir.redirectingNumber.number_type;
7659 record->redir[0].redirectingNumber.numberPlan =
7660 infoRec->rec.redir.redirectingNumber.number_plan;
7661 record->redir[0].redirectingNumber.pi = infoRec->rec.redir.redirectingNumber.pi;
7662 record->redir[0].redirectingNumber.si = infoRec->rec.redir.redirectingNumber.si;
7663 record->redir[0].redirectingReason =
7664 (CdmaRedirectingReason) infoRec->rec.redir.redirectingReason;
7665 break;
7666 }
7667
7668 case RIL_CDMA_LINE_CONTROL_INFO_REC: {
7669 record->lineCtrl.resize(1);
7670 record->lineCtrl[0].lineCtrlPolarityIncluded =
7671 infoRec->rec.lineCtrl.lineCtrlPolarityIncluded;
7672 record->lineCtrl[0].lineCtrlToggle = infoRec->rec.lineCtrl.lineCtrlToggle;
7673 record->lineCtrl[0].lineCtrlReverse = infoRec->rec.lineCtrl.lineCtrlReverse;
7674 record->lineCtrl[0].lineCtrlPowerDenial =
7675 infoRec->rec.lineCtrl.lineCtrlPowerDenial;
7676 break;
7677 }
7678
7679 case RIL_CDMA_T53_CLIR_INFO_REC: {
7680 record->clir.resize(1);
7681 record->clir[0].cause = infoRec->rec.clir.cause;
7682 break;
7683 }
7684
7685 case RIL_CDMA_T53_AUDIO_CONTROL_INFO_REC: {
7686 record->audioCtrl.resize(1);
7687 record->audioCtrl[0].upLink = infoRec->rec.audioCtrl.upLink;
7688 record->audioCtrl[0].downLink = infoRec->rec.audioCtrl.downLink;
7689 break;
7690 }
7691
7692 case RIL_CDMA_T53_RELEASE_INFO_REC:
Amit Mahajan111ddca2017-03-03 12:05:13 -08007693 RLOGE("cdmaInfoRecInd: RIL_CDMA_T53_RELEASE_INFO_REC: INVALID");
Amit Mahajan1955c742016-12-29 07:07:54 -08007694 return 0;
7695
7696 default:
Amit Mahajan111ddca2017-03-03 12:05:13 -08007697 RLOGE("cdmaInfoRecInd: Incorrect name value");
Amit Mahajan1955c742016-12-29 07:07:54 -08007698 return 0;
7699 }
7700 }
7701
Jayachandran C572f2f42017-03-25 14:30:13 -07007702#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007703 RLOGD("cdmaInfoRecInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07007704#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007705 Return<void> retStatus = radioService[slotId]->mRadioIndication->cdmaInfoRec(
Amit Mahajan1955c742016-12-29 07:07:54 -08007706 convertIntToRadioIndicationType(indicationType), records);
Amit Mahajan17249842017-01-19 15:05:45 -08007707 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan1955c742016-12-29 07:07:54 -08007708 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007709 RLOGE("cdmaInfoRecInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan1955c742016-12-29 07:07:54 -08007710 }
7711
7712 return 0;
7713}
7714
Amit Mahajan759786a2017-03-03 17:35:47 -08007715int radio::indicateRingbackToneInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007716 int indicationType, int token, RIL_Errno e, void *response,
7717 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007718 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007719 if (response == NULL || responseLen != sizeof(int)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007720 RLOGE("indicateRingbackToneInd: invalid response");
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007721 return 0;
7722 }
7723 bool start = ((int32_t *) response)[0];
Jayachandran C572f2f42017-03-25 14:30:13 -07007724#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007725 RLOGD("indicateRingbackToneInd: start %d", start);
Jayachandran C572f2f42017-03-25 14:30:13 -07007726#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007727 Return<void> retStatus = radioService[slotId]->mRadioIndication->indicateRingbackTone(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007728 convertIntToRadioIndicationType(indicationType), start);
Amit Mahajan17249842017-01-19 15:05:45 -08007729 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007730 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007731 RLOGE("indicateRingbackToneInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007732 }
7733
7734 return 0;
7735}
7736
Amit Mahajan759786a2017-03-03 17:35:47 -08007737int radio::resendIncallMuteInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007738 int indicationType, int token, RIL_Errno e, void *response,
7739 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007740 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Jayachandran C572f2f42017-03-25 14:30:13 -07007741#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007742 RLOGD("resendIncallMuteInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07007743#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007744 Return<void> retStatus = radioService[slotId]->mRadioIndication->resendIncallMute(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007745 convertIntToRadioIndicationType(indicationType));
Amit Mahajan17249842017-01-19 15:05:45 -08007746 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007747 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007748 RLOGE("resendIncallMuteInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007749 }
7750
7751 return 0;
7752}
7753
Amit Mahajan759786a2017-03-03 17:35:47 -08007754int radio::cdmaSubscriptionSourceChangedInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007755 int indicationType, int token, RIL_Errno e,
7756 void *response, size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007757 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007758 if (response == NULL || responseLen != sizeof(int)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007759 RLOGE("cdmaSubscriptionSourceChangedInd: invalid response");
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007760 return 0;
7761 }
7762 int32_t cdmaSource = ((int32_t *) response)[0];
Jayachandran C572f2f42017-03-25 14:30:13 -07007763#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007764 RLOGD("cdmaSubscriptionSourceChangedInd: cdmaSource %d", cdmaSource);
Jayachandran C572f2f42017-03-25 14:30:13 -07007765#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007766 Return<void> retStatus = radioService[slotId]->mRadioIndication->
7767 cdmaSubscriptionSourceChanged(convertIntToRadioIndicationType(indicationType),
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007768 (CdmaSubscriptionSource) cdmaSource);
Amit Mahajan17249842017-01-19 15:05:45 -08007769 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007770 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007771 RLOGE("cdmaSubscriptionSourceChangedInd: radioService[%d]->mRadioIndication == NULL",
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007772 slotId);
7773 }
7774
7775 return 0;
7776}
7777
Amit Mahajan759786a2017-03-03 17:35:47 -08007778int radio::cdmaPrlChangedInd(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("cdmaPrlChangedInd: invalid response");
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007784 return 0;
7785 }
7786 int32_t version = ((int32_t *) response)[0];
Jayachandran C572f2f42017-03-25 14:30:13 -07007787#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007788 RLOGD("cdmaPrlChangedInd: version %d", version);
Jayachandran C572f2f42017-03-25 14:30:13 -07007789#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007790 Return<void> retStatus = radioService[slotId]->mRadioIndication->cdmaPrlChanged(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007791 convertIntToRadioIndicationType(indicationType), version);
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("cdmaPrlChangedInd: 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::exitEmergencyCallbackModeInd(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("exitEmergencyCallbackModeInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07007806#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007807 Return<void> retStatus = radioService[slotId]->mRadioIndication->exitEmergencyCallbackMode(
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("exitEmergencyCallbackModeInd: radioService[%d]->mRadioIndication == NULL",
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007812 slotId);
7813 }
7814
7815 return 0;
7816}
7817
Amit Mahajan759786a2017-03-03 17:35:47 -08007818int radio::rilConnectedInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007819 int indicationType, int token, RIL_Errno e, void *response,
7820 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007821 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007822 RLOGD("rilConnectedInd");
Amit Mahajan17249842017-01-19 15:05:45 -08007823 Return<void> retStatus = radioService[slotId]->mRadioIndication->rilConnected(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007824 convertIntToRadioIndicationType(indicationType));
Amit Mahajan17249842017-01-19 15:05:45 -08007825 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007826 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007827 RLOGE("rilConnectedInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007828 }
7829
7830 return 0;
7831}
7832
Amit Mahajan759786a2017-03-03 17:35:47 -08007833int radio::voiceRadioTechChangedInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007834 int indicationType, int token, RIL_Errno e, void *response,
7835 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007836 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007837 if (response == NULL || responseLen != sizeof(int)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007838 RLOGE("voiceRadioTechChangedInd: invalid response");
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007839 return 0;
7840 }
7841 int32_t rat = ((int32_t *) response)[0];
Jayachandran C572f2f42017-03-25 14:30:13 -07007842#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007843 RLOGD("voiceRadioTechChangedInd: rat %d", rat);
Jayachandran C572f2f42017-03-25 14:30:13 -07007844#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007845 Return<void> retStatus = radioService[slotId]->mRadioIndication->voiceRadioTechChanged(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007846 convertIntToRadioIndicationType(indicationType), (RadioTechnology) rat);
Amit Mahajan17249842017-01-19 15:05:45 -08007847 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007848 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007849 RLOGE("voiceRadioTechChangedInd: radioService[%d]->mRadioIndication == NULL",
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007850 slotId);
7851 }
7852
7853 return 0;
7854}
7855
7856void convertRilCellInfoListToHal(void *response, size_t responseLen, hidl_vec<CellInfo>& records) {
7857 int num = responseLen / sizeof(RIL_CellInfo_v12);
7858 records.resize(num);
7859
7860 RIL_CellInfo_v12 *rillCellInfo = (RIL_CellInfo_v12 *) response;
7861 for (int i = 0; i < num; i++) {
7862 records[i].cellInfoType = (CellInfoType) rillCellInfo->cellInfoType;
7863 records[i].registered = rillCellInfo->registered;
7864 records[i].timeStampType = (TimeStampType) rillCellInfo->timeStampType;
7865 records[i].timeStamp = rillCellInfo->timeStamp;
Sanket Padawe378ccdd2017-01-24 14:11:12 -08007866 // All vectors should be size 0 except one which will be size 1. Set everything to
7867 // size 0 initially.
7868 records[i].gsm.resize(0);
7869 records[i].wcdma.resize(0);
7870 records[i].cdma.resize(0);
7871 records[i].lte.resize(0);
7872 records[i].tdscdma.resize(0);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007873 switch(rillCellInfo->cellInfoType) {
7874 case RIL_CELL_INFO_TYPE_GSM: {
7875 records[i].gsm.resize(1);
7876 CellInfoGsm *cellInfoGsm = &records[i].gsm[0];
7877 cellInfoGsm->cellIdentityGsm.mcc =
7878 std::to_string(rillCellInfo->CellInfo.gsm.cellIdentityGsm.mcc);
7879 cellInfoGsm->cellIdentityGsm.mnc =
Nathan Harold98cfcee2018-08-20 11:38:27 -07007880 ril::util::mnc::decode(rillCellInfo->CellInfo.gsm.cellIdentityGsm.mnc);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007881 cellInfoGsm->cellIdentityGsm.lac =
7882 rillCellInfo->CellInfo.gsm.cellIdentityGsm.lac;
7883 cellInfoGsm->cellIdentityGsm.cid =
7884 rillCellInfo->CellInfo.gsm.cellIdentityGsm.cid;
7885 cellInfoGsm->cellIdentityGsm.arfcn =
7886 rillCellInfo->CellInfo.gsm.cellIdentityGsm.arfcn;
7887 cellInfoGsm->cellIdentityGsm.bsic =
7888 rillCellInfo->CellInfo.gsm.cellIdentityGsm.bsic;
7889 cellInfoGsm->signalStrengthGsm.signalStrength =
7890 rillCellInfo->CellInfo.gsm.signalStrengthGsm.signalStrength;
7891 cellInfoGsm->signalStrengthGsm.bitErrorRate =
7892 rillCellInfo->CellInfo.gsm.signalStrengthGsm.bitErrorRate;
7893 cellInfoGsm->signalStrengthGsm.timingAdvance =
7894 rillCellInfo->CellInfo.gsm.signalStrengthGsm.timingAdvance;
7895 break;
7896 }
7897
7898 case RIL_CELL_INFO_TYPE_WCDMA: {
7899 records[i].wcdma.resize(1);
7900 CellInfoWcdma *cellInfoWcdma = &records[i].wcdma[0];
7901 cellInfoWcdma->cellIdentityWcdma.mcc =
7902 std::to_string(rillCellInfo->CellInfo.wcdma.cellIdentityWcdma.mcc);
7903 cellInfoWcdma->cellIdentityWcdma.mnc =
Nathan Harold98cfcee2018-08-20 11:38:27 -07007904 ril::util::mnc::decode(rillCellInfo->CellInfo.wcdma.cellIdentityWcdma.mnc);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007905 cellInfoWcdma->cellIdentityWcdma.lac =
7906 rillCellInfo->CellInfo.wcdma.cellIdentityWcdma.lac;
7907 cellInfoWcdma->cellIdentityWcdma.cid =
7908 rillCellInfo->CellInfo.wcdma.cellIdentityWcdma.cid;
7909 cellInfoWcdma->cellIdentityWcdma.psc =
7910 rillCellInfo->CellInfo.wcdma.cellIdentityWcdma.psc;
7911 cellInfoWcdma->cellIdentityWcdma.uarfcn =
7912 rillCellInfo->CellInfo.wcdma.cellIdentityWcdma.uarfcn;
7913 cellInfoWcdma->signalStrengthWcdma.signalStrength =
7914 rillCellInfo->CellInfo.wcdma.signalStrengthWcdma.signalStrength;
7915 cellInfoWcdma->signalStrengthWcdma.bitErrorRate =
7916 rillCellInfo->CellInfo.wcdma.signalStrengthWcdma.bitErrorRate;
7917 break;
7918 }
7919
7920 case RIL_CELL_INFO_TYPE_CDMA: {
7921 records[i].cdma.resize(1);
7922 CellInfoCdma *cellInfoCdma = &records[i].cdma[0];
7923 cellInfoCdma->cellIdentityCdma.networkId =
7924 rillCellInfo->CellInfo.cdma.cellIdentityCdma.networkId;
7925 cellInfoCdma->cellIdentityCdma.systemId =
7926 rillCellInfo->CellInfo.cdma.cellIdentityCdma.systemId;
7927 cellInfoCdma->cellIdentityCdma.baseStationId =
7928 rillCellInfo->CellInfo.cdma.cellIdentityCdma.basestationId;
7929 cellInfoCdma->cellIdentityCdma.longitude =
7930 rillCellInfo->CellInfo.cdma.cellIdentityCdma.longitude;
7931 cellInfoCdma->cellIdentityCdma.latitude =
7932 rillCellInfo->CellInfo.cdma.cellIdentityCdma.latitude;
7933 cellInfoCdma->signalStrengthCdma.dbm =
7934 rillCellInfo->CellInfo.cdma.signalStrengthCdma.dbm;
7935 cellInfoCdma->signalStrengthCdma.ecio =
7936 rillCellInfo->CellInfo.cdma.signalStrengthCdma.ecio;
7937 cellInfoCdma->signalStrengthEvdo.dbm =
7938 rillCellInfo->CellInfo.cdma.signalStrengthEvdo.dbm;
7939 cellInfoCdma->signalStrengthEvdo.ecio =
7940 rillCellInfo->CellInfo.cdma.signalStrengthEvdo.ecio;
7941 cellInfoCdma->signalStrengthEvdo.signalNoiseRatio =
7942 rillCellInfo->CellInfo.cdma.signalStrengthEvdo.signalNoiseRatio;
7943 break;
7944 }
7945
7946 case RIL_CELL_INFO_TYPE_LTE: {
7947 records[i].lte.resize(1);
7948 CellInfoLte *cellInfoLte = &records[i].lte[0];
7949 cellInfoLte->cellIdentityLte.mcc =
7950 std::to_string(rillCellInfo->CellInfo.lte.cellIdentityLte.mcc);
7951 cellInfoLte->cellIdentityLte.mnc =
Nathan Harold98cfcee2018-08-20 11:38:27 -07007952 ril::util::mnc::decode(rillCellInfo->CellInfo.lte.cellIdentityLte.mnc);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007953 cellInfoLte->cellIdentityLte.ci =
7954 rillCellInfo->CellInfo.lte.cellIdentityLte.ci;
7955 cellInfoLte->cellIdentityLte.pci =
7956 rillCellInfo->CellInfo.lte.cellIdentityLte.pci;
7957 cellInfoLte->cellIdentityLte.tac =
7958 rillCellInfo->CellInfo.lte.cellIdentityLte.tac;
7959 cellInfoLte->cellIdentityLte.earfcn =
7960 rillCellInfo->CellInfo.lte.cellIdentityLte.earfcn;
7961 cellInfoLte->signalStrengthLte.signalStrength =
7962 rillCellInfo->CellInfo.lte.signalStrengthLte.signalStrength;
7963 cellInfoLte->signalStrengthLte.rsrp =
7964 rillCellInfo->CellInfo.lte.signalStrengthLte.rsrp;
7965 cellInfoLte->signalStrengthLte.rsrq =
7966 rillCellInfo->CellInfo.lte.signalStrengthLte.rsrq;
7967 cellInfoLte->signalStrengthLte.rssnr =
7968 rillCellInfo->CellInfo.lte.signalStrengthLte.rssnr;
7969 cellInfoLte->signalStrengthLte.cqi =
7970 rillCellInfo->CellInfo.lte.signalStrengthLte.cqi;
7971 cellInfoLte->signalStrengthLte.timingAdvance =
7972 rillCellInfo->CellInfo.lte.signalStrengthLte.timingAdvance;
7973 break;
7974 }
7975
7976 case RIL_CELL_INFO_TYPE_TD_SCDMA: {
7977 records[i].tdscdma.resize(1);
7978 CellInfoTdscdma *cellInfoTdscdma = &records[i].tdscdma[0];
7979 cellInfoTdscdma->cellIdentityTdscdma.mcc =
7980 std::to_string(rillCellInfo->CellInfo.tdscdma.cellIdentityTdscdma.mcc);
7981 cellInfoTdscdma->cellIdentityTdscdma.mnc =
Nathan Harold98cfcee2018-08-20 11:38:27 -07007982 ril::util::mnc::decode(
7983 rillCellInfo->CellInfo.tdscdma.cellIdentityTdscdma.mnc);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007984 cellInfoTdscdma->cellIdentityTdscdma.lac =
7985 rillCellInfo->CellInfo.tdscdma.cellIdentityTdscdma.lac;
7986 cellInfoTdscdma->cellIdentityTdscdma.cid =
7987 rillCellInfo->CellInfo.tdscdma.cellIdentityTdscdma.cid;
7988 cellInfoTdscdma->cellIdentityTdscdma.cpid =
7989 rillCellInfo->CellInfo.tdscdma.cellIdentityTdscdma.cpid;
7990 cellInfoTdscdma->signalStrengthTdscdma.rscp =
7991 rillCellInfo->CellInfo.tdscdma.signalStrengthTdscdma.rscp;
7992 break;
7993 }
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08007994 default: {
7995 break;
7996 }
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007997 }
7998 rillCellInfo += 1;
7999 }
8000}
8001
Amit Mahajan759786a2017-03-03 17:35:47 -08008002int radio::cellInfoListInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008003 int indicationType, int token, RIL_Errno e, void *response,
8004 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08008005 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan13058cb2017-06-07 23:10:27 -07008006 if ((response == NULL && responseLen != 0) || responseLen % sizeof(RIL_CellInfo_v12) != 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008007 RLOGE("cellInfoListInd: invalid response");
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008008 return 0;
8009 }
8010
8011 hidl_vec<CellInfo> records;
8012 convertRilCellInfoListToHal(response, responseLen, records);
8013
Jayachandran C572f2f42017-03-25 14:30:13 -07008014#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08008015 RLOGD("cellInfoListInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07008016#endif
Amit Mahajan17249842017-01-19 15:05:45 -08008017 Return<void> retStatus = radioService[slotId]->mRadioIndication->cellInfoList(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008018 convertIntToRadioIndicationType(indicationType), records);
Amit Mahajan17249842017-01-19 15:05:45 -08008019 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008020 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008021 RLOGE("cellInfoListInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008022 }
8023
8024 return 0;
8025}
8026
Amit Mahajan759786a2017-03-03 17:35:47 -08008027int radio::imsNetworkStateChangedInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008028 int indicationType, int token, RIL_Errno e, void *response,
8029 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08008030 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Jayachandran C572f2f42017-03-25 14:30:13 -07008031#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08008032 RLOGD("imsNetworkStateChangedInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07008033#endif
Amit Mahajan17249842017-01-19 15:05:45 -08008034 Return<void> retStatus = radioService[slotId]->mRadioIndication->imsNetworkStateChanged(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008035 convertIntToRadioIndicationType(indicationType));
Amit Mahajan17249842017-01-19 15:05:45 -08008036 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008037 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008038 RLOGE("imsNetworkStateChangedInd: radioService[%d]->mRadioIndication == NULL",
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008039 slotId);
8040 }
8041
8042 return 0;
8043}
8044
Amit Mahajan759786a2017-03-03 17:35:47 -08008045int radio::subscriptionStatusChangedInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008046 int indicationType, int token, RIL_Errno e, void *response,
8047 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08008048 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008049 if (response == NULL || responseLen != sizeof(int)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008050 RLOGE("subscriptionStatusChangedInd: invalid response");
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008051 return 0;
8052 }
8053 bool activate = ((int32_t *) response)[0];
Jayachandran C572f2f42017-03-25 14:30:13 -07008054#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08008055 RLOGD("subscriptionStatusChangedInd: activate %d", activate);
Jayachandran C572f2f42017-03-25 14:30:13 -07008056#endif
Amit Mahajan17249842017-01-19 15:05:45 -08008057 Return<void> retStatus = radioService[slotId]->mRadioIndication->subscriptionStatusChanged(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008058 convertIntToRadioIndicationType(indicationType), activate);
Amit Mahajan17249842017-01-19 15:05:45 -08008059 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008060 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008061 RLOGE("subscriptionStatusChangedInd: radioService[%d]->mRadioIndication == NULL",
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008062 slotId);
8063 }
8064
8065 return 0;
8066}
8067
Amit Mahajan759786a2017-03-03 17:35:47 -08008068int radio::srvccStateNotifyInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008069 int indicationType, int token, RIL_Errno e, void *response,
8070 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08008071 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008072 if (response == NULL || responseLen != sizeof(int)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008073 RLOGE("srvccStateNotifyInd: invalid response");
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008074 return 0;
8075 }
8076 int32_t state = ((int32_t *) response)[0];
Jayachandran C572f2f42017-03-25 14:30:13 -07008077#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08008078 RLOGD("srvccStateNotifyInd: rat %d", state);
Jayachandran C572f2f42017-03-25 14:30:13 -07008079#endif
Amit Mahajan17249842017-01-19 15:05:45 -08008080 Return<void> retStatus = radioService[slotId]->mRadioIndication->srvccStateNotify(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008081 convertIntToRadioIndicationType(indicationType), (SrvccState) state);
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("srvccStateNotifyInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008085 }
8086
8087 return 0;
8088}
8089
8090void convertRilHardwareConfigListToHal(void *response, size_t responseLen,
8091 hidl_vec<HardwareConfig>& records) {
8092 int num = responseLen / sizeof(RIL_HardwareConfig);
8093 records.resize(num);
8094
8095 RIL_HardwareConfig *rilHardwareConfig = (RIL_HardwareConfig *) response;
8096 for (int i = 0; i < num; i++) {
8097 records[i].type = (HardwareConfigType) rilHardwareConfig[i].type;
8098 records[i].uuid = convertCharPtrToHidlString(rilHardwareConfig[i].uuid);
8099 records[i].state = (HardwareConfigState) rilHardwareConfig[i].state;
8100 switch (rilHardwareConfig[i].type) {
8101 case RIL_HARDWARE_CONFIG_MODEM: {
8102 records[i].modem.resize(1);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08008103 records[i].sim.resize(0);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008104 HardwareConfigModem *hwConfigModem = &records[i].modem[0];
8105 hwConfigModem->rat = rilHardwareConfig[i].cfg.modem.rat;
8106 hwConfigModem->maxVoice = rilHardwareConfig[i].cfg.modem.maxVoice;
8107 hwConfigModem->maxData = rilHardwareConfig[i].cfg.modem.maxData;
8108 hwConfigModem->maxStandby = rilHardwareConfig[i].cfg.modem.maxStandby;
8109 break;
8110 }
8111
8112 case RIL_HARDWARE_CONFIG_SIM: {
8113 records[i].sim.resize(1);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08008114 records[i].modem.resize(0);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008115 records[i].sim[0].modemUuid =
8116 convertCharPtrToHidlString(rilHardwareConfig[i].cfg.sim.modemUuid);
8117 break;
8118 }
8119 }
8120 }
8121}
8122
Amit Mahajan759786a2017-03-03 17:35:47 -08008123int radio::hardwareConfigChangedInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008124 int indicationType, int token, RIL_Errno e, void *response,
8125 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08008126 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan13058cb2017-06-07 23:10:27 -07008127 if ((response == NULL && responseLen != 0)
8128 || responseLen % sizeof(RIL_HardwareConfig) != 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008129 RLOGE("hardwareConfigChangedInd: invalid response");
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008130 return 0;
8131 }
8132
8133 hidl_vec<HardwareConfig> configs;
8134 convertRilHardwareConfigListToHal(response, responseLen, configs);
8135
Jayachandran C572f2f42017-03-25 14:30:13 -07008136#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08008137 RLOGD("hardwareConfigChangedInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07008138#endif
Amit Mahajan17249842017-01-19 15:05:45 -08008139 Return<void> retStatus = radioService[slotId]->mRadioIndication->hardwareConfigChanged(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008140 convertIntToRadioIndicationType(indicationType), configs);
Amit Mahajan17249842017-01-19 15:05:45 -08008141 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008142 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008143 RLOGE("hardwareConfigChangedInd: radioService[%d]->mRadioIndication == NULL",
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008144 slotId);
8145 }
8146
8147 return 0;
8148}
8149
8150void convertRilRadioCapabilityToHal(void *response, size_t responseLen, RadioCapability& rc) {
8151 RIL_RadioCapability *rilRadioCapability = (RIL_RadioCapability *) response;
8152 rc.session = rilRadioCapability->session;
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07008153 rc.phase = (V1_0::RadioCapabilityPhase) rilRadioCapability->phase;
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008154 rc.raf = rilRadioCapability->rat;
8155 rc.logicalModemUuid = convertCharPtrToHidlString(rilRadioCapability->logicalModemUuid);
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07008156 rc.status = (V1_0::RadioCapabilityStatus) rilRadioCapability->status;
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008157}
8158
Amit Mahajan759786a2017-03-03 17:35:47 -08008159int radio::radioCapabilityIndicationInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008160 int indicationType, int token, RIL_Errno e, void *response,
8161 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08008162 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008163 if (response == NULL || responseLen != sizeof(RIL_RadioCapability)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008164 RLOGE("radioCapabilityIndicationInd: invalid response");
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008165 return 0;
8166 }
8167
Jack Yuf68e0da2017-02-07 14:53:09 -08008168 RadioCapability rc = {};
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008169 convertRilRadioCapabilityToHal(response, responseLen, rc);
8170
Jayachandran C572f2f42017-03-25 14:30:13 -07008171#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08008172 RLOGD("radioCapabilityIndicationInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07008173#endif
Amit Mahajan17249842017-01-19 15:05:45 -08008174 Return<void> retStatus = radioService[slotId]->mRadioIndication->radioCapabilityIndication(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008175 convertIntToRadioIndicationType(indicationType), rc);
Amit Mahajan17249842017-01-19 15:05:45 -08008176 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008177 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008178 RLOGE("radioCapabilityIndicationInd: radioService[%d]->mRadioIndication == NULL",
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008179 slotId);
8180 }
8181
8182 return 0;
8183}
8184
8185bool isServiceTypeCfQuery(RIL_SsServiceType serType, RIL_SsRequestType reqType) {
8186 if ((reqType == SS_INTERROGATION) &&
8187 (serType == SS_CFU ||
8188 serType == SS_CF_BUSY ||
8189 serType == SS_CF_NO_REPLY ||
8190 serType == SS_CF_NOT_REACHABLE ||
8191 serType == SS_CF_ALL ||
8192 serType == SS_CF_ALL_CONDITIONAL)) {
8193 return true;
8194 }
8195 return false;
8196}
8197
Amit Mahajan759786a2017-03-03 17:35:47 -08008198int radio::onSupplementaryServiceIndicationInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008199 int indicationType, int token, RIL_Errno e,
8200 void *response, size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08008201 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008202 if (response == NULL || responseLen != sizeof(RIL_StkCcUnsolSsResponse)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008203 RLOGE("onSupplementaryServiceIndicationInd: invalid response");
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008204 return 0;
8205 }
8206
8207 RIL_StkCcUnsolSsResponse *rilSsResponse = (RIL_StkCcUnsolSsResponse *) response;
Jack Yuf68e0da2017-02-07 14:53:09 -08008208 StkCcUnsolSsResult ss = {};
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008209 ss.serviceType = (SsServiceType) rilSsResponse->serviceType;
8210 ss.requestType = (SsRequestType) rilSsResponse->requestType;
8211 ss.teleserviceType = (SsTeleserviceType) rilSsResponse->teleserviceType;
8212 ss.serviceClass = rilSsResponse->serviceClass;
8213 ss.result = (RadioError) rilSsResponse->result;
8214
8215 if (isServiceTypeCfQuery(rilSsResponse->serviceType, rilSsResponse->requestType)) {
Jayachandran C572f2f42017-03-25 14:30:13 -07008216#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08008217 RLOGD("onSupplementaryServiceIndicationInd CF type, num of Cf elements %d",
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008218 rilSsResponse->cfData.numValidIndexes);
Jayachandran C572f2f42017-03-25 14:30:13 -07008219#endif
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008220 if (rilSsResponse->cfData.numValidIndexes > NUM_SERVICE_CLASSES) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008221 RLOGE("onSupplementaryServiceIndicationInd numValidIndexes is greater than "
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008222 "max value %d, truncating it to max value", NUM_SERVICE_CLASSES);
8223 rilSsResponse->cfData.numValidIndexes = NUM_SERVICE_CLASSES;
8224 }
8225
8226 ss.cfData.resize(1);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08008227 ss.ssInfo.resize(0);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008228
8229 /* number of call info's */
8230 ss.cfData[0].cfInfo.resize(rilSsResponse->cfData.numValidIndexes);
8231
8232 for (int i = 0; i < rilSsResponse->cfData.numValidIndexes; i++) {
8233 RIL_CallForwardInfo cf = rilSsResponse->cfData.cfInfo[i];
8234 CallForwardInfo *cfInfo = &ss.cfData[0].cfInfo[i];
8235
8236 cfInfo->status = (CallForwardInfoStatus) cf.status;
8237 cfInfo->reason = cf.reason;
8238 cfInfo->serviceClass = cf.serviceClass;
8239 cfInfo->toa = cf.toa;
8240 cfInfo->number = convertCharPtrToHidlString(cf.number);
8241 cfInfo->timeSeconds = cf.timeSeconds;
Jayachandran C572f2f42017-03-25 14:30:13 -07008242#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08008243 RLOGD("onSupplementaryServiceIndicationInd: "
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008244 "Data: %d,reason=%d,cls=%d,toa=%d,num=%s,tout=%d],", cf.status,
8245 cf.reason, cf.serviceClass, cf.toa, (char*)cf.number, cf.timeSeconds);
Jayachandran C572f2f42017-03-25 14:30:13 -07008246#endif
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008247 }
8248 } else {
8249 ss.ssInfo.resize(1);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08008250 ss.cfData.resize(0);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008251
8252 /* each int */
8253 ss.ssInfo[0].ssInfo.resize(SS_INFO_MAX);
8254 for (int i = 0; i < SS_INFO_MAX; i++) {
Jayachandran C572f2f42017-03-25 14:30:13 -07008255#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08008256 RLOGD("onSupplementaryServiceIndicationInd: Data: %d",
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008257 rilSsResponse->ssInfo[i]);
Jayachandran C572f2f42017-03-25 14:30:13 -07008258#endif
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008259 ss.ssInfo[0].ssInfo[i] = rilSsResponse->ssInfo[i];
8260 }
8261 }
8262
Jayachandran C572f2f42017-03-25 14:30:13 -07008263#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08008264 RLOGD("onSupplementaryServiceIndicationInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07008265#endif
Amit Mahajan17249842017-01-19 15:05:45 -08008266 Return<void> retStatus = radioService[slotId]->mRadioIndication->
8267 onSupplementaryServiceIndication(convertIntToRadioIndicationType(indicationType),
8268 ss);
8269 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008270 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008271 RLOGE("onSupplementaryServiceIndicationInd: "
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008272 "radioService[%d]->mRadioIndication == NULL", slotId);
8273 }
8274
8275 return 0;
8276}
8277
Amit Mahajan759786a2017-03-03 17:35:47 -08008278int radio::stkCallControlAlphaNotifyInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008279 int indicationType, int token, RIL_Errno e, void *response,
8280 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08008281 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008282 if (response == NULL || responseLen == 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008283 RLOGE("stkCallControlAlphaNotifyInd: invalid response");
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008284 return 0;
8285 }
Jayachandran C572f2f42017-03-25 14:30:13 -07008286#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08008287 RLOGD("stkCallControlAlphaNotifyInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07008288#endif
Amit Mahajan17249842017-01-19 15:05:45 -08008289 Return<void> retStatus = radioService[slotId]->mRadioIndication->stkCallControlAlphaNotify(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008290 convertIntToRadioIndicationType(indicationType),
8291 convertCharPtrToHidlString((char *) response));
Amit Mahajan17249842017-01-19 15:05:45 -08008292 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008293 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008294 RLOGE("stkCallControlAlphaNotifyInd: radioService[%d]->mRadioIndication == NULL",
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008295 slotId);
8296 }
8297
8298 return 0;
8299}
8300
8301void convertRilLceDataInfoToHal(void *response, size_t responseLen, LceDataInfo& lce) {
8302 RIL_LceDataInfo *rilLceDataInfo = (RIL_LceDataInfo *)response;
8303 lce.lastHopCapacityKbps = rilLceDataInfo->last_hop_capacity_kbps;
8304 lce.confidenceLevel = rilLceDataInfo->confidence_level;
8305 lce.lceSuspended = rilLceDataInfo->lce_suspended;
8306}
8307
Amit Mahajan759786a2017-03-03 17:35:47 -08008308int radio::lceDataInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008309 int indicationType, int token, RIL_Errno e, void *response,
8310 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08008311 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008312 if (response == NULL || responseLen != sizeof(RIL_LceDataInfo)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008313 RLOGE("lceDataInd: invalid response");
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008314 return 0;
8315 }
8316
Jack Yuf68e0da2017-02-07 14:53:09 -08008317 LceDataInfo lce = {};
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008318 convertRilLceDataInfoToHal(response, responseLen, lce);
Jayachandran C572f2f42017-03-25 14:30:13 -07008319#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08008320 RLOGD("lceDataInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07008321#endif
Amit Mahajan17249842017-01-19 15:05:45 -08008322 Return<void> retStatus = radioService[slotId]->mRadioIndication->lceData(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008323 convertIntToRadioIndicationType(indicationType), lce);
Amit Mahajan17249842017-01-19 15:05:45 -08008324 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008325 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008326 RLOGE("lceDataInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008327 }
8328
8329 return 0;
8330}
8331
Amit Mahajan759786a2017-03-03 17:35:47 -08008332int radio::pcoDataInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008333 int indicationType, int token, RIL_Errno e, void *response,
8334 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08008335 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008336 if (response == NULL || responseLen != sizeof(RIL_PCO_Data)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008337 RLOGE("pcoDataInd: invalid response");
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008338 return 0;
8339 }
8340
Jack Yuf68e0da2017-02-07 14:53:09 -08008341 PcoDataInfo pco = {};
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008342 RIL_PCO_Data *rilPcoData = (RIL_PCO_Data *)response;
8343 pco.cid = rilPcoData->cid;
8344 pco.bearerProto = convertCharPtrToHidlString(rilPcoData->bearer_proto);
8345 pco.pcoId = rilPcoData->pco_id;
8346 pco.contents.setToExternal((uint8_t *) rilPcoData->contents, rilPcoData->contents_length);
8347
Jayachandran C572f2f42017-03-25 14:30:13 -07008348#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08008349 RLOGD("pcoDataInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07008350#endif
Amit Mahajan17249842017-01-19 15:05:45 -08008351 Return<void> retStatus = radioService[slotId]->mRadioIndication->pcoData(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008352 convertIntToRadioIndicationType(indicationType), pco);
Amit Mahajan17249842017-01-19 15:05:45 -08008353 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008354 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008355 RLOGE("pcoDataInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008356 }
8357
8358 return 0;
8359}
8360
Amit Mahajan759786a2017-03-03 17:35:47 -08008361int radio::modemResetInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008362 int indicationType, int token, RIL_Errno e, void *response,
8363 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08008364 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008365 if (response == NULL || responseLen == 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008366 RLOGE("modemResetInd: invalid response");
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008367 return 0;
8368 }
Jayachandran C572f2f42017-03-25 14:30:13 -07008369#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08008370 RLOGD("modemResetInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07008371#endif
Amit Mahajan17249842017-01-19 15:05:45 -08008372 Return<void> retStatus = radioService[slotId]->mRadioIndication->modemReset(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008373 convertIntToRadioIndicationType(indicationType),
8374 convertCharPtrToHidlString((char *) response));
Amit Mahajan17249842017-01-19 15:05:45 -08008375 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008376 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008377 RLOGE("modemResetInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008378 }
8379
8380 return 0;
8381}
8382
yinxu3abe7c72017-05-03 15:15:19 -07008383int radio::networkScanResultInd(int slotId,
8384 int indicationType, int token, RIL_Errno e, void *response,
yinxu8688abd2017-05-22 11:26:45 -07008385 size_t responseLen) {
yinxu3abe7c72017-05-03 15:15:19 -07008386#if VDBG
8387 RLOGD("networkScanResultInd");
8388#endif
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07008389 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndicationV1_1 != NULL) {
yinxu8688abd2017-05-22 11:26:45 -07008390 if (response == NULL || responseLen == 0) {
8391 RLOGE("networkScanResultInd: invalid response");
8392 return 0;
8393 }
8394 RLOGD("networkScanResultInd");
8395
8396#if VDBG
8397 RLOGD("networkScanResultInd");
8398#endif
8399
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07008400 RIL_NetworkScanResult *networkScanResult = (RIL_NetworkScanResult *) response;
yinxu8688abd2017-05-22 11:26:45 -07008401
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07008402 V1_1::NetworkScanResult result;
8403 result.status = (V1_1::ScanStatus) networkScanResult->status;
Sooraj Sasindran982ba7a2018-05-07 21:20:43 -07008404 result.error = (RadioError) networkScanResult->error;
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07008405 convertRilCellInfoListToHal(
8406 networkScanResult->network_infos,
8407 networkScanResult->network_infos_length * sizeof(RIL_CellInfo_v12),
8408 result.networkInfos);
yinxu8688abd2017-05-22 11:26:45 -07008409
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07008410 Return<void> retStatus = radioService[slotId]->mRadioIndicationV1_1->networkScanResult(
8411 convertIntToRadioIndicationType(indicationType), result);
8412 radioService[slotId]->checkReturnStatus(retStatus);
yinxu8688abd2017-05-22 11:26:45 -07008413 } else {
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07008414 RLOGE("networkScanResultInd: radioService[%d]->mRadioIndicationV1_1 == NULL", slotId);
yinxu8688abd2017-05-22 11:26:45 -07008415 }
yinxu3abe7c72017-05-03 15:15:19 -07008416 return 0;
8417}
8418
pkanwardb8e0942017-03-17 12:49:34 -07008419int radio::carrierInfoForImsiEncryption(int slotId,
8420 int indicationType, int token, RIL_Errno e, void *response,
8421 size_t responseLen) {
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07008422 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndicationV1_1 != NULL) {
pkanwardb8e0942017-03-17 12:49:34 -07008423 if (response == NULL || responseLen == 0) {
8424 RLOGE("carrierInfoForImsiEncryption: invalid response");
8425 return 0;
8426 }
8427 RLOGD("carrierInfoForImsiEncryption");
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07008428 Return<void> retStatus = radioService[slotId]->mRadioIndicationV1_1->
8429 carrierInfoForImsiEncryption(convertIntToRadioIndicationType(indicationType));
8430 radioService[slotId]->checkReturnStatus(retStatus);
pkanwardb8e0942017-03-17 12:49:34 -07008431 } else {
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07008432 RLOGE("carrierInfoForImsiEncryption: radioService[%d]->mRadioIndicationV1_1 == NULL",
8433 slotId);
pkanwardb8e0942017-03-17 12:49:34 -07008434 }
8435
8436 return 0;
8437}
8438
Nathan Harold6a8809d2017-07-07 19:28:58 -07008439int radio::keepaliveStatusInd(int slotId,
8440 int indicationType, int token, RIL_Errno e, void *response,
8441 size_t responseLen) {
8442#if VDBG
8443 RLOGD("%s(): token=%d", __FUNCTION__, token);
8444#endif
8445 if (radioService[slotId] == NULL || radioService[slotId]->mRadioIndication == NULL) {
8446 RLOGE("%s: radioService[%d]->mRadioIndication == NULL", __FUNCTION__, slotId);
8447 return 0;
8448 }
8449
8450 auto ret = V1_1::IRadioIndication::castFrom(
8451 radioService[slotId]->mRadioIndication);
8452 if (!ret.isOk()) {
8453 RLOGE("%s: ret.isOk() == false for radioService[%d]", __FUNCTION__, slotId);
8454 return 0;
8455 }
8456 sp<V1_1::IRadioIndication> radioIndicationV1_1 = ret;
8457
8458 if (response == NULL || responseLen != sizeof(V1_1::KeepaliveStatus)) {
8459 RLOGE("%s: invalid response", __FUNCTION__);
8460 return 0;
8461 }
8462
8463 V1_1::KeepaliveStatus ks;
8464 convertRilKeepaliveStatusToHal(static_cast<RIL_KeepaliveStatus*>(response), ks);
8465
8466 Return<void> retStatus = radioIndicationV1_1->keepaliveStatus(
8467 convertIntToRadioIndicationType(indicationType), ks);
8468 radioService[slotId]->checkReturnStatus(retStatus);
8469 return 0;
8470}
8471
Amit Mahajan759786a2017-03-03 17:35:47 -08008472int radio::oemHookRawInd(int slotId,
Amit Mahajan439da362017-02-13 17:43:04 -08008473 int indicationType, int token, RIL_Errno e, void *response,
8474 size_t responseLen) {
Steven Moreland6cc40042018-03-20 11:20:05 -07008475 if (!kOemHookEnabled) return 0;
8476
Amit Mahajan439da362017-02-13 17:43:04 -08008477 if (oemHookService[slotId] != NULL && oemHookService[slotId]->mOemHookIndication != NULL) {
8478 if (response == NULL || responseLen == 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008479 RLOGE("oemHookRawInd: invalid response");
Amit Mahajan439da362017-02-13 17:43:04 -08008480 return 0;
8481 }
8482
8483 hidl_vec<uint8_t> data;
8484 data.setToExternal((uint8_t *) response, responseLen);
Jayachandran C572f2f42017-03-25 14:30:13 -07008485#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08008486 RLOGD("oemHookRawInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07008487#endif
Amit Mahajan439da362017-02-13 17:43:04 -08008488 Return<void> retStatus = oemHookService[slotId]->mOemHookIndication->oemHookRaw(
8489 convertIntToRadioIndicationType(indicationType), data);
Amit Mahajand423d192017-03-16 17:04:01 -07008490 checkReturnStatus(slotId, retStatus, false);
Amit Mahajan439da362017-02-13 17:43:04 -08008491 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008492 RLOGE("oemHookRawInd: oemHookService[%d]->mOemHookIndication == NULL", slotId);
Amit Mahajan439da362017-02-13 17:43:04 -08008493 }
8494
8495 return 0;
8496}
8497
Amit Mahajancd77a5b2016-08-25 11:19:21 -07008498void radio::registerService(RIL_RadioFunctions *callbacks, CommandInfo *commands) {
8499 using namespace android::hardware;
8500 int simCount = 1;
Amit Mahajan439da362017-02-13 17:43:04 -08008501 const char *serviceNames[] = {
Amit Mahajan7955c432017-03-28 11:17:55 -07008502 android::RIL_getServiceName()
Amit Mahajancd77a5b2016-08-25 11:19:21 -07008503 #if (SIM_COUNT >= 2)
Amit Mahajan7955c432017-03-28 11:17:55 -07008504 , RIL2_SERVICE_NAME
Amit Mahajancd77a5b2016-08-25 11:19:21 -07008505 #if (SIM_COUNT >= 3)
Amit Mahajan7955c432017-03-28 11:17:55 -07008506 , RIL3_SERVICE_NAME
Amit Mahajancd77a5b2016-08-25 11:19:21 -07008507 #if (SIM_COUNT >= 4)
Amit Mahajan7955c432017-03-28 11:17:55 -07008508 , RIL4_SERVICE_NAME
Amit Mahajan439da362017-02-13 17:43:04 -08008509 #endif
8510 #endif
8511 #endif
8512 };
8513
Amit Mahajancd77a5b2016-08-25 11:19:21 -07008514 #if (SIM_COUNT >= 2)
8515 simCount = SIM_COUNT;
8516 #endif
8517
terrycrhuang456df1b2018-05-04 13:47:06 +08008518 s_vendorFunctions = callbacks;
8519 s_commands = commands;
8520
Amit Mahajancd77a5b2016-08-25 11:19:21 -07008521 configureRpcThreadpool(1, true /* callerWillJoin */);
8522 for (int i = 0; i < simCount; i++) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08008523 pthread_rwlock_t *radioServiceRwlockPtr = getRadioServiceRwlock(i);
8524 int ret = pthread_rwlock_wrlock(radioServiceRwlockPtr);
8525 assert(ret == 0);
8526
Amit Mahajancd77a5b2016-08-25 11:19:21 -07008527 radioService[i] = new RadioImpl;
Sanket Padawef220dc52017-01-02 23:46:00 -08008528 radioService[i]->mSlotId = i;
pkanwardb8e0942017-03-17 12:49:34 -07008529 RLOGD("registerService: starting android::hardware::radio::V1_1::IRadio %s",
8530 serviceNames[i]);
Amit Mahajancd77a5b2016-08-25 11:19:21 -07008531 android::status_t status = radioService[i]->registerAsService(serviceNames[i]);
Steven Moreland6cc40042018-03-20 11:20:05 -07008532
8533 if (kOemHookEnabled) {
8534 oemHookService[i] = new OemHookImpl;
8535 oemHookService[i]->mSlotId = i;
8536 status = oemHookService[i]->registerAsService(serviceNames[i]);
8537 }
Amit Mahajan932e08e2017-01-24 05:45:02 -08008538
8539 ret = pthread_rwlock_unlock(radioServiceRwlockPtr);
8540 assert(ret == 0);
Amit Mahajancd77a5b2016-08-25 11:19:21 -07008541 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07008542}
8543
8544void rilc_thread_pool() {
8545 joinRpcThreadpool();
Amit Mahajan932e08e2017-01-24 05:45:02 -08008546}
8547
8548pthread_rwlock_t * radio::getRadioServiceRwlock(int slotId) {
8549 pthread_rwlock_t *radioServiceRwlockPtr = &radioServiceRwlock;
8550
8551 #if (SIM_COUNT >= 2)
8552 if (slotId == 2) radioServiceRwlockPtr = &radioServiceRwlock2;
8553 #if (SIM_COUNT >= 3)
8554 if (slotId == 3) radioServiceRwlockPtr = &radioServiceRwlock3;
8555 #if (SIM_COUNT >= 4)
8556 if (slotId == 4) radioServiceRwlockPtr = &radioServiceRwlock4;
8557 #endif
8558 #endif
8559 #endif
8560
8561 return radioServiceRwlockPtr;
Sanket Padawe0de29d12017-02-10 13:19:47 -08008562}
Amit Mahajane9a10e62018-02-23 17:12:15 -08008563
8564// should acquire write lock for the corresponding service before calling this
8565void radio::setNitzTimeReceived(int slotId, long timeReceived) {
8566 nitzTimeReceived[slotId] = timeReceived;
8567}