blob: 37994502a035f3a0a356bbc76babd674c259e0af [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
Amit Mahajan3df62912017-02-10 01:35:55 +0000103void convertRilHardwareConfigListToHal(void *response, size_t responseLen,
104 hidl_vec<HardwareConfig>& records);
105
106void convertRilRadioCapabilityToHal(void *response, size_t responseLen, RadioCapability& rc);
107
108void convertRilLceDataInfoToHal(void *response, size_t responseLen, LceDataInfo& lce);
109
110void convertRilSignalStrengthToHal(void *response, size_t responseLen,
111 SignalStrength& signalStrength);
112
113void convertRilDataCallToHal(RIL_Data_Call_Response_v11 *dcResponse,
114 SetupDataCallResult& dcResult);
115
116void convertRilDataCallListToHal(void *response, size_t responseLen,
117 hidl_vec<SetupDataCallResult>& dcResultList);
118
119void convertRilCellInfoListToHal(void *response, size_t responseLen, hidl_vec<CellInfo>& records);
120
Amit Mahajanccb6d7f2017-06-09 10:44:54 -0700121struct RadioImpl : public V1_1::IRadio {
Sanket Padawef220dc52017-01-02 23:46:00 -0800122 int32_t mSlotId;
123 sp<IRadioResponse> mRadioResponse;
124 sp<IRadioIndication> mRadioIndication;
Amit Mahajanccb6d7f2017-06-09 10:44:54 -0700125 sp<V1_1::IRadioResponse> mRadioResponseV1_1;
126 sp<V1_1::IRadioIndication> mRadioIndicationV1_1;
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700127
128 Return<void> setResponseFunctions(
129 const ::android::sp<IRadioResponse>& radioResponse,
130 const ::android::sp<IRadioIndication>& radioIndication);
131
132 Return<void> getIccCardStatus(int32_t serial);
133
Sanket Padawef220dc52017-01-02 23:46:00 -0800134 Return<void> supplyIccPinForApp(int32_t serial, const hidl_string& pin,
135 const hidl_string& aid);
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700136
Sanket Padawef220dc52017-01-02 23:46:00 -0800137 Return<void> supplyIccPukForApp(int32_t serial, const hidl_string& puk,
138 const hidl_string& pin, const hidl_string& aid);
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700139
140 Return<void> supplyIccPin2ForApp(int32_t serial,
Sanket Padawef220dc52017-01-02 23:46:00 -0800141 const hidl_string& pin2,
142 const hidl_string& aid);
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700143
Sanket Padawef220dc52017-01-02 23:46:00 -0800144 Return<void> supplyIccPuk2ForApp(int32_t serial, const hidl_string& puk2,
145 const hidl_string& pin2, const hidl_string& aid);
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700146
Sanket Padawef220dc52017-01-02 23:46:00 -0800147 Return<void> changeIccPinForApp(int32_t serial, const hidl_string& oldPin,
148 const hidl_string& newPin, const hidl_string& aid);
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700149
Sanket Padawef220dc52017-01-02 23:46:00 -0800150 Return<void> changeIccPin2ForApp(int32_t serial, const hidl_string& oldPin2,
151 const hidl_string& newPin2, const hidl_string& aid);
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700152
Sanket Padawef220dc52017-01-02 23:46:00 -0800153 Return<void> supplyNetworkDepersonalization(int32_t serial, const hidl_string& netPin);
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700154
155 Return<void> getCurrentCalls(int32_t serial);
156
Sanket Padawef220dc52017-01-02 23:46:00 -0800157 Return<void> dial(int32_t serial, const Dial& dialInfo);
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700158
159 Return<void> getImsiForApp(int32_t serial,
160 const ::android::hardware::hidl_string& aid);
161
162 Return<void> hangup(int32_t serial, int32_t gsmIndex);
163
164 Return<void> hangupWaitingOrBackground(int32_t serial);
165
166 Return<void> hangupForegroundResumeBackground(int32_t serial);
167
168 Return<void> switchWaitingOrHoldingAndActive(int32_t serial);
169
170 Return<void> conference(int32_t serial);
171
172 Return<void> rejectCall(int32_t serial);
173
174 Return<void> getLastCallFailCause(int32_t serial);
175
176 Return<void> getSignalStrength(int32_t serial);
177
178 Return<void> getVoiceRegistrationState(int32_t serial);
179
180 Return<void> getDataRegistrationState(int32_t serial);
181
182 Return<void> getOperator(int32_t serial);
183
184 Return<void> setRadioPower(int32_t serial, bool on);
185
186 Return<void> sendDtmf(int32_t serial,
187 const ::android::hardware::hidl_string& s);
188
189 Return<void> sendSms(int32_t serial, const GsmSmsMessage& message);
190
191 Return<void> sendSMSExpectMore(int32_t serial, const GsmSmsMessage& message);
192
193 Return<void> setupDataCall(int32_t serial,
Jack Yu06181bb2017-01-10 12:10:41 -0800194 RadioTechnology radioTechnology,
195 const DataProfileInfo& profileInfo,
196 bool modemCognitive,
Jack Yuffc06452017-02-13 11:21:00 -0800197 bool roamingAllowed,
198 bool isRoaming);
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700199
200 Return<void> iccIOForApp(int32_t serial,
201 const IccIo& iccIo);
202
203 Return<void> sendUssd(int32_t serial,
204 const ::android::hardware::hidl_string& ussd);
205
206 Return<void> cancelPendingUssd(int32_t serial);
207
208 Return<void> getClir(int32_t serial);
209
210 Return<void> setClir(int32_t serial, int32_t status);
211
212 Return<void> getCallForwardStatus(int32_t serial,
213 const CallForwardInfo& callInfo);
214
215 Return<void> setCallForward(int32_t serial,
216 const CallForwardInfo& callInfo);
217
218 Return<void> getCallWaiting(int32_t serial, int32_t serviceClass);
219
220 Return<void> setCallWaiting(int32_t serial, bool enable, int32_t serviceClass);
221
222 Return<void> acknowledgeLastIncomingGsmSms(int32_t serial,
223 bool success, SmsAcknowledgeFailCause cause);
224
225 Return<void> acceptCall(int32_t serial);
226
227 Return<void> deactivateDataCall(int32_t serial,
228 int32_t cid, bool reasonRadioShutDown);
229
230 Return<void> getFacilityLockForApp(int32_t serial,
231 const ::android::hardware::hidl_string& facility,
232 const ::android::hardware::hidl_string& password,
233 int32_t serviceClass,
234 const ::android::hardware::hidl_string& appId);
235
236 Return<void> setFacilityLockForApp(int32_t serial,
237 const ::android::hardware::hidl_string& facility,
238 bool lockState,
239 const ::android::hardware::hidl_string& password,
240 int32_t serviceClass,
241 const ::android::hardware::hidl_string& appId);
242
243 Return<void> setBarringPassword(int32_t serial,
244 const ::android::hardware::hidl_string& facility,
245 const ::android::hardware::hidl_string& oldPassword,
246 const ::android::hardware::hidl_string& newPassword);
247
248 Return<void> getNetworkSelectionMode(int32_t serial);
249
250 Return<void> setNetworkSelectionModeAutomatic(int32_t serial);
251
252 Return<void> setNetworkSelectionModeManual(int32_t serial,
253 const ::android::hardware::hidl_string& operatorNumeric);
254
255 Return<void> getAvailableNetworks(int32_t serial);
256
Nathan Harold6a8809d2017-07-07 19:28:58 -0700257 Return<void> startNetworkScan(int32_t serial, const V1_1::NetworkScanRequest& request);
yinxu3abe7c72017-05-03 15:15:19 -0700258
259 Return<void> stopNetworkScan(int32_t serial);
260
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700261 Return<void> startDtmf(int32_t serial,
262 const ::android::hardware::hidl_string& s);
263
264 Return<void> stopDtmf(int32_t serial);
265
266 Return<void> getBasebandVersion(int32_t serial);
267
268 Return<void> separateConnection(int32_t serial, int32_t gsmIndex);
269
270 Return<void> setMute(int32_t serial, bool enable);
271
272 Return<void> getMute(int32_t serial);
273
274 Return<void> getClip(int32_t serial);
275
276 Return<void> getDataCallList(int32_t serial);
277
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700278 Return<void> setSuppServiceNotifications(int32_t serial, bool enable);
279
280 Return<void> writeSmsToSim(int32_t serial,
281 const SmsWriteArgs& smsWriteArgs);
282
283 Return<void> deleteSmsOnSim(int32_t serial, int32_t index);
284
285 Return<void> setBandMode(int32_t serial, RadioBandMode mode);
286
287 Return<void> getAvailableBandModes(int32_t serial);
288
289 Return<void> sendEnvelope(int32_t serial,
290 const ::android::hardware::hidl_string& command);
291
292 Return<void> sendTerminalResponseToSim(int32_t serial,
293 const ::android::hardware::hidl_string& commandResponse);
294
295 Return<void> handleStkCallSetupRequestFromSim(int32_t serial, bool accept);
296
297 Return<void> explicitCallTransfer(int32_t serial);
298
299 Return<void> setPreferredNetworkType(int32_t serial, PreferredNetworkType nwType);
300
301 Return<void> getPreferredNetworkType(int32_t serial);
302
303 Return<void> getNeighboringCids(int32_t serial);
304
305 Return<void> setLocationUpdates(int32_t serial, bool enable);
306
307 Return<void> setCdmaSubscriptionSource(int32_t serial,
308 CdmaSubscriptionSource cdmaSub);
309
310 Return<void> setCdmaRoamingPreference(int32_t serial, CdmaRoamingType type);
311
312 Return<void> getCdmaRoamingPreference(int32_t serial);
313
314 Return<void> setTTYMode(int32_t serial, TtyMode mode);
315
316 Return<void> getTTYMode(int32_t serial);
317
318 Return<void> setPreferredVoicePrivacy(int32_t serial, bool enable);
319
320 Return<void> getPreferredVoicePrivacy(int32_t serial);
321
322 Return<void> sendCDMAFeatureCode(int32_t serial,
323 const ::android::hardware::hidl_string& featureCode);
324
325 Return<void> sendBurstDtmf(int32_t serial,
326 const ::android::hardware::hidl_string& dtmf,
327 int32_t on,
328 int32_t off);
329
330 Return<void> sendCdmaSms(int32_t serial, const CdmaSmsMessage& sms);
331
332 Return<void> acknowledgeLastIncomingCdmaSms(int32_t serial,
333 const CdmaSmsAck& smsAck);
334
335 Return<void> getGsmBroadcastConfig(int32_t serial);
336
337 Return<void> setGsmBroadcastConfig(int32_t serial,
338 const hidl_vec<GsmBroadcastSmsConfigInfo>& configInfo);
339
340 Return<void> setGsmBroadcastActivation(int32_t serial, bool activate);
341
342 Return<void> getCdmaBroadcastConfig(int32_t serial);
343
344 Return<void> setCdmaBroadcastConfig(int32_t serial,
345 const hidl_vec<CdmaBroadcastSmsConfigInfo>& configInfo);
346
347 Return<void> setCdmaBroadcastActivation(int32_t serial, bool activate);
348
349 Return<void> getCDMASubscription(int32_t serial);
350
351 Return<void> writeSmsToRuim(int32_t serial, const CdmaSmsWriteArgs& cdmaSms);
352
353 Return<void> deleteSmsOnRuim(int32_t serial, int32_t index);
354
355 Return<void> getDeviceIdentity(int32_t serial);
356
357 Return<void> exitEmergencyCallbackMode(int32_t serial);
358
359 Return<void> getSmscAddress(int32_t serial);
360
361 Return<void> setSmscAddress(int32_t serial,
362 const ::android::hardware::hidl_string& smsc);
363
364 Return<void> reportSmsMemoryStatus(int32_t serial, bool available);
365
366 Return<void> reportStkServiceIsRunning(int32_t serial);
367
368 Return<void> getCdmaSubscriptionSource(int32_t serial);
369
370 Return<void> requestIsimAuthentication(int32_t serial,
371 const ::android::hardware::hidl_string& challenge);
372
373 Return<void> acknowledgeIncomingGsmSmsWithPdu(int32_t serial,
374 bool success,
375 const ::android::hardware::hidl_string& ackPdu);
376
377 Return<void> sendEnvelopeWithStatus(int32_t serial,
378 const ::android::hardware::hidl_string& contents);
379
380 Return<void> getVoiceRadioTechnology(int32_t serial);
381
382 Return<void> getCellInfoList(int32_t serial);
383
384 Return<void> setCellInfoListRate(int32_t serial, int32_t rate);
385
Jack Yu06181bb2017-01-10 12:10:41 -0800386 Return<void> setInitialAttachApn(int32_t serial, const DataProfileInfo& dataProfileInfo,
Jack Yuffc06452017-02-13 11:21:00 -0800387 bool modemCognitive, bool isRoaming);
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700388
389 Return<void> getImsRegistrationState(int32_t serial);
390
391 Return<void> sendImsSms(int32_t serial, const ImsSmsMessage& message);
392
393 Return<void> iccTransmitApduBasicChannel(int32_t serial, const SimApdu& message);
394
395 Return<void> iccOpenLogicalChannel(int32_t serial,
Wileen Chiu410b7562015-11-23 14:25:22 -0800396 const ::android::hardware::hidl_string& aid, int32_t p2);
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700397
398 Return<void> iccCloseLogicalChannel(int32_t serial, int32_t channelId);
399
400 Return<void> iccTransmitApduLogicalChannel(int32_t serial, const SimApdu& message);
401
402 Return<void> nvReadItem(int32_t serial, NvItem itemId);
403
404 Return<void> nvWriteItem(int32_t serial, const NvWriteItem& item);
405
406 Return<void> nvWriteCdmaPrl(int32_t serial,
407 const ::android::hardware::hidl_vec<uint8_t>& prl);
408
409 Return<void> nvResetConfig(int32_t serial, ResetNvType resetType);
410
411 Return<void> setUiccSubscription(int32_t serial, const SelectUiccSub& uiccSub);
412
413 Return<void> setDataAllowed(int32_t serial, bool allow);
414
415 Return<void> getHardwareConfig(int32_t serial);
416
417 Return<void> requestIccSimAuthentication(int32_t serial,
418 int32_t authContext,
419 const ::android::hardware::hidl_string& authData,
420 const ::android::hardware::hidl_string& aid);
421
422 Return<void> setDataProfile(int32_t serial,
Jack Yuffc06452017-02-13 11:21:00 -0800423 const ::android::hardware::hidl_vec<DataProfileInfo>& profiles, bool isRoaming);
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700424
425 Return<void> requestShutdown(int32_t serial);
426
427 Return<void> getRadioCapability(int32_t serial);
428
429 Return<void> setRadioCapability(int32_t serial, const RadioCapability& rc);
430
431 Return<void> startLceService(int32_t serial, int32_t reportInterval, bool pullMode);
432
433 Return<void> stopLceService(int32_t serial);
434
435 Return<void> pullLceData(int32_t serial);
436
437 Return<void> getModemActivityInfo(int32_t serial);
438
439 Return<void> setAllowedCarriers(int32_t serial,
440 bool allAllowed,
441 const CarrierRestrictions& carriers);
442
443 Return<void> getAllowedCarriers(int32_t serial);
444
Jack Yu06181bb2017-01-10 12:10:41 -0800445 Return<void> sendDeviceState(int32_t serial, DeviceStateType deviceStateType, bool state);
446
447 Return<void> setIndicationFilter(int32_t serial, int32_t indicationFilter);
448
Nathan Harold6a8809d2017-07-07 19:28:58 -0700449 Return<void> startKeepalive(int32_t serial, const V1_1::KeepaliveRequest& keepalive);
Nathan Haroldec94b822017-05-25 16:10:35 -0700450
451 Return<void> stopKeepalive(int32_t serial, int32_t sessionHandle);
452
Wileen Chiu718c0bf2017-01-04 11:37:19 -0800453 Return<void> setSimCardPower(int32_t serial, bool powerUp);
Grace Chen08eb6542017-03-23 18:39:48 -0700454 Return<void> setSimCardPower_1_1(int32_t serial,
Amit Mahajanccb6d7f2017-06-09 10:44:54 -0700455 const V1_1::CardPowerState state);
Wileen Chiu718c0bf2017-01-04 11:37:19 -0800456
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700457 Return<void> responseAcknowledgement();
Amit Mahajan17249842017-01-19 15:05:45 -0800458
pkanwardb8e0942017-03-17 12:49:34 -0700459 Return<void> setCarrierInfoForImsiEncryption(int32_t serial,
Nathan Harold6a8809d2017-07-07 19:28:58 -0700460 const V1_1::ImsiEncryptionInfo& message);
pkanwardb8e0942017-03-17 12:49:34 -0700461
Amit Mahajan17249842017-01-19 15:05:45 -0800462 void checkReturnStatus(Return<void>& ret);
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700463};
464
Amit Mahajan439da362017-02-13 17:43:04 -0800465struct OemHookImpl : public IOemHook {
466 int32_t mSlotId;
467 sp<IOemHookResponse> mOemHookResponse;
468 sp<IOemHookIndication> mOemHookIndication;
469
470 Return<void> setResponseFunctions(
471 const ::android::sp<IOemHookResponse>& oemHookResponse,
472 const ::android::sp<IOemHookIndication>& oemHookIndication);
473
474 Return<void> sendRequestRaw(int32_t serial,
475 const ::android::hardware::hidl_vec<uint8_t>& data);
476
477 Return<void> sendRequestStrings(int32_t serial,
478 const ::android::hardware::hidl_vec<::android::hardware::hidl_string>& data);
479};
480
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800481void memsetAndFreeStrings(int numPointers, ...) {
482 va_list ap;
483 va_start(ap, numPointers);
484 for (int i = 0; i < numPointers; i++) {
485 char *ptr = va_arg(ap, char *);
486 if (ptr) {
487#ifdef MEMSET_FREED
Jack Yub4295a42017-04-14 12:51:49 -0700488#define MAX_STRING_LENGTH 4096
489 memset(ptr, 0, strnlen(ptr, MAX_STRING_LENGTH));
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800490#endif
491 free(ptr);
492 }
493 }
494 va_end(ap);
495}
496
Jack Yuffc06452017-02-13 11:21:00 -0800497void sendErrorResponse(RequestInfo *pRI, RIL_Errno err) {
Amit Mahajan759786a2017-03-03 17:35:47 -0800498 pRI->pCI->responseFunction((int) pRI->socket_id,
Jack Yuffc06452017-02-13 11:21:00 -0800499 (int) RadioResponseType::SOLICITED, pRI->token, err, NULL, 0);
500}
501
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800502/**
Jack Yuf68e0da2017-02-07 14:53:09 -0800503 * Copies over src to dest. If memory allocation fails, responseFunction() is called for the
Ashit Sood169fc262018-09-06 14:10:34 -0700504 * request with error RIL_E_NO_MEMORY. The size() method is used to determine the size of the
505 * destination buffer into which the HIDL string is copied. If there is a discrepancy between
506 * the string length reported by the size() method, and the length of the string returned by
507 * the c_str() method, the function will return false indicating a failure.
508 *
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800509 * Returns true on success, and false on failure.
510 */
Ruthwar Kumar Ambeer7c373812017-03-23 17:38:56 +0530511bool copyHidlStringToRil(char **dest, const hidl_string &src, RequestInfo *pRI, bool allowEmpty) {
Jack Yuf68e0da2017-02-07 14:53:09 -0800512 size_t len = src.size();
Ruthwar Kumar Ambeer7c373812017-03-23 17:38:56 +0530513 if (len == 0 && !allowEmpty) {
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800514 *dest = NULL;
515 return true;
516 }
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800517 *dest = (char *) calloc(len + 1, sizeof(char));
518 if (*dest == NULL) {
519 RLOGE("Memory allocation failed for request %s", requestToString(pRI->pCI->requestNumber));
Jack Yuffc06452017-02-13 11:21:00 -0800520 sendErrorResponse(pRI, RIL_E_NO_MEMORY);
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800521 return false;
522 }
Ashit Sood169fc262018-09-06 14:10:34 -0700523 if (strlcpy(*dest, src.c_str(), len + 1) >= (len + 1)) {
524 RLOGE("Copy of the HIDL string has been truncated, as "
525 "the string length reported by size() does not "
526 "match the length of string returned by c_str().");
527 free(*dest);
528 *dest = NULL;
529 sendErrorResponse(pRI, RIL_E_INTERNAL_ERR);
530 return false;
531 }
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800532 return true;
533}
534
Ruthwar Kumar Ambeer7c373812017-03-23 17:38:56 +0530535bool copyHidlStringToRil(char **dest, const hidl_string &src, RequestInfo *pRI) {
536 return copyHidlStringToRil(dest, src, pRI, false);
537}
538
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800539hidl_string convertCharPtrToHidlString(const char *ptr) {
540 hidl_string ret;
541 if (ptr != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -0800542 // TODO: replace this with strnlen
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800543 ret.setToExternal(ptr, strlen(ptr));
544 }
545 return ret;
546}
547
548bool dispatchVoid(int serial, int slotId, int request) {
549 RequestInfo *pRI = android::addRequestToList(serial, slotId, request);
550 if (pRI == NULL) {
551 return false;
552 }
Amit Mahajanb3a11bb2017-05-15 16:41:44 -0700553 CALL_ONREQUEST(request, NULL, 0, pRI, slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800554 return true;
555}
556
557bool dispatchString(int serial, int slotId, int request, const char * str) {
558 RequestInfo *pRI = android::addRequestToList(serial, slotId, request);
559 if (pRI == NULL) {
560 return false;
561 }
562
563 char *pString;
564 if (!copyHidlStringToRil(&pString, str, pRI)) {
565 return false;
566 }
567
Amit Mahajanb3a11bb2017-05-15 16:41:44 -0700568 CALL_ONREQUEST(request, pString, sizeof(char *), pRI, slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800569
570 memsetAndFreeStrings(1, pString);
571 return true;
572}
573
Ruthwar Kumar Ambeer7c373812017-03-23 17:38:56 +0530574bool dispatchStrings(int serial, int slotId, int request, bool allowEmpty, int countStrings, ...) {
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800575 RequestInfo *pRI = android::addRequestToList(serial, slotId, request);
576 if (pRI == NULL) {
577 return false;
578 }
579
Sanket Padawef220dc52017-01-02 23:46:00 -0800580 char **pStrings;
Sanket Padawef220dc52017-01-02 23:46:00 -0800581 pStrings = (char **)calloc(countStrings, sizeof(char *));
582 if (pStrings == NULL) {
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800583 RLOGE("Memory allocation failed for request %s", requestToString(request));
Jack Yuffc06452017-02-13 11:21:00 -0800584 sendErrorResponse(pRI, RIL_E_NO_MEMORY);
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800585 return false;
Sanket Padawef220dc52017-01-02 23:46:00 -0800586 }
587 va_list ap;
588 va_start(ap, countStrings);
589 for (int i = 0; i < countStrings; i++) {
590 const char* str = va_arg(ap, const char *);
Ruthwar Kumar Ambeer7c373812017-03-23 17:38:56 +0530591 if (!copyHidlStringToRil(&pStrings[i], hidl_string(str), pRI, allowEmpty)) {
Sanket Padawef220dc52017-01-02 23:46:00 -0800592 va_end(ap);
Sanket Padawef220dc52017-01-02 23:46:00 -0800593 for (int j = 0; j < i; j++) {
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800594 memsetAndFreeStrings(1, pStrings[j]);
Sanket Padawef220dc52017-01-02 23:46:00 -0800595 }
596 free(pStrings);
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800597 return false;
Sanket Padawef220dc52017-01-02 23:46:00 -0800598 }
Sanket Padawef220dc52017-01-02 23:46:00 -0800599 }
600 va_end(ap);
601
Amit Mahajanb3a11bb2017-05-15 16:41:44 -0700602 CALL_ONREQUEST(request, pStrings, countStrings * sizeof(char *), pRI, slotId);
Sanket Padawef220dc52017-01-02 23:46:00 -0800603
604 if (pStrings != NULL) {
605 for (int i = 0 ; i < countStrings ; i++) {
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800606 memsetAndFreeStrings(1, pStrings[i]);
Sanket Padawef220dc52017-01-02 23:46:00 -0800607 }
608
609#ifdef MEMSET_FREED
610 memset(pStrings, 0, countStrings * sizeof(char *));
611#endif
612 free(pStrings);
613 }
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800614 return true;
615}
616
617bool dispatchStrings(int serial, int slotId, int request, const hidl_vec<hidl_string>& data) {
618 RequestInfo *pRI = android::addRequestToList(serial, slotId, request);
619 if (pRI == NULL) {
620 return false;
621 }
622
623 int countStrings = data.size();
624 char **pStrings;
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800625 pStrings = (char **)calloc(countStrings, sizeof(char *));
626 if (pStrings == NULL) {
627 RLOGE("Memory allocation failed for request %s", requestToString(request));
Jack Yuffc06452017-02-13 11:21:00 -0800628 sendErrorResponse(pRI, RIL_E_NO_MEMORY);
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800629 return false;
630 }
631
632 for (int i = 0; i < countStrings; i++) {
Jack Yuf68e0da2017-02-07 14:53:09 -0800633 if (!copyHidlStringToRil(&pStrings[i], data[i], pRI)) {
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800634 for (int j = 0; j < i; j++) {
635 memsetAndFreeStrings(1, pStrings[j]);
636 }
637 free(pStrings);
638 return false;
639 }
640 }
641
Amit Mahajanb3a11bb2017-05-15 16:41:44 -0700642 CALL_ONREQUEST(request, pStrings, countStrings * sizeof(char *), pRI, slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800643
644 if (pStrings != NULL) {
645 for (int i = 0 ; i < countStrings ; i++) {
646 memsetAndFreeStrings(1, pStrings[i]);
647 }
648
649#ifdef MEMSET_FREED
650 memset(pStrings, 0, countStrings * sizeof(char *));
651#endif
652 free(pStrings);
653 }
654 return true;
655}
656
657bool dispatchInts(int serial, int slotId, int request, int countInts, ...) {
658 RequestInfo *pRI = android::addRequestToList(serial, slotId, request);
659 if (pRI == NULL) {
660 return false;
661 }
662
Jack Yuffc06452017-02-13 11:21:00 -0800663 int *pInts = (int *)calloc(countInts, sizeof(int));
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800664
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800665 if (pInts == NULL) {
666 RLOGE("Memory allocation failed for request %s", requestToString(request));
Jack Yuffc06452017-02-13 11:21:00 -0800667 sendErrorResponse(pRI, RIL_E_NO_MEMORY);
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800668 return false;
669 }
670 va_list ap;
671 va_start(ap, countInts);
672 for (int i = 0; i < countInts; i++) {
673 pInts[i] = va_arg(ap, int);
674 }
675 va_end(ap);
676
Amit Mahajanb3a11bb2017-05-15 16:41:44 -0700677 CALL_ONREQUEST(request, pInts, countInts * sizeof(int), pRI, slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800678
679 if (pInts != NULL) {
680#ifdef MEMSET_FREED
681 memset(pInts, 0, countInts * sizeof(int));
682#endif
683 free(pInts);
684 }
685 return true;
686}
687
688bool dispatchCallForwardStatus(int serial, int slotId, int request,
689 const CallForwardInfo& callInfo) {
690 RequestInfo *pRI = android::addRequestToList(serial, slotId, request);
691 if (pRI == NULL) {
692 return false;
693 }
694
695 RIL_CallForwardInfo cf;
696 cf.status = (int) callInfo.status;
697 cf.reason = callInfo.reason;
698 cf.serviceClass = callInfo.serviceClass;
699 cf.toa = callInfo.toa;
700 cf.timeSeconds = callInfo.timeSeconds;
701
702 if (!copyHidlStringToRil(&cf.number, callInfo.number, pRI)) {
703 return false;
704 }
705
Amit Mahajanb3a11bb2017-05-15 16:41:44 -0700706 CALL_ONREQUEST(request, &cf, sizeof(cf), pRI, slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800707
708 memsetAndFreeStrings(1, cf.number);
709
710 return true;
711}
712
713bool dispatchRaw(int serial, int slotId, int request, const hidl_vec<uint8_t>& rawBytes) {
714 RequestInfo *pRI = android::addRequestToList(serial, slotId, request);
715 if (pRI == NULL) {
716 return false;
717 }
718
719 const uint8_t *uData = rawBytes.data();
720
Amit Mahajanb3a11bb2017-05-15 16:41:44 -0700721 CALL_ONREQUEST(request, (void *) uData, rawBytes.size(), pRI, slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800722
723 return true;
724}
725
726bool dispatchIccApdu(int serial, int slotId, int request, const SimApdu& message) {
727 RequestInfo *pRI = android::addRequestToList(serial, slotId, request);
728 if (pRI == NULL) {
729 return false;
730 }
731
Jack Yu8e732d42017-04-14 00:08:06 -0700732 RIL_SIM_APDU apdu = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800733
734 apdu.sessionid = message.sessionId;
735 apdu.cla = message.cla;
736 apdu.instruction = message.instruction;
737 apdu.p1 = message.p1;
738 apdu.p2 = message.p2;
739 apdu.p3 = message.p3;
740
741 if (!copyHidlStringToRil(&apdu.data, message.data, pRI)) {
742 return false;
743 }
744
Amit Mahajanb3a11bb2017-05-15 16:41:44 -0700745 CALL_ONREQUEST(request, &apdu, sizeof(apdu), pRI, slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800746
747 memsetAndFreeStrings(1, apdu.data);
748
749 return true;
Sanket Padawef220dc52017-01-02 23:46:00 -0800750}
751
Amit Mahajand423d192017-03-16 17:04:01 -0700752void checkReturnStatus(int32_t slotId, Return<void>& ret, bool isRadioService) {
Amit Mahajan17249842017-01-19 15:05:45 -0800753 if (ret.isOk() == false) {
Amit Mahajan439da362017-02-13 17:43:04 -0800754 RLOGE("checkReturnStatus: unable to call response/indication callback");
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800755 // Remote process hosting the callbacks must be dead. Reset the callback objects;
Amit Mahajan17249842017-01-19 15:05:45 -0800756 // there's no other recovery to be done here. When the client process is back up, it will
757 // call setResponseFunctions()
Amit Mahajan932e08e2017-01-24 05:45:02 -0800758
759 // Caller should already hold rdlock, release that first
760 // note the current counter to avoid overwriting updates made by another thread before
761 // write lock is acquired.
Amit Mahajand423d192017-03-16 17:04:01 -0700762 int counter = isRadioService ? mCounterRadio[slotId] : mCounterOemHook[slotId];
Amit Mahajan439da362017-02-13 17:43:04 -0800763 pthread_rwlock_t *radioServiceRwlockPtr = radio::getRadioServiceRwlock(slotId);
Amit Mahajan932e08e2017-01-24 05:45:02 -0800764 int ret = pthread_rwlock_unlock(radioServiceRwlockPtr);
765 assert(ret == 0);
766
767 // acquire wrlock
768 ret = pthread_rwlock_wrlock(radioServiceRwlockPtr);
769 assert(ret == 0);
770
771 // make sure the counter value has not changed
Amit Mahajand423d192017-03-16 17:04:01 -0700772 if (counter == (isRadioService ? mCounterRadio[slotId] : mCounterOemHook[slotId])) {
773 if (isRadioService) {
774 radioService[slotId]->mRadioResponse = NULL;
775 radioService[slotId]->mRadioIndication = NULL;
Amit Mahajanccb6d7f2017-06-09 10:44:54 -0700776 radioService[slotId]->mRadioResponseV1_1 = NULL;
777 radioService[slotId]->mRadioIndicationV1_1 = NULL;
Amit Mahajand423d192017-03-16 17:04:01 -0700778 } else {
779 oemHookService[slotId]->mOemHookResponse = NULL;
780 oemHookService[slotId]->mOemHookIndication = NULL;
781 }
782 isRadioService ? mCounterRadio[slotId]++ : mCounterOemHook[slotId]++;
Amit Mahajan932e08e2017-01-24 05:45:02 -0800783 } else {
Amit Mahajan439da362017-02-13 17:43:04 -0800784 RLOGE("checkReturnStatus: not resetting responseFunctions as they likely "
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800785 "got updated on another thread");
Amit Mahajan932e08e2017-01-24 05:45:02 -0800786 }
787
788 // release wrlock
789 ret = pthread_rwlock_unlock(radioServiceRwlockPtr);
790 assert(ret == 0);
791
792 // Reacquire rdlock
793 ret = pthread_rwlock_rdlock(radioServiceRwlockPtr);
794 assert(ret == 0);
Amit Mahajan17249842017-01-19 15:05:45 -0800795 }
796}
797
Amit Mahajan439da362017-02-13 17:43:04 -0800798void RadioImpl::checkReturnStatus(Return<void>& ret) {
Amit Mahajand423d192017-03-16 17:04:01 -0700799 ::checkReturnStatus(mSlotId, ret, true);
Amit Mahajan439da362017-02-13 17:43:04 -0800800}
801
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700802Return<void> RadioImpl::setResponseFunctions(
803 const ::android::sp<IRadioResponse>& radioResponseParam,
804 const ::android::sp<IRadioIndication>& radioIndicationParam) {
Amit Mahajan111ddca2017-03-03 12:05:13 -0800805 RLOGD("setResponseFunctions");
Amit Mahajan932e08e2017-01-24 05:45:02 -0800806
807 pthread_rwlock_t *radioServiceRwlockPtr = radio::getRadioServiceRwlock(mSlotId);
808 int ret = pthread_rwlock_wrlock(radioServiceRwlockPtr);
809 assert(ret == 0);
810
Sanket Padawef220dc52017-01-02 23:46:00 -0800811 mRadioResponse = radioResponseParam;
812 mRadioIndication = radioIndicationParam;
Amit Mahajanccb6d7f2017-06-09 10:44:54 -0700813 mRadioResponseV1_1 = V1_1::IRadioResponse::castFrom(mRadioResponse).withDefault(nullptr);
814 mRadioIndicationV1_1 = V1_1::IRadioIndication::castFrom(mRadioIndication).withDefault(nullptr);
815 if (mRadioResponseV1_1 == nullptr || mRadioIndicationV1_1 == nullptr) {
816 mRadioResponseV1_1 = nullptr;
817 mRadioIndicationV1_1 = nullptr;
818 }
819
Amit Mahajand423d192017-03-16 17:04:01 -0700820 mCounterRadio[mSlotId]++;
Amit Mahajan932e08e2017-01-24 05:45:02 -0800821
822 ret = pthread_rwlock_unlock(radioServiceRwlockPtr);
823 assert(ret == 0);
824
Amit Mahajan60482fd2017-03-14 16:39:27 -0700825 // client is connected. Send initial indications.
826 android::onNewCommandConnect((RIL_SOCKET_ID) mSlotId);
827
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800828 return Void();
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700829}
830
831Return<void> RadioImpl::getIccCardStatus(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -0700832#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -0800833 RLOGD("getIccCardStatus: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -0700834#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800835 dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_SIM_STATUS);
836 return Void();
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700837}
838
Sanket Padawef220dc52017-01-02 23:46:00 -0800839Return<void> RadioImpl::supplyIccPinForApp(int32_t serial, const hidl_string& pin,
840 const hidl_string& aid) {
Jayachandran C572f2f42017-03-25 14:30:13 -0700841#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -0800842 RLOGD("supplyIccPinForApp: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -0700843#endif
Ruthwar Kumar Ambeer7c373812017-03-23 17:38:56 +0530844 dispatchStrings(serial, mSlotId, RIL_REQUEST_ENTER_SIM_PIN, true,
Scott Randolphc7213312017-04-03 14:06:40 -0700845 2, pin.c_str(), aid.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800846 return Void();
Sanket Padawef220dc52017-01-02 23:46:00 -0800847}
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700848
Sanket Padawef220dc52017-01-02 23:46:00 -0800849Return<void> RadioImpl::supplyIccPukForApp(int32_t serial, const hidl_string& puk,
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800850 const hidl_string& pin, const hidl_string& aid) {
Jayachandran C572f2f42017-03-25 14:30:13 -0700851#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -0800852 RLOGD("supplyIccPukForApp: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -0700853#endif
Ruthwar Kumar Ambeer7c373812017-03-23 17:38:56 +0530854 dispatchStrings(serial, mSlotId, RIL_REQUEST_ENTER_SIM_PUK, true,
Scott Randolphc7213312017-04-03 14:06:40 -0700855 3, puk.c_str(), pin.c_str(), aid.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800856 return Void();
Sanket Padawef220dc52017-01-02 23:46:00 -0800857}
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700858
Sanket Padawef220dc52017-01-02 23:46:00 -0800859Return<void> RadioImpl::supplyIccPin2ForApp(int32_t serial, const hidl_string& pin2,
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800860 const hidl_string& aid) {
Jayachandran C572f2f42017-03-25 14:30:13 -0700861#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -0800862 RLOGD("supplyIccPin2ForApp: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -0700863#endif
Ruthwar Kumar Ambeer7c373812017-03-23 17:38:56 +0530864 dispatchStrings(serial, mSlotId, RIL_REQUEST_ENTER_SIM_PIN2, true,
Scott Randolphc7213312017-04-03 14:06:40 -0700865 2, pin2.c_str(), aid.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800866 return Void();
Sanket Padawef220dc52017-01-02 23:46:00 -0800867}
868
869Return<void> RadioImpl::supplyIccPuk2ForApp(int32_t serial, const hidl_string& puk2,
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800870 const hidl_string& pin2, const hidl_string& aid) {
Jayachandran C572f2f42017-03-25 14:30:13 -0700871#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -0800872 RLOGD("supplyIccPuk2ForApp: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -0700873#endif
Ruthwar Kumar Ambeer7c373812017-03-23 17:38:56 +0530874 dispatchStrings(serial, mSlotId, RIL_REQUEST_ENTER_SIM_PUK2, true,
Scott Randolphc7213312017-04-03 14:06:40 -0700875 3, puk2.c_str(), pin2.c_str(), aid.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800876 return Void();
Sanket Padawef220dc52017-01-02 23:46:00 -0800877}
878
879Return<void> RadioImpl::changeIccPinForApp(int32_t serial, const hidl_string& oldPin,
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800880 const hidl_string& newPin, const hidl_string& aid) {
Jayachandran C572f2f42017-03-25 14:30:13 -0700881#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -0800882 RLOGD("changeIccPinForApp: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -0700883#endif
Ruthwar Kumar Ambeer7c373812017-03-23 17:38:56 +0530884 dispatchStrings(serial, mSlotId, RIL_REQUEST_CHANGE_SIM_PIN, true,
Scott Randolphc7213312017-04-03 14:06:40 -0700885 3, oldPin.c_str(), newPin.c_str(), aid.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800886 return Void();
Sanket Padawef220dc52017-01-02 23:46:00 -0800887}
888
889Return<void> RadioImpl::changeIccPin2ForApp(int32_t serial, const hidl_string& oldPin2,
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800890 const hidl_string& newPin2, const hidl_string& aid) {
Jayachandran C572f2f42017-03-25 14:30:13 -0700891#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -0800892 RLOGD("changeIccPin2ForApp: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -0700893#endif
Ruthwar Kumar Ambeer7c373812017-03-23 17:38:56 +0530894 dispatchStrings(serial, mSlotId, RIL_REQUEST_CHANGE_SIM_PIN2, true,
Scott Randolphc7213312017-04-03 14:06:40 -0700895 3, oldPin2.c_str(), newPin2.c_str(), aid.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800896 return Void();
Sanket Padawef220dc52017-01-02 23:46:00 -0800897}
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700898
899Return<void> RadioImpl::supplyNetworkDepersonalization(int32_t serial,
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800900 const hidl_string& netPin) {
Jayachandran C572f2f42017-03-25 14:30:13 -0700901#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -0800902 RLOGD("supplyNetworkDepersonalization: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -0700903#endif
Ruthwar Kumar Ambeer7c373812017-03-23 17:38:56 +0530904 dispatchStrings(serial, mSlotId, RIL_REQUEST_ENTER_NETWORK_DEPERSONALIZATION, true,
Scott Randolphc7213312017-04-03 14:06:40 -0700905 1, netPin.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800906 return Void();
Sanket Padawef220dc52017-01-02 23:46:00 -0800907}
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700908
Sanket Padawef220dc52017-01-02 23:46:00 -0800909Return<void> RadioImpl::getCurrentCalls(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -0700910#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -0800911 RLOGD("getCurrentCalls: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -0700912#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800913 dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_CURRENT_CALLS);
914 return Void();
Sanket Padawef220dc52017-01-02 23:46:00 -0800915}
916
917Return<void> RadioImpl::dial(int32_t serial, const Dial& dialInfo) {
Jayachandran C572f2f42017-03-25 14:30:13 -0700918#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -0800919 RLOGD("dial: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -0700920#endif
Sanket Padawef220dc52017-01-02 23:46:00 -0800921 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_DIAL);
922 if (pRI == NULL) {
923 return Void();
924 }
Jack Yuf68e0da2017-02-07 14:53:09 -0800925 RIL_Dial dial = {};
926 RIL_UUS_Info uusInfo = {};
Sanket Padawef220dc52017-01-02 23:46:00 -0800927 int32_t sizeOfDial = sizeof(dial);
928
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800929 if (!copyHidlStringToRil(&dial.address, dialInfo.address, pRI)) {
Sanket Padawef220dc52017-01-02 23:46:00 -0800930 return Void();
931 }
Jack Yuf68e0da2017-02-07 14:53:09 -0800932 dial.clir = (int) dialInfo.clir;
Sanket Padawef220dc52017-01-02 23:46:00 -0800933
Sanket Padawef220dc52017-01-02 23:46:00 -0800934 if (dialInfo.uusInfo.size() != 0) {
Sanket Padawef220dc52017-01-02 23:46:00 -0800935 uusInfo.uusType = (RIL_UUS_Type) dialInfo.uusInfo[0].uusType;
936 uusInfo.uusDcs = (RIL_UUS_DCS) dialInfo.uusInfo[0].uusDcs;
937
938 if (dialInfo.uusInfo[0].uusData.size() == 0) {
939 uusInfo.uusData = NULL;
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800940 uusInfo.uusLength = 0;
Sanket Padawef220dc52017-01-02 23:46:00 -0800941 } else {
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800942 if (!copyHidlStringToRil(&uusInfo.uusData, dialInfo.uusInfo[0].uusData, pRI)) {
943 memsetAndFreeStrings(1, dial.address);
Sanket Padawef220dc52017-01-02 23:46:00 -0800944 return Void();
945 }
Jack Yuf68e0da2017-02-07 14:53:09 -0800946 uusInfo.uusLength = dialInfo.uusInfo[0].uusData.size();
Sanket Padawef220dc52017-01-02 23:46:00 -0800947 }
948
Sanket Padawef220dc52017-01-02 23:46:00 -0800949 dial.uusInfo = &uusInfo;
950 }
951
Amit Mahajanb3a11bb2017-05-15 16:41:44 -0700952 CALL_ONREQUEST(RIL_REQUEST_DIAL, &dial, sizeOfDial, pRI, mSlotId);
Sanket Padawef220dc52017-01-02 23:46:00 -0800953
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800954 memsetAndFreeStrings(2, dial.address, uusInfo.uusData);
Sanket Padawef220dc52017-01-02 23:46:00 -0800955
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800956 return Void();
Sanket Padawef220dc52017-01-02 23:46:00 -0800957}
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700958
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800959Return<void> RadioImpl::getImsiForApp(int32_t serial, const hidl_string& aid) {
Jayachandran C572f2f42017-03-25 14:30:13 -0700960#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -0800961 RLOGD("getImsiForApp: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -0700962#endif
Ruthwar Kumar Ambeer7c373812017-03-23 17:38:56 +0530963 dispatchStrings(serial, mSlotId, RIL_REQUEST_GET_IMSI, false,
Scott Randolphc7213312017-04-03 14:06:40 -0700964 1, aid.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800965 return Void();
966}
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700967
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800968Return<void> RadioImpl::hangup(int32_t serial, int32_t gsmIndex) {
Jayachandran C572f2f42017-03-25 14:30:13 -0700969#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -0800970 RLOGD("hangup: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -0700971#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800972 dispatchInts(serial, mSlotId, RIL_REQUEST_HANGUP, 1, gsmIndex);
973 return Void();
974}
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700975
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800976Return<void> RadioImpl::hangupWaitingOrBackground(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -0700977#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -0800978 RLOGD("hangupWaitingOrBackground: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -0700979#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800980 dispatchVoid(serial, mSlotId, RIL_REQUEST_HANGUP_WAITING_OR_BACKGROUND);
981 return Void();
982}
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700983
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800984Return<void> RadioImpl::hangupForegroundResumeBackground(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -0700985#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -0800986 RLOGD("hangupForegroundResumeBackground: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -0700987#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800988 dispatchVoid(serial, mSlotId, RIL_REQUEST_HANGUP_FOREGROUND_RESUME_BACKGROUND);
989 return Void();
990}
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700991
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800992Return<void> RadioImpl::switchWaitingOrHoldingAndActive(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -0700993#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -0800994 RLOGD("switchWaitingOrHoldingAndActive: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -0700995#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800996 dispatchVoid(serial, mSlotId, RIL_REQUEST_SWITCH_WAITING_OR_HOLDING_AND_ACTIVE);
997 return Void();
998}
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700999
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001000Return<void> RadioImpl::conference(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001001#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001002 RLOGD("conference: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001003#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001004 dispatchVoid(serial, mSlotId, RIL_REQUEST_CONFERENCE);
1005 return Void();
1006}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001007
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001008Return<void> RadioImpl::rejectCall(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001009#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001010 RLOGD("rejectCall: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001011#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001012 dispatchVoid(serial, mSlotId, RIL_REQUEST_UDUB);
1013 return Void();
1014}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001015
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001016Return<void> RadioImpl::getLastCallFailCause(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001017#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001018 RLOGD("getLastCallFailCause: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001019#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001020 dispatchVoid(serial, mSlotId, RIL_REQUEST_LAST_CALL_FAIL_CAUSE);
1021 return Void();
1022}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001023
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001024Return<void> RadioImpl::getSignalStrength(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001025#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001026 RLOGD("getSignalStrength: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001027#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001028 dispatchVoid(serial, mSlotId, RIL_REQUEST_SIGNAL_STRENGTH);
1029 return Void();
1030}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001031
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001032Return<void> RadioImpl::getVoiceRegistrationState(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001033#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001034 RLOGD("getVoiceRegistrationState: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001035#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001036 dispatchVoid(serial, mSlotId, RIL_REQUEST_VOICE_REGISTRATION_STATE);
1037 return Void();
1038}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001039
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001040Return<void> RadioImpl::getDataRegistrationState(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001041#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001042 RLOGD("getDataRegistrationState: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001043#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001044 dispatchVoid(serial, mSlotId, RIL_REQUEST_DATA_REGISTRATION_STATE);
1045 return Void();
1046}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001047
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001048Return<void> RadioImpl::getOperator(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001049#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001050 RLOGD("getOperator: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001051#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001052 dispatchVoid(serial, mSlotId, RIL_REQUEST_OPERATOR);
1053 return Void();
1054}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001055
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001056Return<void> RadioImpl::setRadioPower(int32_t serial, bool on) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08001057 RLOGD("setRadioPower: serial %d on %d", serial, on);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001058 dispatchInts(serial, mSlotId, RIL_REQUEST_RADIO_POWER, 1, BOOL_TO_INT(on));
1059 return Void();
1060}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001061
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001062Return<void> RadioImpl::sendDtmf(int32_t serial, const hidl_string& s) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001063#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001064 RLOGD("sendDtmf: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001065#endif
Scott Randolphc7213312017-04-03 14:06:40 -07001066 dispatchString(serial, mSlotId, RIL_REQUEST_DTMF, s.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001067 return Void();
1068}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001069
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001070Return<void> RadioImpl::sendSms(int32_t serial, const GsmSmsMessage& message) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001071#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001072 RLOGD("sendSms: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001073#endif
Ruthwar Kumar Ambeer7c373812017-03-23 17:38:56 +05301074 dispatchStrings(serial, mSlotId, RIL_REQUEST_SEND_SMS, false,
Scott Randolphc7213312017-04-03 14:06:40 -07001075 2, message.smscPdu.c_str(), message.pdu.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001076 return Void();
1077}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001078
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001079Return<void> RadioImpl::sendSMSExpectMore(int32_t serial, const GsmSmsMessage& message) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001080#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001081 RLOGD("sendSMSExpectMore: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001082#endif
Ruthwar Kumar Ambeer7c373812017-03-23 17:38:56 +05301083 dispatchStrings(serial, mSlotId, RIL_REQUEST_SEND_SMS_EXPECT_MORE, false,
Scott Randolphc7213312017-04-03 14:06:40 -07001084 2, message.smscPdu.c_str(), message.pdu.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001085 return Void();
1086}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001087
Jack Yuc13645e2017-04-13 20:55:03 -07001088static bool convertMvnoTypeToString(MvnoType type, char *&str) {
Jack Yuffc06452017-02-13 11:21:00 -08001089 switch (type) {
Jack Yuc13645e2017-04-13 20:55:03 -07001090 case MvnoType::IMSI:
1091 str = (char *)"imsi";
1092 return true;
1093 case MvnoType::GID:
1094 str = (char *)"gid";
1095 return true;
1096 case MvnoType::SPN:
1097 str = (char *)"spn";
1098 return true;
1099 case MvnoType::NONE:
1100 str = (char *)"";
1101 return true;
Jack Yuffc06452017-02-13 11:21:00 -08001102 }
Jack Yuc13645e2017-04-13 20:55:03 -07001103 return false;
Jack Yuffc06452017-02-13 11:21:00 -08001104}
1105
1106Return<void> RadioImpl::setupDataCall(int32_t serial, RadioTechnology radioTechnology,
1107 const DataProfileInfo& dataProfileInfo, bool modemCognitive,
1108 bool roamingAllowed, bool isRoaming) {
1109
Jayachandran C572f2f42017-03-25 14:30:13 -07001110#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001111 RLOGD("setupDataCall: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001112#endif
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001113
Jack Yuffc06452017-02-13 11:21:00 -08001114 if (s_vendorFunctions->version >= 4 && s_vendorFunctions->version <= 14) {
1115 const hidl_string &protocol =
1116 (isRoaming ? dataProfileInfo.roamingProtocol : dataProfileInfo.protocol);
Ruthwar Kumar Ambeer7c373812017-03-23 17:38:56 +05301117 dispatchStrings(serial, mSlotId, RIL_REQUEST_SETUP_DATA_CALL, true, 7,
Jack Yuffc06452017-02-13 11:21:00 -08001118 std::to_string((int) radioTechnology + 2).c_str(),
1119 std::to_string((int) dataProfileInfo.profileId).c_str(),
1120 dataProfileInfo.apn.c_str(),
1121 dataProfileInfo.user.c_str(),
1122 dataProfileInfo.password.c_str(),
1123 std::to_string((int) dataProfileInfo.authType).c_str(),
1124 protocol.c_str());
1125 } else if (s_vendorFunctions->version >= 15) {
Jack Yuc13645e2017-04-13 20:55:03 -07001126 char *mvnoTypeStr = NULL;
1127 if (!convertMvnoTypeToString(dataProfileInfo.mvnoType, mvnoTypeStr)) {
Jack Yuffc06452017-02-13 11:21:00 -08001128 RequestInfo *pRI = android::addRequestToList(serial, mSlotId,
1129 RIL_REQUEST_SETUP_DATA_CALL);
1130 if (pRI != NULL) {
1131 sendErrorResponse(pRI, RIL_E_INVALID_ARGUMENTS);
1132 }
1133 return Void();
1134 }
Ruthwar Kumar Ambeer7c373812017-03-23 17:38:56 +05301135 dispatchStrings(serial, mSlotId, RIL_REQUEST_SETUP_DATA_CALL, true, 15,
Jack Yuffc06452017-02-13 11:21:00 -08001136 std::to_string((int) radioTechnology + 2).c_str(),
1137 std::to_string((int) dataProfileInfo.profileId).c_str(),
1138 dataProfileInfo.apn.c_str(),
1139 dataProfileInfo.user.c_str(),
1140 dataProfileInfo.password.c_str(),
1141 std::to_string((int) dataProfileInfo.authType).c_str(),
1142 dataProfileInfo.protocol.c_str(),
1143 dataProfileInfo.roamingProtocol.c_str(),
1144 std::to_string(dataProfileInfo.supportedApnTypesBitmap).c_str(),
1145 std::to_string(dataProfileInfo.bearerBitmap).c_str(),
Jack Yuc13645e2017-04-13 20:55:03 -07001146 modemCognitive ? "1" : "0",
Jack Yuffc06452017-02-13 11:21:00 -08001147 std::to_string(dataProfileInfo.mtu).c_str(),
1148 mvnoTypeStr,
1149 dataProfileInfo.mvnoMatchData.c_str(),
Jack Yuc13645e2017-04-13 20:55:03 -07001150 roamingAllowed ? "1" : "0");
Jack Yuffc06452017-02-13 11:21:00 -08001151 } else {
1152 RLOGE("Unsupported RIL version %d, min version expected 4", s_vendorFunctions->version);
1153 RequestInfo *pRI = android::addRequestToList(serial, mSlotId,
1154 RIL_REQUEST_SETUP_DATA_CALL);
1155 if (pRI != NULL) {
1156 sendErrorResponse(pRI, RIL_E_REQUEST_NOT_SUPPORTED);
1157 }
1158 }
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001159 return Void();
1160}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001161
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001162Return<void> RadioImpl::iccIOForApp(int32_t serial, const IccIo& iccIo) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001163#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001164 RLOGD("iccIOForApp: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001165#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001166 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_SIM_IO);
1167 if (pRI == NULL) {
1168 return Void();
1169 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001170
Jack Yu8e732d42017-04-14 00:08:06 -07001171 RIL_SIM_IO_v6 rilIccIo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001172 rilIccIo.command = iccIo.command;
1173 rilIccIo.fileid = iccIo.fileId;
1174 if (!copyHidlStringToRil(&rilIccIo.path, iccIo.path, pRI)) {
1175 return Void();
1176 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001177
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001178 rilIccIo.p1 = iccIo.p1;
1179 rilIccIo.p2 = iccIo.p2;
1180 rilIccIo.p3 = iccIo.p3;
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001181
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001182 if (!copyHidlStringToRil(&rilIccIo.data, iccIo.data, pRI)) {
1183 memsetAndFreeStrings(1, rilIccIo.path);
1184 return Void();
1185 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001186
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001187 if (!copyHidlStringToRil(&rilIccIo.pin2, iccIo.pin2, pRI)) {
1188 memsetAndFreeStrings(2, rilIccIo.path, rilIccIo.data);
1189 return Void();
1190 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001191
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001192 if (!copyHidlStringToRil(&rilIccIo.aidPtr, iccIo.aid, pRI)) {
1193 memsetAndFreeStrings(3, rilIccIo.path, rilIccIo.data, rilIccIo.pin2);
1194 return Void();
1195 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001196
Amit Mahajanb3a11bb2017-05-15 16:41:44 -07001197 CALL_ONREQUEST(RIL_REQUEST_SIM_IO, &rilIccIo, sizeof(rilIccIo), pRI, mSlotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001198
1199 memsetAndFreeStrings(4, rilIccIo.path, rilIccIo.data, rilIccIo.pin2, rilIccIo.aidPtr);
1200
1201 return Void();
1202}
1203
1204Return<void> RadioImpl::sendUssd(int32_t serial, const hidl_string& ussd) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001205#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001206 RLOGD("sendUssd: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001207#endif
Scott Randolphc7213312017-04-03 14:06:40 -07001208 dispatchString(serial, mSlotId, RIL_REQUEST_SEND_USSD, ussd.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001209 return Void();
1210}
1211
1212Return<void> RadioImpl::cancelPendingUssd(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001213#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001214 RLOGD("cancelPendingUssd: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001215#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001216 dispatchVoid(serial, mSlotId, RIL_REQUEST_CANCEL_USSD);
1217 return Void();
1218}
1219
1220Return<void> RadioImpl::getClir(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001221#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001222 RLOGD("getClir: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001223#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001224 dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_CLIR);
1225 return Void();
1226}
1227
1228Return<void> RadioImpl::setClir(int32_t serial, int32_t status) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001229#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001230 RLOGD("setClir: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001231#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001232 dispatchInts(serial, mSlotId, RIL_REQUEST_SET_CLIR, 1, status);
1233 return Void();
1234}
1235
1236Return<void> RadioImpl::getCallForwardStatus(int32_t serial, const CallForwardInfo& callInfo) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001237#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001238 RLOGD("getCallForwardStatus: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001239#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001240 dispatchCallForwardStatus(serial, mSlotId, RIL_REQUEST_QUERY_CALL_FORWARD_STATUS,
1241 callInfo);
1242 return Void();
1243}
1244
1245Return<void> RadioImpl::setCallForward(int32_t serial, const CallForwardInfo& callInfo) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001246#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001247 RLOGD("setCallForward: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001248#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001249 dispatchCallForwardStatus(serial, mSlotId, RIL_REQUEST_SET_CALL_FORWARD,
1250 callInfo);
1251 return Void();
1252}
1253
1254Return<void> RadioImpl::getCallWaiting(int32_t serial, int32_t serviceClass) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001255#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001256 RLOGD("getCallWaiting: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001257#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001258 dispatchInts(serial, mSlotId, RIL_REQUEST_QUERY_CALL_WAITING, 1, serviceClass);
1259 return Void();
1260}
1261
1262Return<void> RadioImpl::setCallWaiting(int32_t serial, bool enable, int32_t serviceClass) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001263#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001264 RLOGD("setCallWaiting: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001265#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001266 dispatchInts(serial, mSlotId, RIL_REQUEST_SET_CALL_WAITING, 2, BOOL_TO_INT(enable),
1267 serviceClass);
1268 return Void();
1269}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001270
1271Return<void> RadioImpl::acknowledgeLastIncomingGsmSms(int32_t serial,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001272 bool success, SmsAcknowledgeFailCause cause) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001273#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001274 RLOGD("acknowledgeLastIncomingGsmSms: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001275#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001276 dispatchInts(serial, mSlotId, RIL_REQUEST_SMS_ACKNOWLEDGE, 2, BOOL_TO_INT(success),
1277 cause);
1278 return Void();
1279}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001280
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001281Return<void> RadioImpl::acceptCall(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001282#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001283 RLOGD("acceptCall: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001284#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001285 dispatchVoid(serial, mSlotId, RIL_REQUEST_ANSWER);
1286 return Void();
1287}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001288
1289Return<void> RadioImpl::deactivateDataCall(int32_t serial,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001290 int32_t cid, bool reasonRadioShutDown) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001291#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001292 RLOGD("deactivateDataCall: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001293#endif
Ruthwar Kumar Ambeer7c373812017-03-23 17:38:56 +05301294 dispatchStrings(serial, mSlotId, RIL_REQUEST_DEACTIVATE_DATA_CALL, false,
Scott Randolphc7213312017-04-03 14:06:40 -07001295 2, (std::to_string(cid)).c_str(), reasonRadioShutDown ? "1" : "0");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001296 return Void();
1297}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001298
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001299Return<void> RadioImpl::getFacilityLockForApp(int32_t serial, const hidl_string& facility,
1300 const hidl_string& password, int32_t serviceClass,
1301 const hidl_string& appId) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001302#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001303 RLOGD("getFacilityLockForApp: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001304#endif
Ruthwar Kumar Ambeer7c373812017-03-23 17:38:56 +05301305 dispatchStrings(serial, mSlotId, RIL_REQUEST_QUERY_FACILITY_LOCK, true,
Scott Randolphc7213312017-04-03 14:06:40 -07001306 4, facility.c_str(), password.c_str(),
1307 (std::to_string(serviceClass)).c_str(), appId.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001308 return Void();
1309}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001310
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001311Return<void> RadioImpl::setFacilityLockForApp(int32_t serial, const hidl_string& facility,
1312 bool lockState, const hidl_string& password,
1313 int32_t serviceClass, const hidl_string& appId) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001314#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001315 RLOGD("setFacilityLockForApp: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001316#endif
Ruthwar Kumar Ambeer7c373812017-03-23 17:38:56 +05301317 dispatchStrings(serial, mSlotId, RIL_REQUEST_SET_FACILITY_LOCK, true,
Scott Randolphc7213312017-04-03 14:06:40 -07001318 5, facility.c_str(), lockState ? "1" : "0", password.c_str(),
1319 (std::to_string(serviceClass)).c_str(), appId.c_str() );
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001320 return Void();
1321}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001322
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001323Return<void> RadioImpl::setBarringPassword(int32_t serial, const hidl_string& facility,
1324 const hidl_string& oldPassword,
1325 const hidl_string& newPassword) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001326#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001327 RLOGD("setBarringPassword: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001328#endif
Ruthwar Kumar Ambeer7c373812017-03-23 17:38:56 +05301329 dispatchStrings(serial, mSlotId, RIL_REQUEST_CHANGE_BARRING_PASSWORD, true,
Sanket Padawe75e42a52017-05-24 10:03:55 -07001330 3, facility.c_str(), oldPassword.c_str(), newPassword.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001331 return Void();
1332}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001333
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001334Return<void> RadioImpl::getNetworkSelectionMode(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001335#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001336 RLOGD("getNetworkSelectionMode: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001337#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001338 dispatchVoid(serial, mSlotId, RIL_REQUEST_QUERY_NETWORK_SELECTION_MODE);
1339 return Void();
1340}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001341
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001342Return<void> RadioImpl::setNetworkSelectionModeAutomatic(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001343#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001344 RLOGD("setNetworkSelectionModeAutomatic: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001345#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001346 dispatchVoid(serial, mSlotId, RIL_REQUEST_SET_NETWORK_SELECTION_AUTOMATIC);
1347 return Void();
1348}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001349
1350Return<void> RadioImpl::setNetworkSelectionModeManual(int32_t serial,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001351 const hidl_string& operatorNumeric) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001352#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001353 RLOGD("setNetworkSelectionModeManual: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001354#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001355 dispatchString(serial, mSlotId, RIL_REQUEST_SET_NETWORK_SELECTION_MANUAL,
Scott Randolphc7213312017-04-03 14:06:40 -07001356 operatorNumeric.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001357 return Void();
1358}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001359
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001360Return<void> RadioImpl::getAvailableNetworks(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001361#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001362 RLOGD("getAvailableNetworks: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001363#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001364 dispatchVoid(serial, mSlotId, RIL_REQUEST_QUERY_AVAILABLE_NETWORKS);
1365 return Void();
1366}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001367
Nathan Harold6a8809d2017-07-07 19:28:58 -07001368Return<void> RadioImpl::startNetworkScan(int32_t serial, const V1_1::NetworkScanRequest& request) {
yinxu3abe7c72017-05-03 15:15:19 -07001369#if VDBG
1370 RLOGD("startNetworkScan: serial %d", serial);
1371#endif
yinxu8688abd2017-05-22 11:26:45 -07001372
1373 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_START_NETWORK_SCAN);
1374 if (pRI == NULL) {
1375 return Void();
1376 }
1377
1378 if (request.specifiers.size() > MAX_RADIO_ACCESS_NETWORKS) {
1379 sendErrorResponse(pRI, RIL_E_INVALID_ARGUMENTS);
1380 return Void();
1381 }
1382
1383 RIL_NetworkScanRequest scan_request = {};
1384
1385 scan_request.type = (RIL_ScanType) request.type;
1386 scan_request.interval = request.interval;
1387 scan_request.specifiers_length = request.specifiers.size();
1388 for (size_t i = 0; i < request.specifiers.size(); ++i) {
1389 if (request.specifiers[i].geranBands.size() > MAX_BANDS ||
1390 request.specifiers[i].utranBands.size() > MAX_BANDS ||
1391 request.specifiers[i].eutranBands.size() > MAX_BANDS ||
1392 request.specifiers[i].channels.size() > MAX_CHANNELS) {
1393 sendErrorResponse(pRI, RIL_E_INVALID_ARGUMENTS);
1394 return Void();
1395 }
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07001396 const V1_1::RadioAccessSpecifier& ras_from =
yinxu8688abd2017-05-22 11:26:45 -07001397 request.specifiers[i];
1398 RIL_RadioAccessSpecifier& ras_to = scan_request.specifiers[i];
1399
1400 ras_to.radio_access_network = (RIL_RadioAccessNetworks) ras_from.radioAccessNetwork;
1401 ras_to.channels_length = ras_from.channels.size();
1402
1403 std::copy(ras_from.channels.begin(), ras_from.channels.end(), ras_to.channels);
1404 const std::vector<uint32_t> * bands = nullptr;
1405 switch (request.specifiers[i].radioAccessNetwork) {
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07001406 case V1_1::RadioAccessNetworks::GERAN:
yinxu8688abd2017-05-22 11:26:45 -07001407 ras_to.bands_length = ras_from.geranBands.size();
1408 bands = (std::vector<uint32_t> *) &ras_from.geranBands;
1409 break;
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07001410 case V1_1::RadioAccessNetworks::UTRAN:
yinxu8688abd2017-05-22 11:26:45 -07001411 ras_to.bands_length = ras_from.utranBands.size();
1412 bands = (std::vector<uint32_t> *) &ras_from.utranBands;
1413 break;
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07001414 case V1_1::RadioAccessNetworks::EUTRAN:
yinxu8688abd2017-05-22 11:26:45 -07001415 ras_to.bands_length = ras_from.eutranBands.size();
1416 bands = (std::vector<uint32_t> *) &ras_from.eutranBands;
1417 break;
1418 default:
1419 sendErrorResponse(pRI, RIL_E_INVALID_ARGUMENTS);
1420 return Void();
1421 }
1422 // safe to copy to geran_bands because it's a union member
yinxu9c7ad932017-06-22 17:10:59 -07001423 for (size_t idx = 0; idx < ras_to.bands_length; ++idx) {
1424 ras_to.bands.geran_bands[idx] = (RIL_GeranBands) (*bands)[idx];
1425 }
yinxu8688abd2017-05-22 11:26:45 -07001426 }
1427
Mathieu Chartierf65b2c92017-06-05 13:59:25 -07001428 CALL_ONREQUEST(RIL_REQUEST_START_NETWORK_SCAN, &scan_request, sizeof(scan_request), pRI,
1429 mSlotId);
yinxu8688abd2017-05-22 11:26:45 -07001430
yinxu3abe7c72017-05-03 15:15:19 -07001431 return Void();
1432}
1433
1434Return<void> RadioImpl::stopNetworkScan(int32_t serial) {
1435#if VDBG
1436 RLOGD("stopNetworkScan: serial %d", serial);
1437#endif
yinxu3abe7c72017-05-03 15:15:19 -07001438 dispatchVoid(serial, mSlotId, RIL_REQUEST_STOP_NETWORK_SCAN);
1439 return Void();
1440}
1441
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001442Return<void> RadioImpl::startDtmf(int32_t serial, const hidl_string& s) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001443#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001444 RLOGD("startDtmf: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001445#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001446 dispatchString(serial, mSlotId, RIL_REQUEST_DTMF_START,
Scott Randolphc7213312017-04-03 14:06:40 -07001447 s.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001448 return Void();
1449}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001450
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001451Return<void> RadioImpl::stopDtmf(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001452#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001453 RLOGD("stopDtmf: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001454#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001455 dispatchVoid(serial, mSlotId, RIL_REQUEST_DTMF_STOP);
1456 return Void();
1457}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001458
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001459Return<void> RadioImpl::getBasebandVersion(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001460#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001461 RLOGD("getBasebandVersion: 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_BASEBAND_VERSION);
1464 return Void();
1465}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001466
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001467Return<void> RadioImpl::separateConnection(int32_t serial, int32_t gsmIndex) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001468#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001469 RLOGD("separateConnection: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001470#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001471 dispatchInts(serial, mSlotId, RIL_REQUEST_SEPARATE_CONNECTION, 1, gsmIndex);
1472 return Void();
1473}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001474
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001475Return<void> RadioImpl::setMute(int32_t serial, bool enable) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001476#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001477 RLOGD("setMute: 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_SET_MUTE, 1, BOOL_TO_INT(enable));
1480 return Void();
1481}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001482
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001483Return<void> RadioImpl::getMute(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001484#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001485 RLOGD("getMute: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001486#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001487 dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_MUTE);
1488 return Void();
1489}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001490
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001491Return<void> RadioImpl::getClip(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001492#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001493 RLOGD("getClip: 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_QUERY_CLIP);
1496 return Void();
1497}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001498
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001499Return<void> RadioImpl::getDataCallList(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001500#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001501 RLOGD("getDataCallList: 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_DATA_CALL_LIST);
1504 return Void();
1505}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001506
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001507Return<void> RadioImpl::setSuppServiceNotifications(int32_t serial, bool enable) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001508#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001509 RLOGD("setSuppServiceNotifications: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001510#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001511 dispatchInts(serial, mSlotId, RIL_REQUEST_SET_SUPP_SVC_NOTIFICATION, 1,
1512 BOOL_TO_INT(enable));
1513 return Void();
1514}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001515
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001516Return<void> RadioImpl::writeSmsToSim(int32_t serial, const SmsWriteArgs& smsWriteArgs) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001517#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001518 RLOGD("writeSmsToSim: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001519#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001520 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_WRITE_SMS_TO_SIM);
1521 if (pRI == NULL) {
1522 return Void();
1523 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001524
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001525 RIL_SMS_WriteArgs args;
1526 args.status = (int) smsWriteArgs.status;
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001527
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001528 if (!copyHidlStringToRil(&args.pdu, smsWriteArgs.pdu, pRI)) {
1529 return Void();
1530 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001531
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001532 if (!copyHidlStringToRil(&args.smsc, smsWriteArgs.smsc, pRI)) {
1533 memsetAndFreeStrings(1, args.pdu);
1534 return Void();
1535 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001536
Amit Mahajanb3a11bb2017-05-15 16:41:44 -07001537 CALL_ONREQUEST(RIL_REQUEST_WRITE_SMS_TO_SIM, &args, sizeof(args), pRI, mSlotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001538
1539 memsetAndFreeStrings(2, args.smsc, args.pdu);
1540
1541 return Void();
1542}
1543
1544Return<void> RadioImpl::deleteSmsOnSim(int32_t serial, int32_t index) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001545#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001546 RLOGD("deleteSmsOnSim: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001547#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001548 dispatchInts(serial, mSlotId, RIL_REQUEST_DELETE_SMS_ON_SIM, 1, index);
1549 return Void();
1550}
1551
1552Return<void> RadioImpl::setBandMode(int32_t serial, RadioBandMode mode) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001553#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001554 RLOGD("setBandMode: 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_SET_BAND_MODE, 1, mode);
1557 return Void();
1558}
1559
1560Return<void> RadioImpl::getAvailableBandModes(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001561#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001562 RLOGD("getAvailableBandModes: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001563#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001564 dispatchVoid(serial, mSlotId, RIL_REQUEST_QUERY_AVAILABLE_BAND_MODE);
1565 return Void();
1566}
1567
1568Return<void> RadioImpl::sendEnvelope(int32_t serial, const hidl_string& command) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001569#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001570 RLOGD("sendEnvelope: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001571#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001572 dispatchString(serial, mSlotId, RIL_REQUEST_STK_SEND_ENVELOPE_COMMAND,
Scott Randolphc7213312017-04-03 14:06:40 -07001573 command.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001574 return Void();
1575}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001576
1577Return<void> RadioImpl::sendTerminalResponseToSim(int32_t serial,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001578 const hidl_string& commandResponse) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001579#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001580 RLOGD("sendTerminalResponseToSim: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001581#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001582 dispatchString(serial, mSlotId, RIL_REQUEST_STK_SEND_TERMINAL_RESPONSE,
Scott Randolphc7213312017-04-03 14:06:40 -07001583 commandResponse.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001584 return Void();
1585}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001586
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001587Return<void> RadioImpl::handleStkCallSetupRequestFromSim(int32_t serial, bool accept) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001588#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001589 RLOGD("handleStkCallSetupRequestFromSim: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001590#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001591 dispatchInts(serial, mSlotId, RIL_REQUEST_STK_HANDLE_CALL_SETUP_REQUESTED_FROM_SIM,
1592 1, BOOL_TO_INT(accept));
1593 return Void();
1594}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001595
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001596Return<void> RadioImpl::explicitCallTransfer(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001597#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001598 RLOGD("explicitCallTransfer: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001599#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001600 dispatchVoid(serial, mSlotId, RIL_REQUEST_EXPLICIT_CALL_TRANSFER);
1601 return Void();
1602}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001603
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001604Return<void> RadioImpl::setPreferredNetworkType(int32_t serial, PreferredNetworkType nwType) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001605#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001606 RLOGD("setPreferredNetworkType: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001607#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001608 dispatchInts(serial, mSlotId, RIL_REQUEST_SET_PREFERRED_NETWORK_TYPE, 1, nwType);
1609 return Void();
1610}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001611
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001612Return<void> RadioImpl::getPreferredNetworkType(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001613#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001614 RLOGD("getPreferredNetworkType: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001615#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001616 dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_PREFERRED_NETWORK_TYPE);
1617 return Void();
1618}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001619
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001620Return<void> RadioImpl::getNeighboringCids(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001621#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001622 RLOGD("getNeighboringCids: 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_NEIGHBORING_CELL_IDS);
1625 return Void();
1626}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001627
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001628Return<void> RadioImpl::setLocationUpdates(int32_t serial, bool enable) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001629#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001630 RLOGD("setLocationUpdates: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001631#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001632 dispatchInts(serial, mSlotId, RIL_REQUEST_SET_LOCATION_UPDATES, 1, BOOL_TO_INT(enable));
1633 return Void();
1634}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001635
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001636Return<void> RadioImpl::setCdmaSubscriptionSource(int32_t serial, CdmaSubscriptionSource cdmaSub) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001637#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001638 RLOGD("setCdmaSubscriptionSource: 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_CDMA_SET_SUBSCRIPTION_SOURCE, 1, cdmaSub);
1641 return Void();
1642}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001643
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001644Return<void> RadioImpl::setCdmaRoamingPreference(int32_t serial, CdmaRoamingType type) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001645#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001646 RLOGD("setCdmaRoamingPreference: 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_ROAMING_PREFERENCE, 1, type);
1649 return Void();
1650}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001651
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001652Return<void> RadioImpl::getCdmaRoamingPreference(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001653#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001654 RLOGD("getCdmaRoamingPreference: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001655#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001656 dispatchVoid(serial, mSlotId, RIL_REQUEST_CDMA_QUERY_ROAMING_PREFERENCE);
1657 return Void();
1658}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001659
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001660Return<void> RadioImpl::setTTYMode(int32_t serial, TtyMode mode) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001661#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001662 RLOGD("setTTYMode: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001663#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001664 dispatchInts(serial, mSlotId, RIL_REQUEST_SET_TTY_MODE, 1, mode);
1665 return Void();
1666}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001667
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001668Return<void> RadioImpl::getTTYMode(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001669#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001670 RLOGD("getTTYMode: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001671#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001672 dispatchVoid(serial, mSlotId, RIL_REQUEST_QUERY_TTY_MODE);
1673 return Void();
1674}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001675
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001676Return<void> RadioImpl::setPreferredVoicePrivacy(int32_t serial, bool enable) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001677#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001678 RLOGD("setPreferredVoicePrivacy: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001679#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001680 dispatchInts(serial, mSlotId, RIL_REQUEST_CDMA_SET_PREFERRED_VOICE_PRIVACY_MODE,
1681 1, BOOL_TO_INT(enable));
1682 return Void();
1683}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001684
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001685Return<void> RadioImpl::getPreferredVoicePrivacy(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001686#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001687 RLOGD("getPreferredVoicePrivacy: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001688#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001689 dispatchVoid(serial, mSlotId, RIL_REQUEST_CDMA_QUERY_PREFERRED_VOICE_PRIVACY_MODE);
1690 return Void();
1691}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001692
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001693Return<void> RadioImpl::sendCDMAFeatureCode(int32_t serial, const hidl_string& featureCode) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001694#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001695 RLOGD("sendCDMAFeatureCode: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001696#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001697 dispatchString(serial, mSlotId, RIL_REQUEST_CDMA_FLASH,
Scott Randolphc7213312017-04-03 14:06:40 -07001698 featureCode.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001699 return Void();
1700}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001701
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001702Return<void> RadioImpl::sendBurstDtmf(int32_t serial, const hidl_string& dtmf, int32_t on,
1703 int32_t off) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001704#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001705 RLOGD("sendBurstDtmf: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001706#endif
Ruthwar Kumar Ambeer7c373812017-03-23 17:38:56 +05301707 dispatchStrings(serial, mSlotId, RIL_REQUEST_CDMA_BURST_DTMF, false,
Scott Randolphc7213312017-04-03 14:06:40 -07001708 3, dtmf.c_str(), (std::to_string(on)).c_str(),
1709 (std::to_string(off)).c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001710 return Void();
1711}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001712
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001713void constructCdmaSms(RIL_CDMA_SMS_Message &rcsm, const CdmaSmsMessage& sms) {
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001714 rcsm.uTeleserviceID = sms.teleserviceId;
1715 rcsm.bIsServicePresent = BOOL_TO_INT(sms.isServicePresent);
1716 rcsm.uServicecategory = sms.serviceCategory;
1717 rcsm.sAddress.digit_mode = (RIL_CDMA_SMS_DigitMode) sms.address.digitMode;
1718 rcsm.sAddress.number_mode = (RIL_CDMA_SMS_NumberMode) sms.address.numberMode;
1719 rcsm.sAddress.number_type = (RIL_CDMA_SMS_NumberType) sms.address.numberType;
1720 rcsm.sAddress.number_plan = (RIL_CDMA_SMS_NumberPlan) sms.address.numberPlan;
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001721
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001722 rcsm.sAddress.number_of_digits = sms.address.digits.size();
1723 int digitLimit= MIN((rcsm.sAddress.number_of_digits), RIL_CDMA_SMS_ADDRESS_MAX);
1724 for (int i = 0; i < digitLimit; i++) {
1725 rcsm.sAddress.digits[i] = sms.address.digits[i];
1726 }
1727
1728 rcsm.sSubAddress.subaddressType = (RIL_CDMA_SMS_SubaddressType) sms.subAddress.subaddressType;
1729 rcsm.sSubAddress.odd = BOOL_TO_INT(sms.subAddress.odd);
1730
1731 rcsm.sSubAddress.number_of_digits = sms.subAddress.digits.size();
1732 digitLimit= MIN((rcsm.sSubAddress.number_of_digits), RIL_CDMA_SMS_SUBADDRESS_MAX);
1733 for (int i = 0; i < digitLimit; i++) {
1734 rcsm.sSubAddress.digits[i] = sms.subAddress.digits[i];
1735 }
1736
1737 rcsm.uBearerDataLen = sms.bearerData.size();
1738 digitLimit= MIN((rcsm.uBearerDataLen), RIL_CDMA_SMS_BEARER_DATA_MAX);
1739 for (int i = 0; i < digitLimit; i++) {
1740 rcsm.aBearerData[i] = sms.bearerData[i];
1741 }
1742}
1743
1744Return<void> RadioImpl::sendCdmaSms(int32_t serial, const CdmaSmsMessage& sms) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001745#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001746 RLOGD("sendCdmaSms: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001747#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001748 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_CDMA_SEND_SMS);
1749 if (pRI == NULL) {
1750 return Void();
1751 }
1752
Jack Yu8e732d42017-04-14 00:08:06 -07001753 RIL_CDMA_SMS_Message rcsm = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001754 constructCdmaSms(rcsm, sms);
1755
Amit Mahajanb3a11bb2017-05-15 16:41:44 -07001756 CALL_ONREQUEST(pRI->pCI->requestNumber, &rcsm, sizeof(rcsm), pRI, mSlotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001757 return Void();
1758}
1759
1760Return<void> RadioImpl::acknowledgeLastIncomingCdmaSms(int32_t serial, const CdmaSmsAck& smsAck) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001761#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001762 RLOGD("acknowledgeLastIncomingCdmaSms: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001763#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001764 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_CDMA_SMS_ACKNOWLEDGE);
1765 if (pRI == NULL) {
1766 return Void();
1767 }
1768
Jack Yuf68e0da2017-02-07 14:53:09 -08001769 RIL_CDMA_SMS_Ack rcsa = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001770
1771 rcsa.uErrorClass = (RIL_CDMA_SMS_ErrorClass) smsAck.errorClass;
1772 rcsa.uSMSCauseCode = smsAck.smsCauseCode;
1773
Amit Mahajanb3a11bb2017-05-15 16:41:44 -07001774 CALL_ONREQUEST(pRI->pCI->requestNumber, &rcsa, sizeof(rcsa), pRI, mSlotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001775 return Void();
1776}
1777
1778Return<void> RadioImpl::getGsmBroadcastConfig(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001779#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001780 RLOGD("getGsmBroadcastConfig: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001781#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001782 dispatchVoid(serial, mSlotId, RIL_REQUEST_GSM_GET_BROADCAST_SMS_CONFIG);
1783 return Void();
1784}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001785
1786Return<void> RadioImpl::setGsmBroadcastConfig(int32_t serial,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001787 const hidl_vec<GsmBroadcastSmsConfigInfo>&
1788 configInfo) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001789#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001790 RLOGD("setGsmBroadcastConfig: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001791#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001792 RequestInfo *pRI = android::addRequestToList(serial, mSlotId,
1793 RIL_REQUEST_GSM_SET_BROADCAST_SMS_CONFIG);
1794 if (pRI == NULL) {
1795 return Void();
1796 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001797
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001798 int num = configInfo.size();
1799 RIL_GSM_BroadcastSmsConfigInfo gsmBci[num];
1800 RIL_GSM_BroadcastSmsConfigInfo *gsmBciPtrs[num];
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001801
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001802 for (int i = 0 ; i < num ; i++ ) {
1803 gsmBciPtrs[i] = &gsmBci[i];
1804 gsmBci[i].fromServiceId = configInfo[i].fromServiceId;
1805 gsmBci[i].toServiceId = configInfo[i].toServiceId;
1806 gsmBci[i].fromCodeScheme = configInfo[i].fromCodeScheme;
1807 gsmBci[i].toCodeScheme = configInfo[i].toCodeScheme;
1808 gsmBci[i].selected = BOOL_TO_INT(configInfo[i].selected);
1809 }
1810
Amit Mahajanb3a11bb2017-05-15 16:41:44 -07001811 CALL_ONREQUEST(pRI->pCI->requestNumber, gsmBciPtrs,
1812 num * sizeof(RIL_GSM_BroadcastSmsConfigInfo *), pRI, mSlotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001813 return Void();
1814}
1815
1816Return<void> RadioImpl::setGsmBroadcastActivation(int32_t serial, bool activate) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001817#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001818 RLOGD("setGsmBroadcastActivation: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001819#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001820 dispatchInts(serial, mSlotId, RIL_REQUEST_GSM_SMS_BROADCAST_ACTIVATION,
Sanket Padawe0de29d12017-02-10 13:19:47 -08001821 1, BOOL_TO_INT(!activate));
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001822 return Void();
1823}
1824
1825Return<void> RadioImpl::getCdmaBroadcastConfig(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001826#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001827 RLOGD("getCdmaBroadcastConfig: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001828#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001829 dispatchVoid(serial, mSlotId, RIL_REQUEST_CDMA_GET_BROADCAST_SMS_CONFIG);
1830 return Void();
1831}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001832
1833Return<void> RadioImpl::setCdmaBroadcastConfig(int32_t serial,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001834 const hidl_vec<CdmaBroadcastSmsConfigInfo>&
1835 configInfo) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001836#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001837 RLOGD("setCdmaBroadcastConfig: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001838#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001839 RequestInfo *pRI = android::addRequestToList(serial, mSlotId,
1840 RIL_REQUEST_CDMA_SET_BROADCAST_SMS_CONFIG);
1841 if (pRI == NULL) {
1842 return Void();
1843 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001844
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001845 int num = configInfo.size();
1846 RIL_CDMA_BroadcastSmsConfigInfo cdmaBci[num];
1847 RIL_CDMA_BroadcastSmsConfigInfo *cdmaBciPtrs[num];
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001848
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001849 for (int i = 0 ; i < num ; i++ ) {
1850 cdmaBciPtrs[i] = &cdmaBci[i];
1851 cdmaBci[i].service_category = configInfo[i].serviceCategory;
1852 cdmaBci[i].language = configInfo[i].language;
1853 cdmaBci[i].selected = BOOL_TO_INT(configInfo[i].selected);
1854 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001855
Amit Mahajanb3a11bb2017-05-15 16:41:44 -07001856 CALL_ONREQUEST(pRI->pCI->requestNumber, cdmaBciPtrs,
1857 num * sizeof(RIL_CDMA_BroadcastSmsConfigInfo *), pRI, mSlotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001858 return Void();
1859}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001860
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001861Return<void> RadioImpl::setCdmaBroadcastActivation(int32_t serial, bool activate) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001862#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001863 RLOGD("setCdmaBroadcastActivation: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001864#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001865 dispatchInts(serial, mSlotId, RIL_REQUEST_CDMA_SMS_BROADCAST_ACTIVATION,
Sanket Padawe0de29d12017-02-10 13:19:47 -08001866 1, BOOL_TO_INT(!activate));
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001867 return Void();
1868}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001869
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001870Return<void> RadioImpl::getCDMASubscription(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001871#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001872 RLOGD("getCDMASubscription: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001873#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001874 dispatchVoid(serial, mSlotId, RIL_REQUEST_CDMA_SUBSCRIPTION);
1875 return Void();
1876}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001877
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001878Return<void> RadioImpl::writeSmsToRuim(int32_t serial, const CdmaSmsWriteArgs& cdmaSms) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001879#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001880 RLOGD("writeSmsToRuim: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001881#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001882 RequestInfo *pRI = android::addRequestToList(serial, mSlotId,
1883 RIL_REQUEST_CDMA_WRITE_SMS_TO_RUIM);
1884 if (pRI == NULL) {
1885 return Void();
1886 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001887
Jack Yuf68e0da2017-02-07 14:53:09 -08001888 RIL_CDMA_SMS_WriteArgs rcsw = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001889 rcsw.status = (int) cdmaSms.status;
1890 constructCdmaSms(rcsw.message, cdmaSms.message);
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001891
Amit Mahajanb3a11bb2017-05-15 16:41:44 -07001892 CALL_ONREQUEST(pRI->pCI->requestNumber, &rcsw, sizeof(rcsw), pRI, mSlotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001893 return Void();
1894}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001895
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001896Return<void> RadioImpl::deleteSmsOnRuim(int32_t serial, int32_t index) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001897#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001898 RLOGD("deleteSmsOnRuim: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001899#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001900 dispatchInts(serial, mSlotId, RIL_REQUEST_CDMA_DELETE_SMS_ON_RUIM, 1, index);
1901 return Void();
1902}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001903
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001904Return<void> RadioImpl::getDeviceIdentity(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001905#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001906 RLOGD("getDeviceIdentity: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001907#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001908 dispatchVoid(serial, mSlotId, RIL_REQUEST_DEVICE_IDENTITY);
1909 return Void();
1910}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001911
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001912Return<void> RadioImpl::exitEmergencyCallbackMode(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001913#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001914 RLOGD("exitEmergencyCallbackMode: 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_EXIT_EMERGENCY_CALLBACK_MODE);
1917 return Void();
1918}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001919
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001920Return<void> RadioImpl::getSmscAddress(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001921#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001922 RLOGD("getSmscAddress: 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_GET_SMSC_ADDRESS);
1925 return Void();
1926}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001927
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001928Return<void> RadioImpl::setSmscAddress(int32_t serial, const hidl_string& smsc) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001929#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001930 RLOGD("setSmscAddress: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001931#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001932 dispatchString(serial, mSlotId, RIL_REQUEST_SET_SMSC_ADDRESS,
Scott Randolphc7213312017-04-03 14:06:40 -07001933 smsc.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001934 return Void();
1935}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001936
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001937Return<void> RadioImpl::reportSmsMemoryStatus(int32_t serial, bool available) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001938#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001939 RLOGD("reportSmsMemoryStatus: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001940#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001941 dispatchInts(serial, mSlotId, RIL_REQUEST_REPORT_SMS_MEMORY_STATUS, 1,
1942 BOOL_TO_INT(available));
1943 return Void();
1944}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001945
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001946Return<void> RadioImpl::reportStkServiceIsRunning(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001947#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001948 RLOGD("reportStkServiceIsRunning: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001949#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001950 dispatchVoid(serial, mSlotId, RIL_REQUEST_REPORT_STK_SERVICE_IS_RUNNING);
1951 return Void();
1952}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001953
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001954Return<void> RadioImpl::getCdmaSubscriptionSource(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001955#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001956 RLOGD("getCdmaSubscriptionSource: 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_CDMA_GET_SUBSCRIPTION_SOURCE);
1959 return Void();
1960}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001961
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001962Return<void> RadioImpl::requestIsimAuthentication(int32_t serial, const hidl_string& challenge) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001963#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001964 RLOGD("requestIsimAuthentication: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001965#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001966 dispatchString(serial, mSlotId, RIL_REQUEST_ISIM_AUTHENTICATION,
Scott Randolphc7213312017-04-03 14:06:40 -07001967 challenge.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001968 return Void();
1969}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001970
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001971Return<void> RadioImpl::acknowledgeIncomingGsmSmsWithPdu(int32_t serial, bool success,
1972 const hidl_string& ackPdu) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001973#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001974 RLOGD("acknowledgeIncomingGsmSmsWithPdu: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001975#endif
Ruthwar Kumar Ambeer7c373812017-03-23 17:38:56 +05301976 dispatchStrings(serial, mSlotId, RIL_REQUEST_ACKNOWLEDGE_INCOMING_GSM_SMS_WITH_PDU, false,
Scott Randolphc7213312017-04-03 14:06:40 -07001977 2, success ? "1" : "0", ackPdu.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001978 return Void();
1979}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001980
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001981Return<void> RadioImpl::sendEnvelopeWithStatus(int32_t serial, const hidl_string& contents) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001982#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001983 RLOGD("sendEnvelopeWithStatus: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001984#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001985 dispatchString(serial, mSlotId, RIL_REQUEST_STK_SEND_ENVELOPE_WITH_STATUS,
Scott Randolphc7213312017-04-03 14:06:40 -07001986 contents.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001987 return Void();
1988}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001989
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001990Return<void> RadioImpl::getVoiceRadioTechnology(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001991#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001992 RLOGD("getVoiceRadioTechnology: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001993#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001994 dispatchVoid(serial, mSlotId, RIL_REQUEST_VOICE_RADIO_TECH);
1995 return Void();
1996}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001997
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001998Return<void> RadioImpl::getCellInfoList(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001999#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002000 RLOGD("getCellInfoList: 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_GET_CELL_INFO_LIST);
2003 return Void();
2004}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002005
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002006Return<void> RadioImpl::setCellInfoListRate(int32_t serial, int32_t rate) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002007#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002008 RLOGD("setCellInfoListRate: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002009#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002010 dispatchInts(serial, mSlotId, RIL_REQUEST_SET_UNSOL_CELL_INFO_LIST_RATE, 1, rate);
2011 return Void();
2012}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002013
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002014Return<void> RadioImpl::setInitialAttachApn(int32_t serial, const DataProfileInfo& dataProfileInfo,
Jack Yuffc06452017-02-13 11:21:00 -08002015 bool modemCognitive, bool isRoaming) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002016#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002017 RLOGD("setInitialAttachApn: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002018#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002019 RequestInfo *pRI = android::addRequestToList(serial, mSlotId,
2020 RIL_REQUEST_SET_INITIAL_ATTACH_APN);
2021 if (pRI == NULL) {
2022 return Void();
2023 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002024
Jack Yuffc06452017-02-13 11:21:00 -08002025 if (s_vendorFunctions->version <= 14) {
2026 RIL_InitialAttachApn iaa = {};
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002027
Ruthwar Kumar Ambeer7c373812017-03-23 17:38:56 +05302028 if (!copyHidlStringToRil(&iaa.apn, dataProfileInfo.apn, pRI, true)) {
2029 return Void();
Jack Yuffc06452017-02-13 11:21:00 -08002030 }
2031
2032 const hidl_string &protocol =
2033 (isRoaming ? dataProfileInfo.roamingProtocol : dataProfileInfo.protocol);
2034
2035 if (!copyHidlStringToRil(&iaa.protocol, protocol, pRI)) {
Jack Yu8e732d42017-04-14 00:08:06 -07002036 memsetAndFreeStrings(1, iaa.apn);
Jack Yuffc06452017-02-13 11:21:00 -08002037 return Void();
2038 }
2039 iaa.authtype = (int) dataProfileInfo.authType;
2040 if (!copyHidlStringToRil(&iaa.username, dataProfileInfo.user, pRI)) {
Jack Yu8e732d42017-04-14 00:08:06 -07002041 memsetAndFreeStrings(2, iaa.apn, iaa.protocol);
Jack Yuffc06452017-02-13 11:21:00 -08002042 return Void();
2043 }
2044 if (!copyHidlStringToRil(&iaa.password, dataProfileInfo.password, pRI)) {
Jack Yu8e732d42017-04-14 00:08:06 -07002045 memsetAndFreeStrings(3, iaa.apn, iaa.protocol, iaa.username);
Jack Yuffc06452017-02-13 11:21:00 -08002046 return Void();
2047 }
2048
Amit Mahajanb3a11bb2017-05-15 16:41:44 -07002049 CALL_ONREQUEST(RIL_REQUEST_SET_INITIAL_ATTACH_APN, &iaa, sizeof(iaa), pRI, mSlotId);
Jack Yuffc06452017-02-13 11:21:00 -08002050
2051 memsetAndFreeStrings(4, iaa.apn, iaa.protocol, iaa.username, iaa.password);
2052 } else {
2053 RIL_InitialAttachApn_v15 iaa = {};
2054
Ruthwar Kumar Ambeer7c373812017-03-23 17:38:56 +05302055 if (!copyHidlStringToRil(&iaa.apn, dataProfileInfo.apn, pRI, true)) {
2056 return Void();
Jack Yuffc06452017-02-13 11:21:00 -08002057 }
Sanket Padawe46e9ee32017-06-20 12:40:19 -07002058
Jack Yuffc06452017-02-13 11:21:00 -08002059 if (!copyHidlStringToRil(&iaa.protocol, dataProfileInfo.protocol, pRI)) {
Jack Yu8e732d42017-04-14 00:08:06 -07002060 memsetAndFreeStrings(1, iaa.apn);
Jack Yuffc06452017-02-13 11:21:00 -08002061 return Void();
2062 }
2063 if (!copyHidlStringToRil(&iaa.roamingProtocol, dataProfileInfo.roamingProtocol, pRI)) {
Jack Yu8e732d42017-04-14 00:08:06 -07002064 memsetAndFreeStrings(2, iaa.apn, iaa.protocol);
Jack Yuffc06452017-02-13 11:21:00 -08002065 return Void();
2066 }
2067 iaa.authtype = (int) dataProfileInfo.authType;
2068 if (!copyHidlStringToRil(&iaa.username, dataProfileInfo.user, pRI)) {
Jack Yu8e732d42017-04-14 00:08:06 -07002069 memsetAndFreeStrings(3, iaa.apn, iaa.protocol, iaa.roamingProtocol);
Jack Yuffc06452017-02-13 11:21:00 -08002070 return Void();
2071 }
2072 if (!copyHidlStringToRil(&iaa.password, dataProfileInfo.password, pRI)) {
Jack Yu8e732d42017-04-14 00:08:06 -07002073 memsetAndFreeStrings(4, iaa.apn, iaa.protocol, iaa.roamingProtocol, iaa.username);
Jack Yuffc06452017-02-13 11:21:00 -08002074 return Void();
2075 }
2076 iaa.supportedTypesBitmask = dataProfileInfo.supportedApnTypesBitmap;
2077 iaa.bearerBitmask = dataProfileInfo.bearerBitmap;
2078 iaa.modemCognitive = BOOL_TO_INT(modemCognitive);
2079 iaa.mtu = dataProfileInfo.mtu;
2080
Jack Yuc13645e2017-04-13 20:55:03 -07002081 if (!convertMvnoTypeToString(dataProfileInfo.mvnoType, iaa.mvnoType)) {
Jack Yuffc06452017-02-13 11:21:00 -08002082 sendErrorResponse(pRI, RIL_E_INVALID_ARGUMENTS);
Jack Yu8e732d42017-04-14 00:08:06 -07002083 memsetAndFreeStrings(5, iaa.apn, iaa.protocol, iaa.roamingProtocol, iaa.username,
2084 iaa.password);
Jack Yuffc06452017-02-13 11:21:00 -08002085 return Void();
2086 }
2087
2088 if (!copyHidlStringToRil(&iaa.mvnoMatchData, dataProfileInfo.mvnoMatchData, pRI)) {
Jack Yu8e732d42017-04-14 00:08:06 -07002089 memsetAndFreeStrings(5, iaa.apn, iaa.protocol, iaa.roamingProtocol, iaa.username,
2090 iaa.password);
Jack Yuffc06452017-02-13 11:21:00 -08002091 return Void();
2092 }
2093
Amit Mahajanb3a11bb2017-05-15 16:41:44 -07002094 CALL_ONREQUEST(RIL_REQUEST_SET_INITIAL_ATTACH_APN, &iaa, sizeof(iaa), pRI, mSlotId);
Jack Yuffc06452017-02-13 11:21:00 -08002095
2096 memsetAndFreeStrings(6, iaa.apn, iaa.protocol, iaa.roamingProtocol, iaa.username,
2097 iaa.password, iaa.mvnoMatchData);
2098 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002099
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002100 return Void();
2101}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002102
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002103Return<void> RadioImpl::getImsRegistrationState(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002104#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002105 RLOGD("getImsRegistrationState: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002106#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002107 dispatchVoid(serial, mSlotId, RIL_REQUEST_IMS_REGISTRATION_STATE);
2108 return Void();
2109}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002110
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002111bool dispatchImsGsmSms(const ImsSmsMessage& message, RequestInfo *pRI) {
Jack Yuf68e0da2017-02-07 14:53:09 -08002112 RIL_IMS_SMS_Message rism = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002113 char **pStrings;
2114 int countStrings = 2;
2115 int dataLen = sizeof(char *) * countStrings;
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002116
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002117 rism.tech = RADIO_TECH_3GPP;
2118 rism.retry = BOOL_TO_INT(message.retry);
2119 rism.messageRef = message.messageRef;
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002120
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002121 if (message.gsmMessage.size() != 1) {
2122 RLOGE("dispatchImsGsmSms: Invalid len %s", requestToString(pRI->pCI->requestNumber));
Jack Yuffc06452017-02-13 11:21:00 -08002123 sendErrorResponse(pRI, RIL_E_INVALID_ARGUMENTS);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002124 return false;
2125 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002126
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002127 pStrings = (char **)calloc(countStrings, sizeof(char *));
2128 if (pStrings == NULL) {
2129 RLOGE("dispatchImsGsmSms: Memory allocation failed for request %s",
2130 requestToString(pRI->pCI->requestNumber));
Jack Yuffc06452017-02-13 11:21:00 -08002131 sendErrorResponse(pRI, RIL_E_NO_MEMORY);
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 if (!copyHidlStringToRil(&pStrings[0], message.gsmMessage[0].smscPdu, pRI)) {
2136#ifdef MEMSET_FREED
Jack Yub4295a42017-04-14 12:51:49 -07002137 memset(pStrings, 0, dataLen);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002138#endif
2139 free(pStrings);
2140 return false;
2141 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002142
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002143 if (!copyHidlStringToRil(&pStrings[1], message.gsmMessage[0].pdu, pRI)) {
2144 memsetAndFreeStrings(1, pStrings[0]);
2145#ifdef MEMSET_FREED
Jack Yub4295a42017-04-14 12:51:49 -07002146 memset(pStrings, 0, dataLen);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002147#endif
2148 free(pStrings);
2149 return false;
2150 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002151
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002152 rism.message.gsmMessage = pStrings;
Amit Mahajanb3a11bb2017-05-15 16:41:44 -07002153 CALL_ONREQUEST(pRI->pCI->requestNumber, &rism, sizeof(RIL_RadioTechnologyFamily) +
2154 sizeof(uint8_t) + sizeof(int32_t) + dataLen, pRI, pRI->socket_id);
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002155
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002156 for (int i = 0 ; i < countStrings ; i++) {
2157 memsetAndFreeStrings(1, pStrings[i]);
2158 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002159
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002160#ifdef MEMSET_FREED
Jack Yub4295a42017-04-14 12:51:49 -07002161 memset(pStrings, 0, dataLen);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002162#endif
2163 free(pStrings);
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002164
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002165 return true;
2166}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002167
Sanket Padawec4195802017-06-27 14:53:22 -07002168struct ImsCdmaSms {
2169 RIL_IMS_SMS_Message imsSms;
2170 RIL_CDMA_SMS_Message cdmaSms;
2171};
2172
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002173bool dispatchImsCdmaSms(const ImsSmsMessage& message, RequestInfo *pRI) {
Sanket Padawec4195802017-06-27 14:53:22 -07002174 ImsCdmaSms temp = {};
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002175
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002176 if (message.cdmaMessage.size() != 1) {
2177 RLOGE("dispatchImsCdmaSms: Invalid len %s", requestToString(pRI->pCI->requestNumber));
Jack Yuffc06452017-02-13 11:21:00 -08002178 sendErrorResponse(pRI, RIL_E_INVALID_ARGUMENTS);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002179 return false;
2180 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002181
Sanket Padawec4195802017-06-27 14:53:22 -07002182 temp.imsSms.tech = RADIO_TECH_3GPP2;
2183 temp.imsSms.retry = BOOL_TO_INT(message.retry);
2184 temp.imsSms.messageRef = message.messageRef;
2185 temp.imsSms.message.cdmaMessage = &temp.cdmaSms;
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002186
Sanket Padawec4195802017-06-27 14:53:22 -07002187 constructCdmaSms(temp.cdmaSms, message.cdmaMessage[0]);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002188
Sanket Padawec4195802017-06-27 14:53:22 -07002189 // Vendor code expects payload length to include actual msg payload
2190 // (sizeof(RIL_CDMA_SMS_Message)) instead of (RIL_CDMA_SMS_Message *) + size of other fields in
2191 // RIL_IMS_SMS_Message
2192 int payloadLen = sizeof(RIL_RadioTechnologyFamily) + sizeof(uint8_t) + sizeof(int32_t)
2193 + sizeof(RIL_CDMA_SMS_Message);
2194
2195 CALL_ONREQUEST(pRI->pCI->requestNumber, &temp.imsSms, payloadLen, pRI, pRI->socket_id);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002196
2197 return true;
2198}
2199
2200Return<void> RadioImpl::sendImsSms(int32_t serial, const ImsSmsMessage& message) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002201#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002202 RLOGD("sendImsSms: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002203#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002204 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_IMS_SEND_SMS);
2205 if (pRI == NULL) {
2206 return Void();
2207 }
2208
2209 RIL_RadioTechnologyFamily format = (RIL_RadioTechnologyFamily) message.tech;
2210
2211 if (RADIO_TECH_3GPP == format) {
2212 dispatchImsGsmSms(message, pRI);
2213 } else if (RADIO_TECH_3GPP2 == format) {
2214 dispatchImsCdmaSms(message, pRI);
2215 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08002216 RLOGE("sendImsSms: Invalid radio tech %s",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002217 requestToString(pRI->pCI->requestNumber));
Jack Yuffc06452017-02-13 11:21:00 -08002218 sendErrorResponse(pRI, RIL_E_INVALID_ARGUMENTS);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002219 }
2220 return Void();
2221}
2222
2223Return<void> RadioImpl::iccTransmitApduBasicChannel(int32_t serial, const SimApdu& message) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002224#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002225 RLOGD("iccTransmitApduBasicChannel: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002226#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002227 dispatchIccApdu(serial, mSlotId, RIL_REQUEST_SIM_TRANSMIT_APDU_BASIC, message);
2228 return Void();
2229}
2230
Wileen Chiu410b7562015-11-23 14:25:22 -08002231Return<void> RadioImpl::iccOpenLogicalChannel(int32_t serial, const hidl_string& aid, int32_t p2) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002232#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002233 RLOGD("iccOpenLogicalChannel: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002234#endif
Wileen Chiu410b7562015-11-23 14:25:22 -08002235 if (s_vendorFunctions->version < 15) {
2236 dispatchString(serial, mSlotId, RIL_REQUEST_SIM_OPEN_CHANNEL, aid.c_str());
2237 } else {
2238 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_SIM_OPEN_CHANNEL);
2239 if (pRI == NULL) {
2240 return Void();
2241 }
2242
Jack Yu8e732d42017-04-14 00:08:06 -07002243 RIL_OpenChannelParams params = {};
Wileen Chiu410b7562015-11-23 14:25:22 -08002244
2245 params.p2 = p2;
2246
2247 if (!copyHidlStringToRil(&params.aidPtr, aid, pRI)) {
2248 return Void();
2249 }
2250
Amit Mahajanb3a11bb2017-05-15 16:41:44 -07002251 CALL_ONREQUEST(pRI->pCI->requestNumber, &params, sizeof(params), pRI, mSlotId);
Wileen Chiu410b7562015-11-23 14:25:22 -08002252
2253 memsetAndFreeStrings(1, params.aidPtr);
2254 }
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002255 return Void();
2256}
2257
2258Return<void> RadioImpl::iccCloseLogicalChannel(int32_t serial, int32_t channelId) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002259#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002260 RLOGD("iccCloseLogicalChannel: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002261#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002262 dispatchInts(serial, mSlotId, RIL_REQUEST_SIM_CLOSE_CHANNEL, 1, channelId);
2263 return Void();
2264}
2265
2266Return<void> RadioImpl::iccTransmitApduLogicalChannel(int32_t serial, const SimApdu& message) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002267#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002268 RLOGD("iccTransmitApduLogicalChannel: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002269#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002270 dispatchIccApdu(serial, mSlotId, RIL_REQUEST_SIM_TRANSMIT_APDU_CHANNEL, message);
2271 return Void();
2272}
2273
2274Return<void> RadioImpl::nvReadItem(int32_t serial, NvItem itemId) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002275#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002276 RLOGD("nvReadItem: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002277#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002278 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_NV_READ_ITEM);
2279 if (pRI == NULL) {
2280 return Void();
2281 }
2282
Jack Yu8e732d42017-04-14 00:08:06 -07002283 RIL_NV_ReadItem nvri = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002284 nvri.itemID = (RIL_NV_Item) itemId;
2285
Amit Mahajanb3a11bb2017-05-15 16:41:44 -07002286 CALL_ONREQUEST(pRI->pCI->requestNumber, &nvri, sizeof(nvri), pRI, mSlotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002287 return Void();
2288}
2289
2290Return<void> RadioImpl::nvWriteItem(int32_t serial, const NvWriteItem& item) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002291#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002292 RLOGD("nvWriteItem: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002293#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002294 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_NV_WRITE_ITEM);
2295 if (pRI == NULL) {
2296 return Void();
2297 }
2298
Jack Yu8e732d42017-04-14 00:08:06 -07002299 RIL_NV_WriteItem nvwi = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002300
2301 nvwi.itemID = (RIL_NV_Item) item.itemId;
2302
2303 if (!copyHidlStringToRil(&nvwi.value, item.value, pRI)) {
2304 return Void();
2305 }
2306
Amit Mahajanb3a11bb2017-05-15 16:41:44 -07002307 CALL_ONREQUEST(pRI->pCI->requestNumber, &nvwi, sizeof(nvwi), pRI, mSlotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002308
2309 memsetAndFreeStrings(1, nvwi.value);
2310 return Void();
2311}
2312
2313Return<void> RadioImpl::nvWriteCdmaPrl(int32_t serial, const hidl_vec<uint8_t>& prl) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002314#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002315 RLOGD("nvWriteCdmaPrl: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002316#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002317 dispatchRaw(serial, mSlotId, RIL_REQUEST_NV_WRITE_CDMA_PRL, prl);
2318 return Void();
2319}
2320
2321Return<void> RadioImpl::nvResetConfig(int32_t serial, ResetNvType resetType) {
Jayachandran C32763f02017-04-30 10:21:14 -07002322 int rilResetType = -1;
Jayachandran C572f2f42017-03-25 14:30:13 -07002323#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002324 RLOGD("nvResetConfig: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002325#endif
Jayachandran C32763f02017-04-30 10:21:14 -07002326 /* Convert ResetNvType to RIL.h values
2327 * RIL_REQUEST_NV_RESET_CONFIG
2328 * 1 - reload all NV items
2329 * 2 - erase NV reset (SCRTN)
2330 * 3 - factory reset (RTN)
2331 */
2332 switch(resetType) {
2333 case ResetNvType::RELOAD:
2334 rilResetType = 1;
2335 break;
2336 case ResetNvType::ERASE:
2337 rilResetType = 2;
2338 break;
2339 case ResetNvType::FACTORY_RESET:
2340 rilResetType = 3;
2341 break;
2342 }
2343 dispatchInts(serial, mSlotId, RIL_REQUEST_NV_RESET_CONFIG, 1, rilResetType);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002344 return Void();
2345}
2346
2347Return<void> RadioImpl::setUiccSubscription(int32_t serial, const SelectUiccSub& uiccSub) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002348#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002349 RLOGD("setUiccSubscription: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002350#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002351 RequestInfo *pRI = android::addRequestToList(serial, mSlotId,
2352 RIL_REQUEST_SET_UICC_SUBSCRIPTION);
2353 if (pRI == NULL) {
2354 return Void();
2355 }
2356
Jack Yuf68e0da2017-02-07 14:53:09 -08002357 RIL_SelectUiccSub rilUiccSub = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002358
2359 rilUiccSub.slot = uiccSub.slot;
2360 rilUiccSub.app_index = uiccSub.appIndex;
2361 rilUiccSub.sub_type = (RIL_SubscriptionType) uiccSub.subType;
2362 rilUiccSub.act_status = (RIL_UiccSubActStatus) uiccSub.actStatus;
2363
Amit Mahajanb3a11bb2017-05-15 16:41:44 -07002364 CALL_ONREQUEST(pRI->pCI->requestNumber, &rilUiccSub, sizeof(rilUiccSub), pRI, mSlotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002365 return Void();
2366}
2367
2368Return<void> RadioImpl::setDataAllowed(int32_t serial, bool allow) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002369#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002370 RLOGD("setDataAllowed: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002371#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002372 dispatchInts(serial, mSlotId, RIL_REQUEST_ALLOW_DATA, 1, BOOL_TO_INT(allow));
2373 return Void();
2374}
2375
2376Return<void> RadioImpl::getHardwareConfig(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002377#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002378 RLOGD("getHardwareConfig: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002379#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002380 dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_HARDWARE_CONFIG);
2381 return Void();
2382}
2383
2384Return<void> RadioImpl::requestIccSimAuthentication(int32_t serial, int32_t authContext,
2385 const hidl_string& authData, const hidl_string& aid) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002386#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002387 RLOGD("requestIccSimAuthentication: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002388#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002389 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_SIM_AUTHENTICATION);
2390 if (pRI == NULL) {
2391 return Void();
2392 }
2393
Jack Yu8e732d42017-04-14 00:08:06 -07002394 RIL_SimAuthentication pf = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002395
2396 pf.authContext = authContext;
2397
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002398 if (!copyHidlStringToRil(&pf.authData, authData, pRI)) {
2399 return Void();
2400 }
2401
2402 if (!copyHidlStringToRil(&pf.aid, aid, pRI)) {
2403 memsetAndFreeStrings(1, pf.authData);
2404 return Void();
2405 }
2406
Amit Mahajanb3a11bb2017-05-15 16:41:44 -07002407 CALL_ONREQUEST(pRI->pCI->requestNumber, &pf, sizeof(pf), pRI, mSlotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002408
2409 memsetAndFreeStrings(2, pf.authData, pf.aid);
2410 return Void();
2411}
2412
2413/**
Jack Yuffc06452017-02-13 11:21:00 -08002414 * @param numProfiles number of data profile
2415 * @param dataProfiles the pointer to the actual data profiles. The acceptable type is
2416 RIL_DataProfileInfo or RIL_DataProfileInfo_v15.
2417 * @param dataProfilePtrs the pointer to the pointers that point to each data profile structure
2418 * @param numfields number of string-type member in the data profile structure
2419 * @param ... the variadic parameters are pointers to each string-type member
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002420 **/
Jack Yuffc06452017-02-13 11:21:00 -08002421template <typename T>
2422void freeSetDataProfileData(int numProfiles, T *dataProfiles, T **dataProfilePtrs,
2423 int numfields, ...) {
2424 va_list args;
2425 va_start(args, numfields);
2426
2427 // Iterate through each string-type field that need to be free.
2428 for (int i = 0; i < numfields; i++) {
2429 // Iterate through each data profile and free that specific string-type field.
2430 // The type 'char *T::*' is a type of pointer to a 'char *' member inside T structure.
2431 char *T::*ptr = va_arg(args, char *T::*);
2432 for (int j = 0; j < numProfiles; j++) {
2433 memsetAndFreeStrings(1, dataProfiles[j].*ptr);
2434 }
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002435 }
2436
Jack Yuffc06452017-02-13 11:21:00 -08002437 va_end(args);
2438
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002439#ifdef MEMSET_FREED
Jack Yuffc06452017-02-13 11:21:00 -08002440 memset(dataProfiles, 0, numProfiles * sizeof(T));
2441 memset(dataProfilePtrs, 0, numProfiles * sizeof(T *));
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002442#endif
2443 free(dataProfiles);
2444 free(dataProfilePtrs);
2445}
2446
Jack Yuffc06452017-02-13 11:21:00 -08002447Return<void> RadioImpl::setDataProfile(int32_t serial, const hidl_vec<DataProfileInfo>& profiles,
2448 bool isRoaming) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002449#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002450 RLOGD("setDataProfile: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002451#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002452 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_SET_DATA_PROFILE);
2453 if (pRI == NULL) {
2454 return Void();
2455 }
2456
Jack Yuffc06452017-02-13 11:21:00 -08002457 size_t num = profiles.size();
2458 bool success = false;
2459
2460 if (s_vendorFunctions->version <= 14) {
2461
2462 RIL_DataProfileInfo *dataProfiles =
2463 (RIL_DataProfileInfo *) calloc(num, sizeof(RIL_DataProfileInfo));
2464
2465 if (dataProfiles == NULL) {
2466 RLOGE("Memory allocation failed for request %s",
2467 requestToString(pRI->pCI->requestNumber));
2468 sendErrorResponse(pRI, RIL_E_NO_MEMORY);
2469 return Void();
2470 }
2471
2472 RIL_DataProfileInfo **dataProfilePtrs =
2473 (RIL_DataProfileInfo **) calloc(num, sizeof(RIL_DataProfileInfo *));
2474 if (dataProfilePtrs == NULL) {
2475 RLOGE("Memory allocation failed for request %s",
2476 requestToString(pRI->pCI->requestNumber));
2477 free(dataProfiles);
2478 sendErrorResponse(pRI, RIL_E_NO_MEMORY);
2479 return Void();
2480 }
2481
2482 for (size_t i = 0; i < num; i++) {
2483 dataProfilePtrs[i] = &dataProfiles[i];
2484
Ruthwar Kumar Ambeer7c373812017-03-23 17:38:56 +05302485 success = copyHidlStringToRil(&dataProfiles[i].apn, profiles[i].apn, pRI, true);
Jack Yuffc06452017-02-13 11:21:00 -08002486
2487 const hidl_string &protocol =
2488 (isRoaming ? profiles[i].roamingProtocol : profiles[i].protocol);
2489
Ruthwar Kumar Ambeer7c373812017-03-23 17:38:56 +05302490 if (success && !copyHidlStringToRil(&dataProfiles[i].protocol, protocol, pRI, true)) {
Jack Yuffc06452017-02-13 11:21:00 -08002491 success = false;
2492 }
2493
Ruthwar Kumar Ambeer7c373812017-03-23 17:38:56 +05302494 if (success && !copyHidlStringToRil(&dataProfiles[i].user, profiles[i].user, pRI,
2495 true)) {
Jack Yuffc06452017-02-13 11:21:00 -08002496 success = false;
2497 }
2498 if (success && !copyHidlStringToRil(&dataProfiles[i].password, profiles[i].password,
Ruthwar Kumar Ambeer7c373812017-03-23 17:38:56 +05302499 pRI, true)) {
Jack Yuffc06452017-02-13 11:21:00 -08002500 success = false;
2501 }
2502
2503 if (!success) {
2504 freeSetDataProfileData(num, dataProfiles, dataProfilePtrs, 4,
2505 &RIL_DataProfileInfo::apn, &RIL_DataProfileInfo::protocol,
2506 &RIL_DataProfileInfo::user, &RIL_DataProfileInfo::password);
2507 return Void();
2508 }
2509
2510 dataProfiles[i].profileId = (RIL_DataProfile) profiles[i].profileId;
2511 dataProfiles[i].authType = (int) profiles[i].authType;
2512 dataProfiles[i].type = (int) profiles[i].type;
2513 dataProfiles[i].maxConnsTime = profiles[i].maxConnsTime;
2514 dataProfiles[i].maxConns = profiles[i].maxConns;
2515 dataProfiles[i].waitTime = profiles[i].waitTime;
2516 dataProfiles[i].enabled = BOOL_TO_INT(profiles[i].enabled);
2517 }
2518
Amit Mahajanb3a11bb2017-05-15 16:41:44 -07002519 CALL_ONREQUEST(RIL_REQUEST_SET_DATA_PROFILE, dataProfilePtrs,
2520 num * sizeof(RIL_DataProfileInfo *), pRI, mSlotId);
Jack Yuffc06452017-02-13 11:21:00 -08002521
2522 freeSetDataProfileData(num, dataProfiles, dataProfilePtrs, 4,
2523 &RIL_DataProfileInfo::apn, &RIL_DataProfileInfo::protocol,
2524 &RIL_DataProfileInfo::user, &RIL_DataProfileInfo::password);
2525 } else {
2526 RIL_DataProfileInfo_v15 *dataProfiles =
2527 (RIL_DataProfileInfo_v15 *) calloc(num, sizeof(RIL_DataProfileInfo_v15));
2528
2529 if (dataProfiles == NULL) {
2530 RLOGE("Memory allocation failed for request %s",
2531 requestToString(pRI->pCI->requestNumber));
2532 sendErrorResponse(pRI, RIL_E_NO_MEMORY);
2533 return Void();
2534 }
2535
2536 RIL_DataProfileInfo_v15 **dataProfilePtrs =
2537 (RIL_DataProfileInfo_v15 **) calloc(num, sizeof(RIL_DataProfileInfo_v15 *));
2538 if (dataProfilePtrs == NULL) {
2539 RLOGE("Memory allocation failed for request %s",
2540 requestToString(pRI->pCI->requestNumber));
2541 free(dataProfiles);
2542 sendErrorResponse(pRI, RIL_E_NO_MEMORY);
2543 return Void();
2544 }
2545
2546 for (size_t i = 0; i < num; i++) {
2547 dataProfilePtrs[i] = &dataProfiles[i];
2548
Ruthwar Kumar Ambeer7c373812017-03-23 17:38:56 +05302549 success = copyHidlStringToRil(&dataProfiles[i].apn, profiles[i].apn, pRI, true);
Jack Yuffc06452017-02-13 11:21:00 -08002550 if (success && !copyHidlStringToRil(&dataProfiles[i].protocol, profiles[i].protocol,
2551 pRI)) {
2552 success = false;
2553 }
2554 if (success && !copyHidlStringToRil(&dataProfiles[i].roamingProtocol,
Ruthwar Kumar Ambeer7c373812017-03-23 17:38:56 +05302555 profiles[i].roamingProtocol, pRI, true)) {
Jack Yuffc06452017-02-13 11:21:00 -08002556 success = false;
2557 }
Ruthwar Kumar Ambeer7c373812017-03-23 17:38:56 +05302558 if (success && !copyHidlStringToRil(&dataProfiles[i].user, profiles[i].user, pRI,
2559 true)) {
Jack Yuffc06452017-02-13 11:21:00 -08002560 success = false;
2561 }
2562 if (success && !copyHidlStringToRil(&dataProfiles[i].password, profiles[i].password,
Ruthwar Kumar Ambeer7c373812017-03-23 17:38:56 +05302563 pRI, true)) {
Jack Yuffc06452017-02-13 11:21:00 -08002564 success = false;
2565 }
Jack Yuffc06452017-02-13 11:21:00 -08002566 if (success && !copyHidlStringToRil(&dataProfiles[i].mvnoMatchData,
Ruthwar Kumar Ambeer7c373812017-03-23 17:38:56 +05302567 profiles[i].mvnoMatchData, pRI, true)) {
Jack Yuffc06452017-02-13 11:21:00 -08002568 success = false;
2569 }
2570
Jack Yuc13645e2017-04-13 20:55:03 -07002571 if (success && !convertMvnoTypeToString(profiles[i].mvnoType,
2572 dataProfiles[i].mvnoType)) {
2573 sendErrorResponse(pRI, RIL_E_INVALID_ARGUMENTS);
2574 success = false;
Jack Yuffc06452017-02-13 11:21:00 -08002575 }
2576
2577 if (!success) {
2578 freeSetDataProfileData(num, dataProfiles, dataProfilePtrs, 6,
2579 &RIL_DataProfileInfo_v15::apn, &RIL_DataProfileInfo_v15::protocol,
2580 &RIL_DataProfileInfo_v15::roamingProtocol, &RIL_DataProfileInfo_v15::user,
2581 &RIL_DataProfileInfo_v15::password, &RIL_DataProfileInfo_v15::mvnoMatchData);
2582 return Void();
2583 }
2584
2585 dataProfiles[i].profileId = (RIL_DataProfile) profiles[i].profileId;
2586 dataProfiles[i].authType = (int) profiles[i].authType;
2587 dataProfiles[i].type = (int) profiles[i].type;
2588 dataProfiles[i].maxConnsTime = profiles[i].maxConnsTime;
2589 dataProfiles[i].maxConns = profiles[i].maxConns;
2590 dataProfiles[i].waitTime = profiles[i].waitTime;
2591 dataProfiles[i].enabled = BOOL_TO_INT(profiles[i].enabled);
2592 dataProfiles[i].supportedTypesBitmask = profiles[i].supportedApnTypesBitmap;
2593 dataProfiles[i].bearerBitmask = profiles[i].bearerBitmap;
2594 dataProfiles[i].mtu = profiles[i].mtu;
2595 }
2596
Amit Mahajanb3a11bb2017-05-15 16:41:44 -07002597 CALL_ONREQUEST(RIL_REQUEST_SET_DATA_PROFILE, dataProfilePtrs,
2598 num * sizeof(RIL_DataProfileInfo_v15 *), pRI, mSlotId);
Jack Yuffc06452017-02-13 11:21:00 -08002599
2600 freeSetDataProfileData(num, dataProfiles, dataProfilePtrs, 6,
2601 &RIL_DataProfileInfo_v15::apn, &RIL_DataProfileInfo_v15::protocol,
2602 &RIL_DataProfileInfo_v15::roamingProtocol, &RIL_DataProfileInfo_v15::user,
2603 &RIL_DataProfileInfo_v15::password, &RIL_DataProfileInfo_v15::mvnoMatchData);
2604 }
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002605
2606 return Void();
2607}
2608
2609Return<void> RadioImpl::requestShutdown(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002610#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002611 RLOGD("requestShutdown: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002612#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002613 dispatchVoid(serial, mSlotId, RIL_REQUEST_SHUTDOWN);
2614 return Void();
2615}
2616
2617Return<void> RadioImpl::getRadioCapability(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002618#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002619 RLOGD("getRadioCapability: 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_GET_RADIO_CAPABILITY);
2622 return Void();
2623}
2624
2625Return<void> RadioImpl::setRadioCapability(int32_t serial, const RadioCapability& rc) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002626#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002627 RLOGD("setRadioCapability: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002628#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002629 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_SET_RADIO_CAPABILITY);
2630 if (pRI == NULL) {
2631 return Void();
2632 }
2633
Jack Yu8e732d42017-04-14 00:08:06 -07002634 RIL_RadioCapability rilRc = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002635
2636 // TODO : set rilRc.version using HIDL version ?
2637 rilRc.session = rc.session;
2638 rilRc.phase = (int) rc.phase;
2639 rilRc.rat = (int) rc.raf;
2640 rilRc.status = (int) rc.status;
Ashit Sood169fc262018-09-06 14:10:34 -07002641 strlcpy(rilRc.logicalModemUuid, rc.logicalModemUuid.c_str(), sizeof(rilRc.logicalModemUuid));
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002642
Amit Mahajanb3a11bb2017-05-15 16:41:44 -07002643 CALL_ONREQUEST(pRI->pCI->requestNumber, &rilRc, sizeof(rilRc), pRI, mSlotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002644
2645 return Void();
2646}
2647
2648Return<void> RadioImpl::startLceService(int32_t serial, int32_t reportInterval, bool pullMode) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002649#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002650 RLOGD("startLceService: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002651#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002652 dispatchInts(serial, mSlotId, RIL_REQUEST_START_LCE, 2, reportInterval,
2653 BOOL_TO_INT(pullMode));
2654 return Void();
2655}
2656
2657Return<void> RadioImpl::stopLceService(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002658#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002659 RLOGD("stopLceService: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002660#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002661 dispatchVoid(serial, mSlotId, RIL_REQUEST_STOP_LCE);
2662 return Void();
2663}
2664
2665Return<void> RadioImpl::pullLceData(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002666#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002667 RLOGD("pullLceData: 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_PULL_LCEDATA);
2670 return Void();
2671}
2672
2673Return<void> RadioImpl::getModemActivityInfo(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002674#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002675 RLOGD("getModemActivityInfo: 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_GET_ACTIVITY_INFO);
2678 return Void();
2679}
2680
2681Return<void> RadioImpl::setAllowedCarriers(int32_t serial, bool allAllowed,
2682 const CarrierRestrictions& carriers) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002683#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002684 RLOGD("setAllowedCarriers: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002685#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002686 RequestInfo *pRI = android::addRequestToList(serial, mSlotId,
2687 RIL_REQUEST_SET_CARRIER_RESTRICTIONS);
2688 if (pRI == NULL) {
2689 return Void();
2690 }
2691
Jack Yuf68e0da2017-02-07 14:53:09 -08002692 RIL_CarrierRestrictions cr = {};
Jack Yu11ab4042017-02-21 17:08:01 -08002693 RIL_Carrier *allowedCarriers = NULL;
2694 RIL_Carrier *excludedCarriers = NULL;
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002695
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002696 cr.len_allowed_carriers = carriers.allowedCarriers.size();
2697 allowedCarriers = (RIL_Carrier *)calloc(cr.len_allowed_carriers, sizeof(RIL_Carrier));
2698 if (allowedCarriers == NULL) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08002699 RLOGE("setAllowedCarriers: Memory allocation failed for request %s",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002700 requestToString(pRI->pCI->requestNumber));
Jack Yuffc06452017-02-13 11:21:00 -08002701 sendErrorResponse(pRI, RIL_E_NO_MEMORY);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002702 return Void();
2703 }
2704 cr.allowed_carriers = allowedCarriers;
2705
2706 cr.len_excluded_carriers = carriers.excludedCarriers.size();
2707 excludedCarriers = (RIL_Carrier *)calloc(cr.len_excluded_carriers, sizeof(RIL_Carrier));
2708 if (excludedCarriers == NULL) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08002709 RLOGE("setAllowedCarriers: Memory allocation failed for request %s",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002710 requestToString(pRI->pCI->requestNumber));
Jack Yuffc06452017-02-13 11:21:00 -08002711 sendErrorResponse(pRI, RIL_E_NO_MEMORY);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002712#ifdef MEMSET_FREED
2713 memset(allowedCarriers, 0, cr.len_allowed_carriers * sizeof(RIL_Carrier));
2714#endif
2715 free(allowedCarriers);
2716 return Void();
2717 }
2718 cr.excluded_carriers = excludedCarriers;
2719
2720 for (int i = 0; i < cr.len_allowed_carriers; i++) {
Scott Randolphc7213312017-04-03 14:06:40 -07002721 allowedCarriers[i].mcc = carriers.allowedCarriers[i].mcc.c_str();
2722 allowedCarriers[i].mnc = carriers.allowedCarriers[i].mnc.c_str();
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002723 allowedCarriers[i].match_type = (RIL_CarrierMatchType) carriers.allowedCarriers[i].matchType;
Scott Randolphc7213312017-04-03 14:06:40 -07002724 allowedCarriers[i].match_data = carriers.allowedCarriers[i].matchData.c_str();
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002725 }
2726
Amit Mahajan3f510f62017-03-01 10:26:58 -08002727 for (int i = 0; i < cr.len_excluded_carriers; i++) {
Scott Randolphc7213312017-04-03 14:06:40 -07002728 excludedCarriers[i].mcc = carriers.excludedCarriers[i].mcc.c_str();
2729 excludedCarriers[i].mnc = carriers.excludedCarriers[i].mnc.c_str();
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002730 excludedCarriers[i].match_type =
2731 (RIL_CarrierMatchType) carriers.excludedCarriers[i].matchType;
Scott Randolphc7213312017-04-03 14:06:40 -07002732 excludedCarriers[i].match_data = carriers.excludedCarriers[i].matchData.c_str();
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002733 }
2734
Amit Mahajanb3a11bb2017-05-15 16:41:44 -07002735 CALL_ONREQUEST(pRI->pCI->requestNumber, &cr, sizeof(RIL_CarrierRestrictions), pRI, mSlotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002736
2737#ifdef MEMSET_FREED
2738 memset(allowedCarriers, 0, cr.len_allowed_carriers * sizeof(RIL_Carrier));
2739 memset(excludedCarriers, 0, cr.len_excluded_carriers * sizeof(RIL_Carrier));
2740#endif
2741 free(allowedCarriers);
2742 free(excludedCarriers);
2743 return Void();
2744}
2745
2746Return<void> RadioImpl::getAllowedCarriers(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002747#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002748 RLOGD("getAllowedCarriers: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002749#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002750 dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_CARRIER_RESTRICTIONS);
2751 return Void();
2752}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002753
Jack Yu11ab4042017-02-21 17:08:01 -08002754Return<void> RadioImpl::sendDeviceState(int32_t serial, DeviceStateType deviceStateType,
2755 bool state) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002756#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002757 RLOGD("sendDeviceState: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002758#endif
Jack Yu11ab4042017-02-21 17:08:01 -08002759 if (s_vendorFunctions->version < 15) {
2760 if (deviceStateType == DeviceStateType::LOW_DATA_EXPECTED) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08002761 RLOGD("sendDeviceState: calling screen state %d", BOOL_TO_INT(!state));
Jack Yu11ab4042017-02-21 17:08:01 -08002762 dispatchInts(serial, mSlotId, RIL_REQUEST_SCREEN_STATE, 1, BOOL_TO_INT(!state));
2763 } else {
2764 RequestInfo *pRI = android::addRequestToList(serial, mSlotId,
2765 RIL_REQUEST_SEND_DEVICE_STATE);
2766 sendErrorResponse(pRI, RIL_E_REQUEST_NOT_SUPPORTED);
2767 }
2768 return Void();
2769 }
2770 dispatchInts(serial, mSlotId, RIL_REQUEST_SEND_DEVICE_STATE, 2, (int) deviceStateType,
2771 BOOL_TO_INT(state));
2772 return Void();
2773}
2774
2775Return<void> RadioImpl::setIndicationFilter(int32_t serial, int32_t indicationFilter) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002776#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002777 RLOGD("setIndicationFilter: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002778#endif
Jack Yu11ab4042017-02-21 17:08:01 -08002779 if (s_vendorFunctions->version < 15) {
2780 RequestInfo *pRI = android::addRequestToList(serial, mSlotId,
2781 RIL_REQUEST_SET_UNSOLICITED_RESPONSE_FILTER);
2782 sendErrorResponse(pRI, RIL_E_REQUEST_NOT_SUPPORTED);
2783 return Void();
2784 }
2785 dispatchInts(serial, mSlotId, RIL_REQUEST_SET_UNSOLICITED_RESPONSE_FILTER, 1, indicationFilter);
2786 return Void();
2787}
2788
Wileen Chiu718c0bf2017-01-04 11:37:19 -08002789Return<void> RadioImpl::setSimCardPower(int32_t serial, bool powerUp) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002790#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002791 RLOGD("setSimCardPower: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002792#endif
Wileen Chiu718c0bf2017-01-04 11:37:19 -08002793 dispatchInts(serial, mSlotId, RIL_REQUEST_SET_SIM_CARD_POWER, 1, BOOL_TO_INT(powerUp));
2794 return Void();
2795}
2796
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07002797Return<void> RadioImpl::setSimCardPower_1_1(int32_t serial, const V1_1::CardPowerState state) {
Grace Chen08eb6542017-03-23 18:39:48 -07002798#if VDBG
2799 RLOGD("setSimCardPower_1_1: serial %d state %d", serial, state);
2800#endif
2801 dispatchInts(serial, mSlotId, RIL_REQUEST_SET_SIM_CARD_POWER, 1, state);
2802 return Void();
2803}
2804
Nathan Harold6a8809d2017-07-07 19:28:58 -07002805Return<void> RadioImpl::setCarrierInfoForImsiEncryption(int32_t serial,
2806 const V1_1::ImsiEncryptionInfo& data) {
2807#if VDBG
2808 RLOGD("setCarrierInfoForImsiEncryption: serial %d", serial);
2809#endif
2810 RequestInfo *pRI = android::addRequestToList(
2811 serial, mSlotId, RIL_REQUEST_SET_CARRIER_INFO_IMSI_ENCRYPTION);
2812 if (pRI == NULL) {
2813 return Void();
2814 }
2815
2816 RIL_CarrierInfoForImsiEncryption imsiEncryption = {};
2817
2818 if (!copyHidlStringToRil(&imsiEncryption.mnc, data.mnc, pRI)) {
2819 return Void();
2820 }
2821 if (!copyHidlStringToRil(&imsiEncryption.mcc, data.mcc, pRI)) {
2822 memsetAndFreeStrings(1, imsiEncryption.mnc);
2823 return Void();
2824 }
2825 if (!copyHidlStringToRil(&imsiEncryption.keyIdentifier, data.keyIdentifier, pRI)) {
2826 memsetAndFreeStrings(2, imsiEncryption.mnc, imsiEncryption.mcc);
2827 return Void();
2828 }
Youngrak Leee6f16f22017-12-03 10:50:37 -08002829 imsiEncryption.carrierKeyLength = data.carrierKey.size();
2830 imsiEncryption.carrierKey = new uint8_t[imsiEncryption.carrierKeyLength];
2831 memcpy(imsiEncryption.carrierKey, data.carrierKey.data(), imsiEncryption.carrierKeyLength);
Nathan Harold6a8809d2017-07-07 19:28:58 -07002832 imsiEncryption.expirationTime = data.expirationTime;
2833 CALL_ONREQUEST(pRI->pCI->requestNumber, &imsiEncryption,
2834 sizeof(RIL_CarrierInfoForImsiEncryption), pRI, mSlotId);
2835 delete(imsiEncryption.carrierKey);
2836 return Void();
2837}
2838
2839Return<void> RadioImpl::startKeepalive(int32_t serial, const V1_1::KeepaliveRequest& keepalive) {
2840#if VDBG
2841 RLOGD("%s(): %d", __FUNCTION__, serial);
2842#endif
2843 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_START_KEEPALIVE);
2844 if (pRI == NULL) {
2845 return Void();
2846 }
2847
2848 RIL_KeepaliveRequest kaReq = {};
2849
2850 kaReq.type = static_cast<RIL_KeepaliveType>(keepalive.type);
2851 switch(kaReq.type) {
2852 case NATT_IPV4:
2853 if (keepalive.sourceAddress.size() != 4 ||
2854 keepalive.destinationAddress.size() != 4) {
2855 RLOGE("Invalid address for keepalive!");
2856 sendErrorResponse(pRI, RIL_E_INVALID_ARGUMENTS);
2857 return Void();
2858 }
2859 break;
2860 case NATT_IPV6:
2861 if (keepalive.sourceAddress.size() != 16 ||
2862 keepalive.destinationAddress.size() != 16) {
2863 RLOGE("Invalid address for keepalive!");
2864 sendErrorResponse(pRI, RIL_E_INVALID_ARGUMENTS);
2865 return Void();
2866 }
2867 break;
2868 default:
2869 RLOGE("Unknown packet keepalive type!");
2870 sendErrorResponse(pRI, RIL_E_INVALID_ARGUMENTS);
2871 return Void();
2872 }
2873
2874 ::memcpy(kaReq.sourceAddress, keepalive.sourceAddress.data(), keepalive.sourceAddress.size());
2875 kaReq.sourcePort = keepalive.sourcePort;
2876
2877 ::memcpy(kaReq.destinationAddress,
2878 keepalive.destinationAddress.data(), keepalive.destinationAddress.size());
2879 kaReq.destinationPort = keepalive.destinationPort;
2880
2881 kaReq.maxKeepaliveIntervalMillis = keepalive.maxKeepaliveIntervalMillis;
2882 kaReq.cid = keepalive.cid; // This is the context ID of the data call
2883
2884 CALL_ONREQUEST(pRI->pCI->requestNumber, &kaReq, sizeof(RIL_KeepaliveRequest), pRI, mSlotId);
2885 return Void();
2886}
2887
2888Return<void> RadioImpl::stopKeepalive(int32_t serial, int32_t sessionHandle) {
2889#if VDBG
2890 RLOGD("%s(): %d", __FUNCTION__, serial);
2891#endif
2892 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_STOP_KEEPALIVE);
2893 if (pRI == NULL) {
2894 return Void();
2895 }
2896
2897 CALL_ONREQUEST(pRI->pCI->requestNumber, &sessionHandle, sizeof(uint32_t), pRI, mSlotId);
2898 return Void();
2899}
2900
Sanket Padawef220dc52017-01-02 23:46:00 -08002901Return<void> RadioImpl::responseAcknowledgement() {
2902 android::releaseWakeLock();
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002903 return Void();
Sanket Padawef220dc52017-01-02 23:46:00 -08002904}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002905
Amit Mahajan439da362017-02-13 17:43:04 -08002906Return<void> OemHookImpl::setResponseFunctions(
2907 const ::android::sp<IOemHookResponse>& oemHookResponseParam,
2908 const ::android::sp<IOemHookIndication>& oemHookIndicationParam) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002909#if VDBG
Amit Mahajan439da362017-02-13 17:43:04 -08002910 RLOGD("OemHookImpl::setResponseFunctions");
Jayachandran C572f2f42017-03-25 14:30:13 -07002911#endif
Amit Mahajan439da362017-02-13 17:43:04 -08002912
2913 pthread_rwlock_t *radioServiceRwlockPtr = radio::getRadioServiceRwlock(mSlotId);
2914 int ret = pthread_rwlock_wrlock(radioServiceRwlockPtr);
2915 assert(ret == 0);
2916
2917 mOemHookResponse = oemHookResponseParam;
2918 mOemHookIndication = oemHookIndicationParam;
Amit Mahajand423d192017-03-16 17:04:01 -07002919 mCounterOemHook[mSlotId]++;
Amit Mahajan439da362017-02-13 17:43:04 -08002920
2921 ret = pthread_rwlock_unlock(radioServiceRwlockPtr);
2922 assert(ret == 0);
2923
2924 return Void();
2925}
2926
2927Return<void> OemHookImpl::sendRequestRaw(int32_t serial, const hidl_vec<uint8_t>& data) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002928#if VDBG
Amit Mahajan439da362017-02-13 17:43:04 -08002929 RLOGD("OemHookImpl::sendRequestRaw: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002930#endif
Amit Mahajan439da362017-02-13 17:43:04 -08002931 dispatchRaw(serial, mSlotId, RIL_REQUEST_OEM_HOOK_RAW, data);
2932 return Void();
2933}
2934
2935Return<void> OemHookImpl::sendRequestStrings(int32_t serial,
2936 const hidl_vec<hidl_string>& data) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002937#if VDBG
Amit Mahajan439da362017-02-13 17:43:04 -08002938 RLOGD("OemHookImpl::sendRequestStrings: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002939#endif
Amit Mahajan439da362017-02-13 17:43:04 -08002940 dispatchStrings(serial, mSlotId, RIL_REQUEST_OEM_HOOK_STRINGS, data);
2941 return Void();
2942}
2943
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002944/***************************************************************************************************
2945 * RESPONSE FUNCTIONS
2946 * Functions above are used for requests going from framework to vendor code. The ones below are
2947 * responses for those requests coming back from the vendor code.
2948 **************************************************************************************************/
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002949
Sanket Padawef220dc52017-01-02 23:46:00 -08002950void radio::acknowledgeRequest(int slotId, int serial) {
2951 if (radioService[slotId]->mRadioResponse != NULL) {
Amit Mahajan17249842017-01-19 15:05:45 -08002952 Return<void> retStatus = radioService[slotId]->mRadioResponse->acknowledgeRequest(serial);
2953 radioService[slotId]->checkReturnStatus(retStatus);
Sanket Padawef220dc52017-01-02 23:46:00 -08002954 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08002955 RLOGE("acknowledgeRequest: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawef220dc52017-01-02 23:46:00 -08002956 }
2957}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002958
Sanket Padawef220dc52017-01-02 23:46:00 -08002959void populateResponseInfo(RadioResponseInfo& responseInfo, int serial, int responseType,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002960 RIL_Errno e) {
Sanket Padawef220dc52017-01-02 23:46:00 -08002961 responseInfo.serial = serial;
2962 switch (responseType) {
2963 case RESPONSE_SOLICITED:
2964 responseInfo.type = RadioResponseType::SOLICITED;
2965 break;
2966 case RESPONSE_SOLICITED_ACK_EXP:
2967 responseInfo.type = RadioResponseType::SOLICITED_ACK_EXP;
2968 break;
2969 }
2970 responseInfo.error = (RadioError) e;
2971}
2972
Naveen Kalla346bbc02017-03-16 12:55:55 -07002973int responseIntOrEmpty(RadioResponseInfo& responseInfo, int serial, int responseType, RIL_Errno e,
2974 void *response, size_t responseLen) {
2975 populateResponseInfo(responseInfo, serial, responseType, e);
2976 int ret = -1;
2977
2978 if (response == NULL && responseLen == 0) {
2979 // Earlier RILs did not send a response for some cases although the interface
2980 // expected an integer as response. Do not return error if response is empty. Instead
2981 // Return -1 in those cases to maintain backward compatibility.
2982 } else if (response == NULL || responseLen != sizeof(int)) {
2983 RLOGE("responseIntOrEmpty: Invalid response");
2984 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
2985 } else {
2986 int *p_int = (int *) response;
2987 ret = p_int[0];
2988 }
2989 return ret;
2990}
2991
Sanket Padawef220dc52017-01-02 23:46:00 -08002992int responseInt(RadioResponseInfo& responseInfo, int serial, int responseType, RIL_Errno e,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002993 void *response, size_t responseLen) {
Sanket Padawef220dc52017-01-02 23:46:00 -08002994 populateResponseInfo(responseInfo, serial, responseType, e);
2995 int ret = -1;
2996
2997 if (response == NULL || responseLen != sizeof(int)) {
2998 RLOGE("responseInt: Invalid response");
2999 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
3000 } else {
3001 int *p_int = (int *) response;
3002 ret = p_int[0];
3003 }
3004 return ret;
3005}
3006
Amit Mahajan759786a2017-03-03 17:35:47 -08003007int radio::getIccCardStatusResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003008 int responseType, int serial, RIL_Errno e,
3009 void *response, size_t responseLen) {
Sanket Padawef220dc52017-01-02 23:46:00 -08003010 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003011 RadioResponseInfo responseInfo = {};
Sanket Padawef220dc52017-01-02 23:46:00 -08003012 populateResponseInfo(responseInfo, serial, responseType, e);
Jack Yuf68e0da2017-02-07 14:53:09 -08003013 CardStatus cardStatus = {};
Nathan Harold7da5dd62017-06-08 16:41:52 -07003014 RIL_CardStatus_v6 *p_cur = ((RIL_CardStatus_v6 *) response);
3015 if (response == NULL || responseLen != sizeof(RIL_CardStatus_v6)
3016 || p_cur->gsm_umts_subscription_app_index >= p_cur->num_applications
3017 || p_cur->cdma_subscription_app_index >= p_cur->num_applications
3018 || p_cur->ims_subscription_app_index >= p_cur->num_applications) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003019 RLOGE("getIccCardStatusResponse: Invalid response");
Sanket Padawef220dc52017-01-02 23:46:00 -08003020 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
Amit Mahajancd77a5b2016-08-25 11:19:21 -07003021 } else {
Amit Mahajancd77a5b2016-08-25 11:19:21 -07003022 cardStatus.cardState = (CardState) p_cur->card_state;
3023 cardStatus.universalPinState = (PinState) p_cur->universal_pin_state;
3024 cardStatus.gsmUmtsSubscriptionAppIndex = p_cur->gsm_umts_subscription_app_index;
3025 cardStatus.cdmaSubscriptionAppIndex = p_cur->cdma_subscription_app_index;
3026 cardStatus.imsSubscriptionAppIndex = p_cur->ims_subscription_app_index;
3027
3028 RIL_AppStatus *rilAppStatus = p_cur->applications;
3029 cardStatus.applications.resize(p_cur->num_applications);
3030 AppStatus *appStatus = cardStatus.applications.data();
Jayachandran C572f2f42017-03-25 14:30:13 -07003031#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003032 RLOGD("getIccCardStatusResponse: num_applications %d", p_cur->num_applications);
Jayachandran C572f2f42017-03-25 14:30:13 -07003033#endif
Amit Mahajancd77a5b2016-08-25 11:19:21 -07003034 for (int i = 0; i < p_cur->num_applications; i++) {
3035 appStatus[i].appType = (AppType) rilAppStatus[i].app_type;
3036 appStatus[i].appState = (AppState) rilAppStatus[i].app_state;
3037 appStatus[i].persoSubstate = (PersoSubstate) rilAppStatus[i].perso_substate;
3038 appStatus[i].aidPtr = convertCharPtrToHidlString(rilAppStatus[i].aid_ptr);
3039 appStatus[i].appLabelPtr = convertCharPtrToHidlString(
3040 rilAppStatus[i].app_label_ptr);
3041 appStatus[i].pin1Replaced = rilAppStatus[i].pin1_replaced;
3042 appStatus[i].pin1 = (PinState) rilAppStatus[i].pin1;
3043 appStatus[i].pin2 = (PinState) rilAppStatus[i].pin2;
3044 }
3045 }
3046
Amit Mahajan17249842017-01-19 15:05:45 -08003047 Return<void> retStatus = radioService[slotId]->mRadioResponse->
3048 getIccCardStatusResponse(responseInfo, cardStatus);
3049 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajancd77a5b2016-08-25 11:19:21 -07003050 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003051 RLOGE("getIccCardStatusResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawef220dc52017-01-02 23:46:00 -08003052 }
3053
3054 return 0;
3055}
3056
Amit Mahajan759786a2017-03-03 17:35:47 -08003057int radio::supplyIccPinForAppResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003058 int responseType, int serial, RIL_Errno e,
3059 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003060#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003061 RLOGD("supplyIccPinForAppResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003062#endif
Sanket Padawef220dc52017-01-02 23:46:00 -08003063
3064 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003065 RadioResponseInfo responseInfo = {};
Naveen Kalla346bbc02017-03-16 12:55:55 -07003066 int ret = responseIntOrEmpty(responseInfo, serial, responseType, e, response, responseLen);
Amit Mahajan17249842017-01-19 15:05:45 -08003067 Return<void> retStatus = radioService[slotId]->mRadioResponse->
3068 supplyIccPinForAppResponse(responseInfo, ret);
Amit Mahajanb3a11bb2017-05-15 16:41:44 -07003069 RLOGE("supplyIccPinForAppResponse: amit ret %d", ret);
Amit Mahajan17249842017-01-19 15:05:45 -08003070 radioService[slotId]->checkReturnStatus(retStatus);
Sanket Padawef220dc52017-01-02 23:46:00 -08003071 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003072 RLOGE("supplyIccPinForAppResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawef220dc52017-01-02 23:46:00 -08003073 slotId);
3074 }
3075
3076 return 0;
3077}
3078
Amit Mahajan759786a2017-03-03 17:35:47 -08003079int radio::supplyIccPukForAppResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003080 int responseType, int serial, RIL_Errno e,
3081 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003082#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003083 RLOGD("supplyIccPukForAppResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003084#endif
Sanket Padawef220dc52017-01-02 23:46:00 -08003085
3086 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003087 RadioResponseInfo responseInfo = {};
Naveen Kalla346bbc02017-03-16 12:55:55 -07003088 int ret = responseIntOrEmpty(responseInfo, serial, responseType, e, response, responseLen);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003089 Return<void> retStatus = radioService[slotId]->mRadioResponse->supplyIccPukForAppResponse(
3090 responseInfo, ret);
Amit Mahajan17249842017-01-19 15:05:45 -08003091 radioService[slotId]->checkReturnStatus(retStatus);
Sanket Padawef220dc52017-01-02 23:46:00 -08003092 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003093 RLOGE("supplyIccPukForAppResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawef220dc52017-01-02 23:46:00 -08003094 slotId);
3095 }
3096
3097 return 0;
3098}
3099
Amit Mahajan759786a2017-03-03 17:35:47 -08003100int radio::supplyIccPin2ForAppResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003101 int responseType, int serial, RIL_Errno e,
3102 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003103#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003104 RLOGD("supplyIccPin2ForAppResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003105#endif
Sanket Padawef220dc52017-01-02 23:46:00 -08003106
3107 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003108 RadioResponseInfo responseInfo = {};
Naveen Kalla346bbc02017-03-16 12:55:55 -07003109 int ret = responseIntOrEmpty(responseInfo, serial, responseType, e, response, responseLen);
Amit Mahajan17249842017-01-19 15:05:45 -08003110 Return<void> retStatus = radioService[slotId]->mRadioResponse->
3111 supplyIccPin2ForAppResponse(responseInfo, ret);
3112 radioService[slotId]->checkReturnStatus(retStatus);
Sanket Padawef220dc52017-01-02 23:46:00 -08003113 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003114 RLOGE("supplyIccPin2ForAppResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawef220dc52017-01-02 23:46:00 -08003115 slotId);
3116 }
3117
3118 return 0;
3119}
3120
Amit Mahajan759786a2017-03-03 17:35:47 -08003121int radio::supplyIccPuk2ForAppResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003122 int responseType, int serial, RIL_Errno e,
3123 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003124#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003125 RLOGD("supplyIccPuk2ForAppResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003126#endif
Sanket Padawef220dc52017-01-02 23:46:00 -08003127
3128 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003129 RadioResponseInfo responseInfo = {};
Naveen Kalla346bbc02017-03-16 12:55:55 -07003130 int ret = responseIntOrEmpty(responseInfo, serial, responseType, e, response, responseLen);
Amit Mahajan17249842017-01-19 15:05:45 -08003131 Return<void> retStatus = radioService[slotId]->mRadioResponse->
3132 supplyIccPuk2ForAppResponse(responseInfo, ret);
3133 radioService[slotId]->checkReturnStatus(retStatus);
Sanket Padawef220dc52017-01-02 23:46:00 -08003134 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003135 RLOGE("supplyIccPuk2ForAppResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawef220dc52017-01-02 23:46:00 -08003136 slotId);
3137 }
3138
3139 return 0;
3140}
3141
Amit Mahajan759786a2017-03-03 17:35:47 -08003142int radio::changeIccPinForAppResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003143 int responseType, int serial, RIL_Errno e,
3144 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003145#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003146 RLOGD("changeIccPinForAppResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003147#endif
Sanket Padawef220dc52017-01-02 23:46:00 -08003148
3149 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003150 RadioResponseInfo responseInfo = {};
Naveen Kalla346bbc02017-03-16 12:55:55 -07003151 int ret = responseIntOrEmpty(responseInfo, serial, responseType, e, response, responseLen);
Amit Mahajan17249842017-01-19 15:05:45 -08003152 Return<void> retStatus = radioService[slotId]->mRadioResponse->
3153 changeIccPinForAppResponse(responseInfo, ret);
3154 radioService[slotId]->checkReturnStatus(retStatus);
Sanket Padawef220dc52017-01-02 23:46:00 -08003155 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003156 RLOGE("changeIccPinForAppResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawef220dc52017-01-02 23:46:00 -08003157 slotId);
3158 }
3159
3160 return 0;
3161}
3162
Amit Mahajan759786a2017-03-03 17:35:47 -08003163int radio::changeIccPin2ForAppResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003164 int responseType, int serial, RIL_Errno e,
3165 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003166#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003167 RLOGD("changeIccPin2ForAppResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003168#endif
Sanket Padawef220dc52017-01-02 23:46:00 -08003169
3170 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003171 RadioResponseInfo responseInfo = {};
Naveen Kalla346bbc02017-03-16 12:55:55 -07003172 int ret = responseIntOrEmpty(responseInfo, serial, responseType, e, response, responseLen);
Amit Mahajan17249842017-01-19 15:05:45 -08003173 Return<void> retStatus = radioService[slotId]->mRadioResponse->
3174 changeIccPin2ForAppResponse(responseInfo, ret);
3175 radioService[slotId]->checkReturnStatus(retStatus);
Sanket Padawef220dc52017-01-02 23:46:00 -08003176 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003177 RLOGE("changeIccPin2ForAppResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawef220dc52017-01-02 23:46:00 -08003178 slotId);
3179 }
3180
3181 return 0;
3182}
3183
Amit Mahajan759786a2017-03-03 17:35:47 -08003184int radio::supplyNetworkDepersonalizationResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003185 int responseType, int serial, RIL_Errno e,
3186 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003187#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003188 RLOGD("supplyNetworkDepersonalizationResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003189#endif
Sanket Padawef220dc52017-01-02 23:46:00 -08003190
3191 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003192 RadioResponseInfo responseInfo = {};
Naveen Kalla346bbc02017-03-16 12:55:55 -07003193 int ret = responseIntOrEmpty(responseInfo, serial, responseType, e, response, responseLen);
Amit Mahajan17249842017-01-19 15:05:45 -08003194 Return<void> retStatus = radioService[slotId]->mRadioResponse->
3195 supplyNetworkDepersonalizationResponse(responseInfo, ret);
3196 radioService[slotId]->checkReturnStatus(retStatus);
Sanket Padawef220dc52017-01-02 23:46:00 -08003197 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003198 RLOGE("supplyNetworkDepersonalizationResponse: radioService[%d]->mRadioResponse == "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003199 "NULL", slotId);
Sanket Padawef220dc52017-01-02 23:46:00 -08003200 }
3201
3202 return 0;
3203}
3204
Amit Mahajan759786a2017-03-03 17:35:47 -08003205int radio::getCurrentCallsResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003206 int responseType, int serial, RIL_Errno e,
3207 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003208#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003209 RLOGD("getCurrentCallsResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003210#endif
Sanket Padawef220dc52017-01-02 23:46:00 -08003211
3212 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003213 RadioResponseInfo responseInfo = {};
Sanket Padawef220dc52017-01-02 23:46:00 -08003214 populateResponseInfo(responseInfo, serial, responseType, e);
3215
3216 hidl_vec<Call> calls;
Amit Mahajan13058cb2017-06-07 23:10:27 -07003217 if ((response == NULL && responseLen != 0)
3218 || (responseLen % sizeof(RIL_Call *)) != 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003219 RLOGE("getCurrentCallsResponse: Invalid response");
Amit Mahajan5829a472016-12-28 17:28:07 -08003220 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
Sanket Padawef220dc52017-01-02 23:46:00 -08003221 } else {
3222 int num = responseLen / sizeof(RIL_Call *);
3223 calls.resize(num);
3224
3225 for (int i = 0 ; i < num ; i++) {
3226 RIL_Call *p_cur = ((RIL_Call **) response)[i];
3227 /* each call info */
3228 calls[i].state = (CallState) p_cur->state;
3229 calls[i].index = p_cur->index;
3230 calls[i].toa = p_cur->toa;
3231 calls[i].isMpty = p_cur->isMpty;
3232 calls[i].isMT = p_cur->isMT;
3233 calls[i].als = p_cur->als;
3234 calls[i].isVoice = p_cur->isVoice;
3235 calls[i].isVoicePrivacy = p_cur->isVoicePrivacy;
3236 calls[i].number = convertCharPtrToHidlString(p_cur->number);
3237 calls[i].numberPresentation = (CallPresentation) p_cur->numberPresentation;
3238 calls[i].name = convertCharPtrToHidlString(p_cur->name);
3239 calls[i].namePresentation = (CallPresentation) p_cur->namePresentation;
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003240 if (p_cur->uusInfo != NULL && p_cur->uusInfo->uusData != NULL) {
Sanket Padawef220dc52017-01-02 23:46:00 -08003241 RIL_UUS_Info *uusInfo = p_cur->uusInfo;
Ajay Nambi83e7acd2017-09-05 15:06:22 +05303242 calls[i].uusInfo.resize(1);
Sanket Padawef220dc52017-01-02 23:46:00 -08003243 calls[i].uusInfo[0].uusType = (UusType) uusInfo->uusType;
3244 calls[i].uusInfo[0].uusDcs = (UusDcs) uusInfo->uusDcs;
3245 // convert uusInfo->uusData to a null-terminated string
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003246 char *nullTermStr = strndup(uusInfo->uusData, uusInfo->uusLength);
3247 calls[i].uusInfo[0].uusData = nullTermStr;
3248 free(nullTermStr);
Sanket Padawef220dc52017-01-02 23:46:00 -08003249 }
3250 }
3251 }
3252
Amit Mahajan17249842017-01-19 15:05:45 -08003253 Return<void> retStatus = radioService[slotId]->mRadioResponse->
3254 getCurrentCallsResponse(responseInfo, calls);
3255 radioService[slotId]->checkReturnStatus(retStatus);
Sanket Padawef220dc52017-01-02 23:46:00 -08003256 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003257 RLOGE("getCurrentCallsResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawef220dc52017-01-02 23:46:00 -08003258 }
3259
3260 return 0;
3261}
3262
Amit Mahajan759786a2017-03-03 17:35:47 -08003263int radio::dialResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003264 int responseType, int serial, RIL_Errno e, void *response,
3265 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003266#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003267 RLOGD("dialResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003268#endif
Sanket Padawef220dc52017-01-02 23:46:00 -08003269
3270 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003271 RadioResponseInfo responseInfo = {};
Sanket Padawef220dc52017-01-02 23:46:00 -08003272 populateResponseInfo(responseInfo, serial, responseType, e);
Amit Mahajan17249842017-01-19 15:05:45 -08003273 Return<void> retStatus = radioService[slotId]->mRadioResponse->dialResponse(responseInfo);
3274 radioService[slotId]->checkReturnStatus(retStatus);
Sanket Padawef220dc52017-01-02 23:46:00 -08003275 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003276 RLOGE("dialResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Amit Mahajancd77a5b2016-08-25 11:19:21 -07003277 }
3278
3279 return 0;
3280}
3281
Amit Mahajan759786a2017-03-03 17:35:47 -08003282int radio::getIMSIForAppResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003283 int responseType, int serial, RIL_Errno e, void *response,
3284 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003285#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003286 RLOGD("getIMSIForAppResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003287#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003288
3289 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003290 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003291 populateResponseInfo(responseInfo, serial, responseType, e);
3292 Return<void> retStatus = radioService[slotId]->mRadioResponse->getIMSIForAppResponse(
3293 responseInfo, convertCharPtrToHidlString((char *) response));
3294 radioService[slotId]->checkReturnStatus(retStatus);
3295 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003296 RLOGE("getIMSIForAppResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003297 slotId);
3298 }
3299
3300 return 0;
3301}
3302
Amit Mahajan759786a2017-03-03 17:35:47 -08003303int radio::hangupConnectionResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003304 int responseType, int serial, RIL_Errno e,
3305 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003306#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003307 RLOGD("hangupConnectionResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003308#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003309
3310 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003311 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003312 populateResponseInfo(responseInfo, serial, responseType, e);
3313 Return<void> retStatus = radioService[slotId]->mRadioResponse->hangupConnectionResponse(
3314 responseInfo);
3315 radioService[slotId]->checkReturnStatus(retStatus);
3316 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003317 RLOGE("hangupConnectionResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003318 slotId);
3319 }
3320
3321 return 0;
3322}
3323
Amit Mahajan759786a2017-03-03 17:35:47 -08003324int radio::hangupWaitingOrBackgroundResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003325 int responseType, int serial, RIL_Errno e,
3326 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003327#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003328 RLOGD("hangupWaitingOrBackgroundResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003329#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003330
3331 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003332 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003333 populateResponseInfo(responseInfo, serial, responseType, e);
3334 Return<void> retStatus =
3335 radioService[slotId]->mRadioResponse->hangupWaitingOrBackgroundResponse(
3336 responseInfo);
3337 radioService[slotId]->checkReturnStatus(retStatus);
3338 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003339 RLOGE("hangupWaitingOrBackgroundResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003340 slotId);
3341 }
3342
3343 return 0;
3344}
3345
Amit Mahajan759786a2017-03-03 17:35:47 -08003346int radio::hangupForegroundResumeBackgroundResponse(int slotId, int responseType, int serial,
3347 RIL_Errno e, void *response,
3348 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003349#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003350 RLOGD("hangupWaitingOrBackgroundResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003351#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003352
3353 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003354 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003355 populateResponseInfo(responseInfo, serial, responseType, e);
3356 Return<void> retStatus =
3357 radioService[slotId]->mRadioResponse->hangupWaitingOrBackgroundResponse(
3358 responseInfo);
3359 radioService[slotId]->checkReturnStatus(retStatus);
3360 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003361 RLOGE("hangupWaitingOrBackgroundResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003362 slotId);
3363 }
3364
3365 return 0;
3366}
3367
Amit Mahajan759786a2017-03-03 17:35:47 -08003368int radio::switchWaitingOrHoldingAndActiveResponse(int slotId, int responseType, int serial,
3369 RIL_Errno e, void *response,
3370 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003371#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003372 RLOGD("switchWaitingOrHoldingAndActiveResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003373#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003374
3375 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003376 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003377 populateResponseInfo(responseInfo, serial, responseType, e);
3378 Return<void> retStatus =
3379 radioService[slotId]->mRadioResponse->switchWaitingOrHoldingAndActiveResponse(
3380 responseInfo);
3381 radioService[slotId]->checkReturnStatus(retStatus);
3382 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003383 RLOGE("switchWaitingOrHoldingAndActiveResponse: radioService[%d]->mRadioResponse "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003384 "== NULL", slotId);
3385 }
3386
3387 return 0;
3388}
3389
Amit Mahajan759786a2017-03-03 17:35:47 -08003390int radio::conferenceResponse(int slotId, int responseType,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003391 int serial, RIL_Errno e, void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003392#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003393 RLOGD("conferenceResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003394#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003395
3396 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003397 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003398 populateResponseInfo(responseInfo, serial, responseType, e);
3399 Return<void> retStatus = radioService[slotId]->mRadioResponse->conferenceResponse(
3400 responseInfo);
3401 radioService[slotId]->checkReturnStatus(retStatus);
3402 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003403 RLOGE("conferenceResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003404 slotId);
3405 }
3406
3407 return 0;
3408}
3409
Amit Mahajan759786a2017-03-03 17:35:47 -08003410int radio::rejectCallResponse(int slotId, int responseType,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003411 int serial, RIL_Errno e, void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003412#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003413 RLOGD("rejectCallResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003414#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003415
3416 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003417 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003418 populateResponseInfo(responseInfo, serial, responseType, e);
3419 Return<void> retStatus = radioService[slotId]->mRadioResponse->rejectCallResponse(
3420 responseInfo);
3421 radioService[slotId]->checkReturnStatus(retStatus);
3422 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003423 RLOGE("rejectCallResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003424 slotId);
3425 }
3426
3427 return 0;
3428}
3429
Amit Mahajan759786a2017-03-03 17:35:47 -08003430int radio::getLastCallFailCauseResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003431 int responseType, int serial, RIL_Errno e, void *response,
3432 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003433#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003434 RLOGD("getLastCallFailCauseResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003435#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003436
3437 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003438 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003439 populateResponseInfo(responseInfo, serial, responseType, e);
Jack Yuf68e0da2017-02-07 14:53:09 -08003440
3441 LastCallFailCauseInfo info = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003442 info.vendorCause = hidl_string();
3443 if (response == NULL) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003444 RLOGE("getCurrentCallsResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003445 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
3446 } else if (responseLen == sizeof(int)) {
3447 int *pInt = (int *) response;
3448 info.causeCode = (LastCallFailCause) pInt[0];
3449 } else if (responseLen == sizeof(RIL_LastCallFailCauseInfo)) {
3450 RIL_LastCallFailCauseInfo *pFailCauseInfo = (RIL_LastCallFailCauseInfo *) response;
3451 info.causeCode = (LastCallFailCause) pFailCauseInfo->cause_code;
3452 info.vendorCause = convertCharPtrToHidlString(pFailCauseInfo->vendor_cause);
3453 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003454 RLOGE("getCurrentCallsResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003455 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
3456 }
3457
3458 Return<void> retStatus = radioService[slotId]->mRadioResponse->getLastCallFailCauseResponse(
3459 responseInfo, info);
3460 radioService[slotId]->checkReturnStatus(retStatus);
3461 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003462 RLOGE("getLastCallFailCauseResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003463 slotId);
3464 }
3465
3466 return 0;
3467}
3468
Amit Mahajan759786a2017-03-03 17:35:47 -08003469int radio::getSignalStrengthResponse(int slotId,
Amit Mahajan3df62912017-02-10 01:35:55 +00003470 int responseType, int serial, RIL_Errno e,
3471 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003472#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003473 RLOGD("getSignalStrengthResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003474#endif
Amit Mahajan3df62912017-02-10 01:35:55 +00003475
3476 if (radioService[slotId]->mRadioResponse != NULL) {
Amit Mahajan3da9ac02017-02-13 13:41:28 -08003477 RadioResponseInfo responseInfo = {};
Amit Mahajan3df62912017-02-10 01:35:55 +00003478 populateResponseInfo(responseInfo, serial, responseType, e);
Amit Mahajan3da9ac02017-02-13 13:41:28 -08003479 SignalStrength signalStrength = {};
Amit Mahajan3df62912017-02-10 01:35:55 +00003480 if (response == NULL || responseLen != sizeof(RIL_SignalStrength_v10)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003481 RLOGE("getSignalStrengthResponse: Invalid response");
Amit Mahajan3df62912017-02-10 01:35:55 +00003482 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
3483 } else {
3484 convertRilSignalStrengthToHal(response, responseLen, signalStrength);
3485 }
3486
3487 Return<void> retStatus = radioService[slotId]->mRadioResponse->getSignalStrengthResponse(
3488 responseInfo, signalStrength);
3489 radioService[slotId]->checkReturnStatus(retStatus);
3490 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003491 RLOGE("getSignalStrengthResponse: radioService[%d]->mRadioResponse == NULL",
Amit Mahajan3df62912017-02-10 01:35:55 +00003492 slotId);
3493 }
3494
3495 return 0;
3496}
3497
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003498RIL_CellInfoType getCellInfoTypeRadioTechnology(char *rat) {
3499 if (rat == NULL) {
3500 return RIL_CELL_INFO_TYPE_NONE;
3501 }
3502
3503 int radioTech = atoi(rat);
3504
3505 switch(radioTech) {
3506
3507 case RADIO_TECH_GPRS:
3508 case RADIO_TECH_EDGE:
3509 case RADIO_TECH_GSM: {
3510 return RIL_CELL_INFO_TYPE_GSM;
3511 }
3512
3513 case RADIO_TECH_UMTS:
3514 case RADIO_TECH_HSDPA:
3515 case RADIO_TECH_HSUPA:
3516 case RADIO_TECH_HSPA:
3517 case RADIO_TECH_HSPAP: {
3518 return RIL_CELL_INFO_TYPE_WCDMA;
3519 }
3520
3521 case RADIO_TECH_IS95A:
3522 case RADIO_TECH_IS95B:
3523 case RADIO_TECH_1xRTT:
3524 case RADIO_TECH_EVDO_0:
3525 case RADIO_TECH_EVDO_A:
3526 case RADIO_TECH_EVDO_B:
3527 case RADIO_TECH_EHRPD: {
3528 return RIL_CELL_INFO_TYPE_CDMA;
3529 }
3530
3531 case RADIO_TECH_LTE:
3532 case RADIO_TECH_LTE_CA: {
3533 return RIL_CELL_INFO_TYPE_LTE;
3534 }
3535
3536 case RADIO_TECH_TD_SCDMA: {
3537 return RIL_CELL_INFO_TYPE_TD_SCDMA;
3538 }
3539
3540 default: {
3541 break;
3542 }
3543 }
3544
3545 return RIL_CELL_INFO_TYPE_NONE;
3546
3547}
3548
3549void fillCellIdentityResponse(CellIdentity &cellIdentity, RIL_CellIdentity_v16 &rilCellIdentity) {
3550
3551 cellIdentity.cellIdentityGsm.resize(0);
3552 cellIdentity.cellIdentityWcdma.resize(0);
3553 cellIdentity.cellIdentityCdma.resize(0);
3554 cellIdentity.cellIdentityTdscdma.resize(0);
3555 cellIdentity.cellIdentityLte.resize(0);
3556 cellIdentity.cellInfoType = (CellInfoType)rilCellIdentity.cellInfoType;
3557 switch(rilCellIdentity.cellInfoType) {
3558
3559 case RIL_CELL_INFO_TYPE_GSM: {
3560 cellIdentity.cellIdentityGsm.resize(1);
3561 cellIdentity.cellIdentityGsm[0].mcc =
3562 std::to_string(rilCellIdentity.cellIdentityGsm.mcc);
3563 cellIdentity.cellIdentityGsm[0].mnc =
3564 std::to_string(rilCellIdentity.cellIdentityGsm.mnc);
3565 cellIdentity.cellIdentityGsm[0].lac = rilCellIdentity.cellIdentityGsm.lac;
3566 cellIdentity.cellIdentityGsm[0].cid = rilCellIdentity.cellIdentityGsm.cid;
3567 cellIdentity.cellIdentityGsm[0].arfcn = rilCellIdentity.cellIdentityGsm.arfcn;
3568 cellIdentity.cellIdentityGsm[0].bsic = rilCellIdentity.cellIdentityGsm.bsic;
3569 break;
3570 }
3571
3572 case RIL_CELL_INFO_TYPE_WCDMA: {
3573 cellIdentity.cellIdentityWcdma.resize(1);
3574 cellIdentity.cellIdentityWcdma[0].mcc =
3575 std::to_string(rilCellIdentity.cellIdentityWcdma.mcc);
3576 cellIdentity.cellIdentityWcdma[0].mnc =
3577 std::to_string(rilCellIdentity.cellIdentityWcdma.mnc);
3578 cellIdentity.cellIdentityWcdma[0].lac = rilCellIdentity.cellIdentityWcdma.lac;
3579 cellIdentity.cellIdentityWcdma[0].cid = rilCellIdentity.cellIdentityWcdma.cid;
3580 cellIdentity.cellIdentityWcdma[0].psc = rilCellIdentity.cellIdentityWcdma.psc;
3581 cellIdentity.cellIdentityWcdma[0].uarfcn = rilCellIdentity.cellIdentityWcdma.uarfcn;
3582 break;
3583 }
3584
3585 case RIL_CELL_INFO_TYPE_CDMA: {
3586 cellIdentity.cellIdentityCdma.resize(1);
3587 cellIdentity.cellIdentityCdma[0].networkId = rilCellIdentity.cellIdentityCdma.networkId;
3588 cellIdentity.cellIdentityCdma[0].systemId = rilCellIdentity.cellIdentityCdma.systemId;
3589 cellIdentity.cellIdentityCdma[0].baseStationId =
3590 rilCellIdentity.cellIdentityCdma.basestationId;
3591 cellIdentity.cellIdentityCdma[0].longitude = rilCellIdentity.cellIdentityCdma.longitude;
3592 cellIdentity.cellIdentityCdma[0].latitude = rilCellIdentity.cellIdentityCdma.latitude;
3593 break;
3594 }
3595
3596 case RIL_CELL_INFO_TYPE_LTE: {
3597 cellIdentity.cellIdentityLte.resize(1);
3598 cellIdentity.cellIdentityLte[0].mcc =
3599 std::to_string(rilCellIdentity.cellIdentityLte.mcc);
3600 cellIdentity.cellIdentityLte[0].mnc =
3601 std::to_string(rilCellIdentity.cellIdentityLte.mnc);
3602 cellIdentity.cellIdentityLte[0].ci = rilCellIdentity.cellIdentityLte.ci;
3603 cellIdentity.cellIdentityLte[0].pci = rilCellIdentity.cellIdentityLte.pci;
3604 cellIdentity.cellIdentityLte[0].tac = rilCellIdentity.cellIdentityLte.tac;
3605 cellIdentity.cellIdentityLte[0].earfcn = rilCellIdentity.cellIdentityLte.earfcn;
3606 break;
3607 }
3608
3609 case RIL_CELL_INFO_TYPE_TD_SCDMA: {
3610 cellIdentity.cellIdentityTdscdma.resize(1);
3611 cellIdentity.cellIdentityTdscdma[0].mcc =
3612 std::to_string(rilCellIdentity.cellIdentityTdscdma.mcc);
3613 cellIdentity.cellIdentityTdscdma[0].mnc =
3614 std::to_string(rilCellIdentity.cellIdentityTdscdma.mnc);
3615 cellIdentity.cellIdentityTdscdma[0].lac = rilCellIdentity.cellIdentityTdscdma.lac;
3616 cellIdentity.cellIdentityTdscdma[0].cid = rilCellIdentity.cellIdentityTdscdma.cid;
3617 cellIdentity.cellIdentityTdscdma[0].cpid = rilCellIdentity.cellIdentityTdscdma.cpid;
3618 break;
3619 }
3620
3621 default: {
3622 break;
3623 }
3624 }
3625}
3626
3627int convertResponseStringEntryToInt(char **response, int index, int numStrings) {
3628 if ((response != NULL) && (numStrings > index) && (response[index] != NULL)) {
3629 return atoi(response[index]);
3630 }
3631
3632 return -1;
3633}
3634
Sooraj Sasindran758ee462017-06-07 16:30:18 -07003635int convertResponseHexStringEntryToInt(char **response, int index, int numStrings) {
3636 const int hexBase = 16;
3637 if ((response != NULL) && (numStrings > index) && (response[index] != NULL)) {
3638 return strtol(response[index], NULL, hexBase);
3639 }
3640
3641 return -1;
3642}
3643
3644/* Fill Cell Identity info from Voice Registration State Response.
3645 * This fucntion is applicable only for RIL Version < 15.
3646 * Response is a "char **".
3647 * First and Second entries are in hex string format
3648 * and rest are integers represented in ascii format. */
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003649void fillCellIdentityFromVoiceRegStateResponseString(CellIdentity &cellIdentity,
3650 int numStrings, char** response) {
3651
3652 RIL_CellIdentity_v16 rilCellIdentity;
Jack Yu8e732d42017-04-14 00:08:06 -07003653 memset(&rilCellIdentity, -1, sizeof(RIL_CellIdentity_v16));
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003654
3655 rilCellIdentity.cellInfoType = getCellInfoTypeRadioTechnology(response[3]);
3656 switch(rilCellIdentity.cellInfoType) {
3657
3658 case RIL_CELL_INFO_TYPE_GSM: {
Sooraj Sasindran758ee462017-06-07 16:30:18 -07003659 /* valid LAC are hexstrings in the range 0x0000 - 0xffff */
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003660 rilCellIdentity.cellIdentityGsm.lac =
Sooraj Sasindran758ee462017-06-07 16:30:18 -07003661 convertResponseHexStringEntryToInt(response, 1, numStrings);
3662
3663 /* valid CID are hexstrings in the range 0x00000000 - 0xffffffff */
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003664 rilCellIdentity.cellIdentityGsm.cid =
Sooraj Sasindran758ee462017-06-07 16:30:18 -07003665 convertResponseHexStringEntryToInt(response, 2, numStrings);
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003666 break;
3667 }
3668
3669 case RIL_CELL_INFO_TYPE_WCDMA: {
Sooraj Sasindran758ee462017-06-07 16:30:18 -07003670 /* valid LAC are hexstrings in the range 0x0000 - 0xffff */
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003671 rilCellIdentity.cellIdentityWcdma.lac =
Sooraj Sasindran758ee462017-06-07 16:30:18 -07003672 convertResponseHexStringEntryToInt(response, 1, numStrings);
3673
3674 /* valid CID are hexstrings in the range 0x00000000 - 0xffffffff */
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003675 rilCellIdentity.cellIdentityWcdma.cid =
Sooraj Sasindran758ee462017-06-07 16:30:18 -07003676 convertResponseHexStringEntryToInt(response, 2, numStrings);
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003677 rilCellIdentity.cellIdentityWcdma.psc =
3678 convertResponseStringEntryToInt(response, 14, numStrings);
3679 break;
3680 }
3681
3682 case RIL_CELL_INFO_TYPE_TD_SCDMA:{
Sooraj Sasindran758ee462017-06-07 16:30:18 -07003683 /* valid LAC are hexstrings in the range 0x0000 - 0xffff */
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003684 rilCellIdentity.cellIdentityTdscdma.lac =
Sooraj Sasindran758ee462017-06-07 16:30:18 -07003685 convertResponseHexStringEntryToInt(response, 1, numStrings);
3686
3687 /* valid CID are hexstrings in the range 0x00000000 - 0xffffffff */
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003688 rilCellIdentity.cellIdentityTdscdma.cid =
Sooraj Sasindran758ee462017-06-07 16:30:18 -07003689 convertResponseHexStringEntryToInt(response, 2, numStrings);
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003690 break;
3691 }
3692
3693 case RIL_CELL_INFO_TYPE_CDMA:{
3694 rilCellIdentity.cellIdentityCdma.basestationId =
3695 convertResponseStringEntryToInt(response, 4, numStrings);
Nathan Harold35afd642017-07-07 17:12:04 -07003696 /* Order of Lat. and Long. swapped between RIL and HIDL interface versions. */
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003697 rilCellIdentity.cellIdentityCdma.latitude =
Nathan Harold35afd642017-07-07 17:12:04 -07003698 convertResponseStringEntryToInt(response, 5, numStrings);
3699 rilCellIdentity.cellIdentityCdma.longitude =
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003700 convertResponseStringEntryToInt(response, 6, numStrings);
3701 rilCellIdentity.cellIdentityCdma.systemId =
3702 convertResponseStringEntryToInt(response, 8, numStrings);
3703 rilCellIdentity.cellIdentityCdma.networkId =
3704 convertResponseStringEntryToInt(response, 9, numStrings);
3705 break;
3706 }
3707
Sooraj Sasindranf28e42a2017-03-06 23:07:22 -08003708 case RIL_CELL_INFO_TYPE_LTE:{
Sooraj Sasindran758ee462017-06-07 16:30:18 -07003709 /* valid TAC are hexstrings in the range 0x0000 - 0xffff */
Sooraj Sasindranf28e42a2017-03-06 23:07:22 -08003710 rilCellIdentity.cellIdentityLte.tac =
Sooraj Sasindran758ee462017-06-07 16:30:18 -07003711 convertResponseHexStringEntryToInt(response, 1, numStrings);
3712
3713 /* valid CID are hexstrings in the range 0x00000000 - 0xffffffff */
Sooraj Sasindranf28e42a2017-03-06 23:07:22 -08003714 rilCellIdentity.cellIdentityLte.ci =
Sooraj Sasindran758ee462017-06-07 16:30:18 -07003715 convertResponseHexStringEntryToInt(response, 2, numStrings);
Sooraj Sasindranf28e42a2017-03-06 23:07:22 -08003716 break;
3717 }
3718
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003719 default: {
3720 break;
3721 }
3722 }
3723
3724 fillCellIdentityResponse(cellIdentity, rilCellIdentity);
3725}
3726
Sooraj Sasindran758ee462017-06-07 16:30:18 -07003727/* Fill Cell Identity info from Data Registration State Response.
3728 * This fucntion is applicable only for RIL Version < 15.
3729 * Response is a "char **".
3730 * First and Second entries are in hex string format
3731 * and rest are integers represented in ascii format. */
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003732void fillCellIdentityFromDataRegStateResponseString(CellIdentity &cellIdentity,
3733 int numStrings, char** response) {
3734
3735 RIL_CellIdentity_v16 rilCellIdentity;
Jack Yu8e732d42017-04-14 00:08:06 -07003736 memset(&rilCellIdentity, -1, sizeof(RIL_CellIdentity_v16));
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003737
3738 rilCellIdentity.cellInfoType = getCellInfoTypeRadioTechnology(response[3]);
3739 switch(rilCellIdentity.cellInfoType) {
3740 case RIL_CELL_INFO_TYPE_GSM: {
Sooraj Sasindran758ee462017-06-07 16:30:18 -07003741 /* valid LAC are hexstrings in the range 0x0000 - 0xffff */
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003742 rilCellIdentity.cellIdentityGsm.lac =
Sooraj Sasindran758ee462017-06-07 16:30:18 -07003743 convertResponseHexStringEntryToInt(response, 1, numStrings);
3744
3745 /* valid CID are hexstrings in the range 0x00000000 - 0xffffffff */
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003746 rilCellIdentity.cellIdentityGsm.cid =
Sooraj Sasindran758ee462017-06-07 16:30:18 -07003747 convertResponseHexStringEntryToInt(response, 2, numStrings);
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003748 break;
3749 }
3750 case RIL_CELL_INFO_TYPE_WCDMA: {
Sooraj Sasindran758ee462017-06-07 16:30:18 -07003751 /* valid LAC are hexstrings in the range 0x0000 - 0xffff */
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003752 rilCellIdentity.cellIdentityWcdma.lac =
Sooraj Sasindran758ee462017-06-07 16:30:18 -07003753 convertResponseHexStringEntryToInt(response, 1, numStrings);
3754
3755 /* valid CID are hexstrings in the range 0x00000000 - 0xffffffff */
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003756 rilCellIdentity.cellIdentityWcdma.cid =
Sooraj Sasindran758ee462017-06-07 16:30:18 -07003757 convertResponseHexStringEntryToInt(response, 2, numStrings);
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003758 break;
3759 }
3760 case RIL_CELL_INFO_TYPE_TD_SCDMA:{
Sooraj Sasindran758ee462017-06-07 16:30:18 -07003761 /* valid LAC are hexstrings in the range 0x0000 - 0xffff */
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003762 rilCellIdentity.cellIdentityTdscdma.lac =
Sooraj Sasindran758ee462017-06-07 16:30:18 -07003763 convertResponseHexStringEntryToInt(response, 1, numStrings);
3764
3765 /* valid CID are hexstrings in the range 0x00000000 - 0xffffffff */
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003766 rilCellIdentity.cellIdentityTdscdma.cid =
Sooraj Sasindran758ee462017-06-07 16:30:18 -07003767 convertResponseHexStringEntryToInt(response, 2, numStrings);
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003768 break;
3769 }
3770 case RIL_CELL_INFO_TYPE_LTE: {
3771 rilCellIdentity.cellIdentityLte.tac =
3772 convertResponseStringEntryToInt(response, 6, numStrings);
3773 rilCellIdentity.cellIdentityLte.pci =
3774 convertResponseStringEntryToInt(response, 7, numStrings);
3775 rilCellIdentity.cellIdentityLte.ci =
3776 convertResponseStringEntryToInt(response, 8, numStrings);
3777 break;
3778 }
3779 default: {
3780 break;
3781 }
3782 }
3783
3784 fillCellIdentityResponse(cellIdentity, rilCellIdentity);
3785}
3786
Amit Mahajan759786a2017-03-03 17:35:47 -08003787int radio::getVoiceRegistrationStateResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003788 int responseType, int serial, RIL_Errno e,
3789 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003790#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003791 RLOGD("getVoiceRegistrationStateResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003792#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003793
3794 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003795 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003796 populateResponseInfo(responseInfo, serial, responseType, e);
3797
Jack Yuf68e0da2017-02-07 14:53:09 -08003798 VoiceRegStateResult voiceRegResponse = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003799 int numStrings = responseLen / sizeof(char *);
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003800 if (response == NULL) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003801 RLOGE("getVoiceRegistrationStateResponse Invalid response: NULL");
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003802 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
3803 } else if (s_vendorFunctions->version <= 14) {
3804 if (numStrings != 15) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003805 RLOGE("getVoiceRegistrationStateResponse Invalid response: NULL");
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003806 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
3807 } else {
3808 char **resp = (char **) response;
3809 voiceRegResponse.regState = (RegState) ATOI_NULL_HANDLED_DEF(resp[0], 4);
3810 voiceRegResponse.rat = ATOI_NULL_HANDLED(resp[3]);
3811 voiceRegResponse.cssSupported = ATOI_NULL_HANDLED_DEF(resp[7], 0);
3812 voiceRegResponse.roamingIndicator = ATOI_NULL_HANDLED(resp[10]);
3813 voiceRegResponse.systemIsInPrl = ATOI_NULL_HANDLED_DEF(resp[11], 0);
3814 voiceRegResponse.defaultRoamingIndicator = ATOI_NULL_HANDLED_DEF(resp[12], 0);
3815 voiceRegResponse.reasonForDenial = ATOI_NULL_HANDLED_DEF(resp[13], 0);
3816 fillCellIdentityFromVoiceRegStateResponseString(voiceRegResponse.cellIdentity,
3817 numStrings, resp);
3818 }
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003819 } else {
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003820 RIL_VoiceRegistrationStateResponse *voiceRegState =
3821 (RIL_VoiceRegistrationStateResponse *)response;
3822
3823 if (responseLen != sizeof(RIL_VoiceRegistrationStateResponse)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003824 RLOGE("getVoiceRegistrationStateResponse Invalid response: NULL");
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003825 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
3826 } else {
3827 voiceRegResponse.regState = (RegState) voiceRegState->regState;
3828 voiceRegResponse.rat = voiceRegState->rat;;
3829 voiceRegResponse.cssSupported = voiceRegState->cssSupported;
3830 voiceRegResponse.roamingIndicator = voiceRegState->roamingIndicator;
3831 voiceRegResponse.systemIsInPrl = voiceRegState->systemIsInPrl;
3832 voiceRegResponse.defaultRoamingIndicator = voiceRegState->defaultRoamingIndicator;
3833 voiceRegResponse.reasonForDenial = voiceRegState->reasonForDenial;
3834 fillCellIdentityResponse(voiceRegResponse.cellIdentity,
3835 voiceRegState->cellIdentity);
3836 }
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003837 }
3838
3839 Return<void> retStatus =
3840 radioService[slotId]->mRadioResponse->getVoiceRegistrationStateResponse(
3841 responseInfo, voiceRegResponse);
3842 radioService[slotId]->checkReturnStatus(retStatus);
3843 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003844 RLOGE("getVoiceRegistrationStateResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003845 slotId);
3846 }
3847
3848 return 0;
3849}
3850
Amit Mahajan759786a2017-03-03 17:35:47 -08003851int radio::getDataRegistrationStateResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003852 int responseType, int serial, RIL_Errno e,
3853 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003854#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003855 RLOGD("getDataRegistrationStateResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003856#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003857
3858 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003859 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003860 populateResponseInfo(responseInfo, serial, responseType, e);
Jack Yuf68e0da2017-02-07 14:53:09 -08003861 DataRegStateResult dataRegResponse = {};
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003862 if (response == NULL) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003863 RLOGE("getDataRegistrationStateResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003864 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003865 } else if (s_vendorFunctions->version <= 14) {
3866 int numStrings = responseLen / sizeof(char *);
3867 if ((numStrings != 6) && (numStrings != 11)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003868 RLOGE("getDataRegistrationStateResponse Invalid response: NULL");
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003869 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
3870 } else {
3871 char **resp = (char **) response;
3872 dataRegResponse.regState = (RegState) ATOI_NULL_HANDLED_DEF(resp[0], 4);
3873 dataRegResponse.rat = ATOI_NULL_HANDLED_DEF(resp[3], 0);
3874 dataRegResponse.reasonDataDenied = ATOI_NULL_HANDLED(resp[4]);
3875 dataRegResponse.maxDataCalls = ATOI_NULL_HANDLED_DEF(resp[5], 1);
3876 fillCellIdentityFromDataRegStateResponseString(dataRegResponse.cellIdentity,
3877 numStrings, resp);
3878 }
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003879 } else {
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003880 RIL_DataRegistrationStateResponse *dataRegState =
3881 (RIL_DataRegistrationStateResponse *)response;
3882
3883 if (responseLen != sizeof(RIL_DataRegistrationStateResponse)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003884 RLOGE("getDataRegistrationStateResponse Invalid response: NULL");
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003885 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
3886 } else {
3887 dataRegResponse.regState = (RegState) dataRegState->regState;
3888 dataRegResponse.rat = dataRegState->rat;;
3889 dataRegResponse.reasonDataDenied = dataRegState->reasonDataDenied;
3890 dataRegResponse.maxDataCalls = dataRegState->maxDataCalls;
3891 fillCellIdentityResponse(dataRegResponse.cellIdentity, dataRegState->cellIdentity);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003892 }
3893 }
3894
3895 Return<void> retStatus =
3896 radioService[slotId]->mRadioResponse->getDataRegistrationStateResponse(responseInfo,
3897 dataRegResponse);
3898 radioService[slotId]->checkReturnStatus(retStatus);
3899 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003900 RLOGE("getDataRegistrationStateResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003901 slotId);
3902 }
3903
3904 return 0;
3905}
3906
Amit Mahajan759786a2017-03-03 17:35:47 -08003907int radio::getOperatorResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003908 int responseType, int serial, RIL_Errno e, void *response,
3909 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003910#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003911 RLOGD("getOperatorResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003912#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003913
3914 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003915 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003916 populateResponseInfo(responseInfo, serial, responseType, e);
3917 hidl_string longName;
3918 hidl_string shortName;
3919 hidl_string numeric;
3920 int numStrings = responseLen / sizeof(char *);
3921 if (response == NULL || numStrings != 3) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003922 RLOGE("getOperatorResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003923 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
3924
3925 } else {
3926 char **resp = (char **) response;
3927 longName = convertCharPtrToHidlString(resp[0]);
3928 shortName = convertCharPtrToHidlString(resp[1]);
3929 numeric = convertCharPtrToHidlString(resp[2]);
3930 }
3931 Return<void> retStatus = radioService[slotId]->mRadioResponse->getOperatorResponse(
3932 responseInfo, longName, shortName, numeric);
3933 radioService[slotId]->checkReturnStatus(retStatus);
3934 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003935 RLOGE("getOperatorResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003936 slotId);
3937 }
3938
3939 return 0;
3940}
3941
Amit Mahajan759786a2017-03-03 17:35:47 -08003942int radio::setRadioPowerResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003943 int responseType, int serial, RIL_Errno e, void *response,
3944 size_t responseLen) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003945 RLOGD("setRadioPowerResponse: serial %d", serial);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003946
3947 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003948 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003949 populateResponseInfo(responseInfo, serial, responseType, e);
3950 Return<void> retStatus = radioService[slotId]->mRadioResponse->setRadioPowerResponse(
3951 responseInfo);
3952 radioService[slotId]->checkReturnStatus(retStatus);
3953 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003954 RLOGE("setRadioPowerResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003955 slotId);
3956 }
3957
3958 return 0;
3959}
3960
Amit Mahajan759786a2017-03-03 17:35:47 -08003961int radio::sendDtmfResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003962 int responseType, int serial, RIL_Errno e, void *response,
3963 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003964#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003965 RLOGD("sendDtmfResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003966#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003967
3968 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003969 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003970 populateResponseInfo(responseInfo, serial, responseType, e);
3971 Return<void> retStatus = radioService[slotId]->mRadioResponse->sendDtmfResponse(
3972 responseInfo);
3973 radioService[slotId]->checkReturnStatus(retStatus);
3974 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003975 RLOGE("sendDtmfResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003976 slotId);
3977 }
3978
3979 return 0;
3980}
3981
3982SendSmsResult makeSendSmsResult(RadioResponseInfo& responseInfo, int serial, int responseType,
3983 RIL_Errno e, void *response, size_t responseLen) {
3984 populateResponseInfo(responseInfo, serial, responseType, e);
Jack Yuf68e0da2017-02-07 14:53:09 -08003985 SendSmsResult result = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003986
3987 if (response == NULL || responseLen != sizeof(RIL_SMS_Response)) {
3988 RLOGE("Invalid response: NULL");
3989 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003990 result.ackPDU = hidl_string();
3991 } else {
3992 RIL_SMS_Response *resp = (RIL_SMS_Response *) response;
3993 result.messageRef = resp->messageRef;
3994 result.ackPDU = convertCharPtrToHidlString(resp->ackPDU);
3995 result.errorCode = resp->errorCode;
3996 }
3997 return result;
3998}
3999
Amit Mahajan759786a2017-03-03 17:35:47 -08004000int radio::sendSmsResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004001 int responseType, int serial, RIL_Errno e, void *response,
4002 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004003#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004004 RLOGD("sendSmsResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004005#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004006
4007 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004008 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004009 SendSmsResult result = makeSendSmsResult(responseInfo, serial, responseType, e, response,
4010 responseLen);
4011
4012 Return<void> retStatus = radioService[slotId]->mRadioResponse->sendSmsResponse(responseInfo,
4013 result);
4014 radioService[slotId]->checkReturnStatus(retStatus);
4015 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004016 RLOGE("sendSmsResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004017 }
4018
4019 return 0;
4020}
4021
Amit Mahajan759786a2017-03-03 17:35:47 -08004022int radio::sendSMSExpectMoreResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004023 int responseType, int serial, RIL_Errno e, void *response,
4024 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004025#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004026 RLOGD("sendSMSExpectMoreResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004027#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004028
4029 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004030 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004031 SendSmsResult result = makeSendSmsResult(responseInfo, serial, responseType, e, response,
4032 responseLen);
4033
4034 Return<void> retStatus = radioService[slotId]->mRadioResponse->sendSMSExpectMoreResponse(
4035 responseInfo, result);
4036 radioService[slotId]->checkReturnStatus(retStatus);
4037 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004038 RLOGE("sendSMSExpectMoreResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004039 }
4040
4041 return 0;
4042}
4043
Amit Mahajan759786a2017-03-03 17:35:47 -08004044int radio::setupDataCallResponse(int slotId,
Amit Mahajan3df62912017-02-10 01:35:55 +00004045 int responseType, int serial, RIL_Errno e, void *response,
4046 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004047#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004048 RLOGD("setupDataCallResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004049#endif
Amit Mahajan3df62912017-02-10 01:35:55 +00004050
4051 if (radioService[slotId]->mRadioResponse != NULL) {
Amit Mahajan3da9ac02017-02-13 13:41:28 -08004052 RadioResponseInfo responseInfo = {};
Amit Mahajan3df62912017-02-10 01:35:55 +00004053 populateResponseInfo(responseInfo, serial, responseType, e);
4054
Amit Mahajan3da9ac02017-02-13 13:41:28 -08004055 SetupDataCallResult result = {};
Amit Mahajan13058cb2017-06-07 23:10:27 -07004056 if (response == NULL || (responseLen % sizeof(RIL_Data_Call_Response_v11)) != 0) {
4057 if (response != NULL) {
4058 RLOGE("setupDataCallResponse: Invalid response");
4059 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
4060 }
Jack Yu5079e182017-02-28 15:21:18 -08004061 result.status = DataCallFailCause::ERROR_UNSPECIFIED;
Amit Mahajan3da9ac02017-02-13 13:41:28 -08004062 result.type = hidl_string();
4063 result.ifname = hidl_string();
4064 result.addresses = hidl_string();
4065 result.dnses = hidl_string();
4066 result.gateways = hidl_string();
4067 result.pcscf = hidl_string();
Amit Mahajan3df62912017-02-10 01:35:55 +00004068 } else {
4069 convertRilDataCallToHal((RIL_Data_Call_Response_v11 *) response, result);
4070 }
4071
4072 Return<void> retStatus = radioService[slotId]->mRadioResponse->setupDataCallResponse(
4073 responseInfo, result);
4074 radioService[slotId]->checkReturnStatus(retStatus);
4075 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004076 RLOGE("setupDataCallResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Amit Mahajan3df62912017-02-10 01:35:55 +00004077 }
4078
4079 return 0;
4080}
4081
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004082IccIoResult responseIccIo(RadioResponseInfo& responseInfo, int serial, int responseType,
4083 RIL_Errno e, void *response, size_t responseLen) {
4084 populateResponseInfo(responseInfo, serial, responseType, e);
Jack Yuf68e0da2017-02-07 14:53:09 -08004085 IccIoResult result = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004086
4087 if (response == NULL || responseLen != sizeof(RIL_SIM_IO_Response)) {
4088 RLOGE("Invalid response: NULL");
4089 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004090 result.simResponse = hidl_string();
4091 } else {
4092 RIL_SIM_IO_Response *resp = (RIL_SIM_IO_Response *) response;
4093 result.sw1 = resp->sw1;
4094 result.sw2 = resp->sw2;
4095 result.simResponse = convertCharPtrToHidlString(resp->simResponse);
4096 }
4097 return result;
4098}
4099
Amit Mahajan759786a2017-03-03 17:35:47 -08004100int radio::iccIOForAppResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004101 int responseType, int serial, RIL_Errno e, void *response,
4102 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004103#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004104 RLOGD("iccIOForAppResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004105#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004106
4107 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004108 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004109 IccIoResult result = responseIccIo(responseInfo, serial, responseType, e, response,
4110 responseLen);
4111
4112 Return<void> retStatus = radioService[slotId]->mRadioResponse->iccIOForAppResponse(
4113 responseInfo, result);
4114 radioService[slotId]->checkReturnStatus(retStatus);
4115 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004116 RLOGE("iccIOForAppResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004117 }
4118
4119 return 0;
4120}
4121
Amit Mahajan759786a2017-03-03 17:35:47 -08004122int radio::sendUssdResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004123 int responseType, int serial, RIL_Errno e, void *response,
4124 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004125#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004126 RLOGD("sendUssdResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004127#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004128
4129 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004130 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004131 populateResponseInfo(responseInfo, serial, responseType, e);
4132 Return<void> retStatus = radioService[slotId]->mRadioResponse->sendUssdResponse(
4133 responseInfo);
4134 radioService[slotId]->checkReturnStatus(retStatus);
4135 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004136 RLOGE("sendUssdResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004137 slotId);
4138 }
4139
4140 return 0;
4141}
4142
Amit Mahajan759786a2017-03-03 17:35:47 -08004143int radio::cancelPendingUssdResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004144 int responseType, int serial, RIL_Errno e, void *response,
4145 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004146#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004147 RLOGD("cancelPendingUssdResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004148#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004149
4150 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004151 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004152 populateResponseInfo(responseInfo, serial, responseType, e);
4153 Return<void> retStatus = radioService[slotId]->mRadioResponse->cancelPendingUssdResponse(
4154 responseInfo);
4155 radioService[slotId]->checkReturnStatus(retStatus);
4156 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004157 RLOGE("cancelPendingUssdResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004158 slotId);
4159 }
4160
4161 return 0;
4162}
4163
Amit Mahajan759786a2017-03-03 17:35:47 -08004164int radio::getClirResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004165 int responseType, int serial, RIL_Errno e, void *response,
4166 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004167#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004168 RLOGD("getClirResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004169#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004170
4171 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004172 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004173 populateResponseInfo(responseInfo, serial, responseType, e);
4174 int n = -1, m = -1;
4175 int numInts = responseLen / sizeof(int);
4176 if (response == NULL || numInts != 2) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004177 RLOGE("getClirResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004178 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
4179 } else {
4180 int *pInt = (int *) response;
4181 n = pInt[0];
4182 m = pInt[1];
4183 }
4184 Return<void> retStatus = radioService[slotId]->mRadioResponse->getClirResponse(responseInfo,
4185 n, m);
4186 radioService[slotId]->checkReturnStatus(retStatus);
4187 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004188 RLOGE("getClirResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004189 }
4190
4191 return 0;
4192}
4193
Amit Mahajan759786a2017-03-03 17:35:47 -08004194int radio::setClirResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004195 int responseType, int serial, RIL_Errno e, void *response,
4196 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004197#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004198 RLOGD("setClirResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004199#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004200
4201 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004202 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004203 populateResponseInfo(responseInfo, serial, responseType, e);
4204 Return<void> retStatus = radioService[slotId]->mRadioResponse->setClirResponse(
4205 responseInfo);
4206 radioService[slotId]->checkReturnStatus(retStatus);
4207 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004208 RLOGE("setClirResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004209 }
4210
4211 return 0;
4212}
4213
Amit Mahajan759786a2017-03-03 17:35:47 -08004214int radio::getCallForwardStatusResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004215 int responseType, int serial, RIL_Errno e,
4216 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004217#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004218 RLOGD("getCallForwardStatusResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004219#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004220
4221 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004222 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004223 populateResponseInfo(responseInfo, serial, responseType, e);
4224 hidl_vec<CallForwardInfo> callForwardInfos;
4225
Amit Mahajan13058cb2017-06-07 23:10:27 -07004226 if ((response == NULL && responseLen != 0)
4227 || responseLen % sizeof(RIL_CallForwardInfo *) != 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004228 RLOGE("getCallForwardStatusResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004229 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
4230 } else {
4231 int num = responseLen / sizeof(RIL_CallForwardInfo *);
4232 callForwardInfos.resize(num);
4233 for (int i = 0 ; i < num; i++) {
4234 RIL_CallForwardInfo *resp = ((RIL_CallForwardInfo **) response)[i];
4235 callForwardInfos[i].status = (CallForwardInfoStatus) resp->status;
4236 callForwardInfos[i].reason = resp->reason;
4237 callForwardInfos[i].serviceClass = resp->serviceClass;
4238 callForwardInfos[i].toa = resp->toa;
4239 callForwardInfos[i].number = convertCharPtrToHidlString(resp->number);
4240 callForwardInfos[i].timeSeconds = resp->timeSeconds;
4241 }
4242 }
4243
4244 Return<void> retStatus = radioService[slotId]->mRadioResponse->getCallForwardStatusResponse(
4245 responseInfo, callForwardInfos);
4246 radioService[slotId]->checkReturnStatus(retStatus);
4247 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004248 RLOGE("getCallForwardStatusResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004249 slotId);
4250 }
4251
4252 return 0;
4253}
4254
Amit Mahajan759786a2017-03-03 17:35:47 -08004255int radio::setCallForwardResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004256 int responseType, int serial, RIL_Errno e, void *response,
4257 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004258#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004259 RLOGD("setCallForwardResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004260#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004261
4262 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004263 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004264 populateResponseInfo(responseInfo, serial, responseType, e);
4265 Return<void> retStatus = radioService[slotId]->mRadioResponse->setCallForwardResponse(
4266 responseInfo);
4267 radioService[slotId]->checkReturnStatus(retStatus);
4268 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004269 RLOGE("setCallForwardResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004270 }
4271
4272 return 0;
4273}
4274
Amit Mahajan759786a2017-03-03 17:35:47 -08004275int radio::getCallWaitingResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004276 int responseType, int serial, RIL_Errno e, void *response,
4277 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004278#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004279 RLOGD("getCallWaitingResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004280#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004281
4282 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004283 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004284 populateResponseInfo(responseInfo, serial, responseType, e);
4285 bool enable = false;
4286 int serviceClass = -1;
4287 int numInts = responseLen / sizeof(int);
4288 if (response == NULL || numInts != 2) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004289 RLOGE("getCallWaitingResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004290 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
4291 } else {
4292 int *pInt = (int *) response;
4293 enable = pInt[0] == 1 ? true : false;
4294 serviceClass = pInt[1];
4295 }
Sanket Padawe5375bfa2017-03-07 17:21:05 -08004296 Return<void> retStatus = radioService[slotId]->mRadioResponse->getCallWaitingResponse(
4297 responseInfo, enable, serviceClass);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004298 radioService[slotId]->checkReturnStatus(retStatus);
4299 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004300 RLOGE("getCallWaitingResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004301 }
4302
4303 return 0;
4304}
4305
Amit Mahajan759786a2017-03-03 17:35:47 -08004306int radio::setCallWaitingResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004307 int responseType, int serial, RIL_Errno e, void *response,
4308 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004309#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004310 RLOGD("setCallWaitingResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004311#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004312
4313 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004314 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004315 populateResponseInfo(responseInfo, serial, responseType, e);
4316 Return<void> retStatus = radioService[slotId]->mRadioResponse->setCallWaitingResponse(
4317 responseInfo);
4318 radioService[slotId]->checkReturnStatus(retStatus);
4319 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004320 RLOGE("setCallWaitingResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004321 }
4322
4323 return 0;
4324}
4325
Amit Mahajan759786a2017-03-03 17:35:47 -08004326int radio::acknowledgeLastIncomingGsmSmsResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004327 int responseType, int serial, RIL_Errno e,
4328 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004329#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004330 RLOGD("acknowledgeLastIncomingGsmSmsResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004331#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004332
4333 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004334 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004335 populateResponseInfo(responseInfo, serial, responseType, e);
4336 Return<void> retStatus =
4337 radioService[slotId]->mRadioResponse->acknowledgeLastIncomingGsmSmsResponse(
4338 responseInfo);
4339 radioService[slotId]->checkReturnStatus(retStatus);
4340 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004341 RLOGE("acknowledgeLastIncomingGsmSmsResponse: radioService[%d]->mRadioResponse "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004342 "== NULL", slotId);
4343 }
4344
4345 return 0;
4346}
4347
Amit Mahajan759786a2017-03-03 17:35:47 -08004348int radio::acceptCallResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004349 int responseType, int serial, RIL_Errno e,
4350 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004351#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004352 RLOGD("acceptCallResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004353#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004354
4355 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004356 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004357 populateResponseInfo(responseInfo, serial, responseType, e);
4358 Return<void> retStatus = radioService[slotId]->mRadioResponse->acceptCallResponse(
4359 responseInfo);
4360 radioService[slotId]->checkReturnStatus(retStatus);
4361 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004362 RLOGE("acceptCallResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004363 slotId);
4364 }
4365
4366 return 0;
4367}
4368
Amit Mahajan759786a2017-03-03 17:35:47 -08004369int radio::deactivateDataCallResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004370 int responseType, int serial, RIL_Errno e,
4371 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004372#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004373 RLOGD("deactivateDataCallResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004374#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004375
4376 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004377 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004378 populateResponseInfo(responseInfo, serial, responseType, e);
4379 Return<void> retStatus = radioService[slotId]->mRadioResponse->deactivateDataCallResponse(
4380 responseInfo);
4381 radioService[slotId]->checkReturnStatus(retStatus);
4382 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004383 RLOGE("deactivateDataCallResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004384 slotId);
4385 }
4386
4387 return 0;
4388}
4389
Amit Mahajan759786a2017-03-03 17:35:47 -08004390int radio::getFacilityLockForAppResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004391 int responseType, int serial, RIL_Errno e,
4392 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004393#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004394 RLOGD("getFacilityLockForAppResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004395#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004396
4397 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004398 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004399 int ret = responseInt(responseInfo, serial, responseType, e, response, responseLen);
4400 Return<void> retStatus = radioService[slotId]->mRadioResponse->
4401 getFacilityLockForAppResponse(responseInfo, ret);
4402 radioService[slotId]->checkReturnStatus(retStatus);
4403 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004404 RLOGE("getFacilityLockForAppResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004405 slotId);
4406 }
4407
4408 return 0;
4409}
4410
Amit Mahajan759786a2017-03-03 17:35:47 -08004411int radio::setFacilityLockForAppResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004412 int responseType, int serial, RIL_Errno e,
4413 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004414#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004415 RLOGD("setFacilityLockForAppResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004416#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004417
4418 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004419 RadioResponseInfo responseInfo = {};
Naveen Kalla346bbc02017-03-16 12:55:55 -07004420 int ret = responseIntOrEmpty(responseInfo, serial, responseType, e, response, responseLen);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004421 Return<void> retStatus
4422 = radioService[slotId]->mRadioResponse->setFacilityLockForAppResponse(responseInfo,
4423 ret);
4424 radioService[slotId]->checkReturnStatus(retStatus);
4425 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004426 RLOGE("setFacilityLockForAppResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004427 slotId);
4428 }
4429
4430 return 0;
4431}
4432
Amit Mahajan759786a2017-03-03 17:35:47 -08004433int radio::setBarringPasswordResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004434 int responseType, int serial, RIL_Errno e,
4435 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004436#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004437 RLOGD("acceptCallResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004438#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004439
4440 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004441 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004442 populateResponseInfo(responseInfo, serial, responseType, e);
4443 Return<void> retStatus
4444 = radioService[slotId]->mRadioResponse->setBarringPasswordResponse(responseInfo);
4445 radioService[slotId]->checkReturnStatus(retStatus);
4446 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004447 RLOGE("setBarringPasswordResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004448 slotId);
4449 }
4450
4451 return 0;
4452}
4453
Amit Mahajan759786a2017-03-03 17:35:47 -08004454int radio::getNetworkSelectionModeResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004455 int responseType, int serial, RIL_Errno e, void *response,
4456 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004457#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004458 RLOGD("getNetworkSelectionModeResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004459#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004460
4461 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004462 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004463 populateResponseInfo(responseInfo, serial, responseType, e);
4464 bool manual = false;
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004465 if (response == NULL || responseLen != sizeof(int)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004466 RLOGE("getNetworkSelectionModeResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004467 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
4468 } else {
4469 int *pInt = (int *) response;
4470 manual = pInt[0] == 1 ? true : false;
4471 }
4472 Return<void> retStatus
4473 = radioService[slotId]->mRadioResponse->getNetworkSelectionModeResponse(
4474 responseInfo,
4475 manual);
4476 radioService[slotId]->checkReturnStatus(retStatus);
4477 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004478 RLOGE("getNetworkSelectionModeResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004479 slotId);
4480 }
4481
4482 return 0;
4483}
4484
Amit Mahajan759786a2017-03-03 17:35:47 -08004485int radio::setNetworkSelectionModeAutomaticResponse(int slotId, int responseType, int serial,
4486 RIL_Errno e, void *response,
4487 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004488#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004489 RLOGD("setNetworkSelectionModeAutomaticResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004490#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004491
4492 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004493 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004494 populateResponseInfo(responseInfo, serial, responseType, e);
4495 Return<void> retStatus
4496 = radioService[slotId]->mRadioResponse->setNetworkSelectionModeAutomaticResponse(
4497 responseInfo);
4498 radioService[slotId]->checkReturnStatus(retStatus);
4499 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004500 RLOGE("setNetworkSelectionModeAutomaticResponse: radioService[%d]->mRadioResponse "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004501 "== NULL", slotId);
4502 }
4503
4504 return 0;
4505}
4506
Amit Mahajan759786a2017-03-03 17:35:47 -08004507int radio::setNetworkSelectionModeManualResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004508 int responseType, int serial, RIL_Errno e,
4509 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004510#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004511 RLOGD("setNetworkSelectionModeManualResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004512#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004513
4514 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004515 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004516 populateResponseInfo(responseInfo, serial, responseType, e);
4517 Return<void> retStatus
4518 = radioService[slotId]->mRadioResponse->setNetworkSelectionModeManualResponse(
4519 responseInfo);
4520 radioService[slotId]->checkReturnStatus(retStatus);
4521 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004522 RLOGE("acceptCallResponse: radioService[%d]->setNetworkSelectionModeManualResponse "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004523 "== NULL", slotId);
4524 }
4525
4526 return 0;
4527}
4528
Jack Yuf68e0da2017-02-07 14:53:09 -08004529int convertOperatorStatusToInt(const char *str) {
4530 if (strncmp("unknown", str, 9) == 0) {
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004531 return (int) OperatorStatus::UNKNOWN;
Jack Yuf68e0da2017-02-07 14:53:09 -08004532 } else if (strncmp("available", str, 9) == 0) {
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004533 return (int) OperatorStatus::AVAILABLE;
Jack Yuf68e0da2017-02-07 14:53:09 -08004534 } else if (strncmp("current", str, 9) == 0) {
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004535 return (int) OperatorStatus::CURRENT;
Jack Yuf68e0da2017-02-07 14:53:09 -08004536 } else if (strncmp("forbidden", str, 9) == 0) {
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004537 return (int) OperatorStatus::FORBIDDEN;
4538 } else {
4539 return -1;
4540 }
4541}
4542
Amit Mahajan759786a2017-03-03 17:35:47 -08004543int radio::getAvailableNetworksResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004544 int responseType, int serial, RIL_Errno e, void *response,
4545 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004546#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004547 RLOGD("getAvailableNetworksResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004548#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004549
4550 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004551 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004552 populateResponseInfo(responseInfo, serial, responseType, e);
4553 hidl_vec<OperatorInfo> networks;
Amit Mahajan13058cb2017-06-07 23:10:27 -07004554 if ((response == NULL && responseLen != 0)
4555 || responseLen % (4 * sizeof(char *))!= 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004556 RLOGE("getAvailableNetworksResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004557 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
4558 } else {
4559 char **resp = (char **) response;
4560 int numStrings = responseLen / sizeof(char *);
4561 networks.resize(numStrings/4);
Jayachandran Ce0d755c2017-03-01 18:26:50 -08004562 for (int i = 0, j = 0; i < numStrings; i = i + 4, j++) {
4563 networks[j].alphaLong = convertCharPtrToHidlString(resp[i]);
4564 networks[j].alphaShort = convertCharPtrToHidlString(resp[i + 1]);
4565 networks[j].operatorNumeric = convertCharPtrToHidlString(resp[i + 2]);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004566 int status = convertOperatorStatusToInt(resp[i + 3]);
4567 if (status == -1) {
4568 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
4569 } else {
Jayachandran Ce0d755c2017-03-01 18:26:50 -08004570 networks[j].status = (OperatorStatus) status;
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004571 }
4572 }
4573 }
4574 Return<void> retStatus
4575 = radioService[slotId]->mRadioResponse->getAvailableNetworksResponse(responseInfo,
4576 networks);
4577 radioService[slotId]->checkReturnStatus(retStatus);
4578 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004579 RLOGE("getAvailableNetworksResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004580 slotId);
4581 }
4582
4583 return 0;
4584}
4585
Amit Mahajan759786a2017-03-03 17:35:47 -08004586int radio::startDtmfResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004587 int responseType, int serial, RIL_Errno e,
4588 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004589#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004590 RLOGD("startDtmfResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004591#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004592
4593 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004594 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004595 populateResponseInfo(responseInfo, serial, responseType, e);
4596 Return<void> retStatus
4597 = radioService[slotId]->mRadioResponse->startDtmfResponse(responseInfo);
4598 radioService[slotId]->checkReturnStatus(retStatus);
4599 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004600 RLOGE("startDtmfResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004601 }
4602
4603 return 0;
4604}
4605
Amit Mahajan759786a2017-03-03 17:35:47 -08004606int radio::stopDtmfResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004607 int responseType, int serial, RIL_Errno e,
4608 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004609#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004610 RLOGD("stopDtmfResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004611#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004612
4613 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004614 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004615 populateResponseInfo(responseInfo, serial, responseType, e);
4616 Return<void> retStatus
4617 = radioService[slotId]->mRadioResponse->stopDtmfResponse(responseInfo);
4618 radioService[slotId]->checkReturnStatus(retStatus);
4619 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004620 RLOGE("stopDtmfResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004621 }
4622
4623 return 0;
4624}
4625
Amit Mahajan759786a2017-03-03 17:35:47 -08004626int radio::getBasebandVersionResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004627 int responseType, int serial, RIL_Errno e,
4628 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004629#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004630 RLOGD("getBasebandVersionResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004631#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004632
4633 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004634 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004635 populateResponseInfo(responseInfo, serial, responseType, e);
4636 Return<void> retStatus
4637 = radioService[slotId]->mRadioResponse->getBasebandVersionResponse(responseInfo,
4638 convertCharPtrToHidlString((char *) response));
4639 radioService[slotId]->checkReturnStatus(retStatus);
4640 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004641 RLOGE("getBasebandVersionResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004642 }
4643
4644 return 0;
4645}
4646
Amit Mahajan759786a2017-03-03 17:35:47 -08004647int radio::separateConnectionResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004648 int responseType, int serial, RIL_Errno e,
4649 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004650#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004651 RLOGD("separateConnectionResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004652#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004653
4654 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004655 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004656 populateResponseInfo(responseInfo, serial, responseType, e);
4657 Return<void> retStatus
4658 = radioService[slotId]->mRadioResponse->separateConnectionResponse(responseInfo);
4659 radioService[slotId]->checkReturnStatus(retStatus);
4660 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004661 RLOGE("separateConnectionResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004662 slotId);
4663 }
4664
4665 return 0;
4666}
4667
Amit Mahajan759786a2017-03-03 17:35:47 -08004668int radio::setMuteResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004669 int responseType, int serial, RIL_Errno e,
4670 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004671#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004672 RLOGD("setMuteResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004673#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004674
4675 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004676 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004677 populateResponseInfo(responseInfo, serial, responseType, e);
4678 Return<void> retStatus
4679 = radioService[slotId]->mRadioResponse->setMuteResponse(responseInfo);
4680 radioService[slotId]->checkReturnStatus(retStatus);
4681 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004682 RLOGE("setMuteResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004683 }
4684
4685 return 0;
4686}
4687
Amit Mahajan759786a2017-03-03 17:35:47 -08004688int radio::getMuteResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004689 int responseType, int serial, RIL_Errno e, void *response,
4690 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004691#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004692 RLOGD("getMuteResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004693#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004694
4695 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004696 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004697 populateResponseInfo(responseInfo, serial, responseType, e);
4698 bool enable = false;
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004699 if (response == NULL || responseLen != sizeof(int)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004700 RLOGE("getMuteResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004701 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
4702 } else {
4703 int *pInt = (int *) response;
4704 enable = pInt[0] == 1 ? true : false;
4705 }
4706 Return<void> retStatus = radioService[slotId]->mRadioResponse->getMuteResponse(responseInfo,
4707 enable);
4708 radioService[slotId]->checkReturnStatus(retStatus);
4709 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004710 RLOGE("getMuteResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004711 }
4712
4713 return 0;
4714}
4715
Amit Mahajan759786a2017-03-03 17:35:47 -08004716int radio::getClipResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004717 int responseType, int serial, RIL_Errno e,
4718 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004719#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004720 RLOGD("getClipResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004721#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004722
4723 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004724 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004725 int ret = responseInt(responseInfo, serial, responseType, e, response, responseLen);
4726 Return<void> retStatus = radioService[slotId]->mRadioResponse->getClipResponse(responseInfo,
4727 (ClipStatus) ret);
4728 radioService[slotId]->checkReturnStatus(retStatus);
4729 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004730 RLOGE("getClipResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004731 }
4732
4733 return 0;
4734}
4735
Amit Mahajan759786a2017-03-03 17:35:47 -08004736int radio::getDataCallListResponse(int slotId,
Amit Mahajan3df62912017-02-10 01:35:55 +00004737 int responseType, int serial, RIL_Errno e,
4738 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004739#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004740 RLOGD("getDataCallListResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004741#endif
Amit Mahajan3df62912017-02-10 01:35:55 +00004742
4743 if (radioService[slotId]->mRadioResponse != NULL) {
Amit Mahajan3da9ac02017-02-13 13:41:28 -08004744 RadioResponseInfo responseInfo = {};
Amit Mahajan3df62912017-02-10 01:35:55 +00004745 populateResponseInfo(responseInfo, serial, responseType, e);
4746
4747 hidl_vec<SetupDataCallResult> ret;
Amit Mahajan13058cb2017-06-07 23:10:27 -07004748 if ((response == NULL && responseLen != 0)
4749 || responseLen % sizeof(RIL_Data_Call_Response_v11) != 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004750 RLOGE("getDataCallListResponse: invalid response");
Amit Mahajan3df62912017-02-10 01:35:55 +00004751 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
4752 } else {
4753 convertRilDataCallListToHal(response, responseLen, ret);
4754 }
4755
4756 Return<void> retStatus = radioService[slotId]->mRadioResponse->getDataCallListResponse(
4757 responseInfo, ret);
4758 radioService[slotId]->checkReturnStatus(retStatus);
4759 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004760 RLOGE("getDataCallListResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Amit Mahajan3df62912017-02-10 01:35:55 +00004761 }
4762
4763 return 0;
4764}
4765
Amit Mahajan759786a2017-03-03 17:35:47 -08004766int radio::setSuppServiceNotificationsResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004767 int responseType, int serial, RIL_Errno e,
4768 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004769#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004770 RLOGD("setSuppServiceNotificationsResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004771#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004772
4773 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004774 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004775 populateResponseInfo(responseInfo, serial, responseType, e);
4776 Return<void> retStatus
4777 = radioService[slotId]->mRadioResponse->setSuppServiceNotificationsResponse(
4778 responseInfo);
4779 radioService[slotId]->checkReturnStatus(retStatus);
4780 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004781 RLOGE("setSuppServiceNotificationsResponse: radioService[%d]->mRadioResponse "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004782 "== NULL", slotId);
4783 }
4784
4785 return 0;
4786}
4787
Amit Mahajan759786a2017-03-03 17:35:47 -08004788int radio::deleteSmsOnSimResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004789 int responseType, int serial, RIL_Errno e,
4790 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004791#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004792 RLOGD("deleteSmsOnSimResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004793#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004794
4795 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004796 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004797 populateResponseInfo(responseInfo, serial, responseType, e);
4798 Return<void> retStatus
4799 = radioService[slotId]->mRadioResponse->deleteSmsOnSimResponse(responseInfo);
4800 radioService[slotId]->checkReturnStatus(retStatus);
4801 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004802 RLOGE("deleteSmsOnSimResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004803 }
4804
4805 return 0;
4806}
4807
Amit Mahajan759786a2017-03-03 17:35:47 -08004808int radio::setBandModeResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004809 int responseType, int serial, RIL_Errno e,
4810 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004811#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004812 RLOGD("setBandModeResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004813#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004814
4815 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004816 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004817 populateResponseInfo(responseInfo, serial, responseType, e);
4818 Return<void> retStatus
4819 = radioService[slotId]->mRadioResponse->setBandModeResponse(responseInfo);
4820 radioService[slotId]->checkReturnStatus(retStatus);
4821 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004822 RLOGE("setBandModeResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004823 }
4824
4825 return 0;
4826}
4827
Amit Mahajan759786a2017-03-03 17:35:47 -08004828int radio::writeSmsToSimResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004829 int responseType, int serial, RIL_Errno e,
4830 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004831#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004832 RLOGD("writeSmsToSimResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004833#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004834
4835 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004836 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004837 int ret = responseInt(responseInfo, serial, responseType, e, response, responseLen);
4838 Return<void> retStatus
4839 = radioService[slotId]->mRadioResponse->writeSmsToSimResponse(responseInfo, ret);
4840 radioService[slotId]->checkReturnStatus(retStatus);
4841 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004842 RLOGE("writeSmsToSimResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004843 }
4844
4845 return 0;
4846}
4847
Amit Mahajan759786a2017-03-03 17:35:47 -08004848int radio::getAvailableBandModesResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004849 int responseType, int serial, RIL_Errno e, void *response,
4850 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004851#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004852 RLOGD("getAvailableBandModesResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004853#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004854
4855 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004856 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004857 populateResponseInfo(responseInfo, serial, responseType, e);
4858 hidl_vec<RadioBandMode> modes;
Amit Mahajan13058cb2017-06-07 23:10:27 -07004859 if ((response == NULL && responseLen != 0)|| responseLen % sizeof(int) != 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004860 RLOGE("getAvailableBandModesResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004861 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
4862 } else {
4863 int *pInt = (int *) response;
4864 int numInts = responseLen / sizeof(int);
4865 modes.resize(numInts);
4866 for (int i = 0; i < numInts; i++) {
4867 modes[i] = (RadioBandMode) pInt[i];
4868 }
4869 }
4870 Return<void> retStatus
4871 = radioService[slotId]->mRadioResponse->getAvailableBandModesResponse(responseInfo,
4872 modes);
4873 radioService[slotId]->checkReturnStatus(retStatus);
4874 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004875 RLOGE("getAvailableBandModesResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004876 slotId);
4877 }
4878
4879 return 0;
4880}
4881
Amit Mahajan759786a2017-03-03 17:35:47 -08004882int radio::sendEnvelopeResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004883 int responseType, int serial, RIL_Errno e,
4884 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004885#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004886 RLOGD("sendEnvelopeResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004887#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004888
4889 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004890 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004891 populateResponseInfo(responseInfo, serial, responseType, e);
4892 Return<void> retStatus
4893 = radioService[slotId]->mRadioResponse->sendEnvelopeResponse(responseInfo,
4894 convertCharPtrToHidlString((char *) response));
4895 radioService[slotId]->checkReturnStatus(retStatus);
4896 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004897 RLOGE("sendEnvelopeResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004898 }
4899
4900 return 0;
4901}
4902
Amit Mahajan759786a2017-03-03 17:35:47 -08004903int radio::sendTerminalResponseToSimResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004904 int responseType, int serial, RIL_Errno e,
4905 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004906#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004907 RLOGD("sendTerminalResponseToSimResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004908#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004909
4910 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004911 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004912 populateResponseInfo(responseInfo, serial, responseType, e);
4913 Return<void> retStatus
4914 = radioService[slotId]->mRadioResponse->sendTerminalResponseToSimResponse(
4915 responseInfo);
4916 radioService[slotId]->checkReturnStatus(retStatus);
4917 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004918 RLOGE("sendTerminalResponseToSimResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004919 slotId);
4920 }
4921
4922 return 0;
4923}
4924
Amit Mahajan759786a2017-03-03 17:35:47 -08004925int radio::handleStkCallSetupRequestFromSimResponse(int slotId,
4926 int responseType, int serial,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004927 RIL_Errno e, void *response,
4928 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004929#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004930 RLOGD("handleStkCallSetupRequestFromSimResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004931#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004932
4933 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004934 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004935 populateResponseInfo(responseInfo, serial, responseType, e);
4936 Return<void> retStatus
4937 = radioService[slotId]->mRadioResponse->handleStkCallSetupRequestFromSimResponse(
4938 responseInfo);
4939 radioService[slotId]->checkReturnStatus(retStatus);
4940 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004941 RLOGE("handleStkCallSetupRequestFromSimResponse: radioService[%d]->mRadioResponse "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004942 "== NULL", slotId);
4943 }
4944
4945 return 0;
4946}
4947
Amit Mahajan759786a2017-03-03 17:35:47 -08004948int radio::explicitCallTransferResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004949 int responseType, int serial, RIL_Errno e,
4950 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004951#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004952 RLOGD("explicitCallTransferResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004953#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004954
4955 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004956 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004957 populateResponseInfo(responseInfo, serial, responseType, e);
4958 Return<void> retStatus
4959 = radioService[slotId]->mRadioResponse->explicitCallTransferResponse(responseInfo);
4960 radioService[slotId]->checkReturnStatus(retStatus);
4961 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004962 RLOGE("explicitCallTransferResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004963 slotId);
4964 }
4965
4966 return 0;
4967}
4968
Amit Mahajan759786a2017-03-03 17:35:47 -08004969int radio::setPreferredNetworkTypeResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004970 int responseType, int serial, RIL_Errno e,
4971 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004972#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004973 RLOGD("setPreferredNetworkTypeResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004974#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004975
4976 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004977 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004978 populateResponseInfo(responseInfo, serial, responseType, e);
4979 Return<void> retStatus
4980 = radioService[slotId]->mRadioResponse->setPreferredNetworkTypeResponse(
4981 responseInfo);
4982 radioService[slotId]->checkReturnStatus(retStatus);
4983 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004984 RLOGE("setPreferredNetworkTypeResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004985 slotId);
4986 }
4987
4988 return 0;
4989}
4990
4991
Amit Mahajan759786a2017-03-03 17:35:47 -08004992int radio::getPreferredNetworkTypeResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004993 int responseType, int serial, RIL_Errno e,
4994 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004995#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004996 RLOGD("getPreferredNetworkTypeResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004997#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004998
4999 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005000 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005001 int ret = responseInt(responseInfo, serial, responseType, e, response, responseLen);
5002 Return<void> retStatus
5003 = radioService[slotId]->mRadioResponse->getPreferredNetworkTypeResponse(
5004 responseInfo, (PreferredNetworkType) ret);
5005 radioService[slotId]->checkReturnStatus(retStatus);
5006 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005007 RLOGE("getPreferredNetworkTypeResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005008 slotId);
5009 }
5010
5011 return 0;
5012}
5013
Amit Mahajan759786a2017-03-03 17:35:47 -08005014int radio::getNeighboringCidsResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005015 int responseType, int serial, RIL_Errno e,
5016 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005017#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005018 RLOGD("getNeighboringCidsResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005019#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005020
5021 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005022 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005023 populateResponseInfo(responseInfo, serial, responseType, e);
5024 hidl_vec<NeighboringCell> cells;
5025
Amit Mahajan13058cb2017-06-07 23:10:27 -07005026 if ((response == NULL && responseLen != 0)
5027 || responseLen % sizeof(RIL_NeighboringCell *) != 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005028 RLOGE("getNeighboringCidsResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005029 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
5030 } else {
5031 int num = responseLen / sizeof(RIL_NeighboringCell *);
5032 cells.resize(num);
5033 for (int i = 0 ; i < num; i++) {
5034 RIL_NeighboringCell *resp = ((RIL_NeighboringCell **) response)[i];
5035 cells[i].cid = convertCharPtrToHidlString(resp->cid);
5036 cells[i].rssi = resp->rssi;
5037 }
5038 }
5039
5040 Return<void> retStatus
5041 = radioService[slotId]->mRadioResponse->getNeighboringCidsResponse(responseInfo,
5042 cells);
5043 radioService[slotId]->checkReturnStatus(retStatus);
5044 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005045 RLOGE("getNeighboringCidsResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005046 slotId);
5047 }
5048
5049 return 0;
5050}
5051
Amit Mahajan759786a2017-03-03 17:35:47 -08005052int radio::setLocationUpdatesResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005053 int responseType, int serial, RIL_Errno e,
5054 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005055#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005056 RLOGD("setLocationUpdatesResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005057#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005058
5059 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005060 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005061 populateResponseInfo(responseInfo, serial, responseType, e);
5062 Return<void> retStatus
5063 = radioService[slotId]->mRadioResponse->setLocationUpdatesResponse(responseInfo);
5064 radioService[slotId]->checkReturnStatus(retStatus);
5065 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005066 RLOGE("setLocationUpdatesResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005067 slotId);
5068 }
5069
5070 return 0;
5071}
5072
Amit Mahajan759786a2017-03-03 17:35:47 -08005073int radio::setCdmaSubscriptionSourceResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005074 int responseType, int serial, RIL_Errno e,
5075 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005076#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005077 RLOGD("setCdmaSubscriptionSourceResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005078#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005079
5080 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005081 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005082 populateResponseInfo(responseInfo, serial, responseType, e);
5083 Return<void> retStatus
5084 = radioService[slotId]->mRadioResponse->setCdmaSubscriptionSourceResponse(
5085 responseInfo);
5086 radioService[slotId]->checkReturnStatus(retStatus);
5087 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005088 RLOGE("setCdmaSubscriptionSourceResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005089 slotId);
5090 }
5091
5092 return 0;
5093}
5094
Amit Mahajan759786a2017-03-03 17:35:47 -08005095int radio::setCdmaRoamingPreferenceResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005096 int responseType, int serial, RIL_Errno e,
5097 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005098#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005099 RLOGD("setCdmaRoamingPreferenceResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005100#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005101
5102 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005103 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005104 populateResponseInfo(responseInfo, serial, responseType, e);
5105 Return<void> retStatus
5106 = radioService[slotId]->mRadioResponse->setCdmaRoamingPreferenceResponse(
5107 responseInfo);
5108 radioService[slotId]->checkReturnStatus(retStatus);
5109 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005110 RLOGE("setCdmaRoamingPreferenceResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005111 slotId);
5112 }
5113
5114 return 0;
5115}
5116
Amit Mahajan759786a2017-03-03 17:35:47 -08005117int radio::getCdmaRoamingPreferenceResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005118 int responseType, int serial, RIL_Errno e,
5119 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005120#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005121 RLOGD("getCdmaRoamingPreferenceResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005122#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005123
5124 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005125 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005126 int ret = responseInt(responseInfo, serial, responseType, e, response, responseLen);
5127 Return<void> retStatus
5128 = radioService[slotId]->mRadioResponse->getCdmaRoamingPreferenceResponse(
5129 responseInfo, (CdmaRoamingType) ret);
5130 radioService[slotId]->checkReturnStatus(retStatus);
5131 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005132 RLOGE("getCdmaRoamingPreferenceResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005133 slotId);
5134 }
5135
5136 return 0;
5137}
5138
Amit Mahajan759786a2017-03-03 17:35:47 -08005139int radio::setTTYModeResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005140 int responseType, int serial, RIL_Errno e,
5141 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005142#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005143 RLOGD("setTTYModeResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005144#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005145
5146 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005147 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005148 populateResponseInfo(responseInfo, serial, responseType, e);
5149 Return<void> retStatus
5150 = radioService[slotId]->mRadioResponse->setTTYModeResponse(responseInfo);
5151 radioService[slotId]->checkReturnStatus(retStatus);
5152 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005153 RLOGE("setTTYModeResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005154 }
5155
5156 return 0;
5157}
5158
Amit Mahajan759786a2017-03-03 17:35:47 -08005159int radio::getTTYModeResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005160 int responseType, int serial, RIL_Errno e,
5161 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005162#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005163 RLOGD("getTTYModeResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005164#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005165
5166 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005167 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005168 int ret = responseInt(responseInfo, serial, responseType, e, response, responseLen);
5169 Return<void> retStatus
5170 = radioService[slotId]->mRadioResponse->getTTYModeResponse(responseInfo,
5171 (TtyMode) ret);
5172 radioService[slotId]->checkReturnStatus(retStatus);
5173 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005174 RLOGE("getTTYModeResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005175 }
5176
5177 return 0;
5178}
5179
Amit Mahajan759786a2017-03-03 17:35:47 -08005180int radio::setPreferredVoicePrivacyResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005181 int responseType, int serial, RIL_Errno e,
5182 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005183#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005184 RLOGD("setPreferredVoicePrivacyResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005185#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005186
5187 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005188 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005189 populateResponseInfo(responseInfo, serial, responseType, e);
5190 Return<void> retStatus
5191 = radioService[slotId]->mRadioResponse->setPreferredVoicePrivacyResponse(
5192 responseInfo);
5193 radioService[slotId]->checkReturnStatus(retStatus);
5194 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005195 RLOGE("setPreferredVoicePrivacyResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005196 slotId);
5197 }
5198
5199 return 0;
5200}
5201
Amit Mahajan759786a2017-03-03 17:35:47 -08005202int radio::getPreferredVoicePrivacyResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005203 int responseType, int serial, RIL_Errno e,
5204 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005205#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005206 RLOGD("getPreferredVoicePrivacyResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005207#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005208
5209 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005210 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005211 populateResponseInfo(responseInfo, serial, responseType, e);
5212 bool enable = false;
5213 int numInts = responseLen / sizeof(int);
5214 if (response == NULL || numInts != 1) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005215 RLOGE("getPreferredVoicePrivacyResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005216 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
5217 } else {
5218 int *pInt = (int *) response;
5219 enable = pInt[0] == 1 ? true : false;
5220 }
5221 Return<void> retStatus
5222 = radioService[slotId]->mRadioResponse->getPreferredVoicePrivacyResponse(
5223 responseInfo, enable);
5224 radioService[slotId]->checkReturnStatus(retStatus);
5225 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005226 RLOGE("getPreferredVoicePrivacyResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005227 slotId);
5228 }
5229
5230 return 0;
5231}
5232
Amit Mahajan759786a2017-03-03 17:35:47 -08005233int radio::sendCDMAFeatureCodeResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005234 int responseType, int serial, RIL_Errno e,
5235 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005236#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005237 RLOGD("sendCDMAFeatureCodeResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005238#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005239
5240 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005241 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005242 populateResponseInfo(responseInfo, serial, responseType, e);
5243 Return<void> retStatus
5244 = radioService[slotId]->mRadioResponse->sendCDMAFeatureCodeResponse(responseInfo);
5245 radioService[slotId]->checkReturnStatus(retStatus);
5246 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005247 RLOGE("sendCDMAFeatureCodeResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005248 slotId);
5249 }
5250
5251 return 0;
5252}
5253
Amit Mahajan759786a2017-03-03 17:35:47 -08005254int radio::sendBurstDtmfResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005255 int responseType, int serial, RIL_Errno e,
5256 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005257#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005258 RLOGD("sendBurstDtmfResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005259#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005260
5261 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005262 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005263 populateResponseInfo(responseInfo, serial, responseType, e);
5264 Return<void> retStatus
5265 = radioService[slotId]->mRadioResponse->sendBurstDtmfResponse(responseInfo);
5266 radioService[slotId]->checkReturnStatus(retStatus);
5267 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005268 RLOGE("sendBurstDtmfResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005269 }
5270
5271 return 0;
5272}
5273
Amit Mahajan759786a2017-03-03 17:35:47 -08005274int radio::sendCdmaSmsResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005275 int responseType, int serial, RIL_Errno e, void *response,
5276 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005277#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005278 RLOGD("sendCdmaSmsResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005279#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005280
5281 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005282 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005283 SendSmsResult result = makeSendSmsResult(responseInfo, serial, responseType, e, response,
5284 responseLen);
5285
5286 Return<void> retStatus
5287 = radioService[slotId]->mRadioResponse->sendCdmaSmsResponse(responseInfo, result);
5288 radioService[slotId]->checkReturnStatus(retStatus);
5289 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005290 RLOGE("sendCdmaSmsResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005291 }
5292
5293 return 0;
5294}
5295
Amit Mahajan759786a2017-03-03 17:35:47 -08005296int radio::acknowledgeLastIncomingCdmaSmsResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005297 int responseType, int serial, RIL_Errno e,
5298 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005299#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005300 RLOGD("acknowledgeLastIncomingCdmaSmsResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005301#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005302
5303 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005304 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005305 populateResponseInfo(responseInfo, serial, responseType, e);
5306 Return<void> retStatus
5307 = radioService[slotId]->mRadioResponse->acknowledgeLastIncomingCdmaSmsResponse(
5308 responseInfo);
5309 radioService[slotId]->checkReturnStatus(retStatus);
5310 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005311 RLOGE("acknowledgeLastIncomingCdmaSmsResponse: radioService[%d]->mRadioResponse "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005312 "== NULL", slotId);
5313 }
5314
5315 return 0;
5316}
5317
Amit Mahajan759786a2017-03-03 17:35:47 -08005318int radio::getGsmBroadcastConfigResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005319 int responseType, int serial, RIL_Errno e,
5320 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005321#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005322 RLOGD("getGsmBroadcastConfigResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005323#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005324
5325 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005326 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005327 populateResponseInfo(responseInfo, serial, responseType, e);
5328 hidl_vec<GsmBroadcastSmsConfigInfo> configs;
5329
Amit Mahajan13058cb2017-06-07 23:10:27 -07005330 if ((response == NULL && responseLen != 0)
5331 || responseLen % sizeof(RIL_GSM_BroadcastSmsConfigInfo *) != 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005332 RLOGE("getGsmBroadcastConfigResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005333 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
5334 } else {
5335 int num = responseLen / sizeof(RIL_GSM_BroadcastSmsConfigInfo *);
5336 configs.resize(num);
5337 for (int i = 0 ; i < num; i++) {
5338 RIL_GSM_BroadcastSmsConfigInfo *resp =
5339 ((RIL_GSM_BroadcastSmsConfigInfo **) response)[i];
5340 configs[i].fromServiceId = resp->fromServiceId;
5341 configs[i].toServiceId = resp->toServiceId;
5342 configs[i].fromCodeScheme = resp->fromCodeScheme;
5343 configs[i].toCodeScheme = resp->toCodeScheme;
5344 configs[i].selected = resp->selected == 1 ? true : false;
5345 }
5346 }
5347
5348 Return<void> retStatus
5349 = radioService[slotId]->mRadioResponse->getGsmBroadcastConfigResponse(responseInfo,
5350 configs);
5351 radioService[slotId]->checkReturnStatus(retStatus);
5352 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005353 RLOGE("getGsmBroadcastConfigResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005354 slotId);
5355 }
5356
5357 return 0;
5358}
5359
Amit Mahajan759786a2017-03-03 17:35:47 -08005360int radio::setGsmBroadcastConfigResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005361 int responseType, int serial, RIL_Errno e,
5362 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005363#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005364 RLOGD("setGsmBroadcastConfigResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005365#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005366
5367 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005368 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005369 populateResponseInfo(responseInfo, serial, responseType, e);
5370 Return<void> retStatus
5371 = radioService[slotId]->mRadioResponse->setGsmBroadcastConfigResponse(responseInfo);
5372 radioService[slotId]->checkReturnStatus(retStatus);
5373 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005374 RLOGE("setGsmBroadcastConfigResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005375 slotId);
5376 }
5377
5378 return 0;
5379}
5380
Amit Mahajan759786a2017-03-03 17:35:47 -08005381int radio::setGsmBroadcastActivationResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005382 int responseType, int serial, RIL_Errno e,
5383 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005384#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005385 RLOGD("setGsmBroadcastActivationResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005386#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005387
5388 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005389 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005390 populateResponseInfo(responseInfo, serial, responseType, e);
5391 Return<void> retStatus
5392 = radioService[slotId]->mRadioResponse->setGsmBroadcastActivationResponse(
5393 responseInfo);
5394 radioService[slotId]->checkReturnStatus(retStatus);
5395 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005396 RLOGE("setGsmBroadcastActivationResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005397 slotId);
5398 }
5399
5400 return 0;
5401}
5402
Amit Mahajan759786a2017-03-03 17:35:47 -08005403int radio::getCdmaBroadcastConfigResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005404 int responseType, int serial, RIL_Errno e,
5405 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005406#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005407 RLOGD("getCdmaBroadcastConfigResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005408#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005409
5410 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005411 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005412 populateResponseInfo(responseInfo, serial, responseType, e);
5413 hidl_vec<CdmaBroadcastSmsConfigInfo> configs;
5414
Amit Mahajan13058cb2017-06-07 23:10:27 -07005415 if ((response == NULL && responseLen != 0)
5416 || responseLen % sizeof(RIL_CDMA_BroadcastSmsConfigInfo *) != 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005417 RLOGE("getCdmaBroadcastConfigResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005418 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
5419 } else {
5420 int num = responseLen / sizeof(RIL_CDMA_BroadcastSmsConfigInfo *);
5421 configs.resize(num);
5422 for (int i = 0 ; i < num; i++) {
5423 RIL_CDMA_BroadcastSmsConfigInfo *resp =
5424 ((RIL_CDMA_BroadcastSmsConfigInfo **) response)[i];
5425 configs[i].serviceCategory = resp->service_category;
5426 configs[i].language = resp->language;
5427 configs[i].selected = resp->selected == 1 ? true : false;
5428 }
5429 }
5430
5431 Return<void> retStatus
5432 = radioService[slotId]->mRadioResponse->getCdmaBroadcastConfigResponse(responseInfo,
5433 configs);
5434 radioService[slotId]->checkReturnStatus(retStatus);
5435 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005436 RLOGE("getCdmaBroadcastConfigResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005437 slotId);
5438 }
5439
5440 return 0;
5441}
5442
Amit Mahajan759786a2017-03-03 17:35:47 -08005443int radio::setCdmaBroadcastConfigResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005444 int responseType, int serial, RIL_Errno e,
5445 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005446#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005447 RLOGD("setCdmaBroadcastConfigResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005448#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005449
5450 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005451 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005452 populateResponseInfo(responseInfo, serial, responseType, e);
5453 Return<void> retStatus
5454 = radioService[slotId]->mRadioResponse->setCdmaBroadcastConfigResponse(
5455 responseInfo);
5456 radioService[slotId]->checkReturnStatus(retStatus);
5457 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005458 RLOGE("setCdmaBroadcastConfigResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005459 slotId);
5460 }
5461
5462 return 0;
5463}
5464
Amit Mahajan759786a2017-03-03 17:35:47 -08005465int radio::setCdmaBroadcastActivationResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005466 int responseType, int serial, RIL_Errno e,
5467 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005468#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005469 RLOGD("setCdmaBroadcastActivationResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005470#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005471
5472 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005473 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005474 populateResponseInfo(responseInfo, serial, responseType, e);
5475 Return<void> retStatus
5476 = radioService[slotId]->mRadioResponse->setCdmaBroadcastActivationResponse(
5477 responseInfo);
5478 radioService[slotId]->checkReturnStatus(retStatus);
5479 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005480 RLOGE("setCdmaBroadcastActivationResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005481 slotId);
5482 }
5483
5484 return 0;
5485}
5486
Amit Mahajan759786a2017-03-03 17:35:47 -08005487int radio::getCDMASubscriptionResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005488 int responseType, int serial, RIL_Errno e, void *response,
5489 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005490#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005491 RLOGD("getCDMASubscriptionResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005492#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005493
5494 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005495 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005496 populateResponseInfo(responseInfo, serial, responseType, e);
5497
5498 int numStrings = responseLen / sizeof(char *);
5499 hidl_string emptyString;
5500 if (response == NULL || numStrings != 5) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005501 RLOGE("getOperatorResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005502 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
5503 Return<void> retStatus
5504 = radioService[slotId]->mRadioResponse->getCDMASubscriptionResponse(
5505 responseInfo, emptyString, emptyString, emptyString, emptyString, emptyString);
5506 radioService[slotId]->checkReturnStatus(retStatus);
5507 } else {
5508 char **resp = (char **) response;
5509 Return<void> retStatus
5510 = radioService[slotId]->mRadioResponse->getCDMASubscriptionResponse(
5511 responseInfo,
5512 convertCharPtrToHidlString(resp[0]),
5513 convertCharPtrToHidlString(resp[1]),
5514 convertCharPtrToHidlString(resp[2]),
5515 convertCharPtrToHidlString(resp[3]),
5516 convertCharPtrToHidlString(resp[4]));
5517 radioService[slotId]->checkReturnStatus(retStatus);
5518 }
5519 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005520 RLOGE("getCDMASubscriptionResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005521 slotId);
5522 }
5523
5524 return 0;
5525}
5526
Amit Mahajan759786a2017-03-03 17:35:47 -08005527int radio::writeSmsToRuimResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005528 int responseType, int serial, RIL_Errno e,
5529 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005530#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005531 RLOGD("writeSmsToRuimResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005532#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005533
5534 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005535 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005536 int ret = responseInt(responseInfo, serial, responseType, e, response, responseLen);
5537 Return<void> retStatus
5538 = radioService[slotId]->mRadioResponse->writeSmsToRuimResponse(responseInfo, ret);
5539 radioService[slotId]->checkReturnStatus(retStatus);
5540 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005541 RLOGE("writeSmsToRuimResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005542 }
5543
5544 return 0;
5545}
5546
Amit Mahajan759786a2017-03-03 17:35:47 -08005547int radio::deleteSmsOnRuimResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005548 int responseType, int serial, RIL_Errno e,
5549 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005550#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005551 RLOGD("deleteSmsOnRuimResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005552#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005553
5554 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005555 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005556 populateResponseInfo(responseInfo, serial, responseType, e);
5557 Return<void> retStatus
5558 = radioService[slotId]->mRadioResponse->deleteSmsOnRuimResponse(responseInfo);
5559 radioService[slotId]->checkReturnStatus(retStatus);
5560 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005561 RLOGE("deleteSmsOnRuimResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005562 }
5563
5564 return 0;
5565}
5566
Amit Mahajan759786a2017-03-03 17:35:47 -08005567int radio::getDeviceIdentityResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005568 int responseType, int serial, RIL_Errno e, void *response,
5569 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005570#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005571 RLOGD("getDeviceIdentityResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005572#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005573
5574 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005575 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005576 populateResponseInfo(responseInfo, serial, responseType, e);
5577
5578 int numStrings = responseLen / sizeof(char *);
5579 hidl_string emptyString;
5580 if (response == NULL || numStrings != 4) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005581 RLOGE("getDeviceIdentityResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005582 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
5583 Return<void> retStatus
5584 = radioService[slotId]->mRadioResponse->getDeviceIdentityResponse(responseInfo,
5585 emptyString, emptyString, emptyString, emptyString);
5586 radioService[slotId]->checkReturnStatus(retStatus);
5587 } else {
5588 char **resp = (char **) response;
5589 Return<void> retStatus
5590 = radioService[slotId]->mRadioResponse->getDeviceIdentityResponse(responseInfo,
5591 convertCharPtrToHidlString(resp[0]),
5592 convertCharPtrToHidlString(resp[1]),
5593 convertCharPtrToHidlString(resp[2]),
5594 convertCharPtrToHidlString(resp[3]));
5595 radioService[slotId]->checkReturnStatus(retStatus);
5596 }
5597 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005598 RLOGE("getDeviceIdentityResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005599 slotId);
5600 }
5601
5602 return 0;
5603}
5604
Amit Mahajan759786a2017-03-03 17:35:47 -08005605int radio::exitEmergencyCallbackModeResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005606 int responseType, int serial, RIL_Errno e,
5607 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005608#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005609 RLOGD("exitEmergencyCallbackModeResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005610#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005611
5612 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005613 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005614 populateResponseInfo(responseInfo, serial, responseType, e);
5615 Return<void> retStatus
5616 = radioService[slotId]->mRadioResponse->exitEmergencyCallbackModeResponse(
5617 responseInfo);
5618 radioService[slotId]->checkReturnStatus(retStatus);
5619 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005620 RLOGE("exitEmergencyCallbackModeResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005621 slotId);
5622 }
5623
5624 return 0;
5625}
5626
Amit Mahajan759786a2017-03-03 17:35:47 -08005627int radio::getSmscAddressResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005628 int responseType, int serial, RIL_Errno e,
5629 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005630#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005631 RLOGD("getSmscAddressResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005632#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005633
5634 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005635 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005636 populateResponseInfo(responseInfo, serial, responseType, e);
5637 Return<void> retStatus
5638 = radioService[slotId]->mRadioResponse->getSmscAddressResponse(responseInfo,
5639 convertCharPtrToHidlString((char *) response));
5640 radioService[slotId]->checkReturnStatus(retStatus);
5641 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005642 RLOGE("getSmscAddressResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005643 }
5644
5645 return 0;
5646}
5647
Amit Mahajan759786a2017-03-03 17:35:47 -08005648int radio::setSmscAddressResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005649 int responseType, int serial, RIL_Errno e,
5650 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005651#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005652 RLOGD("setSmscAddressResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005653#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005654
5655 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005656 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005657 populateResponseInfo(responseInfo, serial, responseType, e);
5658 Return<void> retStatus
5659 = radioService[slotId]->mRadioResponse->setSmscAddressResponse(responseInfo);
5660 radioService[slotId]->checkReturnStatus(retStatus);
5661 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005662 RLOGE("setSmscAddressResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005663 }
5664
5665 return 0;
5666}
5667
Amit Mahajan759786a2017-03-03 17:35:47 -08005668int radio::reportSmsMemoryStatusResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005669 int responseType, int serial, RIL_Errno e,
5670 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005671#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005672 RLOGD("reportSmsMemoryStatusResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005673#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005674
5675 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005676 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005677 populateResponseInfo(responseInfo, serial, responseType, e);
5678 Return<void> retStatus
5679 = radioService[slotId]->mRadioResponse->reportSmsMemoryStatusResponse(responseInfo);
5680 radioService[slotId]->checkReturnStatus(retStatus);
5681 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005682 RLOGE("reportSmsMemoryStatusResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005683 slotId);
5684 }
5685
5686 return 0;
5687}
5688
Amit Mahajan759786a2017-03-03 17:35:47 -08005689int radio::reportStkServiceIsRunningResponse(int slotId,
Amit Mahajan5007ffa2017-01-31 17:14:42 -08005690 int responseType, int serial, RIL_Errno e,
5691 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005692#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005693 RLOGD("reportStkServiceIsRunningResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005694#endif
Amit Mahajan5007ffa2017-01-31 17:14:42 -08005695
5696 if (radioService[slotId]->mRadioResponse != NULL) {
Amit Mahajan3da9ac02017-02-13 13:41:28 -08005697 RadioResponseInfo responseInfo = {};
Amit Mahajan5007ffa2017-01-31 17:14:42 -08005698 populateResponseInfo(responseInfo, serial, responseType, e);
5699 Return<void> retStatus = radioService[slotId]->mRadioResponse->
5700 reportStkServiceIsRunningResponse(responseInfo);
5701 radioService[slotId]->checkReturnStatus(retStatus);
5702 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005703 RLOGE("reportStkServiceIsRunningResponse: radioService[%d]->mRadioResponse == NULL",
Amit Mahajan5007ffa2017-01-31 17:14:42 -08005704 slotId);
5705 }
5706
5707 return 0;
5708}
5709
Amit Mahajan759786a2017-03-03 17:35:47 -08005710int radio::getCdmaSubscriptionSourceResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005711 int responseType, int serial, RIL_Errno e,
5712 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005713#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005714 RLOGD("getCdmaSubscriptionSourceResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005715#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005716
5717 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005718 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005719 int ret = responseInt(responseInfo, serial, responseType, e, response, responseLen);
5720 Return<void> retStatus
5721 = radioService[slotId]->mRadioResponse->getCdmaSubscriptionSourceResponse(
5722 responseInfo, (CdmaSubscriptionSource) ret);
5723 radioService[slotId]->checkReturnStatus(retStatus);
5724 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005725 RLOGE("getCdmaSubscriptionSourceResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005726 slotId);
5727 }
5728
5729 return 0;
5730}
5731
Amit Mahajan759786a2017-03-03 17:35:47 -08005732int radio::requestIsimAuthenticationResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005733 int responseType, int serial, RIL_Errno e,
5734 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005735#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005736 RLOGD("requestIsimAuthenticationResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005737#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005738
5739 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005740 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005741 populateResponseInfo(responseInfo, serial, responseType, e);
5742 Return<void> retStatus
5743 = radioService[slotId]->mRadioResponse->requestIsimAuthenticationResponse(
5744 responseInfo,
5745 convertCharPtrToHidlString((char *) response));
5746 radioService[slotId]->checkReturnStatus(retStatus);
5747 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005748 RLOGE("requestIsimAuthenticationResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005749 slotId);
5750 }
5751
5752 return 0;
5753}
5754
Amit Mahajan759786a2017-03-03 17:35:47 -08005755int radio::acknowledgeIncomingGsmSmsWithPduResponse(int slotId,
5756 int responseType,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005757 int serial, RIL_Errno e, void *response,
5758 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005759#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005760 RLOGD("acknowledgeIncomingGsmSmsWithPduResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005761#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005762
5763 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005764 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005765 populateResponseInfo(responseInfo, serial, responseType, e);
5766 Return<void> retStatus
5767 = radioService[slotId]->mRadioResponse->acknowledgeIncomingGsmSmsWithPduResponse(
5768 responseInfo);
5769 radioService[slotId]->checkReturnStatus(retStatus);
5770 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005771 RLOGE("acknowledgeIncomingGsmSmsWithPduResponse: radioService[%d]->mRadioResponse "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005772 "== NULL", slotId);
5773 }
5774
5775 return 0;
5776}
5777
Amit Mahajan759786a2017-03-03 17:35:47 -08005778int radio::sendEnvelopeWithStatusResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005779 int responseType, int serial, RIL_Errno e, void *response,
5780 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005781#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005782 RLOGD("sendEnvelopeWithStatusResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005783#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005784
5785 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005786 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005787 IccIoResult result = responseIccIo(responseInfo, serial, responseType, e,
5788 response, responseLen);
5789
5790 Return<void> retStatus
5791 = radioService[slotId]->mRadioResponse->sendEnvelopeWithStatusResponse(responseInfo,
5792 result);
5793 radioService[slotId]->checkReturnStatus(retStatus);
5794 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005795 RLOGE("sendEnvelopeWithStatusResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005796 slotId);
5797 }
5798
5799 return 0;
5800}
5801
Amit Mahajan759786a2017-03-03 17:35:47 -08005802int radio::getVoiceRadioTechnologyResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005803 int responseType, int serial, RIL_Errno e,
5804 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005805#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005806 RLOGD("getVoiceRadioTechnologyResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005807#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005808
5809 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005810 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005811 int ret = responseInt(responseInfo, serial, responseType, e, response, responseLen);
5812 Return<void> retStatus
5813 = radioService[slotId]->mRadioResponse->getVoiceRadioTechnologyResponse(
5814 responseInfo, (RadioTechnology) ret);
5815 radioService[slotId]->checkReturnStatus(retStatus);
5816 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005817 RLOGE("getVoiceRadioTechnologyResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005818 slotId);
5819 }
5820
5821 return 0;
5822}
5823
Amit Mahajan759786a2017-03-03 17:35:47 -08005824int radio::getCellInfoListResponse(int slotId,
5825 int responseType,
Amit Mahajan3df62912017-02-10 01:35:55 +00005826 int serial, RIL_Errno e, void *response,
5827 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005828#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005829 RLOGD("getCellInfoListResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005830#endif
Amit Mahajan3df62912017-02-10 01:35:55 +00005831
5832 if (radioService[slotId]->mRadioResponse != NULL) {
Amit Mahajan3da9ac02017-02-13 13:41:28 -08005833 RadioResponseInfo responseInfo = {};
Amit Mahajan3df62912017-02-10 01:35:55 +00005834 populateResponseInfo(responseInfo, serial, responseType, e);
5835
5836 hidl_vec<CellInfo> ret;
Amit Mahajan13058cb2017-06-07 23:10:27 -07005837 if ((response == NULL && responseLen != 0)
5838 || responseLen % sizeof(RIL_CellInfo_v12) != 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005839 RLOGE("getCellInfoListResponse: Invalid response");
Amit Mahajan3df62912017-02-10 01:35:55 +00005840 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
5841 } else {
5842 convertRilCellInfoListToHal(response, responseLen, ret);
5843 }
5844
5845 Return<void> retStatus = radioService[slotId]->mRadioResponse->getCellInfoListResponse(
5846 responseInfo, ret);
5847 radioService[slotId]->checkReturnStatus(retStatus);
5848 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005849 RLOGE("getCellInfoListResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Amit Mahajan3df62912017-02-10 01:35:55 +00005850 }
5851
5852 return 0;
5853}
5854
Amit Mahajan759786a2017-03-03 17:35:47 -08005855int radio::setCellInfoListRateResponse(int slotId,
5856 int responseType,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005857 int serial, RIL_Errno e, void *response,
5858 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005859#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005860 RLOGD("setCellInfoListRateResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005861#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005862
5863 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005864 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005865 populateResponseInfo(responseInfo, serial, responseType, e);
5866 Return<void> retStatus
5867 = radioService[slotId]->mRadioResponse->setCellInfoListRateResponse(responseInfo);
5868 radioService[slotId]->checkReturnStatus(retStatus);
5869 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005870 RLOGE("setCellInfoListRateResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005871 slotId);
5872 }
5873
5874 return 0;
5875}
5876
Amit Mahajan759786a2017-03-03 17:35:47 -08005877int radio::setInitialAttachApnResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005878 int responseType, int serial, RIL_Errno e,
5879 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005880#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005881 RLOGD("setInitialAttachApnResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005882#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005883
5884 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005885 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005886 populateResponseInfo(responseInfo, serial, responseType, e);
5887 Return<void> retStatus
5888 = radioService[slotId]->mRadioResponse->setInitialAttachApnResponse(responseInfo);
5889 radioService[slotId]->checkReturnStatus(retStatus);
5890 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005891 RLOGE("setInitialAttachApnResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005892 slotId);
5893 }
5894
5895 return 0;
5896}
5897
Amit Mahajan759786a2017-03-03 17:35:47 -08005898int radio::getImsRegistrationStateResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005899 int responseType, int serial, RIL_Errno e,
5900 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005901#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005902 RLOGD("getImsRegistrationStateResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005903#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005904
5905 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005906 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005907 populateResponseInfo(responseInfo, serial, responseType, e);
5908 bool isRegistered = false;
5909 int ratFamily = 0;
5910 int numInts = responseLen / sizeof(int);
5911 if (response == NULL || numInts != 2) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005912 RLOGE("getImsRegistrationStateResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005913 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
5914 } else {
5915 int *pInt = (int *) response;
5916 isRegistered = pInt[0] == 1 ? true : false;
5917 ratFamily = pInt[1];
5918 }
5919 Return<void> retStatus
5920 = radioService[slotId]->mRadioResponse->getImsRegistrationStateResponse(
5921 responseInfo, isRegistered, (RadioTechnologyFamily) ratFamily);
5922 radioService[slotId]->checkReturnStatus(retStatus);
5923 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005924 RLOGE("getImsRegistrationStateResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005925 slotId);
5926 }
5927
5928 return 0;
5929}
5930
Amit Mahajan759786a2017-03-03 17:35:47 -08005931int radio::sendImsSmsResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005932 int responseType, int serial, RIL_Errno e, void *response,
5933 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005934#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005935 RLOGD("sendImsSmsResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005936#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005937
5938 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005939 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005940 SendSmsResult result = makeSendSmsResult(responseInfo, serial, responseType, e, response,
5941 responseLen);
5942
5943 Return<void> retStatus
5944 = radioService[slotId]->mRadioResponse->sendImsSmsResponse(responseInfo, result);
5945 radioService[slotId]->checkReturnStatus(retStatus);
5946 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005947 RLOGE("sendSmsResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005948 }
5949
5950 return 0;
5951}
5952
Amit Mahajan759786a2017-03-03 17:35:47 -08005953int radio::iccTransmitApduBasicChannelResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005954 int responseType, int serial, RIL_Errno e,
5955 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005956#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005957 RLOGD("iccTransmitApduBasicChannelResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005958#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005959
5960 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005961 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005962 IccIoResult result = responseIccIo(responseInfo, serial, responseType, e, response,
5963 responseLen);
5964
5965 Return<void> retStatus
5966 = radioService[slotId]->mRadioResponse->iccTransmitApduBasicChannelResponse(
5967 responseInfo, result);
5968 radioService[slotId]->checkReturnStatus(retStatus);
5969 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005970 RLOGE("iccTransmitApduBasicChannelResponse: radioService[%d]->mRadioResponse "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005971 "== NULL", slotId);
5972 }
5973
5974 return 0;
5975}
5976
Amit Mahajan759786a2017-03-03 17:35:47 -08005977int radio::iccOpenLogicalChannelResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005978 int responseType, int serial, RIL_Errno e, void *response,
5979 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005980#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005981 RLOGD("iccOpenLogicalChannelResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005982#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005983
5984 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005985 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005986 populateResponseInfo(responseInfo, serial, responseType, e);
5987 int channelId = -1;
5988 hidl_vec<int8_t> selectResponse;
5989 int numInts = responseLen / sizeof(int);
5990 if (response == NULL || responseLen % sizeof(int) != 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005991 RLOGE("iccOpenLogicalChannelResponse Invalid response: NULL");
Amit Mahajan13058cb2017-06-07 23:10:27 -07005992 if (response != NULL) {
5993 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
5994 }
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005995 } else {
5996 int *pInt = (int *) response;
5997 channelId = pInt[0];
5998 selectResponse.resize(numInts - 1);
5999 for (int i = 1; i < numInts; i++) {
6000 selectResponse[i - 1] = (int8_t) pInt[i];
6001 }
6002 }
6003 Return<void> retStatus
6004 = radioService[slotId]->mRadioResponse->iccOpenLogicalChannelResponse(responseInfo,
6005 channelId, selectResponse);
6006 radioService[slotId]->checkReturnStatus(retStatus);
6007 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006008 RLOGE("iccOpenLogicalChannelResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006009 slotId);
6010 }
6011
6012 return 0;
6013}
6014
Amit Mahajan759786a2017-03-03 17:35:47 -08006015int radio::iccCloseLogicalChannelResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006016 int responseType, int serial, RIL_Errno e,
6017 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006018#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006019 RLOGD("iccCloseLogicalChannelResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006020#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006021
6022 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08006023 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006024 populateResponseInfo(responseInfo, serial, responseType, e);
6025 Return<void> retStatus
6026 = radioService[slotId]->mRadioResponse->iccCloseLogicalChannelResponse(
6027 responseInfo);
6028 radioService[slotId]->checkReturnStatus(retStatus);
6029 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006030 RLOGE("iccCloseLogicalChannelResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006031 slotId);
6032 }
6033
6034 return 0;
6035}
6036
Amit Mahajan759786a2017-03-03 17:35:47 -08006037int radio::iccTransmitApduLogicalChannelResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006038 int responseType, int serial, RIL_Errno e,
6039 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006040#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006041 RLOGD("iccTransmitApduLogicalChannelResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006042#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006043
6044 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08006045 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006046 IccIoResult result = responseIccIo(responseInfo, serial, responseType, e, response,
6047 responseLen);
6048
6049 Return<void> retStatus
6050 = radioService[slotId]->mRadioResponse->iccTransmitApduLogicalChannelResponse(
6051 responseInfo, result);
6052 radioService[slotId]->checkReturnStatus(retStatus);
6053 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006054 RLOGE("iccTransmitApduLogicalChannelResponse: radioService[%d]->mRadioResponse "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006055 "== NULL", slotId);
6056 }
6057
6058 return 0;
6059}
6060
Amit Mahajan759786a2017-03-03 17:35:47 -08006061int radio::nvReadItemResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006062 int responseType, int serial, RIL_Errno e,
6063 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006064#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006065 RLOGD("nvReadItemResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006066#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006067
6068 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08006069 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006070 populateResponseInfo(responseInfo, serial, responseType, e);
6071 Return<void> retStatus = radioService[slotId]->mRadioResponse->nvReadItemResponse(
6072 responseInfo,
6073 convertCharPtrToHidlString((char *) response));
6074 radioService[slotId]->checkReturnStatus(retStatus);
6075 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006076 RLOGE("nvReadItemResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006077 }
6078
6079 return 0;
6080}
6081
Amit Mahajan759786a2017-03-03 17:35:47 -08006082int radio::nvWriteItemResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006083 int responseType, int serial, RIL_Errno e,
6084 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006085#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006086 RLOGD("nvWriteItemResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006087#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006088
6089 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08006090 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006091 populateResponseInfo(responseInfo, serial, responseType, e);
6092 Return<void> retStatus
6093 = radioService[slotId]->mRadioResponse->nvWriteItemResponse(responseInfo);
6094 radioService[slotId]->checkReturnStatus(retStatus);
6095 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006096 RLOGE("nvWriteItemResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006097 }
6098
6099 return 0;
6100}
6101
Amit Mahajan759786a2017-03-03 17:35:47 -08006102int radio::nvWriteCdmaPrlResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006103 int responseType, int serial, RIL_Errno e,
6104 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006105#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006106 RLOGD("nvWriteCdmaPrlResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006107#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006108
6109 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08006110 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006111 populateResponseInfo(responseInfo, serial, responseType, e);
6112 Return<void> retStatus
6113 = radioService[slotId]->mRadioResponse->nvWriteCdmaPrlResponse(responseInfo);
6114 radioService[slotId]->checkReturnStatus(retStatus);
6115 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006116 RLOGE("nvWriteCdmaPrlResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006117 }
6118
6119 return 0;
6120}
6121
Amit Mahajan759786a2017-03-03 17:35:47 -08006122int radio::nvResetConfigResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006123 int responseType, int serial, RIL_Errno e,
6124 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006125#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006126 RLOGD("nvResetConfigResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006127#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006128
6129 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08006130 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006131 populateResponseInfo(responseInfo, serial, responseType, e);
6132 Return<void> retStatus
6133 = radioService[slotId]->mRadioResponse->nvResetConfigResponse(responseInfo);
6134 radioService[slotId]->checkReturnStatus(retStatus);
6135 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006136 RLOGE("nvResetConfigResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006137 }
6138
6139 return 0;
6140}
6141
Amit Mahajan759786a2017-03-03 17:35:47 -08006142int radio::setUiccSubscriptionResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006143 int responseType, int serial, RIL_Errno e,
6144 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006145#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006146 RLOGD("setUiccSubscriptionResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006147#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006148
6149 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08006150 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006151 populateResponseInfo(responseInfo, serial, responseType, e);
6152 Return<void> retStatus
6153 = radioService[slotId]->mRadioResponse->setUiccSubscriptionResponse(responseInfo);
6154 radioService[slotId]->checkReturnStatus(retStatus);
6155 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006156 RLOGE("setUiccSubscriptionResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006157 slotId);
6158 }
6159
6160 return 0;
6161}
6162
Amit Mahajan759786a2017-03-03 17:35:47 -08006163int radio::setDataAllowedResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006164 int responseType, int serial, RIL_Errno e,
6165 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006166#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006167 RLOGD("setDataAllowedResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006168#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006169
6170 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08006171 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006172 populateResponseInfo(responseInfo, serial, responseType, e);
6173 Return<void> retStatus
6174 = radioService[slotId]->mRadioResponse->setDataAllowedResponse(responseInfo);
6175 radioService[slotId]->checkReturnStatus(retStatus);
6176 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006177 RLOGE("setDataAllowedResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006178 }
6179
6180 return 0;
6181}
6182
Amit Mahajan759786a2017-03-03 17:35:47 -08006183int radio::getHardwareConfigResponse(int slotId,
Amit Mahajan3df62912017-02-10 01:35:55 +00006184 int responseType, int serial, RIL_Errno e,
6185 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006186#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006187 RLOGD("getHardwareConfigResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006188#endif
Amit Mahajan3df62912017-02-10 01:35:55 +00006189
6190 if (radioService[slotId]->mRadioResponse != NULL) {
Amit Mahajan3da9ac02017-02-13 13:41:28 -08006191 RadioResponseInfo responseInfo = {};
Amit Mahajan3df62912017-02-10 01:35:55 +00006192 populateResponseInfo(responseInfo, serial, responseType, e);
6193
6194 hidl_vec<HardwareConfig> result;
Amit Mahajan13058cb2017-06-07 23:10:27 -07006195 if ((response == NULL && responseLen != 0)
6196 || responseLen % sizeof(RIL_HardwareConfig) != 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006197 RLOGE("hardwareConfigChangedInd: invalid response");
Amit Mahajan3df62912017-02-10 01:35:55 +00006198 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
6199 } else {
6200 convertRilHardwareConfigListToHal(response, responseLen, result);
6201 }
6202
6203 Return<void> retStatus = radioService[slotId]->mRadioResponse->getHardwareConfigResponse(
6204 responseInfo, result);
6205 radioService[slotId]->checkReturnStatus(retStatus);
6206 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006207 RLOGE("getHardwareConfigResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Amit Mahajan3df62912017-02-10 01:35:55 +00006208 }
6209
6210 return 0;
6211}
6212
Amit Mahajan759786a2017-03-03 17:35:47 -08006213int radio::requestIccSimAuthenticationResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006214 int responseType, int serial, RIL_Errno e,
6215 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006216#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006217 RLOGD("requestIccSimAuthenticationResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006218#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006219
6220 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08006221 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006222 IccIoResult result = responseIccIo(responseInfo, serial, responseType, e, response,
6223 responseLen);
6224
6225 Return<void> retStatus
6226 = radioService[slotId]->mRadioResponse->requestIccSimAuthenticationResponse(
6227 responseInfo, result);
6228 radioService[slotId]->checkReturnStatus(retStatus);
6229 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006230 RLOGE("requestIccSimAuthenticationResponse: radioService[%d]->mRadioResponse "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006231 "== NULL", slotId);
6232 }
6233
6234 return 0;
6235}
6236
Amit Mahajan759786a2017-03-03 17:35:47 -08006237int radio::setDataProfileResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006238 int responseType, int serial, RIL_Errno e,
6239 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006240#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006241 RLOGD("setDataProfileResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006242#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006243
6244 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08006245 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006246 populateResponseInfo(responseInfo, serial, responseType, e);
6247 Return<void> retStatus
6248 = radioService[slotId]->mRadioResponse->setDataProfileResponse(responseInfo);
6249 radioService[slotId]->checkReturnStatus(retStatus);
6250 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006251 RLOGE("setDataProfileResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006252 }
6253
6254 return 0;
6255}
6256
Amit Mahajan759786a2017-03-03 17:35:47 -08006257int radio::requestShutdownResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006258 int responseType, int serial, RIL_Errno e,
6259 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006260#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006261 RLOGD("requestShutdownResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006262#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006263
6264 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08006265 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006266 populateResponseInfo(responseInfo, serial, responseType, e);
6267 Return<void> retStatus
6268 = radioService[slotId]->mRadioResponse->requestShutdownResponse(responseInfo);
6269 radioService[slotId]->checkReturnStatus(retStatus);
6270 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006271 RLOGE("requestShutdownResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006272 }
6273
6274 return 0;
6275}
6276
Amit Mahajan3df62912017-02-10 01:35:55 +00006277void responseRadioCapability(RadioResponseInfo& responseInfo, int serial,
6278 int responseType, RIL_Errno e, void *response, size_t responseLen, RadioCapability& rc) {
6279 populateResponseInfo(responseInfo, serial, responseType, e);
6280
Amit Mahajan1fbff082017-02-24 11:24:39 -08006281 if (response == NULL || responseLen != sizeof(RIL_RadioCapability)) {
Amit Mahajan3df62912017-02-10 01:35:55 +00006282 RLOGE("responseRadioCapability: Invalid response");
6283 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
Amit Mahajan3da9ac02017-02-13 13:41:28 -08006284 rc.logicalModemUuid = hidl_string();
Amit Mahajan3df62912017-02-10 01:35:55 +00006285 } else {
6286 convertRilRadioCapabilityToHal(response, responseLen, rc);
6287 }
6288}
6289
Amit Mahajan759786a2017-03-03 17:35:47 -08006290int radio::getRadioCapabilityResponse(int slotId,
Amit Mahajan3df62912017-02-10 01:35:55 +00006291 int responseType, int serial, RIL_Errno e,
6292 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006293#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006294 RLOGD("getRadioCapabilityResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006295#endif
Amit Mahajan3df62912017-02-10 01:35:55 +00006296
6297 if (radioService[slotId]->mRadioResponse != NULL) {
Amit Mahajan3da9ac02017-02-13 13:41:28 -08006298 RadioResponseInfo responseInfo = {};
6299 RadioCapability result = {};
Amit Mahajan3df62912017-02-10 01:35:55 +00006300 responseRadioCapability(responseInfo, serial, responseType, e, response, responseLen,
6301 result);
6302 Return<void> retStatus = radioService[slotId]->mRadioResponse->getRadioCapabilityResponse(
6303 responseInfo, result);
6304 radioService[slotId]->checkReturnStatus(retStatus);
6305 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006306 RLOGE("getRadioCapabilityResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Amit Mahajan3df62912017-02-10 01:35:55 +00006307 }
6308
6309 return 0;
6310}
6311
Amit Mahajan759786a2017-03-03 17:35:47 -08006312int radio::setRadioCapabilityResponse(int slotId,
Amit Mahajan3df62912017-02-10 01:35:55 +00006313 int responseType, int serial, RIL_Errno e,
6314 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006315#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006316 RLOGD("setRadioCapabilityResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006317#endif
Amit Mahajan3df62912017-02-10 01:35:55 +00006318
6319 if (radioService[slotId]->mRadioResponse != NULL) {
Amit Mahajan3da9ac02017-02-13 13:41:28 -08006320 RadioResponseInfo responseInfo = {};
6321 RadioCapability result = {};
Amit Mahajan3df62912017-02-10 01:35:55 +00006322 responseRadioCapability(responseInfo, serial, responseType, e, response, responseLen,
6323 result);
6324 Return<void> retStatus = radioService[slotId]->mRadioResponse->setRadioCapabilityResponse(
6325 responseInfo, result);
6326 radioService[slotId]->checkReturnStatus(retStatus);
6327 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006328 RLOGE("setRadioCapabilityResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Amit Mahajan3df62912017-02-10 01:35:55 +00006329 }
6330
6331 return 0;
6332}
6333
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006334LceStatusInfo responseLceStatusInfo(RadioResponseInfo& responseInfo, int serial, int responseType,
6335 RIL_Errno e, void *response, size_t responseLen) {
6336 populateResponseInfo(responseInfo, serial, responseType, e);
Jack Yuf68e0da2017-02-07 14:53:09 -08006337 LceStatusInfo result = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006338
6339 if (response == NULL || responseLen != sizeof(RIL_LceStatusInfo)) {
6340 RLOGE("Invalid response: NULL");
6341 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006342 } else {
6343 RIL_LceStatusInfo *resp = (RIL_LceStatusInfo *) response;
6344 result.lceStatus = (LceStatus) resp->lce_status;
6345 result.actualIntervalMs = (uint8_t) resp->actual_interval_ms;
6346 }
6347 return result;
6348}
6349
Amit Mahajan759786a2017-03-03 17:35:47 -08006350int radio::startLceServiceResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006351 int responseType, int serial, RIL_Errno e,
6352 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006353#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006354 RLOGD("startLceServiceResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006355#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006356
6357 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08006358 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006359 LceStatusInfo result = responseLceStatusInfo(responseInfo, serial, responseType, e,
6360 response, responseLen);
6361
6362 Return<void> retStatus
6363 = radioService[slotId]->mRadioResponse->startLceServiceResponse(responseInfo,
6364 result);
6365 radioService[slotId]->checkReturnStatus(retStatus);
6366 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006367 RLOGE("startLceServiceResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006368 }
6369
6370 return 0;
6371}
6372
Amit Mahajan759786a2017-03-03 17:35:47 -08006373int radio::stopLceServiceResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006374 int responseType, int serial, RIL_Errno e,
6375 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006376#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006377 RLOGD("stopLceServiceResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006378#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006379
6380 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08006381 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006382 LceStatusInfo result = responseLceStatusInfo(responseInfo, serial, responseType, e,
6383 response, responseLen);
6384
6385 Return<void> retStatus
6386 = radioService[slotId]->mRadioResponse->stopLceServiceResponse(responseInfo,
6387 result);
6388 radioService[slotId]->checkReturnStatus(retStatus);
6389 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006390 RLOGE("stopLceServiceResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006391 }
6392
6393 return 0;
6394}
6395
Amit Mahajan759786a2017-03-03 17:35:47 -08006396int radio::pullLceDataResponse(int slotId,
Amit Mahajan3df62912017-02-10 01:35:55 +00006397 int responseType, int serial, RIL_Errno e,
6398 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006399#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006400 RLOGD("pullLceDataResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006401#endif
Amit Mahajan3df62912017-02-10 01:35:55 +00006402
6403 if (radioService[slotId]->mRadioResponse != NULL) {
Amit Mahajan3da9ac02017-02-13 13:41:28 -08006404 RadioResponseInfo responseInfo = {};
Amit Mahajan3df62912017-02-10 01:35:55 +00006405 populateResponseInfo(responseInfo, serial, responseType, e);
6406
Amit Mahajan3da9ac02017-02-13 13:41:28 -08006407 LceDataInfo result = {};
Amit Mahajan3df62912017-02-10 01:35:55 +00006408 if (response == NULL || responseLen != sizeof(RIL_LceDataInfo)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006409 RLOGE("pullLceDataResponse: Invalid response");
Amit Mahajan3df62912017-02-10 01:35:55 +00006410 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
Amit Mahajan3df62912017-02-10 01:35:55 +00006411 } else {
6412 convertRilLceDataInfoToHal(response, responseLen, result);
6413 }
6414
6415 Return<void> retStatus = radioService[slotId]->mRadioResponse->pullLceDataResponse(
6416 responseInfo, result);
6417 radioService[slotId]->checkReturnStatus(retStatus);
6418 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006419 RLOGE("pullLceDataResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Amit Mahajan3df62912017-02-10 01:35:55 +00006420 }
6421
6422 return 0;
6423}
6424
Amit Mahajan759786a2017-03-03 17:35:47 -08006425int radio::getModemActivityInfoResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006426 int responseType, int serial, RIL_Errno e,
6427 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006428#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006429 RLOGD("getModemActivityInfoResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006430#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006431
6432 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08006433 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006434 populateResponseInfo(responseInfo, serial, responseType, e);
6435 ActivityStatsInfo info;
6436 if (response == NULL || responseLen != sizeof(RIL_ActivityStatsInfo)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006437 RLOGE("getModemActivityInfoResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006438 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006439 } else {
6440 RIL_ActivityStatsInfo *resp = (RIL_ActivityStatsInfo *)response;
6441 info.sleepModeTimeMs = resp->sleep_mode_time_ms;
6442 info.idleModeTimeMs = resp->idle_mode_time_ms;
6443 for(int i = 0; i < RIL_NUM_TX_POWER_LEVELS; i++) {
6444 info.txmModetimeMs[i] = resp->tx_mode_time_ms[i];
6445 }
6446 info.rxModeTimeMs = resp->rx_mode_time_ms;
6447 }
6448
6449 Return<void> retStatus
6450 = radioService[slotId]->mRadioResponse->getModemActivityInfoResponse(responseInfo,
6451 info);
6452 radioService[slotId]->checkReturnStatus(retStatus);
6453 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006454 RLOGE("getModemActivityInfoResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006455 slotId);
6456 }
6457
6458 return 0;
6459}
6460
Amit Mahajan759786a2017-03-03 17:35:47 -08006461int radio::setAllowedCarriersResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006462 int responseType, int serial, RIL_Errno e,
6463 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006464#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006465 RLOGD("setAllowedCarriersResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006466#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006467
6468 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08006469 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006470 int ret = responseInt(responseInfo, serial, responseType, e, response, responseLen);
6471 Return<void> retStatus
6472 = radioService[slotId]->mRadioResponse->setAllowedCarriersResponse(responseInfo,
6473 ret);
6474 radioService[slotId]->checkReturnStatus(retStatus);
6475 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006476 RLOGE("setAllowedCarriersResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006477 slotId);
6478 }
6479
6480 return 0;
6481}
6482
Amit Mahajan759786a2017-03-03 17:35:47 -08006483int radio::getAllowedCarriersResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006484 int responseType, int serial, RIL_Errno e,
6485 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006486#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006487 RLOGD("getAllowedCarriersResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006488#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006489
6490 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08006491 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006492 populateResponseInfo(responseInfo, serial, responseType, e);
Jack Yuf68e0da2017-02-07 14:53:09 -08006493 CarrierRestrictions carrierInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006494 bool allAllowed = true;
Jayachandran C70f7d2e2017-04-28 00:57:13 -07006495 if (response == NULL) {
6496#if VDBG
6497 RLOGD("getAllowedCarriersResponse response is NULL: all allowed");
6498#endif
6499 carrierInfo.allowedCarriers.resize(0);
6500 carrierInfo.excludedCarriers.resize(0);
6501 } else if (responseLen != sizeof(RIL_CarrierRestrictions)) {
6502 RLOGE("getAllowedCarriersResponse Invalid response");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006503 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
6504 } else {
6505 RIL_CarrierRestrictions *pCr = (RIL_CarrierRestrictions *)response;
6506 if (pCr->len_allowed_carriers > 0 || pCr->len_excluded_carriers > 0) {
6507 allAllowed = false;
6508 }
6509
6510 carrierInfo.allowedCarriers.resize(pCr->len_allowed_carriers);
6511 for(int i = 0; i < pCr->len_allowed_carriers; i++) {
6512 RIL_Carrier *carrier = pCr->allowed_carriers + i;
6513 carrierInfo.allowedCarriers[i].mcc = convertCharPtrToHidlString(carrier->mcc);
6514 carrierInfo.allowedCarriers[i].mnc = convertCharPtrToHidlString(carrier->mnc);
6515 carrierInfo.allowedCarriers[i].matchType = (CarrierMatchType) carrier->match_type;
6516 carrierInfo.allowedCarriers[i].matchData =
6517 convertCharPtrToHidlString(carrier->match_data);
6518 }
6519
6520 carrierInfo.excludedCarriers.resize(pCr->len_excluded_carriers);
6521 for(int i = 0; i < pCr->len_excluded_carriers; i++) {
6522 RIL_Carrier *carrier = pCr->excluded_carriers + i;
6523 carrierInfo.excludedCarriers[i].mcc = convertCharPtrToHidlString(carrier->mcc);
6524 carrierInfo.excludedCarriers[i].mnc = convertCharPtrToHidlString(carrier->mnc);
6525 carrierInfo.excludedCarriers[i].matchType = (CarrierMatchType) carrier->match_type;
6526 carrierInfo.excludedCarriers[i].matchData =
6527 convertCharPtrToHidlString(carrier->match_data);
6528 }
6529 }
6530
6531 Return<void> retStatus
6532 = radioService[slotId]->mRadioResponse->getAllowedCarriersResponse(responseInfo,
6533 allAllowed, carrierInfo);
6534 radioService[slotId]->checkReturnStatus(retStatus);
6535 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006536 RLOGE("getAllowedCarriersResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006537 slotId);
6538 }
6539
6540 return 0;
6541}
6542
Amit Mahajan759786a2017-03-03 17:35:47 -08006543int radio::sendDeviceStateResponse(int slotId,
Jack Yu11ab4042017-02-21 17:08:01 -08006544 int responseType, int serial, RIL_Errno e,
6545 void *response, size_t responselen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006546#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006547 RLOGD("sendDeviceStateResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006548#endif
Jack Yu11ab4042017-02-21 17:08:01 -08006549
6550 if (radioService[slotId]->mRadioResponse != NULL) {
6551 RadioResponseInfo responseInfo = {};
6552 populateResponseInfo(responseInfo, serial, responseType, e);
6553 Return<void> retStatus
6554 = radioService[slotId]->mRadioResponse->sendDeviceStateResponse(responseInfo);
6555 radioService[slotId]->checkReturnStatus(retStatus);
6556 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006557 RLOGE("sendDeviceStateResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Jack Yu11ab4042017-02-21 17:08:01 -08006558 }
6559
6560 return 0;
6561}
6562
pkanwardb8e0942017-03-17 12:49:34 -07006563int radio::setCarrierInfoForImsiEncryptionResponse(int slotId,
6564 int responseType, int serial, RIL_Errno e,
6565 void *response, size_t responseLen) {
6566 RLOGD("setCarrierInfoForImsiEncryptionResponse: serial %d", serial);
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07006567 if (radioService[slotId]->mRadioResponseV1_1 != NULL) {
pkanwardb8e0942017-03-17 12:49:34 -07006568 RadioResponseInfo responseInfo = {};
6569 populateResponseInfo(responseInfo, serial, responseType, e);
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07006570 Return<void> retStatus = radioService[slotId]->mRadioResponseV1_1->
6571 setCarrierInfoForImsiEncryptionResponse(responseInfo);
6572 radioService[slotId]->checkReturnStatus(retStatus);
pkanwardb8e0942017-03-17 12:49:34 -07006573 } else {
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07006574 RLOGE("setCarrierInfoForImsiEncryptionResponse: radioService[%d]->mRadioResponseV1_1 == "
6575 "NULL", slotId);
pkanwardb8e0942017-03-17 12:49:34 -07006576 }
6577 return 0;
6578}
6579
Amit Mahajan759786a2017-03-03 17:35:47 -08006580int radio::setIndicationFilterResponse(int slotId,
Jack Yu11ab4042017-02-21 17:08:01 -08006581 int responseType, int serial, RIL_Errno e,
6582 void *response, size_t responselen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006583#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006584 RLOGD("setIndicationFilterResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006585#endif
Jack Yu11ab4042017-02-21 17:08:01 -08006586
6587 if (radioService[slotId]->mRadioResponse != NULL) {
6588 RadioResponseInfo responseInfo = {};
6589 populateResponseInfo(responseInfo, serial, responseType, e);
6590 Return<void> retStatus
6591 = radioService[slotId]->mRadioResponse->setIndicationFilterResponse(responseInfo);
6592 radioService[slotId]->checkReturnStatus(retStatus);
6593 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006594 RLOGE("setIndicationFilterResponse: radioService[%d]->mRadioResponse == NULL",
Jack Yu11ab4042017-02-21 17:08:01 -08006595 slotId);
6596 }
6597
6598 return 0;
6599}
6600
Amit Mahajan759786a2017-03-03 17:35:47 -08006601int radio::setSimCardPowerResponse(int slotId,
Wileen Chiu718c0bf2017-01-04 11:37:19 -08006602 int responseType, int serial, RIL_Errno e,
6603 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006604#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006605 RLOGD("setSimCardPowerResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006606#endif
Wileen Chiu718c0bf2017-01-04 11:37:19 -08006607
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07006608 if (radioService[slotId]->mRadioResponse != NULL
6609 || radioService[slotId]->mRadioResponseV1_1 != NULL) {
Wileen Chiu718c0bf2017-01-04 11:37:19 -08006610 RadioResponseInfo responseInfo = {};
6611 populateResponseInfo(responseInfo, serial, responseType, e);
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07006612 if (radioService[slotId]->mRadioResponseV1_1 != NULL) {
6613 Return<void> retStatus = radioService[slotId]->mRadioResponseV1_1->
6614 setSimCardPowerResponse_1_1(responseInfo);
Grace Chen08eb6542017-03-23 18:39:48 -07006615 radioService[slotId]->checkReturnStatus(retStatus);
6616 } else {
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07006617 RLOGD("setSimCardPowerResponse: radioService[%d]->mRadioResponseV1_1 == NULL",
Grace Chen08eb6542017-03-23 18:39:48 -07006618 slotId);
6619 Return<void> retStatus
6620 = radioService[slotId]->mRadioResponse->setSimCardPowerResponse(responseInfo);
6621 radioService[slotId]->checkReturnStatus(retStatus);
6622 }
Wileen Chiu718c0bf2017-01-04 11:37:19 -08006623 } else {
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07006624 RLOGE("setSimCardPowerResponse: radioService[%d]->mRadioResponse == NULL && "
6625 "radioService[%d]->mRadioResponseV1_1 == NULL", slotId, slotId);
Wileen Chiu718c0bf2017-01-04 11:37:19 -08006626 }
Wileen Chiu718c0bf2017-01-04 11:37:19 -08006627 return 0;
6628}
6629
yinxu8688abd2017-05-22 11:26:45 -07006630int radio::startNetworkScanResponse(int slotId, int responseType, int serial, RIL_Errno e,
6631 void *response, size_t responseLen) {
6632#if VDBG
6633 RLOGD("startNetworkScanResponse: serial %d", serial);
6634#endif
6635
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07006636 if (radioService[slotId]->mRadioResponseV1_1 != NULL) {
yinxu8688abd2017-05-22 11:26:45 -07006637 RadioResponseInfo responseInfo = {};
6638 populateResponseInfo(responseInfo, serial, responseType, e);
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07006639 Return<void> retStatus
6640 = radioService[slotId]->mRadioResponseV1_1->startNetworkScanResponse(responseInfo);
6641 radioService[slotId]->checkReturnStatus(retStatus);
yinxu8688abd2017-05-22 11:26:45 -07006642 } else {
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07006643 RLOGE("startNetworkScanResponse: radioService[%d]->mRadioResponseV1_1 == NULL", slotId);
yinxu8688abd2017-05-22 11:26:45 -07006644 }
6645
6646 return 0;
6647}
6648
6649int radio::stopNetworkScanResponse(int slotId, int responseType, int serial, RIL_Errno e,
6650 void *response, size_t responseLen) {
6651#if VDBG
6652 RLOGD("stopNetworkScanResponse: serial %d", serial);
6653#endif
6654
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07006655 if (radioService[slotId]->mRadioResponseV1_1 != NULL) {
yinxu8688abd2017-05-22 11:26:45 -07006656 RadioResponseInfo responseInfo = {};
6657 populateResponseInfo(responseInfo, serial, responseType, e);
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07006658 Return<void> retStatus
6659 = radioService[slotId]->mRadioResponseV1_1->stopNetworkScanResponse(responseInfo);
6660 radioService[slotId]->checkReturnStatus(retStatus);
yinxu8688abd2017-05-22 11:26:45 -07006661 } else {
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07006662 RLOGE("stopNetworkScanResponse: radioService[%d]->mRadioResponseV1_1 == NULL", slotId);
yinxu8688abd2017-05-22 11:26:45 -07006663 }
6664
6665 return 0;
6666}
6667
Nathan Harold6a8809d2017-07-07 19:28:58 -07006668void convertRilKeepaliveStatusToHal(const RIL_KeepaliveStatus *rilStatus,
6669 V1_1::KeepaliveStatus& halStatus) {
6670 halStatus.sessionHandle = rilStatus->sessionHandle;
6671 halStatus.code = static_cast<V1_1::KeepaliveStatusCode>(rilStatus->code);
6672}
6673
6674int radio::startKeepaliveResponse(int slotId, int responseType, int serial, RIL_Errno e,
6675 void *response, size_t responseLen) {
6676#if VDBG
6677 RLOGD("%s(): %d", __FUNCTION__, serial);
6678#endif
6679 RadioResponseInfo responseInfo = {};
6680 populateResponseInfo(responseInfo, serial, responseType, e);
6681
6682 // If we don't have a radio service, there's nothing we can do
6683 if (radioService[slotId]->mRadioResponseV1_1 == NULL) {
6684 RLOGE("%s: radioService[%d]->mRadioResponseV1_1 == NULL", __FUNCTION__, slotId);
6685 return 0;
6686 }
6687
6688 V1_1::KeepaliveStatus ks = {};
6689 if (response == NULL || responseLen != sizeof(V1_1::KeepaliveStatus)) {
6690 RLOGE("%s: invalid response - %d", __FUNCTION__, static_cast<int>(e));
6691 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
6692 } else {
6693 convertRilKeepaliveStatusToHal(static_cast<RIL_KeepaliveStatus*>(response), ks);
6694 }
6695
6696 Return<void> retStatus =
6697 radioService[slotId]->mRadioResponseV1_1->startKeepaliveResponse(responseInfo, ks);
6698 radioService[slotId]->checkReturnStatus(retStatus);
6699 return 0;
6700}
6701
6702int radio::stopKeepaliveResponse(int slotId, int responseType, int serial, RIL_Errno e,
6703 void *response, size_t responseLen) {
6704#if VDBG
6705 RLOGD("%s(): %d", __FUNCTION__, serial);
6706#endif
6707 RadioResponseInfo responseInfo = {};
6708 populateResponseInfo(responseInfo, serial, responseType, e);
6709
6710 // If we don't have a radio service, there's nothing we can do
6711 if (radioService[slotId]->mRadioResponseV1_1 == NULL) {
6712 RLOGE("%s: radioService[%d]->mRadioResponseV1_1 == NULL", __FUNCTION__, slotId);
6713 return 0;
6714 }
6715
6716 Return<void> retStatus =
6717 radioService[slotId]->mRadioResponseV1_1->stopKeepaliveResponse(responseInfo);
6718 radioService[slotId]->checkReturnStatus(retStatus);
6719 return 0;
6720}
6721
Amit Mahajan759786a2017-03-03 17:35:47 -08006722int radio::sendRequestRawResponse(int slotId,
Amit Mahajan439da362017-02-13 17:43:04 -08006723 int responseType, int serial, RIL_Errno e,
6724 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006725#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006726 RLOGD("sendRequestRawResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006727#endif
Amit Mahajan439da362017-02-13 17:43:04 -08006728
Steven Moreland6cc40042018-03-20 11:20:05 -07006729 if (!kOemHookEnabled) return 0;
6730
Amit Mahajan439da362017-02-13 17:43:04 -08006731 if (oemHookService[slotId]->mOemHookResponse != NULL) {
6732 RadioResponseInfo responseInfo = {};
6733 populateResponseInfo(responseInfo, serial, responseType, e);
6734 hidl_vec<uint8_t> data;
6735
6736 if (response == NULL) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006737 RLOGE("sendRequestRawResponse: Invalid response");
Amit Mahajan439da362017-02-13 17:43:04 -08006738 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
6739 } else {
6740 data.setToExternal((uint8_t *) response, responseLen);
6741 }
6742 Return<void> retStatus = oemHookService[slotId]->mOemHookResponse->
6743 sendRequestRawResponse(responseInfo, data);
Amit Mahajand423d192017-03-16 17:04:01 -07006744 checkReturnStatus(slotId, retStatus, false);
Amit Mahajan439da362017-02-13 17:43:04 -08006745 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006746 RLOGE("sendRequestRawResponse: oemHookService[%d]->mOemHookResponse == NULL",
Amit Mahajan439da362017-02-13 17:43:04 -08006747 slotId);
6748 }
6749
6750 return 0;
6751}
6752
Amit Mahajan759786a2017-03-03 17:35:47 -08006753int radio::sendRequestStringsResponse(int slotId,
Amit Mahajan439da362017-02-13 17:43:04 -08006754 int responseType, int serial, RIL_Errno e,
6755 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006756#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006757 RLOGD("sendRequestStringsResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006758#endif
Amit Mahajan439da362017-02-13 17:43:04 -08006759
Steven Moreland6cc40042018-03-20 11:20:05 -07006760 if (!kOemHookEnabled) return 0;
6761
Amit Mahajan439da362017-02-13 17:43:04 -08006762 if (oemHookService[slotId]->mOemHookResponse != NULL) {
6763 RadioResponseInfo responseInfo = {};
6764 populateResponseInfo(responseInfo, serial, responseType, e);
6765 hidl_vec<hidl_string> data;
6766
Amit Mahajan13058cb2017-06-07 23:10:27 -07006767 if ((response == NULL && responseLen != 0) || responseLen % sizeof(char *) != 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006768 RLOGE("sendRequestStringsResponse Invalid response: NULL");
Amit Mahajan439da362017-02-13 17:43:04 -08006769 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
6770 } else {
6771 char **resp = (char **) response;
6772 int numStrings = responseLen / sizeof(char *);
6773 data.resize(numStrings);
6774 for (int i = 0; i < numStrings; i++) {
6775 data[i] = convertCharPtrToHidlString(resp[i]);
6776 }
6777 }
6778 Return<void> retStatus
6779 = oemHookService[slotId]->mOemHookResponse->sendRequestStringsResponse(
6780 responseInfo, data);
Amit Mahajand423d192017-03-16 17:04:01 -07006781 checkReturnStatus(slotId, retStatus, false);
Amit Mahajan439da362017-02-13 17:43:04 -08006782 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006783 RLOGE("sendRequestStringsResponse: oemHookService[%d]->mOemHookResponse == "
Amit Mahajan439da362017-02-13 17:43:04 -08006784 "NULL", slotId);
6785 }
6786
6787 return 0;
6788}
6789
Nathan Harold6a8809d2017-07-07 19:28:58 -07006790/***************************************************************************************************
6791 * INDICATION FUNCTIONS
6792 * The below function handle unsolicited messages coming from the Radio
6793 * (messages for which there is no pending request)
6794 **************************************************************************************************/
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006795
Amit Mahajan5829a472016-12-28 17:28:07 -08006796RadioIndicationType convertIntToRadioIndicationType(int indicationType) {
6797 return indicationType == RESPONSE_UNSOLICITED ? (RadioIndicationType::UNSOLICITED) :
6798 (RadioIndicationType::UNSOLICITED_ACK_EXP);
6799}
6800
Amit Mahajan759786a2017-03-03 17:35:47 -08006801int radio::radioStateChangedInd(int slotId,
Amit Mahajan1f652692017-03-01 12:08:46 -08006802 int indicationType, int token, RIL_Errno e, void *response,
6803 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08006804 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajanb3a11bb2017-05-15 16:41:44 -07006805 RadioState radioState =
6806 (RadioState) CALL_ONSTATEREQUEST(slotId);
Amit Mahajan111ddca2017-03-03 12:05:13 -08006807 RLOGD("radioStateChangedInd: radioState %d", radioState);
Amit Mahajan17249842017-01-19 15:05:45 -08006808 Return<void> retStatus = radioService[slotId]->mRadioIndication->radioStateChanged(
Amit Mahajan1f652692017-03-01 12:08:46 -08006809 convertIntToRadioIndicationType(indicationType), radioState);
Amit Mahajan17249842017-01-19 15:05:45 -08006810 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajancd77a5b2016-08-25 11:19:21 -07006811 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006812 RLOGE("radioStateChangedInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajancd77a5b2016-08-25 11:19:21 -07006813 }
Amit Mahajan1f652692017-03-01 12:08:46 -08006814
6815 return 0;
Amit Mahajancd77a5b2016-08-25 11:19:21 -07006816}
6817
Amit Mahajan759786a2017-03-03 17:35:47 -08006818int radio::callStateChangedInd(int slotId,
Amit Mahajan5829a472016-12-28 17:28:07 -08006819 int indicationType, int token, RIL_Errno e, void *response,
6820 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08006821 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006822#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006823 RLOGD("callStateChangedInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07006824#endif
Amit Mahajan17249842017-01-19 15:05:45 -08006825 Return<void> retStatus = radioService[slotId]->mRadioIndication->callStateChanged(
Amit Mahajan5829a472016-12-28 17:28:07 -08006826 convertIntToRadioIndicationType(indicationType));
Amit Mahajan17249842017-01-19 15:05:45 -08006827 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08006828 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006829 RLOGE("callStateChangedInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08006830 }
6831
6832 return 0;
6833}
6834
Amit Mahajan759786a2017-03-03 17:35:47 -08006835int radio::networkStateChangedInd(int slotId,
Amit Mahajan1f652692017-03-01 12:08:46 -08006836 int indicationType, int token, RIL_Errno e, void *response,
6837 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08006838 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006839#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006840 RLOGD("networkStateChangedInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07006841#endif
Jack Yu06181bb2017-01-10 12:10:41 -08006842 Return<void> retStatus = radioService[slotId]->mRadioIndication->networkStateChanged(
Amit Mahajan5829a472016-12-28 17:28:07 -08006843 convertIntToRadioIndicationType(indicationType));
Amit Mahajan17249842017-01-19 15:05:45 -08006844 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08006845 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006846 RLOGE("networkStateChangedInd: radioService[%d]->mRadioIndication == NULL",
Amit Mahajan2fa9e632017-01-06 16:55:33 -08006847 slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08006848 }
6849
6850 return 0;
6851}
6852
6853uint8_t hexCharToInt(uint8_t c) {
6854 if (c >= '0' && c <= '9') return (c - '0');
6855 if (c >= 'A' && c <= 'F') return (c - 'A' + 10);
6856 if (c >= 'a' && c <= 'f') return (c - 'a' + 10);
6857
6858 return INVALID_HEX_CHAR;
6859}
6860
6861uint8_t * convertHexStringToBytes(void *response, size_t responseLen) {
6862 if (responseLen % 2 != 0) {
6863 return NULL;
6864 }
6865
6866 uint8_t *bytes = (uint8_t *)calloc(responseLen/2, sizeof(uint8_t));
6867 if (bytes == NULL) {
6868 RLOGE("convertHexStringToBytes: cannot allocate memory for bytes string");
6869 return NULL;
6870 }
6871 uint8_t *hexString = (uint8_t *)response;
6872
Wei Wang100ac9b2017-02-03 14:18:07 -08006873 for (size_t i = 0; i < responseLen; i += 2) {
Amit Mahajan5829a472016-12-28 17:28:07 -08006874 uint8_t hexChar1 = hexCharToInt(hexString[i]);
6875 uint8_t hexChar2 = hexCharToInt(hexString[i + 1]);
6876
6877 if (hexChar1 == INVALID_HEX_CHAR || hexChar2 == INVALID_HEX_CHAR) {
6878 RLOGE("convertHexStringToBytes: invalid hex char %d %d",
6879 hexString[i], hexString[i + 1]);
6880 free(bytes);
6881 return NULL;
6882 }
6883 bytes[i/2] = ((hexChar1 << 4) | hexChar2);
6884 }
6885
6886 return bytes;
6887}
6888
Amit Mahajan759786a2017-03-03 17:35:47 -08006889int radio::newSmsInd(int slotId, int indicationType,
Amit Mahajan5829a472016-12-28 17:28:07 -08006890 int token, RIL_Errno e, void *response, size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08006891 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan5829a472016-12-28 17:28:07 -08006892 if (response == NULL || responseLen == 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006893 RLOGE("newSmsInd: invalid response");
Amit Mahajan5829a472016-12-28 17:28:07 -08006894 return 0;
6895 }
6896
6897 uint8_t *bytes = convertHexStringToBytes(response, responseLen);
6898 if (bytes == NULL) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006899 RLOGE("newSmsInd: convertHexStringToBytes failed");
Amit Mahajan5829a472016-12-28 17:28:07 -08006900 return 0;
6901 }
6902
6903 hidl_vec<uint8_t> pdu;
6904 pdu.setToExternal(bytes, responseLen/2);
Jayachandran C572f2f42017-03-25 14:30:13 -07006905#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006906 RLOGD("newSmsInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07006907#endif
Amit Mahajan17249842017-01-19 15:05:45 -08006908 Return<void> retStatus = radioService[slotId]->mRadioIndication->newSms(
Amit Mahajan5829a472016-12-28 17:28:07 -08006909 convertIntToRadioIndicationType(indicationType), pdu);
Amit Mahajan17249842017-01-19 15:05:45 -08006910 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08006911 free(bytes);
6912 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006913 RLOGE("newSmsInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08006914 }
6915
6916 return 0;
6917}
6918
Amit Mahajan759786a2017-03-03 17:35:47 -08006919int radio::newSmsStatusReportInd(int slotId,
Amit Mahajan5829a472016-12-28 17:28:07 -08006920 int indicationType, int token, RIL_Errno e, void *response,
6921 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08006922 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan5829a472016-12-28 17:28:07 -08006923 if (response == NULL || responseLen == 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006924 RLOGE("newSmsStatusReportInd: invalid response");
Amit Mahajan5829a472016-12-28 17:28:07 -08006925 return 0;
6926 }
6927
6928 uint8_t *bytes = convertHexStringToBytes(response, responseLen);
6929 if (bytes == NULL) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006930 RLOGE("newSmsStatusReportInd: convertHexStringToBytes failed");
Amit Mahajan5829a472016-12-28 17:28:07 -08006931 return 0;
6932 }
6933
6934 hidl_vec<uint8_t> pdu;
6935 pdu.setToExternal(bytes, responseLen/2);
Jayachandran C572f2f42017-03-25 14:30:13 -07006936#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006937 RLOGD("newSmsStatusReportInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07006938#endif
Amit Mahajan17249842017-01-19 15:05:45 -08006939 Return<void> retStatus = radioService[slotId]->mRadioIndication->newSmsStatusReport(
Amit Mahajan5829a472016-12-28 17:28:07 -08006940 convertIntToRadioIndicationType(indicationType), pdu);
Amit Mahajan17249842017-01-19 15:05:45 -08006941 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08006942 free(bytes);
6943 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006944 RLOGE("newSmsStatusReportInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08006945 }
6946
6947 return 0;
6948}
6949
Amit Mahajan759786a2017-03-03 17:35:47 -08006950int radio::newSmsOnSimInd(int slotId, int indicationType,
Amit Mahajan5829a472016-12-28 17:28:07 -08006951 int token, RIL_Errno e, void *response, size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08006952 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan5829a472016-12-28 17:28:07 -08006953 if (response == NULL || responseLen != sizeof(int)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006954 RLOGE("newSmsOnSimInd: invalid response");
Amit Mahajan5829a472016-12-28 17:28:07 -08006955 return 0;
6956 }
6957 int32_t recordNumber = ((int32_t *) response)[0];
Jayachandran C572f2f42017-03-25 14:30:13 -07006958#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006959 RLOGD("newSmsOnSimInd: slotIndex %d", recordNumber);
Jayachandran C572f2f42017-03-25 14:30:13 -07006960#endif
Amit Mahajan17249842017-01-19 15:05:45 -08006961 Return<void> retStatus = radioService[slotId]->mRadioIndication->newSmsOnSim(
Amit Mahajan5829a472016-12-28 17:28:07 -08006962 convertIntToRadioIndicationType(indicationType), recordNumber);
Amit Mahajan17249842017-01-19 15:05:45 -08006963 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08006964 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006965 RLOGE("newSmsOnSimInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08006966 }
6967
6968 return 0;
6969}
6970
Amit Mahajan759786a2017-03-03 17:35:47 -08006971int radio::onUssdInd(int slotId, int indicationType,
Amit Mahajan5829a472016-12-28 17:28:07 -08006972 int token, RIL_Errno e, void *response, size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08006973 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan5829a472016-12-28 17:28:07 -08006974 if (response == NULL || responseLen != 2 * sizeof(char *)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006975 RLOGE("onUssdInd: invalid response");
Amit Mahajan5829a472016-12-28 17:28:07 -08006976 return 0;
6977 }
6978 char **strings = (char **) response;
6979 char *mode = strings[0];
6980 hidl_string msg = convertCharPtrToHidlString(strings[1]);
6981 UssdModeType modeType = (UssdModeType) atoi(mode);
Jayachandran C572f2f42017-03-25 14:30:13 -07006982#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006983 RLOGD("onUssdInd: mode %s", mode);
Jayachandran C572f2f42017-03-25 14:30:13 -07006984#endif
Amit Mahajan17249842017-01-19 15:05:45 -08006985 Return<void> retStatus = radioService[slotId]->mRadioIndication->onUssd(
Amit Mahajan5829a472016-12-28 17:28:07 -08006986 convertIntToRadioIndicationType(indicationType), modeType, msg);
Amit Mahajan17249842017-01-19 15:05:45 -08006987 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08006988 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006989 RLOGE("onUssdInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08006990 }
6991
6992 return 0;
6993}
6994
Amit Mahajan759786a2017-03-03 17:35:47 -08006995int radio::nitzTimeReceivedInd(int slotId,
Amit Mahajan5829a472016-12-28 17:28:07 -08006996 int indicationType, int token, RIL_Errno e, void *response,
6997 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08006998 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan5829a472016-12-28 17:28:07 -08006999 if (response == NULL || responseLen == 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007000 RLOGE("nitzTimeReceivedInd: invalid response");
Amit Mahajan5829a472016-12-28 17:28:07 -08007001 return 0;
7002 }
7003 hidl_string nitzTime = convertCharPtrToHidlString((char *) response);
Jayachandran C572f2f42017-03-25 14:30:13 -07007004#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007005 RLOGD("nitzTimeReceivedInd: nitzTime %s receivedTime %" PRId64, nitzTime.c_str(),
Amit Mahajane9a10e62018-02-23 17:12:15 -08007006 nitzTimeReceived[slotId]);
Jayachandran C572f2f42017-03-25 14:30:13 -07007007#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007008 Return<void> retStatus = radioService[slotId]->mRadioIndication->nitzTimeReceived(
Amit Mahajane9a10e62018-02-23 17:12:15 -08007009 convertIntToRadioIndicationType(indicationType), nitzTime,
7010 nitzTimeReceived[slotId]);
Amit Mahajan17249842017-01-19 15:05:45 -08007011 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08007012 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007013 RLOGE("nitzTimeReceivedInd: radioService[%d]->mRadioIndication == NULL", slotId);
Weilun Dud2c30932017-02-09 12:32:42 -08007014 return -1;
Amit Mahajan5829a472016-12-28 17:28:07 -08007015 }
7016
7017 return 0;
7018}
7019
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007020void convertRilSignalStrengthToHal(void *response, size_t responseLen,
7021 SignalStrength& signalStrength) {
7022 RIL_SignalStrength_v10 *rilSignalStrength = (RIL_SignalStrength_v10 *) response;
7023
7024 // Fixup LTE for backwards compatibility
7025 // signalStrength: -1 -> 99
7026 if (rilSignalStrength->LTE_SignalStrength.signalStrength == -1) {
7027 rilSignalStrength->LTE_SignalStrength.signalStrength = 99;
7028 }
7029 // rsrp: -1 -> INT_MAX all other negative value to positive.
7030 // So remap here
7031 if (rilSignalStrength->LTE_SignalStrength.rsrp == -1) {
7032 rilSignalStrength->LTE_SignalStrength.rsrp = INT_MAX;
7033 } else if (rilSignalStrength->LTE_SignalStrength.rsrp < -1) {
7034 rilSignalStrength->LTE_SignalStrength.rsrp = -rilSignalStrength->LTE_SignalStrength.rsrp;
7035 }
7036 // rsrq: -1 -> INT_MAX
7037 if (rilSignalStrength->LTE_SignalStrength.rsrq == -1) {
7038 rilSignalStrength->LTE_SignalStrength.rsrq = INT_MAX;
7039 }
7040 // Not remapping rssnr is already using INT_MAX
7041 // cqi: -1 -> INT_MAX
7042 if (rilSignalStrength->LTE_SignalStrength.cqi == -1) {
7043 rilSignalStrength->LTE_SignalStrength.cqi = INT_MAX;
7044 }
7045
7046 signalStrength.gw.signalStrength = rilSignalStrength->GW_SignalStrength.signalStrength;
7047 signalStrength.gw.bitErrorRate = rilSignalStrength->GW_SignalStrength.bitErrorRate;
7048 signalStrength.cdma.dbm = rilSignalStrength->CDMA_SignalStrength.dbm;
7049 signalStrength.cdma.ecio = rilSignalStrength->CDMA_SignalStrength.ecio;
7050 signalStrength.evdo.dbm = rilSignalStrength->EVDO_SignalStrength.dbm;
7051 signalStrength.evdo.ecio = rilSignalStrength->EVDO_SignalStrength.ecio;
7052 signalStrength.evdo.signalNoiseRatio =
7053 rilSignalStrength->EVDO_SignalStrength.signalNoiseRatio;
7054 signalStrength.lte.signalStrength = rilSignalStrength->LTE_SignalStrength.signalStrength;
7055 signalStrength.lte.rsrp = rilSignalStrength->LTE_SignalStrength.rsrp;
7056 signalStrength.lte.rsrq = rilSignalStrength->LTE_SignalStrength.rsrq;
7057 signalStrength.lte.rssnr = rilSignalStrength->LTE_SignalStrength.rssnr;
7058 signalStrength.lte.cqi = rilSignalStrength->LTE_SignalStrength.cqi;
7059 signalStrength.lte.timingAdvance = rilSignalStrength->LTE_SignalStrength.timingAdvance;
7060 signalStrength.tdScdma.rscp = rilSignalStrength->TD_SCDMA_SignalStrength.rscp;
7061}
7062
Amit Mahajan759786a2017-03-03 17:35:47 -08007063int radio::currentSignalStrengthInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007064 int indicationType, int token, RIL_Errno e,
7065 void *response, size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007066 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007067 if (response == NULL || responseLen != sizeof(RIL_SignalStrength_v10)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007068 RLOGE("currentSignalStrengthInd: invalid response");
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007069 return 0;
7070 }
7071
Jack Yuf68e0da2017-02-07 14:53:09 -08007072 SignalStrength signalStrength = {};
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007073 convertRilSignalStrengthToHal(response, responseLen, signalStrength);
7074
Jayachandran C572f2f42017-03-25 14:30:13 -07007075#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007076 RLOGD("currentSignalStrengthInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07007077#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007078 Return<void> retStatus = radioService[slotId]->mRadioIndication->currentSignalStrength(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007079 convertIntToRadioIndicationType(indicationType), signalStrength);
Amit Mahajan17249842017-01-19 15:05:45 -08007080 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007081 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007082 RLOGE("currentSignalStrengthInd: radioService[%d]->mRadioIndication == NULL",
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007083 slotId);
7084 }
7085
7086 return 0;
7087}
7088
Amit Mahajan5829a472016-12-28 17:28:07 -08007089void convertRilDataCallToHal(RIL_Data_Call_Response_v11 *dcResponse,
7090 SetupDataCallResult& dcResult) {
Jack Yu5079e182017-02-28 15:21:18 -08007091 dcResult.status = (DataCallFailCause) dcResponse->status;
Amit Mahajan5829a472016-12-28 17:28:07 -08007092 dcResult.suggestedRetryTime = dcResponse->suggestedRetryTime;
7093 dcResult.cid = dcResponse->cid;
7094 dcResult.active = dcResponse->active;
7095 dcResult.type = convertCharPtrToHidlString(dcResponse->type);
7096 dcResult.ifname = convertCharPtrToHidlString(dcResponse->ifname);
7097 dcResult.addresses = convertCharPtrToHidlString(dcResponse->addresses);
7098 dcResult.dnses = convertCharPtrToHidlString(dcResponse->dnses);
7099 dcResult.gateways = convertCharPtrToHidlString(dcResponse->gateways);
7100 dcResult.pcscf = convertCharPtrToHidlString(dcResponse->pcscf);
7101 dcResult.mtu = dcResponse->mtu;
7102}
7103
7104void convertRilDataCallListToHal(void *response, size_t responseLen,
7105 hidl_vec<SetupDataCallResult>& dcResultList) {
7106 int num = responseLen / sizeof(RIL_Data_Call_Response_v11);
7107
7108 RIL_Data_Call_Response_v11 *dcResponse = (RIL_Data_Call_Response_v11 *) response;
7109 dcResultList.resize(num);
7110 for (int i = 0; i < num; i++) {
7111 convertRilDataCallToHal(&dcResponse[i], dcResultList[i]);
7112 }
7113}
7114
Amit Mahajan759786a2017-03-03 17:35:47 -08007115int radio::dataCallListChangedInd(int slotId,
Amit Mahajan5829a472016-12-28 17:28:07 -08007116 int indicationType, int token, RIL_Errno e, void *response,
7117 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007118 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan13058cb2017-06-07 23:10:27 -07007119 if ((response == NULL && responseLen != 0)
7120 || responseLen % sizeof(RIL_Data_Call_Response_v11) != 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007121 RLOGE("dataCallListChangedInd: invalid response");
Amit Mahajan5829a472016-12-28 17:28:07 -08007122 return 0;
7123 }
7124 hidl_vec<SetupDataCallResult> dcList;
7125 convertRilDataCallListToHal(response, responseLen, dcList);
Jayachandran C572f2f42017-03-25 14:30:13 -07007126#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007127 RLOGD("dataCallListChangedInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07007128#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007129 Return<void> retStatus = radioService[slotId]->mRadioIndication->dataCallListChanged(
Amit Mahajan5829a472016-12-28 17:28:07 -08007130 convertIntToRadioIndicationType(indicationType), dcList);
Amit Mahajan17249842017-01-19 15:05:45 -08007131 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08007132 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007133 RLOGE("dataCallListChangedInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08007134 }
7135
7136 return 0;
7137}
7138
Amit Mahajan759786a2017-03-03 17:35:47 -08007139int radio::suppSvcNotifyInd(int slotId, int indicationType,
Amit Mahajan5829a472016-12-28 17:28:07 -08007140 int token, RIL_Errno e, void *response, size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007141 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan5829a472016-12-28 17:28:07 -08007142 if (response == NULL || responseLen != sizeof(RIL_SuppSvcNotification)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007143 RLOGE("suppSvcNotifyInd: invalid response");
Amit Mahajan5829a472016-12-28 17:28:07 -08007144 return 0;
7145 }
7146
Jack Yuf68e0da2017-02-07 14:53:09 -08007147 SuppSvcNotification suppSvc = {};
Amit Mahajan5829a472016-12-28 17:28:07 -08007148 RIL_SuppSvcNotification *ssn = (RIL_SuppSvcNotification *) response;
7149 suppSvc.isMT = ssn->notificationType;
7150 suppSvc.code = ssn->code;
7151 suppSvc.index = ssn->index;
7152 suppSvc.type = ssn->type;
7153 suppSvc.number = convertCharPtrToHidlString(ssn->number);
7154
Jayachandran C572f2f42017-03-25 14:30:13 -07007155#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007156 RLOGD("suppSvcNotifyInd: isMT %d code %d index %d type %d",
Amit Mahajan5829a472016-12-28 17:28:07 -08007157 suppSvc.isMT, suppSvc.code, suppSvc.index, suppSvc.type);
Jayachandran C572f2f42017-03-25 14:30:13 -07007158#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007159 Return<void> retStatus = radioService[slotId]->mRadioIndication->suppSvcNotify(
Amit Mahajan5829a472016-12-28 17:28:07 -08007160 convertIntToRadioIndicationType(indicationType), suppSvc);
Amit Mahajan17249842017-01-19 15:05:45 -08007161 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08007162 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007163 RLOGE("suppSvcNotifyInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08007164 }
7165
7166 return 0;
7167}
7168
Amit Mahajan759786a2017-03-03 17:35:47 -08007169int radio::stkSessionEndInd(int slotId, int indicationType,
Amit Mahajan5829a472016-12-28 17:28:07 -08007170 int token, RIL_Errno e, void *response, size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007171 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Jayachandran C572f2f42017-03-25 14:30:13 -07007172#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007173 RLOGD("stkSessionEndInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07007174#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007175 Return<void> retStatus = radioService[slotId]->mRadioIndication->stkSessionEnd(
Amit Mahajan5829a472016-12-28 17:28:07 -08007176 convertIntToRadioIndicationType(indicationType));
Amit Mahajan17249842017-01-19 15:05:45 -08007177 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08007178 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007179 RLOGE("stkSessionEndInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08007180 }
7181
7182 return 0;
7183}
7184
Amit Mahajan759786a2017-03-03 17:35:47 -08007185int radio::stkProactiveCommandInd(int slotId,
Amit Mahajan5829a472016-12-28 17:28:07 -08007186 int indicationType, int token, RIL_Errno e, void *response,
7187 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007188 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan5829a472016-12-28 17:28:07 -08007189 if (response == NULL || responseLen == 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007190 RLOGE("stkProactiveCommandInd: invalid response");
Amit Mahajan5829a472016-12-28 17:28:07 -08007191 return 0;
7192 }
Jayachandran C572f2f42017-03-25 14:30:13 -07007193#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007194 RLOGD("stkProactiveCommandInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07007195#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007196 Return<void> retStatus = radioService[slotId]->mRadioIndication->stkProactiveCommand(
Amit Mahajan5829a472016-12-28 17:28:07 -08007197 convertIntToRadioIndicationType(indicationType),
7198 convertCharPtrToHidlString((char *) response));
Amit Mahajan17249842017-01-19 15:05:45 -08007199 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08007200 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007201 RLOGE("stkProactiveCommandInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08007202 }
7203
7204 return 0;
7205}
7206
Amit Mahajan759786a2017-03-03 17:35:47 -08007207int radio::stkEventNotifyInd(int slotId, int indicationType,
Amit Mahajan5829a472016-12-28 17:28:07 -08007208 int token, RIL_Errno e, void *response, size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007209 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan5829a472016-12-28 17:28:07 -08007210 if (response == NULL || responseLen == 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007211 RLOGE("stkEventNotifyInd: invalid response");
Amit Mahajan5829a472016-12-28 17:28:07 -08007212 return 0;
7213 }
Jayachandran C572f2f42017-03-25 14:30:13 -07007214#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007215 RLOGD("stkEventNotifyInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07007216#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007217 Return<void> retStatus = radioService[slotId]->mRadioIndication->stkEventNotify(
Amit Mahajan5829a472016-12-28 17:28:07 -08007218 convertIntToRadioIndicationType(indicationType),
7219 convertCharPtrToHidlString((char *) response));
Amit Mahajan17249842017-01-19 15:05:45 -08007220 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08007221 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007222 RLOGE("stkEventNotifyInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08007223 }
7224
7225 return 0;
7226}
7227
Amit Mahajan759786a2017-03-03 17:35:47 -08007228int radio::stkCallSetupInd(int slotId, int indicationType,
Amit Mahajan5829a472016-12-28 17:28:07 -08007229 int token, RIL_Errno e, void *response, size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007230 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan5829a472016-12-28 17:28:07 -08007231 if (response == NULL || responseLen != sizeof(int)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007232 RLOGE("stkCallSetupInd: invalid response");
Amit Mahajan5829a472016-12-28 17:28:07 -08007233 return 0;
7234 }
7235 int32_t timeout = ((int32_t *) response)[0];
Jayachandran C572f2f42017-03-25 14:30:13 -07007236#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007237 RLOGD("stkCallSetupInd: timeout %d", timeout);
Jayachandran C572f2f42017-03-25 14:30:13 -07007238#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007239 Return<void> retStatus = radioService[slotId]->mRadioIndication->stkCallSetup(
Amit Mahajan5829a472016-12-28 17:28:07 -08007240 convertIntToRadioIndicationType(indicationType), timeout);
Amit Mahajan17249842017-01-19 15:05:45 -08007241 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08007242 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007243 RLOGE("stkCallSetupInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08007244 }
7245
7246 return 0;
7247}
7248
Amit Mahajan759786a2017-03-03 17:35:47 -08007249int radio::simSmsStorageFullInd(int slotId,
Amit Mahajan5829a472016-12-28 17:28:07 -08007250 int indicationType, int token, RIL_Errno e, void *response,
7251 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007252 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Jayachandran C572f2f42017-03-25 14:30:13 -07007253#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007254 RLOGD("simSmsStorageFullInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07007255#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007256 Return<void> retStatus = radioService[slotId]->mRadioIndication->simSmsStorageFull(
Amit Mahajan5829a472016-12-28 17:28:07 -08007257 convertIntToRadioIndicationType(indicationType));
Amit Mahajan17249842017-01-19 15:05:45 -08007258 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08007259 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007260 RLOGE("simSmsStorageFullInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08007261 }
7262
7263 return 0;
7264}
7265
Amit Mahajan759786a2017-03-03 17:35:47 -08007266int radio::simRefreshInd(int slotId, int indicationType,
Amit Mahajan5829a472016-12-28 17:28:07 -08007267 int token, RIL_Errno e, void *response, size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007268 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan5829a472016-12-28 17:28:07 -08007269 if (response == NULL || responseLen != sizeof(RIL_SimRefreshResponse_v7)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007270 RLOGE("simRefreshInd: invalid response");
Amit Mahajan5829a472016-12-28 17:28:07 -08007271 return 0;
7272 }
7273
Jack Yuf68e0da2017-02-07 14:53:09 -08007274 SimRefreshResult refreshResult = {};
Amit Mahajan5829a472016-12-28 17:28:07 -08007275 RIL_SimRefreshResponse_v7 *simRefreshResponse = ((RIL_SimRefreshResponse_v7 *) response);
7276 refreshResult.type =
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07007277 (V1_0::SimRefreshType) simRefreshResponse->result;
Amit Mahajan5829a472016-12-28 17:28:07 -08007278 refreshResult.efId = simRefreshResponse->ef_id;
7279 refreshResult.aid = convertCharPtrToHidlString(simRefreshResponse->aid);
7280
Jayachandran C572f2f42017-03-25 14:30:13 -07007281#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007282 RLOGD("simRefreshInd: type %d efId %d", refreshResult.type, refreshResult.efId);
Jayachandran C572f2f42017-03-25 14:30:13 -07007283#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007284 Return<void> retStatus = radioService[slotId]->mRadioIndication->simRefresh(
Amit Mahajan5829a472016-12-28 17:28:07 -08007285 convertIntToRadioIndicationType(indicationType), refreshResult);
Amit Mahajan17249842017-01-19 15:05:45 -08007286 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08007287 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007288 RLOGE("simRefreshInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08007289 }
7290
7291 return 0;
7292}
7293
7294void convertRilCdmaSignalInfoRecordToHal(RIL_CDMA_SignalInfoRecord *signalInfoRecord,
7295 CdmaSignalInfoRecord& record) {
7296 record.isPresent = signalInfoRecord->isPresent;
7297 record.signalType = signalInfoRecord->signalType;
7298 record.alertPitch = signalInfoRecord->alertPitch;
7299 record.signal = signalInfoRecord->signal;
7300}
7301
Amit Mahajan759786a2017-03-03 17:35:47 -08007302int radio::callRingInd(int slotId, int indicationType,
Amit Mahajan5829a472016-12-28 17:28:07 -08007303 int token, RIL_Errno e, void *response, size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007304 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan5829a472016-12-28 17:28:07 -08007305 bool isGsm;
Jack Yuf68e0da2017-02-07 14:53:09 -08007306 CdmaSignalInfoRecord record = {};
Amit Mahajan5829a472016-12-28 17:28:07 -08007307 if (response == NULL || responseLen == 0) {
7308 isGsm = true;
7309 } else {
7310 isGsm = false;
7311 if (responseLen != sizeof (RIL_CDMA_SignalInfoRecord)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007312 RLOGE("callRingInd: invalid response");
Amit Mahajan5829a472016-12-28 17:28:07 -08007313 return 0;
7314 }
7315 convertRilCdmaSignalInfoRecordToHal((RIL_CDMA_SignalInfoRecord *) response, record);
7316 }
7317
Jayachandran C572f2f42017-03-25 14:30:13 -07007318#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007319 RLOGD("callRingInd: isGsm %d", isGsm);
Jayachandran C572f2f42017-03-25 14:30:13 -07007320#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007321 Return<void> retStatus = radioService[slotId]->mRadioIndication->callRing(
Amit Mahajan5829a472016-12-28 17:28:07 -08007322 convertIntToRadioIndicationType(indicationType), isGsm, record);
Amit Mahajan17249842017-01-19 15:05:45 -08007323 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08007324 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007325 RLOGE("callRingInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08007326 }
7327
7328 return 0;
7329}
7330
Amit Mahajan759786a2017-03-03 17:35:47 -08007331int radio::simStatusChangedInd(int slotId,
Amit Mahajan5829a472016-12-28 17:28:07 -08007332 int indicationType, int token, RIL_Errno e, void *response,
7333 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007334 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Jayachandran C572f2f42017-03-25 14:30:13 -07007335#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007336 RLOGD("simStatusChangedInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07007337#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007338 Return<void> retStatus = radioService[slotId]->mRadioIndication->simStatusChanged(
Amit Mahajan5829a472016-12-28 17:28:07 -08007339 convertIntToRadioIndicationType(indicationType));
Amit Mahajan17249842017-01-19 15:05:45 -08007340 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08007341 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007342 RLOGE("simStatusChangedInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08007343 }
7344
7345 return 0;
7346}
7347
Amit Mahajan759786a2017-03-03 17:35:47 -08007348int radio::cdmaNewSmsInd(int slotId, int indicationType,
Amit Mahajan5829a472016-12-28 17:28:07 -08007349 int token, RIL_Errno e, void *response, size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007350 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan5829a472016-12-28 17:28:07 -08007351 if (response == NULL || responseLen != sizeof(RIL_CDMA_SMS_Message)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007352 RLOGE("cdmaNewSmsInd: invalid response");
Amit Mahajan5829a472016-12-28 17:28:07 -08007353 return 0;
7354 }
7355
Jack Yuf68e0da2017-02-07 14:53:09 -08007356 CdmaSmsMessage msg = {};
Amit Mahajan5829a472016-12-28 17:28:07 -08007357 RIL_CDMA_SMS_Message *rilMsg = (RIL_CDMA_SMS_Message *) response;
7358 msg.teleserviceId = rilMsg->uTeleserviceID;
7359 msg.isServicePresent = rilMsg->bIsServicePresent;
7360 msg.serviceCategory = rilMsg->uServicecategory;
7361 msg.address.digitMode =
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07007362 (V1_0::CdmaSmsDigitMode) rilMsg->sAddress.digit_mode;
Amit Mahajan5829a472016-12-28 17:28:07 -08007363 msg.address.numberMode =
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07007364 (V1_0::CdmaSmsNumberMode) rilMsg->sAddress.number_mode;
Amit Mahajan5829a472016-12-28 17:28:07 -08007365 msg.address.numberType =
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07007366 (V1_0::CdmaSmsNumberType) rilMsg->sAddress.number_type;
Amit Mahajan5829a472016-12-28 17:28:07 -08007367 msg.address.numberPlan =
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07007368 (V1_0::CdmaSmsNumberPlan) rilMsg->sAddress.number_plan;
Amit Mahajan5829a472016-12-28 17:28:07 -08007369
7370 int digitLimit = MIN((rilMsg->sAddress.number_of_digits), RIL_CDMA_SMS_ADDRESS_MAX);
7371 msg.address.digits.setToExternal(rilMsg->sAddress.digits, digitLimit);
7372
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07007373 msg.subAddress.subaddressType = (V1_0::CdmaSmsSubaddressType)
Amit Mahajan5829a472016-12-28 17:28:07 -08007374 rilMsg->sSubAddress.subaddressType;
7375 msg.subAddress.odd = rilMsg->sSubAddress.odd;
7376
7377 digitLimit= MIN((rilMsg->sSubAddress.number_of_digits), RIL_CDMA_SMS_SUBADDRESS_MAX);
7378 msg.subAddress.digits.setToExternal(rilMsg->sSubAddress.digits, digitLimit);
7379
7380 digitLimit = MIN((rilMsg->uBearerDataLen), RIL_CDMA_SMS_BEARER_DATA_MAX);
7381 msg.bearerData.setToExternal(rilMsg->aBearerData, digitLimit);
7382
Jayachandran C572f2f42017-03-25 14:30:13 -07007383#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007384 RLOGD("cdmaNewSmsInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07007385#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007386 Return<void> retStatus = radioService[slotId]->mRadioIndication->cdmaNewSms(
Amit Mahajan5829a472016-12-28 17:28:07 -08007387 convertIntToRadioIndicationType(indicationType), msg);
Amit Mahajan17249842017-01-19 15:05:45 -08007388 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08007389 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007390 RLOGE("cdmaNewSmsInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08007391 }
7392
7393 return 0;
7394}
7395
Amit Mahajan759786a2017-03-03 17:35:47 -08007396int radio::newBroadcastSmsInd(int slotId,
Amit Mahajan1955c742016-12-29 07:07:54 -08007397 int indicationType, int token, RIL_Errno e, void *response,
7398 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007399 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan1955c742016-12-29 07:07:54 -08007400 if (response == NULL || responseLen == 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007401 RLOGE("newBroadcastSmsInd: invalid response");
Amit Mahajan1955c742016-12-29 07:07:54 -08007402 return 0;
7403 }
7404
7405 hidl_vec<uint8_t> data;
7406 data.setToExternal((uint8_t *) response, responseLen);
Jayachandran C572f2f42017-03-25 14:30:13 -07007407#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007408 RLOGD("newBroadcastSmsInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07007409#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007410 Return<void> retStatus = radioService[slotId]->mRadioIndication->newBroadcastSms(
Amit Mahajan1955c742016-12-29 07:07:54 -08007411 convertIntToRadioIndicationType(indicationType), data);
Amit Mahajan17249842017-01-19 15:05:45 -08007412 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan1955c742016-12-29 07:07:54 -08007413 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007414 RLOGE("newBroadcastSmsInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan1955c742016-12-29 07:07:54 -08007415 }
7416
7417 return 0;
7418}
7419
Amit Mahajan759786a2017-03-03 17:35:47 -08007420int radio::cdmaRuimSmsStorageFullInd(int slotId,
Amit Mahajan1955c742016-12-29 07:07:54 -08007421 int indicationType, int token, RIL_Errno e, void *response,
7422 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007423 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Jayachandran C572f2f42017-03-25 14:30:13 -07007424#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007425 RLOGD("cdmaRuimSmsStorageFullInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07007426#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007427 Return<void> retStatus = radioService[slotId]->mRadioIndication->cdmaRuimSmsStorageFull(
Amit Mahajan1955c742016-12-29 07:07:54 -08007428 convertIntToRadioIndicationType(indicationType));
Amit Mahajan17249842017-01-19 15:05:45 -08007429 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan1955c742016-12-29 07:07:54 -08007430 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007431 RLOGE("cdmaRuimSmsStorageFullInd: radioService[%d]->mRadioIndication == NULL",
Amit Mahajan1955c742016-12-29 07:07:54 -08007432 slotId);
7433 }
7434
7435 return 0;
7436}
7437
Amit Mahajan759786a2017-03-03 17:35:47 -08007438int radio::restrictedStateChangedInd(int slotId,
Amit Mahajan1955c742016-12-29 07:07:54 -08007439 int indicationType, int token, RIL_Errno e, void *response,
7440 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007441 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan1955c742016-12-29 07:07:54 -08007442 if (response == NULL || responseLen != sizeof(int)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007443 RLOGE("restrictedStateChangedInd: invalid response");
Amit Mahajan1955c742016-12-29 07:07:54 -08007444 return 0;
7445 }
7446 int32_t state = ((int32_t *) response)[0];
Jayachandran C572f2f42017-03-25 14:30:13 -07007447#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007448 RLOGD("restrictedStateChangedInd: state %d", state);
Jayachandran C572f2f42017-03-25 14:30:13 -07007449#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007450 Return<void> retStatus = radioService[slotId]->mRadioIndication->restrictedStateChanged(
Amit Mahajan1955c742016-12-29 07:07:54 -08007451 convertIntToRadioIndicationType(indicationType), (PhoneRestrictedState) state);
Amit Mahajan17249842017-01-19 15:05:45 -08007452 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan1955c742016-12-29 07:07:54 -08007453 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007454 RLOGE("restrictedStateChangedInd: radioService[%d]->mRadioIndication == NULL",
Amit Mahajan1955c742016-12-29 07:07:54 -08007455 slotId);
7456 }
7457
7458 return 0;
7459}
7460
Amit Mahajan759786a2017-03-03 17:35:47 -08007461int radio::enterEmergencyCallbackModeInd(int slotId,
Amit Mahajan1955c742016-12-29 07:07:54 -08007462 int indicationType, int token, RIL_Errno e, void *response,
7463 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007464 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Jayachandran C572f2f42017-03-25 14:30:13 -07007465#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007466 RLOGD("enterEmergencyCallbackModeInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07007467#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007468 Return<void> retStatus = radioService[slotId]->mRadioIndication->enterEmergencyCallbackMode(
Amit Mahajan1955c742016-12-29 07:07:54 -08007469 convertIntToRadioIndicationType(indicationType));
Amit Mahajan17249842017-01-19 15:05:45 -08007470 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan1955c742016-12-29 07:07:54 -08007471 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007472 RLOGE("enterEmergencyCallbackModeInd: radioService[%d]->mRadioIndication == NULL",
Amit Mahajan1955c742016-12-29 07:07:54 -08007473 slotId);
7474 }
7475
7476 return 0;
7477}
7478
Amit Mahajan759786a2017-03-03 17:35:47 -08007479int radio::cdmaCallWaitingInd(int slotId,
Amit Mahajan1955c742016-12-29 07:07:54 -08007480 int indicationType, int token, RIL_Errno e, void *response,
7481 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007482 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan1955c742016-12-29 07:07:54 -08007483 if (response == NULL || responseLen != sizeof(RIL_CDMA_CallWaiting_v6)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007484 RLOGE("cdmaCallWaitingInd: invalid response");
Amit Mahajan1955c742016-12-29 07:07:54 -08007485 return 0;
7486 }
7487
Jack Yuf68e0da2017-02-07 14:53:09 -08007488 CdmaCallWaiting callWaitingRecord = {};
Amit Mahajan1955c742016-12-29 07:07:54 -08007489 RIL_CDMA_CallWaiting_v6 *callWaitingRil = ((RIL_CDMA_CallWaiting_v6 *) response);
7490 callWaitingRecord.number = convertCharPtrToHidlString(callWaitingRil->number);
7491 callWaitingRecord.numberPresentation =
7492 (CdmaCallWaitingNumberPresentation) callWaitingRil->numberPresentation;
7493 callWaitingRecord.name = convertCharPtrToHidlString(callWaitingRil->name);
7494 convertRilCdmaSignalInfoRecordToHal(&callWaitingRil->signalInfoRecord,
7495 callWaitingRecord.signalInfoRecord);
7496 callWaitingRecord.numberType = (CdmaCallWaitingNumberType) callWaitingRil->number_type;
7497 callWaitingRecord.numberPlan = (CdmaCallWaitingNumberPlan) callWaitingRil->number_plan;
7498
Jayachandran C572f2f42017-03-25 14:30:13 -07007499#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007500 RLOGD("cdmaCallWaitingInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07007501#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007502 Return<void> retStatus = radioService[slotId]->mRadioIndication->cdmaCallWaiting(
Amit Mahajan1955c742016-12-29 07:07:54 -08007503 convertIntToRadioIndicationType(indicationType), callWaitingRecord);
Amit Mahajan17249842017-01-19 15:05:45 -08007504 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan1955c742016-12-29 07:07:54 -08007505 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007506 RLOGE("cdmaCallWaitingInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan1955c742016-12-29 07:07:54 -08007507 }
7508
7509 return 0;
7510}
7511
Amit Mahajan759786a2017-03-03 17:35:47 -08007512int radio::cdmaOtaProvisionStatusInd(int slotId,
Amit Mahajan1955c742016-12-29 07:07:54 -08007513 int indicationType, int token, RIL_Errno e, void *response,
7514 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007515 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan1955c742016-12-29 07:07:54 -08007516 if (response == NULL || responseLen != sizeof(int)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007517 RLOGE("cdmaOtaProvisionStatusInd: invalid response");
Amit Mahajan1955c742016-12-29 07:07:54 -08007518 return 0;
7519 }
7520 int32_t status = ((int32_t *) response)[0];
Jayachandran C572f2f42017-03-25 14:30:13 -07007521#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007522 RLOGD("cdmaOtaProvisionStatusInd: status %d", status);
Jayachandran C572f2f42017-03-25 14:30:13 -07007523#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007524 Return<void> retStatus = radioService[slotId]->mRadioIndication->cdmaOtaProvisionStatus(
Amit Mahajan1955c742016-12-29 07:07:54 -08007525 convertIntToRadioIndicationType(indicationType), (CdmaOtaProvisionStatus) status);
Amit Mahajan17249842017-01-19 15:05:45 -08007526 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan1955c742016-12-29 07:07:54 -08007527 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007528 RLOGE("cdmaOtaProvisionStatusInd: radioService[%d]->mRadioIndication == NULL",
Amit Mahajan1955c742016-12-29 07:07:54 -08007529 slotId);
7530 }
7531
7532 return 0;
7533}
7534
Amit Mahajan759786a2017-03-03 17:35:47 -08007535int radio::cdmaInfoRecInd(int slotId,
Amit Mahajan1955c742016-12-29 07:07:54 -08007536 int indicationType, int token, RIL_Errno e, void *response,
7537 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007538 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan1955c742016-12-29 07:07:54 -08007539 if (response == NULL || responseLen != sizeof(RIL_CDMA_InformationRecords)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007540 RLOGE("cdmaInfoRecInd: invalid response");
Amit Mahajan1955c742016-12-29 07:07:54 -08007541 return 0;
7542 }
7543
Jack Yuf68e0da2017-02-07 14:53:09 -08007544 CdmaInformationRecords records = {};
Amit Mahajan1955c742016-12-29 07:07:54 -08007545 RIL_CDMA_InformationRecords *recordsRil = (RIL_CDMA_InformationRecords *) response;
7546
7547 char* string8 = NULL;
7548 int num = MIN(recordsRil->numberOfInfoRecs, RIL_CDMA_MAX_NUMBER_OF_INFO_RECS);
7549 if (recordsRil->numberOfInfoRecs > RIL_CDMA_MAX_NUMBER_OF_INFO_RECS) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007550 RLOGE("cdmaInfoRecInd: received %d recs which is more than %d, dropping "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08007551 "additional ones", recordsRil->numberOfInfoRecs,
Amit Mahajan1955c742016-12-29 07:07:54 -08007552 RIL_CDMA_MAX_NUMBER_OF_INFO_RECS);
7553 }
7554 records.infoRec.resize(num);
7555 for (int i = 0 ; i < num ; i++) {
7556 CdmaInformationRecord *record = &records.infoRec[i];
7557 RIL_CDMA_InformationRecord *infoRec = &recordsRil->infoRec[i];
7558 record->name = (CdmaInfoRecName) infoRec->name;
Sanket Padawe378ccdd2017-01-24 14:11:12 -08007559 // All vectors should be size 0 except one which will be size 1. Set everything to
7560 // size 0 initially.
7561 record->display.resize(0);
7562 record->number.resize(0);
7563 record->signal.resize(0);
7564 record->redir.resize(0);
7565 record->lineCtrl.resize(0);
7566 record->clir.resize(0);
7567 record->audioCtrl.resize(0);
Amit Mahajan1955c742016-12-29 07:07:54 -08007568 switch (infoRec->name) {
7569 case RIL_CDMA_DISPLAY_INFO_REC:
7570 case RIL_CDMA_EXTENDED_DISPLAY_INFO_REC: {
7571 if (infoRec->rec.display.alpha_len > CDMA_ALPHA_INFO_BUFFER_LENGTH) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007572 RLOGE("cdmaInfoRecInd: invalid display info response length %d "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08007573 "expected not more than %d", (int) infoRec->rec.display.alpha_len,
Amit Mahajan1955c742016-12-29 07:07:54 -08007574 CDMA_ALPHA_INFO_BUFFER_LENGTH);
7575 return 0;
7576 }
7577 string8 = (char*) malloc((infoRec->rec.display.alpha_len + 1) * sizeof(char));
7578 if (string8 == NULL) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007579 RLOGE("cdmaInfoRecInd: Memory allocation failed for "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08007580 "responseCdmaInformationRecords");
Amit Mahajan1955c742016-12-29 07:07:54 -08007581 return 0;
7582 }
7583 memcpy(string8, infoRec->rec.display.alpha_buf, infoRec->rec.display.alpha_len);
7584 string8[(int)infoRec->rec.display.alpha_len] = '\0';
7585
7586 record->display.resize(1);
7587 record->display[0].alphaBuf = string8;
7588 free(string8);
7589 string8 = NULL;
7590 break;
7591 }
7592
7593 case RIL_CDMA_CALLED_PARTY_NUMBER_INFO_REC:
7594 case RIL_CDMA_CALLING_PARTY_NUMBER_INFO_REC:
7595 case RIL_CDMA_CONNECTED_NUMBER_INFO_REC: {
7596 if (infoRec->rec.number.len > CDMA_NUMBER_INFO_BUFFER_LENGTH) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007597 RLOGE("cdmaInfoRecInd: invalid display info response length %d "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08007598 "expected not more than %d", (int) infoRec->rec.number.len,
Amit Mahajan1955c742016-12-29 07:07:54 -08007599 CDMA_NUMBER_INFO_BUFFER_LENGTH);
7600 return 0;
7601 }
7602 string8 = (char*) malloc((infoRec->rec.number.len + 1) * sizeof(char));
7603 if (string8 == NULL) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007604 RLOGE("cdmaInfoRecInd: Memory allocation failed for "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08007605 "responseCdmaInformationRecords");
Amit Mahajan1955c742016-12-29 07:07:54 -08007606 return 0;
7607 }
7608 memcpy(string8, infoRec->rec.number.buf, infoRec->rec.number.len);
7609 string8[(int)infoRec->rec.number.len] = '\0';
7610
7611 record->number.resize(1);
7612 record->number[0].number = string8;
7613 free(string8);
7614 string8 = NULL;
7615 record->number[0].numberType = infoRec->rec.number.number_type;
7616 record->number[0].numberPlan = infoRec->rec.number.number_plan;
7617 record->number[0].pi = infoRec->rec.number.pi;
7618 record->number[0].si = infoRec->rec.number.si;
7619 break;
7620 }
7621
7622 case RIL_CDMA_SIGNAL_INFO_REC: {
7623 record->signal.resize(1);
7624 record->signal[0].isPresent = infoRec->rec.signal.isPresent;
7625 record->signal[0].signalType = infoRec->rec.signal.signalType;
7626 record->signal[0].alertPitch = infoRec->rec.signal.alertPitch;
7627 record->signal[0].signal = infoRec->rec.signal.signal;
7628 break;
7629 }
7630
7631 case RIL_CDMA_REDIRECTING_NUMBER_INFO_REC: {
7632 if (infoRec->rec.redir.redirectingNumber.len >
7633 CDMA_NUMBER_INFO_BUFFER_LENGTH) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007634 RLOGE("cdmaInfoRecInd: invalid display info response length %d "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08007635 "expected not more than %d\n",
Amit Mahajan1955c742016-12-29 07:07:54 -08007636 (int)infoRec->rec.redir.redirectingNumber.len,
7637 CDMA_NUMBER_INFO_BUFFER_LENGTH);
7638 return 0;
7639 }
7640 string8 = (char*) malloc((infoRec->rec.redir.redirectingNumber.len + 1) *
7641 sizeof(char));
7642 if (string8 == NULL) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007643 RLOGE("cdmaInfoRecInd: Memory allocation failed for "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08007644 "responseCdmaInformationRecords");
Amit Mahajan1955c742016-12-29 07:07:54 -08007645 return 0;
7646 }
7647 memcpy(string8, infoRec->rec.redir.redirectingNumber.buf,
7648 infoRec->rec.redir.redirectingNumber.len);
7649 string8[(int)infoRec->rec.redir.redirectingNumber.len] = '\0';
7650
7651 record->redir.resize(1);
7652 record->redir[0].redirectingNumber.number = string8;
7653 free(string8);
7654 string8 = NULL;
7655 record->redir[0].redirectingNumber.numberType =
7656 infoRec->rec.redir.redirectingNumber.number_type;
7657 record->redir[0].redirectingNumber.numberPlan =
7658 infoRec->rec.redir.redirectingNumber.number_plan;
7659 record->redir[0].redirectingNumber.pi = infoRec->rec.redir.redirectingNumber.pi;
7660 record->redir[0].redirectingNumber.si = infoRec->rec.redir.redirectingNumber.si;
7661 record->redir[0].redirectingReason =
7662 (CdmaRedirectingReason) infoRec->rec.redir.redirectingReason;
7663 break;
7664 }
7665
7666 case RIL_CDMA_LINE_CONTROL_INFO_REC: {
7667 record->lineCtrl.resize(1);
7668 record->lineCtrl[0].lineCtrlPolarityIncluded =
7669 infoRec->rec.lineCtrl.lineCtrlPolarityIncluded;
7670 record->lineCtrl[0].lineCtrlToggle = infoRec->rec.lineCtrl.lineCtrlToggle;
7671 record->lineCtrl[0].lineCtrlReverse = infoRec->rec.lineCtrl.lineCtrlReverse;
7672 record->lineCtrl[0].lineCtrlPowerDenial =
7673 infoRec->rec.lineCtrl.lineCtrlPowerDenial;
7674 break;
7675 }
7676
7677 case RIL_CDMA_T53_CLIR_INFO_REC: {
7678 record->clir.resize(1);
7679 record->clir[0].cause = infoRec->rec.clir.cause;
7680 break;
7681 }
7682
7683 case RIL_CDMA_T53_AUDIO_CONTROL_INFO_REC: {
7684 record->audioCtrl.resize(1);
7685 record->audioCtrl[0].upLink = infoRec->rec.audioCtrl.upLink;
7686 record->audioCtrl[0].downLink = infoRec->rec.audioCtrl.downLink;
7687 break;
7688 }
7689
7690 case RIL_CDMA_T53_RELEASE_INFO_REC:
Amit Mahajan111ddca2017-03-03 12:05:13 -08007691 RLOGE("cdmaInfoRecInd: RIL_CDMA_T53_RELEASE_INFO_REC: INVALID");
Amit Mahajan1955c742016-12-29 07:07:54 -08007692 return 0;
7693
7694 default:
Amit Mahajan111ddca2017-03-03 12:05:13 -08007695 RLOGE("cdmaInfoRecInd: Incorrect name value");
Amit Mahajan1955c742016-12-29 07:07:54 -08007696 return 0;
7697 }
7698 }
7699
Jayachandran C572f2f42017-03-25 14:30:13 -07007700#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007701 RLOGD("cdmaInfoRecInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07007702#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007703 Return<void> retStatus = radioService[slotId]->mRadioIndication->cdmaInfoRec(
Amit Mahajan1955c742016-12-29 07:07:54 -08007704 convertIntToRadioIndicationType(indicationType), records);
Amit Mahajan17249842017-01-19 15:05:45 -08007705 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan1955c742016-12-29 07:07:54 -08007706 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007707 RLOGE("cdmaInfoRecInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan1955c742016-12-29 07:07:54 -08007708 }
7709
7710 return 0;
7711}
7712
Amit Mahajan759786a2017-03-03 17:35:47 -08007713int radio::indicateRingbackToneInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007714 int indicationType, int token, RIL_Errno e, void *response,
7715 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007716 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007717 if (response == NULL || responseLen != sizeof(int)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007718 RLOGE("indicateRingbackToneInd: invalid response");
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007719 return 0;
7720 }
7721 bool start = ((int32_t *) response)[0];
Jayachandran C572f2f42017-03-25 14:30:13 -07007722#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007723 RLOGD("indicateRingbackToneInd: start %d", start);
Jayachandran C572f2f42017-03-25 14:30:13 -07007724#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007725 Return<void> retStatus = radioService[slotId]->mRadioIndication->indicateRingbackTone(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007726 convertIntToRadioIndicationType(indicationType), start);
Amit Mahajan17249842017-01-19 15:05:45 -08007727 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007728 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007729 RLOGE("indicateRingbackToneInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007730 }
7731
7732 return 0;
7733}
7734
Amit Mahajan759786a2017-03-03 17:35:47 -08007735int radio::resendIncallMuteInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007736 int indicationType, int token, RIL_Errno e, void *response,
7737 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007738 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Jayachandran C572f2f42017-03-25 14:30:13 -07007739#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007740 RLOGD("resendIncallMuteInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07007741#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007742 Return<void> retStatus = radioService[slotId]->mRadioIndication->resendIncallMute(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007743 convertIntToRadioIndicationType(indicationType));
Amit Mahajan17249842017-01-19 15:05:45 -08007744 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007745 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007746 RLOGE("resendIncallMuteInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007747 }
7748
7749 return 0;
7750}
7751
Amit Mahajan759786a2017-03-03 17:35:47 -08007752int radio::cdmaSubscriptionSourceChangedInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007753 int indicationType, int token, RIL_Errno e,
7754 void *response, size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007755 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007756 if (response == NULL || responseLen != sizeof(int)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007757 RLOGE("cdmaSubscriptionSourceChangedInd: invalid response");
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007758 return 0;
7759 }
7760 int32_t cdmaSource = ((int32_t *) response)[0];
Jayachandran C572f2f42017-03-25 14:30:13 -07007761#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007762 RLOGD("cdmaSubscriptionSourceChangedInd: cdmaSource %d", cdmaSource);
Jayachandran C572f2f42017-03-25 14:30:13 -07007763#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007764 Return<void> retStatus = radioService[slotId]->mRadioIndication->
7765 cdmaSubscriptionSourceChanged(convertIntToRadioIndicationType(indicationType),
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007766 (CdmaSubscriptionSource) cdmaSource);
Amit Mahajan17249842017-01-19 15:05:45 -08007767 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007768 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007769 RLOGE("cdmaSubscriptionSourceChangedInd: radioService[%d]->mRadioIndication == NULL",
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007770 slotId);
7771 }
7772
7773 return 0;
7774}
7775
Amit Mahajan759786a2017-03-03 17:35:47 -08007776int radio::cdmaPrlChangedInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007777 int indicationType, int token, RIL_Errno e, void *response,
7778 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007779 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007780 if (response == NULL || responseLen != sizeof(int)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007781 RLOGE("cdmaPrlChangedInd: invalid response");
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007782 return 0;
7783 }
7784 int32_t version = ((int32_t *) response)[0];
Jayachandran C572f2f42017-03-25 14:30:13 -07007785#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007786 RLOGD("cdmaPrlChangedInd: version %d", version);
Jayachandran C572f2f42017-03-25 14:30:13 -07007787#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007788 Return<void> retStatus = radioService[slotId]->mRadioIndication->cdmaPrlChanged(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007789 convertIntToRadioIndicationType(indicationType), version);
Amit Mahajan17249842017-01-19 15:05:45 -08007790 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007791 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007792 RLOGE("cdmaPrlChangedInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007793 }
7794
7795 return 0;
7796}
7797
Amit Mahajan759786a2017-03-03 17:35:47 -08007798int radio::exitEmergencyCallbackModeInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007799 int indicationType, int token, RIL_Errno e, void *response,
7800 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007801 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Jayachandran C572f2f42017-03-25 14:30:13 -07007802#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007803 RLOGD("exitEmergencyCallbackModeInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07007804#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007805 Return<void> retStatus = radioService[slotId]->mRadioIndication->exitEmergencyCallbackMode(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007806 convertIntToRadioIndicationType(indicationType));
Amit Mahajan17249842017-01-19 15:05:45 -08007807 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007808 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007809 RLOGE("exitEmergencyCallbackModeInd: radioService[%d]->mRadioIndication == NULL",
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007810 slotId);
7811 }
7812
7813 return 0;
7814}
7815
Amit Mahajan759786a2017-03-03 17:35:47 -08007816int radio::rilConnectedInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007817 int indicationType, int token, RIL_Errno e, void *response,
7818 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007819 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007820 RLOGD("rilConnectedInd");
Amit Mahajan17249842017-01-19 15:05:45 -08007821 Return<void> retStatus = radioService[slotId]->mRadioIndication->rilConnected(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007822 convertIntToRadioIndicationType(indicationType));
Amit Mahajan17249842017-01-19 15:05:45 -08007823 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007824 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007825 RLOGE("rilConnectedInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007826 }
7827
7828 return 0;
7829}
7830
Amit Mahajan759786a2017-03-03 17:35:47 -08007831int radio::voiceRadioTechChangedInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007832 int indicationType, int token, RIL_Errno e, void *response,
7833 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007834 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007835 if (response == NULL || responseLen != sizeof(int)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007836 RLOGE("voiceRadioTechChangedInd: invalid response");
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007837 return 0;
7838 }
7839 int32_t rat = ((int32_t *) response)[0];
Jayachandran C572f2f42017-03-25 14:30:13 -07007840#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007841 RLOGD("voiceRadioTechChangedInd: rat %d", rat);
Jayachandran C572f2f42017-03-25 14:30:13 -07007842#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007843 Return<void> retStatus = radioService[slotId]->mRadioIndication->voiceRadioTechChanged(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007844 convertIntToRadioIndicationType(indicationType), (RadioTechnology) rat);
Amit Mahajan17249842017-01-19 15:05:45 -08007845 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007846 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007847 RLOGE("voiceRadioTechChangedInd: radioService[%d]->mRadioIndication == NULL",
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007848 slotId);
7849 }
7850
7851 return 0;
7852}
7853
7854void convertRilCellInfoListToHal(void *response, size_t responseLen, hidl_vec<CellInfo>& records) {
7855 int num = responseLen / sizeof(RIL_CellInfo_v12);
7856 records.resize(num);
7857
7858 RIL_CellInfo_v12 *rillCellInfo = (RIL_CellInfo_v12 *) response;
7859 for (int i = 0; i < num; i++) {
7860 records[i].cellInfoType = (CellInfoType) rillCellInfo->cellInfoType;
7861 records[i].registered = rillCellInfo->registered;
7862 records[i].timeStampType = (TimeStampType) rillCellInfo->timeStampType;
7863 records[i].timeStamp = rillCellInfo->timeStamp;
Sanket Padawe378ccdd2017-01-24 14:11:12 -08007864 // All vectors should be size 0 except one which will be size 1. Set everything to
7865 // size 0 initially.
7866 records[i].gsm.resize(0);
7867 records[i].wcdma.resize(0);
7868 records[i].cdma.resize(0);
7869 records[i].lte.resize(0);
7870 records[i].tdscdma.resize(0);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007871 switch(rillCellInfo->cellInfoType) {
7872 case RIL_CELL_INFO_TYPE_GSM: {
7873 records[i].gsm.resize(1);
7874 CellInfoGsm *cellInfoGsm = &records[i].gsm[0];
7875 cellInfoGsm->cellIdentityGsm.mcc =
7876 std::to_string(rillCellInfo->CellInfo.gsm.cellIdentityGsm.mcc);
7877 cellInfoGsm->cellIdentityGsm.mnc =
7878 std::to_string(rillCellInfo->CellInfo.gsm.cellIdentityGsm.mnc);
7879 cellInfoGsm->cellIdentityGsm.lac =
7880 rillCellInfo->CellInfo.gsm.cellIdentityGsm.lac;
7881 cellInfoGsm->cellIdentityGsm.cid =
7882 rillCellInfo->CellInfo.gsm.cellIdentityGsm.cid;
7883 cellInfoGsm->cellIdentityGsm.arfcn =
7884 rillCellInfo->CellInfo.gsm.cellIdentityGsm.arfcn;
7885 cellInfoGsm->cellIdentityGsm.bsic =
7886 rillCellInfo->CellInfo.gsm.cellIdentityGsm.bsic;
7887 cellInfoGsm->signalStrengthGsm.signalStrength =
7888 rillCellInfo->CellInfo.gsm.signalStrengthGsm.signalStrength;
7889 cellInfoGsm->signalStrengthGsm.bitErrorRate =
7890 rillCellInfo->CellInfo.gsm.signalStrengthGsm.bitErrorRate;
7891 cellInfoGsm->signalStrengthGsm.timingAdvance =
7892 rillCellInfo->CellInfo.gsm.signalStrengthGsm.timingAdvance;
7893 break;
7894 }
7895
7896 case RIL_CELL_INFO_TYPE_WCDMA: {
7897 records[i].wcdma.resize(1);
7898 CellInfoWcdma *cellInfoWcdma = &records[i].wcdma[0];
7899 cellInfoWcdma->cellIdentityWcdma.mcc =
7900 std::to_string(rillCellInfo->CellInfo.wcdma.cellIdentityWcdma.mcc);
7901 cellInfoWcdma->cellIdentityWcdma.mnc =
7902 std::to_string(rillCellInfo->CellInfo.wcdma.cellIdentityWcdma.mnc);
7903 cellInfoWcdma->cellIdentityWcdma.lac =
7904 rillCellInfo->CellInfo.wcdma.cellIdentityWcdma.lac;
7905 cellInfoWcdma->cellIdentityWcdma.cid =
7906 rillCellInfo->CellInfo.wcdma.cellIdentityWcdma.cid;
7907 cellInfoWcdma->cellIdentityWcdma.psc =
7908 rillCellInfo->CellInfo.wcdma.cellIdentityWcdma.psc;
7909 cellInfoWcdma->cellIdentityWcdma.uarfcn =
7910 rillCellInfo->CellInfo.wcdma.cellIdentityWcdma.uarfcn;
7911 cellInfoWcdma->signalStrengthWcdma.signalStrength =
7912 rillCellInfo->CellInfo.wcdma.signalStrengthWcdma.signalStrength;
7913 cellInfoWcdma->signalStrengthWcdma.bitErrorRate =
7914 rillCellInfo->CellInfo.wcdma.signalStrengthWcdma.bitErrorRate;
7915 break;
7916 }
7917
7918 case RIL_CELL_INFO_TYPE_CDMA: {
7919 records[i].cdma.resize(1);
7920 CellInfoCdma *cellInfoCdma = &records[i].cdma[0];
7921 cellInfoCdma->cellIdentityCdma.networkId =
7922 rillCellInfo->CellInfo.cdma.cellIdentityCdma.networkId;
7923 cellInfoCdma->cellIdentityCdma.systemId =
7924 rillCellInfo->CellInfo.cdma.cellIdentityCdma.systemId;
7925 cellInfoCdma->cellIdentityCdma.baseStationId =
7926 rillCellInfo->CellInfo.cdma.cellIdentityCdma.basestationId;
7927 cellInfoCdma->cellIdentityCdma.longitude =
7928 rillCellInfo->CellInfo.cdma.cellIdentityCdma.longitude;
7929 cellInfoCdma->cellIdentityCdma.latitude =
7930 rillCellInfo->CellInfo.cdma.cellIdentityCdma.latitude;
7931 cellInfoCdma->signalStrengthCdma.dbm =
7932 rillCellInfo->CellInfo.cdma.signalStrengthCdma.dbm;
7933 cellInfoCdma->signalStrengthCdma.ecio =
7934 rillCellInfo->CellInfo.cdma.signalStrengthCdma.ecio;
7935 cellInfoCdma->signalStrengthEvdo.dbm =
7936 rillCellInfo->CellInfo.cdma.signalStrengthEvdo.dbm;
7937 cellInfoCdma->signalStrengthEvdo.ecio =
7938 rillCellInfo->CellInfo.cdma.signalStrengthEvdo.ecio;
7939 cellInfoCdma->signalStrengthEvdo.signalNoiseRatio =
7940 rillCellInfo->CellInfo.cdma.signalStrengthEvdo.signalNoiseRatio;
7941 break;
7942 }
7943
7944 case RIL_CELL_INFO_TYPE_LTE: {
7945 records[i].lte.resize(1);
7946 CellInfoLte *cellInfoLte = &records[i].lte[0];
7947 cellInfoLte->cellIdentityLte.mcc =
7948 std::to_string(rillCellInfo->CellInfo.lte.cellIdentityLte.mcc);
7949 cellInfoLte->cellIdentityLte.mnc =
7950 std::to_string(rillCellInfo->CellInfo.lte.cellIdentityLte.mnc);
7951 cellInfoLte->cellIdentityLte.ci =
7952 rillCellInfo->CellInfo.lte.cellIdentityLte.ci;
7953 cellInfoLte->cellIdentityLte.pci =
7954 rillCellInfo->CellInfo.lte.cellIdentityLte.pci;
7955 cellInfoLte->cellIdentityLte.tac =
7956 rillCellInfo->CellInfo.lte.cellIdentityLte.tac;
7957 cellInfoLte->cellIdentityLte.earfcn =
7958 rillCellInfo->CellInfo.lte.cellIdentityLte.earfcn;
7959 cellInfoLte->signalStrengthLte.signalStrength =
7960 rillCellInfo->CellInfo.lte.signalStrengthLte.signalStrength;
7961 cellInfoLte->signalStrengthLte.rsrp =
7962 rillCellInfo->CellInfo.lte.signalStrengthLte.rsrp;
7963 cellInfoLte->signalStrengthLte.rsrq =
7964 rillCellInfo->CellInfo.lte.signalStrengthLte.rsrq;
7965 cellInfoLte->signalStrengthLte.rssnr =
7966 rillCellInfo->CellInfo.lte.signalStrengthLte.rssnr;
7967 cellInfoLte->signalStrengthLte.cqi =
7968 rillCellInfo->CellInfo.lte.signalStrengthLte.cqi;
7969 cellInfoLte->signalStrengthLte.timingAdvance =
7970 rillCellInfo->CellInfo.lte.signalStrengthLte.timingAdvance;
7971 break;
7972 }
7973
7974 case RIL_CELL_INFO_TYPE_TD_SCDMA: {
7975 records[i].tdscdma.resize(1);
7976 CellInfoTdscdma *cellInfoTdscdma = &records[i].tdscdma[0];
7977 cellInfoTdscdma->cellIdentityTdscdma.mcc =
7978 std::to_string(rillCellInfo->CellInfo.tdscdma.cellIdentityTdscdma.mcc);
7979 cellInfoTdscdma->cellIdentityTdscdma.mnc =
7980 std::to_string(rillCellInfo->CellInfo.tdscdma.cellIdentityTdscdma.mnc);
7981 cellInfoTdscdma->cellIdentityTdscdma.lac =
7982 rillCellInfo->CellInfo.tdscdma.cellIdentityTdscdma.lac;
7983 cellInfoTdscdma->cellIdentityTdscdma.cid =
7984 rillCellInfo->CellInfo.tdscdma.cellIdentityTdscdma.cid;
7985 cellInfoTdscdma->cellIdentityTdscdma.cpid =
7986 rillCellInfo->CellInfo.tdscdma.cellIdentityTdscdma.cpid;
7987 cellInfoTdscdma->signalStrengthTdscdma.rscp =
7988 rillCellInfo->CellInfo.tdscdma.signalStrengthTdscdma.rscp;
7989 break;
7990 }
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08007991 default: {
7992 break;
7993 }
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007994 }
7995 rillCellInfo += 1;
7996 }
7997}
7998
Amit Mahajan759786a2017-03-03 17:35:47 -08007999int radio::cellInfoListInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008000 int indicationType, int token, RIL_Errno e, void *response,
8001 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08008002 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan13058cb2017-06-07 23:10:27 -07008003 if ((response == NULL && responseLen != 0) || responseLen % sizeof(RIL_CellInfo_v12) != 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008004 RLOGE("cellInfoListInd: invalid response");
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008005 return 0;
8006 }
8007
8008 hidl_vec<CellInfo> records;
8009 convertRilCellInfoListToHal(response, responseLen, records);
8010
Jayachandran C572f2f42017-03-25 14:30:13 -07008011#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08008012 RLOGD("cellInfoListInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07008013#endif
Amit Mahajan17249842017-01-19 15:05:45 -08008014 Return<void> retStatus = radioService[slotId]->mRadioIndication->cellInfoList(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008015 convertIntToRadioIndicationType(indicationType), records);
Amit Mahajan17249842017-01-19 15:05:45 -08008016 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008017 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008018 RLOGE("cellInfoListInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008019 }
8020
8021 return 0;
8022}
8023
Amit Mahajan759786a2017-03-03 17:35:47 -08008024int radio::imsNetworkStateChangedInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008025 int indicationType, int token, RIL_Errno e, void *response,
8026 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08008027 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Jayachandran C572f2f42017-03-25 14:30:13 -07008028#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08008029 RLOGD("imsNetworkStateChangedInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07008030#endif
Amit Mahajan17249842017-01-19 15:05:45 -08008031 Return<void> retStatus = radioService[slotId]->mRadioIndication->imsNetworkStateChanged(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008032 convertIntToRadioIndicationType(indicationType));
Amit Mahajan17249842017-01-19 15:05:45 -08008033 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008034 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008035 RLOGE("imsNetworkStateChangedInd: radioService[%d]->mRadioIndication == NULL",
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008036 slotId);
8037 }
8038
8039 return 0;
8040}
8041
Amit Mahajan759786a2017-03-03 17:35:47 -08008042int radio::subscriptionStatusChangedInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008043 int indicationType, int token, RIL_Errno e, void *response,
8044 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08008045 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008046 if (response == NULL || responseLen != sizeof(int)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008047 RLOGE("subscriptionStatusChangedInd: invalid response");
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008048 return 0;
8049 }
8050 bool activate = ((int32_t *) response)[0];
Jayachandran C572f2f42017-03-25 14:30:13 -07008051#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08008052 RLOGD("subscriptionStatusChangedInd: activate %d", activate);
Jayachandran C572f2f42017-03-25 14:30:13 -07008053#endif
Amit Mahajan17249842017-01-19 15:05:45 -08008054 Return<void> retStatus = radioService[slotId]->mRadioIndication->subscriptionStatusChanged(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008055 convertIntToRadioIndicationType(indicationType), activate);
Amit Mahajan17249842017-01-19 15:05:45 -08008056 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008057 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008058 RLOGE("subscriptionStatusChangedInd: radioService[%d]->mRadioIndication == NULL",
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008059 slotId);
8060 }
8061
8062 return 0;
8063}
8064
Amit Mahajan759786a2017-03-03 17:35:47 -08008065int radio::srvccStateNotifyInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008066 int indicationType, int token, RIL_Errno e, void *response,
8067 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08008068 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008069 if (response == NULL || responseLen != sizeof(int)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008070 RLOGE("srvccStateNotifyInd: invalid response");
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008071 return 0;
8072 }
8073 int32_t state = ((int32_t *) response)[0];
Jayachandran C572f2f42017-03-25 14:30:13 -07008074#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08008075 RLOGD("srvccStateNotifyInd: rat %d", state);
Jayachandran C572f2f42017-03-25 14:30:13 -07008076#endif
Amit Mahajan17249842017-01-19 15:05:45 -08008077 Return<void> retStatus = radioService[slotId]->mRadioIndication->srvccStateNotify(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008078 convertIntToRadioIndicationType(indicationType), (SrvccState) state);
Amit Mahajan17249842017-01-19 15:05:45 -08008079 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008080 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008081 RLOGE("srvccStateNotifyInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008082 }
8083
8084 return 0;
8085}
8086
8087void convertRilHardwareConfigListToHal(void *response, size_t responseLen,
8088 hidl_vec<HardwareConfig>& records) {
8089 int num = responseLen / sizeof(RIL_HardwareConfig);
8090 records.resize(num);
8091
8092 RIL_HardwareConfig *rilHardwareConfig = (RIL_HardwareConfig *) response;
8093 for (int i = 0; i < num; i++) {
8094 records[i].type = (HardwareConfigType) rilHardwareConfig[i].type;
8095 records[i].uuid = convertCharPtrToHidlString(rilHardwareConfig[i].uuid);
8096 records[i].state = (HardwareConfigState) rilHardwareConfig[i].state;
8097 switch (rilHardwareConfig[i].type) {
8098 case RIL_HARDWARE_CONFIG_MODEM: {
8099 records[i].modem.resize(1);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08008100 records[i].sim.resize(0);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008101 HardwareConfigModem *hwConfigModem = &records[i].modem[0];
8102 hwConfigModem->rat = rilHardwareConfig[i].cfg.modem.rat;
8103 hwConfigModem->maxVoice = rilHardwareConfig[i].cfg.modem.maxVoice;
8104 hwConfigModem->maxData = rilHardwareConfig[i].cfg.modem.maxData;
8105 hwConfigModem->maxStandby = rilHardwareConfig[i].cfg.modem.maxStandby;
8106 break;
8107 }
8108
8109 case RIL_HARDWARE_CONFIG_SIM: {
8110 records[i].sim.resize(1);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08008111 records[i].modem.resize(0);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008112 records[i].sim[0].modemUuid =
8113 convertCharPtrToHidlString(rilHardwareConfig[i].cfg.sim.modemUuid);
8114 break;
8115 }
8116 }
8117 }
8118}
8119
Amit Mahajan759786a2017-03-03 17:35:47 -08008120int radio::hardwareConfigChangedInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008121 int indicationType, int token, RIL_Errno e, void *response,
8122 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08008123 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan13058cb2017-06-07 23:10:27 -07008124 if ((response == NULL && responseLen != 0)
8125 || responseLen % sizeof(RIL_HardwareConfig) != 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008126 RLOGE("hardwareConfigChangedInd: invalid response");
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008127 return 0;
8128 }
8129
8130 hidl_vec<HardwareConfig> configs;
8131 convertRilHardwareConfigListToHal(response, responseLen, configs);
8132
Jayachandran C572f2f42017-03-25 14:30:13 -07008133#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08008134 RLOGD("hardwareConfigChangedInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07008135#endif
Amit Mahajan17249842017-01-19 15:05:45 -08008136 Return<void> retStatus = radioService[slotId]->mRadioIndication->hardwareConfigChanged(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008137 convertIntToRadioIndicationType(indicationType), configs);
Amit Mahajan17249842017-01-19 15:05:45 -08008138 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008139 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008140 RLOGE("hardwareConfigChangedInd: radioService[%d]->mRadioIndication == NULL",
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008141 slotId);
8142 }
8143
8144 return 0;
8145}
8146
8147void convertRilRadioCapabilityToHal(void *response, size_t responseLen, RadioCapability& rc) {
8148 RIL_RadioCapability *rilRadioCapability = (RIL_RadioCapability *) response;
8149 rc.session = rilRadioCapability->session;
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07008150 rc.phase = (V1_0::RadioCapabilityPhase) rilRadioCapability->phase;
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008151 rc.raf = rilRadioCapability->rat;
8152 rc.logicalModemUuid = convertCharPtrToHidlString(rilRadioCapability->logicalModemUuid);
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07008153 rc.status = (V1_0::RadioCapabilityStatus) rilRadioCapability->status;
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008154}
8155
Amit Mahajan759786a2017-03-03 17:35:47 -08008156int radio::radioCapabilityIndicationInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008157 int indicationType, int token, RIL_Errno e, void *response,
8158 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08008159 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008160 if (response == NULL || responseLen != sizeof(RIL_RadioCapability)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008161 RLOGE("radioCapabilityIndicationInd: invalid response");
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008162 return 0;
8163 }
8164
Jack Yuf68e0da2017-02-07 14:53:09 -08008165 RadioCapability rc = {};
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008166 convertRilRadioCapabilityToHal(response, responseLen, rc);
8167
Jayachandran C572f2f42017-03-25 14:30:13 -07008168#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08008169 RLOGD("radioCapabilityIndicationInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07008170#endif
Amit Mahajan17249842017-01-19 15:05:45 -08008171 Return<void> retStatus = radioService[slotId]->mRadioIndication->radioCapabilityIndication(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008172 convertIntToRadioIndicationType(indicationType), rc);
Amit Mahajan17249842017-01-19 15:05:45 -08008173 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008174 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008175 RLOGE("radioCapabilityIndicationInd: radioService[%d]->mRadioIndication == NULL",
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008176 slotId);
8177 }
8178
8179 return 0;
8180}
8181
8182bool isServiceTypeCfQuery(RIL_SsServiceType serType, RIL_SsRequestType reqType) {
8183 if ((reqType == SS_INTERROGATION) &&
8184 (serType == SS_CFU ||
8185 serType == SS_CF_BUSY ||
8186 serType == SS_CF_NO_REPLY ||
8187 serType == SS_CF_NOT_REACHABLE ||
8188 serType == SS_CF_ALL ||
8189 serType == SS_CF_ALL_CONDITIONAL)) {
8190 return true;
8191 }
8192 return false;
8193}
8194
Amit Mahajan759786a2017-03-03 17:35:47 -08008195int radio::onSupplementaryServiceIndicationInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008196 int indicationType, int token, RIL_Errno e,
8197 void *response, size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08008198 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008199 if (response == NULL || responseLen != sizeof(RIL_StkCcUnsolSsResponse)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008200 RLOGE("onSupplementaryServiceIndicationInd: invalid response");
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008201 return 0;
8202 }
8203
8204 RIL_StkCcUnsolSsResponse *rilSsResponse = (RIL_StkCcUnsolSsResponse *) response;
Jack Yuf68e0da2017-02-07 14:53:09 -08008205 StkCcUnsolSsResult ss = {};
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008206 ss.serviceType = (SsServiceType) rilSsResponse->serviceType;
8207 ss.requestType = (SsRequestType) rilSsResponse->requestType;
8208 ss.teleserviceType = (SsTeleserviceType) rilSsResponse->teleserviceType;
8209 ss.serviceClass = rilSsResponse->serviceClass;
8210 ss.result = (RadioError) rilSsResponse->result;
8211
8212 if (isServiceTypeCfQuery(rilSsResponse->serviceType, rilSsResponse->requestType)) {
Jayachandran C572f2f42017-03-25 14:30:13 -07008213#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08008214 RLOGD("onSupplementaryServiceIndicationInd CF type, num of Cf elements %d",
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008215 rilSsResponse->cfData.numValidIndexes);
Jayachandran C572f2f42017-03-25 14:30:13 -07008216#endif
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008217 if (rilSsResponse->cfData.numValidIndexes > NUM_SERVICE_CLASSES) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008218 RLOGE("onSupplementaryServiceIndicationInd numValidIndexes is greater than "
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008219 "max value %d, truncating it to max value", NUM_SERVICE_CLASSES);
8220 rilSsResponse->cfData.numValidIndexes = NUM_SERVICE_CLASSES;
8221 }
8222
8223 ss.cfData.resize(1);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08008224 ss.ssInfo.resize(0);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008225
8226 /* number of call info's */
8227 ss.cfData[0].cfInfo.resize(rilSsResponse->cfData.numValidIndexes);
8228
8229 for (int i = 0; i < rilSsResponse->cfData.numValidIndexes; i++) {
8230 RIL_CallForwardInfo cf = rilSsResponse->cfData.cfInfo[i];
8231 CallForwardInfo *cfInfo = &ss.cfData[0].cfInfo[i];
8232
8233 cfInfo->status = (CallForwardInfoStatus) cf.status;
8234 cfInfo->reason = cf.reason;
8235 cfInfo->serviceClass = cf.serviceClass;
8236 cfInfo->toa = cf.toa;
8237 cfInfo->number = convertCharPtrToHidlString(cf.number);
8238 cfInfo->timeSeconds = cf.timeSeconds;
Jayachandran C572f2f42017-03-25 14:30:13 -07008239#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08008240 RLOGD("onSupplementaryServiceIndicationInd: "
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008241 "Data: %d,reason=%d,cls=%d,toa=%d,num=%s,tout=%d],", cf.status,
8242 cf.reason, cf.serviceClass, cf.toa, (char*)cf.number, cf.timeSeconds);
Jayachandran C572f2f42017-03-25 14:30:13 -07008243#endif
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008244 }
8245 } else {
8246 ss.ssInfo.resize(1);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08008247 ss.cfData.resize(0);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008248
8249 /* each int */
8250 ss.ssInfo[0].ssInfo.resize(SS_INFO_MAX);
8251 for (int i = 0; i < SS_INFO_MAX; i++) {
Jayachandran C572f2f42017-03-25 14:30:13 -07008252#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08008253 RLOGD("onSupplementaryServiceIndicationInd: Data: %d",
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008254 rilSsResponse->ssInfo[i]);
Jayachandran C572f2f42017-03-25 14:30:13 -07008255#endif
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008256 ss.ssInfo[0].ssInfo[i] = rilSsResponse->ssInfo[i];
8257 }
8258 }
8259
Jayachandran C572f2f42017-03-25 14:30:13 -07008260#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08008261 RLOGD("onSupplementaryServiceIndicationInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07008262#endif
Amit Mahajan17249842017-01-19 15:05:45 -08008263 Return<void> retStatus = radioService[slotId]->mRadioIndication->
8264 onSupplementaryServiceIndication(convertIntToRadioIndicationType(indicationType),
8265 ss);
8266 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008267 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008268 RLOGE("onSupplementaryServiceIndicationInd: "
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008269 "radioService[%d]->mRadioIndication == NULL", slotId);
8270 }
8271
8272 return 0;
8273}
8274
Amit Mahajan759786a2017-03-03 17:35:47 -08008275int radio::stkCallControlAlphaNotifyInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008276 int indicationType, int token, RIL_Errno e, void *response,
8277 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08008278 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008279 if (response == NULL || responseLen == 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008280 RLOGE("stkCallControlAlphaNotifyInd: invalid response");
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008281 return 0;
8282 }
Jayachandran C572f2f42017-03-25 14:30:13 -07008283#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08008284 RLOGD("stkCallControlAlphaNotifyInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07008285#endif
Amit Mahajan17249842017-01-19 15:05:45 -08008286 Return<void> retStatus = radioService[slotId]->mRadioIndication->stkCallControlAlphaNotify(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008287 convertIntToRadioIndicationType(indicationType),
8288 convertCharPtrToHidlString((char *) response));
Amit Mahajan17249842017-01-19 15:05:45 -08008289 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008290 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008291 RLOGE("stkCallControlAlphaNotifyInd: radioService[%d]->mRadioIndication == NULL",
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008292 slotId);
8293 }
8294
8295 return 0;
8296}
8297
8298void convertRilLceDataInfoToHal(void *response, size_t responseLen, LceDataInfo& lce) {
8299 RIL_LceDataInfo *rilLceDataInfo = (RIL_LceDataInfo *)response;
8300 lce.lastHopCapacityKbps = rilLceDataInfo->last_hop_capacity_kbps;
8301 lce.confidenceLevel = rilLceDataInfo->confidence_level;
8302 lce.lceSuspended = rilLceDataInfo->lce_suspended;
8303}
8304
Amit Mahajan759786a2017-03-03 17:35:47 -08008305int radio::lceDataInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008306 int indicationType, int token, RIL_Errno e, void *response,
8307 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08008308 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008309 if (response == NULL || responseLen != sizeof(RIL_LceDataInfo)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008310 RLOGE("lceDataInd: invalid response");
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008311 return 0;
8312 }
8313
Jack Yuf68e0da2017-02-07 14:53:09 -08008314 LceDataInfo lce = {};
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008315 convertRilLceDataInfoToHal(response, responseLen, lce);
Jayachandran C572f2f42017-03-25 14:30:13 -07008316#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08008317 RLOGD("lceDataInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07008318#endif
Amit Mahajan17249842017-01-19 15:05:45 -08008319 Return<void> retStatus = radioService[slotId]->mRadioIndication->lceData(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008320 convertIntToRadioIndicationType(indicationType), lce);
Amit Mahajan17249842017-01-19 15:05:45 -08008321 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008322 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008323 RLOGE("lceDataInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008324 }
8325
8326 return 0;
8327}
8328
Amit Mahajan759786a2017-03-03 17:35:47 -08008329int radio::pcoDataInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008330 int indicationType, int token, RIL_Errno e, void *response,
8331 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08008332 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008333 if (response == NULL || responseLen != sizeof(RIL_PCO_Data)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008334 RLOGE("pcoDataInd: invalid response");
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008335 return 0;
8336 }
8337
Jack Yuf68e0da2017-02-07 14:53:09 -08008338 PcoDataInfo pco = {};
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008339 RIL_PCO_Data *rilPcoData = (RIL_PCO_Data *)response;
8340 pco.cid = rilPcoData->cid;
8341 pco.bearerProto = convertCharPtrToHidlString(rilPcoData->bearer_proto);
8342 pco.pcoId = rilPcoData->pco_id;
8343 pco.contents.setToExternal((uint8_t *) rilPcoData->contents, rilPcoData->contents_length);
8344
Jayachandran C572f2f42017-03-25 14:30:13 -07008345#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08008346 RLOGD("pcoDataInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07008347#endif
Amit Mahajan17249842017-01-19 15:05:45 -08008348 Return<void> retStatus = radioService[slotId]->mRadioIndication->pcoData(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008349 convertIntToRadioIndicationType(indicationType), pco);
Amit Mahajan17249842017-01-19 15:05:45 -08008350 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008351 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008352 RLOGE("pcoDataInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008353 }
8354
8355 return 0;
8356}
8357
Amit Mahajan759786a2017-03-03 17:35:47 -08008358int radio::modemResetInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008359 int indicationType, int token, RIL_Errno e, void *response,
8360 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08008361 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008362 if (response == NULL || responseLen == 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008363 RLOGE("modemResetInd: invalid response");
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008364 return 0;
8365 }
Jayachandran C572f2f42017-03-25 14:30:13 -07008366#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08008367 RLOGD("modemResetInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07008368#endif
Amit Mahajan17249842017-01-19 15:05:45 -08008369 Return<void> retStatus = radioService[slotId]->mRadioIndication->modemReset(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008370 convertIntToRadioIndicationType(indicationType),
8371 convertCharPtrToHidlString((char *) response));
Amit Mahajan17249842017-01-19 15:05:45 -08008372 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008373 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008374 RLOGE("modemResetInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008375 }
8376
8377 return 0;
8378}
8379
yinxu3abe7c72017-05-03 15:15:19 -07008380int radio::networkScanResultInd(int slotId,
8381 int indicationType, int token, RIL_Errno e, void *response,
yinxu8688abd2017-05-22 11:26:45 -07008382 size_t responseLen) {
yinxu3abe7c72017-05-03 15:15:19 -07008383#if VDBG
8384 RLOGD("networkScanResultInd");
8385#endif
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07008386 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndicationV1_1 != NULL) {
yinxu8688abd2017-05-22 11:26:45 -07008387 if (response == NULL || responseLen == 0) {
8388 RLOGE("networkScanResultInd: invalid response");
8389 return 0;
8390 }
8391 RLOGD("networkScanResultInd");
8392
8393#if VDBG
8394 RLOGD("networkScanResultInd");
8395#endif
8396
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07008397 RIL_NetworkScanResult *networkScanResult = (RIL_NetworkScanResult *) response;
yinxu8688abd2017-05-22 11:26:45 -07008398
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07008399 V1_1::NetworkScanResult result;
8400 result.status = (V1_1::ScanStatus) networkScanResult->status;
Sooraj Sasindran982ba7a2018-05-07 21:20:43 -07008401 result.error = (RadioError) networkScanResult->error;
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07008402 convertRilCellInfoListToHal(
8403 networkScanResult->network_infos,
8404 networkScanResult->network_infos_length * sizeof(RIL_CellInfo_v12),
8405 result.networkInfos);
yinxu8688abd2017-05-22 11:26:45 -07008406
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07008407 Return<void> retStatus = radioService[slotId]->mRadioIndicationV1_1->networkScanResult(
8408 convertIntToRadioIndicationType(indicationType), result);
8409 radioService[slotId]->checkReturnStatus(retStatus);
yinxu8688abd2017-05-22 11:26:45 -07008410 } else {
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07008411 RLOGE("networkScanResultInd: radioService[%d]->mRadioIndicationV1_1 == NULL", slotId);
yinxu8688abd2017-05-22 11:26:45 -07008412 }
yinxu3abe7c72017-05-03 15:15:19 -07008413 return 0;
8414}
8415
pkanwardb8e0942017-03-17 12:49:34 -07008416int radio::carrierInfoForImsiEncryption(int slotId,
8417 int indicationType, int token, RIL_Errno e, void *response,
8418 size_t responseLen) {
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07008419 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndicationV1_1 != NULL) {
pkanwardb8e0942017-03-17 12:49:34 -07008420 if (response == NULL || responseLen == 0) {
8421 RLOGE("carrierInfoForImsiEncryption: invalid response");
8422 return 0;
8423 }
8424 RLOGD("carrierInfoForImsiEncryption");
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07008425 Return<void> retStatus = radioService[slotId]->mRadioIndicationV1_1->
8426 carrierInfoForImsiEncryption(convertIntToRadioIndicationType(indicationType));
8427 radioService[slotId]->checkReturnStatus(retStatus);
pkanwardb8e0942017-03-17 12:49:34 -07008428 } else {
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07008429 RLOGE("carrierInfoForImsiEncryption: radioService[%d]->mRadioIndicationV1_1 == NULL",
8430 slotId);
pkanwardb8e0942017-03-17 12:49:34 -07008431 }
8432
8433 return 0;
8434}
8435
Nathan Harold6a8809d2017-07-07 19:28:58 -07008436int radio::keepaliveStatusInd(int slotId,
8437 int indicationType, int token, RIL_Errno e, void *response,
8438 size_t responseLen) {
8439#if VDBG
8440 RLOGD("%s(): token=%d", __FUNCTION__, token);
8441#endif
8442 if (radioService[slotId] == NULL || radioService[slotId]->mRadioIndication == NULL) {
8443 RLOGE("%s: radioService[%d]->mRadioIndication == NULL", __FUNCTION__, slotId);
8444 return 0;
8445 }
8446
8447 auto ret = V1_1::IRadioIndication::castFrom(
8448 radioService[slotId]->mRadioIndication);
8449 if (!ret.isOk()) {
8450 RLOGE("%s: ret.isOk() == false for radioService[%d]", __FUNCTION__, slotId);
8451 return 0;
8452 }
8453 sp<V1_1::IRadioIndication> radioIndicationV1_1 = ret;
8454
8455 if (response == NULL || responseLen != sizeof(V1_1::KeepaliveStatus)) {
8456 RLOGE("%s: invalid response", __FUNCTION__);
8457 return 0;
8458 }
8459
8460 V1_1::KeepaliveStatus ks;
8461 convertRilKeepaliveStatusToHal(static_cast<RIL_KeepaliveStatus*>(response), ks);
8462
8463 Return<void> retStatus = radioIndicationV1_1->keepaliveStatus(
8464 convertIntToRadioIndicationType(indicationType), ks);
8465 radioService[slotId]->checkReturnStatus(retStatus);
8466 return 0;
8467}
8468
Amit Mahajan759786a2017-03-03 17:35:47 -08008469int radio::oemHookRawInd(int slotId,
Amit Mahajan439da362017-02-13 17:43:04 -08008470 int indicationType, int token, RIL_Errno e, void *response,
8471 size_t responseLen) {
Steven Moreland6cc40042018-03-20 11:20:05 -07008472 if (!kOemHookEnabled) return 0;
8473
Amit Mahajan439da362017-02-13 17:43:04 -08008474 if (oemHookService[slotId] != NULL && oemHookService[slotId]->mOemHookIndication != NULL) {
8475 if (response == NULL || responseLen == 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008476 RLOGE("oemHookRawInd: invalid response");
Amit Mahajan439da362017-02-13 17:43:04 -08008477 return 0;
8478 }
8479
8480 hidl_vec<uint8_t> data;
8481 data.setToExternal((uint8_t *) response, responseLen);
Jayachandran C572f2f42017-03-25 14:30:13 -07008482#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08008483 RLOGD("oemHookRawInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07008484#endif
Amit Mahajan439da362017-02-13 17:43:04 -08008485 Return<void> retStatus = oemHookService[slotId]->mOemHookIndication->oemHookRaw(
8486 convertIntToRadioIndicationType(indicationType), data);
Amit Mahajand423d192017-03-16 17:04:01 -07008487 checkReturnStatus(slotId, retStatus, false);
Amit Mahajan439da362017-02-13 17:43:04 -08008488 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008489 RLOGE("oemHookRawInd: oemHookService[%d]->mOemHookIndication == NULL", slotId);
Amit Mahajan439da362017-02-13 17:43:04 -08008490 }
8491
8492 return 0;
8493}
8494
Amit Mahajancd77a5b2016-08-25 11:19:21 -07008495void radio::registerService(RIL_RadioFunctions *callbacks, CommandInfo *commands) {
8496 using namespace android::hardware;
8497 int simCount = 1;
Amit Mahajan439da362017-02-13 17:43:04 -08008498 const char *serviceNames[] = {
Amit Mahajan7955c432017-03-28 11:17:55 -07008499 android::RIL_getServiceName()
Amit Mahajancd77a5b2016-08-25 11:19:21 -07008500 #if (SIM_COUNT >= 2)
Amit Mahajan7955c432017-03-28 11:17:55 -07008501 , RIL2_SERVICE_NAME
Amit Mahajancd77a5b2016-08-25 11:19:21 -07008502 #if (SIM_COUNT >= 3)
Amit Mahajan7955c432017-03-28 11:17:55 -07008503 , RIL3_SERVICE_NAME
Amit Mahajancd77a5b2016-08-25 11:19:21 -07008504 #if (SIM_COUNT >= 4)
Amit Mahajan7955c432017-03-28 11:17:55 -07008505 , RIL4_SERVICE_NAME
Amit Mahajan439da362017-02-13 17:43:04 -08008506 #endif
8507 #endif
8508 #endif
8509 };
8510
Amit Mahajancd77a5b2016-08-25 11:19:21 -07008511 #if (SIM_COUNT >= 2)
8512 simCount = SIM_COUNT;
8513 #endif
8514
terrycrhuang456df1b2018-05-04 13:47:06 +08008515 s_vendorFunctions = callbacks;
8516 s_commands = commands;
8517
Amit Mahajancd77a5b2016-08-25 11:19:21 -07008518 configureRpcThreadpool(1, true /* callerWillJoin */);
8519 for (int i = 0; i < simCount; i++) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08008520 pthread_rwlock_t *radioServiceRwlockPtr = getRadioServiceRwlock(i);
8521 int ret = pthread_rwlock_wrlock(radioServiceRwlockPtr);
8522 assert(ret == 0);
8523
Amit Mahajancd77a5b2016-08-25 11:19:21 -07008524 radioService[i] = new RadioImpl;
Sanket Padawef220dc52017-01-02 23:46:00 -08008525 radioService[i]->mSlotId = i;
pkanwardb8e0942017-03-17 12:49:34 -07008526 RLOGD("registerService: starting android::hardware::radio::V1_1::IRadio %s",
8527 serviceNames[i]);
Amit Mahajancd77a5b2016-08-25 11:19:21 -07008528 android::status_t status = radioService[i]->registerAsService(serviceNames[i]);
Steven Moreland6cc40042018-03-20 11:20:05 -07008529
8530 if (kOemHookEnabled) {
8531 oemHookService[i] = new OemHookImpl;
8532 oemHookService[i]->mSlotId = i;
8533 status = oemHookService[i]->registerAsService(serviceNames[i]);
8534 }
Amit Mahajan932e08e2017-01-24 05:45:02 -08008535
8536 ret = pthread_rwlock_unlock(radioServiceRwlockPtr);
8537 assert(ret == 0);
Amit Mahajancd77a5b2016-08-25 11:19:21 -07008538 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07008539}
8540
8541void rilc_thread_pool() {
8542 joinRpcThreadpool();
Amit Mahajan932e08e2017-01-24 05:45:02 -08008543}
8544
8545pthread_rwlock_t * radio::getRadioServiceRwlock(int slotId) {
8546 pthread_rwlock_t *radioServiceRwlockPtr = &radioServiceRwlock;
8547
8548 #if (SIM_COUNT >= 2)
8549 if (slotId == 2) radioServiceRwlockPtr = &radioServiceRwlock2;
8550 #if (SIM_COUNT >= 3)
8551 if (slotId == 3) radioServiceRwlockPtr = &radioServiceRwlock3;
8552 #if (SIM_COUNT >= 4)
8553 if (slotId == 4) radioServiceRwlockPtr = &radioServiceRwlock4;
8554 #endif
8555 #endif
8556 #endif
8557
8558 return radioServiceRwlockPtr;
Sanket Padawe0de29d12017-02-10 13:19:47 -08008559}
Amit Mahajane9a10e62018-02-23 17:12:15 -08008560
8561// should acquire write lock for the corresponding service before calling this
8562void radio::setNitzTimeReceived(int slotId, long timeReceived) {
8563 nitzTimeReceived[slotId] = timeReceived;
8564}