blob: 51deb16c02adba37283ebcba9bfc393dc1c64821 [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>
28#include <ril_service.h>
29#include <hidl/HidlTransportSupport.h>
Amit Mahajan5829a472016-12-28 17:28:07 -080030#include <utils/SystemClock.h>
Wei Wang100ac9b2017-02-03 14:18:07 -080031#include <inttypes.h>
Amit Mahajan5829a472016-12-28 17:28:07 -080032
33#define INVALID_HEX_CHAR 16
Amit Mahajancd77a5b2016-08-25 11:19:21 -070034
Amit Mahajanccb6d7f2017-06-09 10:44:54 -070035using namespace android::hardware::radio;
Amit Mahajancd77a5b2016-08-25 11:19:21 -070036using namespace android::hardware::radio::V1_0;
Amit Mahajan439da362017-02-13 17:43:04 -080037using namespace android::hardware::radio::deprecated::V1_0;
Amit Mahajancd77a5b2016-08-25 11:19:21 -070038using ::android::hardware::configureRpcThreadpool;
39using ::android::hardware::joinRpcThreadpool;
40using ::android::hardware::Return;
Amit Mahajancd77a5b2016-08-25 11:19:21 -070041using ::android::hardware::hidl_string;
42using ::android::hardware::hidl_vec;
43using ::android::hardware::hidl_array;
44using ::android::hardware::Void;
45using android::CommandInfo;
46using android::RequestInfo;
47using android::requestToString;
48using android::sp;
49
Sanket Padawe378ccdd2017-01-24 14:11:12 -080050#define BOOL_TO_INT(x) (x ? 1 : 0)
51#define ATOI_NULL_HANDLED(x) (x ? atoi(x) : -1)
52#define ATOI_NULL_HANDLED_DEF(x, defaultVal) (x ? atoi(x) : defaultVal)
53
Amit Mahajanb3a11bb2017-05-15 16:41:44 -070054#if defined(ANDROID_MULTI_SIM)
55#define CALL_ONREQUEST(a, b, c, d, e) \
56 s_vendorFunctions->onRequest((a), (b), (c), (d), ((RIL_SOCKET_ID)(e)))
57#define CALL_ONSTATEREQUEST(a) s_vendorFunctions->onStateRequest((RIL_SOCKET_ID)(a))
58#else
59#define CALL_ONREQUEST(a, b, c, d, e) s_vendorFunctions->onRequest((a), (b), (c), (d))
60#define CALL_ONSTATEREQUEST(a) s_vendorFunctions->onStateRequest()
61#endif
62
Steven Moreland6cc40042018-03-20 11:20:05 -070063#ifdef OEM_HOOK_DISABLED
64constexpr bool kOemHookEnabled = false;
65#else
66constexpr bool kOemHookEnabled = true;
67#endif
68
Sanket Padawe378ccdd2017-01-24 14:11:12 -080069RIL_RadioFunctions *s_vendorFunctions = NULL;
Amit Mahajancd77a5b2016-08-25 11:19:21 -070070static CommandInfo *s_commands;
71
72struct RadioImpl;
Amit Mahajan439da362017-02-13 17:43:04 -080073struct OemHookImpl;
Amit Mahajancd77a5b2016-08-25 11:19:21 -070074
75#if (SIM_COUNT >= 2)
76sp<RadioImpl> radioService[SIM_COUNT];
Amit Mahajan439da362017-02-13 17:43:04 -080077sp<OemHookImpl> oemHookService[SIM_COUNT];
Amit Mahajane9a10e62018-02-23 17:12:15 -080078int64_t nitzTimeReceived[SIM_COUNT];
Amit Mahajan439da362017-02-13 17:43:04 -080079// counter used for synchronization. It is incremented every time response callbacks are updated.
Amit Mahajand423d192017-03-16 17:04:01 -070080volatile int32_t mCounterRadio[SIM_COUNT];
81volatile int32_t mCounterOemHook[SIM_COUNT];
Amit Mahajancd77a5b2016-08-25 11:19:21 -070082#else
83sp<RadioImpl> radioService[1];
Amit Mahajan439da362017-02-13 17:43:04 -080084sp<OemHookImpl> oemHookService[1];
Amit Mahajane9a10e62018-02-23 17:12:15 -080085int64_t nitzTimeReceived[1];
Amit Mahajan439da362017-02-13 17:43:04 -080086// counter used for synchronization. It is incremented every time response callbacks are updated.
Amit Mahajand423d192017-03-16 17:04:01 -070087volatile int32_t mCounterRadio[1];
88volatile int32_t mCounterOemHook[1];
Amit Mahajancd77a5b2016-08-25 11:19:21 -070089#endif
90
Amit Mahajan932e08e2017-01-24 05:45:02 -080091static pthread_rwlock_t radioServiceRwlock = PTHREAD_RWLOCK_INITIALIZER;
92
93#if (SIM_COUNT >= 2)
94static pthread_rwlock_t radioServiceRwlock2 = PTHREAD_RWLOCK_INITIALIZER;
95#if (SIM_COUNT >= 3)
96static pthread_rwlock_t radioServiceRwlock3 = PTHREAD_RWLOCK_INITIALIZER;
97#if (SIM_COUNT >= 4)
98static pthread_rwlock_t radioServiceRwlock4 = PTHREAD_RWLOCK_INITIALIZER;
99#endif
100#endif
101#endif
102
Karsten Tauscheeac03712020-11-20 15:36:08 +0100103namespace {
104
105int clampWarn(const char* name, const int value, const int min, const int max) {
106 const int clamped = (value < min) ? min : (value > max) ? max : value;
107 if (clamped != value) {
108 RLOGW("Clamping value %s (%i) into valid range [%i, %i]", name, value, min, max);
109 }
110 return clamped;
111}
112
113}
114
115
Amit Mahajan3df62912017-02-10 01:35:55 +0000116void convertRilHardwareConfigListToHal(void *response, size_t responseLen,
117 hidl_vec<HardwareConfig>& records);
118
119void convertRilRadioCapabilityToHal(void *response, size_t responseLen, RadioCapability& rc);
120
121void convertRilLceDataInfoToHal(void *response, size_t responseLen, LceDataInfo& lce);
122
123void convertRilSignalStrengthToHal(void *response, size_t responseLen,
124 SignalStrength& signalStrength);
125
126void convertRilDataCallToHal(RIL_Data_Call_Response_v11 *dcResponse,
127 SetupDataCallResult& dcResult);
128
129void convertRilDataCallListToHal(void *response, size_t responseLen,
130 hidl_vec<SetupDataCallResult>& dcResultList);
131
132void convertRilCellInfoListToHal(void *response, size_t responseLen, hidl_vec<CellInfo>& records);
133
Amit Mahajanccb6d7f2017-06-09 10:44:54 -0700134struct RadioImpl : public V1_1::IRadio {
Sanket Padawef220dc52017-01-02 23:46:00 -0800135 int32_t mSlotId;
136 sp<IRadioResponse> mRadioResponse;
137 sp<IRadioIndication> mRadioIndication;
Amit Mahajanccb6d7f2017-06-09 10:44:54 -0700138 sp<V1_1::IRadioResponse> mRadioResponseV1_1;
139 sp<V1_1::IRadioIndication> mRadioIndicationV1_1;
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700140
141 Return<void> setResponseFunctions(
142 const ::android::sp<IRadioResponse>& radioResponse,
143 const ::android::sp<IRadioIndication>& radioIndication);
144
145 Return<void> getIccCardStatus(int32_t serial);
146
Sanket Padawef220dc52017-01-02 23:46:00 -0800147 Return<void> supplyIccPinForApp(int32_t serial, const hidl_string& pin,
148 const hidl_string& aid);
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700149
Sanket Padawef220dc52017-01-02 23:46:00 -0800150 Return<void> supplyIccPukForApp(int32_t serial, const hidl_string& puk,
151 const hidl_string& pin, const hidl_string& aid);
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700152
153 Return<void> supplyIccPin2ForApp(int32_t serial,
Sanket Padawef220dc52017-01-02 23:46:00 -0800154 const hidl_string& pin2,
155 const hidl_string& aid);
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700156
Sanket Padawef220dc52017-01-02 23:46:00 -0800157 Return<void> supplyIccPuk2ForApp(int32_t serial, const hidl_string& puk2,
158 const hidl_string& pin2, const hidl_string& aid);
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700159
Sanket Padawef220dc52017-01-02 23:46:00 -0800160 Return<void> changeIccPinForApp(int32_t serial, const hidl_string& oldPin,
161 const hidl_string& newPin, const hidl_string& aid);
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700162
Sanket Padawef220dc52017-01-02 23:46:00 -0800163 Return<void> changeIccPin2ForApp(int32_t serial, const hidl_string& oldPin2,
164 const hidl_string& newPin2, const hidl_string& aid);
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700165
Sanket Padawef220dc52017-01-02 23:46:00 -0800166 Return<void> supplyNetworkDepersonalization(int32_t serial, const hidl_string& netPin);
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700167
168 Return<void> getCurrentCalls(int32_t serial);
169
Sanket Padawef220dc52017-01-02 23:46:00 -0800170 Return<void> dial(int32_t serial, const Dial& dialInfo);
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700171
172 Return<void> getImsiForApp(int32_t serial,
173 const ::android::hardware::hidl_string& aid);
174
175 Return<void> hangup(int32_t serial, int32_t gsmIndex);
176
177 Return<void> hangupWaitingOrBackground(int32_t serial);
178
179 Return<void> hangupForegroundResumeBackground(int32_t serial);
180
181 Return<void> switchWaitingOrHoldingAndActive(int32_t serial);
182
183 Return<void> conference(int32_t serial);
184
185 Return<void> rejectCall(int32_t serial);
186
187 Return<void> getLastCallFailCause(int32_t serial);
188
189 Return<void> getSignalStrength(int32_t serial);
190
191 Return<void> getVoiceRegistrationState(int32_t serial);
192
193 Return<void> getDataRegistrationState(int32_t serial);
194
195 Return<void> getOperator(int32_t serial);
196
197 Return<void> setRadioPower(int32_t serial, bool on);
198
199 Return<void> sendDtmf(int32_t serial,
200 const ::android::hardware::hidl_string& s);
201
202 Return<void> sendSms(int32_t serial, const GsmSmsMessage& message);
203
204 Return<void> sendSMSExpectMore(int32_t serial, const GsmSmsMessage& message);
205
206 Return<void> setupDataCall(int32_t serial,
Jack Yu06181bb2017-01-10 12:10:41 -0800207 RadioTechnology radioTechnology,
208 const DataProfileInfo& profileInfo,
209 bool modemCognitive,
Jack Yuffc06452017-02-13 11:21:00 -0800210 bool roamingAllowed,
211 bool isRoaming);
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700212
213 Return<void> iccIOForApp(int32_t serial,
214 const IccIo& iccIo);
215
216 Return<void> sendUssd(int32_t serial,
217 const ::android::hardware::hidl_string& ussd);
218
219 Return<void> cancelPendingUssd(int32_t serial);
220
221 Return<void> getClir(int32_t serial);
222
223 Return<void> setClir(int32_t serial, int32_t status);
224
225 Return<void> getCallForwardStatus(int32_t serial,
226 const CallForwardInfo& callInfo);
227
228 Return<void> setCallForward(int32_t serial,
229 const CallForwardInfo& callInfo);
230
231 Return<void> getCallWaiting(int32_t serial, int32_t serviceClass);
232
233 Return<void> setCallWaiting(int32_t serial, bool enable, int32_t serviceClass);
234
235 Return<void> acknowledgeLastIncomingGsmSms(int32_t serial,
236 bool success, SmsAcknowledgeFailCause cause);
237
238 Return<void> acceptCall(int32_t serial);
239
240 Return<void> deactivateDataCall(int32_t serial,
241 int32_t cid, bool reasonRadioShutDown);
242
243 Return<void> getFacilityLockForApp(int32_t serial,
244 const ::android::hardware::hidl_string& facility,
245 const ::android::hardware::hidl_string& password,
246 int32_t serviceClass,
247 const ::android::hardware::hidl_string& appId);
248
249 Return<void> setFacilityLockForApp(int32_t serial,
250 const ::android::hardware::hidl_string& facility,
251 bool lockState,
252 const ::android::hardware::hidl_string& password,
253 int32_t serviceClass,
254 const ::android::hardware::hidl_string& appId);
255
256 Return<void> setBarringPassword(int32_t serial,
257 const ::android::hardware::hidl_string& facility,
258 const ::android::hardware::hidl_string& oldPassword,
259 const ::android::hardware::hidl_string& newPassword);
260
261 Return<void> getNetworkSelectionMode(int32_t serial);
262
263 Return<void> setNetworkSelectionModeAutomatic(int32_t serial);
264
265 Return<void> setNetworkSelectionModeManual(int32_t serial,
266 const ::android::hardware::hidl_string& operatorNumeric);
267
268 Return<void> getAvailableNetworks(int32_t serial);
269
Nathan Harold6a8809d2017-07-07 19:28:58 -0700270 Return<void> startNetworkScan(int32_t serial, const V1_1::NetworkScanRequest& request);
yinxu3abe7c72017-05-03 15:15:19 -0700271
272 Return<void> stopNetworkScan(int32_t serial);
273
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700274 Return<void> startDtmf(int32_t serial,
275 const ::android::hardware::hidl_string& s);
276
277 Return<void> stopDtmf(int32_t serial);
278
279 Return<void> getBasebandVersion(int32_t serial);
280
281 Return<void> separateConnection(int32_t serial, int32_t gsmIndex);
282
283 Return<void> setMute(int32_t serial, bool enable);
284
285 Return<void> getMute(int32_t serial);
286
287 Return<void> getClip(int32_t serial);
288
289 Return<void> getDataCallList(int32_t serial);
290
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700291 Return<void> setSuppServiceNotifications(int32_t serial, bool enable);
292
293 Return<void> writeSmsToSim(int32_t serial,
294 const SmsWriteArgs& smsWriteArgs);
295
296 Return<void> deleteSmsOnSim(int32_t serial, int32_t index);
297
298 Return<void> setBandMode(int32_t serial, RadioBandMode mode);
299
300 Return<void> getAvailableBandModes(int32_t serial);
301
302 Return<void> sendEnvelope(int32_t serial,
303 const ::android::hardware::hidl_string& command);
304
305 Return<void> sendTerminalResponseToSim(int32_t serial,
306 const ::android::hardware::hidl_string& commandResponse);
307
308 Return<void> handleStkCallSetupRequestFromSim(int32_t serial, bool accept);
309
310 Return<void> explicitCallTransfer(int32_t serial);
311
312 Return<void> setPreferredNetworkType(int32_t serial, PreferredNetworkType nwType);
313
314 Return<void> getPreferredNetworkType(int32_t serial);
315
316 Return<void> getNeighboringCids(int32_t serial);
317
318 Return<void> setLocationUpdates(int32_t serial, bool enable);
319
320 Return<void> setCdmaSubscriptionSource(int32_t serial,
321 CdmaSubscriptionSource cdmaSub);
322
323 Return<void> setCdmaRoamingPreference(int32_t serial, CdmaRoamingType type);
324
325 Return<void> getCdmaRoamingPreference(int32_t serial);
326
327 Return<void> setTTYMode(int32_t serial, TtyMode mode);
328
329 Return<void> getTTYMode(int32_t serial);
330
331 Return<void> setPreferredVoicePrivacy(int32_t serial, bool enable);
332
333 Return<void> getPreferredVoicePrivacy(int32_t serial);
334
335 Return<void> sendCDMAFeatureCode(int32_t serial,
336 const ::android::hardware::hidl_string& featureCode);
337
338 Return<void> sendBurstDtmf(int32_t serial,
339 const ::android::hardware::hidl_string& dtmf,
340 int32_t on,
341 int32_t off);
342
343 Return<void> sendCdmaSms(int32_t serial, const CdmaSmsMessage& sms);
344
345 Return<void> acknowledgeLastIncomingCdmaSms(int32_t serial,
346 const CdmaSmsAck& smsAck);
347
348 Return<void> getGsmBroadcastConfig(int32_t serial);
349
350 Return<void> setGsmBroadcastConfig(int32_t serial,
351 const hidl_vec<GsmBroadcastSmsConfigInfo>& configInfo);
352
353 Return<void> setGsmBroadcastActivation(int32_t serial, bool activate);
354
355 Return<void> getCdmaBroadcastConfig(int32_t serial);
356
357 Return<void> setCdmaBroadcastConfig(int32_t serial,
358 const hidl_vec<CdmaBroadcastSmsConfigInfo>& configInfo);
359
360 Return<void> setCdmaBroadcastActivation(int32_t serial, bool activate);
361
362 Return<void> getCDMASubscription(int32_t serial);
363
364 Return<void> writeSmsToRuim(int32_t serial, const CdmaSmsWriteArgs& cdmaSms);
365
366 Return<void> deleteSmsOnRuim(int32_t serial, int32_t index);
367
368 Return<void> getDeviceIdentity(int32_t serial);
369
370 Return<void> exitEmergencyCallbackMode(int32_t serial);
371
372 Return<void> getSmscAddress(int32_t serial);
373
374 Return<void> setSmscAddress(int32_t serial,
375 const ::android::hardware::hidl_string& smsc);
376
377 Return<void> reportSmsMemoryStatus(int32_t serial, bool available);
378
379 Return<void> reportStkServiceIsRunning(int32_t serial);
380
381 Return<void> getCdmaSubscriptionSource(int32_t serial);
382
383 Return<void> requestIsimAuthentication(int32_t serial,
384 const ::android::hardware::hidl_string& challenge);
385
386 Return<void> acknowledgeIncomingGsmSmsWithPdu(int32_t serial,
387 bool success,
388 const ::android::hardware::hidl_string& ackPdu);
389
390 Return<void> sendEnvelopeWithStatus(int32_t serial,
391 const ::android::hardware::hidl_string& contents);
392
393 Return<void> getVoiceRadioTechnology(int32_t serial);
394
395 Return<void> getCellInfoList(int32_t serial);
396
397 Return<void> setCellInfoListRate(int32_t serial, int32_t rate);
398
Jack Yu06181bb2017-01-10 12:10:41 -0800399 Return<void> setInitialAttachApn(int32_t serial, const DataProfileInfo& dataProfileInfo,
Jack Yuffc06452017-02-13 11:21:00 -0800400 bool modemCognitive, bool isRoaming);
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700401
402 Return<void> getImsRegistrationState(int32_t serial);
403
404 Return<void> sendImsSms(int32_t serial, const ImsSmsMessage& message);
405
406 Return<void> iccTransmitApduBasicChannel(int32_t serial, const SimApdu& message);
407
408 Return<void> iccOpenLogicalChannel(int32_t serial,
Wileen Chiu410b7562015-11-23 14:25:22 -0800409 const ::android::hardware::hidl_string& aid, int32_t p2);
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700410
411 Return<void> iccCloseLogicalChannel(int32_t serial, int32_t channelId);
412
413 Return<void> iccTransmitApduLogicalChannel(int32_t serial, const SimApdu& message);
414
415 Return<void> nvReadItem(int32_t serial, NvItem itemId);
416
417 Return<void> nvWriteItem(int32_t serial, const NvWriteItem& item);
418
419 Return<void> nvWriteCdmaPrl(int32_t serial,
420 const ::android::hardware::hidl_vec<uint8_t>& prl);
421
422 Return<void> nvResetConfig(int32_t serial, ResetNvType resetType);
423
424 Return<void> setUiccSubscription(int32_t serial, const SelectUiccSub& uiccSub);
425
426 Return<void> setDataAllowed(int32_t serial, bool allow);
427
428 Return<void> getHardwareConfig(int32_t serial);
429
430 Return<void> requestIccSimAuthentication(int32_t serial,
431 int32_t authContext,
432 const ::android::hardware::hidl_string& authData,
433 const ::android::hardware::hidl_string& aid);
434
435 Return<void> setDataProfile(int32_t serial,
Jack Yuffc06452017-02-13 11:21:00 -0800436 const ::android::hardware::hidl_vec<DataProfileInfo>& profiles, bool isRoaming);
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700437
438 Return<void> requestShutdown(int32_t serial);
439
440 Return<void> getRadioCapability(int32_t serial);
441
442 Return<void> setRadioCapability(int32_t serial, const RadioCapability& rc);
443
444 Return<void> startLceService(int32_t serial, int32_t reportInterval, bool pullMode);
445
446 Return<void> stopLceService(int32_t serial);
447
448 Return<void> pullLceData(int32_t serial);
449
450 Return<void> getModemActivityInfo(int32_t serial);
451
452 Return<void> setAllowedCarriers(int32_t serial,
453 bool allAllowed,
454 const CarrierRestrictions& carriers);
455
456 Return<void> getAllowedCarriers(int32_t serial);
457
Jack Yu06181bb2017-01-10 12:10:41 -0800458 Return<void> sendDeviceState(int32_t serial, DeviceStateType deviceStateType, bool state);
459
460 Return<void> setIndicationFilter(int32_t serial, int32_t indicationFilter);
461
Nathan Harold6a8809d2017-07-07 19:28:58 -0700462 Return<void> startKeepalive(int32_t serial, const V1_1::KeepaliveRequest& keepalive);
Nathan Haroldec94b822017-05-25 16:10:35 -0700463
464 Return<void> stopKeepalive(int32_t serial, int32_t sessionHandle);
465
Wileen Chiu718c0bf2017-01-04 11:37:19 -0800466 Return<void> setSimCardPower(int32_t serial, bool powerUp);
Grace Chen08eb6542017-03-23 18:39:48 -0700467 Return<void> setSimCardPower_1_1(int32_t serial,
Amit Mahajanccb6d7f2017-06-09 10:44:54 -0700468 const V1_1::CardPowerState state);
Wileen Chiu718c0bf2017-01-04 11:37:19 -0800469
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700470 Return<void> responseAcknowledgement();
Amit Mahajan17249842017-01-19 15:05:45 -0800471
pkanwardb8e0942017-03-17 12:49:34 -0700472 Return<void> setCarrierInfoForImsiEncryption(int32_t serial,
Nathan Harold6a8809d2017-07-07 19:28:58 -0700473 const V1_1::ImsiEncryptionInfo& message);
pkanwardb8e0942017-03-17 12:49:34 -0700474
Amit Mahajan17249842017-01-19 15:05:45 -0800475 void checkReturnStatus(Return<void>& ret);
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700476};
477
Amit Mahajan439da362017-02-13 17:43:04 -0800478struct OemHookImpl : public IOemHook {
479 int32_t mSlotId;
480 sp<IOemHookResponse> mOemHookResponse;
481 sp<IOemHookIndication> mOemHookIndication;
482
483 Return<void> setResponseFunctions(
484 const ::android::sp<IOemHookResponse>& oemHookResponse,
485 const ::android::sp<IOemHookIndication>& oemHookIndication);
486
487 Return<void> sendRequestRaw(int32_t serial,
488 const ::android::hardware::hidl_vec<uint8_t>& data);
489
490 Return<void> sendRequestStrings(int32_t serial,
491 const ::android::hardware::hidl_vec<::android::hardware::hidl_string>& data);
492};
493
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800494void memsetAndFreeStrings(int numPointers, ...) {
495 va_list ap;
496 va_start(ap, numPointers);
497 for (int i = 0; i < numPointers; i++) {
498 char *ptr = va_arg(ap, char *);
499 if (ptr) {
500#ifdef MEMSET_FREED
Jack Yub4295a42017-04-14 12:51:49 -0700501#define MAX_STRING_LENGTH 4096
502 memset(ptr, 0, strnlen(ptr, MAX_STRING_LENGTH));
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800503#endif
504 free(ptr);
505 }
506 }
507 va_end(ap);
508}
509
Jack Yuffc06452017-02-13 11:21:00 -0800510void sendErrorResponse(RequestInfo *pRI, RIL_Errno err) {
Amit Mahajan759786a2017-03-03 17:35:47 -0800511 pRI->pCI->responseFunction((int) pRI->socket_id,
Jack Yuffc06452017-02-13 11:21:00 -0800512 (int) RadioResponseType::SOLICITED, pRI->token, err, NULL, 0);
513}
514
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800515/**
Jack Yuf68e0da2017-02-07 14:53:09 -0800516 * Copies over src to dest. If memory allocation fails, responseFunction() is called for the
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800517 * request with error RIL_E_NO_MEMORY.
518 * Returns true on success, and false on failure.
519 */
Ruthwar Kumar Ambeer7c373812017-03-23 17:38:56 +0530520bool copyHidlStringToRil(char **dest, const hidl_string &src, RequestInfo *pRI, bool allowEmpty) {
Jack Yuf68e0da2017-02-07 14:53:09 -0800521 size_t len = src.size();
Ruthwar Kumar Ambeer7c373812017-03-23 17:38:56 +0530522 if (len == 0 && !allowEmpty) {
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800523 *dest = NULL;
524 return true;
525 }
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800526 *dest = (char *) calloc(len + 1, sizeof(char));
527 if (*dest == NULL) {
528 RLOGE("Memory allocation failed for request %s", requestToString(pRI->pCI->requestNumber));
Jack Yuffc06452017-02-13 11:21:00 -0800529 sendErrorResponse(pRI, RIL_E_NO_MEMORY);
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800530 return false;
531 }
Scott Randolphc7213312017-04-03 14:06:40 -0700532 strncpy(*dest, src.c_str(), len + 1);
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800533 return true;
534}
535
Ruthwar Kumar Ambeer7c373812017-03-23 17:38:56 +0530536bool copyHidlStringToRil(char **dest, const hidl_string &src, RequestInfo *pRI) {
537 return copyHidlStringToRil(dest, src, pRI, false);
538}
539
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800540hidl_string convertCharPtrToHidlString(const char *ptr) {
541 hidl_string ret;
542 if (ptr != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -0800543 // TODO: replace this with strnlen
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800544 ret.setToExternal(ptr, strlen(ptr));
545 }
546 return ret;
547}
548
549bool dispatchVoid(int serial, int slotId, int request) {
550 RequestInfo *pRI = android::addRequestToList(serial, slotId, request);
551 if (pRI == NULL) {
552 return false;
553 }
Amit Mahajanb3a11bb2017-05-15 16:41:44 -0700554 CALL_ONREQUEST(request, NULL, 0, pRI, slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800555 return true;
556}
557
558bool dispatchString(int serial, int slotId, int request, const char * str) {
559 RequestInfo *pRI = android::addRequestToList(serial, slotId, request);
560 if (pRI == NULL) {
561 return false;
562 }
563
564 char *pString;
565 if (!copyHidlStringToRil(&pString, str, pRI)) {
566 return false;
567 }
568
Amit Mahajanb3a11bb2017-05-15 16:41:44 -0700569 CALL_ONREQUEST(request, pString, sizeof(char *), pRI, slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800570
571 memsetAndFreeStrings(1, pString);
572 return true;
573}
574
Ruthwar Kumar Ambeer7c373812017-03-23 17:38:56 +0530575bool dispatchStrings(int serial, int slotId, int request, bool allowEmpty, int countStrings, ...) {
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800576 RequestInfo *pRI = android::addRequestToList(serial, slotId, request);
577 if (pRI == NULL) {
578 return false;
579 }
580
Sanket Padawef220dc52017-01-02 23:46:00 -0800581 char **pStrings;
Sanket Padawef220dc52017-01-02 23:46:00 -0800582 pStrings = (char **)calloc(countStrings, sizeof(char *));
583 if (pStrings == NULL) {
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800584 RLOGE("Memory allocation failed for request %s", requestToString(request));
Jack Yuffc06452017-02-13 11:21:00 -0800585 sendErrorResponse(pRI, RIL_E_NO_MEMORY);
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800586 return false;
Sanket Padawef220dc52017-01-02 23:46:00 -0800587 }
588 va_list ap;
589 va_start(ap, countStrings);
590 for (int i = 0; i < countStrings; i++) {
591 const char* str = va_arg(ap, const char *);
Ruthwar Kumar Ambeer7c373812017-03-23 17:38:56 +0530592 if (!copyHidlStringToRil(&pStrings[i], hidl_string(str), pRI, allowEmpty)) {
Sanket Padawef220dc52017-01-02 23:46:00 -0800593 va_end(ap);
Sanket Padawef220dc52017-01-02 23:46:00 -0800594 for (int j = 0; j < i; j++) {
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800595 memsetAndFreeStrings(1, pStrings[j]);
Sanket Padawef220dc52017-01-02 23:46:00 -0800596 }
597 free(pStrings);
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800598 return false;
Sanket Padawef220dc52017-01-02 23:46:00 -0800599 }
Sanket Padawef220dc52017-01-02 23:46:00 -0800600 }
601 va_end(ap);
602
Amit Mahajanb3a11bb2017-05-15 16:41:44 -0700603 CALL_ONREQUEST(request, pStrings, countStrings * sizeof(char *), pRI, slotId);
Sanket Padawef220dc52017-01-02 23:46:00 -0800604
605 if (pStrings != NULL) {
606 for (int i = 0 ; i < countStrings ; i++) {
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800607 memsetAndFreeStrings(1, pStrings[i]);
Sanket Padawef220dc52017-01-02 23:46:00 -0800608 }
609
610#ifdef MEMSET_FREED
611 memset(pStrings, 0, countStrings * sizeof(char *));
612#endif
613 free(pStrings);
614 }
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800615 return true;
616}
617
618bool dispatchStrings(int serial, int slotId, int request, const hidl_vec<hidl_string>& data) {
619 RequestInfo *pRI = android::addRequestToList(serial, slotId, request);
620 if (pRI == NULL) {
621 return false;
622 }
623
624 int countStrings = data.size();
625 char **pStrings;
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800626 pStrings = (char **)calloc(countStrings, sizeof(char *));
627 if (pStrings == NULL) {
628 RLOGE("Memory allocation failed for request %s", requestToString(request));
Jack Yuffc06452017-02-13 11:21:00 -0800629 sendErrorResponse(pRI, RIL_E_NO_MEMORY);
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800630 return false;
631 }
632
633 for (int i = 0; i < countStrings; i++) {
Jack Yuf68e0da2017-02-07 14:53:09 -0800634 if (!copyHidlStringToRil(&pStrings[i], data[i], pRI)) {
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800635 for (int j = 0; j < i; j++) {
636 memsetAndFreeStrings(1, pStrings[j]);
637 }
638 free(pStrings);
639 return false;
640 }
641 }
642
Amit Mahajanb3a11bb2017-05-15 16:41:44 -0700643 CALL_ONREQUEST(request, pStrings, countStrings * sizeof(char *), pRI, slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800644
645 if (pStrings != NULL) {
646 for (int i = 0 ; i < countStrings ; i++) {
647 memsetAndFreeStrings(1, pStrings[i]);
648 }
649
650#ifdef MEMSET_FREED
651 memset(pStrings, 0, countStrings * sizeof(char *));
652#endif
653 free(pStrings);
654 }
655 return true;
656}
657
658bool dispatchInts(int serial, int slotId, int request, int countInts, ...) {
659 RequestInfo *pRI = android::addRequestToList(serial, slotId, request);
660 if (pRI == NULL) {
661 return false;
662 }
663
Jack Yuffc06452017-02-13 11:21:00 -0800664 int *pInts = (int *)calloc(countInts, sizeof(int));
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800665
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800666 if (pInts == NULL) {
667 RLOGE("Memory allocation failed for request %s", requestToString(request));
Jack Yuffc06452017-02-13 11:21:00 -0800668 sendErrorResponse(pRI, RIL_E_NO_MEMORY);
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800669 return false;
670 }
671 va_list ap;
672 va_start(ap, countInts);
673 for (int i = 0; i < countInts; i++) {
674 pInts[i] = va_arg(ap, int);
675 }
676 va_end(ap);
677
Amit Mahajanb3a11bb2017-05-15 16:41:44 -0700678 CALL_ONREQUEST(request, pInts, countInts * sizeof(int), pRI, slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800679
680 if (pInts != NULL) {
681#ifdef MEMSET_FREED
682 memset(pInts, 0, countInts * sizeof(int));
683#endif
684 free(pInts);
685 }
686 return true;
687}
688
689bool dispatchCallForwardStatus(int serial, int slotId, int request,
690 const CallForwardInfo& callInfo) {
691 RequestInfo *pRI = android::addRequestToList(serial, slotId, request);
692 if (pRI == NULL) {
693 return false;
694 }
695
696 RIL_CallForwardInfo cf;
697 cf.status = (int) callInfo.status;
698 cf.reason = callInfo.reason;
699 cf.serviceClass = callInfo.serviceClass;
700 cf.toa = callInfo.toa;
701 cf.timeSeconds = callInfo.timeSeconds;
702
703 if (!copyHidlStringToRil(&cf.number, callInfo.number, pRI)) {
704 return false;
705 }
706
Amit Mahajanb3a11bb2017-05-15 16:41:44 -0700707 CALL_ONREQUEST(request, &cf, sizeof(cf), pRI, slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800708
709 memsetAndFreeStrings(1, cf.number);
710
711 return true;
712}
713
714bool dispatchRaw(int serial, int slotId, int request, const hidl_vec<uint8_t>& rawBytes) {
715 RequestInfo *pRI = android::addRequestToList(serial, slotId, request);
716 if (pRI == NULL) {
717 return false;
718 }
719
720 const uint8_t *uData = rawBytes.data();
721
Amit Mahajanb3a11bb2017-05-15 16:41:44 -0700722 CALL_ONREQUEST(request, (void *) uData, rawBytes.size(), pRI, slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800723
724 return true;
725}
726
727bool dispatchIccApdu(int serial, int slotId, int request, const SimApdu& message) {
728 RequestInfo *pRI = android::addRequestToList(serial, slotId, request);
729 if (pRI == NULL) {
730 return false;
731 }
732
Jack Yu8e732d42017-04-14 00:08:06 -0700733 RIL_SIM_APDU apdu = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800734
735 apdu.sessionid = message.sessionId;
736 apdu.cla = message.cla;
737 apdu.instruction = message.instruction;
738 apdu.p1 = message.p1;
739 apdu.p2 = message.p2;
740 apdu.p3 = message.p3;
741
742 if (!copyHidlStringToRil(&apdu.data, message.data, pRI)) {
743 return false;
744 }
745
Amit Mahajanb3a11bb2017-05-15 16:41:44 -0700746 CALL_ONREQUEST(request, &apdu, sizeof(apdu), pRI, slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800747
748 memsetAndFreeStrings(1, apdu.data);
749
750 return true;
Sanket Padawef220dc52017-01-02 23:46:00 -0800751}
752
Amit Mahajand423d192017-03-16 17:04:01 -0700753void checkReturnStatus(int32_t slotId, Return<void>& ret, bool isRadioService) {
Amit Mahajan17249842017-01-19 15:05:45 -0800754 if (ret.isOk() == false) {
Amit Mahajan439da362017-02-13 17:43:04 -0800755 RLOGE("checkReturnStatus: unable to call response/indication callback");
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800756 // Remote process hosting the callbacks must be dead. Reset the callback objects;
Amit Mahajan17249842017-01-19 15:05:45 -0800757 // there's no other recovery to be done here. When the client process is back up, it will
758 // call setResponseFunctions()
Amit Mahajan932e08e2017-01-24 05:45:02 -0800759
760 // Caller should already hold rdlock, release that first
761 // note the current counter to avoid overwriting updates made by another thread before
762 // write lock is acquired.
Amit Mahajand423d192017-03-16 17:04:01 -0700763 int counter = isRadioService ? mCounterRadio[slotId] : mCounterOemHook[slotId];
Amit Mahajan439da362017-02-13 17:43:04 -0800764 pthread_rwlock_t *radioServiceRwlockPtr = radio::getRadioServiceRwlock(slotId);
Amit Mahajan932e08e2017-01-24 05:45:02 -0800765 int ret = pthread_rwlock_unlock(radioServiceRwlockPtr);
766 assert(ret == 0);
767
768 // acquire wrlock
769 ret = pthread_rwlock_wrlock(radioServiceRwlockPtr);
770 assert(ret == 0);
771
772 // make sure the counter value has not changed
Amit Mahajand423d192017-03-16 17:04:01 -0700773 if (counter == (isRadioService ? mCounterRadio[slotId] : mCounterOemHook[slotId])) {
774 if (isRadioService) {
775 radioService[slotId]->mRadioResponse = NULL;
776 radioService[slotId]->mRadioIndication = NULL;
Amit Mahajanccb6d7f2017-06-09 10:44:54 -0700777 radioService[slotId]->mRadioResponseV1_1 = NULL;
778 radioService[slotId]->mRadioIndicationV1_1 = NULL;
Amit Mahajand423d192017-03-16 17:04:01 -0700779 } else {
780 oemHookService[slotId]->mOemHookResponse = NULL;
781 oemHookService[slotId]->mOemHookIndication = NULL;
782 }
783 isRadioService ? mCounterRadio[slotId]++ : mCounterOemHook[slotId]++;
Amit Mahajan932e08e2017-01-24 05:45:02 -0800784 } else {
Amit Mahajan439da362017-02-13 17:43:04 -0800785 RLOGE("checkReturnStatus: not resetting responseFunctions as they likely "
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800786 "got updated on another thread");
Amit Mahajan932e08e2017-01-24 05:45:02 -0800787 }
788
789 // release wrlock
790 ret = pthread_rwlock_unlock(radioServiceRwlockPtr);
791 assert(ret == 0);
792
793 // Reacquire rdlock
794 ret = pthread_rwlock_rdlock(radioServiceRwlockPtr);
795 assert(ret == 0);
Amit Mahajan17249842017-01-19 15:05:45 -0800796 }
797}
798
Amit Mahajan439da362017-02-13 17:43:04 -0800799void RadioImpl::checkReturnStatus(Return<void>& ret) {
Amit Mahajand423d192017-03-16 17:04:01 -0700800 ::checkReturnStatus(mSlotId, ret, true);
Amit Mahajan439da362017-02-13 17:43:04 -0800801}
802
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700803Return<void> RadioImpl::setResponseFunctions(
804 const ::android::sp<IRadioResponse>& radioResponseParam,
805 const ::android::sp<IRadioIndication>& radioIndicationParam) {
Amit Mahajan111ddca2017-03-03 12:05:13 -0800806 RLOGD("setResponseFunctions");
Amit Mahajan932e08e2017-01-24 05:45:02 -0800807
808 pthread_rwlock_t *radioServiceRwlockPtr = radio::getRadioServiceRwlock(mSlotId);
809 int ret = pthread_rwlock_wrlock(radioServiceRwlockPtr);
810 assert(ret == 0);
811
Sanket Padawef220dc52017-01-02 23:46:00 -0800812 mRadioResponse = radioResponseParam;
813 mRadioIndication = radioIndicationParam;
Amit Mahajanccb6d7f2017-06-09 10:44:54 -0700814 mRadioResponseV1_1 = V1_1::IRadioResponse::castFrom(mRadioResponse).withDefault(nullptr);
815 mRadioIndicationV1_1 = V1_1::IRadioIndication::castFrom(mRadioIndication).withDefault(nullptr);
816 if (mRadioResponseV1_1 == nullptr || mRadioIndicationV1_1 == nullptr) {
817 mRadioResponseV1_1 = nullptr;
818 mRadioIndicationV1_1 = nullptr;
819 }
820
Amit Mahajand423d192017-03-16 17:04:01 -0700821 mCounterRadio[mSlotId]++;
Amit Mahajan932e08e2017-01-24 05:45:02 -0800822
823 ret = pthread_rwlock_unlock(radioServiceRwlockPtr);
824 assert(ret == 0);
825
Amit Mahajan60482fd2017-03-14 16:39:27 -0700826 // client is connected. Send initial indications.
827 android::onNewCommandConnect((RIL_SOCKET_ID) mSlotId);
828
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800829 return Void();
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700830}
831
832Return<void> RadioImpl::getIccCardStatus(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -0700833#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -0800834 RLOGD("getIccCardStatus: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -0700835#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800836 dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_SIM_STATUS);
837 return Void();
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700838}
839
Sanket Padawef220dc52017-01-02 23:46:00 -0800840Return<void> RadioImpl::supplyIccPinForApp(int32_t serial, const hidl_string& pin,
841 const hidl_string& aid) {
Jayachandran C572f2f42017-03-25 14:30:13 -0700842#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -0800843 RLOGD("supplyIccPinForApp: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -0700844#endif
Ruthwar Kumar Ambeer7c373812017-03-23 17:38:56 +0530845 dispatchStrings(serial, mSlotId, RIL_REQUEST_ENTER_SIM_PIN, true,
Scott Randolphc7213312017-04-03 14:06:40 -0700846 2, pin.c_str(), aid.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800847 return Void();
Sanket Padawef220dc52017-01-02 23:46:00 -0800848}
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700849
Sanket Padawef220dc52017-01-02 23:46:00 -0800850Return<void> RadioImpl::supplyIccPukForApp(int32_t serial, const hidl_string& puk,
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800851 const hidl_string& pin, const hidl_string& aid) {
Jayachandran C572f2f42017-03-25 14:30:13 -0700852#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -0800853 RLOGD("supplyIccPukForApp: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -0700854#endif
Ruthwar Kumar Ambeer7c373812017-03-23 17:38:56 +0530855 dispatchStrings(serial, mSlotId, RIL_REQUEST_ENTER_SIM_PUK, true,
Scott Randolphc7213312017-04-03 14:06:40 -0700856 3, puk.c_str(), pin.c_str(), aid.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800857 return Void();
Sanket Padawef220dc52017-01-02 23:46:00 -0800858}
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700859
Sanket Padawef220dc52017-01-02 23:46:00 -0800860Return<void> RadioImpl::supplyIccPin2ForApp(int32_t serial, const hidl_string& pin2,
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800861 const hidl_string& aid) {
Jayachandran C572f2f42017-03-25 14:30:13 -0700862#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -0800863 RLOGD("supplyIccPin2ForApp: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -0700864#endif
Ruthwar Kumar Ambeer7c373812017-03-23 17:38:56 +0530865 dispatchStrings(serial, mSlotId, RIL_REQUEST_ENTER_SIM_PIN2, true,
Scott Randolphc7213312017-04-03 14:06:40 -0700866 2, pin2.c_str(), aid.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800867 return Void();
Sanket Padawef220dc52017-01-02 23:46:00 -0800868}
869
870Return<void> RadioImpl::supplyIccPuk2ForApp(int32_t serial, const hidl_string& puk2,
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800871 const hidl_string& pin2, const hidl_string& aid) {
Jayachandran C572f2f42017-03-25 14:30:13 -0700872#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -0800873 RLOGD("supplyIccPuk2ForApp: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -0700874#endif
Ruthwar Kumar Ambeer7c373812017-03-23 17:38:56 +0530875 dispatchStrings(serial, mSlotId, RIL_REQUEST_ENTER_SIM_PUK2, true,
Scott Randolphc7213312017-04-03 14:06:40 -0700876 3, puk2.c_str(), pin2.c_str(), aid.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800877 return Void();
Sanket Padawef220dc52017-01-02 23:46:00 -0800878}
879
880Return<void> RadioImpl::changeIccPinForApp(int32_t serial, const hidl_string& oldPin,
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800881 const hidl_string& newPin, const hidl_string& aid) {
Jayachandran C572f2f42017-03-25 14:30:13 -0700882#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -0800883 RLOGD("changeIccPinForApp: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -0700884#endif
Ruthwar Kumar Ambeer7c373812017-03-23 17:38:56 +0530885 dispatchStrings(serial, mSlotId, RIL_REQUEST_CHANGE_SIM_PIN, true,
Scott Randolphc7213312017-04-03 14:06:40 -0700886 3, oldPin.c_str(), newPin.c_str(), aid.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800887 return Void();
Sanket Padawef220dc52017-01-02 23:46:00 -0800888}
889
890Return<void> RadioImpl::changeIccPin2ForApp(int32_t serial, const hidl_string& oldPin2,
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800891 const hidl_string& newPin2, const hidl_string& aid) {
Jayachandran C572f2f42017-03-25 14:30:13 -0700892#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -0800893 RLOGD("changeIccPin2ForApp: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -0700894#endif
Ruthwar Kumar Ambeer7c373812017-03-23 17:38:56 +0530895 dispatchStrings(serial, mSlotId, RIL_REQUEST_CHANGE_SIM_PIN2, true,
Scott Randolphc7213312017-04-03 14:06:40 -0700896 3, oldPin2.c_str(), newPin2.c_str(), aid.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800897 return Void();
Sanket Padawef220dc52017-01-02 23:46:00 -0800898}
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700899
900Return<void> RadioImpl::supplyNetworkDepersonalization(int32_t serial,
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800901 const hidl_string& netPin) {
Jayachandran C572f2f42017-03-25 14:30:13 -0700902#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -0800903 RLOGD("supplyNetworkDepersonalization: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -0700904#endif
Ruthwar Kumar Ambeer7c373812017-03-23 17:38:56 +0530905 dispatchStrings(serial, mSlotId, RIL_REQUEST_ENTER_NETWORK_DEPERSONALIZATION, true,
Scott Randolphc7213312017-04-03 14:06:40 -0700906 1, netPin.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800907 return Void();
Sanket Padawef220dc52017-01-02 23:46:00 -0800908}
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700909
Sanket Padawef220dc52017-01-02 23:46:00 -0800910Return<void> RadioImpl::getCurrentCalls(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -0700911#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -0800912 RLOGD("getCurrentCalls: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -0700913#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800914 dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_CURRENT_CALLS);
915 return Void();
Sanket Padawef220dc52017-01-02 23:46:00 -0800916}
917
918Return<void> RadioImpl::dial(int32_t serial, const Dial& dialInfo) {
Jayachandran C572f2f42017-03-25 14:30:13 -0700919#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -0800920 RLOGD("dial: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -0700921#endif
Sanket Padawef220dc52017-01-02 23:46:00 -0800922 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_DIAL);
923 if (pRI == NULL) {
924 return Void();
925 }
Jack Yuf68e0da2017-02-07 14:53:09 -0800926 RIL_Dial dial = {};
927 RIL_UUS_Info uusInfo = {};
Sanket Padawef220dc52017-01-02 23:46:00 -0800928 int32_t sizeOfDial = sizeof(dial);
929
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800930 if (!copyHidlStringToRil(&dial.address, dialInfo.address, pRI)) {
Sanket Padawef220dc52017-01-02 23:46:00 -0800931 return Void();
932 }
Jack Yuf68e0da2017-02-07 14:53:09 -0800933 dial.clir = (int) dialInfo.clir;
Sanket Padawef220dc52017-01-02 23:46:00 -0800934
Sanket Padawef220dc52017-01-02 23:46:00 -0800935 if (dialInfo.uusInfo.size() != 0) {
Sanket Padawef220dc52017-01-02 23:46:00 -0800936 uusInfo.uusType = (RIL_UUS_Type) dialInfo.uusInfo[0].uusType;
937 uusInfo.uusDcs = (RIL_UUS_DCS) dialInfo.uusInfo[0].uusDcs;
938
939 if (dialInfo.uusInfo[0].uusData.size() == 0) {
940 uusInfo.uusData = NULL;
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800941 uusInfo.uusLength = 0;
Sanket Padawef220dc52017-01-02 23:46:00 -0800942 } else {
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800943 if (!copyHidlStringToRil(&uusInfo.uusData, dialInfo.uusInfo[0].uusData, pRI)) {
944 memsetAndFreeStrings(1, dial.address);
Sanket Padawef220dc52017-01-02 23:46:00 -0800945 return Void();
946 }
Jack Yuf68e0da2017-02-07 14:53:09 -0800947 uusInfo.uusLength = dialInfo.uusInfo[0].uusData.size();
Sanket Padawef220dc52017-01-02 23:46:00 -0800948 }
949
Sanket Padawef220dc52017-01-02 23:46:00 -0800950 dial.uusInfo = &uusInfo;
951 }
952
Amit Mahajanb3a11bb2017-05-15 16:41:44 -0700953 CALL_ONREQUEST(RIL_REQUEST_DIAL, &dial, sizeOfDial, pRI, mSlotId);
Sanket Padawef220dc52017-01-02 23:46:00 -0800954
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800955 memsetAndFreeStrings(2, dial.address, uusInfo.uusData);
Sanket Padawef220dc52017-01-02 23:46:00 -0800956
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800957 return Void();
Sanket Padawef220dc52017-01-02 23:46:00 -0800958}
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700959
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800960Return<void> RadioImpl::getImsiForApp(int32_t serial, const hidl_string& aid) {
Jayachandran C572f2f42017-03-25 14:30:13 -0700961#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -0800962 RLOGD("getImsiForApp: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -0700963#endif
Ruthwar Kumar Ambeer7c373812017-03-23 17:38:56 +0530964 dispatchStrings(serial, mSlotId, RIL_REQUEST_GET_IMSI, false,
Scott Randolphc7213312017-04-03 14:06:40 -0700965 1, aid.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800966 return Void();
967}
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700968
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800969Return<void> RadioImpl::hangup(int32_t serial, int32_t gsmIndex) {
Jayachandran C572f2f42017-03-25 14:30:13 -0700970#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -0800971 RLOGD("hangup: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -0700972#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800973 dispatchInts(serial, mSlotId, RIL_REQUEST_HANGUP, 1, gsmIndex);
974 return Void();
975}
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700976
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800977Return<void> RadioImpl::hangupWaitingOrBackground(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -0700978#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -0800979 RLOGD("hangupWaitingOrBackground: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -0700980#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800981 dispatchVoid(serial, mSlotId, RIL_REQUEST_HANGUP_WAITING_OR_BACKGROUND);
982 return Void();
983}
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700984
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800985Return<void> RadioImpl::hangupForegroundResumeBackground(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -0700986#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -0800987 RLOGD("hangupForegroundResumeBackground: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -0700988#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800989 dispatchVoid(serial, mSlotId, RIL_REQUEST_HANGUP_FOREGROUND_RESUME_BACKGROUND);
990 return Void();
991}
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700992
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800993Return<void> RadioImpl::switchWaitingOrHoldingAndActive(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -0700994#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -0800995 RLOGD("switchWaitingOrHoldingAndActive: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -0700996#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800997 dispatchVoid(serial, mSlotId, RIL_REQUEST_SWITCH_WAITING_OR_HOLDING_AND_ACTIVE);
998 return Void();
999}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001000
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001001Return<void> RadioImpl::conference(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001002#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001003 RLOGD("conference: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001004#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001005 dispatchVoid(serial, mSlotId, RIL_REQUEST_CONFERENCE);
1006 return Void();
1007}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001008
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001009Return<void> RadioImpl::rejectCall(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001010#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001011 RLOGD("rejectCall: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001012#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001013 dispatchVoid(serial, mSlotId, RIL_REQUEST_UDUB);
1014 return Void();
1015}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001016
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001017Return<void> RadioImpl::getLastCallFailCause(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001018#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001019 RLOGD("getLastCallFailCause: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001020#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001021 dispatchVoid(serial, mSlotId, RIL_REQUEST_LAST_CALL_FAIL_CAUSE);
1022 return Void();
1023}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001024
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001025Return<void> RadioImpl::getSignalStrength(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001026#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001027 RLOGD("getSignalStrength: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001028#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001029 dispatchVoid(serial, mSlotId, RIL_REQUEST_SIGNAL_STRENGTH);
1030 return Void();
1031}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001032
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001033Return<void> RadioImpl::getVoiceRegistrationState(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001034#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001035 RLOGD("getVoiceRegistrationState: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001036#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001037 dispatchVoid(serial, mSlotId, RIL_REQUEST_VOICE_REGISTRATION_STATE);
1038 return Void();
1039}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001040
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001041Return<void> RadioImpl::getDataRegistrationState(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001042#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001043 RLOGD("getDataRegistrationState: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001044#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001045 dispatchVoid(serial, mSlotId, RIL_REQUEST_DATA_REGISTRATION_STATE);
1046 return Void();
1047}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001048
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001049Return<void> RadioImpl::getOperator(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001050#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001051 RLOGD("getOperator: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001052#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001053 dispatchVoid(serial, mSlotId, RIL_REQUEST_OPERATOR);
1054 return Void();
1055}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001056
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001057Return<void> RadioImpl::setRadioPower(int32_t serial, bool on) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08001058 RLOGD("setRadioPower: serial %d on %d", serial, on);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001059 dispatchInts(serial, mSlotId, RIL_REQUEST_RADIO_POWER, 1, BOOL_TO_INT(on));
1060 return Void();
1061}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001062
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001063Return<void> RadioImpl::sendDtmf(int32_t serial, const hidl_string& s) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001064#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001065 RLOGD("sendDtmf: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001066#endif
Scott Randolphc7213312017-04-03 14:06:40 -07001067 dispatchString(serial, mSlotId, RIL_REQUEST_DTMF, s.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001068 return Void();
1069}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001070
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001071Return<void> RadioImpl::sendSms(int32_t serial, const GsmSmsMessage& message) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001072#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001073 RLOGD("sendSms: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001074#endif
Ruthwar Kumar Ambeer7c373812017-03-23 17:38:56 +05301075 dispatchStrings(serial, mSlotId, RIL_REQUEST_SEND_SMS, false,
Scott Randolphc7213312017-04-03 14:06:40 -07001076 2, message.smscPdu.c_str(), message.pdu.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001077 return Void();
1078}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001079
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001080Return<void> RadioImpl::sendSMSExpectMore(int32_t serial, const GsmSmsMessage& message) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001081#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001082 RLOGD("sendSMSExpectMore: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001083#endif
Ruthwar Kumar Ambeer7c373812017-03-23 17:38:56 +05301084 dispatchStrings(serial, mSlotId, RIL_REQUEST_SEND_SMS_EXPECT_MORE, false,
Scott Randolphc7213312017-04-03 14:06:40 -07001085 2, message.smscPdu.c_str(), message.pdu.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001086 return Void();
1087}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001088
Jack Yuc13645e2017-04-13 20:55:03 -07001089static bool convertMvnoTypeToString(MvnoType type, char *&str) {
Jack Yuffc06452017-02-13 11:21:00 -08001090 switch (type) {
Jack Yuc13645e2017-04-13 20:55:03 -07001091 case MvnoType::IMSI:
1092 str = (char *)"imsi";
1093 return true;
1094 case MvnoType::GID:
1095 str = (char *)"gid";
1096 return true;
1097 case MvnoType::SPN:
1098 str = (char *)"spn";
1099 return true;
1100 case MvnoType::NONE:
1101 str = (char *)"";
1102 return true;
Jack Yuffc06452017-02-13 11:21:00 -08001103 }
Jack Yuc13645e2017-04-13 20:55:03 -07001104 return false;
Jack Yuffc06452017-02-13 11:21:00 -08001105}
1106
1107Return<void> RadioImpl::setupDataCall(int32_t serial, RadioTechnology radioTechnology,
1108 const DataProfileInfo& dataProfileInfo, bool modemCognitive,
1109 bool roamingAllowed, bool isRoaming) {
1110
Jayachandran C572f2f42017-03-25 14:30:13 -07001111#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001112 RLOGD("setupDataCall: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001113#endif
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001114
Jack Yuffc06452017-02-13 11:21:00 -08001115 if (s_vendorFunctions->version >= 4 && s_vendorFunctions->version <= 14) {
1116 const hidl_string &protocol =
1117 (isRoaming ? dataProfileInfo.roamingProtocol : dataProfileInfo.protocol);
Ruthwar Kumar Ambeer7c373812017-03-23 17:38:56 +05301118 dispatchStrings(serial, mSlotId, RIL_REQUEST_SETUP_DATA_CALL, true, 7,
Jack Yuffc06452017-02-13 11:21:00 -08001119 std::to_string((int) radioTechnology + 2).c_str(),
1120 std::to_string((int) dataProfileInfo.profileId).c_str(),
1121 dataProfileInfo.apn.c_str(),
1122 dataProfileInfo.user.c_str(),
1123 dataProfileInfo.password.c_str(),
1124 std::to_string((int) dataProfileInfo.authType).c_str(),
1125 protocol.c_str());
1126 } else if (s_vendorFunctions->version >= 15) {
Jack Yuc13645e2017-04-13 20:55:03 -07001127 char *mvnoTypeStr = NULL;
1128 if (!convertMvnoTypeToString(dataProfileInfo.mvnoType, mvnoTypeStr)) {
Jack Yuffc06452017-02-13 11:21:00 -08001129 RequestInfo *pRI = android::addRequestToList(serial, mSlotId,
1130 RIL_REQUEST_SETUP_DATA_CALL);
1131 if (pRI != NULL) {
1132 sendErrorResponse(pRI, RIL_E_INVALID_ARGUMENTS);
1133 }
1134 return Void();
1135 }
Ruthwar Kumar Ambeer7c373812017-03-23 17:38:56 +05301136 dispatchStrings(serial, mSlotId, RIL_REQUEST_SETUP_DATA_CALL, true, 15,
Jack Yuffc06452017-02-13 11:21:00 -08001137 std::to_string((int) radioTechnology + 2).c_str(),
1138 std::to_string((int) dataProfileInfo.profileId).c_str(),
1139 dataProfileInfo.apn.c_str(),
1140 dataProfileInfo.user.c_str(),
1141 dataProfileInfo.password.c_str(),
1142 std::to_string((int) dataProfileInfo.authType).c_str(),
1143 dataProfileInfo.protocol.c_str(),
1144 dataProfileInfo.roamingProtocol.c_str(),
1145 std::to_string(dataProfileInfo.supportedApnTypesBitmap).c_str(),
1146 std::to_string(dataProfileInfo.bearerBitmap).c_str(),
Jack Yuc13645e2017-04-13 20:55:03 -07001147 modemCognitive ? "1" : "0",
Jack Yuffc06452017-02-13 11:21:00 -08001148 std::to_string(dataProfileInfo.mtu).c_str(),
1149 mvnoTypeStr,
1150 dataProfileInfo.mvnoMatchData.c_str(),
Jack Yuc13645e2017-04-13 20:55:03 -07001151 roamingAllowed ? "1" : "0");
Jack Yuffc06452017-02-13 11:21:00 -08001152 } else {
1153 RLOGE("Unsupported RIL version %d, min version expected 4", s_vendorFunctions->version);
1154 RequestInfo *pRI = android::addRequestToList(serial, mSlotId,
1155 RIL_REQUEST_SETUP_DATA_CALL);
1156 if (pRI != NULL) {
1157 sendErrorResponse(pRI, RIL_E_REQUEST_NOT_SUPPORTED);
1158 }
1159 }
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001160 return Void();
1161}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001162
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001163Return<void> RadioImpl::iccIOForApp(int32_t serial, const IccIo& iccIo) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001164#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001165 RLOGD("iccIOForApp: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001166#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001167 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_SIM_IO);
1168 if (pRI == NULL) {
1169 return Void();
1170 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001171
Jack Yu8e732d42017-04-14 00:08:06 -07001172 RIL_SIM_IO_v6 rilIccIo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001173 rilIccIo.command = iccIo.command;
1174 rilIccIo.fileid = iccIo.fileId;
1175 if (!copyHidlStringToRil(&rilIccIo.path, iccIo.path, pRI)) {
1176 return Void();
1177 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001178
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001179 rilIccIo.p1 = iccIo.p1;
1180 rilIccIo.p2 = iccIo.p2;
1181 rilIccIo.p3 = iccIo.p3;
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001182
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001183 if (!copyHidlStringToRil(&rilIccIo.data, iccIo.data, pRI)) {
1184 memsetAndFreeStrings(1, rilIccIo.path);
1185 return Void();
1186 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001187
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001188 if (!copyHidlStringToRil(&rilIccIo.pin2, iccIo.pin2, pRI)) {
1189 memsetAndFreeStrings(2, rilIccIo.path, rilIccIo.data);
1190 return Void();
1191 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001192
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001193 if (!copyHidlStringToRil(&rilIccIo.aidPtr, iccIo.aid, pRI)) {
1194 memsetAndFreeStrings(3, rilIccIo.path, rilIccIo.data, rilIccIo.pin2);
1195 return Void();
1196 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001197
Amit Mahajanb3a11bb2017-05-15 16:41:44 -07001198 CALL_ONREQUEST(RIL_REQUEST_SIM_IO, &rilIccIo, sizeof(rilIccIo), pRI, mSlotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001199
1200 memsetAndFreeStrings(4, rilIccIo.path, rilIccIo.data, rilIccIo.pin2, rilIccIo.aidPtr);
1201
1202 return Void();
1203}
1204
1205Return<void> RadioImpl::sendUssd(int32_t serial, const hidl_string& ussd) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001206#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001207 RLOGD("sendUssd: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001208#endif
Scott Randolphc7213312017-04-03 14:06:40 -07001209 dispatchString(serial, mSlotId, RIL_REQUEST_SEND_USSD, ussd.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001210 return Void();
1211}
1212
1213Return<void> RadioImpl::cancelPendingUssd(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001214#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001215 RLOGD("cancelPendingUssd: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001216#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001217 dispatchVoid(serial, mSlotId, RIL_REQUEST_CANCEL_USSD);
1218 return Void();
1219}
1220
1221Return<void> RadioImpl::getClir(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001222#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001223 RLOGD("getClir: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001224#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001225 dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_CLIR);
1226 return Void();
1227}
1228
1229Return<void> RadioImpl::setClir(int32_t serial, int32_t status) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001230#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001231 RLOGD("setClir: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001232#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001233 dispatchInts(serial, mSlotId, RIL_REQUEST_SET_CLIR, 1, status);
1234 return Void();
1235}
1236
1237Return<void> RadioImpl::getCallForwardStatus(int32_t serial, const CallForwardInfo& callInfo) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001238#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001239 RLOGD("getCallForwardStatus: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001240#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001241 dispatchCallForwardStatus(serial, mSlotId, RIL_REQUEST_QUERY_CALL_FORWARD_STATUS,
1242 callInfo);
1243 return Void();
1244}
1245
1246Return<void> RadioImpl::setCallForward(int32_t serial, const CallForwardInfo& callInfo) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001247#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001248 RLOGD("setCallForward: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001249#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001250 dispatchCallForwardStatus(serial, mSlotId, RIL_REQUEST_SET_CALL_FORWARD,
1251 callInfo);
1252 return Void();
1253}
1254
1255Return<void> RadioImpl::getCallWaiting(int32_t serial, int32_t serviceClass) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001256#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001257 RLOGD("getCallWaiting: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001258#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001259 dispatchInts(serial, mSlotId, RIL_REQUEST_QUERY_CALL_WAITING, 1, serviceClass);
1260 return Void();
1261}
1262
1263Return<void> RadioImpl::setCallWaiting(int32_t serial, bool enable, int32_t serviceClass) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001264#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001265 RLOGD("setCallWaiting: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001266#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001267 dispatchInts(serial, mSlotId, RIL_REQUEST_SET_CALL_WAITING, 2, BOOL_TO_INT(enable),
1268 serviceClass);
1269 return Void();
1270}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001271
1272Return<void> RadioImpl::acknowledgeLastIncomingGsmSms(int32_t serial,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001273 bool success, SmsAcknowledgeFailCause cause) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001274#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001275 RLOGD("acknowledgeLastIncomingGsmSms: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001276#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001277 dispatchInts(serial, mSlotId, RIL_REQUEST_SMS_ACKNOWLEDGE, 2, BOOL_TO_INT(success),
1278 cause);
1279 return Void();
1280}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001281
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001282Return<void> RadioImpl::acceptCall(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001283#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001284 RLOGD("acceptCall: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001285#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001286 dispatchVoid(serial, mSlotId, RIL_REQUEST_ANSWER);
1287 return Void();
1288}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001289
1290Return<void> RadioImpl::deactivateDataCall(int32_t serial,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001291 int32_t cid, bool reasonRadioShutDown) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001292#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001293 RLOGD("deactivateDataCall: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001294#endif
Ruthwar Kumar Ambeer7c373812017-03-23 17:38:56 +05301295 dispatchStrings(serial, mSlotId, RIL_REQUEST_DEACTIVATE_DATA_CALL, false,
Scott Randolphc7213312017-04-03 14:06:40 -07001296 2, (std::to_string(cid)).c_str(), reasonRadioShutDown ? "1" : "0");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001297 return Void();
1298}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001299
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001300Return<void> RadioImpl::getFacilityLockForApp(int32_t serial, const hidl_string& facility,
1301 const hidl_string& password, int32_t serviceClass,
1302 const hidl_string& appId) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001303#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001304 RLOGD("getFacilityLockForApp: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001305#endif
Ruthwar Kumar Ambeer7c373812017-03-23 17:38:56 +05301306 dispatchStrings(serial, mSlotId, RIL_REQUEST_QUERY_FACILITY_LOCK, true,
Scott Randolphc7213312017-04-03 14:06:40 -07001307 4, facility.c_str(), password.c_str(),
1308 (std::to_string(serviceClass)).c_str(), appId.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001309 return Void();
1310}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001311
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001312Return<void> RadioImpl::setFacilityLockForApp(int32_t serial, const hidl_string& facility,
1313 bool lockState, const hidl_string& password,
1314 int32_t serviceClass, const hidl_string& appId) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001315#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001316 RLOGD("setFacilityLockForApp: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001317#endif
Ruthwar Kumar Ambeer7c373812017-03-23 17:38:56 +05301318 dispatchStrings(serial, mSlotId, RIL_REQUEST_SET_FACILITY_LOCK, true,
Scott Randolphc7213312017-04-03 14:06:40 -07001319 5, facility.c_str(), lockState ? "1" : "0", password.c_str(),
1320 (std::to_string(serviceClass)).c_str(), appId.c_str() );
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001321 return Void();
1322}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001323
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001324Return<void> RadioImpl::setBarringPassword(int32_t serial, const hidl_string& facility,
1325 const hidl_string& oldPassword,
1326 const hidl_string& newPassword) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001327#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001328 RLOGD("setBarringPassword: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001329#endif
Ruthwar Kumar Ambeer7c373812017-03-23 17:38:56 +05301330 dispatchStrings(serial, mSlotId, RIL_REQUEST_CHANGE_BARRING_PASSWORD, true,
Sanket Padawe75e42a52017-05-24 10:03:55 -07001331 3, facility.c_str(), oldPassword.c_str(), newPassword.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001332 return Void();
1333}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001334
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001335Return<void> RadioImpl::getNetworkSelectionMode(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001336#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001337 RLOGD("getNetworkSelectionMode: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001338#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001339 dispatchVoid(serial, mSlotId, RIL_REQUEST_QUERY_NETWORK_SELECTION_MODE);
1340 return Void();
1341}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001342
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001343Return<void> RadioImpl::setNetworkSelectionModeAutomatic(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001344#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001345 RLOGD("setNetworkSelectionModeAutomatic: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001346#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001347 dispatchVoid(serial, mSlotId, RIL_REQUEST_SET_NETWORK_SELECTION_AUTOMATIC);
1348 return Void();
1349}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001350
1351Return<void> RadioImpl::setNetworkSelectionModeManual(int32_t serial,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001352 const hidl_string& operatorNumeric) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001353#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001354 RLOGD("setNetworkSelectionModeManual: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001355#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001356 dispatchString(serial, mSlotId, RIL_REQUEST_SET_NETWORK_SELECTION_MANUAL,
Scott Randolphc7213312017-04-03 14:06:40 -07001357 operatorNumeric.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001358 return Void();
1359}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001360
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001361Return<void> RadioImpl::getAvailableNetworks(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001362#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001363 RLOGD("getAvailableNetworks: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001364#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001365 dispatchVoid(serial, mSlotId, RIL_REQUEST_QUERY_AVAILABLE_NETWORKS);
1366 return Void();
1367}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001368
Nathan Harold6a8809d2017-07-07 19:28:58 -07001369Return<void> RadioImpl::startNetworkScan(int32_t serial, const V1_1::NetworkScanRequest& request) {
yinxu3abe7c72017-05-03 15:15:19 -07001370#if VDBG
1371 RLOGD("startNetworkScan: serial %d", serial);
1372#endif
yinxu8688abd2017-05-22 11:26:45 -07001373
1374 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_START_NETWORK_SCAN);
1375 if (pRI == NULL) {
1376 return Void();
1377 }
1378
pitchaiah7c683282020-10-13 09:25:02 +02001379#ifdef NETWORK_SCAN_NOT_SUPPORTED /* Qualcomm ril doesn't support RIL_REQUEST_START_NETWORK_SCAN */
1380 RLOGD("RIL_REQUEST_START_NETWORK_SCAN not supported");
1381 sendErrorResponse(pRI, RIL_E_REQUEST_NOT_SUPPORTED);
1382 return Void();
1383#else
1384
yinxu8688abd2017-05-22 11:26:45 -07001385 if (request.specifiers.size() > MAX_RADIO_ACCESS_NETWORKS) {
1386 sendErrorResponse(pRI, RIL_E_INVALID_ARGUMENTS);
1387 return Void();
1388 }
1389
1390 RIL_NetworkScanRequest scan_request = {};
1391
1392 scan_request.type = (RIL_ScanType) request.type;
1393 scan_request.interval = request.interval;
1394 scan_request.specifiers_length = request.specifiers.size();
1395 for (size_t i = 0; i < request.specifiers.size(); ++i) {
1396 if (request.specifiers[i].geranBands.size() > MAX_BANDS ||
1397 request.specifiers[i].utranBands.size() > MAX_BANDS ||
1398 request.specifiers[i].eutranBands.size() > MAX_BANDS ||
1399 request.specifiers[i].channels.size() > MAX_CHANNELS) {
1400 sendErrorResponse(pRI, RIL_E_INVALID_ARGUMENTS);
1401 return Void();
1402 }
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07001403 const V1_1::RadioAccessSpecifier& ras_from =
yinxu8688abd2017-05-22 11:26:45 -07001404 request.specifiers[i];
1405 RIL_RadioAccessSpecifier& ras_to = scan_request.specifiers[i];
1406
1407 ras_to.radio_access_network = (RIL_RadioAccessNetworks) ras_from.radioAccessNetwork;
1408 ras_to.channels_length = ras_from.channels.size();
1409
1410 std::copy(ras_from.channels.begin(), ras_from.channels.end(), ras_to.channels);
1411 const std::vector<uint32_t> * bands = nullptr;
1412 switch (request.specifiers[i].radioAccessNetwork) {
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07001413 case V1_1::RadioAccessNetworks::GERAN:
yinxu8688abd2017-05-22 11:26:45 -07001414 ras_to.bands_length = ras_from.geranBands.size();
1415 bands = (std::vector<uint32_t> *) &ras_from.geranBands;
1416 break;
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07001417 case V1_1::RadioAccessNetworks::UTRAN:
yinxu8688abd2017-05-22 11:26:45 -07001418 ras_to.bands_length = ras_from.utranBands.size();
1419 bands = (std::vector<uint32_t> *) &ras_from.utranBands;
1420 break;
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07001421 case V1_1::RadioAccessNetworks::EUTRAN:
yinxu8688abd2017-05-22 11:26:45 -07001422 ras_to.bands_length = ras_from.eutranBands.size();
1423 bands = (std::vector<uint32_t> *) &ras_from.eutranBands;
1424 break;
1425 default:
1426 sendErrorResponse(pRI, RIL_E_INVALID_ARGUMENTS);
1427 return Void();
1428 }
1429 // safe to copy to geran_bands because it's a union member
yinxu9c7ad932017-06-22 17:10:59 -07001430 for (size_t idx = 0; idx < ras_to.bands_length; ++idx) {
1431 ras_to.bands.geran_bands[idx] = (RIL_GeranBands) (*bands)[idx];
1432 }
yinxu8688abd2017-05-22 11:26:45 -07001433 }
1434
Mathieu Chartierf65b2c92017-06-05 13:59:25 -07001435 CALL_ONREQUEST(RIL_REQUEST_START_NETWORK_SCAN, &scan_request, sizeof(scan_request), pRI,
1436 mSlotId);
yinxu8688abd2017-05-22 11:26:45 -07001437
yinxu3abe7c72017-05-03 15:15:19 -07001438 return Void();
pitchaiah7c683282020-10-13 09:25:02 +02001439#endif
yinxu3abe7c72017-05-03 15:15:19 -07001440}
1441
1442Return<void> RadioImpl::stopNetworkScan(int32_t serial) {
1443#if VDBG
1444 RLOGD("stopNetworkScan: serial %d", serial);
1445#endif
yinxu3abe7c72017-05-03 15:15:19 -07001446 dispatchVoid(serial, mSlotId, RIL_REQUEST_STOP_NETWORK_SCAN);
1447 return Void();
1448}
1449
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001450Return<void> RadioImpl::startDtmf(int32_t serial, const hidl_string& s) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001451#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001452 RLOGD("startDtmf: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001453#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001454 dispatchString(serial, mSlotId, RIL_REQUEST_DTMF_START,
Scott Randolphc7213312017-04-03 14:06:40 -07001455 s.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001456 return Void();
1457}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001458
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001459Return<void> RadioImpl::stopDtmf(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001460#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001461 RLOGD("stopDtmf: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001462#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001463 dispatchVoid(serial, mSlotId, RIL_REQUEST_DTMF_STOP);
1464 return Void();
1465}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001466
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001467Return<void> RadioImpl::getBasebandVersion(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001468#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001469 RLOGD("getBasebandVersion: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001470#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001471 dispatchVoid(serial, mSlotId, RIL_REQUEST_BASEBAND_VERSION);
1472 return Void();
1473}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001474
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001475Return<void> RadioImpl::separateConnection(int32_t serial, int32_t gsmIndex) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001476#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001477 RLOGD("separateConnection: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001478#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001479 dispatchInts(serial, mSlotId, RIL_REQUEST_SEPARATE_CONNECTION, 1, gsmIndex);
1480 return Void();
1481}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001482
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001483Return<void> RadioImpl::setMute(int32_t serial, bool enable) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001484#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001485 RLOGD("setMute: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001486#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001487 dispatchInts(serial, mSlotId, RIL_REQUEST_SET_MUTE, 1, BOOL_TO_INT(enable));
1488 return Void();
1489}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001490
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001491Return<void> RadioImpl::getMute(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001492#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001493 RLOGD("getMute: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001494#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001495 dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_MUTE);
1496 return Void();
1497}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001498
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001499Return<void> RadioImpl::getClip(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001500#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001501 RLOGD("getClip: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001502#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001503 dispatchVoid(serial, mSlotId, RIL_REQUEST_QUERY_CLIP);
1504 return Void();
1505}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001506
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001507Return<void> RadioImpl::getDataCallList(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001508#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001509 RLOGD("getDataCallList: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001510#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001511 dispatchVoid(serial, mSlotId, RIL_REQUEST_DATA_CALL_LIST);
1512 return Void();
1513}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001514
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001515Return<void> RadioImpl::setSuppServiceNotifications(int32_t serial, bool enable) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001516#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001517 RLOGD("setSuppServiceNotifications: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001518#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001519 dispatchInts(serial, mSlotId, RIL_REQUEST_SET_SUPP_SVC_NOTIFICATION, 1,
1520 BOOL_TO_INT(enable));
1521 return Void();
1522}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001523
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001524Return<void> RadioImpl::writeSmsToSim(int32_t serial, const SmsWriteArgs& smsWriteArgs) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001525#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001526 RLOGD("writeSmsToSim: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001527#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001528 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_WRITE_SMS_TO_SIM);
1529 if (pRI == NULL) {
1530 return Void();
1531 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001532
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001533 RIL_SMS_WriteArgs args;
1534 args.status = (int) smsWriteArgs.status;
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001535
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001536 if (!copyHidlStringToRil(&args.pdu, smsWriteArgs.pdu, pRI)) {
1537 return Void();
1538 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001539
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001540 if (!copyHidlStringToRil(&args.smsc, smsWriteArgs.smsc, pRI)) {
1541 memsetAndFreeStrings(1, args.pdu);
1542 return Void();
1543 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001544
Amit Mahajanb3a11bb2017-05-15 16:41:44 -07001545 CALL_ONREQUEST(RIL_REQUEST_WRITE_SMS_TO_SIM, &args, sizeof(args), pRI, mSlotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001546
1547 memsetAndFreeStrings(2, args.smsc, args.pdu);
1548
1549 return Void();
1550}
1551
1552Return<void> RadioImpl::deleteSmsOnSim(int32_t serial, int32_t index) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001553#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001554 RLOGD("deleteSmsOnSim: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001555#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001556 dispatchInts(serial, mSlotId, RIL_REQUEST_DELETE_SMS_ON_SIM, 1, index);
1557 return Void();
1558}
1559
1560Return<void> RadioImpl::setBandMode(int32_t serial, RadioBandMode mode) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001561#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001562 RLOGD("setBandMode: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001563#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001564 dispatchInts(serial, mSlotId, RIL_REQUEST_SET_BAND_MODE, 1, mode);
1565 return Void();
1566}
1567
1568Return<void> RadioImpl::getAvailableBandModes(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001569#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001570 RLOGD("getAvailableBandModes: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001571#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001572 dispatchVoid(serial, mSlotId, RIL_REQUEST_QUERY_AVAILABLE_BAND_MODE);
1573 return Void();
1574}
1575
1576Return<void> RadioImpl::sendEnvelope(int32_t serial, const hidl_string& command) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001577#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001578 RLOGD("sendEnvelope: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001579#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001580 dispatchString(serial, mSlotId, RIL_REQUEST_STK_SEND_ENVELOPE_COMMAND,
Scott Randolphc7213312017-04-03 14:06:40 -07001581 command.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001582 return Void();
1583}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001584
1585Return<void> RadioImpl::sendTerminalResponseToSim(int32_t serial,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001586 const hidl_string& commandResponse) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001587#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001588 RLOGD("sendTerminalResponseToSim: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001589#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001590 dispatchString(serial, mSlotId, RIL_REQUEST_STK_SEND_TERMINAL_RESPONSE,
Scott Randolphc7213312017-04-03 14:06:40 -07001591 commandResponse.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001592 return Void();
1593}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001594
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001595Return<void> RadioImpl::handleStkCallSetupRequestFromSim(int32_t serial, bool accept) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001596#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001597 RLOGD("handleStkCallSetupRequestFromSim: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001598#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001599 dispatchInts(serial, mSlotId, RIL_REQUEST_STK_HANDLE_CALL_SETUP_REQUESTED_FROM_SIM,
1600 1, BOOL_TO_INT(accept));
1601 return Void();
1602}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001603
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001604Return<void> RadioImpl::explicitCallTransfer(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001605#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001606 RLOGD("explicitCallTransfer: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001607#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001608 dispatchVoid(serial, mSlotId, RIL_REQUEST_EXPLICIT_CALL_TRANSFER);
1609 return Void();
1610}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001611
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001612Return<void> RadioImpl::setPreferredNetworkType(int32_t serial, PreferredNetworkType nwType) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001613#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001614 RLOGD("setPreferredNetworkType: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001615#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001616 dispatchInts(serial, mSlotId, RIL_REQUEST_SET_PREFERRED_NETWORK_TYPE, 1, nwType);
1617 return Void();
1618}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001619
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001620Return<void> RadioImpl::getPreferredNetworkType(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001621#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001622 RLOGD("getPreferredNetworkType: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001623#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001624 dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_PREFERRED_NETWORK_TYPE);
1625 return Void();
1626}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001627
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001628Return<void> RadioImpl::getNeighboringCids(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001629#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001630 RLOGD("getNeighboringCids: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001631#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001632 dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_NEIGHBORING_CELL_IDS);
1633 return Void();
1634}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001635
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001636Return<void> RadioImpl::setLocationUpdates(int32_t serial, bool enable) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001637#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001638 RLOGD("setLocationUpdates: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001639#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001640 dispatchInts(serial, mSlotId, RIL_REQUEST_SET_LOCATION_UPDATES, 1, BOOL_TO_INT(enable));
1641 return Void();
1642}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001643
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001644Return<void> RadioImpl::setCdmaSubscriptionSource(int32_t serial, CdmaSubscriptionSource cdmaSub) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001645#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001646 RLOGD("setCdmaSubscriptionSource: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001647#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001648 dispatchInts(serial, mSlotId, RIL_REQUEST_CDMA_SET_SUBSCRIPTION_SOURCE, 1, cdmaSub);
1649 return Void();
1650}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001651
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001652Return<void> RadioImpl::setCdmaRoamingPreference(int32_t serial, CdmaRoamingType type) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001653#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001654 RLOGD("setCdmaRoamingPreference: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001655#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001656 dispatchInts(serial, mSlotId, RIL_REQUEST_CDMA_SET_ROAMING_PREFERENCE, 1, type);
1657 return Void();
1658}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001659
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001660Return<void> RadioImpl::getCdmaRoamingPreference(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001661#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001662 RLOGD("getCdmaRoamingPreference: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001663#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001664 dispatchVoid(serial, mSlotId, RIL_REQUEST_CDMA_QUERY_ROAMING_PREFERENCE);
1665 return Void();
1666}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001667
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001668Return<void> RadioImpl::setTTYMode(int32_t serial, TtyMode mode) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001669#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001670 RLOGD("setTTYMode: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001671#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001672 dispatchInts(serial, mSlotId, RIL_REQUEST_SET_TTY_MODE, 1, mode);
1673 return Void();
1674}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001675
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001676Return<void> RadioImpl::getTTYMode(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001677#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001678 RLOGD("getTTYMode: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001679#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001680 dispatchVoid(serial, mSlotId, RIL_REQUEST_QUERY_TTY_MODE);
1681 return Void();
1682}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001683
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001684Return<void> RadioImpl::setPreferredVoicePrivacy(int32_t serial, bool enable) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001685#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001686 RLOGD("setPreferredVoicePrivacy: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001687#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001688 dispatchInts(serial, mSlotId, RIL_REQUEST_CDMA_SET_PREFERRED_VOICE_PRIVACY_MODE,
1689 1, BOOL_TO_INT(enable));
1690 return Void();
1691}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001692
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001693Return<void> RadioImpl::getPreferredVoicePrivacy(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001694#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001695 RLOGD("getPreferredVoicePrivacy: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001696#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001697 dispatchVoid(serial, mSlotId, RIL_REQUEST_CDMA_QUERY_PREFERRED_VOICE_PRIVACY_MODE);
1698 return Void();
1699}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001700
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001701Return<void> RadioImpl::sendCDMAFeatureCode(int32_t serial, const hidl_string& featureCode) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001702#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001703 RLOGD("sendCDMAFeatureCode: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001704#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001705 dispatchString(serial, mSlotId, RIL_REQUEST_CDMA_FLASH,
Scott Randolphc7213312017-04-03 14:06:40 -07001706 featureCode.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001707 return Void();
1708}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001709
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001710Return<void> RadioImpl::sendBurstDtmf(int32_t serial, const hidl_string& dtmf, int32_t on,
1711 int32_t off) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001712#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001713 RLOGD("sendBurstDtmf: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001714#endif
Ruthwar Kumar Ambeer7c373812017-03-23 17:38:56 +05301715 dispatchStrings(serial, mSlotId, RIL_REQUEST_CDMA_BURST_DTMF, false,
Scott Randolphc7213312017-04-03 14:06:40 -07001716 3, dtmf.c_str(), (std::to_string(on)).c_str(),
1717 (std::to_string(off)).c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001718 return Void();
1719}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001720
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001721void constructCdmaSms(RIL_CDMA_SMS_Message &rcsm, const CdmaSmsMessage& sms) {
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001722 rcsm.uTeleserviceID = sms.teleserviceId;
1723 rcsm.bIsServicePresent = BOOL_TO_INT(sms.isServicePresent);
1724 rcsm.uServicecategory = sms.serviceCategory;
1725 rcsm.sAddress.digit_mode = (RIL_CDMA_SMS_DigitMode) sms.address.digitMode;
1726 rcsm.sAddress.number_mode = (RIL_CDMA_SMS_NumberMode) sms.address.numberMode;
1727 rcsm.sAddress.number_type = (RIL_CDMA_SMS_NumberType) sms.address.numberType;
1728 rcsm.sAddress.number_plan = (RIL_CDMA_SMS_NumberPlan) sms.address.numberPlan;
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001729
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001730 rcsm.sAddress.number_of_digits = sms.address.digits.size();
1731 int digitLimit= MIN((rcsm.sAddress.number_of_digits), RIL_CDMA_SMS_ADDRESS_MAX);
1732 for (int i = 0; i < digitLimit; i++) {
1733 rcsm.sAddress.digits[i] = sms.address.digits[i];
1734 }
1735
1736 rcsm.sSubAddress.subaddressType = (RIL_CDMA_SMS_SubaddressType) sms.subAddress.subaddressType;
1737 rcsm.sSubAddress.odd = BOOL_TO_INT(sms.subAddress.odd);
1738
1739 rcsm.sSubAddress.number_of_digits = sms.subAddress.digits.size();
1740 digitLimit= MIN((rcsm.sSubAddress.number_of_digits), RIL_CDMA_SMS_SUBADDRESS_MAX);
1741 for (int i = 0; i < digitLimit; i++) {
1742 rcsm.sSubAddress.digits[i] = sms.subAddress.digits[i];
1743 }
1744
1745 rcsm.uBearerDataLen = sms.bearerData.size();
1746 digitLimit= MIN((rcsm.uBearerDataLen), RIL_CDMA_SMS_BEARER_DATA_MAX);
1747 for (int i = 0; i < digitLimit; i++) {
1748 rcsm.aBearerData[i] = sms.bearerData[i];
1749 }
1750}
1751
1752Return<void> RadioImpl::sendCdmaSms(int32_t serial, const CdmaSmsMessage& sms) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001753#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001754 RLOGD("sendCdmaSms: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001755#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001756 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_CDMA_SEND_SMS);
1757 if (pRI == NULL) {
1758 return Void();
1759 }
1760
Jack Yu8e732d42017-04-14 00:08:06 -07001761 RIL_CDMA_SMS_Message rcsm = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001762 constructCdmaSms(rcsm, sms);
1763
Amit Mahajanb3a11bb2017-05-15 16:41:44 -07001764 CALL_ONREQUEST(pRI->pCI->requestNumber, &rcsm, sizeof(rcsm), pRI, mSlotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001765 return Void();
1766}
1767
1768Return<void> RadioImpl::acknowledgeLastIncomingCdmaSms(int32_t serial, const CdmaSmsAck& smsAck) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001769#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001770 RLOGD("acknowledgeLastIncomingCdmaSms: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001771#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001772 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_CDMA_SMS_ACKNOWLEDGE);
1773 if (pRI == NULL) {
1774 return Void();
1775 }
1776
Jack Yuf68e0da2017-02-07 14:53:09 -08001777 RIL_CDMA_SMS_Ack rcsa = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001778
1779 rcsa.uErrorClass = (RIL_CDMA_SMS_ErrorClass) smsAck.errorClass;
1780 rcsa.uSMSCauseCode = smsAck.smsCauseCode;
1781
Amit Mahajanb3a11bb2017-05-15 16:41:44 -07001782 CALL_ONREQUEST(pRI->pCI->requestNumber, &rcsa, sizeof(rcsa), pRI, mSlotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001783 return Void();
1784}
1785
1786Return<void> RadioImpl::getGsmBroadcastConfig(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001787#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001788 RLOGD("getGsmBroadcastConfig: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001789#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001790 dispatchVoid(serial, mSlotId, RIL_REQUEST_GSM_GET_BROADCAST_SMS_CONFIG);
1791 return Void();
1792}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001793
1794Return<void> RadioImpl::setGsmBroadcastConfig(int32_t serial,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001795 const hidl_vec<GsmBroadcastSmsConfigInfo>&
1796 configInfo) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001797#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001798 RLOGD("setGsmBroadcastConfig: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001799#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001800 RequestInfo *pRI = android::addRequestToList(serial, mSlotId,
1801 RIL_REQUEST_GSM_SET_BROADCAST_SMS_CONFIG);
1802 if (pRI == NULL) {
1803 return Void();
1804 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001805
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001806 int num = configInfo.size();
1807 RIL_GSM_BroadcastSmsConfigInfo gsmBci[num];
1808 RIL_GSM_BroadcastSmsConfigInfo *gsmBciPtrs[num];
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001809
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001810 for (int i = 0 ; i < num ; i++ ) {
1811 gsmBciPtrs[i] = &gsmBci[i];
1812 gsmBci[i].fromServiceId = configInfo[i].fromServiceId;
1813 gsmBci[i].toServiceId = configInfo[i].toServiceId;
1814 gsmBci[i].fromCodeScheme = configInfo[i].fromCodeScheme;
1815 gsmBci[i].toCodeScheme = configInfo[i].toCodeScheme;
1816 gsmBci[i].selected = BOOL_TO_INT(configInfo[i].selected);
1817 }
1818
Amit Mahajanb3a11bb2017-05-15 16:41:44 -07001819 CALL_ONREQUEST(pRI->pCI->requestNumber, gsmBciPtrs,
1820 num * sizeof(RIL_GSM_BroadcastSmsConfigInfo *), pRI, mSlotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001821 return Void();
1822}
1823
1824Return<void> RadioImpl::setGsmBroadcastActivation(int32_t serial, bool activate) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001825#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001826 RLOGD("setGsmBroadcastActivation: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001827#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001828 dispatchInts(serial, mSlotId, RIL_REQUEST_GSM_SMS_BROADCAST_ACTIVATION,
Sanket Padawe0de29d12017-02-10 13:19:47 -08001829 1, BOOL_TO_INT(!activate));
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001830 return Void();
1831}
1832
1833Return<void> RadioImpl::getCdmaBroadcastConfig(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001834#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001835 RLOGD("getCdmaBroadcastConfig: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001836#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001837 dispatchVoid(serial, mSlotId, RIL_REQUEST_CDMA_GET_BROADCAST_SMS_CONFIG);
1838 return Void();
1839}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001840
1841Return<void> RadioImpl::setCdmaBroadcastConfig(int32_t serial,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001842 const hidl_vec<CdmaBroadcastSmsConfigInfo>&
1843 configInfo) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001844#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001845 RLOGD("setCdmaBroadcastConfig: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001846#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001847 RequestInfo *pRI = android::addRequestToList(serial, mSlotId,
1848 RIL_REQUEST_CDMA_SET_BROADCAST_SMS_CONFIG);
1849 if (pRI == NULL) {
1850 return Void();
1851 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001852
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001853 int num = configInfo.size();
1854 RIL_CDMA_BroadcastSmsConfigInfo cdmaBci[num];
1855 RIL_CDMA_BroadcastSmsConfigInfo *cdmaBciPtrs[num];
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001856
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001857 for (int i = 0 ; i < num ; i++ ) {
1858 cdmaBciPtrs[i] = &cdmaBci[i];
1859 cdmaBci[i].service_category = configInfo[i].serviceCategory;
1860 cdmaBci[i].language = configInfo[i].language;
1861 cdmaBci[i].selected = BOOL_TO_INT(configInfo[i].selected);
1862 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001863
Amit Mahajanb3a11bb2017-05-15 16:41:44 -07001864 CALL_ONREQUEST(pRI->pCI->requestNumber, cdmaBciPtrs,
1865 num * sizeof(RIL_CDMA_BroadcastSmsConfigInfo *), pRI, mSlotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001866 return Void();
1867}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001868
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001869Return<void> RadioImpl::setCdmaBroadcastActivation(int32_t serial, bool activate) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001870#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001871 RLOGD("setCdmaBroadcastActivation: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001872#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001873 dispatchInts(serial, mSlotId, RIL_REQUEST_CDMA_SMS_BROADCAST_ACTIVATION,
Sanket Padawe0de29d12017-02-10 13:19:47 -08001874 1, BOOL_TO_INT(!activate));
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001875 return Void();
1876}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001877
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001878Return<void> RadioImpl::getCDMASubscription(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001879#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001880 RLOGD("getCDMASubscription: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001881#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001882 dispatchVoid(serial, mSlotId, RIL_REQUEST_CDMA_SUBSCRIPTION);
1883 return Void();
1884}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001885
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001886Return<void> RadioImpl::writeSmsToRuim(int32_t serial, const CdmaSmsWriteArgs& cdmaSms) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001887#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001888 RLOGD("writeSmsToRuim: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001889#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001890 RequestInfo *pRI = android::addRequestToList(serial, mSlotId,
1891 RIL_REQUEST_CDMA_WRITE_SMS_TO_RUIM);
1892 if (pRI == NULL) {
1893 return Void();
1894 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001895
Jack Yuf68e0da2017-02-07 14:53:09 -08001896 RIL_CDMA_SMS_WriteArgs rcsw = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001897 rcsw.status = (int) cdmaSms.status;
1898 constructCdmaSms(rcsw.message, cdmaSms.message);
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001899
Amit Mahajanb3a11bb2017-05-15 16:41:44 -07001900 CALL_ONREQUEST(pRI->pCI->requestNumber, &rcsw, sizeof(rcsw), pRI, mSlotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001901 return Void();
1902}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001903
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001904Return<void> RadioImpl::deleteSmsOnRuim(int32_t serial, int32_t index) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001905#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001906 RLOGD("deleteSmsOnRuim: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001907#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001908 dispatchInts(serial, mSlotId, RIL_REQUEST_CDMA_DELETE_SMS_ON_RUIM, 1, index);
1909 return Void();
1910}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001911
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001912Return<void> RadioImpl::getDeviceIdentity(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001913#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001914 RLOGD("getDeviceIdentity: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001915#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001916 dispatchVoid(serial, mSlotId, RIL_REQUEST_DEVICE_IDENTITY);
1917 return Void();
1918}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001919
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001920Return<void> RadioImpl::exitEmergencyCallbackMode(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001921#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001922 RLOGD("exitEmergencyCallbackMode: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001923#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001924 dispatchVoid(serial, mSlotId, RIL_REQUEST_EXIT_EMERGENCY_CALLBACK_MODE);
1925 return Void();
1926}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001927
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001928Return<void> RadioImpl::getSmscAddress(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001929#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001930 RLOGD("getSmscAddress: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001931#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001932 dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_SMSC_ADDRESS);
1933 return Void();
1934}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001935
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001936Return<void> RadioImpl::setSmscAddress(int32_t serial, const hidl_string& smsc) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001937#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001938 RLOGD("setSmscAddress: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001939#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001940 dispatchString(serial, mSlotId, RIL_REQUEST_SET_SMSC_ADDRESS,
Scott Randolphc7213312017-04-03 14:06:40 -07001941 smsc.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001942 return Void();
1943}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001944
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001945Return<void> RadioImpl::reportSmsMemoryStatus(int32_t serial, bool available) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001946#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001947 RLOGD("reportSmsMemoryStatus: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001948#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001949 dispatchInts(serial, mSlotId, RIL_REQUEST_REPORT_SMS_MEMORY_STATUS, 1,
1950 BOOL_TO_INT(available));
1951 return Void();
1952}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001953
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001954Return<void> RadioImpl::reportStkServiceIsRunning(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001955#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001956 RLOGD("reportStkServiceIsRunning: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001957#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001958 dispatchVoid(serial, mSlotId, RIL_REQUEST_REPORT_STK_SERVICE_IS_RUNNING);
1959 return Void();
1960}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001961
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001962Return<void> RadioImpl::getCdmaSubscriptionSource(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001963#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001964 RLOGD("getCdmaSubscriptionSource: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001965#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001966 dispatchVoid(serial, mSlotId, RIL_REQUEST_CDMA_GET_SUBSCRIPTION_SOURCE);
1967 return Void();
1968}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001969
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001970Return<void> RadioImpl::requestIsimAuthentication(int32_t serial, const hidl_string& challenge) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001971#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001972 RLOGD("requestIsimAuthentication: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001973#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001974 dispatchString(serial, mSlotId, RIL_REQUEST_ISIM_AUTHENTICATION,
Scott Randolphc7213312017-04-03 14:06:40 -07001975 challenge.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001976 return Void();
1977}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001978
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001979Return<void> RadioImpl::acknowledgeIncomingGsmSmsWithPdu(int32_t serial, bool success,
1980 const hidl_string& ackPdu) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001981#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001982 RLOGD("acknowledgeIncomingGsmSmsWithPdu: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001983#endif
Ruthwar Kumar Ambeer7c373812017-03-23 17:38:56 +05301984 dispatchStrings(serial, mSlotId, RIL_REQUEST_ACKNOWLEDGE_INCOMING_GSM_SMS_WITH_PDU, false,
Scott Randolphc7213312017-04-03 14:06:40 -07001985 2, success ? "1" : "0", ackPdu.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001986 return Void();
1987}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001988
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001989Return<void> RadioImpl::sendEnvelopeWithStatus(int32_t serial, const hidl_string& contents) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001990#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001991 RLOGD("sendEnvelopeWithStatus: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001992#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001993 dispatchString(serial, mSlotId, RIL_REQUEST_STK_SEND_ENVELOPE_WITH_STATUS,
Scott Randolphc7213312017-04-03 14:06:40 -07001994 contents.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001995 return Void();
1996}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001997
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001998Return<void> RadioImpl::getVoiceRadioTechnology(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001999#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002000 RLOGD("getVoiceRadioTechnology: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002001#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002002 dispatchVoid(serial, mSlotId, RIL_REQUEST_VOICE_RADIO_TECH);
2003 return Void();
2004}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002005
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002006Return<void> RadioImpl::getCellInfoList(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002007#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002008 RLOGD("getCellInfoList: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002009#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002010 dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_CELL_INFO_LIST);
2011 return Void();
2012}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002013
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002014Return<void> RadioImpl::setCellInfoListRate(int32_t serial, int32_t rate) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002015#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002016 RLOGD("setCellInfoListRate: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002017#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002018 dispatchInts(serial, mSlotId, RIL_REQUEST_SET_UNSOL_CELL_INFO_LIST_RATE, 1, rate);
2019 return Void();
2020}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002021
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002022Return<void> RadioImpl::setInitialAttachApn(int32_t serial, const DataProfileInfo& dataProfileInfo,
Jack Yuffc06452017-02-13 11:21:00 -08002023 bool modemCognitive, bool isRoaming) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002024#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002025 RLOGD("setInitialAttachApn: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002026#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002027 RequestInfo *pRI = android::addRequestToList(serial, mSlotId,
2028 RIL_REQUEST_SET_INITIAL_ATTACH_APN);
2029 if (pRI == NULL) {
2030 return Void();
2031 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002032
Jack Yuffc06452017-02-13 11:21:00 -08002033 if (s_vendorFunctions->version <= 14) {
2034 RIL_InitialAttachApn iaa = {};
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002035
Ruthwar Kumar Ambeer7c373812017-03-23 17:38:56 +05302036 if (!copyHidlStringToRil(&iaa.apn, dataProfileInfo.apn, pRI, true)) {
2037 return Void();
Jack Yuffc06452017-02-13 11:21:00 -08002038 }
2039
2040 const hidl_string &protocol =
2041 (isRoaming ? dataProfileInfo.roamingProtocol : dataProfileInfo.protocol);
2042
2043 if (!copyHidlStringToRil(&iaa.protocol, protocol, pRI)) {
Jack Yu8e732d42017-04-14 00:08:06 -07002044 memsetAndFreeStrings(1, iaa.apn);
Jack Yuffc06452017-02-13 11:21:00 -08002045 return Void();
2046 }
2047 iaa.authtype = (int) dataProfileInfo.authType;
2048 if (!copyHidlStringToRil(&iaa.username, dataProfileInfo.user, pRI)) {
Jack Yu8e732d42017-04-14 00:08:06 -07002049 memsetAndFreeStrings(2, iaa.apn, iaa.protocol);
Jack Yuffc06452017-02-13 11:21:00 -08002050 return Void();
2051 }
2052 if (!copyHidlStringToRil(&iaa.password, dataProfileInfo.password, pRI)) {
Jack Yu8e732d42017-04-14 00:08:06 -07002053 memsetAndFreeStrings(3, iaa.apn, iaa.protocol, iaa.username);
Jack Yuffc06452017-02-13 11:21:00 -08002054 return Void();
2055 }
2056
Amit Mahajanb3a11bb2017-05-15 16:41:44 -07002057 CALL_ONREQUEST(RIL_REQUEST_SET_INITIAL_ATTACH_APN, &iaa, sizeof(iaa), pRI, mSlotId);
Jack Yuffc06452017-02-13 11:21:00 -08002058
2059 memsetAndFreeStrings(4, iaa.apn, iaa.protocol, iaa.username, iaa.password);
2060 } else {
2061 RIL_InitialAttachApn_v15 iaa = {};
2062
Ruthwar Kumar Ambeer7c373812017-03-23 17:38:56 +05302063 if (!copyHidlStringToRil(&iaa.apn, dataProfileInfo.apn, pRI, true)) {
2064 return Void();
Jack Yuffc06452017-02-13 11:21:00 -08002065 }
Sanket Padawe46e9ee32017-06-20 12:40:19 -07002066
Jack Yuffc06452017-02-13 11:21:00 -08002067 if (!copyHidlStringToRil(&iaa.protocol, dataProfileInfo.protocol, pRI)) {
Jack Yu8e732d42017-04-14 00:08:06 -07002068 memsetAndFreeStrings(1, iaa.apn);
Jack Yuffc06452017-02-13 11:21:00 -08002069 return Void();
2070 }
2071 if (!copyHidlStringToRil(&iaa.roamingProtocol, dataProfileInfo.roamingProtocol, pRI)) {
Jack Yu8e732d42017-04-14 00:08:06 -07002072 memsetAndFreeStrings(2, iaa.apn, iaa.protocol);
Jack Yuffc06452017-02-13 11:21:00 -08002073 return Void();
2074 }
2075 iaa.authtype = (int) dataProfileInfo.authType;
2076 if (!copyHidlStringToRil(&iaa.username, dataProfileInfo.user, pRI)) {
Jack Yu8e732d42017-04-14 00:08:06 -07002077 memsetAndFreeStrings(3, iaa.apn, iaa.protocol, iaa.roamingProtocol);
Jack Yuffc06452017-02-13 11:21:00 -08002078 return Void();
2079 }
2080 if (!copyHidlStringToRil(&iaa.password, dataProfileInfo.password, pRI)) {
Jack Yu8e732d42017-04-14 00:08:06 -07002081 memsetAndFreeStrings(4, iaa.apn, iaa.protocol, iaa.roamingProtocol, iaa.username);
Jack Yuffc06452017-02-13 11:21:00 -08002082 return Void();
2083 }
2084 iaa.supportedTypesBitmask = dataProfileInfo.supportedApnTypesBitmap;
2085 iaa.bearerBitmask = dataProfileInfo.bearerBitmap;
2086 iaa.modemCognitive = BOOL_TO_INT(modemCognitive);
2087 iaa.mtu = dataProfileInfo.mtu;
2088
Jack Yuc13645e2017-04-13 20:55:03 -07002089 if (!convertMvnoTypeToString(dataProfileInfo.mvnoType, iaa.mvnoType)) {
Jack Yuffc06452017-02-13 11:21:00 -08002090 sendErrorResponse(pRI, RIL_E_INVALID_ARGUMENTS);
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
2096 if (!copyHidlStringToRil(&iaa.mvnoMatchData, dataProfileInfo.mvnoMatchData, pRI)) {
Jack Yu8e732d42017-04-14 00:08:06 -07002097 memsetAndFreeStrings(5, iaa.apn, iaa.protocol, iaa.roamingProtocol, iaa.username,
2098 iaa.password);
Jack Yuffc06452017-02-13 11:21:00 -08002099 return Void();
2100 }
2101
Amit Mahajanb3a11bb2017-05-15 16:41:44 -07002102 CALL_ONREQUEST(RIL_REQUEST_SET_INITIAL_ATTACH_APN, &iaa, sizeof(iaa), pRI, mSlotId);
Jack Yuffc06452017-02-13 11:21:00 -08002103
2104 memsetAndFreeStrings(6, iaa.apn, iaa.protocol, iaa.roamingProtocol, iaa.username,
2105 iaa.password, iaa.mvnoMatchData);
2106 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002107
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002108 return Void();
2109}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002110
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002111Return<void> RadioImpl::getImsRegistrationState(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002112#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002113 RLOGD("getImsRegistrationState: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002114#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002115 dispatchVoid(serial, mSlotId, RIL_REQUEST_IMS_REGISTRATION_STATE);
2116 return Void();
2117}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002118
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002119bool dispatchImsGsmSms(const ImsSmsMessage& message, RequestInfo *pRI) {
Jack Yuf68e0da2017-02-07 14:53:09 -08002120 RIL_IMS_SMS_Message rism = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002121 char **pStrings;
2122 int countStrings = 2;
2123 int dataLen = sizeof(char *) * countStrings;
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002124
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002125 rism.tech = RADIO_TECH_3GPP;
2126 rism.retry = BOOL_TO_INT(message.retry);
2127 rism.messageRef = message.messageRef;
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002128
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002129 if (message.gsmMessage.size() != 1) {
2130 RLOGE("dispatchImsGsmSms: Invalid len %s", requestToString(pRI->pCI->requestNumber));
Jack Yuffc06452017-02-13 11:21:00 -08002131 sendErrorResponse(pRI, RIL_E_INVALID_ARGUMENTS);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002132 return false;
2133 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002134
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002135 pStrings = (char **)calloc(countStrings, sizeof(char *));
2136 if (pStrings == NULL) {
2137 RLOGE("dispatchImsGsmSms: Memory allocation failed for request %s",
2138 requestToString(pRI->pCI->requestNumber));
Jack Yuffc06452017-02-13 11:21:00 -08002139 sendErrorResponse(pRI, RIL_E_NO_MEMORY);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002140 return false;
2141 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002142
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002143 if (!copyHidlStringToRil(&pStrings[0], message.gsmMessage[0].smscPdu, pRI)) {
2144#ifdef MEMSET_FREED
Jack Yub4295a42017-04-14 12:51:49 -07002145 memset(pStrings, 0, dataLen);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002146#endif
2147 free(pStrings);
2148 return false;
2149 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002150
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002151 if (!copyHidlStringToRil(&pStrings[1], message.gsmMessage[0].pdu, pRI)) {
2152 memsetAndFreeStrings(1, pStrings[0]);
2153#ifdef MEMSET_FREED
Jack Yub4295a42017-04-14 12:51:49 -07002154 memset(pStrings, 0, dataLen);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002155#endif
2156 free(pStrings);
2157 return false;
2158 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002159
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002160 rism.message.gsmMessage = pStrings;
Amit Mahajanb3a11bb2017-05-15 16:41:44 -07002161 CALL_ONREQUEST(pRI->pCI->requestNumber, &rism, sizeof(RIL_RadioTechnologyFamily) +
2162 sizeof(uint8_t) + sizeof(int32_t) + dataLen, pRI, pRI->socket_id);
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002163
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002164 for (int i = 0 ; i < countStrings ; i++) {
2165 memsetAndFreeStrings(1, pStrings[i]);
2166 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002167
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002168#ifdef MEMSET_FREED
Jack Yub4295a42017-04-14 12:51:49 -07002169 memset(pStrings, 0, dataLen);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002170#endif
2171 free(pStrings);
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002172
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002173 return true;
2174}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002175
Sanket Padawec4195802017-06-27 14:53:22 -07002176struct ImsCdmaSms {
2177 RIL_IMS_SMS_Message imsSms;
2178 RIL_CDMA_SMS_Message cdmaSms;
2179};
2180
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002181bool dispatchImsCdmaSms(const ImsSmsMessage& message, RequestInfo *pRI) {
Sanket Padawec4195802017-06-27 14:53:22 -07002182 ImsCdmaSms temp = {};
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002183
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002184 if (message.cdmaMessage.size() != 1) {
2185 RLOGE("dispatchImsCdmaSms: Invalid len %s", requestToString(pRI->pCI->requestNumber));
Jack Yuffc06452017-02-13 11:21:00 -08002186 sendErrorResponse(pRI, RIL_E_INVALID_ARGUMENTS);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002187 return false;
2188 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002189
Sanket Padawec4195802017-06-27 14:53:22 -07002190 temp.imsSms.tech = RADIO_TECH_3GPP2;
2191 temp.imsSms.retry = BOOL_TO_INT(message.retry);
2192 temp.imsSms.messageRef = message.messageRef;
2193 temp.imsSms.message.cdmaMessage = &temp.cdmaSms;
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002194
Sanket Padawec4195802017-06-27 14:53:22 -07002195 constructCdmaSms(temp.cdmaSms, message.cdmaMessage[0]);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002196
Sanket Padawec4195802017-06-27 14:53:22 -07002197 // Vendor code expects payload length to include actual msg payload
2198 // (sizeof(RIL_CDMA_SMS_Message)) instead of (RIL_CDMA_SMS_Message *) + size of other fields in
2199 // RIL_IMS_SMS_Message
2200 int payloadLen = sizeof(RIL_RadioTechnologyFamily) + sizeof(uint8_t) + sizeof(int32_t)
2201 + sizeof(RIL_CDMA_SMS_Message);
2202
2203 CALL_ONREQUEST(pRI->pCI->requestNumber, &temp.imsSms, payloadLen, pRI, pRI->socket_id);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002204
2205 return true;
2206}
2207
2208Return<void> RadioImpl::sendImsSms(int32_t serial, const ImsSmsMessage& message) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002209#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002210 RLOGD("sendImsSms: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002211#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002212 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_IMS_SEND_SMS);
2213 if (pRI == NULL) {
2214 return Void();
2215 }
2216
2217 RIL_RadioTechnologyFamily format = (RIL_RadioTechnologyFamily) message.tech;
2218
2219 if (RADIO_TECH_3GPP == format) {
2220 dispatchImsGsmSms(message, pRI);
2221 } else if (RADIO_TECH_3GPP2 == format) {
2222 dispatchImsCdmaSms(message, pRI);
2223 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08002224 RLOGE("sendImsSms: Invalid radio tech %s",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002225 requestToString(pRI->pCI->requestNumber));
Jack Yuffc06452017-02-13 11:21:00 -08002226 sendErrorResponse(pRI, RIL_E_INVALID_ARGUMENTS);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002227 }
2228 return Void();
2229}
2230
2231Return<void> RadioImpl::iccTransmitApduBasicChannel(int32_t serial, const SimApdu& message) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002232#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002233 RLOGD("iccTransmitApduBasicChannel: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002234#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002235 dispatchIccApdu(serial, mSlotId, RIL_REQUEST_SIM_TRANSMIT_APDU_BASIC, message);
2236 return Void();
2237}
2238
Wileen Chiu410b7562015-11-23 14:25:22 -08002239Return<void> RadioImpl::iccOpenLogicalChannel(int32_t serial, const hidl_string& aid, int32_t p2) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002240#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002241 RLOGD("iccOpenLogicalChannel: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002242#endif
Wileen Chiu410b7562015-11-23 14:25:22 -08002243 if (s_vendorFunctions->version < 15) {
2244 dispatchString(serial, mSlotId, RIL_REQUEST_SIM_OPEN_CHANNEL, aid.c_str());
2245 } else {
2246 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_SIM_OPEN_CHANNEL);
2247 if (pRI == NULL) {
2248 return Void();
2249 }
2250
Jack Yu8e732d42017-04-14 00:08:06 -07002251 RIL_OpenChannelParams params = {};
Wileen Chiu410b7562015-11-23 14:25:22 -08002252
2253 params.p2 = p2;
2254
2255 if (!copyHidlStringToRil(&params.aidPtr, aid, pRI)) {
2256 return Void();
2257 }
2258
Amit Mahajanb3a11bb2017-05-15 16:41:44 -07002259 CALL_ONREQUEST(pRI->pCI->requestNumber, &params, sizeof(params), pRI, mSlotId);
Wileen Chiu410b7562015-11-23 14:25:22 -08002260
2261 memsetAndFreeStrings(1, params.aidPtr);
2262 }
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002263 return Void();
2264}
2265
2266Return<void> RadioImpl::iccCloseLogicalChannel(int32_t serial, int32_t channelId) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002267#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002268 RLOGD("iccCloseLogicalChannel: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002269#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002270 dispatchInts(serial, mSlotId, RIL_REQUEST_SIM_CLOSE_CHANNEL, 1, channelId);
2271 return Void();
2272}
2273
2274Return<void> RadioImpl::iccTransmitApduLogicalChannel(int32_t serial, const SimApdu& message) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002275#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002276 RLOGD("iccTransmitApduLogicalChannel: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002277#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002278 dispatchIccApdu(serial, mSlotId, RIL_REQUEST_SIM_TRANSMIT_APDU_CHANNEL, message);
2279 return Void();
2280}
2281
2282Return<void> RadioImpl::nvReadItem(int32_t serial, NvItem itemId) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002283#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002284 RLOGD("nvReadItem: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002285#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002286 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_NV_READ_ITEM);
2287 if (pRI == NULL) {
2288 return Void();
2289 }
2290
Jack Yu8e732d42017-04-14 00:08:06 -07002291 RIL_NV_ReadItem nvri = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002292 nvri.itemID = (RIL_NV_Item) itemId;
2293
Amit Mahajanb3a11bb2017-05-15 16:41:44 -07002294 CALL_ONREQUEST(pRI->pCI->requestNumber, &nvri, sizeof(nvri), pRI, mSlotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002295 return Void();
2296}
2297
2298Return<void> RadioImpl::nvWriteItem(int32_t serial, const NvWriteItem& item) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002299#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002300 RLOGD("nvWriteItem: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002301#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002302 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_NV_WRITE_ITEM);
2303 if (pRI == NULL) {
2304 return Void();
2305 }
2306
Jack Yu8e732d42017-04-14 00:08:06 -07002307 RIL_NV_WriteItem nvwi = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002308
2309 nvwi.itemID = (RIL_NV_Item) item.itemId;
2310
2311 if (!copyHidlStringToRil(&nvwi.value, item.value, pRI)) {
2312 return Void();
2313 }
2314
Amit Mahajanb3a11bb2017-05-15 16:41:44 -07002315 CALL_ONREQUEST(pRI->pCI->requestNumber, &nvwi, sizeof(nvwi), pRI, mSlotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002316
2317 memsetAndFreeStrings(1, nvwi.value);
2318 return Void();
2319}
2320
2321Return<void> RadioImpl::nvWriteCdmaPrl(int32_t serial, const hidl_vec<uint8_t>& prl) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002322#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002323 RLOGD("nvWriteCdmaPrl: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002324#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002325 dispatchRaw(serial, mSlotId, RIL_REQUEST_NV_WRITE_CDMA_PRL, prl);
2326 return Void();
2327}
2328
2329Return<void> RadioImpl::nvResetConfig(int32_t serial, ResetNvType resetType) {
Jayachandran C32763f02017-04-30 10:21:14 -07002330 int rilResetType = -1;
Jayachandran C572f2f42017-03-25 14:30:13 -07002331#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002332 RLOGD("nvResetConfig: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002333#endif
Jayachandran C32763f02017-04-30 10:21:14 -07002334 /* Convert ResetNvType to RIL.h values
2335 * RIL_REQUEST_NV_RESET_CONFIG
2336 * 1 - reload all NV items
2337 * 2 - erase NV reset (SCRTN)
2338 * 3 - factory reset (RTN)
2339 */
2340 switch(resetType) {
2341 case ResetNvType::RELOAD:
2342 rilResetType = 1;
2343 break;
2344 case ResetNvType::ERASE:
2345 rilResetType = 2;
2346 break;
2347 case ResetNvType::FACTORY_RESET:
2348 rilResetType = 3;
2349 break;
2350 }
2351 dispatchInts(serial, mSlotId, RIL_REQUEST_NV_RESET_CONFIG, 1, rilResetType);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002352 return Void();
2353}
2354
2355Return<void> RadioImpl::setUiccSubscription(int32_t serial, const SelectUiccSub& uiccSub) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002356#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002357 RLOGD("setUiccSubscription: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002358#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002359 RequestInfo *pRI = android::addRequestToList(serial, mSlotId,
2360 RIL_REQUEST_SET_UICC_SUBSCRIPTION);
2361 if (pRI == NULL) {
2362 return Void();
2363 }
2364
Jack Yuf68e0da2017-02-07 14:53:09 -08002365 RIL_SelectUiccSub rilUiccSub = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002366
2367 rilUiccSub.slot = uiccSub.slot;
2368 rilUiccSub.app_index = uiccSub.appIndex;
2369 rilUiccSub.sub_type = (RIL_SubscriptionType) uiccSub.subType;
2370 rilUiccSub.act_status = (RIL_UiccSubActStatus) uiccSub.actStatus;
2371
Amit Mahajanb3a11bb2017-05-15 16:41:44 -07002372 CALL_ONREQUEST(pRI->pCI->requestNumber, &rilUiccSub, sizeof(rilUiccSub), pRI, mSlotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002373 return Void();
2374}
2375
2376Return<void> RadioImpl::setDataAllowed(int32_t serial, bool allow) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002377#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002378 RLOGD("setDataAllowed: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002379#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002380 dispatchInts(serial, mSlotId, RIL_REQUEST_ALLOW_DATA, 1, BOOL_TO_INT(allow));
2381 return Void();
2382}
2383
2384Return<void> RadioImpl::getHardwareConfig(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002385#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002386 RLOGD("getHardwareConfig: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002387#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002388 dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_HARDWARE_CONFIG);
2389 return Void();
2390}
2391
2392Return<void> RadioImpl::requestIccSimAuthentication(int32_t serial, int32_t authContext,
2393 const hidl_string& authData, const hidl_string& aid) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002394#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002395 RLOGD("requestIccSimAuthentication: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002396#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002397 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_SIM_AUTHENTICATION);
2398 if (pRI == NULL) {
2399 return Void();
2400 }
2401
Jack Yu8e732d42017-04-14 00:08:06 -07002402 RIL_SimAuthentication pf = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002403
2404 pf.authContext = authContext;
2405
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002406 if (!copyHidlStringToRil(&pf.authData, authData, pRI)) {
2407 return Void();
2408 }
2409
2410 if (!copyHidlStringToRil(&pf.aid, aid, pRI)) {
2411 memsetAndFreeStrings(1, pf.authData);
2412 return Void();
2413 }
2414
Amit Mahajanb3a11bb2017-05-15 16:41:44 -07002415 CALL_ONREQUEST(pRI->pCI->requestNumber, &pf, sizeof(pf), pRI, mSlotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002416
2417 memsetAndFreeStrings(2, pf.authData, pf.aid);
2418 return Void();
2419}
2420
2421/**
Jack Yuffc06452017-02-13 11:21:00 -08002422 * @param numProfiles number of data profile
2423 * @param dataProfiles the pointer to the actual data profiles. The acceptable type is
2424 RIL_DataProfileInfo or RIL_DataProfileInfo_v15.
2425 * @param dataProfilePtrs the pointer to the pointers that point to each data profile structure
2426 * @param numfields number of string-type member in the data profile structure
2427 * @param ... the variadic parameters are pointers to each string-type member
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002428 **/
Jack Yuffc06452017-02-13 11:21:00 -08002429template <typename T>
2430void freeSetDataProfileData(int numProfiles, T *dataProfiles, T **dataProfilePtrs,
2431 int numfields, ...) {
2432 va_list args;
2433 va_start(args, numfields);
2434
2435 // Iterate through each string-type field that need to be free.
2436 for (int i = 0; i < numfields; i++) {
2437 // Iterate through each data profile and free that specific string-type field.
2438 // The type 'char *T::*' is a type of pointer to a 'char *' member inside T structure.
2439 char *T::*ptr = va_arg(args, char *T::*);
2440 for (int j = 0; j < numProfiles; j++) {
2441 memsetAndFreeStrings(1, dataProfiles[j].*ptr);
2442 }
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002443 }
2444
Jack Yuffc06452017-02-13 11:21:00 -08002445 va_end(args);
2446
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002447#ifdef MEMSET_FREED
Jack Yuffc06452017-02-13 11:21:00 -08002448 memset(dataProfiles, 0, numProfiles * sizeof(T));
2449 memset(dataProfilePtrs, 0, numProfiles * sizeof(T *));
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002450#endif
2451 free(dataProfiles);
2452 free(dataProfilePtrs);
2453}
2454
Jack Yuffc06452017-02-13 11:21:00 -08002455Return<void> RadioImpl::setDataProfile(int32_t serial, const hidl_vec<DataProfileInfo>& profiles,
2456 bool isRoaming) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002457#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002458 RLOGD("setDataProfile: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002459#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002460 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_SET_DATA_PROFILE);
2461 if (pRI == NULL) {
2462 return Void();
2463 }
2464
Jack Yuffc06452017-02-13 11:21:00 -08002465 size_t num = profiles.size();
2466 bool success = false;
2467
2468 if (s_vendorFunctions->version <= 14) {
2469
2470 RIL_DataProfileInfo *dataProfiles =
2471 (RIL_DataProfileInfo *) calloc(num, sizeof(RIL_DataProfileInfo));
2472
2473 if (dataProfiles == NULL) {
2474 RLOGE("Memory allocation failed for request %s",
2475 requestToString(pRI->pCI->requestNumber));
2476 sendErrorResponse(pRI, RIL_E_NO_MEMORY);
2477 return Void();
2478 }
2479
2480 RIL_DataProfileInfo **dataProfilePtrs =
2481 (RIL_DataProfileInfo **) calloc(num, sizeof(RIL_DataProfileInfo *));
2482 if (dataProfilePtrs == NULL) {
2483 RLOGE("Memory allocation failed for request %s",
2484 requestToString(pRI->pCI->requestNumber));
2485 free(dataProfiles);
2486 sendErrorResponse(pRI, RIL_E_NO_MEMORY);
2487 return Void();
2488 }
2489
2490 for (size_t i = 0; i < num; i++) {
2491 dataProfilePtrs[i] = &dataProfiles[i];
2492
Ruthwar Kumar Ambeer7c373812017-03-23 17:38:56 +05302493 success = copyHidlStringToRil(&dataProfiles[i].apn, profiles[i].apn, pRI, true);
Jack Yuffc06452017-02-13 11:21:00 -08002494
2495 const hidl_string &protocol =
2496 (isRoaming ? profiles[i].roamingProtocol : profiles[i].protocol);
2497
Ruthwar Kumar Ambeer7c373812017-03-23 17:38:56 +05302498 if (success && !copyHidlStringToRil(&dataProfiles[i].protocol, protocol, pRI, true)) {
Jack Yuffc06452017-02-13 11:21:00 -08002499 success = false;
2500 }
2501
Ruthwar Kumar Ambeer7c373812017-03-23 17:38:56 +05302502 if (success && !copyHidlStringToRil(&dataProfiles[i].user, profiles[i].user, pRI,
2503 true)) {
Jack Yuffc06452017-02-13 11:21:00 -08002504 success = false;
2505 }
2506 if (success && !copyHidlStringToRil(&dataProfiles[i].password, profiles[i].password,
Ruthwar Kumar Ambeer7c373812017-03-23 17:38:56 +05302507 pRI, true)) {
Jack Yuffc06452017-02-13 11:21:00 -08002508 success = false;
2509 }
2510
2511 if (!success) {
2512 freeSetDataProfileData(num, dataProfiles, dataProfilePtrs, 4,
2513 &RIL_DataProfileInfo::apn, &RIL_DataProfileInfo::protocol,
2514 &RIL_DataProfileInfo::user, &RIL_DataProfileInfo::password);
2515 return Void();
2516 }
2517
2518 dataProfiles[i].profileId = (RIL_DataProfile) profiles[i].profileId;
2519 dataProfiles[i].authType = (int) profiles[i].authType;
2520 dataProfiles[i].type = (int) profiles[i].type;
2521 dataProfiles[i].maxConnsTime = profiles[i].maxConnsTime;
2522 dataProfiles[i].maxConns = profiles[i].maxConns;
2523 dataProfiles[i].waitTime = profiles[i].waitTime;
2524 dataProfiles[i].enabled = BOOL_TO_INT(profiles[i].enabled);
2525 }
2526
Amit Mahajanb3a11bb2017-05-15 16:41:44 -07002527 CALL_ONREQUEST(RIL_REQUEST_SET_DATA_PROFILE, dataProfilePtrs,
2528 num * sizeof(RIL_DataProfileInfo *), pRI, mSlotId);
Jack Yuffc06452017-02-13 11:21:00 -08002529
2530 freeSetDataProfileData(num, dataProfiles, dataProfilePtrs, 4,
2531 &RIL_DataProfileInfo::apn, &RIL_DataProfileInfo::protocol,
2532 &RIL_DataProfileInfo::user, &RIL_DataProfileInfo::password);
2533 } else {
2534 RIL_DataProfileInfo_v15 *dataProfiles =
2535 (RIL_DataProfileInfo_v15 *) calloc(num, sizeof(RIL_DataProfileInfo_v15));
2536
2537 if (dataProfiles == NULL) {
2538 RLOGE("Memory allocation failed for request %s",
2539 requestToString(pRI->pCI->requestNumber));
2540 sendErrorResponse(pRI, RIL_E_NO_MEMORY);
2541 return Void();
2542 }
2543
2544 RIL_DataProfileInfo_v15 **dataProfilePtrs =
2545 (RIL_DataProfileInfo_v15 **) calloc(num, sizeof(RIL_DataProfileInfo_v15 *));
2546 if (dataProfilePtrs == NULL) {
2547 RLOGE("Memory allocation failed for request %s",
2548 requestToString(pRI->pCI->requestNumber));
2549 free(dataProfiles);
2550 sendErrorResponse(pRI, RIL_E_NO_MEMORY);
2551 return Void();
2552 }
2553
2554 for (size_t i = 0; i < num; i++) {
2555 dataProfilePtrs[i] = &dataProfiles[i];
2556
Ruthwar Kumar Ambeer7c373812017-03-23 17:38:56 +05302557 success = copyHidlStringToRil(&dataProfiles[i].apn, profiles[i].apn, pRI, true);
Jack Yuffc06452017-02-13 11:21:00 -08002558 if (success && !copyHidlStringToRil(&dataProfiles[i].protocol, profiles[i].protocol,
2559 pRI)) {
2560 success = false;
2561 }
2562 if (success && !copyHidlStringToRil(&dataProfiles[i].roamingProtocol,
Ruthwar Kumar Ambeer7c373812017-03-23 17:38:56 +05302563 profiles[i].roamingProtocol, pRI, true)) {
Jack Yuffc06452017-02-13 11:21:00 -08002564 success = false;
2565 }
Ruthwar Kumar Ambeer7c373812017-03-23 17:38:56 +05302566 if (success && !copyHidlStringToRil(&dataProfiles[i].user, profiles[i].user, pRI,
2567 true)) {
Jack Yuffc06452017-02-13 11:21:00 -08002568 success = false;
2569 }
2570 if (success && !copyHidlStringToRil(&dataProfiles[i].password, profiles[i].password,
Ruthwar Kumar Ambeer7c373812017-03-23 17:38:56 +05302571 pRI, true)) {
Jack Yuffc06452017-02-13 11:21:00 -08002572 success = false;
2573 }
Jack Yuffc06452017-02-13 11:21:00 -08002574 if (success && !copyHidlStringToRil(&dataProfiles[i].mvnoMatchData,
Ruthwar Kumar Ambeer7c373812017-03-23 17:38:56 +05302575 profiles[i].mvnoMatchData, pRI, true)) {
Jack Yuffc06452017-02-13 11:21:00 -08002576 success = false;
2577 }
2578
Jack Yuc13645e2017-04-13 20:55:03 -07002579 if (success && !convertMvnoTypeToString(profiles[i].mvnoType,
2580 dataProfiles[i].mvnoType)) {
2581 sendErrorResponse(pRI, RIL_E_INVALID_ARGUMENTS);
2582 success = false;
Jack Yuffc06452017-02-13 11:21:00 -08002583 }
2584
2585 if (!success) {
2586 freeSetDataProfileData(num, dataProfiles, dataProfilePtrs, 6,
2587 &RIL_DataProfileInfo_v15::apn, &RIL_DataProfileInfo_v15::protocol,
2588 &RIL_DataProfileInfo_v15::roamingProtocol, &RIL_DataProfileInfo_v15::user,
2589 &RIL_DataProfileInfo_v15::password, &RIL_DataProfileInfo_v15::mvnoMatchData);
2590 return Void();
2591 }
2592
2593 dataProfiles[i].profileId = (RIL_DataProfile) profiles[i].profileId;
2594 dataProfiles[i].authType = (int) profiles[i].authType;
2595 dataProfiles[i].type = (int) profiles[i].type;
2596 dataProfiles[i].maxConnsTime = profiles[i].maxConnsTime;
2597 dataProfiles[i].maxConns = profiles[i].maxConns;
2598 dataProfiles[i].waitTime = profiles[i].waitTime;
2599 dataProfiles[i].enabled = BOOL_TO_INT(profiles[i].enabled);
2600 dataProfiles[i].supportedTypesBitmask = profiles[i].supportedApnTypesBitmap;
2601 dataProfiles[i].bearerBitmask = profiles[i].bearerBitmap;
2602 dataProfiles[i].mtu = profiles[i].mtu;
2603 }
2604
Amit Mahajanb3a11bb2017-05-15 16:41:44 -07002605 CALL_ONREQUEST(RIL_REQUEST_SET_DATA_PROFILE, dataProfilePtrs,
2606 num * sizeof(RIL_DataProfileInfo_v15 *), pRI, mSlotId);
Jack Yuffc06452017-02-13 11:21:00 -08002607
2608 freeSetDataProfileData(num, dataProfiles, dataProfilePtrs, 6,
2609 &RIL_DataProfileInfo_v15::apn, &RIL_DataProfileInfo_v15::protocol,
2610 &RIL_DataProfileInfo_v15::roamingProtocol, &RIL_DataProfileInfo_v15::user,
2611 &RIL_DataProfileInfo_v15::password, &RIL_DataProfileInfo_v15::mvnoMatchData);
2612 }
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002613
2614 return Void();
2615}
2616
2617Return<void> RadioImpl::requestShutdown(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002618#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002619 RLOGD("requestShutdown: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002620#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002621 dispatchVoid(serial, mSlotId, RIL_REQUEST_SHUTDOWN);
2622 return Void();
2623}
2624
2625Return<void> RadioImpl::getRadioCapability(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002626#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002627 RLOGD("getRadioCapability: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002628#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002629 dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_RADIO_CAPABILITY);
2630 return Void();
2631}
2632
2633Return<void> RadioImpl::setRadioCapability(int32_t serial, const RadioCapability& rc) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002634#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002635 RLOGD("setRadioCapability: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002636#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002637 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_SET_RADIO_CAPABILITY);
2638 if (pRI == NULL) {
2639 return Void();
2640 }
2641
Jack Yu8e732d42017-04-14 00:08:06 -07002642 RIL_RadioCapability rilRc = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002643
2644 // TODO : set rilRc.version using HIDL version ?
2645 rilRc.session = rc.session;
2646 rilRc.phase = (int) rc.phase;
2647 rilRc.rat = (int) rc.raf;
2648 rilRc.status = (int) rc.status;
Scott Randolphc7213312017-04-03 14:06:40 -07002649 strncpy(rilRc.logicalModemUuid, rc.logicalModemUuid.c_str(), MAX_UUID_LENGTH);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002650
Amit Mahajanb3a11bb2017-05-15 16:41:44 -07002651 CALL_ONREQUEST(pRI->pCI->requestNumber, &rilRc, sizeof(rilRc), pRI, mSlotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002652
2653 return Void();
2654}
2655
2656Return<void> RadioImpl::startLceService(int32_t serial, int32_t reportInterval, bool pullMode) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002657#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002658 RLOGD("startLceService: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002659#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002660 dispatchInts(serial, mSlotId, RIL_REQUEST_START_LCE, 2, reportInterval,
2661 BOOL_TO_INT(pullMode));
2662 return Void();
2663}
2664
2665Return<void> RadioImpl::stopLceService(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002666#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002667 RLOGD("stopLceService: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002668#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002669 dispatchVoid(serial, mSlotId, RIL_REQUEST_STOP_LCE);
2670 return Void();
2671}
2672
2673Return<void> RadioImpl::pullLceData(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002674#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002675 RLOGD("pullLceData: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002676#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002677 dispatchVoid(serial, mSlotId, RIL_REQUEST_PULL_LCEDATA);
2678 return Void();
2679}
2680
2681Return<void> RadioImpl::getModemActivityInfo(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002682#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002683 RLOGD("getModemActivityInfo: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002684#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002685 dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_ACTIVITY_INFO);
2686 return Void();
2687}
2688
2689Return<void> RadioImpl::setAllowedCarriers(int32_t serial, bool allAllowed,
2690 const CarrierRestrictions& carriers) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002691#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002692 RLOGD("setAllowedCarriers: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002693#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002694 RequestInfo *pRI = android::addRequestToList(serial, mSlotId,
2695 RIL_REQUEST_SET_CARRIER_RESTRICTIONS);
2696 if (pRI == NULL) {
2697 return Void();
2698 }
2699
Jack Yuf68e0da2017-02-07 14:53:09 -08002700 RIL_CarrierRestrictions cr = {};
Jack Yu11ab4042017-02-21 17:08:01 -08002701 RIL_Carrier *allowedCarriers = NULL;
2702 RIL_Carrier *excludedCarriers = NULL;
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002703
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002704 cr.len_allowed_carriers = carriers.allowedCarriers.size();
2705 allowedCarriers = (RIL_Carrier *)calloc(cr.len_allowed_carriers, sizeof(RIL_Carrier));
2706 if (allowedCarriers == NULL) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08002707 RLOGE("setAllowedCarriers: Memory allocation failed for request %s",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002708 requestToString(pRI->pCI->requestNumber));
Jack Yuffc06452017-02-13 11:21:00 -08002709 sendErrorResponse(pRI, RIL_E_NO_MEMORY);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002710 return Void();
2711 }
2712 cr.allowed_carriers = allowedCarriers;
2713
2714 cr.len_excluded_carriers = carriers.excludedCarriers.size();
2715 excludedCarriers = (RIL_Carrier *)calloc(cr.len_excluded_carriers, sizeof(RIL_Carrier));
2716 if (excludedCarriers == NULL) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08002717 RLOGE("setAllowedCarriers: Memory allocation failed for request %s",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002718 requestToString(pRI->pCI->requestNumber));
Jack Yuffc06452017-02-13 11:21:00 -08002719 sendErrorResponse(pRI, RIL_E_NO_MEMORY);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002720#ifdef MEMSET_FREED
2721 memset(allowedCarriers, 0, cr.len_allowed_carriers * sizeof(RIL_Carrier));
2722#endif
2723 free(allowedCarriers);
2724 return Void();
2725 }
2726 cr.excluded_carriers = excludedCarriers;
2727
2728 for (int i = 0; i < cr.len_allowed_carriers; i++) {
Scott Randolphc7213312017-04-03 14:06:40 -07002729 allowedCarriers[i].mcc = carriers.allowedCarriers[i].mcc.c_str();
2730 allowedCarriers[i].mnc = carriers.allowedCarriers[i].mnc.c_str();
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002731 allowedCarriers[i].match_type = (RIL_CarrierMatchType) carriers.allowedCarriers[i].matchType;
Scott Randolphc7213312017-04-03 14:06:40 -07002732 allowedCarriers[i].match_data = carriers.allowedCarriers[i].matchData.c_str();
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002733 }
2734
Amit Mahajan3f510f62017-03-01 10:26:58 -08002735 for (int i = 0; i < cr.len_excluded_carriers; i++) {
Scott Randolphc7213312017-04-03 14:06:40 -07002736 excludedCarriers[i].mcc = carriers.excludedCarriers[i].mcc.c_str();
2737 excludedCarriers[i].mnc = carriers.excludedCarriers[i].mnc.c_str();
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002738 excludedCarriers[i].match_type =
2739 (RIL_CarrierMatchType) carriers.excludedCarriers[i].matchType;
Scott Randolphc7213312017-04-03 14:06:40 -07002740 excludedCarriers[i].match_data = carriers.excludedCarriers[i].matchData.c_str();
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002741 }
2742
Amit Mahajanb3a11bb2017-05-15 16:41:44 -07002743 CALL_ONREQUEST(pRI->pCI->requestNumber, &cr, sizeof(RIL_CarrierRestrictions), pRI, mSlotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002744
2745#ifdef MEMSET_FREED
2746 memset(allowedCarriers, 0, cr.len_allowed_carriers * sizeof(RIL_Carrier));
2747 memset(excludedCarriers, 0, cr.len_excluded_carriers * sizeof(RIL_Carrier));
2748#endif
2749 free(allowedCarriers);
2750 free(excludedCarriers);
2751 return Void();
2752}
2753
2754Return<void> RadioImpl::getAllowedCarriers(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002755#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002756 RLOGD("getAllowedCarriers: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002757#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002758 dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_CARRIER_RESTRICTIONS);
2759 return Void();
2760}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002761
Jack Yu11ab4042017-02-21 17:08:01 -08002762Return<void> RadioImpl::sendDeviceState(int32_t serial, DeviceStateType deviceStateType,
2763 bool state) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002764#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002765 RLOGD("sendDeviceState: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002766#endif
Jack Yu11ab4042017-02-21 17:08:01 -08002767 if (s_vendorFunctions->version < 15) {
2768 if (deviceStateType == DeviceStateType::LOW_DATA_EXPECTED) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08002769 RLOGD("sendDeviceState: calling screen state %d", BOOL_TO_INT(!state));
Jack Yu11ab4042017-02-21 17:08:01 -08002770 dispatchInts(serial, mSlotId, RIL_REQUEST_SCREEN_STATE, 1, BOOL_TO_INT(!state));
2771 } else {
2772 RequestInfo *pRI = android::addRequestToList(serial, mSlotId,
2773 RIL_REQUEST_SEND_DEVICE_STATE);
2774 sendErrorResponse(pRI, RIL_E_REQUEST_NOT_SUPPORTED);
2775 }
2776 return Void();
2777 }
2778 dispatchInts(serial, mSlotId, RIL_REQUEST_SEND_DEVICE_STATE, 2, (int) deviceStateType,
2779 BOOL_TO_INT(state));
2780 return Void();
2781}
2782
2783Return<void> RadioImpl::setIndicationFilter(int32_t serial, int32_t indicationFilter) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002784#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002785 RLOGD("setIndicationFilter: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002786#endif
Jack Yu11ab4042017-02-21 17:08:01 -08002787 if (s_vendorFunctions->version < 15) {
2788 RequestInfo *pRI = android::addRequestToList(serial, mSlotId,
2789 RIL_REQUEST_SET_UNSOLICITED_RESPONSE_FILTER);
2790 sendErrorResponse(pRI, RIL_E_REQUEST_NOT_SUPPORTED);
2791 return Void();
2792 }
2793 dispatchInts(serial, mSlotId, RIL_REQUEST_SET_UNSOLICITED_RESPONSE_FILTER, 1, indicationFilter);
2794 return Void();
2795}
2796
Wileen Chiu718c0bf2017-01-04 11:37:19 -08002797Return<void> RadioImpl::setSimCardPower(int32_t serial, bool powerUp) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002798#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002799 RLOGD("setSimCardPower: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002800#endif
Wileen Chiu718c0bf2017-01-04 11:37:19 -08002801 dispatchInts(serial, mSlotId, RIL_REQUEST_SET_SIM_CARD_POWER, 1, BOOL_TO_INT(powerUp));
2802 return Void();
2803}
2804
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07002805Return<void> RadioImpl::setSimCardPower_1_1(int32_t serial, const V1_1::CardPowerState state) {
Grace Chen08eb6542017-03-23 18:39:48 -07002806#if VDBG
2807 RLOGD("setSimCardPower_1_1: serial %d state %d", serial, state);
2808#endif
2809 dispatchInts(serial, mSlotId, RIL_REQUEST_SET_SIM_CARD_POWER, 1, state);
2810 return Void();
2811}
2812
Nathan Harold6a8809d2017-07-07 19:28:58 -07002813Return<void> RadioImpl::setCarrierInfoForImsiEncryption(int32_t serial,
2814 const V1_1::ImsiEncryptionInfo& data) {
2815#if VDBG
2816 RLOGD("setCarrierInfoForImsiEncryption: serial %d", serial);
2817#endif
2818 RequestInfo *pRI = android::addRequestToList(
2819 serial, mSlotId, RIL_REQUEST_SET_CARRIER_INFO_IMSI_ENCRYPTION);
2820 if (pRI == NULL) {
2821 return Void();
2822 }
2823
2824 RIL_CarrierInfoForImsiEncryption imsiEncryption = {};
2825
2826 if (!copyHidlStringToRil(&imsiEncryption.mnc, data.mnc, pRI)) {
2827 return Void();
2828 }
2829 if (!copyHidlStringToRil(&imsiEncryption.mcc, data.mcc, pRI)) {
2830 memsetAndFreeStrings(1, imsiEncryption.mnc);
2831 return Void();
2832 }
2833 if (!copyHidlStringToRil(&imsiEncryption.keyIdentifier, data.keyIdentifier, pRI)) {
2834 memsetAndFreeStrings(2, imsiEncryption.mnc, imsiEncryption.mcc);
2835 return Void();
2836 }
Youngrak Leee6f16f22017-12-03 10:50:37 -08002837 imsiEncryption.carrierKeyLength = data.carrierKey.size();
2838 imsiEncryption.carrierKey = new uint8_t[imsiEncryption.carrierKeyLength];
2839 memcpy(imsiEncryption.carrierKey, data.carrierKey.data(), imsiEncryption.carrierKeyLength);
Nathan Harold6a8809d2017-07-07 19:28:58 -07002840 imsiEncryption.expirationTime = data.expirationTime;
2841 CALL_ONREQUEST(pRI->pCI->requestNumber, &imsiEncryption,
2842 sizeof(RIL_CarrierInfoForImsiEncryption), pRI, mSlotId);
2843 delete(imsiEncryption.carrierKey);
2844 return Void();
2845}
2846
2847Return<void> RadioImpl::startKeepalive(int32_t serial, const V1_1::KeepaliveRequest& keepalive) {
2848#if VDBG
2849 RLOGD("%s(): %d", __FUNCTION__, serial);
2850#endif
2851 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_START_KEEPALIVE);
2852 if (pRI == NULL) {
2853 return Void();
2854 }
2855
2856 RIL_KeepaliveRequest kaReq = {};
2857
2858 kaReq.type = static_cast<RIL_KeepaliveType>(keepalive.type);
2859 switch(kaReq.type) {
2860 case NATT_IPV4:
2861 if (keepalive.sourceAddress.size() != 4 ||
2862 keepalive.destinationAddress.size() != 4) {
2863 RLOGE("Invalid address for keepalive!");
2864 sendErrorResponse(pRI, RIL_E_INVALID_ARGUMENTS);
2865 return Void();
2866 }
2867 break;
2868 case NATT_IPV6:
2869 if (keepalive.sourceAddress.size() != 16 ||
2870 keepalive.destinationAddress.size() != 16) {
2871 RLOGE("Invalid address for keepalive!");
2872 sendErrorResponse(pRI, RIL_E_INVALID_ARGUMENTS);
2873 return Void();
2874 }
2875 break;
2876 default:
2877 RLOGE("Unknown packet keepalive type!");
2878 sendErrorResponse(pRI, RIL_E_INVALID_ARGUMENTS);
2879 return Void();
2880 }
2881
2882 ::memcpy(kaReq.sourceAddress, keepalive.sourceAddress.data(), keepalive.sourceAddress.size());
2883 kaReq.sourcePort = keepalive.sourcePort;
2884
2885 ::memcpy(kaReq.destinationAddress,
2886 keepalive.destinationAddress.data(), keepalive.destinationAddress.size());
2887 kaReq.destinationPort = keepalive.destinationPort;
2888
2889 kaReq.maxKeepaliveIntervalMillis = keepalive.maxKeepaliveIntervalMillis;
2890 kaReq.cid = keepalive.cid; // This is the context ID of the data call
2891
2892 CALL_ONREQUEST(pRI->pCI->requestNumber, &kaReq, sizeof(RIL_KeepaliveRequest), pRI, mSlotId);
2893 return Void();
2894}
2895
2896Return<void> RadioImpl::stopKeepalive(int32_t serial, int32_t sessionHandle) {
2897#if VDBG
2898 RLOGD("%s(): %d", __FUNCTION__, serial);
2899#endif
2900 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_STOP_KEEPALIVE);
2901 if (pRI == NULL) {
2902 return Void();
2903 }
2904
2905 CALL_ONREQUEST(pRI->pCI->requestNumber, &sessionHandle, sizeof(uint32_t), pRI, mSlotId);
2906 return Void();
2907}
2908
Sanket Padawef220dc52017-01-02 23:46:00 -08002909Return<void> RadioImpl::responseAcknowledgement() {
2910 android::releaseWakeLock();
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002911 return Void();
Sanket Padawef220dc52017-01-02 23:46:00 -08002912}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002913
Amit Mahajan439da362017-02-13 17:43:04 -08002914Return<void> OemHookImpl::setResponseFunctions(
2915 const ::android::sp<IOemHookResponse>& oemHookResponseParam,
2916 const ::android::sp<IOemHookIndication>& oemHookIndicationParam) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002917#if VDBG
Amit Mahajan439da362017-02-13 17:43:04 -08002918 RLOGD("OemHookImpl::setResponseFunctions");
Jayachandran C572f2f42017-03-25 14:30:13 -07002919#endif
Amit Mahajan439da362017-02-13 17:43:04 -08002920
2921 pthread_rwlock_t *radioServiceRwlockPtr = radio::getRadioServiceRwlock(mSlotId);
2922 int ret = pthread_rwlock_wrlock(radioServiceRwlockPtr);
2923 assert(ret == 0);
2924
2925 mOemHookResponse = oemHookResponseParam;
2926 mOemHookIndication = oemHookIndicationParam;
Amit Mahajand423d192017-03-16 17:04:01 -07002927 mCounterOemHook[mSlotId]++;
Amit Mahajan439da362017-02-13 17:43:04 -08002928
2929 ret = pthread_rwlock_unlock(radioServiceRwlockPtr);
2930 assert(ret == 0);
2931
2932 return Void();
2933}
2934
2935Return<void> OemHookImpl::sendRequestRaw(int32_t serial, const hidl_vec<uint8_t>& data) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002936#if VDBG
Amit Mahajan439da362017-02-13 17:43:04 -08002937 RLOGD("OemHookImpl::sendRequestRaw: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002938#endif
Amit Mahajan439da362017-02-13 17:43:04 -08002939 dispatchRaw(serial, mSlotId, RIL_REQUEST_OEM_HOOK_RAW, data);
2940 return Void();
2941}
2942
2943Return<void> OemHookImpl::sendRequestStrings(int32_t serial,
2944 const hidl_vec<hidl_string>& data) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002945#if VDBG
Amit Mahajan439da362017-02-13 17:43:04 -08002946 RLOGD("OemHookImpl::sendRequestStrings: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002947#endif
Amit Mahajan439da362017-02-13 17:43:04 -08002948 dispatchStrings(serial, mSlotId, RIL_REQUEST_OEM_HOOK_STRINGS, data);
2949 return Void();
2950}
2951
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002952/***************************************************************************************************
2953 * RESPONSE FUNCTIONS
2954 * Functions above are used for requests going from framework to vendor code. The ones below are
2955 * responses for those requests coming back from the vendor code.
2956 **************************************************************************************************/
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002957
Sanket Padawef220dc52017-01-02 23:46:00 -08002958void radio::acknowledgeRequest(int slotId, int serial) {
2959 if (radioService[slotId]->mRadioResponse != NULL) {
Amit Mahajan17249842017-01-19 15:05:45 -08002960 Return<void> retStatus = radioService[slotId]->mRadioResponse->acknowledgeRequest(serial);
2961 radioService[slotId]->checkReturnStatus(retStatus);
Sanket Padawef220dc52017-01-02 23:46:00 -08002962 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08002963 RLOGE("acknowledgeRequest: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawef220dc52017-01-02 23:46:00 -08002964 }
2965}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002966
Sanket Padawef220dc52017-01-02 23:46:00 -08002967void populateResponseInfo(RadioResponseInfo& responseInfo, int serial, int responseType,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002968 RIL_Errno e) {
Sanket Padawef220dc52017-01-02 23:46:00 -08002969 responseInfo.serial = serial;
2970 switch (responseType) {
2971 case RESPONSE_SOLICITED:
2972 responseInfo.type = RadioResponseType::SOLICITED;
2973 break;
2974 case RESPONSE_SOLICITED_ACK_EXP:
2975 responseInfo.type = RadioResponseType::SOLICITED_ACK_EXP;
2976 break;
2977 }
2978 responseInfo.error = (RadioError) e;
2979}
2980
Naveen Kalla346bbc02017-03-16 12:55:55 -07002981int responseIntOrEmpty(RadioResponseInfo& responseInfo, int serial, int responseType, RIL_Errno e,
2982 void *response, size_t responseLen) {
2983 populateResponseInfo(responseInfo, serial, responseType, e);
2984 int ret = -1;
2985
2986 if (response == NULL && responseLen == 0) {
2987 // Earlier RILs did not send a response for some cases although the interface
2988 // expected an integer as response. Do not return error if response is empty. Instead
2989 // Return -1 in those cases to maintain backward compatibility.
2990 } else if (response == NULL || responseLen != sizeof(int)) {
2991 RLOGE("responseIntOrEmpty: Invalid response");
2992 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
2993 } else {
2994 int *p_int = (int *) response;
2995 ret = p_int[0];
2996 }
2997 return ret;
2998}
2999
Sanket Padawef220dc52017-01-02 23:46:00 -08003000int responseInt(RadioResponseInfo& responseInfo, int serial, int responseType, RIL_Errno e,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003001 void *response, size_t responseLen) {
Sanket Padawef220dc52017-01-02 23:46:00 -08003002 populateResponseInfo(responseInfo, serial, responseType, e);
3003 int ret = -1;
3004
3005 if (response == NULL || responseLen != sizeof(int)) {
3006 RLOGE("responseInt: Invalid response");
3007 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
3008 } else {
3009 int *p_int = (int *) response;
3010 ret = p_int[0];
3011 }
3012 return ret;
3013}
3014
Amit Mahajan759786a2017-03-03 17:35:47 -08003015int radio::getIccCardStatusResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003016 int responseType, int serial, RIL_Errno e,
3017 void *response, size_t responseLen) {
Sanket Padawef220dc52017-01-02 23:46:00 -08003018 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003019 RadioResponseInfo responseInfo = {};
Sanket Padawef220dc52017-01-02 23:46:00 -08003020 populateResponseInfo(responseInfo, serial, responseType, e);
Jack Yuf68e0da2017-02-07 14:53:09 -08003021 CardStatus cardStatus = {};
Nathan Harold7da5dd62017-06-08 16:41:52 -07003022 RIL_CardStatus_v6 *p_cur = ((RIL_CardStatus_v6 *) response);
3023 if (response == NULL || responseLen != sizeof(RIL_CardStatus_v6)
3024 || p_cur->gsm_umts_subscription_app_index >= p_cur->num_applications
3025 || p_cur->cdma_subscription_app_index >= p_cur->num_applications
3026 || p_cur->ims_subscription_app_index >= p_cur->num_applications) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003027 RLOGE("getIccCardStatusResponse: Invalid response");
Sanket Padawef220dc52017-01-02 23:46:00 -08003028 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
Amit Mahajancd77a5b2016-08-25 11:19:21 -07003029 } else {
Amit Mahajancd77a5b2016-08-25 11:19:21 -07003030 cardStatus.cardState = (CardState) p_cur->card_state;
3031 cardStatus.universalPinState = (PinState) p_cur->universal_pin_state;
3032 cardStatus.gsmUmtsSubscriptionAppIndex = p_cur->gsm_umts_subscription_app_index;
3033 cardStatus.cdmaSubscriptionAppIndex = p_cur->cdma_subscription_app_index;
3034 cardStatus.imsSubscriptionAppIndex = p_cur->ims_subscription_app_index;
3035
3036 RIL_AppStatus *rilAppStatus = p_cur->applications;
3037 cardStatus.applications.resize(p_cur->num_applications);
3038 AppStatus *appStatus = cardStatus.applications.data();
Jayachandran C572f2f42017-03-25 14:30:13 -07003039#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003040 RLOGD("getIccCardStatusResponse: num_applications %d", p_cur->num_applications);
Jayachandran C572f2f42017-03-25 14:30:13 -07003041#endif
Amit Mahajancd77a5b2016-08-25 11:19:21 -07003042 for (int i = 0; i < p_cur->num_applications; i++) {
3043 appStatus[i].appType = (AppType) rilAppStatus[i].app_type;
3044 appStatus[i].appState = (AppState) rilAppStatus[i].app_state;
3045 appStatus[i].persoSubstate = (PersoSubstate) rilAppStatus[i].perso_substate;
3046 appStatus[i].aidPtr = convertCharPtrToHidlString(rilAppStatus[i].aid_ptr);
3047 appStatus[i].appLabelPtr = convertCharPtrToHidlString(
3048 rilAppStatus[i].app_label_ptr);
3049 appStatus[i].pin1Replaced = rilAppStatus[i].pin1_replaced;
3050 appStatus[i].pin1 = (PinState) rilAppStatus[i].pin1;
3051 appStatus[i].pin2 = (PinState) rilAppStatus[i].pin2;
3052 }
3053 }
3054
Amit Mahajan17249842017-01-19 15:05:45 -08003055 Return<void> retStatus = radioService[slotId]->mRadioResponse->
3056 getIccCardStatusResponse(responseInfo, cardStatus);
3057 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajancd77a5b2016-08-25 11:19:21 -07003058 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003059 RLOGE("getIccCardStatusResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawef220dc52017-01-02 23:46:00 -08003060 }
3061
3062 return 0;
3063}
3064
Amit Mahajan759786a2017-03-03 17:35:47 -08003065int radio::supplyIccPinForAppResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003066 int responseType, int serial, RIL_Errno e,
3067 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003068#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003069 RLOGD("supplyIccPinForAppResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003070#endif
Sanket Padawef220dc52017-01-02 23:46:00 -08003071
3072 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003073 RadioResponseInfo responseInfo = {};
Naveen Kalla346bbc02017-03-16 12:55:55 -07003074 int ret = responseIntOrEmpty(responseInfo, serial, responseType, e, response, responseLen);
Amit Mahajan17249842017-01-19 15:05:45 -08003075 Return<void> retStatus = radioService[slotId]->mRadioResponse->
3076 supplyIccPinForAppResponse(responseInfo, ret);
Amit Mahajanb3a11bb2017-05-15 16:41:44 -07003077 RLOGE("supplyIccPinForAppResponse: amit ret %d", ret);
Amit Mahajan17249842017-01-19 15:05:45 -08003078 radioService[slotId]->checkReturnStatus(retStatus);
Sanket Padawef220dc52017-01-02 23:46:00 -08003079 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003080 RLOGE("supplyIccPinForAppResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawef220dc52017-01-02 23:46:00 -08003081 slotId);
3082 }
3083
3084 return 0;
3085}
3086
Amit Mahajan759786a2017-03-03 17:35:47 -08003087int radio::supplyIccPukForAppResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003088 int responseType, int serial, RIL_Errno e,
3089 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003090#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003091 RLOGD("supplyIccPukForAppResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003092#endif
Sanket Padawef220dc52017-01-02 23:46:00 -08003093
3094 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003095 RadioResponseInfo responseInfo = {};
Naveen Kalla346bbc02017-03-16 12:55:55 -07003096 int ret = responseIntOrEmpty(responseInfo, serial, responseType, e, response, responseLen);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003097 Return<void> retStatus = radioService[slotId]->mRadioResponse->supplyIccPukForAppResponse(
3098 responseInfo, ret);
Amit Mahajan17249842017-01-19 15:05:45 -08003099 radioService[slotId]->checkReturnStatus(retStatus);
Sanket Padawef220dc52017-01-02 23:46:00 -08003100 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003101 RLOGE("supplyIccPukForAppResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawef220dc52017-01-02 23:46:00 -08003102 slotId);
3103 }
3104
3105 return 0;
3106}
3107
Amit Mahajan759786a2017-03-03 17:35:47 -08003108int radio::supplyIccPin2ForAppResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003109 int responseType, int serial, RIL_Errno e,
3110 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003111#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003112 RLOGD("supplyIccPin2ForAppResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003113#endif
Sanket Padawef220dc52017-01-02 23:46:00 -08003114
3115 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003116 RadioResponseInfo responseInfo = {};
Naveen Kalla346bbc02017-03-16 12:55:55 -07003117 int ret = responseIntOrEmpty(responseInfo, serial, responseType, e, response, responseLen);
Amit Mahajan17249842017-01-19 15:05:45 -08003118 Return<void> retStatus = radioService[slotId]->mRadioResponse->
3119 supplyIccPin2ForAppResponse(responseInfo, ret);
3120 radioService[slotId]->checkReturnStatus(retStatus);
Sanket Padawef220dc52017-01-02 23:46:00 -08003121 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003122 RLOGE("supplyIccPin2ForAppResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawef220dc52017-01-02 23:46:00 -08003123 slotId);
3124 }
3125
3126 return 0;
3127}
3128
Amit Mahajan759786a2017-03-03 17:35:47 -08003129int radio::supplyIccPuk2ForAppResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003130 int responseType, int serial, RIL_Errno e,
3131 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003132#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003133 RLOGD("supplyIccPuk2ForAppResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003134#endif
Sanket Padawef220dc52017-01-02 23:46:00 -08003135
3136 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003137 RadioResponseInfo responseInfo = {};
Naveen Kalla346bbc02017-03-16 12:55:55 -07003138 int ret = responseIntOrEmpty(responseInfo, serial, responseType, e, response, responseLen);
Amit Mahajan17249842017-01-19 15:05:45 -08003139 Return<void> retStatus = radioService[slotId]->mRadioResponse->
3140 supplyIccPuk2ForAppResponse(responseInfo, ret);
3141 radioService[slotId]->checkReturnStatus(retStatus);
Sanket Padawef220dc52017-01-02 23:46:00 -08003142 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003143 RLOGE("supplyIccPuk2ForAppResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawef220dc52017-01-02 23:46:00 -08003144 slotId);
3145 }
3146
3147 return 0;
3148}
3149
Amit Mahajan759786a2017-03-03 17:35:47 -08003150int radio::changeIccPinForAppResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003151 int responseType, int serial, RIL_Errno e,
3152 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003153#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003154 RLOGD("changeIccPinForAppResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003155#endif
Sanket Padawef220dc52017-01-02 23:46:00 -08003156
3157 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003158 RadioResponseInfo responseInfo = {};
Naveen Kalla346bbc02017-03-16 12:55:55 -07003159 int ret = responseIntOrEmpty(responseInfo, serial, responseType, e, response, responseLen);
Amit Mahajan17249842017-01-19 15:05:45 -08003160 Return<void> retStatus = radioService[slotId]->mRadioResponse->
3161 changeIccPinForAppResponse(responseInfo, ret);
3162 radioService[slotId]->checkReturnStatus(retStatus);
Sanket Padawef220dc52017-01-02 23:46:00 -08003163 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003164 RLOGE("changeIccPinForAppResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawef220dc52017-01-02 23:46:00 -08003165 slotId);
3166 }
3167
3168 return 0;
3169}
3170
Amit Mahajan759786a2017-03-03 17:35:47 -08003171int radio::changeIccPin2ForAppResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003172 int responseType, int serial, RIL_Errno e,
3173 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003174#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003175 RLOGD("changeIccPin2ForAppResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003176#endif
Sanket Padawef220dc52017-01-02 23:46:00 -08003177
3178 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003179 RadioResponseInfo responseInfo = {};
Naveen Kalla346bbc02017-03-16 12:55:55 -07003180 int ret = responseIntOrEmpty(responseInfo, serial, responseType, e, response, responseLen);
Amit Mahajan17249842017-01-19 15:05:45 -08003181 Return<void> retStatus = radioService[slotId]->mRadioResponse->
3182 changeIccPin2ForAppResponse(responseInfo, ret);
3183 radioService[slotId]->checkReturnStatus(retStatus);
Sanket Padawef220dc52017-01-02 23:46:00 -08003184 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003185 RLOGE("changeIccPin2ForAppResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawef220dc52017-01-02 23:46:00 -08003186 slotId);
3187 }
3188
3189 return 0;
3190}
3191
Amit Mahajan759786a2017-03-03 17:35:47 -08003192int radio::supplyNetworkDepersonalizationResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003193 int responseType, int serial, RIL_Errno e,
3194 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003195#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003196 RLOGD("supplyNetworkDepersonalizationResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003197#endif
Sanket Padawef220dc52017-01-02 23:46:00 -08003198
3199 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003200 RadioResponseInfo responseInfo = {};
Naveen Kalla346bbc02017-03-16 12:55:55 -07003201 int ret = responseIntOrEmpty(responseInfo, serial, responseType, e, response, responseLen);
Amit Mahajan17249842017-01-19 15:05:45 -08003202 Return<void> retStatus = radioService[slotId]->mRadioResponse->
3203 supplyNetworkDepersonalizationResponse(responseInfo, ret);
3204 radioService[slotId]->checkReturnStatus(retStatus);
Sanket Padawef220dc52017-01-02 23:46:00 -08003205 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003206 RLOGE("supplyNetworkDepersonalizationResponse: radioService[%d]->mRadioResponse == "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003207 "NULL", slotId);
Sanket Padawef220dc52017-01-02 23:46:00 -08003208 }
3209
3210 return 0;
3211}
3212
Amit Mahajan759786a2017-03-03 17:35:47 -08003213int radio::getCurrentCallsResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003214 int responseType, int serial, RIL_Errno e,
3215 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003216#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003217 RLOGD("getCurrentCallsResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003218#endif
Sanket Padawef220dc52017-01-02 23:46:00 -08003219
3220 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003221 RadioResponseInfo responseInfo = {};
Sanket Padawef220dc52017-01-02 23:46:00 -08003222 populateResponseInfo(responseInfo, serial, responseType, e);
3223
3224 hidl_vec<Call> calls;
Amit Mahajan13058cb2017-06-07 23:10:27 -07003225 if ((response == NULL && responseLen != 0)
3226 || (responseLen % sizeof(RIL_Call *)) != 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003227 RLOGE("getCurrentCallsResponse: Invalid response");
Amit Mahajan5829a472016-12-28 17:28:07 -08003228 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
Sanket Padawef220dc52017-01-02 23:46:00 -08003229 } else {
3230 int num = responseLen / sizeof(RIL_Call *);
3231 calls.resize(num);
3232
3233 for (int i = 0 ; i < num ; i++) {
3234 RIL_Call *p_cur = ((RIL_Call **) response)[i];
3235 /* each call info */
3236 calls[i].state = (CallState) p_cur->state;
3237 calls[i].index = p_cur->index;
3238 calls[i].toa = p_cur->toa;
3239 calls[i].isMpty = p_cur->isMpty;
3240 calls[i].isMT = p_cur->isMT;
3241 calls[i].als = p_cur->als;
3242 calls[i].isVoice = p_cur->isVoice;
3243 calls[i].isVoicePrivacy = p_cur->isVoicePrivacy;
3244 calls[i].number = convertCharPtrToHidlString(p_cur->number);
3245 calls[i].numberPresentation = (CallPresentation) p_cur->numberPresentation;
3246 calls[i].name = convertCharPtrToHidlString(p_cur->name);
3247 calls[i].namePresentation = (CallPresentation) p_cur->namePresentation;
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003248 if (p_cur->uusInfo != NULL && p_cur->uusInfo->uusData != NULL) {
Sanket Padawef220dc52017-01-02 23:46:00 -08003249 RIL_UUS_Info *uusInfo = p_cur->uusInfo;
Ajay Nambi83e7acd2017-09-05 15:06:22 +05303250 calls[i].uusInfo.resize(1);
Sanket Padawef220dc52017-01-02 23:46:00 -08003251 calls[i].uusInfo[0].uusType = (UusType) uusInfo->uusType;
3252 calls[i].uusInfo[0].uusDcs = (UusDcs) uusInfo->uusDcs;
3253 // convert uusInfo->uusData to a null-terminated string
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003254 char *nullTermStr = strndup(uusInfo->uusData, uusInfo->uusLength);
3255 calls[i].uusInfo[0].uusData = nullTermStr;
3256 free(nullTermStr);
Sanket Padawef220dc52017-01-02 23:46:00 -08003257 }
3258 }
3259 }
3260
Amit Mahajan17249842017-01-19 15:05:45 -08003261 Return<void> retStatus = radioService[slotId]->mRadioResponse->
3262 getCurrentCallsResponse(responseInfo, calls);
3263 radioService[slotId]->checkReturnStatus(retStatus);
Sanket Padawef220dc52017-01-02 23:46:00 -08003264 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003265 RLOGE("getCurrentCallsResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawef220dc52017-01-02 23:46:00 -08003266 }
3267
3268 return 0;
3269}
3270
Amit Mahajan759786a2017-03-03 17:35:47 -08003271int radio::dialResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003272 int responseType, int serial, RIL_Errno e, void *response,
3273 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003274#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003275 RLOGD("dialResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003276#endif
Sanket Padawef220dc52017-01-02 23:46:00 -08003277
3278 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003279 RadioResponseInfo responseInfo = {};
Sanket Padawef220dc52017-01-02 23:46:00 -08003280 populateResponseInfo(responseInfo, serial, responseType, e);
Amit Mahajan17249842017-01-19 15:05:45 -08003281 Return<void> retStatus = radioService[slotId]->mRadioResponse->dialResponse(responseInfo);
3282 radioService[slotId]->checkReturnStatus(retStatus);
Sanket Padawef220dc52017-01-02 23:46:00 -08003283 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003284 RLOGE("dialResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Amit Mahajancd77a5b2016-08-25 11:19:21 -07003285 }
3286
3287 return 0;
3288}
3289
Amit Mahajan759786a2017-03-03 17:35:47 -08003290int radio::getIMSIForAppResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003291 int responseType, int serial, RIL_Errno e, void *response,
3292 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003293#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003294 RLOGD("getIMSIForAppResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003295#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003296
3297 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003298 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003299 populateResponseInfo(responseInfo, serial, responseType, e);
3300 Return<void> retStatus = radioService[slotId]->mRadioResponse->getIMSIForAppResponse(
3301 responseInfo, convertCharPtrToHidlString((char *) response));
3302 radioService[slotId]->checkReturnStatus(retStatus);
3303 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003304 RLOGE("getIMSIForAppResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003305 slotId);
3306 }
3307
3308 return 0;
3309}
3310
Amit Mahajan759786a2017-03-03 17:35:47 -08003311int radio::hangupConnectionResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003312 int responseType, int serial, RIL_Errno e,
3313 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003314#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003315 RLOGD("hangupConnectionResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003316#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003317
3318 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003319 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003320 populateResponseInfo(responseInfo, serial, responseType, e);
3321 Return<void> retStatus = radioService[slotId]->mRadioResponse->hangupConnectionResponse(
3322 responseInfo);
3323 radioService[slotId]->checkReturnStatus(retStatus);
3324 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003325 RLOGE("hangupConnectionResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003326 slotId);
3327 }
3328
3329 return 0;
3330}
3331
Amit Mahajan759786a2017-03-03 17:35:47 -08003332int radio::hangupWaitingOrBackgroundResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003333 int responseType, int serial, RIL_Errno e,
3334 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003335#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003336 RLOGD("hangupWaitingOrBackgroundResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003337#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003338
3339 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003340 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003341 populateResponseInfo(responseInfo, serial, responseType, e);
3342 Return<void> retStatus =
3343 radioService[slotId]->mRadioResponse->hangupWaitingOrBackgroundResponse(
3344 responseInfo);
3345 radioService[slotId]->checkReturnStatus(retStatus);
3346 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003347 RLOGE("hangupWaitingOrBackgroundResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003348 slotId);
3349 }
3350
3351 return 0;
3352}
3353
Amit Mahajan759786a2017-03-03 17:35:47 -08003354int radio::hangupForegroundResumeBackgroundResponse(int slotId, int responseType, int serial,
3355 RIL_Errno e, void *response,
3356 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003357#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003358 RLOGD("hangupWaitingOrBackgroundResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003359#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003360
3361 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003362 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003363 populateResponseInfo(responseInfo, serial, responseType, e);
3364 Return<void> retStatus =
3365 radioService[slotId]->mRadioResponse->hangupWaitingOrBackgroundResponse(
3366 responseInfo);
3367 radioService[slotId]->checkReturnStatus(retStatus);
3368 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003369 RLOGE("hangupWaitingOrBackgroundResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003370 slotId);
3371 }
3372
3373 return 0;
3374}
3375
Amit Mahajan759786a2017-03-03 17:35:47 -08003376int radio::switchWaitingOrHoldingAndActiveResponse(int slotId, int responseType, int serial,
3377 RIL_Errno e, void *response,
3378 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003379#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003380 RLOGD("switchWaitingOrHoldingAndActiveResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003381#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003382
3383 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003384 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003385 populateResponseInfo(responseInfo, serial, responseType, e);
3386 Return<void> retStatus =
3387 radioService[slotId]->mRadioResponse->switchWaitingOrHoldingAndActiveResponse(
3388 responseInfo);
3389 radioService[slotId]->checkReturnStatus(retStatus);
3390 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003391 RLOGE("switchWaitingOrHoldingAndActiveResponse: radioService[%d]->mRadioResponse "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003392 "== NULL", slotId);
3393 }
3394
3395 return 0;
3396}
3397
Amit Mahajan759786a2017-03-03 17:35:47 -08003398int radio::conferenceResponse(int slotId, int responseType,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003399 int serial, RIL_Errno e, void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003400#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003401 RLOGD("conferenceResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003402#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003403
3404 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003405 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003406 populateResponseInfo(responseInfo, serial, responseType, e);
3407 Return<void> retStatus = radioService[slotId]->mRadioResponse->conferenceResponse(
3408 responseInfo);
3409 radioService[slotId]->checkReturnStatus(retStatus);
3410 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003411 RLOGE("conferenceResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003412 slotId);
3413 }
3414
3415 return 0;
3416}
3417
Amit Mahajan759786a2017-03-03 17:35:47 -08003418int radio::rejectCallResponse(int slotId, int responseType,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003419 int serial, RIL_Errno e, void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003420#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003421 RLOGD("rejectCallResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003422#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003423
3424 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003425 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003426 populateResponseInfo(responseInfo, serial, responseType, e);
3427 Return<void> retStatus = radioService[slotId]->mRadioResponse->rejectCallResponse(
3428 responseInfo);
3429 radioService[slotId]->checkReturnStatus(retStatus);
3430 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003431 RLOGE("rejectCallResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003432 slotId);
3433 }
3434
3435 return 0;
3436}
3437
Amit Mahajan759786a2017-03-03 17:35:47 -08003438int radio::getLastCallFailCauseResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003439 int responseType, int serial, RIL_Errno e, void *response,
3440 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003441#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003442 RLOGD("getLastCallFailCauseResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003443#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003444
3445 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003446 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003447 populateResponseInfo(responseInfo, serial, responseType, e);
Jack Yuf68e0da2017-02-07 14:53:09 -08003448
3449 LastCallFailCauseInfo info = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003450 info.vendorCause = hidl_string();
3451 if (response == NULL) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003452 RLOGE("getCurrentCallsResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003453 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
3454 } else if (responseLen == sizeof(int)) {
3455 int *pInt = (int *) response;
3456 info.causeCode = (LastCallFailCause) pInt[0];
3457 } else if (responseLen == sizeof(RIL_LastCallFailCauseInfo)) {
3458 RIL_LastCallFailCauseInfo *pFailCauseInfo = (RIL_LastCallFailCauseInfo *) response;
3459 info.causeCode = (LastCallFailCause) pFailCauseInfo->cause_code;
3460 info.vendorCause = convertCharPtrToHidlString(pFailCauseInfo->vendor_cause);
3461 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003462 RLOGE("getCurrentCallsResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003463 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
3464 }
3465
3466 Return<void> retStatus = radioService[slotId]->mRadioResponse->getLastCallFailCauseResponse(
3467 responseInfo, info);
3468 radioService[slotId]->checkReturnStatus(retStatus);
3469 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003470 RLOGE("getLastCallFailCauseResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003471 slotId);
3472 }
3473
3474 return 0;
3475}
3476
Amit Mahajan759786a2017-03-03 17:35:47 -08003477int radio::getSignalStrengthResponse(int slotId,
Amit Mahajan3df62912017-02-10 01:35:55 +00003478 int responseType, int serial, RIL_Errno e,
3479 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003480#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003481 RLOGD("getSignalStrengthResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003482#endif
Amit Mahajan3df62912017-02-10 01:35:55 +00003483
3484 if (radioService[slotId]->mRadioResponse != NULL) {
Amit Mahajan3da9ac02017-02-13 13:41:28 -08003485 RadioResponseInfo responseInfo = {};
Amit Mahajan3df62912017-02-10 01:35:55 +00003486 populateResponseInfo(responseInfo, serial, responseType, e);
Amit Mahajan3da9ac02017-02-13 13:41:28 -08003487 SignalStrength signalStrength = {};
Amit Mahajan3df62912017-02-10 01:35:55 +00003488 if (response == NULL || responseLen != sizeof(RIL_SignalStrength_v10)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003489 RLOGE("getSignalStrengthResponse: Invalid response");
Amit Mahajan3df62912017-02-10 01:35:55 +00003490 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
3491 } else {
3492 convertRilSignalStrengthToHal(response, responseLen, signalStrength);
3493 }
3494
3495 Return<void> retStatus = radioService[slotId]->mRadioResponse->getSignalStrengthResponse(
3496 responseInfo, signalStrength);
3497 radioService[slotId]->checkReturnStatus(retStatus);
3498 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003499 RLOGE("getSignalStrengthResponse: radioService[%d]->mRadioResponse == NULL",
Amit Mahajan3df62912017-02-10 01:35:55 +00003500 slotId);
3501 }
3502
3503 return 0;
3504}
3505
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003506RIL_CellInfoType getCellInfoTypeRadioTechnology(char *rat) {
3507 if (rat == NULL) {
3508 return RIL_CELL_INFO_TYPE_NONE;
3509 }
3510
3511 int radioTech = atoi(rat);
3512
3513 switch(radioTech) {
3514
3515 case RADIO_TECH_GPRS:
3516 case RADIO_TECH_EDGE:
3517 case RADIO_TECH_GSM: {
3518 return RIL_CELL_INFO_TYPE_GSM;
3519 }
3520
3521 case RADIO_TECH_UMTS:
3522 case RADIO_TECH_HSDPA:
3523 case RADIO_TECH_HSUPA:
3524 case RADIO_TECH_HSPA:
3525 case RADIO_TECH_HSPAP: {
3526 return RIL_CELL_INFO_TYPE_WCDMA;
3527 }
3528
3529 case RADIO_TECH_IS95A:
3530 case RADIO_TECH_IS95B:
3531 case RADIO_TECH_1xRTT:
3532 case RADIO_TECH_EVDO_0:
3533 case RADIO_TECH_EVDO_A:
3534 case RADIO_TECH_EVDO_B:
3535 case RADIO_TECH_EHRPD: {
3536 return RIL_CELL_INFO_TYPE_CDMA;
3537 }
3538
3539 case RADIO_TECH_LTE:
3540 case RADIO_TECH_LTE_CA: {
3541 return RIL_CELL_INFO_TYPE_LTE;
3542 }
3543
3544 case RADIO_TECH_TD_SCDMA: {
3545 return RIL_CELL_INFO_TYPE_TD_SCDMA;
3546 }
3547
3548 default: {
3549 break;
3550 }
3551 }
3552
3553 return RIL_CELL_INFO_TYPE_NONE;
3554
3555}
3556
3557void fillCellIdentityResponse(CellIdentity &cellIdentity, RIL_CellIdentity_v16 &rilCellIdentity) {
3558
3559 cellIdentity.cellIdentityGsm.resize(0);
3560 cellIdentity.cellIdentityWcdma.resize(0);
3561 cellIdentity.cellIdentityCdma.resize(0);
3562 cellIdentity.cellIdentityTdscdma.resize(0);
3563 cellIdentity.cellIdentityLte.resize(0);
3564 cellIdentity.cellInfoType = (CellInfoType)rilCellIdentity.cellInfoType;
3565 switch(rilCellIdentity.cellInfoType) {
3566
3567 case RIL_CELL_INFO_TYPE_GSM: {
3568 cellIdentity.cellIdentityGsm.resize(1);
3569 cellIdentity.cellIdentityGsm[0].mcc =
3570 std::to_string(rilCellIdentity.cellIdentityGsm.mcc);
3571 cellIdentity.cellIdentityGsm[0].mnc =
3572 std::to_string(rilCellIdentity.cellIdentityGsm.mnc);
3573 cellIdentity.cellIdentityGsm[0].lac = rilCellIdentity.cellIdentityGsm.lac;
3574 cellIdentity.cellIdentityGsm[0].cid = rilCellIdentity.cellIdentityGsm.cid;
3575 cellIdentity.cellIdentityGsm[0].arfcn = rilCellIdentity.cellIdentityGsm.arfcn;
3576 cellIdentity.cellIdentityGsm[0].bsic = rilCellIdentity.cellIdentityGsm.bsic;
3577 break;
3578 }
3579
3580 case RIL_CELL_INFO_TYPE_WCDMA: {
3581 cellIdentity.cellIdentityWcdma.resize(1);
3582 cellIdentity.cellIdentityWcdma[0].mcc =
3583 std::to_string(rilCellIdentity.cellIdentityWcdma.mcc);
3584 cellIdentity.cellIdentityWcdma[0].mnc =
3585 std::to_string(rilCellIdentity.cellIdentityWcdma.mnc);
3586 cellIdentity.cellIdentityWcdma[0].lac = rilCellIdentity.cellIdentityWcdma.lac;
3587 cellIdentity.cellIdentityWcdma[0].cid = rilCellIdentity.cellIdentityWcdma.cid;
3588 cellIdentity.cellIdentityWcdma[0].psc = rilCellIdentity.cellIdentityWcdma.psc;
3589 cellIdentity.cellIdentityWcdma[0].uarfcn = rilCellIdentity.cellIdentityWcdma.uarfcn;
3590 break;
3591 }
3592
3593 case RIL_CELL_INFO_TYPE_CDMA: {
3594 cellIdentity.cellIdentityCdma.resize(1);
3595 cellIdentity.cellIdentityCdma[0].networkId = rilCellIdentity.cellIdentityCdma.networkId;
3596 cellIdentity.cellIdentityCdma[0].systemId = rilCellIdentity.cellIdentityCdma.systemId;
3597 cellIdentity.cellIdentityCdma[0].baseStationId =
3598 rilCellIdentity.cellIdentityCdma.basestationId;
3599 cellIdentity.cellIdentityCdma[0].longitude = rilCellIdentity.cellIdentityCdma.longitude;
3600 cellIdentity.cellIdentityCdma[0].latitude = rilCellIdentity.cellIdentityCdma.latitude;
3601 break;
3602 }
3603
3604 case RIL_CELL_INFO_TYPE_LTE: {
3605 cellIdentity.cellIdentityLte.resize(1);
3606 cellIdentity.cellIdentityLte[0].mcc =
3607 std::to_string(rilCellIdentity.cellIdentityLte.mcc);
3608 cellIdentity.cellIdentityLte[0].mnc =
3609 std::to_string(rilCellIdentity.cellIdentityLte.mnc);
3610 cellIdentity.cellIdentityLte[0].ci = rilCellIdentity.cellIdentityLte.ci;
3611 cellIdentity.cellIdentityLte[0].pci = rilCellIdentity.cellIdentityLte.pci;
3612 cellIdentity.cellIdentityLte[0].tac = rilCellIdentity.cellIdentityLte.tac;
3613 cellIdentity.cellIdentityLte[0].earfcn = rilCellIdentity.cellIdentityLte.earfcn;
3614 break;
3615 }
3616
3617 case RIL_CELL_INFO_TYPE_TD_SCDMA: {
3618 cellIdentity.cellIdentityTdscdma.resize(1);
3619 cellIdentity.cellIdentityTdscdma[0].mcc =
3620 std::to_string(rilCellIdentity.cellIdentityTdscdma.mcc);
3621 cellIdentity.cellIdentityTdscdma[0].mnc =
3622 std::to_string(rilCellIdentity.cellIdentityTdscdma.mnc);
3623 cellIdentity.cellIdentityTdscdma[0].lac = rilCellIdentity.cellIdentityTdscdma.lac;
3624 cellIdentity.cellIdentityTdscdma[0].cid = rilCellIdentity.cellIdentityTdscdma.cid;
3625 cellIdentity.cellIdentityTdscdma[0].cpid = rilCellIdentity.cellIdentityTdscdma.cpid;
3626 break;
3627 }
3628
3629 default: {
3630 break;
3631 }
3632 }
3633}
3634
3635int convertResponseStringEntryToInt(char **response, int index, int numStrings) {
3636 if ((response != NULL) && (numStrings > index) && (response[index] != NULL)) {
3637 return atoi(response[index]);
3638 }
3639
3640 return -1;
3641}
3642
Sooraj Sasindran758ee462017-06-07 16:30:18 -07003643int convertResponseHexStringEntryToInt(char **response, int index, int numStrings) {
3644 const int hexBase = 16;
3645 if ((response != NULL) && (numStrings > index) && (response[index] != NULL)) {
3646 return strtol(response[index], NULL, hexBase);
3647 }
3648
3649 return -1;
3650}
3651
3652/* Fill Cell Identity info from Voice Registration State Response.
3653 * This fucntion is applicable only for RIL Version < 15.
3654 * Response is a "char **".
3655 * First and Second entries are in hex string format
3656 * and rest are integers represented in ascii format. */
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003657void fillCellIdentityFromVoiceRegStateResponseString(CellIdentity &cellIdentity,
3658 int numStrings, char** response) {
3659
3660 RIL_CellIdentity_v16 rilCellIdentity;
Jack Yu8e732d42017-04-14 00:08:06 -07003661 memset(&rilCellIdentity, -1, sizeof(RIL_CellIdentity_v16));
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003662
3663 rilCellIdentity.cellInfoType = getCellInfoTypeRadioTechnology(response[3]);
3664 switch(rilCellIdentity.cellInfoType) {
3665
3666 case RIL_CELL_INFO_TYPE_GSM: {
Sooraj Sasindran758ee462017-06-07 16:30:18 -07003667 /* valid LAC are hexstrings in the range 0x0000 - 0xffff */
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003668 rilCellIdentity.cellIdentityGsm.lac =
Sooraj Sasindran758ee462017-06-07 16:30:18 -07003669 convertResponseHexStringEntryToInt(response, 1, numStrings);
3670
3671 /* valid CID are hexstrings in the range 0x00000000 - 0xffffffff */
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003672 rilCellIdentity.cellIdentityGsm.cid =
Sooraj Sasindran758ee462017-06-07 16:30:18 -07003673 convertResponseHexStringEntryToInt(response, 2, numStrings);
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003674 break;
3675 }
3676
3677 case RIL_CELL_INFO_TYPE_WCDMA: {
Sooraj Sasindran758ee462017-06-07 16:30:18 -07003678 /* valid LAC are hexstrings in the range 0x0000 - 0xffff */
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003679 rilCellIdentity.cellIdentityWcdma.lac =
Sooraj Sasindran758ee462017-06-07 16:30:18 -07003680 convertResponseHexStringEntryToInt(response, 1, numStrings);
3681
3682 /* valid CID are hexstrings in the range 0x00000000 - 0xffffffff */
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003683 rilCellIdentity.cellIdentityWcdma.cid =
Sooraj Sasindran758ee462017-06-07 16:30:18 -07003684 convertResponseHexStringEntryToInt(response, 2, numStrings);
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003685 rilCellIdentity.cellIdentityWcdma.psc =
3686 convertResponseStringEntryToInt(response, 14, numStrings);
3687 break;
3688 }
3689
3690 case RIL_CELL_INFO_TYPE_TD_SCDMA:{
Sooraj Sasindran758ee462017-06-07 16:30:18 -07003691 /* valid LAC are hexstrings in the range 0x0000 - 0xffff */
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003692 rilCellIdentity.cellIdentityTdscdma.lac =
Sooraj Sasindran758ee462017-06-07 16:30:18 -07003693 convertResponseHexStringEntryToInt(response, 1, numStrings);
3694
3695 /* valid CID are hexstrings in the range 0x00000000 - 0xffffffff */
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003696 rilCellIdentity.cellIdentityTdscdma.cid =
Sooraj Sasindran758ee462017-06-07 16:30:18 -07003697 convertResponseHexStringEntryToInt(response, 2, numStrings);
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003698 break;
3699 }
3700
3701 case RIL_CELL_INFO_TYPE_CDMA:{
3702 rilCellIdentity.cellIdentityCdma.basestationId =
3703 convertResponseStringEntryToInt(response, 4, numStrings);
Nathan Harold35afd642017-07-07 17:12:04 -07003704 /* Order of Lat. and Long. swapped between RIL and HIDL interface versions. */
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003705 rilCellIdentity.cellIdentityCdma.latitude =
Nathan Harold35afd642017-07-07 17:12:04 -07003706 convertResponseStringEntryToInt(response, 5, numStrings);
3707 rilCellIdentity.cellIdentityCdma.longitude =
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003708 convertResponseStringEntryToInt(response, 6, numStrings);
3709 rilCellIdentity.cellIdentityCdma.systemId =
3710 convertResponseStringEntryToInt(response, 8, numStrings);
3711 rilCellIdentity.cellIdentityCdma.networkId =
3712 convertResponseStringEntryToInt(response, 9, numStrings);
3713 break;
3714 }
3715
Sooraj Sasindranf28e42a2017-03-06 23:07:22 -08003716 case RIL_CELL_INFO_TYPE_LTE:{
Sooraj Sasindran758ee462017-06-07 16:30:18 -07003717 /* valid TAC are hexstrings in the range 0x0000 - 0xffff */
Sooraj Sasindranf28e42a2017-03-06 23:07:22 -08003718 rilCellIdentity.cellIdentityLte.tac =
Sooraj Sasindran758ee462017-06-07 16:30:18 -07003719 convertResponseHexStringEntryToInt(response, 1, numStrings);
3720
3721 /* valid CID are hexstrings in the range 0x00000000 - 0xffffffff */
Sooraj Sasindranf28e42a2017-03-06 23:07:22 -08003722 rilCellIdentity.cellIdentityLte.ci =
Sooraj Sasindran758ee462017-06-07 16:30:18 -07003723 convertResponseHexStringEntryToInt(response, 2, numStrings);
Sooraj Sasindranf28e42a2017-03-06 23:07:22 -08003724 break;
3725 }
3726
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003727 default: {
3728 break;
3729 }
3730 }
3731
3732 fillCellIdentityResponse(cellIdentity, rilCellIdentity);
3733}
3734
Sooraj Sasindran758ee462017-06-07 16:30:18 -07003735/* Fill Cell Identity info from Data Registration State Response.
3736 * This fucntion is applicable only for RIL Version < 15.
3737 * Response is a "char **".
3738 * First and Second entries are in hex string format
3739 * and rest are integers represented in ascii format. */
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003740void fillCellIdentityFromDataRegStateResponseString(CellIdentity &cellIdentity,
3741 int numStrings, char** response) {
3742
3743 RIL_CellIdentity_v16 rilCellIdentity;
Jack Yu8e732d42017-04-14 00:08:06 -07003744 memset(&rilCellIdentity, -1, sizeof(RIL_CellIdentity_v16));
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003745
3746 rilCellIdentity.cellInfoType = getCellInfoTypeRadioTechnology(response[3]);
3747 switch(rilCellIdentity.cellInfoType) {
3748 case RIL_CELL_INFO_TYPE_GSM: {
Sooraj Sasindran758ee462017-06-07 16:30:18 -07003749 /* valid LAC are hexstrings in the range 0x0000 - 0xffff */
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003750 rilCellIdentity.cellIdentityGsm.lac =
Sooraj Sasindran758ee462017-06-07 16:30:18 -07003751 convertResponseHexStringEntryToInt(response, 1, numStrings);
3752
3753 /* valid CID are hexstrings in the range 0x00000000 - 0xffffffff */
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003754 rilCellIdentity.cellIdentityGsm.cid =
Sooraj Sasindran758ee462017-06-07 16:30:18 -07003755 convertResponseHexStringEntryToInt(response, 2, numStrings);
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003756 break;
3757 }
3758 case RIL_CELL_INFO_TYPE_WCDMA: {
Sooraj Sasindran758ee462017-06-07 16:30:18 -07003759 /* valid LAC are hexstrings in the range 0x0000 - 0xffff */
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003760 rilCellIdentity.cellIdentityWcdma.lac =
Sooraj Sasindran758ee462017-06-07 16:30:18 -07003761 convertResponseHexStringEntryToInt(response, 1, numStrings);
3762
3763 /* valid CID are hexstrings in the range 0x00000000 - 0xffffffff */
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003764 rilCellIdentity.cellIdentityWcdma.cid =
Sooraj Sasindran758ee462017-06-07 16:30:18 -07003765 convertResponseHexStringEntryToInt(response, 2, numStrings);
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003766 break;
3767 }
3768 case RIL_CELL_INFO_TYPE_TD_SCDMA:{
Sooraj Sasindran758ee462017-06-07 16:30:18 -07003769 /* valid LAC are hexstrings in the range 0x0000 - 0xffff */
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003770 rilCellIdentity.cellIdentityTdscdma.lac =
Sooraj Sasindran758ee462017-06-07 16:30:18 -07003771 convertResponseHexStringEntryToInt(response, 1, numStrings);
3772
3773 /* valid CID are hexstrings in the range 0x00000000 - 0xffffffff */
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003774 rilCellIdentity.cellIdentityTdscdma.cid =
Sooraj Sasindran758ee462017-06-07 16:30:18 -07003775 convertResponseHexStringEntryToInt(response, 2, numStrings);
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003776 break;
3777 }
3778 case RIL_CELL_INFO_TYPE_LTE: {
3779 rilCellIdentity.cellIdentityLte.tac =
3780 convertResponseStringEntryToInt(response, 6, numStrings);
3781 rilCellIdentity.cellIdentityLte.pci =
3782 convertResponseStringEntryToInt(response, 7, numStrings);
3783 rilCellIdentity.cellIdentityLte.ci =
3784 convertResponseStringEntryToInt(response, 8, numStrings);
3785 break;
3786 }
3787 default: {
3788 break;
3789 }
3790 }
3791
3792 fillCellIdentityResponse(cellIdentity, rilCellIdentity);
3793}
3794
Amit Mahajan759786a2017-03-03 17:35:47 -08003795int radio::getVoiceRegistrationStateResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003796 int responseType, int serial, RIL_Errno e,
3797 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003798#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003799 RLOGD("getVoiceRegistrationStateResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003800#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003801
3802 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003803 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003804 populateResponseInfo(responseInfo, serial, responseType, e);
3805
Jack Yuf68e0da2017-02-07 14:53:09 -08003806 VoiceRegStateResult voiceRegResponse = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003807 int numStrings = responseLen / sizeof(char *);
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003808 if (response == NULL) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003809 RLOGE("getVoiceRegistrationStateResponse Invalid response: NULL");
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003810 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
3811 } else if (s_vendorFunctions->version <= 14) {
3812 if (numStrings != 15) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003813 RLOGE("getVoiceRegistrationStateResponse Invalid response: NULL");
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003814 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
3815 } else {
3816 char **resp = (char **) response;
3817 voiceRegResponse.regState = (RegState) ATOI_NULL_HANDLED_DEF(resp[0], 4);
3818 voiceRegResponse.rat = ATOI_NULL_HANDLED(resp[3]);
3819 voiceRegResponse.cssSupported = ATOI_NULL_HANDLED_DEF(resp[7], 0);
3820 voiceRegResponse.roamingIndicator = ATOI_NULL_HANDLED(resp[10]);
3821 voiceRegResponse.systemIsInPrl = ATOI_NULL_HANDLED_DEF(resp[11], 0);
3822 voiceRegResponse.defaultRoamingIndicator = ATOI_NULL_HANDLED_DEF(resp[12], 0);
3823 voiceRegResponse.reasonForDenial = ATOI_NULL_HANDLED_DEF(resp[13], 0);
3824 fillCellIdentityFromVoiceRegStateResponseString(voiceRegResponse.cellIdentity,
3825 numStrings, resp);
3826 }
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003827 } else {
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003828 RIL_VoiceRegistrationStateResponse *voiceRegState =
3829 (RIL_VoiceRegistrationStateResponse *)response;
3830
3831 if (responseLen != sizeof(RIL_VoiceRegistrationStateResponse)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003832 RLOGE("getVoiceRegistrationStateResponse Invalid response: NULL");
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003833 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
3834 } else {
3835 voiceRegResponse.regState = (RegState) voiceRegState->regState;
3836 voiceRegResponse.rat = voiceRegState->rat;;
3837 voiceRegResponse.cssSupported = voiceRegState->cssSupported;
3838 voiceRegResponse.roamingIndicator = voiceRegState->roamingIndicator;
3839 voiceRegResponse.systemIsInPrl = voiceRegState->systemIsInPrl;
3840 voiceRegResponse.defaultRoamingIndicator = voiceRegState->defaultRoamingIndicator;
3841 voiceRegResponse.reasonForDenial = voiceRegState->reasonForDenial;
3842 fillCellIdentityResponse(voiceRegResponse.cellIdentity,
3843 voiceRegState->cellIdentity);
3844 }
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003845 }
3846
3847 Return<void> retStatus =
3848 radioService[slotId]->mRadioResponse->getVoiceRegistrationStateResponse(
3849 responseInfo, voiceRegResponse);
3850 radioService[slotId]->checkReturnStatus(retStatus);
3851 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003852 RLOGE("getVoiceRegistrationStateResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003853 slotId);
3854 }
3855
3856 return 0;
3857}
3858
Amit Mahajan759786a2017-03-03 17:35:47 -08003859int radio::getDataRegistrationStateResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003860 int responseType, int serial, RIL_Errno e,
3861 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003862#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003863 RLOGD("getDataRegistrationStateResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003864#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003865
3866 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003867 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003868 populateResponseInfo(responseInfo, serial, responseType, e);
Jack Yuf68e0da2017-02-07 14:53:09 -08003869 DataRegStateResult dataRegResponse = {};
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003870 if (response == NULL) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003871 RLOGE("getDataRegistrationStateResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003872 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003873 } else if (s_vendorFunctions->version <= 14) {
3874 int numStrings = responseLen / sizeof(char *);
3875 if ((numStrings != 6) && (numStrings != 11)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003876 RLOGE("getDataRegistrationStateResponse Invalid response: NULL");
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003877 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
3878 } else {
3879 char **resp = (char **) response;
3880 dataRegResponse.regState = (RegState) ATOI_NULL_HANDLED_DEF(resp[0], 4);
3881 dataRegResponse.rat = ATOI_NULL_HANDLED_DEF(resp[3], 0);
3882 dataRegResponse.reasonDataDenied = ATOI_NULL_HANDLED(resp[4]);
3883 dataRegResponse.maxDataCalls = ATOI_NULL_HANDLED_DEF(resp[5], 1);
3884 fillCellIdentityFromDataRegStateResponseString(dataRegResponse.cellIdentity,
3885 numStrings, resp);
3886 }
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003887 } else {
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003888 RIL_DataRegistrationStateResponse *dataRegState =
3889 (RIL_DataRegistrationStateResponse *)response;
3890
3891 if (responseLen != sizeof(RIL_DataRegistrationStateResponse)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003892 RLOGE("getDataRegistrationStateResponse Invalid response: NULL");
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003893 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
3894 } else {
3895 dataRegResponse.regState = (RegState) dataRegState->regState;
3896 dataRegResponse.rat = dataRegState->rat;;
3897 dataRegResponse.reasonDataDenied = dataRegState->reasonDataDenied;
3898 dataRegResponse.maxDataCalls = dataRegState->maxDataCalls;
3899 fillCellIdentityResponse(dataRegResponse.cellIdentity, dataRegState->cellIdentity);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003900 }
3901 }
3902
3903 Return<void> retStatus =
3904 radioService[slotId]->mRadioResponse->getDataRegistrationStateResponse(responseInfo,
3905 dataRegResponse);
3906 radioService[slotId]->checkReturnStatus(retStatus);
3907 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003908 RLOGE("getDataRegistrationStateResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003909 slotId);
3910 }
3911
3912 return 0;
3913}
3914
Amit Mahajan759786a2017-03-03 17:35:47 -08003915int radio::getOperatorResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003916 int responseType, int serial, RIL_Errno e, void *response,
3917 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003918#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003919 RLOGD("getOperatorResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003920#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003921
3922 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003923 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003924 populateResponseInfo(responseInfo, serial, responseType, e);
3925 hidl_string longName;
3926 hidl_string shortName;
3927 hidl_string numeric;
3928 int numStrings = responseLen / sizeof(char *);
3929 if (response == NULL || numStrings != 3) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003930 RLOGE("getOperatorResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003931 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
3932
3933 } else {
3934 char **resp = (char **) response;
3935 longName = convertCharPtrToHidlString(resp[0]);
3936 shortName = convertCharPtrToHidlString(resp[1]);
3937 numeric = convertCharPtrToHidlString(resp[2]);
3938 }
3939 Return<void> retStatus = radioService[slotId]->mRadioResponse->getOperatorResponse(
3940 responseInfo, longName, shortName, numeric);
3941 radioService[slotId]->checkReturnStatus(retStatus);
3942 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003943 RLOGE("getOperatorResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003944 slotId);
3945 }
3946
3947 return 0;
3948}
3949
Amit Mahajan759786a2017-03-03 17:35:47 -08003950int radio::setRadioPowerResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003951 int responseType, int serial, RIL_Errno e, void *response,
3952 size_t responseLen) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003953 RLOGD("setRadioPowerResponse: serial %d", serial);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003954
3955 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003956 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003957 populateResponseInfo(responseInfo, serial, responseType, e);
3958 Return<void> retStatus = radioService[slotId]->mRadioResponse->setRadioPowerResponse(
3959 responseInfo);
3960 radioService[slotId]->checkReturnStatus(retStatus);
3961 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003962 RLOGE("setRadioPowerResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003963 slotId);
3964 }
3965
3966 return 0;
3967}
3968
Amit Mahajan759786a2017-03-03 17:35:47 -08003969int radio::sendDtmfResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003970 int responseType, int serial, RIL_Errno e, void *response,
3971 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003972#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003973 RLOGD("sendDtmfResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003974#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003975
3976 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003977 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003978 populateResponseInfo(responseInfo, serial, responseType, e);
3979 Return<void> retStatus = radioService[slotId]->mRadioResponse->sendDtmfResponse(
3980 responseInfo);
3981 radioService[slotId]->checkReturnStatus(retStatus);
3982 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003983 RLOGE("sendDtmfResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003984 slotId);
3985 }
3986
3987 return 0;
3988}
3989
3990SendSmsResult makeSendSmsResult(RadioResponseInfo& responseInfo, int serial, int responseType,
3991 RIL_Errno e, void *response, size_t responseLen) {
3992 populateResponseInfo(responseInfo, serial, responseType, e);
Jack Yuf68e0da2017-02-07 14:53:09 -08003993 SendSmsResult result = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003994
3995 if (response == NULL || responseLen != sizeof(RIL_SMS_Response)) {
3996 RLOGE("Invalid response: NULL");
3997 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003998 result.ackPDU = hidl_string();
3999 } else {
4000 RIL_SMS_Response *resp = (RIL_SMS_Response *) response;
4001 result.messageRef = resp->messageRef;
4002 result.ackPDU = convertCharPtrToHidlString(resp->ackPDU);
4003 result.errorCode = resp->errorCode;
4004 }
4005 return result;
4006}
4007
Amit Mahajan759786a2017-03-03 17:35:47 -08004008int radio::sendSmsResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004009 int responseType, int serial, RIL_Errno e, void *response,
4010 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004011#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004012 RLOGD("sendSmsResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004013#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004014
4015 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004016 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004017 SendSmsResult result = makeSendSmsResult(responseInfo, serial, responseType, e, response,
4018 responseLen);
4019
4020 Return<void> retStatus = radioService[slotId]->mRadioResponse->sendSmsResponse(responseInfo,
4021 result);
4022 radioService[slotId]->checkReturnStatus(retStatus);
4023 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004024 RLOGE("sendSmsResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004025 }
4026
4027 return 0;
4028}
4029
Amit Mahajan759786a2017-03-03 17:35:47 -08004030int radio::sendSMSExpectMoreResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004031 int responseType, int serial, RIL_Errno e, void *response,
4032 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004033#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004034 RLOGD("sendSMSExpectMoreResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004035#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004036
4037 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004038 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004039 SendSmsResult result = makeSendSmsResult(responseInfo, serial, responseType, e, response,
4040 responseLen);
4041
4042 Return<void> retStatus = radioService[slotId]->mRadioResponse->sendSMSExpectMoreResponse(
4043 responseInfo, result);
4044 radioService[slotId]->checkReturnStatus(retStatus);
4045 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004046 RLOGE("sendSMSExpectMoreResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004047 }
4048
4049 return 0;
4050}
4051
Amit Mahajan759786a2017-03-03 17:35:47 -08004052int radio::setupDataCallResponse(int slotId,
Amit Mahajan3df62912017-02-10 01:35:55 +00004053 int responseType, int serial, RIL_Errno e, void *response,
4054 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004055#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004056 RLOGD("setupDataCallResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004057#endif
Amit Mahajan3df62912017-02-10 01:35:55 +00004058
4059 if (radioService[slotId]->mRadioResponse != NULL) {
Amit Mahajan3da9ac02017-02-13 13:41:28 -08004060 RadioResponseInfo responseInfo = {};
Amit Mahajan3df62912017-02-10 01:35:55 +00004061 populateResponseInfo(responseInfo, serial, responseType, e);
4062
Amit Mahajan3da9ac02017-02-13 13:41:28 -08004063 SetupDataCallResult result = {};
Amit Mahajan13058cb2017-06-07 23:10:27 -07004064 if (response == NULL || (responseLen % sizeof(RIL_Data_Call_Response_v11)) != 0) {
4065 if (response != NULL) {
4066 RLOGE("setupDataCallResponse: Invalid response");
4067 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
4068 }
Jack Yu5079e182017-02-28 15:21:18 -08004069 result.status = DataCallFailCause::ERROR_UNSPECIFIED;
Amit Mahajan3da9ac02017-02-13 13:41:28 -08004070 result.type = hidl_string();
4071 result.ifname = hidl_string();
4072 result.addresses = hidl_string();
4073 result.dnses = hidl_string();
4074 result.gateways = hidl_string();
4075 result.pcscf = hidl_string();
Amit Mahajan3df62912017-02-10 01:35:55 +00004076 } else {
4077 convertRilDataCallToHal((RIL_Data_Call_Response_v11 *) response, result);
4078 }
4079
4080 Return<void> retStatus = radioService[slotId]->mRadioResponse->setupDataCallResponse(
4081 responseInfo, result);
4082 radioService[slotId]->checkReturnStatus(retStatus);
4083 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004084 RLOGE("setupDataCallResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Amit Mahajan3df62912017-02-10 01:35:55 +00004085 }
4086
4087 return 0;
4088}
4089
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004090IccIoResult responseIccIo(RadioResponseInfo& responseInfo, int serial, int responseType,
4091 RIL_Errno e, void *response, size_t responseLen) {
4092 populateResponseInfo(responseInfo, serial, responseType, e);
Jack Yuf68e0da2017-02-07 14:53:09 -08004093 IccIoResult result = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004094
4095 if (response == NULL || responseLen != sizeof(RIL_SIM_IO_Response)) {
4096 RLOGE("Invalid response: NULL");
4097 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004098 result.simResponse = hidl_string();
4099 } else {
4100 RIL_SIM_IO_Response *resp = (RIL_SIM_IO_Response *) response;
4101 result.sw1 = resp->sw1;
4102 result.sw2 = resp->sw2;
4103 result.simResponse = convertCharPtrToHidlString(resp->simResponse);
4104 }
4105 return result;
4106}
4107
Amit Mahajan759786a2017-03-03 17:35:47 -08004108int radio::iccIOForAppResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004109 int responseType, int serial, RIL_Errno e, void *response,
4110 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004111#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004112 RLOGD("iccIOForAppResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004113#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004114
4115 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004116 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004117 IccIoResult result = responseIccIo(responseInfo, serial, responseType, e, response,
4118 responseLen);
4119
4120 Return<void> retStatus = radioService[slotId]->mRadioResponse->iccIOForAppResponse(
4121 responseInfo, result);
4122 radioService[slotId]->checkReturnStatus(retStatus);
4123 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004124 RLOGE("iccIOForAppResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004125 }
4126
4127 return 0;
4128}
4129
Amit Mahajan759786a2017-03-03 17:35:47 -08004130int radio::sendUssdResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004131 int responseType, int serial, RIL_Errno e, void *response,
4132 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004133#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004134 RLOGD("sendUssdResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004135#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004136
4137 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004138 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004139 populateResponseInfo(responseInfo, serial, responseType, e);
4140 Return<void> retStatus = radioService[slotId]->mRadioResponse->sendUssdResponse(
4141 responseInfo);
4142 radioService[slotId]->checkReturnStatus(retStatus);
4143 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004144 RLOGE("sendUssdResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004145 slotId);
4146 }
4147
4148 return 0;
4149}
4150
Amit Mahajan759786a2017-03-03 17:35:47 -08004151int radio::cancelPendingUssdResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004152 int responseType, int serial, RIL_Errno e, void *response,
4153 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004154#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004155 RLOGD("cancelPendingUssdResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004156#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004157
4158 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004159 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004160 populateResponseInfo(responseInfo, serial, responseType, e);
4161 Return<void> retStatus = radioService[slotId]->mRadioResponse->cancelPendingUssdResponse(
4162 responseInfo);
4163 radioService[slotId]->checkReturnStatus(retStatus);
4164 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004165 RLOGE("cancelPendingUssdResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004166 slotId);
4167 }
4168
4169 return 0;
4170}
4171
Amit Mahajan759786a2017-03-03 17:35:47 -08004172int radio::getClirResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004173 int responseType, int serial, RIL_Errno e, void *response,
4174 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004175#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004176 RLOGD("getClirResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004177#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004178
4179 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004180 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004181 populateResponseInfo(responseInfo, serial, responseType, e);
4182 int n = -1, m = -1;
4183 int numInts = responseLen / sizeof(int);
4184 if (response == NULL || numInts != 2) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004185 RLOGE("getClirResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004186 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
4187 } else {
4188 int *pInt = (int *) response;
4189 n = pInt[0];
4190 m = pInt[1];
4191 }
4192 Return<void> retStatus = radioService[slotId]->mRadioResponse->getClirResponse(responseInfo,
4193 n, m);
4194 radioService[slotId]->checkReturnStatus(retStatus);
4195 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004196 RLOGE("getClirResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004197 }
4198
4199 return 0;
4200}
4201
Amit Mahajan759786a2017-03-03 17:35:47 -08004202int radio::setClirResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004203 int responseType, int serial, RIL_Errno e, void *response,
4204 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004205#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004206 RLOGD("setClirResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004207#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004208
4209 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004210 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004211 populateResponseInfo(responseInfo, serial, responseType, e);
4212 Return<void> retStatus = radioService[slotId]->mRadioResponse->setClirResponse(
4213 responseInfo);
4214 radioService[slotId]->checkReturnStatus(retStatus);
4215 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004216 RLOGE("setClirResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004217 }
4218
4219 return 0;
4220}
4221
Amit Mahajan759786a2017-03-03 17:35:47 -08004222int radio::getCallForwardStatusResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004223 int responseType, int serial, RIL_Errno e,
4224 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004225#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004226 RLOGD("getCallForwardStatusResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004227#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004228
4229 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004230 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004231 populateResponseInfo(responseInfo, serial, responseType, e);
4232 hidl_vec<CallForwardInfo> callForwardInfos;
4233
Amit Mahajan13058cb2017-06-07 23:10:27 -07004234 if ((response == NULL && responseLen != 0)
4235 || responseLen % sizeof(RIL_CallForwardInfo *) != 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004236 RLOGE("getCallForwardStatusResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004237 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
4238 } else {
4239 int num = responseLen / sizeof(RIL_CallForwardInfo *);
4240 callForwardInfos.resize(num);
4241 for (int i = 0 ; i < num; i++) {
4242 RIL_CallForwardInfo *resp = ((RIL_CallForwardInfo **) response)[i];
4243 callForwardInfos[i].status = (CallForwardInfoStatus) resp->status;
4244 callForwardInfos[i].reason = resp->reason;
4245 callForwardInfos[i].serviceClass = resp->serviceClass;
4246 callForwardInfos[i].toa = resp->toa;
4247 callForwardInfos[i].number = convertCharPtrToHidlString(resp->number);
4248 callForwardInfos[i].timeSeconds = resp->timeSeconds;
4249 }
4250 }
4251
4252 Return<void> retStatus = radioService[slotId]->mRadioResponse->getCallForwardStatusResponse(
4253 responseInfo, callForwardInfos);
4254 radioService[slotId]->checkReturnStatus(retStatus);
4255 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004256 RLOGE("getCallForwardStatusResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004257 slotId);
4258 }
4259
4260 return 0;
4261}
4262
Amit Mahajan759786a2017-03-03 17:35:47 -08004263int radio::setCallForwardResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004264 int responseType, int serial, RIL_Errno e, void *response,
4265 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004266#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004267 RLOGD("setCallForwardResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004268#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004269
4270 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004271 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004272 populateResponseInfo(responseInfo, serial, responseType, e);
4273 Return<void> retStatus = radioService[slotId]->mRadioResponse->setCallForwardResponse(
4274 responseInfo);
4275 radioService[slotId]->checkReturnStatus(retStatus);
4276 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004277 RLOGE("setCallForwardResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004278 }
4279
4280 return 0;
4281}
4282
Amit Mahajan759786a2017-03-03 17:35:47 -08004283int radio::getCallWaitingResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004284 int responseType, int serial, RIL_Errno e, void *response,
4285 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004286#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004287 RLOGD("getCallWaitingResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004288#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004289
4290 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004291 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004292 populateResponseInfo(responseInfo, serial, responseType, e);
4293 bool enable = false;
4294 int serviceClass = -1;
4295 int numInts = responseLen / sizeof(int);
4296 if (response == NULL || numInts != 2) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004297 RLOGE("getCallWaitingResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004298 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
4299 } else {
4300 int *pInt = (int *) response;
4301 enable = pInt[0] == 1 ? true : false;
4302 serviceClass = pInt[1];
4303 }
Sanket Padawe5375bfa2017-03-07 17:21:05 -08004304 Return<void> retStatus = radioService[slotId]->mRadioResponse->getCallWaitingResponse(
4305 responseInfo, enable, serviceClass);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004306 radioService[slotId]->checkReturnStatus(retStatus);
4307 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004308 RLOGE("getCallWaitingResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004309 }
4310
4311 return 0;
4312}
4313
Amit Mahajan759786a2017-03-03 17:35:47 -08004314int radio::setCallWaitingResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004315 int responseType, int serial, RIL_Errno e, void *response,
4316 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004317#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004318 RLOGD("setCallWaitingResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004319#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004320
4321 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004322 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004323 populateResponseInfo(responseInfo, serial, responseType, e);
4324 Return<void> retStatus = radioService[slotId]->mRadioResponse->setCallWaitingResponse(
4325 responseInfo);
4326 radioService[slotId]->checkReturnStatus(retStatus);
4327 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004328 RLOGE("setCallWaitingResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004329 }
4330
4331 return 0;
4332}
4333
Amit Mahajan759786a2017-03-03 17:35:47 -08004334int radio::acknowledgeLastIncomingGsmSmsResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004335 int responseType, int serial, RIL_Errno e,
4336 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004337#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004338 RLOGD("acknowledgeLastIncomingGsmSmsResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004339#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004340
4341 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004342 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004343 populateResponseInfo(responseInfo, serial, responseType, e);
4344 Return<void> retStatus =
4345 radioService[slotId]->mRadioResponse->acknowledgeLastIncomingGsmSmsResponse(
4346 responseInfo);
4347 radioService[slotId]->checkReturnStatus(retStatus);
4348 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004349 RLOGE("acknowledgeLastIncomingGsmSmsResponse: radioService[%d]->mRadioResponse "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004350 "== NULL", slotId);
4351 }
4352
4353 return 0;
4354}
4355
Amit Mahajan759786a2017-03-03 17:35:47 -08004356int radio::acceptCallResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004357 int responseType, int serial, RIL_Errno e,
4358 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004359#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004360 RLOGD("acceptCallResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004361#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004362
4363 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004364 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004365 populateResponseInfo(responseInfo, serial, responseType, e);
4366 Return<void> retStatus = radioService[slotId]->mRadioResponse->acceptCallResponse(
4367 responseInfo);
4368 radioService[slotId]->checkReturnStatus(retStatus);
4369 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004370 RLOGE("acceptCallResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004371 slotId);
4372 }
4373
4374 return 0;
4375}
4376
Amit Mahajan759786a2017-03-03 17:35:47 -08004377int radio::deactivateDataCallResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004378 int responseType, int serial, RIL_Errno e,
4379 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004380#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004381 RLOGD("deactivateDataCallResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004382#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004383
4384 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004385 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004386 populateResponseInfo(responseInfo, serial, responseType, e);
4387 Return<void> retStatus = radioService[slotId]->mRadioResponse->deactivateDataCallResponse(
4388 responseInfo);
4389 radioService[slotId]->checkReturnStatus(retStatus);
4390 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004391 RLOGE("deactivateDataCallResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004392 slotId);
4393 }
4394
4395 return 0;
4396}
4397
Amit Mahajan759786a2017-03-03 17:35:47 -08004398int radio::getFacilityLockForAppResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004399 int responseType, int serial, RIL_Errno e,
4400 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004401#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004402 RLOGD("getFacilityLockForAppResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004403#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004404
4405 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004406 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004407 int ret = responseInt(responseInfo, serial, responseType, e, response, responseLen);
4408 Return<void> retStatus = radioService[slotId]->mRadioResponse->
4409 getFacilityLockForAppResponse(responseInfo, ret);
4410 radioService[slotId]->checkReturnStatus(retStatus);
4411 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004412 RLOGE("getFacilityLockForAppResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004413 slotId);
4414 }
4415
4416 return 0;
4417}
4418
Amit Mahajan759786a2017-03-03 17:35:47 -08004419int radio::setFacilityLockForAppResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004420 int responseType, int serial, RIL_Errno e,
4421 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004422#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004423 RLOGD("setFacilityLockForAppResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004424#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004425
4426 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004427 RadioResponseInfo responseInfo = {};
Naveen Kalla346bbc02017-03-16 12:55:55 -07004428 int ret = responseIntOrEmpty(responseInfo, serial, responseType, e, response, responseLen);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004429 Return<void> retStatus
4430 = radioService[slotId]->mRadioResponse->setFacilityLockForAppResponse(responseInfo,
4431 ret);
4432 radioService[slotId]->checkReturnStatus(retStatus);
4433 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004434 RLOGE("setFacilityLockForAppResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004435 slotId);
4436 }
4437
4438 return 0;
4439}
4440
Amit Mahajan759786a2017-03-03 17:35:47 -08004441int radio::setBarringPasswordResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004442 int responseType, int serial, RIL_Errno e,
4443 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004444#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004445 RLOGD("acceptCallResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004446#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004447
4448 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004449 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004450 populateResponseInfo(responseInfo, serial, responseType, e);
4451 Return<void> retStatus
4452 = radioService[slotId]->mRadioResponse->setBarringPasswordResponse(responseInfo);
4453 radioService[slotId]->checkReturnStatus(retStatus);
4454 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004455 RLOGE("setBarringPasswordResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004456 slotId);
4457 }
4458
4459 return 0;
4460}
4461
Amit Mahajan759786a2017-03-03 17:35:47 -08004462int radio::getNetworkSelectionModeResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004463 int responseType, int serial, RIL_Errno e, void *response,
4464 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004465#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004466 RLOGD("getNetworkSelectionModeResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004467#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004468
4469 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004470 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004471 populateResponseInfo(responseInfo, serial, responseType, e);
4472 bool manual = false;
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004473 if (response == NULL || responseLen != sizeof(int)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004474 RLOGE("getNetworkSelectionModeResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004475 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
4476 } else {
4477 int *pInt = (int *) response;
4478 manual = pInt[0] == 1 ? true : false;
4479 }
4480 Return<void> retStatus
4481 = radioService[slotId]->mRadioResponse->getNetworkSelectionModeResponse(
4482 responseInfo,
4483 manual);
4484 radioService[slotId]->checkReturnStatus(retStatus);
4485 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004486 RLOGE("getNetworkSelectionModeResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004487 slotId);
4488 }
4489
4490 return 0;
4491}
4492
Amit Mahajan759786a2017-03-03 17:35:47 -08004493int radio::setNetworkSelectionModeAutomaticResponse(int slotId, int responseType, int serial,
4494 RIL_Errno e, void *response,
4495 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004496#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004497 RLOGD("setNetworkSelectionModeAutomaticResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004498#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004499
4500 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004501 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004502 populateResponseInfo(responseInfo, serial, responseType, e);
4503 Return<void> retStatus
4504 = radioService[slotId]->mRadioResponse->setNetworkSelectionModeAutomaticResponse(
4505 responseInfo);
4506 radioService[slotId]->checkReturnStatus(retStatus);
4507 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004508 RLOGE("setNetworkSelectionModeAutomaticResponse: radioService[%d]->mRadioResponse "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004509 "== NULL", slotId);
4510 }
4511
4512 return 0;
4513}
4514
Amit Mahajan759786a2017-03-03 17:35:47 -08004515int radio::setNetworkSelectionModeManualResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004516 int responseType, int serial, RIL_Errno e,
4517 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004518#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004519 RLOGD("setNetworkSelectionModeManualResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004520#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004521
4522 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004523 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004524 populateResponseInfo(responseInfo, serial, responseType, e);
4525 Return<void> retStatus
4526 = radioService[slotId]->mRadioResponse->setNetworkSelectionModeManualResponse(
4527 responseInfo);
4528 radioService[slotId]->checkReturnStatus(retStatus);
4529 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004530 RLOGE("acceptCallResponse: radioService[%d]->setNetworkSelectionModeManualResponse "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004531 "== NULL", slotId);
4532 }
4533
4534 return 0;
4535}
4536
Jack Yuf68e0da2017-02-07 14:53:09 -08004537int convertOperatorStatusToInt(const char *str) {
4538 if (strncmp("unknown", str, 9) == 0) {
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004539 return (int) OperatorStatus::UNKNOWN;
Jack Yuf68e0da2017-02-07 14:53:09 -08004540 } else if (strncmp("available", str, 9) == 0) {
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004541 return (int) OperatorStatus::AVAILABLE;
Jack Yuf68e0da2017-02-07 14:53:09 -08004542 } else if (strncmp("current", str, 9) == 0) {
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004543 return (int) OperatorStatus::CURRENT;
Jack Yuf68e0da2017-02-07 14:53:09 -08004544 } else if (strncmp("forbidden", str, 9) == 0) {
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004545 return (int) OperatorStatus::FORBIDDEN;
4546 } else {
4547 return -1;
4548 }
4549}
4550
Amit Mahajan759786a2017-03-03 17:35:47 -08004551int radio::getAvailableNetworksResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004552 int responseType, int serial, RIL_Errno e, void *response,
4553 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004554#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004555 RLOGD("getAvailableNetworksResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004556#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004557
4558 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004559 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004560 populateResponseInfo(responseInfo, serial, responseType, e);
4561 hidl_vec<OperatorInfo> networks;
Amit Mahajan13058cb2017-06-07 23:10:27 -07004562 if ((response == NULL && responseLen != 0)
4563 || responseLen % (4 * sizeof(char *))!= 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004564 RLOGE("getAvailableNetworksResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004565 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
4566 } else {
4567 char **resp = (char **) response;
4568 int numStrings = responseLen / sizeof(char *);
4569 networks.resize(numStrings/4);
Jayachandran Ce0d755c2017-03-01 18:26:50 -08004570 for (int i = 0, j = 0; i < numStrings; i = i + 4, j++) {
4571 networks[j].alphaLong = convertCharPtrToHidlString(resp[i]);
4572 networks[j].alphaShort = convertCharPtrToHidlString(resp[i + 1]);
4573 networks[j].operatorNumeric = convertCharPtrToHidlString(resp[i + 2]);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004574 int status = convertOperatorStatusToInt(resp[i + 3]);
4575 if (status == -1) {
4576 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
4577 } else {
Jayachandran Ce0d755c2017-03-01 18:26:50 -08004578 networks[j].status = (OperatorStatus) status;
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004579 }
4580 }
4581 }
4582 Return<void> retStatus
4583 = radioService[slotId]->mRadioResponse->getAvailableNetworksResponse(responseInfo,
4584 networks);
4585 radioService[slotId]->checkReturnStatus(retStatus);
4586 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004587 RLOGE("getAvailableNetworksResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004588 slotId);
4589 }
4590
4591 return 0;
4592}
4593
Amit Mahajan759786a2017-03-03 17:35:47 -08004594int radio::startDtmfResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004595 int responseType, int serial, RIL_Errno e,
4596 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004597#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004598 RLOGD("startDtmfResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004599#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004600
4601 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004602 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004603 populateResponseInfo(responseInfo, serial, responseType, e);
4604 Return<void> retStatus
4605 = radioService[slotId]->mRadioResponse->startDtmfResponse(responseInfo);
4606 radioService[slotId]->checkReturnStatus(retStatus);
4607 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004608 RLOGE("startDtmfResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004609 }
4610
4611 return 0;
4612}
4613
Amit Mahajan759786a2017-03-03 17:35:47 -08004614int radio::stopDtmfResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004615 int responseType, int serial, RIL_Errno e,
4616 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004617#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004618 RLOGD("stopDtmfResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004619#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004620
4621 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004622 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004623 populateResponseInfo(responseInfo, serial, responseType, e);
4624 Return<void> retStatus
4625 = radioService[slotId]->mRadioResponse->stopDtmfResponse(responseInfo);
4626 radioService[slotId]->checkReturnStatus(retStatus);
4627 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004628 RLOGE("stopDtmfResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004629 }
4630
4631 return 0;
4632}
4633
Amit Mahajan759786a2017-03-03 17:35:47 -08004634int radio::getBasebandVersionResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004635 int responseType, int serial, RIL_Errno e,
4636 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004637#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004638 RLOGD("getBasebandVersionResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004639#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004640
4641 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004642 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004643 populateResponseInfo(responseInfo, serial, responseType, e);
4644 Return<void> retStatus
4645 = radioService[slotId]->mRadioResponse->getBasebandVersionResponse(responseInfo,
4646 convertCharPtrToHidlString((char *) response));
4647 radioService[slotId]->checkReturnStatus(retStatus);
4648 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004649 RLOGE("getBasebandVersionResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004650 }
4651
4652 return 0;
4653}
4654
Amit Mahajan759786a2017-03-03 17:35:47 -08004655int radio::separateConnectionResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004656 int responseType, int serial, RIL_Errno e,
4657 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004658#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004659 RLOGD("separateConnectionResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004660#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004661
4662 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004663 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004664 populateResponseInfo(responseInfo, serial, responseType, e);
4665 Return<void> retStatus
4666 = radioService[slotId]->mRadioResponse->separateConnectionResponse(responseInfo);
4667 radioService[slotId]->checkReturnStatus(retStatus);
4668 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004669 RLOGE("separateConnectionResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004670 slotId);
4671 }
4672
4673 return 0;
4674}
4675
Amit Mahajan759786a2017-03-03 17:35:47 -08004676int radio::setMuteResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004677 int responseType, int serial, RIL_Errno e,
4678 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004679#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004680 RLOGD("setMuteResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004681#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004682
4683 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004684 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004685 populateResponseInfo(responseInfo, serial, responseType, e);
4686 Return<void> retStatus
4687 = radioService[slotId]->mRadioResponse->setMuteResponse(responseInfo);
4688 radioService[slotId]->checkReturnStatus(retStatus);
4689 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004690 RLOGE("setMuteResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004691 }
4692
4693 return 0;
4694}
4695
Amit Mahajan759786a2017-03-03 17:35:47 -08004696int radio::getMuteResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004697 int responseType, int serial, RIL_Errno e, void *response,
4698 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004699#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004700 RLOGD("getMuteResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004701#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004702
4703 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004704 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004705 populateResponseInfo(responseInfo, serial, responseType, e);
4706 bool enable = false;
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004707 if (response == NULL || responseLen != sizeof(int)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004708 RLOGE("getMuteResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004709 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
4710 } else {
4711 int *pInt = (int *) response;
4712 enable = pInt[0] == 1 ? true : false;
4713 }
4714 Return<void> retStatus = radioService[slotId]->mRadioResponse->getMuteResponse(responseInfo,
4715 enable);
4716 radioService[slotId]->checkReturnStatus(retStatus);
4717 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004718 RLOGE("getMuteResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004719 }
4720
4721 return 0;
4722}
4723
Amit Mahajan759786a2017-03-03 17:35:47 -08004724int radio::getClipResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004725 int responseType, int serial, RIL_Errno e,
4726 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004727#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004728 RLOGD("getClipResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004729#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004730
4731 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004732 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004733 int ret = responseInt(responseInfo, serial, responseType, e, response, responseLen);
4734 Return<void> retStatus = radioService[slotId]->mRadioResponse->getClipResponse(responseInfo,
4735 (ClipStatus) ret);
4736 radioService[slotId]->checkReturnStatus(retStatus);
4737 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004738 RLOGE("getClipResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004739 }
4740
4741 return 0;
4742}
4743
Amit Mahajan759786a2017-03-03 17:35:47 -08004744int radio::getDataCallListResponse(int slotId,
Amit Mahajan3df62912017-02-10 01:35:55 +00004745 int responseType, int serial, RIL_Errno e,
4746 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004747#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004748 RLOGD("getDataCallListResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004749#endif
Amit Mahajan3df62912017-02-10 01:35:55 +00004750
4751 if (radioService[slotId]->mRadioResponse != NULL) {
Amit Mahajan3da9ac02017-02-13 13:41:28 -08004752 RadioResponseInfo responseInfo = {};
Amit Mahajan3df62912017-02-10 01:35:55 +00004753 populateResponseInfo(responseInfo, serial, responseType, e);
4754
4755 hidl_vec<SetupDataCallResult> ret;
Amit Mahajan13058cb2017-06-07 23:10:27 -07004756 if ((response == NULL && responseLen != 0)
4757 || responseLen % sizeof(RIL_Data_Call_Response_v11) != 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004758 RLOGE("getDataCallListResponse: invalid response");
Amit Mahajan3df62912017-02-10 01:35:55 +00004759 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
4760 } else {
4761 convertRilDataCallListToHal(response, responseLen, ret);
4762 }
4763
4764 Return<void> retStatus = radioService[slotId]->mRadioResponse->getDataCallListResponse(
4765 responseInfo, ret);
4766 radioService[slotId]->checkReturnStatus(retStatus);
4767 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004768 RLOGE("getDataCallListResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Amit Mahajan3df62912017-02-10 01:35:55 +00004769 }
4770
4771 return 0;
4772}
4773
Amit Mahajan759786a2017-03-03 17:35:47 -08004774int radio::setSuppServiceNotificationsResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004775 int responseType, int serial, RIL_Errno e,
4776 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004777#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004778 RLOGD("setSuppServiceNotificationsResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004779#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004780
4781 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004782 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004783 populateResponseInfo(responseInfo, serial, responseType, e);
4784 Return<void> retStatus
4785 = radioService[slotId]->mRadioResponse->setSuppServiceNotificationsResponse(
4786 responseInfo);
4787 radioService[slotId]->checkReturnStatus(retStatus);
4788 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004789 RLOGE("setSuppServiceNotificationsResponse: radioService[%d]->mRadioResponse "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004790 "== NULL", slotId);
4791 }
4792
4793 return 0;
4794}
4795
Amit Mahajan759786a2017-03-03 17:35:47 -08004796int radio::deleteSmsOnSimResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004797 int responseType, int serial, RIL_Errno e,
4798 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004799#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004800 RLOGD("deleteSmsOnSimResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004801#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004802
4803 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004804 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004805 populateResponseInfo(responseInfo, serial, responseType, e);
4806 Return<void> retStatus
4807 = radioService[slotId]->mRadioResponse->deleteSmsOnSimResponse(responseInfo);
4808 radioService[slotId]->checkReturnStatus(retStatus);
4809 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004810 RLOGE("deleteSmsOnSimResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004811 }
4812
4813 return 0;
4814}
4815
Amit Mahajan759786a2017-03-03 17:35:47 -08004816int radio::setBandModeResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004817 int responseType, int serial, RIL_Errno e,
4818 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004819#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004820 RLOGD("setBandModeResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004821#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004822
4823 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004824 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004825 populateResponseInfo(responseInfo, serial, responseType, e);
4826 Return<void> retStatus
4827 = radioService[slotId]->mRadioResponse->setBandModeResponse(responseInfo);
4828 radioService[slotId]->checkReturnStatus(retStatus);
4829 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004830 RLOGE("setBandModeResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004831 }
4832
4833 return 0;
4834}
4835
Amit Mahajan759786a2017-03-03 17:35:47 -08004836int radio::writeSmsToSimResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004837 int responseType, int serial, RIL_Errno e,
4838 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004839#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004840 RLOGD("writeSmsToSimResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004841#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004842
4843 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004844 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004845 int ret = responseInt(responseInfo, serial, responseType, e, response, responseLen);
4846 Return<void> retStatus
4847 = radioService[slotId]->mRadioResponse->writeSmsToSimResponse(responseInfo, ret);
4848 radioService[slotId]->checkReturnStatus(retStatus);
4849 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004850 RLOGE("writeSmsToSimResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004851 }
4852
4853 return 0;
4854}
4855
Amit Mahajan759786a2017-03-03 17:35:47 -08004856int radio::getAvailableBandModesResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004857 int responseType, int serial, RIL_Errno e, void *response,
4858 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004859#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004860 RLOGD("getAvailableBandModesResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004861#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004862
4863 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004864 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004865 populateResponseInfo(responseInfo, serial, responseType, e);
4866 hidl_vec<RadioBandMode> modes;
Amit Mahajan13058cb2017-06-07 23:10:27 -07004867 if ((response == NULL && responseLen != 0)|| responseLen % sizeof(int) != 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004868 RLOGE("getAvailableBandModesResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004869 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
4870 } else {
4871 int *pInt = (int *) response;
4872 int numInts = responseLen / sizeof(int);
4873 modes.resize(numInts);
4874 for (int i = 0; i < numInts; i++) {
4875 modes[i] = (RadioBandMode) pInt[i];
4876 }
4877 }
4878 Return<void> retStatus
4879 = radioService[slotId]->mRadioResponse->getAvailableBandModesResponse(responseInfo,
4880 modes);
4881 radioService[slotId]->checkReturnStatus(retStatus);
4882 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004883 RLOGE("getAvailableBandModesResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004884 slotId);
4885 }
4886
4887 return 0;
4888}
4889
Amit Mahajan759786a2017-03-03 17:35:47 -08004890int radio::sendEnvelopeResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004891 int responseType, int serial, RIL_Errno e,
4892 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004893#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004894 RLOGD("sendEnvelopeResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004895#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004896
4897 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004898 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004899 populateResponseInfo(responseInfo, serial, responseType, e);
4900 Return<void> retStatus
4901 = radioService[slotId]->mRadioResponse->sendEnvelopeResponse(responseInfo,
4902 convertCharPtrToHidlString((char *) response));
4903 radioService[slotId]->checkReturnStatus(retStatus);
4904 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004905 RLOGE("sendEnvelopeResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004906 }
4907
4908 return 0;
4909}
4910
Amit Mahajan759786a2017-03-03 17:35:47 -08004911int radio::sendTerminalResponseToSimResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004912 int responseType, int serial, RIL_Errno e,
4913 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004914#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004915 RLOGD("sendTerminalResponseToSimResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004916#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004917
4918 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004919 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004920 populateResponseInfo(responseInfo, serial, responseType, e);
4921 Return<void> retStatus
4922 = radioService[slotId]->mRadioResponse->sendTerminalResponseToSimResponse(
4923 responseInfo);
4924 radioService[slotId]->checkReturnStatus(retStatus);
4925 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004926 RLOGE("sendTerminalResponseToSimResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004927 slotId);
4928 }
4929
4930 return 0;
4931}
4932
Amit Mahajan759786a2017-03-03 17:35:47 -08004933int radio::handleStkCallSetupRequestFromSimResponse(int slotId,
4934 int responseType, int serial,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004935 RIL_Errno e, void *response,
4936 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004937#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004938 RLOGD("handleStkCallSetupRequestFromSimResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004939#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004940
4941 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004942 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004943 populateResponseInfo(responseInfo, serial, responseType, e);
4944 Return<void> retStatus
4945 = radioService[slotId]->mRadioResponse->handleStkCallSetupRequestFromSimResponse(
4946 responseInfo);
4947 radioService[slotId]->checkReturnStatus(retStatus);
4948 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004949 RLOGE("handleStkCallSetupRequestFromSimResponse: radioService[%d]->mRadioResponse "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004950 "== NULL", slotId);
4951 }
4952
4953 return 0;
4954}
4955
Amit Mahajan759786a2017-03-03 17:35:47 -08004956int radio::explicitCallTransferResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004957 int responseType, int serial, RIL_Errno e,
4958 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004959#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004960 RLOGD("explicitCallTransferResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004961#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004962
4963 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004964 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004965 populateResponseInfo(responseInfo, serial, responseType, e);
4966 Return<void> retStatus
4967 = radioService[slotId]->mRadioResponse->explicitCallTransferResponse(responseInfo);
4968 radioService[slotId]->checkReturnStatus(retStatus);
4969 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004970 RLOGE("explicitCallTransferResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004971 slotId);
4972 }
4973
4974 return 0;
4975}
4976
Amit Mahajan759786a2017-03-03 17:35:47 -08004977int radio::setPreferredNetworkTypeResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004978 int responseType, int serial, RIL_Errno e,
4979 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004980#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004981 RLOGD("setPreferredNetworkTypeResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004982#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004983
4984 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004985 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004986 populateResponseInfo(responseInfo, serial, responseType, e);
4987 Return<void> retStatus
4988 = radioService[slotId]->mRadioResponse->setPreferredNetworkTypeResponse(
4989 responseInfo);
4990 radioService[slotId]->checkReturnStatus(retStatus);
4991 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004992 RLOGE("setPreferredNetworkTypeResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004993 slotId);
4994 }
4995
4996 return 0;
4997}
4998
4999
Amit Mahajan759786a2017-03-03 17:35:47 -08005000int radio::getPreferredNetworkTypeResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005001 int responseType, int serial, RIL_Errno e,
5002 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005003#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005004 RLOGD("getPreferredNetworkTypeResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005005#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005006
5007 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005008 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005009 int ret = responseInt(responseInfo, serial, responseType, e, response, responseLen);
5010 Return<void> retStatus
5011 = radioService[slotId]->mRadioResponse->getPreferredNetworkTypeResponse(
5012 responseInfo, (PreferredNetworkType) ret);
5013 radioService[slotId]->checkReturnStatus(retStatus);
5014 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005015 RLOGE("getPreferredNetworkTypeResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005016 slotId);
5017 }
5018
5019 return 0;
5020}
5021
Amit Mahajan759786a2017-03-03 17:35:47 -08005022int radio::getNeighboringCidsResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005023 int responseType, int serial, RIL_Errno e,
5024 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005025#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005026 RLOGD("getNeighboringCidsResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005027#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005028
5029 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005030 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005031 populateResponseInfo(responseInfo, serial, responseType, e);
5032 hidl_vec<NeighboringCell> cells;
5033
Amit Mahajan13058cb2017-06-07 23:10:27 -07005034 if ((response == NULL && responseLen != 0)
5035 || responseLen % sizeof(RIL_NeighboringCell *) != 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005036 RLOGE("getNeighboringCidsResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005037 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
5038 } else {
5039 int num = responseLen / sizeof(RIL_NeighboringCell *);
5040 cells.resize(num);
5041 for (int i = 0 ; i < num; i++) {
5042 RIL_NeighboringCell *resp = ((RIL_NeighboringCell **) response)[i];
5043 cells[i].cid = convertCharPtrToHidlString(resp->cid);
5044 cells[i].rssi = resp->rssi;
5045 }
5046 }
5047
5048 Return<void> retStatus
5049 = radioService[slotId]->mRadioResponse->getNeighboringCidsResponse(responseInfo,
5050 cells);
5051 radioService[slotId]->checkReturnStatus(retStatus);
5052 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005053 RLOGE("getNeighboringCidsResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005054 slotId);
5055 }
5056
5057 return 0;
5058}
5059
Amit Mahajan759786a2017-03-03 17:35:47 -08005060int radio::setLocationUpdatesResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005061 int responseType, int serial, RIL_Errno e,
5062 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005063#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005064 RLOGD("setLocationUpdatesResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005065#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005066
5067 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005068 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005069 populateResponseInfo(responseInfo, serial, responseType, e);
5070 Return<void> retStatus
5071 = radioService[slotId]->mRadioResponse->setLocationUpdatesResponse(responseInfo);
5072 radioService[slotId]->checkReturnStatus(retStatus);
5073 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005074 RLOGE("setLocationUpdatesResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005075 slotId);
5076 }
5077
5078 return 0;
5079}
5080
Amit Mahajan759786a2017-03-03 17:35:47 -08005081int radio::setCdmaSubscriptionSourceResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005082 int responseType, int serial, RIL_Errno e,
5083 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005084#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005085 RLOGD("setCdmaSubscriptionSourceResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005086#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005087
5088 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005089 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005090 populateResponseInfo(responseInfo, serial, responseType, e);
5091 Return<void> retStatus
5092 = radioService[slotId]->mRadioResponse->setCdmaSubscriptionSourceResponse(
5093 responseInfo);
5094 radioService[slotId]->checkReturnStatus(retStatus);
5095 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005096 RLOGE("setCdmaSubscriptionSourceResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005097 slotId);
5098 }
5099
5100 return 0;
5101}
5102
Amit Mahajan759786a2017-03-03 17:35:47 -08005103int radio::setCdmaRoamingPreferenceResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005104 int responseType, int serial, RIL_Errno e,
5105 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005106#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005107 RLOGD("setCdmaRoamingPreferenceResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005108#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005109
5110 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005111 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005112 populateResponseInfo(responseInfo, serial, responseType, e);
5113 Return<void> retStatus
5114 = radioService[slotId]->mRadioResponse->setCdmaRoamingPreferenceResponse(
5115 responseInfo);
5116 radioService[slotId]->checkReturnStatus(retStatus);
5117 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005118 RLOGE("setCdmaRoamingPreferenceResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005119 slotId);
5120 }
5121
5122 return 0;
5123}
5124
Amit Mahajan759786a2017-03-03 17:35:47 -08005125int radio::getCdmaRoamingPreferenceResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005126 int responseType, int serial, RIL_Errno e,
5127 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005128#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005129 RLOGD("getCdmaRoamingPreferenceResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005130#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005131
5132 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005133 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005134 int ret = responseInt(responseInfo, serial, responseType, e, response, responseLen);
5135 Return<void> retStatus
5136 = radioService[slotId]->mRadioResponse->getCdmaRoamingPreferenceResponse(
5137 responseInfo, (CdmaRoamingType) ret);
5138 radioService[slotId]->checkReturnStatus(retStatus);
5139 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005140 RLOGE("getCdmaRoamingPreferenceResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005141 slotId);
5142 }
5143
5144 return 0;
5145}
5146
Amit Mahajan759786a2017-03-03 17:35:47 -08005147int radio::setTTYModeResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005148 int responseType, int serial, RIL_Errno e,
5149 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005150#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005151 RLOGD("setTTYModeResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005152#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005153
5154 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005155 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005156 populateResponseInfo(responseInfo, serial, responseType, e);
5157 Return<void> retStatus
5158 = radioService[slotId]->mRadioResponse->setTTYModeResponse(responseInfo);
5159 radioService[slotId]->checkReturnStatus(retStatus);
5160 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005161 RLOGE("setTTYModeResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005162 }
5163
5164 return 0;
5165}
5166
Amit Mahajan759786a2017-03-03 17:35:47 -08005167int radio::getTTYModeResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005168 int responseType, int serial, RIL_Errno e,
5169 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005170#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005171 RLOGD("getTTYModeResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005172#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005173
5174 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005175 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005176 int ret = responseInt(responseInfo, serial, responseType, e, response, responseLen);
5177 Return<void> retStatus
5178 = radioService[slotId]->mRadioResponse->getTTYModeResponse(responseInfo,
5179 (TtyMode) ret);
5180 radioService[slotId]->checkReturnStatus(retStatus);
5181 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005182 RLOGE("getTTYModeResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005183 }
5184
5185 return 0;
5186}
5187
Amit Mahajan759786a2017-03-03 17:35:47 -08005188int radio::setPreferredVoicePrivacyResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005189 int responseType, int serial, RIL_Errno e,
5190 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005191#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005192 RLOGD("setPreferredVoicePrivacyResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005193#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005194
5195 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005196 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005197 populateResponseInfo(responseInfo, serial, responseType, e);
5198 Return<void> retStatus
5199 = radioService[slotId]->mRadioResponse->setPreferredVoicePrivacyResponse(
5200 responseInfo);
5201 radioService[slotId]->checkReturnStatus(retStatus);
5202 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005203 RLOGE("setPreferredVoicePrivacyResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005204 slotId);
5205 }
5206
5207 return 0;
5208}
5209
Amit Mahajan759786a2017-03-03 17:35:47 -08005210int radio::getPreferredVoicePrivacyResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005211 int responseType, int serial, RIL_Errno e,
5212 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005213#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005214 RLOGD("getPreferredVoicePrivacyResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005215#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005216
5217 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005218 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005219 populateResponseInfo(responseInfo, serial, responseType, e);
5220 bool enable = false;
5221 int numInts = responseLen / sizeof(int);
5222 if (response == NULL || numInts != 1) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005223 RLOGE("getPreferredVoicePrivacyResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005224 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
5225 } else {
5226 int *pInt = (int *) response;
5227 enable = pInt[0] == 1 ? true : false;
5228 }
5229 Return<void> retStatus
5230 = radioService[slotId]->mRadioResponse->getPreferredVoicePrivacyResponse(
5231 responseInfo, enable);
5232 radioService[slotId]->checkReturnStatus(retStatus);
5233 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005234 RLOGE("getPreferredVoicePrivacyResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005235 slotId);
5236 }
5237
5238 return 0;
5239}
5240
Amit Mahajan759786a2017-03-03 17:35:47 -08005241int radio::sendCDMAFeatureCodeResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005242 int responseType, int serial, RIL_Errno e,
5243 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005244#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005245 RLOGD("sendCDMAFeatureCodeResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005246#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005247
5248 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005249 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005250 populateResponseInfo(responseInfo, serial, responseType, e);
5251 Return<void> retStatus
5252 = radioService[slotId]->mRadioResponse->sendCDMAFeatureCodeResponse(responseInfo);
5253 radioService[slotId]->checkReturnStatus(retStatus);
5254 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005255 RLOGE("sendCDMAFeatureCodeResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005256 slotId);
5257 }
5258
5259 return 0;
5260}
5261
Amit Mahajan759786a2017-03-03 17:35:47 -08005262int radio::sendBurstDtmfResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005263 int responseType, int serial, RIL_Errno e,
5264 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005265#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005266 RLOGD("sendBurstDtmfResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005267#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005268
5269 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005270 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005271 populateResponseInfo(responseInfo, serial, responseType, e);
5272 Return<void> retStatus
5273 = radioService[slotId]->mRadioResponse->sendBurstDtmfResponse(responseInfo);
5274 radioService[slotId]->checkReturnStatus(retStatus);
5275 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005276 RLOGE("sendBurstDtmfResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005277 }
5278
5279 return 0;
5280}
5281
Amit Mahajan759786a2017-03-03 17:35:47 -08005282int radio::sendCdmaSmsResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005283 int responseType, int serial, RIL_Errno e, void *response,
5284 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005285#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005286 RLOGD("sendCdmaSmsResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005287#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005288
5289 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005290 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005291 SendSmsResult result = makeSendSmsResult(responseInfo, serial, responseType, e, response,
5292 responseLen);
5293
5294 Return<void> retStatus
5295 = radioService[slotId]->mRadioResponse->sendCdmaSmsResponse(responseInfo, result);
5296 radioService[slotId]->checkReturnStatus(retStatus);
5297 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005298 RLOGE("sendCdmaSmsResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005299 }
5300
5301 return 0;
5302}
5303
Amit Mahajan759786a2017-03-03 17:35:47 -08005304int radio::acknowledgeLastIncomingCdmaSmsResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005305 int responseType, int serial, RIL_Errno e,
5306 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005307#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005308 RLOGD("acknowledgeLastIncomingCdmaSmsResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005309#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005310
5311 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005312 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005313 populateResponseInfo(responseInfo, serial, responseType, e);
5314 Return<void> retStatus
5315 = radioService[slotId]->mRadioResponse->acknowledgeLastIncomingCdmaSmsResponse(
5316 responseInfo);
5317 radioService[slotId]->checkReturnStatus(retStatus);
5318 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005319 RLOGE("acknowledgeLastIncomingCdmaSmsResponse: radioService[%d]->mRadioResponse "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005320 "== NULL", slotId);
5321 }
5322
5323 return 0;
5324}
5325
Amit Mahajan759786a2017-03-03 17:35:47 -08005326int radio::getGsmBroadcastConfigResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005327 int responseType, int serial, RIL_Errno e,
5328 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005329#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005330 RLOGD("getGsmBroadcastConfigResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005331#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005332
5333 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005334 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005335 populateResponseInfo(responseInfo, serial, responseType, e);
5336 hidl_vec<GsmBroadcastSmsConfigInfo> configs;
5337
Amit Mahajan13058cb2017-06-07 23:10:27 -07005338 if ((response == NULL && responseLen != 0)
5339 || responseLen % sizeof(RIL_GSM_BroadcastSmsConfigInfo *) != 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005340 RLOGE("getGsmBroadcastConfigResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005341 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
5342 } else {
5343 int num = responseLen / sizeof(RIL_GSM_BroadcastSmsConfigInfo *);
5344 configs.resize(num);
5345 for (int i = 0 ; i < num; i++) {
5346 RIL_GSM_BroadcastSmsConfigInfo *resp =
5347 ((RIL_GSM_BroadcastSmsConfigInfo **) response)[i];
5348 configs[i].fromServiceId = resp->fromServiceId;
5349 configs[i].toServiceId = resp->toServiceId;
5350 configs[i].fromCodeScheme = resp->fromCodeScheme;
5351 configs[i].toCodeScheme = resp->toCodeScheme;
5352 configs[i].selected = resp->selected == 1 ? true : false;
5353 }
5354 }
5355
5356 Return<void> retStatus
5357 = radioService[slotId]->mRadioResponse->getGsmBroadcastConfigResponse(responseInfo,
5358 configs);
5359 radioService[slotId]->checkReturnStatus(retStatus);
5360 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005361 RLOGE("getGsmBroadcastConfigResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005362 slotId);
5363 }
5364
5365 return 0;
5366}
5367
Amit Mahajan759786a2017-03-03 17:35:47 -08005368int radio::setGsmBroadcastConfigResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005369 int responseType, int serial, RIL_Errno e,
5370 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005371#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005372 RLOGD("setGsmBroadcastConfigResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005373#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005374
5375 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005376 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005377 populateResponseInfo(responseInfo, serial, responseType, e);
5378 Return<void> retStatus
5379 = radioService[slotId]->mRadioResponse->setGsmBroadcastConfigResponse(responseInfo);
5380 radioService[slotId]->checkReturnStatus(retStatus);
5381 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005382 RLOGE("setGsmBroadcastConfigResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005383 slotId);
5384 }
5385
5386 return 0;
5387}
5388
Amit Mahajan759786a2017-03-03 17:35:47 -08005389int radio::setGsmBroadcastActivationResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005390 int responseType, int serial, RIL_Errno e,
5391 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005392#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005393 RLOGD("setGsmBroadcastActivationResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005394#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005395
5396 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005397 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005398 populateResponseInfo(responseInfo, serial, responseType, e);
5399 Return<void> retStatus
5400 = radioService[slotId]->mRadioResponse->setGsmBroadcastActivationResponse(
5401 responseInfo);
5402 radioService[slotId]->checkReturnStatus(retStatus);
5403 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005404 RLOGE("setGsmBroadcastActivationResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005405 slotId);
5406 }
5407
5408 return 0;
5409}
5410
Amit Mahajan759786a2017-03-03 17:35:47 -08005411int radio::getCdmaBroadcastConfigResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005412 int responseType, int serial, RIL_Errno e,
5413 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005414#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005415 RLOGD("getCdmaBroadcastConfigResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005416#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005417
5418 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005419 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005420 populateResponseInfo(responseInfo, serial, responseType, e);
5421 hidl_vec<CdmaBroadcastSmsConfigInfo> configs;
5422
Amit Mahajan13058cb2017-06-07 23:10:27 -07005423 if ((response == NULL && responseLen != 0)
5424 || responseLen % sizeof(RIL_CDMA_BroadcastSmsConfigInfo *) != 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005425 RLOGE("getCdmaBroadcastConfigResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005426 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
5427 } else {
5428 int num = responseLen / sizeof(RIL_CDMA_BroadcastSmsConfigInfo *);
5429 configs.resize(num);
5430 for (int i = 0 ; i < num; i++) {
5431 RIL_CDMA_BroadcastSmsConfigInfo *resp =
5432 ((RIL_CDMA_BroadcastSmsConfigInfo **) response)[i];
5433 configs[i].serviceCategory = resp->service_category;
5434 configs[i].language = resp->language;
5435 configs[i].selected = resp->selected == 1 ? true : false;
5436 }
5437 }
5438
5439 Return<void> retStatus
5440 = radioService[slotId]->mRadioResponse->getCdmaBroadcastConfigResponse(responseInfo,
5441 configs);
5442 radioService[slotId]->checkReturnStatus(retStatus);
5443 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005444 RLOGE("getCdmaBroadcastConfigResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005445 slotId);
5446 }
5447
5448 return 0;
5449}
5450
Amit Mahajan759786a2017-03-03 17:35:47 -08005451int radio::setCdmaBroadcastConfigResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005452 int responseType, int serial, RIL_Errno e,
5453 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005454#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005455 RLOGD("setCdmaBroadcastConfigResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005456#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005457
5458 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005459 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005460 populateResponseInfo(responseInfo, serial, responseType, e);
5461 Return<void> retStatus
5462 = radioService[slotId]->mRadioResponse->setCdmaBroadcastConfigResponse(
5463 responseInfo);
5464 radioService[slotId]->checkReturnStatus(retStatus);
5465 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005466 RLOGE("setCdmaBroadcastConfigResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005467 slotId);
5468 }
5469
5470 return 0;
5471}
5472
Amit Mahajan759786a2017-03-03 17:35:47 -08005473int radio::setCdmaBroadcastActivationResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005474 int responseType, int serial, RIL_Errno e,
5475 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005476#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005477 RLOGD("setCdmaBroadcastActivationResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005478#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005479
5480 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005481 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005482 populateResponseInfo(responseInfo, serial, responseType, e);
5483 Return<void> retStatus
5484 = radioService[slotId]->mRadioResponse->setCdmaBroadcastActivationResponse(
5485 responseInfo);
5486 radioService[slotId]->checkReturnStatus(retStatus);
5487 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005488 RLOGE("setCdmaBroadcastActivationResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005489 slotId);
5490 }
5491
5492 return 0;
5493}
5494
Amit Mahajan759786a2017-03-03 17:35:47 -08005495int radio::getCDMASubscriptionResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005496 int responseType, int serial, RIL_Errno e, void *response,
5497 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005498#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005499 RLOGD("getCDMASubscriptionResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005500#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005501
5502 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005503 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005504 populateResponseInfo(responseInfo, serial, responseType, e);
5505
5506 int numStrings = responseLen / sizeof(char *);
5507 hidl_string emptyString;
5508 if (response == NULL || numStrings != 5) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005509 RLOGE("getOperatorResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005510 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
5511 Return<void> retStatus
5512 = radioService[slotId]->mRadioResponse->getCDMASubscriptionResponse(
5513 responseInfo, emptyString, emptyString, emptyString, emptyString, emptyString);
5514 radioService[slotId]->checkReturnStatus(retStatus);
5515 } else {
5516 char **resp = (char **) response;
5517 Return<void> retStatus
5518 = radioService[slotId]->mRadioResponse->getCDMASubscriptionResponse(
5519 responseInfo,
5520 convertCharPtrToHidlString(resp[0]),
5521 convertCharPtrToHidlString(resp[1]),
5522 convertCharPtrToHidlString(resp[2]),
5523 convertCharPtrToHidlString(resp[3]),
5524 convertCharPtrToHidlString(resp[4]));
5525 radioService[slotId]->checkReturnStatus(retStatus);
5526 }
5527 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005528 RLOGE("getCDMASubscriptionResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005529 slotId);
5530 }
5531
5532 return 0;
5533}
5534
Amit Mahajan759786a2017-03-03 17:35:47 -08005535int radio::writeSmsToRuimResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005536 int responseType, int serial, RIL_Errno e,
5537 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005538#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005539 RLOGD("writeSmsToRuimResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005540#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005541
5542 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005543 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005544 int ret = responseInt(responseInfo, serial, responseType, e, response, responseLen);
5545 Return<void> retStatus
5546 = radioService[slotId]->mRadioResponse->writeSmsToRuimResponse(responseInfo, ret);
5547 radioService[slotId]->checkReturnStatus(retStatus);
5548 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005549 RLOGE("writeSmsToRuimResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005550 }
5551
5552 return 0;
5553}
5554
Amit Mahajan759786a2017-03-03 17:35:47 -08005555int radio::deleteSmsOnRuimResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005556 int responseType, int serial, RIL_Errno e,
5557 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005558#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005559 RLOGD("deleteSmsOnRuimResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005560#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005561
5562 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005563 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005564 populateResponseInfo(responseInfo, serial, responseType, e);
5565 Return<void> retStatus
5566 = radioService[slotId]->mRadioResponse->deleteSmsOnRuimResponse(responseInfo);
5567 radioService[slotId]->checkReturnStatus(retStatus);
5568 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005569 RLOGE("deleteSmsOnRuimResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005570 }
5571
5572 return 0;
5573}
5574
Amit Mahajan759786a2017-03-03 17:35:47 -08005575int radio::getDeviceIdentityResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005576 int responseType, int serial, RIL_Errno e, void *response,
5577 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005578#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005579 RLOGD("getDeviceIdentityResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005580#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005581
5582 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005583 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005584 populateResponseInfo(responseInfo, serial, responseType, e);
5585
5586 int numStrings = responseLen / sizeof(char *);
5587 hidl_string emptyString;
5588 if (response == NULL || numStrings != 4) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005589 RLOGE("getDeviceIdentityResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005590 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
5591 Return<void> retStatus
5592 = radioService[slotId]->mRadioResponse->getDeviceIdentityResponse(responseInfo,
5593 emptyString, emptyString, emptyString, emptyString);
5594 radioService[slotId]->checkReturnStatus(retStatus);
5595 } else {
5596 char **resp = (char **) response;
5597 Return<void> retStatus
5598 = radioService[slotId]->mRadioResponse->getDeviceIdentityResponse(responseInfo,
5599 convertCharPtrToHidlString(resp[0]),
5600 convertCharPtrToHidlString(resp[1]),
5601 convertCharPtrToHidlString(resp[2]),
5602 convertCharPtrToHidlString(resp[3]));
5603 radioService[slotId]->checkReturnStatus(retStatus);
5604 }
5605 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005606 RLOGE("getDeviceIdentityResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005607 slotId);
5608 }
5609
5610 return 0;
5611}
5612
Amit Mahajan759786a2017-03-03 17:35:47 -08005613int radio::exitEmergencyCallbackModeResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005614 int responseType, int serial, RIL_Errno e,
5615 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005616#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005617 RLOGD("exitEmergencyCallbackModeResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005618#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005619
5620 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005621 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005622 populateResponseInfo(responseInfo, serial, responseType, e);
5623 Return<void> retStatus
5624 = radioService[slotId]->mRadioResponse->exitEmergencyCallbackModeResponse(
5625 responseInfo);
5626 radioService[slotId]->checkReturnStatus(retStatus);
5627 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005628 RLOGE("exitEmergencyCallbackModeResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005629 slotId);
5630 }
5631
5632 return 0;
5633}
5634
Amit Mahajan759786a2017-03-03 17:35:47 -08005635int radio::getSmscAddressResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005636 int responseType, int serial, RIL_Errno e,
5637 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005638#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005639 RLOGD("getSmscAddressResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005640#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005641
5642 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005643 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005644 populateResponseInfo(responseInfo, serial, responseType, e);
5645 Return<void> retStatus
5646 = radioService[slotId]->mRadioResponse->getSmscAddressResponse(responseInfo,
5647 convertCharPtrToHidlString((char *) response));
5648 radioService[slotId]->checkReturnStatus(retStatus);
5649 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005650 RLOGE("getSmscAddressResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005651 }
5652
5653 return 0;
5654}
5655
Amit Mahajan759786a2017-03-03 17:35:47 -08005656int radio::setSmscAddressResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005657 int responseType, int serial, RIL_Errno e,
5658 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005659#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005660 RLOGD("setSmscAddressResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005661#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005662
5663 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005664 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005665 populateResponseInfo(responseInfo, serial, responseType, e);
5666 Return<void> retStatus
5667 = radioService[slotId]->mRadioResponse->setSmscAddressResponse(responseInfo);
5668 radioService[slotId]->checkReturnStatus(retStatus);
5669 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005670 RLOGE("setSmscAddressResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005671 }
5672
5673 return 0;
5674}
5675
Amit Mahajan759786a2017-03-03 17:35:47 -08005676int radio::reportSmsMemoryStatusResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005677 int responseType, int serial, RIL_Errno e,
5678 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005679#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005680 RLOGD("reportSmsMemoryStatusResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005681#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005682
5683 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005684 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005685 populateResponseInfo(responseInfo, serial, responseType, e);
5686 Return<void> retStatus
5687 = radioService[slotId]->mRadioResponse->reportSmsMemoryStatusResponse(responseInfo);
5688 radioService[slotId]->checkReturnStatus(retStatus);
5689 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005690 RLOGE("reportSmsMemoryStatusResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005691 slotId);
5692 }
5693
5694 return 0;
5695}
5696
Amit Mahajan759786a2017-03-03 17:35:47 -08005697int radio::reportStkServiceIsRunningResponse(int slotId,
Amit Mahajan5007ffa2017-01-31 17:14:42 -08005698 int responseType, int serial, RIL_Errno e,
5699 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005700#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005701 RLOGD("reportStkServiceIsRunningResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005702#endif
Amit Mahajan5007ffa2017-01-31 17:14:42 -08005703
5704 if (radioService[slotId]->mRadioResponse != NULL) {
Amit Mahajan3da9ac02017-02-13 13:41:28 -08005705 RadioResponseInfo responseInfo = {};
Amit Mahajan5007ffa2017-01-31 17:14:42 -08005706 populateResponseInfo(responseInfo, serial, responseType, e);
5707 Return<void> retStatus = radioService[slotId]->mRadioResponse->
5708 reportStkServiceIsRunningResponse(responseInfo);
5709 radioService[slotId]->checkReturnStatus(retStatus);
5710 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005711 RLOGE("reportStkServiceIsRunningResponse: radioService[%d]->mRadioResponse == NULL",
Amit Mahajan5007ffa2017-01-31 17:14:42 -08005712 slotId);
5713 }
5714
5715 return 0;
5716}
5717
Amit Mahajan759786a2017-03-03 17:35:47 -08005718int radio::getCdmaSubscriptionSourceResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005719 int responseType, int serial, RIL_Errno e,
5720 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005721#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005722 RLOGD("getCdmaSubscriptionSourceResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005723#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005724
5725 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005726 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005727 int ret = responseInt(responseInfo, serial, responseType, e, response, responseLen);
5728 Return<void> retStatus
5729 = radioService[slotId]->mRadioResponse->getCdmaSubscriptionSourceResponse(
5730 responseInfo, (CdmaSubscriptionSource) ret);
5731 radioService[slotId]->checkReturnStatus(retStatus);
5732 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005733 RLOGE("getCdmaSubscriptionSourceResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005734 slotId);
5735 }
5736
5737 return 0;
5738}
5739
Amit Mahajan759786a2017-03-03 17:35:47 -08005740int radio::requestIsimAuthenticationResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005741 int responseType, int serial, RIL_Errno e,
5742 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005743#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005744 RLOGD("requestIsimAuthenticationResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005745#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005746
5747 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005748 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005749 populateResponseInfo(responseInfo, serial, responseType, e);
5750 Return<void> retStatus
5751 = radioService[slotId]->mRadioResponse->requestIsimAuthenticationResponse(
5752 responseInfo,
5753 convertCharPtrToHidlString((char *) response));
5754 radioService[slotId]->checkReturnStatus(retStatus);
5755 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005756 RLOGE("requestIsimAuthenticationResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005757 slotId);
5758 }
5759
5760 return 0;
5761}
5762
Amit Mahajan759786a2017-03-03 17:35:47 -08005763int radio::acknowledgeIncomingGsmSmsWithPduResponse(int slotId,
5764 int responseType,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005765 int serial, RIL_Errno e, void *response,
5766 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005767#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005768 RLOGD("acknowledgeIncomingGsmSmsWithPduResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005769#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005770
5771 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005772 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005773 populateResponseInfo(responseInfo, serial, responseType, e);
5774 Return<void> retStatus
5775 = radioService[slotId]->mRadioResponse->acknowledgeIncomingGsmSmsWithPduResponse(
5776 responseInfo);
5777 radioService[slotId]->checkReturnStatus(retStatus);
5778 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005779 RLOGE("acknowledgeIncomingGsmSmsWithPduResponse: radioService[%d]->mRadioResponse "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005780 "== NULL", slotId);
5781 }
5782
5783 return 0;
5784}
5785
Amit Mahajan759786a2017-03-03 17:35:47 -08005786int radio::sendEnvelopeWithStatusResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005787 int responseType, int serial, RIL_Errno e, void *response,
5788 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005789#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005790 RLOGD("sendEnvelopeWithStatusResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005791#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005792
5793 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005794 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005795 IccIoResult result = responseIccIo(responseInfo, serial, responseType, e,
5796 response, responseLen);
5797
5798 Return<void> retStatus
5799 = radioService[slotId]->mRadioResponse->sendEnvelopeWithStatusResponse(responseInfo,
5800 result);
5801 radioService[slotId]->checkReturnStatus(retStatus);
5802 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005803 RLOGE("sendEnvelopeWithStatusResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005804 slotId);
5805 }
5806
5807 return 0;
5808}
5809
Amit Mahajan759786a2017-03-03 17:35:47 -08005810int radio::getVoiceRadioTechnologyResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005811 int responseType, int serial, RIL_Errno e,
5812 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005813#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005814 RLOGD("getVoiceRadioTechnologyResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005815#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005816
5817 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005818 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005819 int ret = responseInt(responseInfo, serial, responseType, e, response, responseLen);
5820 Return<void> retStatus
5821 = radioService[slotId]->mRadioResponse->getVoiceRadioTechnologyResponse(
5822 responseInfo, (RadioTechnology) ret);
5823 radioService[slotId]->checkReturnStatus(retStatus);
5824 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005825 RLOGE("getVoiceRadioTechnologyResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005826 slotId);
5827 }
5828
5829 return 0;
5830}
5831
Amit Mahajan759786a2017-03-03 17:35:47 -08005832int radio::getCellInfoListResponse(int slotId,
5833 int responseType,
Amit Mahajan3df62912017-02-10 01:35:55 +00005834 int serial, RIL_Errno e, void *response,
5835 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005836#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005837 RLOGD("getCellInfoListResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005838#endif
Amit Mahajan3df62912017-02-10 01:35:55 +00005839
5840 if (radioService[slotId]->mRadioResponse != NULL) {
Amit Mahajan3da9ac02017-02-13 13:41:28 -08005841 RadioResponseInfo responseInfo = {};
Amit Mahajan3df62912017-02-10 01:35:55 +00005842 populateResponseInfo(responseInfo, serial, responseType, e);
5843
5844 hidl_vec<CellInfo> ret;
Amit Mahajan13058cb2017-06-07 23:10:27 -07005845 if ((response == NULL && responseLen != 0)
5846 || responseLen % sizeof(RIL_CellInfo_v12) != 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005847 RLOGE("getCellInfoListResponse: Invalid response");
Amit Mahajan3df62912017-02-10 01:35:55 +00005848 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
5849 } else {
5850 convertRilCellInfoListToHal(response, responseLen, ret);
5851 }
5852
5853 Return<void> retStatus = radioService[slotId]->mRadioResponse->getCellInfoListResponse(
5854 responseInfo, ret);
5855 radioService[slotId]->checkReturnStatus(retStatus);
5856 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005857 RLOGE("getCellInfoListResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Amit Mahajan3df62912017-02-10 01:35:55 +00005858 }
5859
5860 return 0;
5861}
5862
Amit Mahajan759786a2017-03-03 17:35:47 -08005863int radio::setCellInfoListRateResponse(int slotId,
5864 int responseType,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005865 int serial, RIL_Errno e, void *response,
5866 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005867#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005868 RLOGD("setCellInfoListRateResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005869#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005870
5871 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005872 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005873 populateResponseInfo(responseInfo, serial, responseType, e);
5874 Return<void> retStatus
5875 = radioService[slotId]->mRadioResponse->setCellInfoListRateResponse(responseInfo);
5876 radioService[slotId]->checkReturnStatus(retStatus);
5877 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005878 RLOGE("setCellInfoListRateResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005879 slotId);
5880 }
5881
5882 return 0;
5883}
5884
Amit Mahajan759786a2017-03-03 17:35:47 -08005885int radio::setInitialAttachApnResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005886 int responseType, int serial, RIL_Errno e,
5887 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005888#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005889 RLOGD("setInitialAttachApnResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005890#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005891
5892 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005893 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005894 populateResponseInfo(responseInfo, serial, responseType, e);
5895 Return<void> retStatus
5896 = radioService[slotId]->mRadioResponse->setInitialAttachApnResponse(responseInfo);
5897 radioService[slotId]->checkReturnStatus(retStatus);
5898 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005899 RLOGE("setInitialAttachApnResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005900 slotId);
5901 }
5902
5903 return 0;
5904}
5905
Amit Mahajan759786a2017-03-03 17:35:47 -08005906int radio::getImsRegistrationStateResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005907 int responseType, int serial, RIL_Errno e,
5908 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005909#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005910 RLOGD("getImsRegistrationStateResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005911#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005912
5913 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005914 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005915 populateResponseInfo(responseInfo, serial, responseType, e);
5916 bool isRegistered = false;
5917 int ratFamily = 0;
5918 int numInts = responseLen / sizeof(int);
5919 if (response == NULL || numInts != 2) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005920 RLOGE("getImsRegistrationStateResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005921 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
5922 } else {
5923 int *pInt = (int *) response;
5924 isRegistered = pInt[0] == 1 ? true : false;
5925 ratFamily = pInt[1];
5926 }
5927 Return<void> retStatus
5928 = radioService[slotId]->mRadioResponse->getImsRegistrationStateResponse(
5929 responseInfo, isRegistered, (RadioTechnologyFamily) ratFamily);
5930 radioService[slotId]->checkReturnStatus(retStatus);
5931 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005932 RLOGE("getImsRegistrationStateResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005933 slotId);
5934 }
5935
5936 return 0;
5937}
5938
Amit Mahajan759786a2017-03-03 17:35:47 -08005939int radio::sendImsSmsResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005940 int responseType, int serial, RIL_Errno e, void *response,
5941 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005942#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005943 RLOGD("sendImsSmsResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005944#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005945
5946 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005947 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005948 SendSmsResult result = makeSendSmsResult(responseInfo, serial, responseType, e, response,
5949 responseLen);
5950
5951 Return<void> retStatus
5952 = radioService[slotId]->mRadioResponse->sendImsSmsResponse(responseInfo, result);
5953 radioService[slotId]->checkReturnStatus(retStatus);
5954 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005955 RLOGE("sendSmsResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005956 }
5957
5958 return 0;
5959}
5960
Amit Mahajan759786a2017-03-03 17:35:47 -08005961int radio::iccTransmitApduBasicChannelResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005962 int responseType, int serial, RIL_Errno e,
5963 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005964#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005965 RLOGD("iccTransmitApduBasicChannelResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005966#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005967
5968 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005969 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005970 IccIoResult result = responseIccIo(responseInfo, serial, responseType, e, response,
5971 responseLen);
5972
5973 Return<void> retStatus
5974 = radioService[slotId]->mRadioResponse->iccTransmitApduBasicChannelResponse(
5975 responseInfo, result);
5976 radioService[slotId]->checkReturnStatus(retStatus);
5977 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005978 RLOGE("iccTransmitApduBasicChannelResponse: radioService[%d]->mRadioResponse "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005979 "== NULL", slotId);
5980 }
5981
5982 return 0;
5983}
5984
Amit Mahajan759786a2017-03-03 17:35:47 -08005985int radio::iccOpenLogicalChannelResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005986 int responseType, int serial, RIL_Errno e, void *response,
5987 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005988#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005989 RLOGD("iccOpenLogicalChannelResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005990#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005991
5992 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005993 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005994 populateResponseInfo(responseInfo, serial, responseType, e);
5995 int channelId = -1;
5996 hidl_vec<int8_t> selectResponse;
5997 int numInts = responseLen / sizeof(int);
5998 if (response == NULL || responseLen % sizeof(int) != 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005999 RLOGE("iccOpenLogicalChannelResponse Invalid response: NULL");
Amit Mahajan13058cb2017-06-07 23:10:27 -07006000 if (response != NULL) {
6001 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
6002 }
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006003 } else {
6004 int *pInt = (int *) response;
6005 channelId = pInt[0];
6006 selectResponse.resize(numInts - 1);
6007 for (int i = 1; i < numInts; i++) {
6008 selectResponse[i - 1] = (int8_t) pInt[i];
6009 }
6010 }
6011 Return<void> retStatus
6012 = radioService[slotId]->mRadioResponse->iccOpenLogicalChannelResponse(responseInfo,
6013 channelId, selectResponse);
6014 radioService[slotId]->checkReturnStatus(retStatus);
6015 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006016 RLOGE("iccOpenLogicalChannelResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006017 slotId);
6018 }
6019
6020 return 0;
6021}
6022
Amit Mahajan759786a2017-03-03 17:35:47 -08006023int radio::iccCloseLogicalChannelResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006024 int responseType, int serial, RIL_Errno e,
6025 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006026#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006027 RLOGD("iccCloseLogicalChannelResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006028#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006029
6030 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08006031 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006032 populateResponseInfo(responseInfo, serial, responseType, e);
6033 Return<void> retStatus
6034 = radioService[slotId]->mRadioResponse->iccCloseLogicalChannelResponse(
6035 responseInfo);
6036 radioService[slotId]->checkReturnStatus(retStatus);
6037 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006038 RLOGE("iccCloseLogicalChannelResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006039 slotId);
6040 }
6041
6042 return 0;
6043}
6044
Amit Mahajan759786a2017-03-03 17:35:47 -08006045int radio::iccTransmitApduLogicalChannelResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006046 int responseType, int serial, RIL_Errno e,
6047 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006048#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006049 RLOGD("iccTransmitApduLogicalChannelResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006050#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006051
6052 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08006053 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006054 IccIoResult result = responseIccIo(responseInfo, serial, responseType, e, response,
6055 responseLen);
6056
6057 Return<void> retStatus
6058 = radioService[slotId]->mRadioResponse->iccTransmitApduLogicalChannelResponse(
6059 responseInfo, result);
6060 radioService[slotId]->checkReturnStatus(retStatus);
6061 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006062 RLOGE("iccTransmitApduLogicalChannelResponse: radioService[%d]->mRadioResponse "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006063 "== NULL", slotId);
6064 }
6065
6066 return 0;
6067}
6068
Amit Mahajan759786a2017-03-03 17:35:47 -08006069int radio::nvReadItemResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006070 int responseType, int serial, RIL_Errno e,
6071 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006072#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006073 RLOGD("nvReadItemResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006074#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006075
6076 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08006077 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006078 populateResponseInfo(responseInfo, serial, responseType, e);
6079 Return<void> retStatus = radioService[slotId]->mRadioResponse->nvReadItemResponse(
6080 responseInfo,
6081 convertCharPtrToHidlString((char *) response));
6082 radioService[slotId]->checkReturnStatus(retStatus);
6083 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006084 RLOGE("nvReadItemResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006085 }
6086
6087 return 0;
6088}
6089
Amit Mahajan759786a2017-03-03 17:35:47 -08006090int radio::nvWriteItemResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006091 int responseType, int serial, RIL_Errno e,
6092 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006093#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006094 RLOGD("nvWriteItemResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006095#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006096
6097 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08006098 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006099 populateResponseInfo(responseInfo, serial, responseType, e);
6100 Return<void> retStatus
6101 = radioService[slotId]->mRadioResponse->nvWriteItemResponse(responseInfo);
6102 radioService[slotId]->checkReturnStatus(retStatus);
6103 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006104 RLOGE("nvWriteItemResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006105 }
6106
6107 return 0;
6108}
6109
Amit Mahajan759786a2017-03-03 17:35:47 -08006110int radio::nvWriteCdmaPrlResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006111 int responseType, int serial, RIL_Errno e,
6112 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006113#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006114 RLOGD("nvWriteCdmaPrlResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006115#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006116
6117 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08006118 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006119 populateResponseInfo(responseInfo, serial, responseType, e);
6120 Return<void> retStatus
6121 = radioService[slotId]->mRadioResponse->nvWriteCdmaPrlResponse(responseInfo);
6122 radioService[slotId]->checkReturnStatus(retStatus);
6123 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006124 RLOGE("nvWriteCdmaPrlResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006125 }
6126
6127 return 0;
6128}
6129
Amit Mahajan759786a2017-03-03 17:35:47 -08006130int radio::nvResetConfigResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006131 int responseType, int serial, RIL_Errno e,
6132 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006133#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006134 RLOGD("nvResetConfigResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006135#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006136
6137 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08006138 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006139 populateResponseInfo(responseInfo, serial, responseType, e);
6140 Return<void> retStatus
6141 = radioService[slotId]->mRadioResponse->nvResetConfigResponse(responseInfo);
6142 radioService[slotId]->checkReturnStatus(retStatus);
6143 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006144 RLOGE("nvResetConfigResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006145 }
6146
6147 return 0;
6148}
6149
Amit Mahajan759786a2017-03-03 17:35:47 -08006150int radio::setUiccSubscriptionResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006151 int responseType, int serial, RIL_Errno e,
6152 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006153#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006154 RLOGD("setUiccSubscriptionResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006155#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006156
6157 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08006158 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006159 populateResponseInfo(responseInfo, serial, responseType, e);
6160 Return<void> retStatus
6161 = radioService[slotId]->mRadioResponse->setUiccSubscriptionResponse(responseInfo);
6162 radioService[slotId]->checkReturnStatus(retStatus);
6163 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006164 RLOGE("setUiccSubscriptionResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006165 slotId);
6166 }
6167
6168 return 0;
6169}
6170
Amit Mahajan759786a2017-03-03 17:35:47 -08006171int radio::setDataAllowedResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006172 int responseType, int serial, RIL_Errno e,
6173 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006174#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006175 RLOGD("setDataAllowedResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006176#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006177
6178 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08006179 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006180 populateResponseInfo(responseInfo, serial, responseType, e);
6181 Return<void> retStatus
6182 = radioService[slotId]->mRadioResponse->setDataAllowedResponse(responseInfo);
6183 radioService[slotId]->checkReturnStatus(retStatus);
6184 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006185 RLOGE("setDataAllowedResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006186 }
6187
6188 return 0;
6189}
6190
Amit Mahajan759786a2017-03-03 17:35:47 -08006191int radio::getHardwareConfigResponse(int slotId,
Amit Mahajan3df62912017-02-10 01:35:55 +00006192 int responseType, int serial, RIL_Errno e,
6193 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006194#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006195 RLOGD("getHardwareConfigResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006196#endif
Amit Mahajan3df62912017-02-10 01:35:55 +00006197
6198 if (radioService[slotId]->mRadioResponse != NULL) {
Amit Mahajan3da9ac02017-02-13 13:41:28 -08006199 RadioResponseInfo responseInfo = {};
Amit Mahajan3df62912017-02-10 01:35:55 +00006200 populateResponseInfo(responseInfo, serial, responseType, e);
6201
6202 hidl_vec<HardwareConfig> result;
Amit Mahajan13058cb2017-06-07 23:10:27 -07006203 if ((response == NULL && responseLen != 0)
6204 || responseLen % sizeof(RIL_HardwareConfig) != 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006205 RLOGE("hardwareConfigChangedInd: invalid response");
Amit Mahajan3df62912017-02-10 01:35:55 +00006206 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
6207 } else {
6208 convertRilHardwareConfigListToHal(response, responseLen, result);
6209 }
6210
6211 Return<void> retStatus = radioService[slotId]->mRadioResponse->getHardwareConfigResponse(
6212 responseInfo, result);
6213 radioService[slotId]->checkReturnStatus(retStatus);
6214 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006215 RLOGE("getHardwareConfigResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Amit Mahajan3df62912017-02-10 01:35:55 +00006216 }
6217
6218 return 0;
6219}
6220
Amit Mahajan759786a2017-03-03 17:35:47 -08006221int radio::requestIccSimAuthenticationResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006222 int responseType, int serial, RIL_Errno e,
6223 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006224#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006225 RLOGD("requestIccSimAuthenticationResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006226#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006227
6228 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08006229 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006230 IccIoResult result = responseIccIo(responseInfo, serial, responseType, e, response,
6231 responseLen);
6232
6233 Return<void> retStatus
6234 = radioService[slotId]->mRadioResponse->requestIccSimAuthenticationResponse(
6235 responseInfo, result);
6236 radioService[slotId]->checkReturnStatus(retStatus);
6237 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006238 RLOGE("requestIccSimAuthenticationResponse: radioService[%d]->mRadioResponse "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006239 "== NULL", slotId);
6240 }
6241
6242 return 0;
6243}
6244
Amit Mahajan759786a2017-03-03 17:35:47 -08006245int radio::setDataProfileResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006246 int responseType, int serial, RIL_Errno e,
6247 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006248#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006249 RLOGD("setDataProfileResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006250#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006251
6252 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08006253 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006254 populateResponseInfo(responseInfo, serial, responseType, e);
6255 Return<void> retStatus
6256 = radioService[slotId]->mRadioResponse->setDataProfileResponse(responseInfo);
6257 radioService[slotId]->checkReturnStatus(retStatus);
6258 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006259 RLOGE("setDataProfileResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006260 }
6261
6262 return 0;
6263}
6264
Amit Mahajan759786a2017-03-03 17:35:47 -08006265int radio::requestShutdownResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006266 int responseType, int serial, RIL_Errno e,
6267 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006268#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006269 RLOGD("requestShutdownResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006270#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006271
6272 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08006273 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006274 populateResponseInfo(responseInfo, serial, responseType, e);
6275 Return<void> retStatus
6276 = radioService[slotId]->mRadioResponse->requestShutdownResponse(responseInfo);
6277 radioService[slotId]->checkReturnStatus(retStatus);
6278 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006279 RLOGE("requestShutdownResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006280 }
6281
6282 return 0;
6283}
6284
Amit Mahajan3df62912017-02-10 01:35:55 +00006285void responseRadioCapability(RadioResponseInfo& responseInfo, int serial,
6286 int responseType, RIL_Errno e, void *response, size_t responseLen, RadioCapability& rc) {
6287 populateResponseInfo(responseInfo, serial, responseType, e);
6288
Amit Mahajan1fbff082017-02-24 11:24:39 -08006289 if (response == NULL || responseLen != sizeof(RIL_RadioCapability)) {
Amit Mahajan3df62912017-02-10 01:35:55 +00006290 RLOGE("responseRadioCapability: Invalid response");
6291 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
Amit Mahajan3da9ac02017-02-13 13:41:28 -08006292 rc.logicalModemUuid = hidl_string();
Amit Mahajan3df62912017-02-10 01:35:55 +00006293 } else {
6294 convertRilRadioCapabilityToHal(response, responseLen, rc);
6295 }
6296}
6297
Amit Mahajan759786a2017-03-03 17:35:47 -08006298int radio::getRadioCapabilityResponse(int slotId,
Amit Mahajan3df62912017-02-10 01:35:55 +00006299 int responseType, int serial, RIL_Errno e,
6300 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006301#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006302 RLOGD("getRadioCapabilityResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006303#endif
Amit Mahajan3df62912017-02-10 01:35:55 +00006304
6305 if (radioService[slotId]->mRadioResponse != NULL) {
Amit Mahajan3da9ac02017-02-13 13:41:28 -08006306 RadioResponseInfo responseInfo = {};
6307 RadioCapability result = {};
Amit Mahajan3df62912017-02-10 01:35:55 +00006308 responseRadioCapability(responseInfo, serial, responseType, e, response, responseLen,
6309 result);
6310 Return<void> retStatus = radioService[slotId]->mRadioResponse->getRadioCapabilityResponse(
6311 responseInfo, result);
6312 radioService[slotId]->checkReturnStatus(retStatus);
6313 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006314 RLOGE("getRadioCapabilityResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Amit Mahajan3df62912017-02-10 01:35:55 +00006315 }
6316
6317 return 0;
6318}
6319
Amit Mahajan759786a2017-03-03 17:35:47 -08006320int radio::setRadioCapabilityResponse(int slotId,
Amit Mahajan3df62912017-02-10 01:35:55 +00006321 int responseType, int serial, RIL_Errno e,
6322 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006323#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006324 RLOGD("setRadioCapabilityResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006325#endif
Amit Mahajan3df62912017-02-10 01:35:55 +00006326
6327 if (radioService[slotId]->mRadioResponse != NULL) {
Amit Mahajan3da9ac02017-02-13 13:41:28 -08006328 RadioResponseInfo responseInfo = {};
6329 RadioCapability result = {};
Amit Mahajan3df62912017-02-10 01:35:55 +00006330 responseRadioCapability(responseInfo, serial, responseType, e, response, responseLen,
6331 result);
6332 Return<void> retStatus = radioService[slotId]->mRadioResponse->setRadioCapabilityResponse(
6333 responseInfo, result);
6334 radioService[slotId]->checkReturnStatus(retStatus);
6335 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006336 RLOGE("setRadioCapabilityResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Amit Mahajan3df62912017-02-10 01:35:55 +00006337 }
6338
6339 return 0;
6340}
6341
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006342LceStatusInfo responseLceStatusInfo(RadioResponseInfo& responseInfo, int serial, int responseType,
6343 RIL_Errno e, void *response, size_t responseLen) {
6344 populateResponseInfo(responseInfo, serial, responseType, e);
Jack Yuf68e0da2017-02-07 14:53:09 -08006345 LceStatusInfo result = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006346
6347 if (response == NULL || responseLen != sizeof(RIL_LceStatusInfo)) {
6348 RLOGE("Invalid response: NULL");
6349 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006350 } else {
6351 RIL_LceStatusInfo *resp = (RIL_LceStatusInfo *) response;
6352 result.lceStatus = (LceStatus) resp->lce_status;
6353 result.actualIntervalMs = (uint8_t) resp->actual_interval_ms;
6354 }
6355 return result;
6356}
6357
Amit Mahajan759786a2017-03-03 17:35:47 -08006358int radio::startLceServiceResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006359 int responseType, int serial, RIL_Errno e,
6360 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006361#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006362 RLOGD("startLceServiceResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006363#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006364
6365 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08006366 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006367 LceStatusInfo result = responseLceStatusInfo(responseInfo, serial, responseType, e,
6368 response, responseLen);
6369
6370 Return<void> retStatus
6371 = radioService[slotId]->mRadioResponse->startLceServiceResponse(responseInfo,
6372 result);
6373 radioService[slotId]->checkReturnStatus(retStatus);
6374 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006375 RLOGE("startLceServiceResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006376 }
6377
6378 return 0;
6379}
6380
Amit Mahajan759786a2017-03-03 17:35:47 -08006381int radio::stopLceServiceResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006382 int responseType, int serial, RIL_Errno e,
6383 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006384#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006385 RLOGD("stopLceServiceResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006386#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006387
6388 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08006389 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006390 LceStatusInfo result = responseLceStatusInfo(responseInfo, serial, responseType, e,
6391 response, responseLen);
6392
6393 Return<void> retStatus
6394 = radioService[slotId]->mRadioResponse->stopLceServiceResponse(responseInfo,
6395 result);
6396 radioService[slotId]->checkReturnStatus(retStatus);
6397 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006398 RLOGE("stopLceServiceResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006399 }
6400
6401 return 0;
6402}
6403
Amit Mahajan759786a2017-03-03 17:35:47 -08006404int radio::pullLceDataResponse(int slotId,
Amit Mahajan3df62912017-02-10 01:35:55 +00006405 int responseType, int serial, RIL_Errno e,
6406 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006407#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006408 RLOGD("pullLceDataResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006409#endif
Amit Mahajan3df62912017-02-10 01:35:55 +00006410
6411 if (radioService[slotId]->mRadioResponse != NULL) {
Amit Mahajan3da9ac02017-02-13 13:41:28 -08006412 RadioResponseInfo responseInfo = {};
Amit Mahajan3df62912017-02-10 01:35:55 +00006413 populateResponseInfo(responseInfo, serial, responseType, e);
6414
Amit Mahajan3da9ac02017-02-13 13:41:28 -08006415 LceDataInfo result = {};
Amit Mahajan3df62912017-02-10 01:35:55 +00006416 if (response == NULL || responseLen != sizeof(RIL_LceDataInfo)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006417 RLOGE("pullLceDataResponse: Invalid response");
Amit Mahajan3df62912017-02-10 01:35:55 +00006418 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
Amit Mahajan3df62912017-02-10 01:35:55 +00006419 } else {
6420 convertRilLceDataInfoToHal(response, responseLen, result);
6421 }
6422
6423 Return<void> retStatus = radioService[slotId]->mRadioResponse->pullLceDataResponse(
6424 responseInfo, result);
6425 radioService[slotId]->checkReturnStatus(retStatus);
6426 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006427 RLOGE("pullLceDataResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Amit Mahajan3df62912017-02-10 01:35:55 +00006428 }
6429
6430 return 0;
6431}
6432
Amit Mahajan759786a2017-03-03 17:35:47 -08006433int radio::getModemActivityInfoResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006434 int responseType, int serial, RIL_Errno e,
6435 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006436#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006437 RLOGD("getModemActivityInfoResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006438#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006439
6440 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08006441 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006442 populateResponseInfo(responseInfo, serial, responseType, e);
6443 ActivityStatsInfo info;
6444 if (response == NULL || responseLen != sizeof(RIL_ActivityStatsInfo)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006445 RLOGE("getModemActivityInfoResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006446 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006447 } else {
6448 RIL_ActivityStatsInfo *resp = (RIL_ActivityStatsInfo *)response;
6449 info.sleepModeTimeMs = resp->sleep_mode_time_ms;
6450 info.idleModeTimeMs = resp->idle_mode_time_ms;
6451 for(int i = 0; i < RIL_NUM_TX_POWER_LEVELS; i++) {
6452 info.txmModetimeMs[i] = resp->tx_mode_time_ms[i];
6453 }
6454 info.rxModeTimeMs = resp->rx_mode_time_ms;
6455 }
6456
6457 Return<void> retStatus
6458 = radioService[slotId]->mRadioResponse->getModemActivityInfoResponse(responseInfo,
6459 info);
6460 radioService[slotId]->checkReturnStatus(retStatus);
6461 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006462 RLOGE("getModemActivityInfoResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006463 slotId);
6464 }
6465
6466 return 0;
6467}
6468
Amit Mahajan759786a2017-03-03 17:35:47 -08006469int radio::setAllowedCarriersResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006470 int responseType, int serial, RIL_Errno e,
6471 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006472#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006473 RLOGD("setAllowedCarriersResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006474#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006475
6476 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08006477 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006478 int ret = responseInt(responseInfo, serial, responseType, e, response, responseLen);
6479 Return<void> retStatus
6480 = radioService[slotId]->mRadioResponse->setAllowedCarriersResponse(responseInfo,
6481 ret);
6482 radioService[slotId]->checkReturnStatus(retStatus);
6483 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006484 RLOGE("setAllowedCarriersResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006485 slotId);
6486 }
6487
6488 return 0;
6489}
6490
Amit Mahajan759786a2017-03-03 17:35:47 -08006491int radio::getAllowedCarriersResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006492 int responseType, int serial, RIL_Errno e,
6493 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006494#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006495 RLOGD("getAllowedCarriersResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006496#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006497
6498 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08006499 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006500 populateResponseInfo(responseInfo, serial, responseType, e);
Jack Yuf68e0da2017-02-07 14:53:09 -08006501 CarrierRestrictions carrierInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006502 bool allAllowed = true;
Jayachandran C70f7d2e2017-04-28 00:57:13 -07006503 if (response == NULL) {
6504#if VDBG
6505 RLOGD("getAllowedCarriersResponse response is NULL: all allowed");
6506#endif
6507 carrierInfo.allowedCarriers.resize(0);
6508 carrierInfo.excludedCarriers.resize(0);
6509 } else if (responseLen != sizeof(RIL_CarrierRestrictions)) {
6510 RLOGE("getAllowedCarriersResponse Invalid response");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006511 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
6512 } else {
6513 RIL_CarrierRestrictions *pCr = (RIL_CarrierRestrictions *)response;
6514 if (pCr->len_allowed_carriers > 0 || pCr->len_excluded_carriers > 0) {
6515 allAllowed = false;
6516 }
6517
6518 carrierInfo.allowedCarriers.resize(pCr->len_allowed_carriers);
6519 for(int i = 0; i < pCr->len_allowed_carriers; i++) {
6520 RIL_Carrier *carrier = pCr->allowed_carriers + i;
6521 carrierInfo.allowedCarriers[i].mcc = convertCharPtrToHidlString(carrier->mcc);
6522 carrierInfo.allowedCarriers[i].mnc = convertCharPtrToHidlString(carrier->mnc);
6523 carrierInfo.allowedCarriers[i].matchType = (CarrierMatchType) carrier->match_type;
6524 carrierInfo.allowedCarriers[i].matchData =
6525 convertCharPtrToHidlString(carrier->match_data);
6526 }
6527
6528 carrierInfo.excludedCarriers.resize(pCr->len_excluded_carriers);
6529 for(int i = 0; i < pCr->len_excluded_carriers; i++) {
6530 RIL_Carrier *carrier = pCr->excluded_carriers + i;
6531 carrierInfo.excludedCarriers[i].mcc = convertCharPtrToHidlString(carrier->mcc);
6532 carrierInfo.excludedCarriers[i].mnc = convertCharPtrToHidlString(carrier->mnc);
6533 carrierInfo.excludedCarriers[i].matchType = (CarrierMatchType) carrier->match_type;
6534 carrierInfo.excludedCarriers[i].matchData =
6535 convertCharPtrToHidlString(carrier->match_data);
6536 }
6537 }
6538
6539 Return<void> retStatus
6540 = radioService[slotId]->mRadioResponse->getAllowedCarriersResponse(responseInfo,
6541 allAllowed, carrierInfo);
6542 radioService[slotId]->checkReturnStatus(retStatus);
6543 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006544 RLOGE("getAllowedCarriersResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006545 slotId);
6546 }
6547
6548 return 0;
6549}
6550
Amit Mahajan759786a2017-03-03 17:35:47 -08006551int radio::sendDeviceStateResponse(int slotId,
Jack Yu11ab4042017-02-21 17:08:01 -08006552 int responseType, int serial, RIL_Errno e,
6553 void *response, size_t responselen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006554#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006555 RLOGD("sendDeviceStateResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006556#endif
Jack Yu11ab4042017-02-21 17:08:01 -08006557
6558 if (radioService[slotId]->mRadioResponse != NULL) {
6559 RadioResponseInfo responseInfo = {};
6560 populateResponseInfo(responseInfo, serial, responseType, e);
6561 Return<void> retStatus
6562 = radioService[slotId]->mRadioResponse->sendDeviceStateResponse(responseInfo);
6563 radioService[slotId]->checkReturnStatus(retStatus);
6564 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006565 RLOGE("sendDeviceStateResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Jack Yu11ab4042017-02-21 17:08:01 -08006566 }
6567
6568 return 0;
6569}
6570
pkanwardb8e0942017-03-17 12:49:34 -07006571int radio::setCarrierInfoForImsiEncryptionResponse(int slotId,
6572 int responseType, int serial, RIL_Errno e,
6573 void *response, size_t responseLen) {
6574 RLOGD("setCarrierInfoForImsiEncryptionResponse: serial %d", serial);
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07006575 if (radioService[slotId]->mRadioResponseV1_1 != NULL) {
pkanwardb8e0942017-03-17 12:49:34 -07006576 RadioResponseInfo responseInfo = {};
6577 populateResponseInfo(responseInfo, serial, responseType, e);
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07006578 Return<void> retStatus = radioService[slotId]->mRadioResponseV1_1->
6579 setCarrierInfoForImsiEncryptionResponse(responseInfo);
6580 radioService[slotId]->checkReturnStatus(retStatus);
pkanwardb8e0942017-03-17 12:49:34 -07006581 } else {
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07006582 RLOGE("setCarrierInfoForImsiEncryptionResponse: radioService[%d]->mRadioResponseV1_1 == "
6583 "NULL", slotId);
pkanwardb8e0942017-03-17 12:49:34 -07006584 }
6585 return 0;
6586}
6587
Amit Mahajan759786a2017-03-03 17:35:47 -08006588int radio::setIndicationFilterResponse(int slotId,
Jack Yu11ab4042017-02-21 17:08:01 -08006589 int responseType, int serial, RIL_Errno e,
6590 void *response, size_t responselen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006591#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006592 RLOGD("setIndicationFilterResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006593#endif
Jack Yu11ab4042017-02-21 17:08:01 -08006594
6595 if (radioService[slotId]->mRadioResponse != NULL) {
6596 RadioResponseInfo responseInfo = {};
6597 populateResponseInfo(responseInfo, serial, responseType, e);
6598 Return<void> retStatus
6599 = radioService[slotId]->mRadioResponse->setIndicationFilterResponse(responseInfo);
6600 radioService[slotId]->checkReturnStatus(retStatus);
6601 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006602 RLOGE("setIndicationFilterResponse: radioService[%d]->mRadioResponse == NULL",
Jack Yu11ab4042017-02-21 17:08:01 -08006603 slotId);
6604 }
6605
6606 return 0;
6607}
6608
Amit Mahajan759786a2017-03-03 17:35:47 -08006609int radio::setSimCardPowerResponse(int slotId,
Wileen Chiu718c0bf2017-01-04 11:37:19 -08006610 int responseType, int serial, RIL_Errno e,
6611 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006612#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006613 RLOGD("setSimCardPowerResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006614#endif
Wileen Chiu718c0bf2017-01-04 11:37:19 -08006615
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07006616 if (radioService[slotId]->mRadioResponse != NULL
6617 || radioService[slotId]->mRadioResponseV1_1 != NULL) {
Wileen Chiu718c0bf2017-01-04 11:37:19 -08006618 RadioResponseInfo responseInfo = {};
6619 populateResponseInfo(responseInfo, serial, responseType, e);
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07006620 if (radioService[slotId]->mRadioResponseV1_1 != NULL) {
6621 Return<void> retStatus = radioService[slotId]->mRadioResponseV1_1->
6622 setSimCardPowerResponse_1_1(responseInfo);
Grace Chen08eb6542017-03-23 18:39:48 -07006623 radioService[slotId]->checkReturnStatus(retStatus);
6624 } else {
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07006625 RLOGD("setSimCardPowerResponse: radioService[%d]->mRadioResponseV1_1 == NULL",
Grace Chen08eb6542017-03-23 18:39:48 -07006626 slotId);
6627 Return<void> retStatus
6628 = radioService[slotId]->mRadioResponse->setSimCardPowerResponse(responseInfo);
6629 radioService[slotId]->checkReturnStatus(retStatus);
6630 }
Wileen Chiu718c0bf2017-01-04 11:37:19 -08006631 } else {
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07006632 RLOGE("setSimCardPowerResponse: radioService[%d]->mRadioResponse == NULL && "
6633 "radioService[%d]->mRadioResponseV1_1 == NULL", slotId, slotId);
Wileen Chiu718c0bf2017-01-04 11:37:19 -08006634 }
Wileen Chiu718c0bf2017-01-04 11:37:19 -08006635 return 0;
6636}
6637
yinxu8688abd2017-05-22 11:26:45 -07006638int radio::startNetworkScanResponse(int slotId, int responseType, int serial, RIL_Errno e,
6639 void *response, size_t responseLen) {
6640#if VDBG
6641 RLOGD("startNetworkScanResponse: serial %d", serial);
6642#endif
6643
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07006644 if (radioService[slotId]->mRadioResponseV1_1 != NULL) {
yinxu8688abd2017-05-22 11:26:45 -07006645 RadioResponseInfo responseInfo = {};
6646 populateResponseInfo(responseInfo, serial, responseType, e);
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07006647 Return<void> retStatus
6648 = radioService[slotId]->mRadioResponseV1_1->startNetworkScanResponse(responseInfo);
6649 radioService[slotId]->checkReturnStatus(retStatus);
yinxu8688abd2017-05-22 11:26:45 -07006650 } else {
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07006651 RLOGE("startNetworkScanResponse: radioService[%d]->mRadioResponseV1_1 == NULL", slotId);
yinxu8688abd2017-05-22 11:26:45 -07006652 }
6653
6654 return 0;
6655}
6656
6657int radio::stopNetworkScanResponse(int slotId, int responseType, int serial, RIL_Errno e,
6658 void *response, size_t responseLen) {
6659#if VDBG
6660 RLOGD("stopNetworkScanResponse: serial %d", serial);
6661#endif
6662
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07006663 if (radioService[slotId]->mRadioResponseV1_1 != NULL) {
yinxu8688abd2017-05-22 11:26:45 -07006664 RadioResponseInfo responseInfo = {};
6665 populateResponseInfo(responseInfo, serial, responseType, e);
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07006666 Return<void> retStatus
6667 = radioService[slotId]->mRadioResponseV1_1->stopNetworkScanResponse(responseInfo);
6668 radioService[slotId]->checkReturnStatus(retStatus);
yinxu8688abd2017-05-22 11:26:45 -07006669 } else {
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07006670 RLOGE("stopNetworkScanResponse: radioService[%d]->mRadioResponseV1_1 == NULL", slotId);
yinxu8688abd2017-05-22 11:26:45 -07006671 }
6672
6673 return 0;
6674}
6675
Nathan Harold6a8809d2017-07-07 19:28:58 -07006676void convertRilKeepaliveStatusToHal(const RIL_KeepaliveStatus *rilStatus,
6677 V1_1::KeepaliveStatus& halStatus) {
6678 halStatus.sessionHandle = rilStatus->sessionHandle;
6679 halStatus.code = static_cast<V1_1::KeepaliveStatusCode>(rilStatus->code);
6680}
6681
6682int radio::startKeepaliveResponse(int slotId, int responseType, int serial, RIL_Errno e,
6683 void *response, size_t responseLen) {
6684#if VDBG
6685 RLOGD("%s(): %d", __FUNCTION__, serial);
6686#endif
6687 RadioResponseInfo responseInfo = {};
6688 populateResponseInfo(responseInfo, serial, responseType, e);
6689
6690 // If we don't have a radio service, there's nothing we can do
6691 if (radioService[slotId]->mRadioResponseV1_1 == NULL) {
6692 RLOGE("%s: radioService[%d]->mRadioResponseV1_1 == NULL", __FUNCTION__, slotId);
6693 return 0;
6694 }
6695
6696 V1_1::KeepaliveStatus ks = {};
6697 if (response == NULL || responseLen != sizeof(V1_1::KeepaliveStatus)) {
6698 RLOGE("%s: invalid response - %d", __FUNCTION__, static_cast<int>(e));
6699 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
6700 } else {
6701 convertRilKeepaliveStatusToHal(static_cast<RIL_KeepaliveStatus*>(response), ks);
6702 }
6703
6704 Return<void> retStatus =
6705 radioService[slotId]->mRadioResponseV1_1->startKeepaliveResponse(responseInfo, ks);
6706 radioService[slotId]->checkReturnStatus(retStatus);
6707 return 0;
6708}
6709
6710int radio::stopKeepaliveResponse(int slotId, int responseType, int serial, RIL_Errno e,
6711 void *response, size_t responseLen) {
6712#if VDBG
6713 RLOGD("%s(): %d", __FUNCTION__, serial);
6714#endif
6715 RadioResponseInfo responseInfo = {};
6716 populateResponseInfo(responseInfo, serial, responseType, e);
6717
6718 // If we don't have a radio service, there's nothing we can do
6719 if (radioService[slotId]->mRadioResponseV1_1 == NULL) {
6720 RLOGE("%s: radioService[%d]->mRadioResponseV1_1 == NULL", __FUNCTION__, slotId);
6721 return 0;
6722 }
6723
6724 Return<void> retStatus =
6725 radioService[slotId]->mRadioResponseV1_1->stopKeepaliveResponse(responseInfo);
6726 radioService[slotId]->checkReturnStatus(retStatus);
6727 return 0;
6728}
6729
Amit Mahajan759786a2017-03-03 17:35:47 -08006730int radio::sendRequestRawResponse(int slotId,
Amit Mahajan439da362017-02-13 17:43:04 -08006731 int responseType, int serial, RIL_Errno e,
6732 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006733#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006734 RLOGD("sendRequestRawResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006735#endif
Amit Mahajan439da362017-02-13 17:43:04 -08006736
Steven Moreland6cc40042018-03-20 11:20:05 -07006737 if (!kOemHookEnabled) return 0;
6738
Amit Mahajan439da362017-02-13 17:43:04 -08006739 if (oemHookService[slotId]->mOemHookResponse != NULL) {
6740 RadioResponseInfo responseInfo = {};
6741 populateResponseInfo(responseInfo, serial, responseType, e);
6742 hidl_vec<uint8_t> data;
6743
6744 if (response == NULL) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006745 RLOGE("sendRequestRawResponse: Invalid response");
Amit Mahajan439da362017-02-13 17:43:04 -08006746 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
6747 } else {
6748 data.setToExternal((uint8_t *) response, responseLen);
6749 }
6750 Return<void> retStatus = oemHookService[slotId]->mOemHookResponse->
6751 sendRequestRawResponse(responseInfo, data);
Amit Mahajand423d192017-03-16 17:04:01 -07006752 checkReturnStatus(slotId, retStatus, false);
Amit Mahajan439da362017-02-13 17:43:04 -08006753 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006754 RLOGE("sendRequestRawResponse: oemHookService[%d]->mOemHookResponse == NULL",
Amit Mahajan439da362017-02-13 17:43:04 -08006755 slotId);
6756 }
6757
6758 return 0;
6759}
6760
Amit Mahajan759786a2017-03-03 17:35:47 -08006761int radio::sendRequestStringsResponse(int slotId,
Amit Mahajan439da362017-02-13 17:43:04 -08006762 int responseType, int serial, RIL_Errno e,
6763 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006764#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006765 RLOGD("sendRequestStringsResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006766#endif
Amit Mahajan439da362017-02-13 17:43:04 -08006767
Steven Moreland6cc40042018-03-20 11:20:05 -07006768 if (!kOemHookEnabled) return 0;
6769
Amit Mahajan439da362017-02-13 17:43:04 -08006770 if (oemHookService[slotId]->mOemHookResponse != NULL) {
6771 RadioResponseInfo responseInfo = {};
6772 populateResponseInfo(responseInfo, serial, responseType, e);
6773 hidl_vec<hidl_string> data;
6774
Amit Mahajan13058cb2017-06-07 23:10:27 -07006775 if ((response == NULL && responseLen != 0) || responseLen % sizeof(char *) != 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006776 RLOGE("sendRequestStringsResponse Invalid response: NULL");
Amit Mahajan439da362017-02-13 17:43:04 -08006777 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
6778 } else {
6779 char **resp = (char **) response;
6780 int numStrings = responseLen / sizeof(char *);
6781 data.resize(numStrings);
6782 for (int i = 0; i < numStrings; i++) {
6783 data[i] = convertCharPtrToHidlString(resp[i]);
6784 }
6785 }
6786 Return<void> retStatus
6787 = oemHookService[slotId]->mOemHookResponse->sendRequestStringsResponse(
6788 responseInfo, data);
Amit Mahajand423d192017-03-16 17:04:01 -07006789 checkReturnStatus(slotId, retStatus, false);
Amit Mahajan439da362017-02-13 17:43:04 -08006790 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006791 RLOGE("sendRequestStringsResponse: oemHookService[%d]->mOemHookResponse == "
Amit Mahajan439da362017-02-13 17:43:04 -08006792 "NULL", slotId);
6793 }
6794
6795 return 0;
6796}
6797
Nathan Harold6a8809d2017-07-07 19:28:58 -07006798/***************************************************************************************************
6799 * INDICATION FUNCTIONS
6800 * The below function handle unsolicited messages coming from the Radio
6801 * (messages for which there is no pending request)
6802 **************************************************************************************************/
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006803
Amit Mahajan5829a472016-12-28 17:28:07 -08006804RadioIndicationType convertIntToRadioIndicationType(int indicationType) {
6805 return indicationType == RESPONSE_UNSOLICITED ? (RadioIndicationType::UNSOLICITED) :
6806 (RadioIndicationType::UNSOLICITED_ACK_EXP);
6807}
6808
Amit Mahajan759786a2017-03-03 17:35:47 -08006809int radio::radioStateChangedInd(int slotId,
Amit Mahajan1f652692017-03-01 12:08:46 -08006810 int indicationType, int token, RIL_Errno e, void *response,
6811 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08006812 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajanb3a11bb2017-05-15 16:41:44 -07006813 RadioState radioState =
6814 (RadioState) CALL_ONSTATEREQUEST(slotId);
Amit Mahajan111ddca2017-03-03 12:05:13 -08006815 RLOGD("radioStateChangedInd: radioState %d", radioState);
Amit Mahajan17249842017-01-19 15:05:45 -08006816 Return<void> retStatus = radioService[slotId]->mRadioIndication->radioStateChanged(
Amit Mahajan1f652692017-03-01 12:08:46 -08006817 convertIntToRadioIndicationType(indicationType), radioState);
Amit Mahajan17249842017-01-19 15:05:45 -08006818 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajancd77a5b2016-08-25 11:19:21 -07006819 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006820 RLOGE("radioStateChangedInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajancd77a5b2016-08-25 11:19:21 -07006821 }
Amit Mahajan1f652692017-03-01 12:08:46 -08006822
6823 return 0;
Amit Mahajancd77a5b2016-08-25 11:19:21 -07006824}
6825
Amit Mahajan759786a2017-03-03 17:35:47 -08006826int radio::callStateChangedInd(int slotId,
Amit Mahajan5829a472016-12-28 17:28:07 -08006827 int indicationType, int token, RIL_Errno e, void *response,
6828 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08006829 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006830#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006831 RLOGD("callStateChangedInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07006832#endif
Amit Mahajan17249842017-01-19 15:05:45 -08006833 Return<void> retStatus = radioService[slotId]->mRadioIndication->callStateChanged(
Amit Mahajan5829a472016-12-28 17:28:07 -08006834 convertIntToRadioIndicationType(indicationType));
Amit Mahajan17249842017-01-19 15:05:45 -08006835 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08006836 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006837 RLOGE("callStateChangedInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08006838 }
6839
6840 return 0;
6841}
6842
Amit Mahajan759786a2017-03-03 17:35:47 -08006843int radio::networkStateChangedInd(int slotId,
Amit Mahajan1f652692017-03-01 12:08:46 -08006844 int indicationType, int token, RIL_Errno e, void *response,
6845 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08006846 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006847#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006848 RLOGD("networkStateChangedInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07006849#endif
Jack Yu06181bb2017-01-10 12:10:41 -08006850 Return<void> retStatus = radioService[slotId]->mRadioIndication->networkStateChanged(
Amit Mahajan5829a472016-12-28 17:28:07 -08006851 convertIntToRadioIndicationType(indicationType));
Amit Mahajan17249842017-01-19 15:05:45 -08006852 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08006853 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006854 RLOGE("networkStateChangedInd: radioService[%d]->mRadioIndication == NULL",
Amit Mahajan2fa9e632017-01-06 16:55:33 -08006855 slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08006856 }
6857
6858 return 0;
6859}
6860
6861uint8_t hexCharToInt(uint8_t c) {
6862 if (c >= '0' && c <= '9') return (c - '0');
6863 if (c >= 'A' && c <= 'F') return (c - 'A' + 10);
6864 if (c >= 'a' && c <= 'f') return (c - 'a' + 10);
6865
6866 return INVALID_HEX_CHAR;
6867}
6868
6869uint8_t * convertHexStringToBytes(void *response, size_t responseLen) {
6870 if (responseLen % 2 != 0) {
6871 return NULL;
6872 }
6873
6874 uint8_t *bytes = (uint8_t *)calloc(responseLen/2, sizeof(uint8_t));
6875 if (bytes == NULL) {
6876 RLOGE("convertHexStringToBytes: cannot allocate memory for bytes string");
6877 return NULL;
6878 }
6879 uint8_t *hexString = (uint8_t *)response;
6880
Wei Wang100ac9b2017-02-03 14:18:07 -08006881 for (size_t i = 0; i < responseLen; i += 2) {
Amit Mahajan5829a472016-12-28 17:28:07 -08006882 uint8_t hexChar1 = hexCharToInt(hexString[i]);
6883 uint8_t hexChar2 = hexCharToInt(hexString[i + 1]);
6884
6885 if (hexChar1 == INVALID_HEX_CHAR || hexChar2 == INVALID_HEX_CHAR) {
6886 RLOGE("convertHexStringToBytes: invalid hex char %d %d",
6887 hexString[i], hexString[i + 1]);
6888 free(bytes);
6889 return NULL;
6890 }
6891 bytes[i/2] = ((hexChar1 << 4) | hexChar2);
6892 }
6893
6894 return bytes;
6895}
6896
Amit Mahajan759786a2017-03-03 17:35:47 -08006897int radio::newSmsInd(int slotId, int indicationType,
Amit Mahajan5829a472016-12-28 17:28:07 -08006898 int token, RIL_Errno e, void *response, size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08006899 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan5829a472016-12-28 17:28:07 -08006900 if (response == NULL || responseLen == 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006901 RLOGE("newSmsInd: invalid response");
Amit Mahajan5829a472016-12-28 17:28:07 -08006902 return 0;
6903 }
6904
6905 uint8_t *bytes = convertHexStringToBytes(response, responseLen);
6906 if (bytes == NULL) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006907 RLOGE("newSmsInd: convertHexStringToBytes failed");
Amit Mahajan5829a472016-12-28 17:28:07 -08006908 return 0;
6909 }
6910
6911 hidl_vec<uint8_t> pdu;
6912 pdu.setToExternal(bytes, responseLen/2);
Jayachandran C572f2f42017-03-25 14:30:13 -07006913#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006914 RLOGD("newSmsInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07006915#endif
Amit Mahajan17249842017-01-19 15:05:45 -08006916 Return<void> retStatus = radioService[slotId]->mRadioIndication->newSms(
Amit Mahajan5829a472016-12-28 17:28:07 -08006917 convertIntToRadioIndicationType(indicationType), pdu);
Amit Mahajan17249842017-01-19 15:05:45 -08006918 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08006919 free(bytes);
6920 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006921 RLOGE("newSmsInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08006922 }
6923
6924 return 0;
6925}
6926
Amit Mahajan759786a2017-03-03 17:35:47 -08006927int radio::newSmsStatusReportInd(int slotId,
Amit Mahajan5829a472016-12-28 17:28:07 -08006928 int indicationType, int token, RIL_Errno e, void *response,
6929 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08006930 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan5829a472016-12-28 17:28:07 -08006931 if (response == NULL || responseLen == 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006932 RLOGE("newSmsStatusReportInd: invalid response");
Amit Mahajan5829a472016-12-28 17:28:07 -08006933 return 0;
6934 }
6935
6936 uint8_t *bytes = convertHexStringToBytes(response, responseLen);
6937 if (bytes == NULL) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006938 RLOGE("newSmsStatusReportInd: convertHexStringToBytes failed");
Amit Mahajan5829a472016-12-28 17:28:07 -08006939 return 0;
6940 }
6941
6942 hidl_vec<uint8_t> pdu;
6943 pdu.setToExternal(bytes, responseLen/2);
Jayachandran C572f2f42017-03-25 14:30:13 -07006944#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006945 RLOGD("newSmsStatusReportInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07006946#endif
Amit Mahajan17249842017-01-19 15:05:45 -08006947 Return<void> retStatus = radioService[slotId]->mRadioIndication->newSmsStatusReport(
Amit Mahajan5829a472016-12-28 17:28:07 -08006948 convertIntToRadioIndicationType(indicationType), pdu);
Amit Mahajan17249842017-01-19 15:05:45 -08006949 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08006950 free(bytes);
6951 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006952 RLOGE("newSmsStatusReportInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08006953 }
6954
6955 return 0;
6956}
6957
Amit Mahajan759786a2017-03-03 17:35:47 -08006958int radio::newSmsOnSimInd(int slotId, int indicationType,
Amit Mahajan5829a472016-12-28 17:28:07 -08006959 int token, RIL_Errno e, void *response, size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08006960 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan5829a472016-12-28 17:28:07 -08006961 if (response == NULL || responseLen != sizeof(int)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006962 RLOGE("newSmsOnSimInd: invalid response");
Amit Mahajan5829a472016-12-28 17:28:07 -08006963 return 0;
6964 }
6965 int32_t recordNumber = ((int32_t *) response)[0];
Jayachandran C572f2f42017-03-25 14:30:13 -07006966#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006967 RLOGD("newSmsOnSimInd: slotIndex %d", recordNumber);
Jayachandran C572f2f42017-03-25 14:30:13 -07006968#endif
Amit Mahajan17249842017-01-19 15:05:45 -08006969 Return<void> retStatus = radioService[slotId]->mRadioIndication->newSmsOnSim(
Amit Mahajan5829a472016-12-28 17:28:07 -08006970 convertIntToRadioIndicationType(indicationType), recordNumber);
Amit Mahajan17249842017-01-19 15:05:45 -08006971 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08006972 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006973 RLOGE("newSmsOnSimInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08006974 }
6975
6976 return 0;
6977}
6978
Amit Mahajan759786a2017-03-03 17:35:47 -08006979int radio::onUssdInd(int slotId, int indicationType,
Amit Mahajan5829a472016-12-28 17:28:07 -08006980 int token, RIL_Errno e, void *response, size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08006981 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan5829a472016-12-28 17:28:07 -08006982 if (response == NULL || responseLen != 2 * sizeof(char *)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006983 RLOGE("onUssdInd: invalid response");
Amit Mahajan5829a472016-12-28 17:28:07 -08006984 return 0;
6985 }
6986 char **strings = (char **) response;
6987 char *mode = strings[0];
6988 hidl_string msg = convertCharPtrToHidlString(strings[1]);
6989 UssdModeType modeType = (UssdModeType) atoi(mode);
Jayachandran C572f2f42017-03-25 14:30:13 -07006990#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006991 RLOGD("onUssdInd: mode %s", mode);
Jayachandran C572f2f42017-03-25 14:30:13 -07006992#endif
Amit Mahajan17249842017-01-19 15:05:45 -08006993 Return<void> retStatus = radioService[slotId]->mRadioIndication->onUssd(
Amit Mahajan5829a472016-12-28 17:28:07 -08006994 convertIntToRadioIndicationType(indicationType), modeType, msg);
Amit Mahajan17249842017-01-19 15:05:45 -08006995 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08006996 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006997 RLOGE("onUssdInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08006998 }
6999
7000 return 0;
7001}
7002
Amit Mahajan759786a2017-03-03 17:35:47 -08007003int radio::nitzTimeReceivedInd(int slotId,
Amit Mahajan5829a472016-12-28 17:28:07 -08007004 int indicationType, int token, RIL_Errno e, void *response,
7005 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007006 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan5829a472016-12-28 17:28:07 -08007007 if (response == NULL || responseLen == 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007008 RLOGE("nitzTimeReceivedInd: invalid response");
Amit Mahajan5829a472016-12-28 17:28:07 -08007009 return 0;
7010 }
7011 hidl_string nitzTime = convertCharPtrToHidlString((char *) response);
Jayachandran C572f2f42017-03-25 14:30:13 -07007012#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007013 RLOGD("nitzTimeReceivedInd: nitzTime %s receivedTime %" PRId64, nitzTime.c_str(),
Amit Mahajane9a10e62018-02-23 17:12:15 -08007014 nitzTimeReceived[slotId]);
Jayachandran C572f2f42017-03-25 14:30:13 -07007015#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007016 Return<void> retStatus = radioService[slotId]->mRadioIndication->nitzTimeReceived(
Amit Mahajane9a10e62018-02-23 17:12:15 -08007017 convertIntToRadioIndicationType(indicationType), nitzTime,
7018 nitzTimeReceived[slotId]);
Amit Mahajan17249842017-01-19 15:05:45 -08007019 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08007020 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007021 RLOGE("nitzTimeReceivedInd: radioService[%d]->mRadioIndication == NULL", slotId);
Weilun Dud2c30932017-02-09 12:32:42 -08007022 return -1;
Amit Mahajan5829a472016-12-28 17:28:07 -08007023 }
7024
7025 return 0;
7026}
7027
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007028void convertRilSignalStrengthToHal(void *response, size_t responseLen,
7029 SignalStrength& signalStrength) {
7030 RIL_SignalStrength_v10 *rilSignalStrength = (RIL_SignalStrength_v10 *) response;
7031
7032 // Fixup LTE for backwards compatibility
7033 // signalStrength: -1 -> 99
7034 if (rilSignalStrength->LTE_SignalStrength.signalStrength == -1) {
7035 rilSignalStrength->LTE_SignalStrength.signalStrength = 99;
7036 }
7037 // rsrp: -1 -> INT_MAX all other negative value to positive.
7038 // So remap here
7039 if (rilSignalStrength->LTE_SignalStrength.rsrp == -1) {
7040 rilSignalStrength->LTE_SignalStrength.rsrp = INT_MAX;
7041 } else if (rilSignalStrength->LTE_SignalStrength.rsrp < -1) {
7042 rilSignalStrength->LTE_SignalStrength.rsrp = -rilSignalStrength->LTE_SignalStrength.rsrp;
7043 }
7044 // rsrq: -1 -> INT_MAX
7045 if (rilSignalStrength->LTE_SignalStrength.rsrq == -1) {
7046 rilSignalStrength->LTE_SignalStrength.rsrq = INT_MAX;
7047 }
7048 // Not remapping rssnr is already using INT_MAX
7049 // cqi: -1 -> INT_MAX
7050 if (rilSignalStrength->LTE_SignalStrength.cqi == -1) {
7051 rilSignalStrength->LTE_SignalStrength.cqi = INT_MAX;
7052 }
7053
7054 signalStrength.gw.signalStrength = rilSignalStrength->GW_SignalStrength.signalStrength;
7055 signalStrength.gw.bitErrorRate = rilSignalStrength->GW_SignalStrength.bitErrorRate;
7056 signalStrength.cdma.dbm = rilSignalStrength->CDMA_SignalStrength.dbm;
7057 signalStrength.cdma.ecio = rilSignalStrength->CDMA_SignalStrength.ecio;
7058 signalStrength.evdo.dbm = rilSignalStrength->EVDO_SignalStrength.dbm;
7059 signalStrength.evdo.ecio = rilSignalStrength->EVDO_SignalStrength.ecio;
7060 signalStrength.evdo.signalNoiseRatio =
7061 rilSignalStrength->EVDO_SignalStrength.signalNoiseRatio;
7062 signalStrength.lte.signalStrength = rilSignalStrength->LTE_SignalStrength.signalStrength;
7063 signalStrength.lte.rsrp = rilSignalStrength->LTE_SignalStrength.rsrp;
7064 signalStrength.lte.rsrq = rilSignalStrength->LTE_SignalStrength.rsrq;
7065 signalStrength.lte.rssnr = rilSignalStrength->LTE_SignalStrength.rssnr;
7066 signalStrength.lte.cqi = rilSignalStrength->LTE_SignalStrength.cqi;
7067 signalStrength.lte.timingAdvance = rilSignalStrength->LTE_SignalStrength.timingAdvance;
7068 signalStrength.tdScdma.rscp = rilSignalStrength->TD_SCDMA_SignalStrength.rscp;
7069}
7070
Amit Mahajan759786a2017-03-03 17:35:47 -08007071int radio::currentSignalStrengthInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007072 int indicationType, int token, RIL_Errno e,
7073 void *response, size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007074 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007075 if (response == NULL || responseLen != sizeof(RIL_SignalStrength_v10)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007076 RLOGE("currentSignalStrengthInd: invalid response");
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007077 return 0;
7078 }
7079
Jack Yuf68e0da2017-02-07 14:53:09 -08007080 SignalStrength signalStrength = {};
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007081 convertRilSignalStrengthToHal(response, responseLen, signalStrength);
7082
Jayachandran C572f2f42017-03-25 14:30:13 -07007083#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007084 RLOGD("currentSignalStrengthInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07007085#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007086 Return<void> retStatus = radioService[slotId]->mRadioIndication->currentSignalStrength(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007087 convertIntToRadioIndicationType(indicationType), signalStrength);
Amit Mahajan17249842017-01-19 15:05:45 -08007088 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007089 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007090 RLOGE("currentSignalStrengthInd: radioService[%d]->mRadioIndication == NULL",
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007091 slotId);
7092 }
7093
7094 return 0;
7095}
7096
Amit Mahajan5829a472016-12-28 17:28:07 -08007097void convertRilDataCallToHal(RIL_Data_Call_Response_v11 *dcResponse,
7098 SetupDataCallResult& dcResult) {
Jack Yu5079e182017-02-28 15:21:18 -08007099 dcResult.status = (DataCallFailCause) dcResponse->status;
Amit Mahajan5829a472016-12-28 17:28:07 -08007100 dcResult.suggestedRetryTime = dcResponse->suggestedRetryTime;
7101 dcResult.cid = dcResponse->cid;
7102 dcResult.active = dcResponse->active;
7103 dcResult.type = convertCharPtrToHidlString(dcResponse->type);
7104 dcResult.ifname = convertCharPtrToHidlString(dcResponse->ifname);
7105 dcResult.addresses = convertCharPtrToHidlString(dcResponse->addresses);
7106 dcResult.dnses = convertCharPtrToHidlString(dcResponse->dnses);
7107 dcResult.gateways = convertCharPtrToHidlString(dcResponse->gateways);
7108 dcResult.pcscf = convertCharPtrToHidlString(dcResponse->pcscf);
7109 dcResult.mtu = dcResponse->mtu;
7110}
7111
7112void convertRilDataCallListToHal(void *response, size_t responseLen,
7113 hidl_vec<SetupDataCallResult>& dcResultList) {
7114 int num = responseLen / sizeof(RIL_Data_Call_Response_v11);
7115
7116 RIL_Data_Call_Response_v11 *dcResponse = (RIL_Data_Call_Response_v11 *) response;
7117 dcResultList.resize(num);
7118 for (int i = 0; i < num; i++) {
7119 convertRilDataCallToHal(&dcResponse[i], dcResultList[i]);
7120 }
7121}
7122
Amit Mahajan759786a2017-03-03 17:35:47 -08007123int radio::dataCallListChangedInd(int slotId,
Amit Mahajan5829a472016-12-28 17:28:07 -08007124 int indicationType, int token, RIL_Errno e, void *response,
7125 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007126 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan13058cb2017-06-07 23:10:27 -07007127 if ((response == NULL && responseLen != 0)
7128 || responseLen % sizeof(RIL_Data_Call_Response_v11) != 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007129 RLOGE("dataCallListChangedInd: invalid response");
Amit Mahajan5829a472016-12-28 17:28:07 -08007130 return 0;
7131 }
7132 hidl_vec<SetupDataCallResult> dcList;
7133 convertRilDataCallListToHal(response, responseLen, dcList);
Jayachandran C572f2f42017-03-25 14:30:13 -07007134#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007135 RLOGD("dataCallListChangedInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07007136#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007137 Return<void> retStatus = radioService[slotId]->mRadioIndication->dataCallListChanged(
Amit Mahajan5829a472016-12-28 17:28:07 -08007138 convertIntToRadioIndicationType(indicationType), dcList);
Amit Mahajan17249842017-01-19 15:05:45 -08007139 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08007140 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007141 RLOGE("dataCallListChangedInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08007142 }
7143
7144 return 0;
7145}
7146
Amit Mahajan759786a2017-03-03 17:35:47 -08007147int radio::suppSvcNotifyInd(int slotId, int indicationType,
Amit Mahajan5829a472016-12-28 17:28:07 -08007148 int token, RIL_Errno e, void *response, size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007149 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan5829a472016-12-28 17:28:07 -08007150 if (response == NULL || responseLen != sizeof(RIL_SuppSvcNotification)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007151 RLOGE("suppSvcNotifyInd: invalid response");
Amit Mahajan5829a472016-12-28 17:28:07 -08007152 return 0;
7153 }
7154
Jack Yuf68e0da2017-02-07 14:53:09 -08007155 SuppSvcNotification suppSvc = {};
Amit Mahajan5829a472016-12-28 17:28:07 -08007156 RIL_SuppSvcNotification *ssn = (RIL_SuppSvcNotification *) response;
7157 suppSvc.isMT = ssn->notificationType;
7158 suppSvc.code = ssn->code;
7159 suppSvc.index = ssn->index;
7160 suppSvc.type = ssn->type;
7161 suppSvc.number = convertCharPtrToHidlString(ssn->number);
7162
Jayachandran C572f2f42017-03-25 14:30:13 -07007163#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007164 RLOGD("suppSvcNotifyInd: isMT %d code %d index %d type %d",
Amit Mahajan5829a472016-12-28 17:28:07 -08007165 suppSvc.isMT, suppSvc.code, suppSvc.index, suppSvc.type);
Jayachandran C572f2f42017-03-25 14:30:13 -07007166#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007167 Return<void> retStatus = radioService[slotId]->mRadioIndication->suppSvcNotify(
Amit Mahajan5829a472016-12-28 17:28:07 -08007168 convertIntToRadioIndicationType(indicationType), suppSvc);
Amit Mahajan17249842017-01-19 15:05:45 -08007169 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08007170 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007171 RLOGE("suppSvcNotifyInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08007172 }
7173
7174 return 0;
7175}
7176
Amit Mahajan759786a2017-03-03 17:35:47 -08007177int radio::stkSessionEndInd(int slotId, int indicationType,
Amit Mahajan5829a472016-12-28 17:28:07 -08007178 int token, RIL_Errno e, void *response, size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007179 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Jayachandran C572f2f42017-03-25 14:30:13 -07007180#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007181 RLOGD("stkSessionEndInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07007182#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007183 Return<void> retStatus = radioService[slotId]->mRadioIndication->stkSessionEnd(
Amit Mahajan5829a472016-12-28 17:28:07 -08007184 convertIntToRadioIndicationType(indicationType));
Amit Mahajan17249842017-01-19 15:05:45 -08007185 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08007186 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007187 RLOGE("stkSessionEndInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08007188 }
7189
7190 return 0;
7191}
7192
Amit Mahajan759786a2017-03-03 17:35:47 -08007193int radio::stkProactiveCommandInd(int slotId,
Amit Mahajan5829a472016-12-28 17:28:07 -08007194 int indicationType, int token, RIL_Errno e, void *response,
7195 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007196 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan5829a472016-12-28 17:28:07 -08007197 if (response == NULL || responseLen == 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007198 RLOGE("stkProactiveCommandInd: invalid response");
Amit Mahajan5829a472016-12-28 17:28:07 -08007199 return 0;
7200 }
Jayachandran C572f2f42017-03-25 14:30:13 -07007201#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007202 RLOGD("stkProactiveCommandInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07007203#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007204 Return<void> retStatus = radioService[slotId]->mRadioIndication->stkProactiveCommand(
Amit Mahajan5829a472016-12-28 17:28:07 -08007205 convertIntToRadioIndicationType(indicationType),
7206 convertCharPtrToHidlString((char *) response));
Amit Mahajan17249842017-01-19 15:05:45 -08007207 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08007208 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007209 RLOGE("stkProactiveCommandInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08007210 }
7211
7212 return 0;
7213}
7214
Amit Mahajan759786a2017-03-03 17:35:47 -08007215int radio::stkEventNotifyInd(int slotId, int indicationType,
Amit Mahajan5829a472016-12-28 17:28:07 -08007216 int token, RIL_Errno e, void *response, size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007217 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan5829a472016-12-28 17:28:07 -08007218 if (response == NULL || responseLen == 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007219 RLOGE("stkEventNotifyInd: invalid response");
Amit Mahajan5829a472016-12-28 17:28:07 -08007220 return 0;
7221 }
Jayachandran C572f2f42017-03-25 14:30:13 -07007222#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007223 RLOGD("stkEventNotifyInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07007224#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007225 Return<void> retStatus = radioService[slotId]->mRadioIndication->stkEventNotify(
Amit Mahajan5829a472016-12-28 17:28:07 -08007226 convertIntToRadioIndicationType(indicationType),
7227 convertCharPtrToHidlString((char *) response));
Amit Mahajan17249842017-01-19 15:05:45 -08007228 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08007229 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007230 RLOGE("stkEventNotifyInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08007231 }
7232
7233 return 0;
7234}
7235
Amit Mahajan759786a2017-03-03 17:35:47 -08007236int radio::stkCallSetupInd(int slotId, int indicationType,
Amit Mahajan5829a472016-12-28 17:28:07 -08007237 int token, RIL_Errno e, void *response, size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007238 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan5829a472016-12-28 17:28:07 -08007239 if (response == NULL || responseLen != sizeof(int)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007240 RLOGE("stkCallSetupInd: invalid response");
Amit Mahajan5829a472016-12-28 17:28:07 -08007241 return 0;
7242 }
7243 int32_t timeout = ((int32_t *) response)[0];
Jayachandran C572f2f42017-03-25 14:30:13 -07007244#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007245 RLOGD("stkCallSetupInd: timeout %d", timeout);
Jayachandran C572f2f42017-03-25 14:30:13 -07007246#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007247 Return<void> retStatus = radioService[slotId]->mRadioIndication->stkCallSetup(
Amit Mahajan5829a472016-12-28 17:28:07 -08007248 convertIntToRadioIndicationType(indicationType), timeout);
Amit Mahajan17249842017-01-19 15:05:45 -08007249 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08007250 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007251 RLOGE("stkCallSetupInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08007252 }
7253
7254 return 0;
7255}
7256
Amit Mahajan759786a2017-03-03 17:35:47 -08007257int radio::simSmsStorageFullInd(int slotId,
Amit Mahajan5829a472016-12-28 17:28:07 -08007258 int indicationType, int token, RIL_Errno e, void *response,
7259 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007260 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Jayachandran C572f2f42017-03-25 14:30:13 -07007261#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007262 RLOGD("simSmsStorageFullInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07007263#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007264 Return<void> retStatus = radioService[slotId]->mRadioIndication->simSmsStorageFull(
Amit Mahajan5829a472016-12-28 17:28:07 -08007265 convertIntToRadioIndicationType(indicationType));
Amit Mahajan17249842017-01-19 15:05:45 -08007266 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08007267 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007268 RLOGE("simSmsStorageFullInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08007269 }
7270
7271 return 0;
7272}
7273
Amit Mahajan759786a2017-03-03 17:35:47 -08007274int radio::simRefreshInd(int slotId, int indicationType,
Amit Mahajan5829a472016-12-28 17:28:07 -08007275 int token, RIL_Errno e, void *response, size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007276 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan5829a472016-12-28 17:28:07 -08007277 if (response == NULL || responseLen != sizeof(RIL_SimRefreshResponse_v7)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007278 RLOGE("simRefreshInd: invalid response");
Amit Mahajan5829a472016-12-28 17:28:07 -08007279 return 0;
7280 }
7281
Jack Yuf68e0da2017-02-07 14:53:09 -08007282 SimRefreshResult refreshResult = {};
Amit Mahajan5829a472016-12-28 17:28:07 -08007283 RIL_SimRefreshResponse_v7 *simRefreshResponse = ((RIL_SimRefreshResponse_v7 *) response);
7284 refreshResult.type =
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07007285 (V1_0::SimRefreshType) simRefreshResponse->result;
Amit Mahajan5829a472016-12-28 17:28:07 -08007286 refreshResult.efId = simRefreshResponse->ef_id;
7287 refreshResult.aid = convertCharPtrToHidlString(simRefreshResponse->aid);
7288
Jayachandran C572f2f42017-03-25 14:30:13 -07007289#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007290 RLOGD("simRefreshInd: type %d efId %d", refreshResult.type, refreshResult.efId);
Jayachandran C572f2f42017-03-25 14:30:13 -07007291#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007292 Return<void> retStatus = radioService[slotId]->mRadioIndication->simRefresh(
Amit Mahajan5829a472016-12-28 17:28:07 -08007293 convertIntToRadioIndicationType(indicationType), refreshResult);
Amit Mahajan17249842017-01-19 15:05:45 -08007294 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08007295 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007296 RLOGE("simRefreshInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08007297 }
7298
7299 return 0;
7300}
7301
7302void convertRilCdmaSignalInfoRecordToHal(RIL_CDMA_SignalInfoRecord *signalInfoRecord,
7303 CdmaSignalInfoRecord& record) {
7304 record.isPresent = signalInfoRecord->isPresent;
7305 record.signalType = signalInfoRecord->signalType;
7306 record.alertPitch = signalInfoRecord->alertPitch;
7307 record.signal = signalInfoRecord->signal;
7308}
7309
Amit Mahajan759786a2017-03-03 17:35:47 -08007310int radio::callRingInd(int slotId, int indicationType,
Amit Mahajan5829a472016-12-28 17:28:07 -08007311 int token, RIL_Errno e, void *response, size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007312 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan5829a472016-12-28 17:28:07 -08007313 bool isGsm;
Jack Yuf68e0da2017-02-07 14:53:09 -08007314 CdmaSignalInfoRecord record = {};
Amit Mahajan5829a472016-12-28 17:28:07 -08007315 if (response == NULL || responseLen == 0) {
7316 isGsm = true;
7317 } else {
7318 isGsm = false;
7319 if (responseLen != sizeof (RIL_CDMA_SignalInfoRecord)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007320 RLOGE("callRingInd: invalid response");
Amit Mahajan5829a472016-12-28 17:28:07 -08007321 return 0;
7322 }
7323 convertRilCdmaSignalInfoRecordToHal((RIL_CDMA_SignalInfoRecord *) response, record);
7324 }
7325
Jayachandran C572f2f42017-03-25 14:30:13 -07007326#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007327 RLOGD("callRingInd: isGsm %d", isGsm);
Jayachandran C572f2f42017-03-25 14:30:13 -07007328#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007329 Return<void> retStatus = radioService[slotId]->mRadioIndication->callRing(
Amit Mahajan5829a472016-12-28 17:28:07 -08007330 convertIntToRadioIndicationType(indicationType), isGsm, record);
Amit Mahajan17249842017-01-19 15:05:45 -08007331 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08007332 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007333 RLOGE("callRingInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08007334 }
7335
7336 return 0;
7337}
7338
Amit Mahajan759786a2017-03-03 17:35:47 -08007339int radio::simStatusChangedInd(int slotId,
Amit Mahajan5829a472016-12-28 17:28:07 -08007340 int indicationType, int token, RIL_Errno e, void *response,
7341 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007342 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Jayachandran C572f2f42017-03-25 14:30:13 -07007343#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007344 RLOGD("simStatusChangedInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07007345#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007346 Return<void> retStatus = radioService[slotId]->mRadioIndication->simStatusChanged(
Amit Mahajan5829a472016-12-28 17:28:07 -08007347 convertIntToRadioIndicationType(indicationType));
Amit Mahajan17249842017-01-19 15:05:45 -08007348 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08007349 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007350 RLOGE("simStatusChangedInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08007351 }
7352
7353 return 0;
7354}
7355
Amit Mahajan759786a2017-03-03 17:35:47 -08007356int radio::cdmaNewSmsInd(int slotId, int indicationType,
Amit Mahajan5829a472016-12-28 17:28:07 -08007357 int token, RIL_Errno e, void *response, size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007358 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan5829a472016-12-28 17:28:07 -08007359 if (response == NULL || responseLen != sizeof(RIL_CDMA_SMS_Message)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007360 RLOGE("cdmaNewSmsInd: invalid response");
Amit Mahajan5829a472016-12-28 17:28:07 -08007361 return 0;
7362 }
7363
Jack Yuf68e0da2017-02-07 14:53:09 -08007364 CdmaSmsMessage msg = {};
Amit Mahajan5829a472016-12-28 17:28:07 -08007365 RIL_CDMA_SMS_Message *rilMsg = (RIL_CDMA_SMS_Message *) response;
7366 msg.teleserviceId = rilMsg->uTeleserviceID;
7367 msg.isServicePresent = rilMsg->bIsServicePresent;
7368 msg.serviceCategory = rilMsg->uServicecategory;
7369 msg.address.digitMode =
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07007370 (V1_0::CdmaSmsDigitMode) rilMsg->sAddress.digit_mode;
Amit Mahajan5829a472016-12-28 17:28:07 -08007371 msg.address.numberMode =
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07007372 (V1_0::CdmaSmsNumberMode) rilMsg->sAddress.number_mode;
Amit Mahajan5829a472016-12-28 17:28:07 -08007373 msg.address.numberType =
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07007374 (V1_0::CdmaSmsNumberType) rilMsg->sAddress.number_type;
Amit Mahajan5829a472016-12-28 17:28:07 -08007375 msg.address.numberPlan =
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07007376 (V1_0::CdmaSmsNumberPlan) rilMsg->sAddress.number_plan;
Amit Mahajan5829a472016-12-28 17:28:07 -08007377
7378 int digitLimit = MIN((rilMsg->sAddress.number_of_digits), RIL_CDMA_SMS_ADDRESS_MAX);
7379 msg.address.digits.setToExternal(rilMsg->sAddress.digits, digitLimit);
7380
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07007381 msg.subAddress.subaddressType = (V1_0::CdmaSmsSubaddressType)
Amit Mahajan5829a472016-12-28 17:28:07 -08007382 rilMsg->sSubAddress.subaddressType;
7383 msg.subAddress.odd = rilMsg->sSubAddress.odd;
7384
7385 digitLimit= MIN((rilMsg->sSubAddress.number_of_digits), RIL_CDMA_SMS_SUBADDRESS_MAX);
7386 msg.subAddress.digits.setToExternal(rilMsg->sSubAddress.digits, digitLimit);
7387
7388 digitLimit = MIN((rilMsg->uBearerDataLen), RIL_CDMA_SMS_BEARER_DATA_MAX);
7389 msg.bearerData.setToExternal(rilMsg->aBearerData, digitLimit);
7390
Jayachandran C572f2f42017-03-25 14:30:13 -07007391#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007392 RLOGD("cdmaNewSmsInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07007393#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007394 Return<void> retStatus = radioService[slotId]->mRadioIndication->cdmaNewSms(
Amit Mahajan5829a472016-12-28 17:28:07 -08007395 convertIntToRadioIndicationType(indicationType), msg);
Amit Mahajan17249842017-01-19 15:05:45 -08007396 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08007397 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007398 RLOGE("cdmaNewSmsInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08007399 }
7400
7401 return 0;
7402}
7403
Amit Mahajan759786a2017-03-03 17:35:47 -08007404int radio::newBroadcastSmsInd(int slotId,
Amit Mahajan1955c742016-12-29 07:07:54 -08007405 int indicationType, int token, RIL_Errno e, void *response,
7406 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007407 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan1955c742016-12-29 07:07:54 -08007408 if (response == NULL || responseLen == 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007409 RLOGE("newBroadcastSmsInd: invalid response");
Amit Mahajan1955c742016-12-29 07:07:54 -08007410 return 0;
7411 }
7412
7413 hidl_vec<uint8_t> data;
7414 data.setToExternal((uint8_t *) response, responseLen);
Jayachandran C572f2f42017-03-25 14:30:13 -07007415#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007416 RLOGD("newBroadcastSmsInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07007417#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007418 Return<void> retStatus = radioService[slotId]->mRadioIndication->newBroadcastSms(
Amit Mahajan1955c742016-12-29 07:07:54 -08007419 convertIntToRadioIndicationType(indicationType), data);
Amit Mahajan17249842017-01-19 15:05:45 -08007420 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan1955c742016-12-29 07:07:54 -08007421 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007422 RLOGE("newBroadcastSmsInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan1955c742016-12-29 07:07:54 -08007423 }
7424
7425 return 0;
7426}
7427
Amit Mahajan759786a2017-03-03 17:35:47 -08007428int radio::cdmaRuimSmsStorageFullInd(int slotId,
Amit Mahajan1955c742016-12-29 07:07:54 -08007429 int indicationType, int token, RIL_Errno e, void *response,
7430 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007431 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Jayachandran C572f2f42017-03-25 14:30:13 -07007432#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007433 RLOGD("cdmaRuimSmsStorageFullInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07007434#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007435 Return<void> retStatus = radioService[slotId]->mRadioIndication->cdmaRuimSmsStorageFull(
Amit Mahajan1955c742016-12-29 07:07:54 -08007436 convertIntToRadioIndicationType(indicationType));
Amit Mahajan17249842017-01-19 15:05:45 -08007437 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan1955c742016-12-29 07:07:54 -08007438 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007439 RLOGE("cdmaRuimSmsStorageFullInd: radioService[%d]->mRadioIndication == NULL",
Amit Mahajan1955c742016-12-29 07:07:54 -08007440 slotId);
7441 }
7442
7443 return 0;
7444}
7445
Amit Mahajan759786a2017-03-03 17:35:47 -08007446int radio::restrictedStateChangedInd(int slotId,
Amit Mahajan1955c742016-12-29 07:07:54 -08007447 int indicationType, int token, RIL_Errno e, void *response,
7448 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007449 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan1955c742016-12-29 07:07:54 -08007450 if (response == NULL || responseLen != sizeof(int)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007451 RLOGE("restrictedStateChangedInd: invalid response");
Amit Mahajan1955c742016-12-29 07:07:54 -08007452 return 0;
7453 }
7454 int32_t state = ((int32_t *) response)[0];
Jayachandran C572f2f42017-03-25 14:30:13 -07007455#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007456 RLOGD("restrictedStateChangedInd: state %d", state);
Jayachandran C572f2f42017-03-25 14:30:13 -07007457#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007458 Return<void> retStatus = radioService[slotId]->mRadioIndication->restrictedStateChanged(
Amit Mahajan1955c742016-12-29 07:07:54 -08007459 convertIntToRadioIndicationType(indicationType), (PhoneRestrictedState) state);
Amit Mahajan17249842017-01-19 15:05:45 -08007460 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan1955c742016-12-29 07:07:54 -08007461 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007462 RLOGE("restrictedStateChangedInd: radioService[%d]->mRadioIndication == NULL",
Amit Mahajan1955c742016-12-29 07:07:54 -08007463 slotId);
7464 }
7465
7466 return 0;
7467}
7468
Amit Mahajan759786a2017-03-03 17:35:47 -08007469int radio::enterEmergencyCallbackModeInd(int slotId,
Amit Mahajan1955c742016-12-29 07:07:54 -08007470 int indicationType, int token, RIL_Errno e, void *response,
7471 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007472 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Jayachandran C572f2f42017-03-25 14:30:13 -07007473#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007474 RLOGD("enterEmergencyCallbackModeInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07007475#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007476 Return<void> retStatus = radioService[slotId]->mRadioIndication->enterEmergencyCallbackMode(
Amit Mahajan1955c742016-12-29 07:07:54 -08007477 convertIntToRadioIndicationType(indicationType));
Amit Mahajan17249842017-01-19 15:05:45 -08007478 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan1955c742016-12-29 07:07:54 -08007479 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007480 RLOGE("enterEmergencyCallbackModeInd: radioService[%d]->mRadioIndication == NULL",
Amit Mahajan1955c742016-12-29 07:07:54 -08007481 slotId);
7482 }
7483
7484 return 0;
7485}
7486
Amit Mahajan759786a2017-03-03 17:35:47 -08007487int radio::cdmaCallWaitingInd(int slotId,
Amit Mahajan1955c742016-12-29 07:07:54 -08007488 int indicationType, int token, RIL_Errno e, void *response,
7489 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007490 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan1955c742016-12-29 07:07:54 -08007491 if (response == NULL || responseLen != sizeof(RIL_CDMA_CallWaiting_v6)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007492 RLOGE("cdmaCallWaitingInd: invalid response");
Amit Mahajan1955c742016-12-29 07:07:54 -08007493 return 0;
7494 }
7495
Jack Yuf68e0da2017-02-07 14:53:09 -08007496 CdmaCallWaiting callWaitingRecord = {};
Amit Mahajan1955c742016-12-29 07:07:54 -08007497 RIL_CDMA_CallWaiting_v6 *callWaitingRil = ((RIL_CDMA_CallWaiting_v6 *) response);
7498 callWaitingRecord.number = convertCharPtrToHidlString(callWaitingRil->number);
7499 callWaitingRecord.numberPresentation =
7500 (CdmaCallWaitingNumberPresentation) callWaitingRil->numberPresentation;
7501 callWaitingRecord.name = convertCharPtrToHidlString(callWaitingRil->name);
7502 convertRilCdmaSignalInfoRecordToHal(&callWaitingRil->signalInfoRecord,
7503 callWaitingRecord.signalInfoRecord);
7504 callWaitingRecord.numberType = (CdmaCallWaitingNumberType) callWaitingRil->number_type;
7505 callWaitingRecord.numberPlan = (CdmaCallWaitingNumberPlan) callWaitingRil->number_plan;
7506
Jayachandran C572f2f42017-03-25 14:30:13 -07007507#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007508 RLOGD("cdmaCallWaitingInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07007509#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007510 Return<void> retStatus = radioService[slotId]->mRadioIndication->cdmaCallWaiting(
Amit Mahajan1955c742016-12-29 07:07:54 -08007511 convertIntToRadioIndicationType(indicationType), callWaitingRecord);
Amit Mahajan17249842017-01-19 15:05:45 -08007512 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan1955c742016-12-29 07:07:54 -08007513 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007514 RLOGE("cdmaCallWaitingInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan1955c742016-12-29 07:07:54 -08007515 }
7516
7517 return 0;
7518}
7519
Amit Mahajan759786a2017-03-03 17:35:47 -08007520int radio::cdmaOtaProvisionStatusInd(int slotId,
Amit Mahajan1955c742016-12-29 07:07:54 -08007521 int indicationType, int token, RIL_Errno e, void *response,
7522 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007523 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan1955c742016-12-29 07:07:54 -08007524 if (response == NULL || responseLen != sizeof(int)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007525 RLOGE("cdmaOtaProvisionStatusInd: invalid response");
Amit Mahajan1955c742016-12-29 07:07:54 -08007526 return 0;
7527 }
7528 int32_t status = ((int32_t *) response)[0];
Jayachandran C572f2f42017-03-25 14:30:13 -07007529#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007530 RLOGD("cdmaOtaProvisionStatusInd: status %d", status);
Jayachandran C572f2f42017-03-25 14:30:13 -07007531#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007532 Return<void> retStatus = radioService[slotId]->mRadioIndication->cdmaOtaProvisionStatus(
Amit Mahajan1955c742016-12-29 07:07:54 -08007533 convertIntToRadioIndicationType(indicationType), (CdmaOtaProvisionStatus) status);
Amit Mahajan17249842017-01-19 15:05:45 -08007534 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan1955c742016-12-29 07:07:54 -08007535 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007536 RLOGE("cdmaOtaProvisionStatusInd: radioService[%d]->mRadioIndication == NULL",
Amit Mahajan1955c742016-12-29 07:07:54 -08007537 slotId);
7538 }
7539
7540 return 0;
7541}
7542
Amit Mahajan759786a2017-03-03 17:35:47 -08007543int radio::cdmaInfoRecInd(int slotId,
Amit Mahajan1955c742016-12-29 07:07:54 -08007544 int indicationType, int token, RIL_Errno e, void *response,
7545 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007546 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan1955c742016-12-29 07:07:54 -08007547 if (response == NULL || responseLen != sizeof(RIL_CDMA_InformationRecords)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007548 RLOGE("cdmaInfoRecInd: invalid response");
Amit Mahajan1955c742016-12-29 07:07:54 -08007549 return 0;
7550 }
7551
Jack Yuf68e0da2017-02-07 14:53:09 -08007552 CdmaInformationRecords records = {};
Amit Mahajan1955c742016-12-29 07:07:54 -08007553 RIL_CDMA_InformationRecords *recordsRil = (RIL_CDMA_InformationRecords *) response;
7554
7555 char* string8 = NULL;
7556 int num = MIN(recordsRil->numberOfInfoRecs, RIL_CDMA_MAX_NUMBER_OF_INFO_RECS);
7557 if (recordsRil->numberOfInfoRecs > RIL_CDMA_MAX_NUMBER_OF_INFO_RECS) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007558 RLOGE("cdmaInfoRecInd: received %d recs which is more than %d, dropping "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08007559 "additional ones", recordsRil->numberOfInfoRecs,
Amit Mahajan1955c742016-12-29 07:07:54 -08007560 RIL_CDMA_MAX_NUMBER_OF_INFO_RECS);
7561 }
7562 records.infoRec.resize(num);
7563 for (int i = 0 ; i < num ; i++) {
7564 CdmaInformationRecord *record = &records.infoRec[i];
7565 RIL_CDMA_InformationRecord *infoRec = &recordsRil->infoRec[i];
7566 record->name = (CdmaInfoRecName) infoRec->name;
Sanket Padawe378ccdd2017-01-24 14:11:12 -08007567 // All vectors should be size 0 except one which will be size 1. Set everything to
7568 // size 0 initially.
7569 record->display.resize(0);
7570 record->number.resize(0);
7571 record->signal.resize(0);
7572 record->redir.resize(0);
7573 record->lineCtrl.resize(0);
7574 record->clir.resize(0);
7575 record->audioCtrl.resize(0);
Amit Mahajan1955c742016-12-29 07:07:54 -08007576 switch (infoRec->name) {
7577 case RIL_CDMA_DISPLAY_INFO_REC:
7578 case RIL_CDMA_EXTENDED_DISPLAY_INFO_REC: {
7579 if (infoRec->rec.display.alpha_len > CDMA_ALPHA_INFO_BUFFER_LENGTH) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007580 RLOGE("cdmaInfoRecInd: invalid display info response length %d "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08007581 "expected not more than %d", (int) infoRec->rec.display.alpha_len,
Amit Mahajan1955c742016-12-29 07:07:54 -08007582 CDMA_ALPHA_INFO_BUFFER_LENGTH);
7583 return 0;
7584 }
7585 string8 = (char*) malloc((infoRec->rec.display.alpha_len + 1) * sizeof(char));
7586 if (string8 == NULL) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007587 RLOGE("cdmaInfoRecInd: Memory allocation failed for "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08007588 "responseCdmaInformationRecords");
Amit Mahajan1955c742016-12-29 07:07:54 -08007589 return 0;
7590 }
7591 memcpy(string8, infoRec->rec.display.alpha_buf, infoRec->rec.display.alpha_len);
7592 string8[(int)infoRec->rec.display.alpha_len] = '\0';
7593
7594 record->display.resize(1);
7595 record->display[0].alphaBuf = string8;
7596 free(string8);
7597 string8 = NULL;
7598 break;
7599 }
7600
7601 case RIL_CDMA_CALLED_PARTY_NUMBER_INFO_REC:
7602 case RIL_CDMA_CALLING_PARTY_NUMBER_INFO_REC:
7603 case RIL_CDMA_CONNECTED_NUMBER_INFO_REC: {
7604 if (infoRec->rec.number.len > CDMA_NUMBER_INFO_BUFFER_LENGTH) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007605 RLOGE("cdmaInfoRecInd: invalid display info response length %d "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08007606 "expected not more than %d", (int) infoRec->rec.number.len,
Amit Mahajan1955c742016-12-29 07:07:54 -08007607 CDMA_NUMBER_INFO_BUFFER_LENGTH);
7608 return 0;
7609 }
7610 string8 = (char*) malloc((infoRec->rec.number.len + 1) * sizeof(char));
7611 if (string8 == NULL) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007612 RLOGE("cdmaInfoRecInd: Memory allocation failed for "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08007613 "responseCdmaInformationRecords");
Amit Mahajan1955c742016-12-29 07:07:54 -08007614 return 0;
7615 }
7616 memcpy(string8, infoRec->rec.number.buf, infoRec->rec.number.len);
7617 string8[(int)infoRec->rec.number.len] = '\0';
7618
7619 record->number.resize(1);
7620 record->number[0].number = string8;
7621 free(string8);
7622 string8 = NULL;
7623 record->number[0].numberType = infoRec->rec.number.number_type;
7624 record->number[0].numberPlan = infoRec->rec.number.number_plan;
7625 record->number[0].pi = infoRec->rec.number.pi;
7626 record->number[0].si = infoRec->rec.number.si;
7627 break;
7628 }
7629
7630 case RIL_CDMA_SIGNAL_INFO_REC: {
7631 record->signal.resize(1);
7632 record->signal[0].isPresent = infoRec->rec.signal.isPresent;
7633 record->signal[0].signalType = infoRec->rec.signal.signalType;
7634 record->signal[0].alertPitch = infoRec->rec.signal.alertPitch;
7635 record->signal[0].signal = infoRec->rec.signal.signal;
7636 break;
7637 }
7638
7639 case RIL_CDMA_REDIRECTING_NUMBER_INFO_REC: {
7640 if (infoRec->rec.redir.redirectingNumber.len >
7641 CDMA_NUMBER_INFO_BUFFER_LENGTH) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007642 RLOGE("cdmaInfoRecInd: invalid display info response length %d "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08007643 "expected not more than %d\n",
Amit Mahajan1955c742016-12-29 07:07:54 -08007644 (int)infoRec->rec.redir.redirectingNumber.len,
7645 CDMA_NUMBER_INFO_BUFFER_LENGTH);
7646 return 0;
7647 }
7648 string8 = (char*) malloc((infoRec->rec.redir.redirectingNumber.len + 1) *
7649 sizeof(char));
7650 if (string8 == NULL) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007651 RLOGE("cdmaInfoRecInd: Memory allocation failed for "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08007652 "responseCdmaInformationRecords");
Amit Mahajan1955c742016-12-29 07:07:54 -08007653 return 0;
7654 }
7655 memcpy(string8, infoRec->rec.redir.redirectingNumber.buf,
7656 infoRec->rec.redir.redirectingNumber.len);
7657 string8[(int)infoRec->rec.redir.redirectingNumber.len] = '\0';
7658
7659 record->redir.resize(1);
7660 record->redir[0].redirectingNumber.number = string8;
7661 free(string8);
7662 string8 = NULL;
7663 record->redir[0].redirectingNumber.numberType =
7664 infoRec->rec.redir.redirectingNumber.number_type;
7665 record->redir[0].redirectingNumber.numberPlan =
7666 infoRec->rec.redir.redirectingNumber.number_plan;
7667 record->redir[0].redirectingNumber.pi = infoRec->rec.redir.redirectingNumber.pi;
7668 record->redir[0].redirectingNumber.si = infoRec->rec.redir.redirectingNumber.si;
7669 record->redir[0].redirectingReason =
7670 (CdmaRedirectingReason) infoRec->rec.redir.redirectingReason;
7671 break;
7672 }
7673
7674 case RIL_CDMA_LINE_CONTROL_INFO_REC: {
7675 record->lineCtrl.resize(1);
7676 record->lineCtrl[0].lineCtrlPolarityIncluded =
7677 infoRec->rec.lineCtrl.lineCtrlPolarityIncluded;
7678 record->lineCtrl[0].lineCtrlToggle = infoRec->rec.lineCtrl.lineCtrlToggle;
7679 record->lineCtrl[0].lineCtrlReverse = infoRec->rec.lineCtrl.lineCtrlReverse;
7680 record->lineCtrl[0].lineCtrlPowerDenial =
7681 infoRec->rec.lineCtrl.lineCtrlPowerDenial;
7682 break;
7683 }
7684
7685 case RIL_CDMA_T53_CLIR_INFO_REC: {
7686 record->clir.resize(1);
7687 record->clir[0].cause = infoRec->rec.clir.cause;
7688 break;
7689 }
7690
7691 case RIL_CDMA_T53_AUDIO_CONTROL_INFO_REC: {
7692 record->audioCtrl.resize(1);
7693 record->audioCtrl[0].upLink = infoRec->rec.audioCtrl.upLink;
7694 record->audioCtrl[0].downLink = infoRec->rec.audioCtrl.downLink;
7695 break;
7696 }
7697
7698 case RIL_CDMA_T53_RELEASE_INFO_REC:
Amit Mahajan111ddca2017-03-03 12:05:13 -08007699 RLOGE("cdmaInfoRecInd: RIL_CDMA_T53_RELEASE_INFO_REC: INVALID");
Amit Mahajan1955c742016-12-29 07:07:54 -08007700 return 0;
7701
7702 default:
Amit Mahajan111ddca2017-03-03 12:05:13 -08007703 RLOGE("cdmaInfoRecInd: Incorrect name value");
Amit Mahajan1955c742016-12-29 07:07:54 -08007704 return 0;
7705 }
7706 }
7707
Jayachandran C572f2f42017-03-25 14:30:13 -07007708#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007709 RLOGD("cdmaInfoRecInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07007710#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007711 Return<void> retStatus = radioService[slotId]->mRadioIndication->cdmaInfoRec(
Amit Mahajan1955c742016-12-29 07:07:54 -08007712 convertIntToRadioIndicationType(indicationType), records);
Amit Mahajan17249842017-01-19 15:05:45 -08007713 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan1955c742016-12-29 07:07:54 -08007714 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007715 RLOGE("cdmaInfoRecInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan1955c742016-12-29 07:07:54 -08007716 }
7717
7718 return 0;
7719}
7720
Amit Mahajan759786a2017-03-03 17:35:47 -08007721int radio::indicateRingbackToneInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007722 int indicationType, int token, RIL_Errno e, void *response,
7723 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007724 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007725 if (response == NULL || responseLen != sizeof(int)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007726 RLOGE("indicateRingbackToneInd: invalid response");
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007727 return 0;
7728 }
7729 bool start = ((int32_t *) response)[0];
Jayachandran C572f2f42017-03-25 14:30:13 -07007730#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007731 RLOGD("indicateRingbackToneInd: start %d", start);
Jayachandran C572f2f42017-03-25 14:30:13 -07007732#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007733 Return<void> retStatus = radioService[slotId]->mRadioIndication->indicateRingbackTone(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007734 convertIntToRadioIndicationType(indicationType), start);
Amit Mahajan17249842017-01-19 15:05:45 -08007735 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007736 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007737 RLOGE("indicateRingbackToneInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007738 }
7739
7740 return 0;
7741}
7742
Amit Mahajan759786a2017-03-03 17:35:47 -08007743int radio::resendIncallMuteInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007744 int indicationType, int token, RIL_Errno e, void *response,
7745 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007746 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Jayachandran C572f2f42017-03-25 14:30:13 -07007747#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007748 RLOGD("resendIncallMuteInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07007749#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007750 Return<void> retStatus = radioService[slotId]->mRadioIndication->resendIncallMute(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007751 convertIntToRadioIndicationType(indicationType));
Amit Mahajan17249842017-01-19 15:05:45 -08007752 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007753 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007754 RLOGE("resendIncallMuteInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007755 }
7756
7757 return 0;
7758}
7759
Amit Mahajan759786a2017-03-03 17:35:47 -08007760int radio::cdmaSubscriptionSourceChangedInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007761 int indicationType, int token, RIL_Errno e,
7762 void *response, size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007763 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007764 if (response == NULL || responseLen != sizeof(int)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007765 RLOGE("cdmaSubscriptionSourceChangedInd: invalid response");
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007766 return 0;
7767 }
7768 int32_t cdmaSource = ((int32_t *) response)[0];
Jayachandran C572f2f42017-03-25 14:30:13 -07007769#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007770 RLOGD("cdmaSubscriptionSourceChangedInd: cdmaSource %d", cdmaSource);
Jayachandran C572f2f42017-03-25 14:30:13 -07007771#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007772 Return<void> retStatus = radioService[slotId]->mRadioIndication->
7773 cdmaSubscriptionSourceChanged(convertIntToRadioIndicationType(indicationType),
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007774 (CdmaSubscriptionSource) cdmaSource);
Amit Mahajan17249842017-01-19 15:05:45 -08007775 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007776 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007777 RLOGE("cdmaSubscriptionSourceChangedInd: radioService[%d]->mRadioIndication == NULL",
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007778 slotId);
7779 }
7780
7781 return 0;
7782}
7783
Amit Mahajan759786a2017-03-03 17:35:47 -08007784int radio::cdmaPrlChangedInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007785 int indicationType, int token, RIL_Errno e, void *response,
7786 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007787 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007788 if (response == NULL || responseLen != sizeof(int)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007789 RLOGE("cdmaPrlChangedInd: invalid response");
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007790 return 0;
7791 }
7792 int32_t version = ((int32_t *) response)[0];
Jayachandran C572f2f42017-03-25 14:30:13 -07007793#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007794 RLOGD("cdmaPrlChangedInd: version %d", version);
Jayachandran C572f2f42017-03-25 14:30:13 -07007795#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007796 Return<void> retStatus = radioService[slotId]->mRadioIndication->cdmaPrlChanged(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007797 convertIntToRadioIndicationType(indicationType), version);
Amit Mahajan17249842017-01-19 15:05:45 -08007798 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007799 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007800 RLOGE("cdmaPrlChangedInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007801 }
7802
7803 return 0;
7804}
7805
Amit Mahajan759786a2017-03-03 17:35:47 -08007806int radio::exitEmergencyCallbackModeInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007807 int indicationType, int token, RIL_Errno e, void *response,
7808 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007809 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Jayachandran C572f2f42017-03-25 14:30:13 -07007810#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007811 RLOGD("exitEmergencyCallbackModeInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07007812#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007813 Return<void> retStatus = radioService[slotId]->mRadioIndication->exitEmergencyCallbackMode(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007814 convertIntToRadioIndicationType(indicationType));
Amit Mahajan17249842017-01-19 15:05:45 -08007815 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007816 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007817 RLOGE("exitEmergencyCallbackModeInd: radioService[%d]->mRadioIndication == NULL",
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007818 slotId);
7819 }
7820
7821 return 0;
7822}
7823
Amit Mahajan759786a2017-03-03 17:35:47 -08007824int radio::rilConnectedInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007825 int indicationType, int token, RIL_Errno e, void *response,
7826 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007827 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007828 RLOGD("rilConnectedInd");
Amit Mahajan17249842017-01-19 15:05:45 -08007829 Return<void> retStatus = radioService[slotId]->mRadioIndication->rilConnected(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007830 convertIntToRadioIndicationType(indicationType));
Amit Mahajan17249842017-01-19 15:05:45 -08007831 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007832 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007833 RLOGE("rilConnectedInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007834 }
7835
7836 return 0;
7837}
7838
Amit Mahajan759786a2017-03-03 17:35:47 -08007839int radio::voiceRadioTechChangedInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007840 int indicationType, int token, RIL_Errno e, void *response,
7841 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007842 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007843 if (response == NULL || responseLen != sizeof(int)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007844 RLOGE("voiceRadioTechChangedInd: invalid response");
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007845 return 0;
7846 }
7847 int32_t rat = ((int32_t *) response)[0];
Jayachandran C572f2f42017-03-25 14:30:13 -07007848#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007849 RLOGD("voiceRadioTechChangedInd: rat %d", rat);
Jayachandran C572f2f42017-03-25 14:30:13 -07007850#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007851 Return<void> retStatus = radioService[slotId]->mRadioIndication->voiceRadioTechChanged(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007852 convertIntToRadioIndicationType(indicationType), (RadioTechnology) rat);
Amit Mahajan17249842017-01-19 15:05:45 -08007853 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007854 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007855 RLOGE("voiceRadioTechChangedInd: radioService[%d]->mRadioIndication == NULL",
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007856 slotId);
7857 }
7858
7859 return 0;
7860}
7861
7862void convertRilCellInfoListToHal(void *response, size_t responseLen, hidl_vec<CellInfo>& records) {
7863 int num = responseLen / sizeof(RIL_CellInfo_v12);
7864 records.resize(num);
7865
7866 RIL_CellInfo_v12 *rillCellInfo = (RIL_CellInfo_v12 *) response;
7867 for (int i = 0; i < num; i++) {
7868 records[i].cellInfoType = (CellInfoType) rillCellInfo->cellInfoType;
7869 records[i].registered = rillCellInfo->registered;
7870 records[i].timeStampType = (TimeStampType) rillCellInfo->timeStampType;
7871 records[i].timeStamp = rillCellInfo->timeStamp;
Sanket Padawe378ccdd2017-01-24 14:11:12 -08007872 // All vectors should be size 0 except one which will be size 1. Set everything to
7873 // size 0 initially.
7874 records[i].gsm.resize(0);
7875 records[i].wcdma.resize(0);
7876 records[i].cdma.resize(0);
7877 records[i].lte.resize(0);
7878 records[i].tdscdma.resize(0);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007879 switch(rillCellInfo->cellInfoType) {
7880 case RIL_CELL_INFO_TYPE_GSM: {
7881 records[i].gsm.resize(1);
7882 CellInfoGsm *cellInfoGsm = &records[i].gsm[0];
7883 cellInfoGsm->cellIdentityGsm.mcc =
7884 std::to_string(rillCellInfo->CellInfo.gsm.cellIdentityGsm.mcc);
7885 cellInfoGsm->cellIdentityGsm.mnc =
7886 std::to_string(rillCellInfo->CellInfo.gsm.cellIdentityGsm.mnc);
7887 cellInfoGsm->cellIdentityGsm.lac =
7888 rillCellInfo->CellInfo.gsm.cellIdentityGsm.lac;
7889 cellInfoGsm->cellIdentityGsm.cid =
7890 rillCellInfo->CellInfo.gsm.cellIdentityGsm.cid;
7891 cellInfoGsm->cellIdentityGsm.arfcn =
7892 rillCellInfo->CellInfo.gsm.cellIdentityGsm.arfcn;
7893 cellInfoGsm->cellIdentityGsm.bsic =
7894 rillCellInfo->CellInfo.gsm.cellIdentityGsm.bsic;
7895 cellInfoGsm->signalStrengthGsm.signalStrength =
7896 rillCellInfo->CellInfo.gsm.signalStrengthGsm.signalStrength;
7897 cellInfoGsm->signalStrengthGsm.bitErrorRate =
7898 rillCellInfo->CellInfo.gsm.signalStrengthGsm.bitErrorRate;
7899 cellInfoGsm->signalStrengthGsm.timingAdvance =
7900 rillCellInfo->CellInfo.gsm.signalStrengthGsm.timingAdvance;
7901 break;
7902 }
7903
7904 case RIL_CELL_INFO_TYPE_WCDMA: {
7905 records[i].wcdma.resize(1);
7906 CellInfoWcdma *cellInfoWcdma = &records[i].wcdma[0];
7907 cellInfoWcdma->cellIdentityWcdma.mcc =
7908 std::to_string(rillCellInfo->CellInfo.wcdma.cellIdentityWcdma.mcc);
7909 cellInfoWcdma->cellIdentityWcdma.mnc =
7910 std::to_string(rillCellInfo->CellInfo.wcdma.cellIdentityWcdma.mnc);
7911 cellInfoWcdma->cellIdentityWcdma.lac =
7912 rillCellInfo->CellInfo.wcdma.cellIdentityWcdma.lac;
7913 cellInfoWcdma->cellIdentityWcdma.cid =
7914 rillCellInfo->CellInfo.wcdma.cellIdentityWcdma.cid;
7915 cellInfoWcdma->cellIdentityWcdma.psc =
7916 rillCellInfo->CellInfo.wcdma.cellIdentityWcdma.psc;
7917 cellInfoWcdma->cellIdentityWcdma.uarfcn =
7918 rillCellInfo->CellInfo.wcdma.cellIdentityWcdma.uarfcn;
7919 cellInfoWcdma->signalStrengthWcdma.signalStrength =
7920 rillCellInfo->CellInfo.wcdma.signalStrengthWcdma.signalStrength;
7921 cellInfoWcdma->signalStrengthWcdma.bitErrorRate =
7922 rillCellInfo->CellInfo.wcdma.signalStrengthWcdma.bitErrorRate;
7923 break;
7924 }
7925
7926 case RIL_CELL_INFO_TYPE_CDMA: {
7927 records[i].cdma.resize(1);
7928 CellInfoCdma *cellInfoCdma = &records[i].cdma[0];
7929 cellInfoCdma->cellIdentityCdma.networkId =
7930 rillCellInfo->CellInfo.cdma.cellIdentityCdma.networkId;
7931 cellInfoCdma->cellIdentityCdma.systemId =
7932 rillCellInfo->CellInfo.cdma.cellIdentityCdma.systemId;
7933 cellInfoCdma->cellIdentityCdma.baseStationId =
7934 rillCellInfo->CellInfo.cdma.cellIdentityCdma.basestationId;
7935 cellInfoCdma->cellIdentityCdma.longitude =
7936 rillCellInfo->CellInfo.cdma.cellIdentityCdma.longitude;
7937 cellInfoCdma->cellIdentityCdma.latitude =
7938 rillCellInfo->CellInfo.cdma.cellIdentityCdma.latitude;
7939 cellInfoCdma->signalStrengthCdma.dbm =
7940 rillCellInfo->CellInfo.cdma.signalStrengthCdma.dbm;
7941 cellInfoCdma->signalStrengthCdma.ecio =
7942 rillCellInfo->CellInfo.cdma.signalStrengthCdma.ecio;
7943 cellInfoCdma->signalStrengthEvdo.dbm =
7944 rillCellInfo->CellInfo.cdma.signalStrengthEvdo.dbm;
7945 cellInfoCdma->signalStrengthEvdo.ecio =
7946 rillCellInfo->CellInfo.cdma.signalStrengthEvdo.ecio;
7947 cellInfoCdma->signalStrengthEvdo.signalNoiseRatio =
7948 rillCellInfo->CellInfo.cdma.signalStrengthEvdo.signalNoiseRatio;
7949 break;
7950 }
7951
7952 case RIL_CELL_INFO_TYPE_LTE: {
7953 records[i].lte.resize(1);
7954 CellInfoLte *cellInfoLte = &records[i].lte[0];
7955 cellInfoLte->cellIdentityLte.mcc =
7956 std::to_string(rillCellInfo->CellInfo.lte.cellIdentityLte.mcc);
7957 cellInfoLte->cellIdentityLte.mnc =
7958 std::to_string(rillCellInfo->CellInfo.lte.cellIdentityLte.mnc);
7959 cellInfoLte->cellIdentityLte.ci =
7960 rillCellInfo->CellInfo.lte.cellIdentityLte.ci;
7961 cellInfoLte->cellIdentityLte.pci =
7962 rillCellInfo->CellInfo.lte.cellIdentityLte.pci;
7963 cellInfoLte->cellIdentityLte.tac =
7964 rillCellInfo->CellInfo.lte.cellIdentityLte.tac;
7965 cellInfoLte->cellIdentityLte.earfcn =
7966 rillCellInfo->CellInfo.lte.cellIdentityLte.earfcn;
7967 cellInfoLte->signalStrengthLte.signalStrength =
7968 rillCellInfo->CellInfo.lte.signalStrengthLte.signalStrength;
Karsten Tauscheeac03712020-11-20 15:36:08 +01007969 cellInfoLte->signalStrengthLte.rsrp = clampWarn("rsrp",
7970 rillCellInfo->CellInfo.lte.signalStrengthLte.rsrp, 44, 140);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007971 cellInfoLte->signalStrengthLte.rsrq =
7972 rillCellInfo->CellInfo.lte.signalStrengthLte.rsrq;
7973 cellInfoLte->signalStrengthLte.rssnr =
7974 rillCellInfo->CellInfo.lte.signalStrengthLte.rssnr;
7975 cellInfoLte->signalStrengthLte.cqi =
7976 rillCellInfo->CellInfo.lte.signalStrengthLte.cqi;
7977 cellInfoLte->signalStrengthLte.timingAdvance =
7978 rillCellInfo->CellInfo.lte.signalStrengthLte.timingAdvance;
7979 break;
7980 }
7981
7982 case RIL_CELL_INFO_TYPE_TD_SCDMA: {
7983 records[i].tdscdma.resize(1);
7984 CellInfoTdscdma *cellInfoTdscdma = &records[i].tdscdma[0];
7985 cellInfoTdscdma->cellIdentityTdscdma.mcc =
7986 std::to_string(rillCellInfo->CellInfo.tdscdma.cellIdentityTdscdma.mcc);
7987 cellInfoTdscdma->cellIdentityTdscdma.mnc =
7988 std::to_string(rillCellInfo->CellInfo.tdscdma.cellIdentityTdscdma.mnc);
7989 cellInfoTdscdma->cellIdentityTdscdma.lac =
7990 rillCellInfo->CellInfo.tdscdma.cellIdentityTdscdma.lac;
7991 cellInfoTdscdma->cellIdentityTdscdma.cid =
7992 rillCellInfo->CellInfo.tdscdma.cellIdentityTdscdma.cid;
7993 cellInfoTdscdma->cellIdentityTdscdma.cpid =
7994 rillCellInfo->CellInfo.tdscdma.cellIdentityTdscdma.cpid;
7995 cellInfoTdscdma->signalStrengthTdscdma.rscp =
7996 rillCellInfo->CellInfo.tdscdma.signalStrengthTdscdma.rscp;
7997 break;
7998 }
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08007999 default: {
8000 break;
8001 }
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008002 }
8003 rillCellInfo += 1;
8004 }
8005}
8006
Amit Mahajan759786a2017-03-03 17:35:47 -08008007int radio::cellInfoListInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008008 int indicationType, int token, RIL_Errno e, void *response,
8009 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08008010 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan13058cb2017-06-07 23:10:27 -07008011 if ((response == NULL && responseLen != 0) || responseLen % sizeof(RIL_CellInfo_v12) != 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008012 RLOGE("cellInfoListInd: invalid response");
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008013 return 0;
8014 }
8015
8016 hidl_vec<CellInfo> records;
8017 convertRilCellInfoListToHal(response, responseLen, records);
8018
Jayachandran C572f2f42017-03-25 14:30:13 -07008019#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08008020 RLOGD("cellInfoListInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07008021#endif
Amit Mahajan17249842017-01-19 15:05:45 -08008022 Return<void> retStatus = radioService[slotId]->mRadioIndication->cellInfoList(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008023 convertIntToRadioIndicationType(indicationType), records);
Amit Mahajan17249842017-01-19 15:05:45 -08008024 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008025 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008026 RLOGE("cellInfoListInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008027 }
8028
8029 return 0;
8030}
8031
Amit Mahajan759786a2017-03-03 17:35:47 -08008032int radio::imsNetworkStateChangedInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008033 int indicationType, int token, RIL_Errno e, void *response,
8034 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08008035 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Jayachandran C572f2f42017-03-25 14:30:13 -07008036#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08008037 RLOGD("imsNetworkStateChangedInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07008038#endif
Amit Mahajan17249842017-01-19 15:05:45 -08008039 Return<void> retStatus = radioService[slotId]->mRadioIndication->imsNetworkStateChanged(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008040 convertIntToRadioIndicationType(indicationType));
Amit Mahajan17249842017-01-19 15:05:45 -08008041 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008042 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008043 RLOGE("imsNetworkStateChangedInd: radioService[%d]->mRadioIndication == NULL",
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008044 slotId);
8045 }
8046
8047 return 0;
8048}
8049
Amit Mahajan759786a2017-03-03 17:35:47 -08008050int radio::subscriptionStatusChangedInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008051 int indicationType, int token, RIL_Errno e, void *response,
8052 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08008053 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008054 if (response == NULL || responseLen != sizeof(int)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008055 RLOGE("subscriptionStatusChangedInd: invalid response");
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008056 return 0;
8057 }
8058 bool activate = ((int32_t *) response)[0];
Jayachandran C572f2f42017-03-25 14:30:13 -07008059#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08008060 RLOGD("subscriptionStatusChangedInd: activate %d", activate);
Jayachandran C572f2f42017-03-25 14:30:13 -07008061#endif
Amit Mahajan17249842017-01-19 15:05:45 -08008062 Return<void> retStatus = radioService[slotId]->mRadioIndication->subscriptionStatusChanged(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008063 convertIntToRadioIndicationType(indicationType), activate);
Amit Mahajan17249842017-01-19 15:05:45 -08008064 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008065 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008066 RLOGE("subscriptionStatusChangedInd: radioService[%d]->mRadioIndication == NULL",
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008067 slotId);
8068 }
8069
8070 return 0;
8071}
8072
Amit Mahajan759786a2017-03-03 17:35:47 -08008073int radio::srvccStateNotifyInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008074 int indicationType, int token, RIL_Errno e, void *response,
8075 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08008076 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008077 if (response == NULL || responseLen != sizeof(int)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008078 RLOGE("srvccStateNotifyInd: invalid response");
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008079 return 0;
8080 }
8081 int32_t state = ((int32_t *) response)[0];
Jayachandran C572f2f42017-03-25 14:30:13 -07008082#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08008083 RLOGD("srvccStateNotifyInd: rat %d", state);
Jayachandran C572f2f42017-03-25 14:30:13 -07008084#endif
Amit Mahajan17249842017-01-19 15:05:45 -08008085 Return<void> retStatus = radioService[slotId]->mRadioIndication->srvccStateNotify(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008086 convertIntToRadioIndicationType(indicationType), (SrvccState) state);
Amit Mahajan17249842017-01-19 15:05:45 -08008087 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008088 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008089 RLOGE("srvccStateNotifyInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008090 }
8091
8092 return 0;
8093}
8094
8095void convertRilHardwareConfigListToHal(void *response, size_t responseLen,
8096 hidl_vec<HardwareConfig>& records) {
8097 int num = responseLen / sizeof(RIL_HardwareConfig);
8098 records.resize(num);
8099
8100 RIL_HardwareConfig *rilHardwareConfig = (RIL_HardwareConfig *) response;
8101 for (int i = 0; i < num; i++) {
8102 records[i].type = (HardwareConfigType) rilHardwareConfig[i].type;
8103 records[i].uuid = convertCharPtrToHidlString(rilHardwareConfig[i].uuid);
8104 records[i].state = (HardwareConfigState) rilHardwareConfig[i].state;
8105 switch (rilHardwareConfig[i].type) {
8106 case RIL_HARDWARE_CONFIG_MODEM: {
8107 records[i].modem.resize(1);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08008108 records[i].sim.resize(0);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008109 HardwareConfigModem *hwConfigModem = &records[i].modem[0];
8110 hwConfigModem->rat = rilHardwareConfig[i].cfg.modem.rat;
8111 hwConfigModem->maxVoice = rilHardwareConfig[i].cfg.modem.maxVoice;
8112 hwConfigModem->maxData = rilHardwareConfig[i].cfg.modem.maxData;
8113 hwConfigModem->maxStandby = rilHardwareConfig[i].cfg.modem.maxStandby;
8114 break;
8115 }
8116
8117 case RIL_HARDWARE_CONFIG_SIM: {
8118 records[i].sim.resize(1);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08008119 records[i].modem.resize(0);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008120 records[i].sim[0].modemUuid =
8121 convertCharPtrToHidlString(rilHardwareConfig[i].cfg.sim.modemUuid);
8122 break;
8123 }
8124 }
8125 }
8126}
8127
Amit Mahajan759786a2017-03-03 17:35:47 -08008128int radio::hardwareConfigChangedInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008129 int indicationType, int token, RIL_Errno e, void *response,
8130 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08008131 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan13058cb2017-06-07 23:10:27 -07008132 if ((response == NULL && responseLen != 0)
8133 || responseLen % sizeof(RIL_HardwareConfig) != 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008134 RLOGE("hardwareConfigChangedInd: invalid response");
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008135 return 0;
8136 }
8137
8138 hidl_vec<HardwareConfig> configs;
8139 convertRilHardwareConfigListToHal(response, responseLen, configs);
8140
Jayachandran C572f2f42017-03-25 14:30:13 -07008141#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08008142 RLOGD("hardwareConfigChangedInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07008143#endif
Amit Mahajan17249842017-01-19 15:05:45 -08008144 Return<void> retStatus = radioService[slotId]->mRadioIndication->hardwareConfigChanged(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008145 convertIntToRadioIndicationType(indicationType), configs);
Amit Mahajan17249842017-01-19 15:05:45 -08008146 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008147 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008148 RLOGE("hardwareConfigChangedInd: radioService[%d]->mRadioIndication == NULL",
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008149 slotId);
8150 }
8151
8152 return 0;
8153}
8154
8155void convertRilRadioCapabilityToHal(void *response, size_t responseLen, RadioCapability& rc) {
8156 RIL_RadioCapability *rilRadioCapability = (RIL_RadioCapability *) response;
8157 rc.session = rilRadioCapability->session;
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07008158 rc.phase = (V1_0::RadioCapabilityPhase) rilRadioCapability->phase;
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008159 rc.raf = rilRadioCapability->rat;
8160 rc.logicalModemUuid = convertCharPtrToHidlString(rilRadioCapability->logicalModemUuid);
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07008161 rc.status = (V1_0::RadioCapabilityStatus) rilRadioCapability->status;
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008162}
8163
Amit Mahajan759786a2017-03-03 17:35:47 -08008164int radio::radioCapabilityIndicationInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008165 int indicationType, int token, RIL_Errno e, void *response,
8166 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08008167 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008168 if (response == NULL || responseLen != sizeof(RIL_RadioCapability)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008169 RLOGE("radioCapabilityIndicationInd: invalid response");
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008170 return 0;
8171 }
8172
Jack Yuf68e0da2017-02-07 14:53:09 -08008173 RadioCapability rc = {};
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008174 convertRilRadioCapabilityToHal(response, responseLen, rc);
8175
Jayachandran C572f2f42017-03-25 14:30:13 -07008176#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08008177 RLOGD("radioCapabilityIndicationInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07008178#endif
Amit Mahajan17249842017-01-19 15:05:45 -08008179 Return<void> retStatus = radioService[slotId]->mRadioIndication->radioCapabilityIndication(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008180 convertIntToRadioIndicationType(indicationType), rc);
Amit Mahajan17249842017-01-19 15:05:45 -08008181 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008182 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008183 RLOGE("radioCapabilityIndicationInd: radioService[%d]->mRadioIndication == NULL",
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008184 slotId);
8185 }
8186
8187 return 0;
8188}
8189
8190bool isServiceTypeCfQuery(RIL_SsServiceType serType, RIL_SsRequestType reqType) {
8191 if ((reqType == SS_INTERROGATION) &&
8192 (serType == SS_CFU ||
8193 serType == SS_CF_BUSY ||
8194 serType == SS_CF_NO_REPLY ||
8195 serType == SS_CF_NOT_REACHABLE ||
8196 serType == SS_CF_ALL ||
8197 serType == SS_CF_ALL_CONDITIONAL)) {
8198 return true;
8199 }
8200 return false;
8201}
8202
Amit Mahajan759786a2017-03-03 17:35:47 -08008203int radio::onSupplementaryServiceIndicationInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008204 int indicationType, int token, RIL_Errno e,
8205 void *response, size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08008206 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008207 if (response == NULL || responseLen != sizeof(RIL_StkCcUnsolSsResponse)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008208 RLOGE("onSupplementaryServiceIndicationInd: invalid response");
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008209 return 0;
8210 }
8211
8212 RIL_StkCcUnsolSsResponse *rilSsResponse = (RIL_StkCcUnsolSsResponse *) response;
Jack Yuf68e0da2017-02-07 14:53:09 -08008213 StkCcUnsolSsResult ss = {};
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008214 ss.serviceType = (SsServiceType) rilSsResponse->serviceType;
8215 ss.requestType = (SsRequestType) rilSsResponse->requestType;
8216 ss.teleserviceType = (SsTeleserviceType) rilSsResponse->teleserviceType;
8217 ss.serviceClass = rilSsResponse->serviceClass;
8218 ss.result = (RadioError) rilSsResponse->result;
8219
8220 if (isServiceTypeCfQuery(rilSsResponse->serviceType, rilSsResponse->requestType)) {
Jayachandran C572f2f42017-03-25 14:30:13 -07008221#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08008222 RLOGD("onSupplementaryServiceIndicationInd CF type, num of Cf elements %d",
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008223 rilSsResponse->cfData.numValidIndexes);
Jayachandran C572f2f42017-03-25 14:30:13 -07008224#endif
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008225 if (rilSsResponse->cfData.numValidIndexes > NUM_SERVICE_CLASSES) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008226 RLOGE("onSupplementaryServiceIndicationInd numValidIndexes is greater than "
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008227 "max value %d, truncating it to max value", NUM_SERVICE_CLASSES);
8228 rilSsResponse->cfData.numValidIndexes = NUM_SERVICE_CLASSES;
8229 }
8230
8231 ss.cfData.resize(1);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08008232 ss.ssInfo.resize(0);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008233
8234 /* number of call info's */
8235 ss.cfData[0].cfInfo.resize(rilSsResponse->cfData.numValidIndexes);
8236
8237 for (int i = 0; i < rilSsResponse->cfData.numValidIndexes; i++) {
8238 RIL_CallForwardInfo cf = rilSsResponse->cfData.cfInfo[i];
8239 CallForwardInfo *cfInfo = &ss.cfData[0].cfInfo[i];
8240
8241 cfInfo->status = (CallForwardInfoStatus) cf.status;
8242 cfInfo->reason = cf.reason;
8243 cfInfo->serviceClass = cf.serviceClass;
8244 cfInfo->toa = cf.toa;
8245 cfInfo->number = convertCharPtrToHidlString(cf.number);
8246 cfInfo->timeSeconds = cf.timeSeconds;
Jayachandran C572f2f42017-03-25 14:30:13 -07008247#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08008248 RLOGD("onSupplementaryServiceIndicationInd: "
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008249 "Data: %d,reason=%d,cls=%d,toa=%d,num=%s,tout=%d],", cf.status,
8250 cf.reason, cf.serviceClass, cf.toa, (char*)cf.number, cf.timeSeconds);
Jayachandran C572f2f42017-03-25 14:30:13 -07008251#endif
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008252 }
8253 } else {
8254 ss.ssInfo.resize(1);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08008255 ss.cfData.resize(0);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008256
8257 /* each int */
8258 ss.ssInfo[0].ssInfo.resize(SS_INFO_MAX);
8259 for (int i = 0; i < SS_INFO_MAX; i++) {
Jayachandran C572f2f42017-03-25 14:30:13 -07008260#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08008261 RLOGD("onSupplementaryServiceIndicationInd: Data: %d",
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008262 rilSsResponse->ssInfo[i]);
Jayachandran C572f2f42017-03-25 14:30:13 -07008263#endif
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008264 ss.ssInfo[0].ssInfo[i] = rilSsResponse->ssInfo[i];
8265 }
8266 }
8267
Jayachandran C572f2f42017-03-25 14:30:13 -07008268#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08008269 RLOGD("onSupplementaryServiceIndicationInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07008270#endif
Amit Mahajan17249842017-01-19 15:05:45 -08008271 Return<void> retStatus = radioService[slotId]->mRadioIndication->
8272 onSupplementaryServiceIndication(convertIntToRadioIndicationType(indicationType),
8273 ss);
8274 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008275 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008276 RLOGE("onSupplementaryServiceIndicationInd: "
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008277 "radioService[%d]->mRadioIndication == NULL", slotId);
8278 }
8279
8280 return 0;
8281}
8282
Amit Mahajan759786a2017-03-03 17:35:47 -08008283int radio::stkCallControlAlphaNotifyInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008284 int indicationType, int token, RIL_Errno e, void *response,
8285 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08008286 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008287 if (response == NULL || responseLen == 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008288 RLOGE("stkCallControlAlphaNotifyInd: invalid response");
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008289 return 0;
8290 }
Jayachandran C572f2f42017-03-25 14:30:13 -07008291#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08008292 RLOGD("stkCallControlAlphaNotifyInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07008293#endif
Amit Mahajan17249842017-01-19 15:05:45 -08008294 Return<void> retStatus = radioService[slotId]->mRadioIndication->stkCallControlAlphaNotify(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008295 convertIntToRadioIndicationType(indicationType),
8296 convertCharPtrToHidlString((char *) response));
Amit Mahajan17249842017-01-19 15:05:45 -08008297 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008298 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008299 RLOGE("stkCallControlAlphaNotifyInd: radioService[%d]->mRadioIndication == NULL",
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008300 slotId);
8301 }
8302
8303 return 0;
8304}
8305
8306void convertRilLceDataInfoToHal(void *response, size_t responseLen, LceDataInfo& lce) {
8307 RIL_LceDataInfo *rilLceDataInfo = (RIL_LceDataInfo *)response;
8308 lce.lastHopCapacityKbps = rilLceDataInfo->last_hop_capacity_kbps;
8309 lce.confidenceLevel = rilLceDataInfo->confidence_level;
8310 lce.lceSuspended = rilLceDataInfo->lce_suspended;
8311}
8312
Amit Mahajan759786a2017-03-03 17:35:47 -08008313int radio::lceDataInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008314 int indicationType, int token, RIL_Errno e, void *response,
8315 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08008316 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008317 if (response == NULL || responseLen != sizeof(RIL_LceDataInfo)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008318 RLOGE("lceDataInd: invalid response");
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008319 return 0;
8320 }
8321
Jack Yuf68e0da2017-02-07 14:53:09 -08008322 LceDataInfo lce = {};
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008323 convertRilLceDataInfoToHal(response, responseLen, lce);
Jayachandran C572f2f42017-03-25 14:30:13 -07008324#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08008325 RLOGD("lceDataInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07008326#endif
Amit Mahajan17249842017-01-19 15:05:45 -08008327 Return<void> retStatus = radioService[slotId]->mRadioIndication->lceData(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008328 convertIntToRadioIndicationType(indicationType), lce);
Amit Mahajan17249842017-01-19 15:05:45 -08008329 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008330 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008331 RLOGE("lceDataInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008332 }
8333
8334 return 0;
8335}
8336
Amit Mahajan759786a2017-03-03 17:35:47 -08008337int radio::pcoDataInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008338 int indicationType, int token, RIL_Errno e, void *response,
8339 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08008340 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008341 if (response == NULL || responseLen != sizeof(RIL_PCO_Data)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008342 RLOGE("pcoDataInd: invalid response");
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008343 return 0;
8344 }
8345
Jack Yuf68e0da2017-02-07 14:53:09 -08008346 PcoDataInfo pco = {};
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008347 RIL_PCO_Data *rilPcoData = (RIL_PCO_Data *)response;
8348 pco.cid = rilPcoData->cid;
8349 pco.bearerProto = convertCharPtrToHidlString(rilPcoData->bearer_proto);
8350 pco.pcoId = rilPcoData->pco_id;
8351 pco.contents.setToExternal((uint8_t *) rilPcoData->contents, rilPcoData->contents_length);
8352
Jayachandran C572f2f42017-03-25 14:30:13 -07008353#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08008354 RLOGD("pcoDataInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07008355#endif
Amit Mahajan17249842017-01-19 15:05:45 -08008356 Return<void> retStatus = radioService[slotId]->mRadioIndication->pcoData(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008357 convertIntToRadioIndicationType(indicationType), pco);
Amit Mahajan17249842017-01-19 15:05:45 -08008358 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008359 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008360 RLOGE("pcoDataInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008361 }
8362
8363 return 0;
8364}
8365
Amit Mahajan759786a2017-03-03 17:35:47 -08008366int radio::modemResetInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008367 int indicationType, int token, RIL_Errno e, void *response,
8368 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08008369 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008370 if (response == NULL || responseLen == 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008371 RLOGE("modemResetInd: invalid response");
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008372 return 0;
8373 }
Jayachandran C572f2f42017-03-25 14:30:13 -07008374#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08008375 RLOGD("modemResetInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07008376#endif
Amit Mahajan17249842017-01-19 15:05:45 -08008377 Return<void> retStatus = radioService[slotId]->mRadioIndication->modemReset(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008378 convertIntToRadioIndicationType(indicationType),
8379 convertCharPtrToHidlString((char *) response));
Amit Mahajan17249842017-01-19 15:05:45 -08008380 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008381 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008382 RLOGE("modemResetInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008383 }
8384
8385 return 0;
8386}
8387
yinxu3abe7c72017-05-03 15:15:19 -07008388int radio::networkScanResultInd(int slotId,
8389 int indicationType, int token, RIL_Errno e, void *response,
yinxu8688abd2017-05-22 11:26:45 -07008390 size_t responseLen) {
yinxu3abe7c72017-05-03 15:15:19 -07008391#if VDBG
8392 RLOGD("networkScanResultInd");
8393#endif
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07008394 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndicationV1_1 != NULL) {
yinxu8688abd2017-05-22 11:26:45 -07008395 if (response == NULL || responseLen == 0) {
8396 RLOGE("networkScanResultInd: invalid response");
8397 return 0;
8398 }
8399 RLOGD("networkScanResultInd");
8400
8401#if VDBG
8402 RLOGD("networkScanResultInd");
8403#endif
8404
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07008405 RIL_NetworkScanResult *networkScanResult = (RIL_NetworkScanResult *) response;
yinxu8688abd2017-05-22 11:26:45 -07008406
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07008407 V1_1::NetworkScanResult result;
8408 result.status = (V1_1::ScanStatus) networkScanResult->status;
Sooraj Sasindran982ba7a2018-05-07 21:20:43 -07008409 result.error = (RadioError) networkScanResult->error;
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07008410 convertRilCellInfoListToHal(
8411 networkScanResult->network_infos,
8412 networkScanResult->network_infos_length * sizeof(RIL_CellInfo_v12),
8413 result.networkInfos);
yinxu8688abd2017-05-22 11:26:45 -07008414
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07008415 Return<void> retStatus = radioService[slotId]->mRadioIndicationV1_1->networkScanResult(
8416 convertIntToRadioIndicationType(indicationType), result);
8417 radioService[slotId]->checkReturnStatus(retStatus);
yinxu8688abd2017-05-22 11:26:45 -07008418 } else {
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07008419 RLOGE("networkScanResultInd: radioService[%d]->mRadioIndicationV1_1 == NULL", slotId);
yinxu8688abd2017-05-22 11:26:45 -07008420 }
yinxu3abe7c72017-05-03 15:15:19 -07008421 return 0;
8422}
8423
pkanwardb8e0942017-03-17 12:49:34 -07008424int radio::carrierInfoForImsiEncryption(int slotId,
8425 int indicationType, int token, RIL_Errno e, void *response,
8426 size_t responseLen) {
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07008427 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndicationV1_1 != NULL) {
pkanwardb8e0942017-03-17 12:49:34 -07008428 if (response == NULL || responseLen == 0) {
8429 RLOGE("carrierInfoForImsiEncryption: invalid response");
8430 return 0;
8431 }
8432 RLOGD("carrierInfoForImsiEncryption");
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07008433 Return<void> retStatus = radioService[slotId]->mRadioIndicationV1_1->
8434 carrierInfoForImsiEncryption(convertIntToRadioIndicationType(indicationType));
8435 radioService[slotId]->checkReturnStatus(retStatus);
pkanwardb8e0942017-03-17 12:49:34 -07008436 } else {
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07008437 RLOGE("carrierInfoForImsiEncryption: radioService[%d]->mRadioIndicationV1_1 == NULL",
8438 slotId);
pkanwardb8e0942017-03-17 12:49:34 -07008439 }
8440
8441 return 0;
8442}
8443
Nathan Harold6a8809d2017-07-07 19:28:58 -07008444int radio::keepaliveStatusInd(int slotId,
8445 int indicationType, int token, RIL_Errno e, void *response,
8446 size_t responseLen) {
8447#if VDBG
8448 RLOGD("%s(): token=%d", __FUNCTION__, token);
8449#endif
8450 if (radioService[slotId] == NULL || radioService[slotId]->mRadioIndication == NULL) {
8451 RLOGE("%s: radioService[%d]->mRadioIndication == NULL", __FUNCTION__, slotId);
8452 return 0;
8453 }
8454
8455 auto ret = V1_1::IRadioIndication::castFrom(
8456 radioService[slotId]->mRadioIndication);
8457 if (!ret.isOk()) {
8458 RLOGE("%s: ret.isOk() == false for radioService[%d]", __FUNCTION__, slotId);
8459 return 0;
8460 }
8461 sp<V1_1::IRadioIndication> radioIndicationV1_1 = ret;
8462
8463 if (response == NULL || responseLen != sizeof(V1_1::KeepaliveStatus)) {
8464 RLOGE("%s: invalid response", __FUNCTION__);
8465 return 0;
8466 }
8467
8468 V1_1::KeepaliveStatus ks;
8469 convertRilKeepaliveStatusToHal(static_cast<RIL_KeepaliveStatus*>(response), ks);
8470
8471 Return<void> retStatus = radioIndicationV1_1->keepaliveStatus(
8472 convertIntToRadioIndicationType(indicationType), ks);
8473 radioService[slotId]->checkReturnStatus(retStatus);
8474 return 0;
8475}
8476
Amit Mahajan759786a2017-03-03 17:35:47 -08008477int radio::oemHookRawInd(int slotId,
Amit Mahajan439da362017-02-13 17:43:04 -08008478 int indicationType, int token, RIL_Errno e, void *response,
8479 size_t responseLen) {
Steven Moreland6cc40042018-03-20 11:20:05 -07008480 if (!kOemHookEnabled) return 0;
8481
Amit Mahajan439da362017-02-13 17:43:04 -08008482 if (oemHookService[slotId] != NULL && oemHookService[slotId]->mOemHookIndication != NULL) {
8483 if (response == NULL || responseLen == 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008484 RLOGE("oemHookRawInd: invalid response");
Amit Mahajan439da362017-02-13 17:43:04 -08008485 return 0;
8486 }
8487
8488 hidl_vec<uint8_t> data;
8489 data.setToExternal((uint8_t *) response, responseLen);
Jayachandran C572f2f42017-03-25 14:30:13 -07008490#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08008491 RLOGD("oemHookRawInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07008492#endif
Amit Mahajan439da362017-02-13 17:43:04 -08008493 Return<void> retStatus = oemHookService[slotId]->mOemHookIndication->oemHookRaw(
8494 convertIntToRadioIndicationType(indicationType), data);
Amit Mahajand423d192017-03-16 17:04:01 -07008495 checkReturnStatus(slotId, retStatus, false);
Amit Mahajan439da362017-02-13 17:43:04 -08008496 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008497 RLOGE("oemHookRawInd: oemHookService[%d]->mOemHookIndication == NULL", slotId);
Amit Mahajan439da362017-02-13 17:43:04 -08008498 }
8499
8500 return 0;
8501}
8502
Amit Mahajancd77a5b2016-08-25 11:19:21 -07008503void radio::registerService(RIL_RadioFunctions *callbacks, CommandInfo *commands) {
8504 using namespace android::hardware;
8505 int simCount = 1;
Amit Mahajan439da362017-02-13 17:43:04 -08008506 const char *serviceNames[] = {
Amit Mahajan7955c432017-03-28 11:17:55 -07008507 android::RIL_getServiceName()
Amit Mahajancd77a5b2016-08-25 11:19:21 -07008508 #if (SIM_COUNT >= 2)
Amit Mahajan7955c432017-03-28 11:17:55 -07008509 , RIL2_SERVICE_NAME
Amit Mahajancd77a5b2016-08-25 11:19:21 -07008510 #if (SIM_COUNT >= 3)
Amit Mahajan7955c432017-03-28 11:17:55 -07008511 , RIL3_SERVICE_NAME
Amit Mahajancd77a5b2016-08-25 11:19:21 -07008512 #if (SIM_COUNT >= 4)
Amit Mahajan7955c432017-03-28 11:17:55 -07008513 , RIL4_SERVICE_NAME
Amit Mahajan439da362017-02-13 17:43:04 -08008514 #endif
8515 #endif
8516 #endif
8517 };
8518
Amit Mahajancd77a5b2016-08-25 11:19:21 -07008519 #if (SIM_COUNT >= 2)
8520 simCount = SIM_COUNT;
8521 #endif
8522
terrycrhuang456df1b2018-05-04 13:47:06 +08008523 s_vendorFunctions = callbacks;
8524 s_commands = commands;
8525
Amit Mahajancd77a5b2016-08-25 11:19:21 -07008526 configureRpcThreadpool(1, true /* callerWillJoin */);
8527 for (int i = 0; i < simCount; i++) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08008528 pthread_rwlock_t *radioServiceRwlockPtr = getRadioServiceRwlock(i);
8529 int ret = pthread_rwlock_wrlock(radioServiceRwlockPtr);
8530 assert(ret == 0);
8531
Amit Mahajancd77a5b2016-08-25 11:19:21 -07008532 radioService[i] = new RadioImpl;
Sanket Padawef220dc52017-01-02 23:46:00 -08008533 radioService[i]->mSlotId = i;
pkanwardb8e0942017-03-17 12:49:34 -07008534 RLOGD("registerService: starting android::hardware::radio::V1_1::IRadio %s",
8535 serviceNames[i]);
Amit Mahajancd77a5b2016-08-25 11:19:21 -07008536 android::status_t status = radioService[i]->registerAsService(serviceNames[i]);
Steven Moreland6cc40042018-03-20 11:20:05 -07008537
8538 if (kOemHookEnabled) {
8539 oemHookService[i] = new OemHookImpl;
8540 oemHookService[i]->mSlotId = i;
8541 status = oemHookService[i]->registerAsService(serviceNames[i]);
8542 }
Amit Mahajan932e08e2017-01-24 05:45:02 -08008543
8544 ret = pthread_rwlock_unlock(radioServiceRwlockPtr);
8545 assert(ret == 0);
Amit Mahajancd77a5b2016-08-25 11:19:21 -07008546 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07008547}
8548
8549void rilc_thread_pool() {
8550 joinRpcThreadpool();
Amit Mahajan932e08e2017-01-24 05:45:02 -08008551}
8552
8553pthread_rwlock_t * radio::getRadioServiceRwlock(int slotId) {
8554 pthread_rwlock_t *radioServiceRwlockPtr = &radioServiceRwlock;
8555
8556 #if (SIM_COUNT >= 2)
8557 if (slotId == 2) radioServiceRwlockPtr = &radioServiceRwlock2;
8558 #if (SIM_COUNT >= 3)
8559 if (slotId == 3) radioServiceRwlockPtr = &radioServiceRwlock3;
8560 #if (SIM_COUNT >= 4)
8561 if (slotId == 4) radioServiceRwlockPtr = &radioServiceRwlock4;
8562 #endif
8563 #endif
8564 #endif
8565
8566 return radioServiceRwlockPtr;
Sanket Padawe0de29d12017-02-10 13:19:47 -08008567}
Amit Mahajane9a10e62018-02-23 17:12:15 -08008568
8569// should acquire write lock for the corresponding service before calling this
8570void radio::setNitzTimeReceived(int slotId, long timeReceived) {
8571 nitzTimeReceived[slotId] = timeReceived;
8572}