blob: 07fd49f090a2860cb8e12ffd8e5becd869055109 [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
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800504 * request with error RIL_E_NO_MEMORY.
505 * Returns true on success, and false on failure.
506 */
Ruthwar Kumar Ambeer7c373812017-03-23 17:38:56 +0530507bool copyHidlStringToRil(char **dest, const hidl_string &src, RequestInfo *pRI, bool allowEmpty) {
Jack Yuf68e0da2017-02-07 14:53:09 -0800508 size_t len = src.size();
Ruthwar Kumar Ambeer7c373812017-03-23 17:38:56 +0530509 if (len == 0 && !allowEmpty) {
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800510 *dest = NULL;
511 return true;
512 }
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800513 *dest = (char *) calloc(len + 1, sizeof(char));
514 if (*dest == NULL) {
515 RLOGE("Memory allocation failed for request %s", requestToString(pRI->pCI->requestNumber));
Jack Yuffc06452017-02-13 11:21:00 -0800516 sendErrorResponse(pRI, RIL_E_NO_MEMORY);
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800517 return false;
518 }
Scott Randolphc7213312017-04-03 14:06:40 -0700519 strncpy(*dest, src.c_str(), len + 1);
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800520 return true;
521}
522
Ruthwar Kumar Ambeer7c373812017-03-23 17:38:56 +0530523bool copyHidlStringToRil(char **dest, const hidl_string &src, RequestInfo *pRI) {
524 return copyHidlStringToRil(dest, src, pRI, false);
525}
526
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800527hidl_string convertCharPtrToHidlString(const char *ptr) {
528 hidl_string ret;
529 if (ptr != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -0800530 // TODO: replace this with strnlen
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800531 ret.setToExternal(ptr, strlen(ptr));
532 }
533 return ret;
534}
535
536bool dispatchVoid(int serial, int slotId, int request) {
537 RequestInfo *pRI = android::addRequestToList(serial, slotId, request);
538 if (pRI == NULL) {
539 return false;
540 }
Amit Mahajanb3a11bb2017-05-15 16:41:44 -0700541 CALL_ONREQUEST(request, NULL, 0, pRI, slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800542 return true;
543}
544
545bool dispatchString(int serial, int slotId, int request, const char * str) {
546 RequestInfo *pRI = android::addRequestToList(serial, slotId, request);
547 if (pRI == NULL) {
548 return false;
549 }
550
551 char *pString;
552 if (!copyHidlStringToRil(&pString, str, pRI)) {
553 return false;
554 }
555
Amit Mahajanb3a11bb2017-05-15 16:41:44 -0700556 CALL_ONREQUEST(request, pString, sizeof(char *), pRI, slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800557
558 memsetAndFreeStrings(1, pString);
559 return true;
560}
561
Ruthwar Kumar Ambeer7c373812017-03-23 17:38:56 +0530562bool dispatchStrings(int serial, int slotId, int request, bool allowEmpty, int countStrings, ...) {
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800563 RequestInfo *pRI = android::addRequestToList(serial, slotId, request);
564 if (pRI == NULL) {
565 return false;
566 }
567
Sanket Padawef220dc52017-01-02 23:46:00 -0800568 char **pStrings;
Sanket Padawef220dc52017-01-02 23:46:00 -0800569 pStrings = (char **)calloc(countStrings, sizeof(char *));
570 if (pStrings == NULL) {
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800571 RLOGE("Memory allocation failed for request %s", requestToString(request));
Jack Yuffc06452017-02-13 11:21:00 -0800572 sendErrorResponse(pRI, RIL_E_NO_MEMORY);
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800573 return false;
Sanket Padawef220dc52017-01-02 23:46:00 -0800574 }
575 va_list ap;
576 va_start(ap, countStrings);
577 for (int i = 0; i < countStrings; i++) {
578 const char* str = va_arg(ap, const char *);
Ruthwar Kumar Ambeer7c373812017-03-23 17:38:56 +0530579 if (!copyHidlStringToRil(&pStrings[i], hidl_string(str), pRI, allowEmpty)) {
Sanket Padawef220dc52017-01-02 23:46:00 -0800580 va_end(ap);
Sanket Padawef220dc52017-01-02 23:46:00 -0800581 for (int j = 0; j < i; j++) {
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800582 memsetAndFreeStrings(1, pStrings[j]);
Sanket Padawef220dc52017-01-02 23:46:00 -0800583 }
584 free(pStrings);
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800585 return false;
Sanket Padawef220dc52017-01-02 23:46:00 -0800586 }
Sanket Padawef220dc52017-01-02 23:46:00 -0800587 }
588 va_end(ap);
589
Amit Mahajanb3a11bb2017-05-15 16:41:44 -0700590 CALL_ONREQUEST(request, pStrings, countStrings * sizeof(char *), pRI, slotId);
Sanket Padawef220dc52017-01-02 23:46:00 -0800591
592 if (pStrings != NULL) {
593 for (int i = 0 ; i < countStrings ; i++) {
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800594 memsetAndFreeStrings(1, pStrings[i]);
Sanket Padawef220dc52017-01-02 23:46:00 -0800595 }
596
597#ifdef MEMSET_FREED
598 memset(pStrings, 0, countStrings * sizeof(char *));
599#endif
600 free(pStrings);
601 }
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800602 return true;
603}
604
605bool dispatchStrings(int serial, int slotId, int request, const hidl_vec<hidl_string>& data) {
606 RequestInfo *pRI = android::addRequestToList(serial, slotId, request);
607 if (pRI == NULL) {
608 return false;
609 }
610
611 int countStrings = data.size();
612 char **pStrings;
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800613 pStrings = (char **)calloc(countStrings, sizeof(char *));
614 if (pStrings == NULL) {
615 RLOGE("Memory allocation failed for request %s", requestToString(request));
Jack Yuffc06452017-02-13 11:21:00 -0800616 sendErrorResponse(pRI, RIL_E_NO_MEMORY);
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800617 return false;
618 }
619
620 for (int i = 0; i < countStrings; i++) {
Jack Yuf68e0da2017-02-07 14:53:09 -0800621 if (!copyHidlStringToRil(&pStrings[i], data[i], pRI)) {
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800622 for (int j = 0; j < i; j++) {
623 memsetAndFreeStrings(1, pStrings[j]);
624 }
625 free(pStrings);
626 return false;
627 }
628 }
629
Amit Mahajanb3a11bb2017-05-15 16:41:44 -0700630 CALL_ONREQUEST(request, pStrings, countStrings * sizeof(char *), pRI, slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800631
632 if (pStrings != NULL) {
633 for (int i = 0 ; i < countStrings ; i++) {
634 memsetAndFreeStrings(1, pStrings[i]);
635 }
636
637#ifdef MEMSET_FREED
638 memset(pStrings, 0, countStrings * sizeof(char *));
639#endif
640 free(pStrings);
641 }
642 return true;
643}
644
645bool dispatchInts(int serial, int slotId, int request, int countInts, ...) {
646 RequestInfo *pRI = android::addRequestToList(serial, slotId, request);
647 if (pRI == NULL) {
648 return false;
649 }
650
Jack Yuffc06452017-02-13 11:21:00 -0800651 int *pInts = (int *)calloc(countInts, sizeof(int));
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800652
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800653 if (pInts == NULL) {
654 RLOGE("Memory allocation failed for request %s", requestToString(request));
Jack Yuffc06452017-02-13 11:21:00 -0800655 sendErrorResponse(pRI, RIL_E_NO_MEMORY);
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800656 return false;
657 }
658 va_list ap;
659 va_start(ap, countInts);
660 for (int i = 0; i < countInts; i++) {
661 pInts[i] = va_arg(ap, int);
662 }
663 va_end(ap);
664
Amit Mahajanb3a11bb2017-05-15 16:41:44 -0700665 CALL_ONREQUEST(request, pInts, countInts * sizeof(int), pRI, slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800666
667 if (pInts != NULL) {
668#ifdef MEMSET_FREED
669 memset(pInts, 0, countInts * sizeof(int));
670#endif
671 free(pInts);
672 }
673 return true;
674}
675
676bool dispatchCallForwardStatus(int serial, int slotId, int request,
677 const CallForwardInfo& callInfo) {
678 RequestInfo *pRI = android::addRequestToList(serial, slotId, request);
679 if (pRI == NULL) {
680 return false;
681 }
682
683 RIL_CallForwardInfo cf;
684 cf.status = (int) callInfo.status;
685 cf.reason = callInfo.reason;
686 cf.serviceClass = callInfo.serviceClass;
687 cf.toa = callInfo.toa;
688 cf.timeSeconds = callInfo.timeSeconds;
689
690 if (!copyHidlStringToRil(&cf.number, callInfo.number, pRI)) {
691 return false;
692 }
693
Amit Mahajanb3a11bb2017-05-15 16:41:44 -0700694 CALL_ONREQUEST(request, &cf, sizeof(cf), pRI, slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800695
696 memsetAndFreeStrings(1, cf.number);
697
698 return true;
699}
700
701bool dispatchRaw(int serial, int slotId, int request, const hidl_vec<uint8_t>& rawBytes) {
702 RequestInfo *pRI = android::addRequestToList(serial, slotId, request);
703 if (pRI == NULL) {
704 return false;
705 }
706
707 const uint8_t *uData = rawBytes.data();
708
Amit Mahajanb3a11bb2017-05-15 16:41:44 -0700709 CALL_ONREQUEST(request, (void *) uData, rawBytes.size(), pRI, slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800710
711 return true;
712}
713
714bool dispatchIccApdu(int serial, int slotId, int request, const SimApdu& message) {
715 RequestInfo *pRI = android::addRequestToList(serial, slotId, request);
716 if (pRI == NULL) {
717 return false;
718 }
719
Jack Yu8e732d42017-04-14 00:08:06 -0700720 RIL_SIM_APDU apdu = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800721
722 apdu.sessionid = message.sessionId;
723 apdu.cla = message.cla;
724 apdu.instruction = message.instruction;
725 apdu.p1 = message.p1;
726 apdu.p2 = message.p2;
727 apdu.p3 = message.p3;
728
729 if (!copyHidlStringToRil(&apdu.data, message.data, pRI)) {
730 return false;
731 }
732
Amit Mahajanb3a11bb2017-05-15 16:41:44 -0700733 CALL_ONREQUEST(request, &apdu, sizeof(apdu), pRI, slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800734
735 memsetAndFreeStrings(1, apdu.data);
736
737 return true;
Sanket Padawef220dc52017-01-02 23:46:00 -0800738}
739
Amit Mahajand423d192017-03-16 17:04:01 -0700740void checkReturnStatus(int32_t slotId, Return<void>& ret, bool isRadioService) {
Amit Mahajan17249842017-01-19 15:05:45 -0800741 if (ret.isOk() == false) {
Amit Mahajan439da362017-02-13 17:43:04 -0800742 RLOGE("checkReturnStatus: unable to call response/indication callback");
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800743 // Remote process hosting the callbacks must be dead. Reset the callback objects;
Amit Mahajan17249842017-01-19 15:05:45 -0800744 // there's no other recovery to be done here. When the client process is back up, it will
745 // call setResponseFunctions()
Amit Mahajan932e08e2017-01-24 05:45:02 -0800746
747 // Caller should already hold rdlock, release that first
748 // note the current counter to avoid overwriting updates made by another thread before
749 // write lock is acquired.
Amit Mahajand423d192017-03-16 17:04:01 -0700750 int counter = isRadioService ? mCounterRadio[slotId] : mCounterOemHook[slotId];
Amit Mahajan439da362017-02-13 17:43:04 -0800751 pthread_rwlock_t *radioServiceRwlockPtr = radio::getRadioServiceRwlock(slotId);
Amit Mahajan932e08e2017-01-24 05:45:02 -0800752 int ret = pthread_rwlock_unlock(radioServiceRwlockPtr);
753 assert(ret == 0);
754
755 // acquire wrlock
756 ret = pthread_rwlock_wrlock(radioServiceRwlockPtr);
757 assert(ret == 0);
758
759 // make sure the counter value has not changed
Amit Mahajand423d192017-03-16 17:04:01 -0700760 if (counter == (isRadioService ? mCounterRadio[slotId] : mCounterOemHook[slotId])) {
761 if (isRadioService) {
762 radioService[slotId]->mRadioResponse = NULL;
763 radioService[slotId]->mRadioIndication = NULL;
Amit Mahajanccb6d7f2017-06-09 10:44:54 -0700764 radioService[slotId]->mRadioResponseV1_1 = NULL;
765 radioService[slotId]->mRadioIndicationV1_1 = NULL;
Amit Mahajand423d192017-03-16 17:04:01 -0700766 } else {
767 oemHookService[slotId]->mOemHookResponse = NULL;
768 oemHookService[slotId]->mOemHookIndication = NULL;
769 }
770 isRadioService ? mCounterRadio[slotId]++ : mCounterOemHook[slotId]++;
Amit Mahajan932e08e2017-01-24 05:45:02 -0800771 } else {
Amit Mahajan439da362017-02-13 17:43:04 -0800772 RLOGE("checkReturnStatus: not resetting responseFunctions as they likely "
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800773 "got updated on another thread");
Amit Mahajan932e08e2017-01-24 05:45:02 -0800774 }
775
776 // release wrlock
777 ret = pthread_rwlock_unlock(radioServiceRwlockPtr);
778 assert(ret == 0);
779
780 // Reacquire rdlock
781 ret = pthread_rwlock_rdlock(radioServiceRwlockPtr);
782 assert(ret == 0);
Amit Mahajan17249842017-01-19 15:05:45 -0800783 }
784}
785
Amit Mahajan439da362017-02-13 17:43:04 -0800786void RadioImpl::checkReturnStatus(Return<void>& ret) {
Amit Mahajand423d192017-03-16 17:04:01 -0700787 ::checkReturnStatus(mSlotId, ret, true);
Amit Mahajan439da362017-02-13 17:43:04 -0800788}
789
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700790Return<void> RadioImpl::setResponseFunctions(
791 const ::android::sp<IRadioResponse>& radioResponseParam,
792 const ::android::sp<IRadioIndication>& radioIndicationParam) {
Amit Mahajan111ddca2017-03-03 12:05:13 -0800793 RLOGD("setResponseFunctions");
Amit Mahajan932e08e2017-01-24 05:45:02 -0800794
795 pthread_rwlock_t *radioServiceRwlockPtr = radio::getRadioServiceRwlock(mSlotId);
796 int ret = pthread_rwlock_wrlock(radioServiceRwlockPtr);
797 assert(ret == 0);
798
Sanket Padawef220dc52017-01-02 23:46:00 -0800799 mRadioResponse = radioResponseParam;
800 mRadioIndication = radioIndicationParam;
Amit Mahajanccb6d7f2017-06-09 10:44:54 -0700801 mRadioResponseV1_1 = V1_1::IRadioResponse::castFrom(mRadioResponse).withDefault(nullptr);
802 mRadioIndicationV1_1 = V1_1::IRadioIndication::castFrom(mRadioIndication).withDefault(nullptr);
803 if (mRadioResponseV1_1 == nullptr || mRadioIndicationV1_1 == nullptr) {
804 mRadioResponseV1_1 = nullptr;
805 mRadioIndicationV1_1 = nullptr;
806 }
807
Amit Mahajand423d192017-03-16 17:04:01 -0700808 mCounterRadio[mSlotId]++;
Amit Mahajan932e08e2017-01-24 05:45:02 -0800809
810 ret = pthread_rwlock_unlock(radioServiceRwlockPtr);
811 assert(ret == 0);
812
Amit Mahajan60482fd2017-03-14 16:39:27 -0700813 // client is connected. Send initial indications.
814 android::onNewCommandConnect((RIL_SOCKET_ID) mSlotId);
815
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800816 return Void();
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700817}
818
819Return<void> RadioImpl::getIccCardStatus(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -0700820#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -0800821 RLOGD("getIccCardStatus: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -0700822#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800823 dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_SIM_STATUS);
824 return Void();
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700825}
826
Sanket Padawef220dc52017-01-02 23:46:00 -0800827Return<void> RadioImpl::supplyIccPinForApp(int32_t serial, const hidl_string& pin,
828 const hidl_string& aid) {
Jayachandran C572f2f42017-03-25 14:30:13 -0700829#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -0800830 RLOGD("supplyIccPinForApp: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -0700831#endif
Ruthwar Kumar Ambeer7c373812017-03-23 17:38:56 +0530832 dispatchStrings(serial, mSlotId, RIL_REQUEST_ENTER_SIM_PIN, true,
Scott Randolphc7213312017-04-03 14:06:40 -0700833 2, pin.c_str(), aid.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800834 return Void();
Sanket Padawef220dc52017-01-02 23:46:00 -0800835}
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700836
Sanket Padawef220dc52017-01-02 23:46:00 -0800837Return<void> RadioImpl::supplyIccPukForApp(int32_t serial, const hidl_string& puk,
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800838 const hidl_string& pin, const hidl_string& aid) {
Jayachandran C572f2f42017-03-25 14:30:13 -0700839#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -0800840 RLOGD("supplyIccPukForApp: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -0700841#endif
Ruthwar Kumar Ambeer7c373812017-03-23 17:38:56 +0530842 dispatchStrings(serial, mSlotId, RIL_REQUEST_ENTER_SIM_PUK, true,
Scott Randolphc7213312017-04-03 14:06:40 -0700843 3, puk.c_str(), pin.c_str(), aid.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800844 return Void();
Sanket Padawef220dc52017-01-02 23:46:00 -0800845}
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700846
Sanket Padawef220dc52017-01-02 23:46:00 -0800847Return<void> RadioImpl::supplyIccPin2ForApp(int32_t serial, const hidl_string& pin2,
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800848 const hidl_string& aid) {
Jayachandran C572f2f42017-03-25 14:30:13 -0700849#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -0800850 RLOGD("supplyIccPin2ForApp: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -0700851#endif
Ruthwar Kumar Ambeer7c373812017-03-23 17:38:56 +0530852 dispatchStrings(serial, mSlotId, RIL_REQUEST_ENTER_SIM_PIN2, true,
Scott Randolphc7213312017-04-03 14:06:40 -0700853 2, pin2.c_str(), aid.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800854 return Void();
Sanket Padawef220dc52017-01-02 23:46:00 -0800855}
856
857Return<void> RadioImpl::supplyIccPuk2ForApp(int32_t serial, const hidl_string& puk2,
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800858 const hidl_string& pin2, const hidl_string& aid) {
Jayachandran C572f2f42017-03-25 14:30:13 -0700859#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -0800860 RLOGD("supplyIccPuk2ForApp: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -0700861#endif
Ruthwar Kumar Ambeer7c373812017-03-23 17:38:56 +0530862 dispatchStrings(serial, mSlotId, RIL_REQUEST_ENTER_SIM_PUK2, true,
Scott Randolphc7213312017-04-03 14:06:40 -0700863 3, puk2.c_str(), pin2.c_str(), aid.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800864 return Void();
Sanket Padawef220dc52017-01-02 23:46:00 -0800865}
866
867Return<void> RadioImpl::changeIccPinForApp(int32_t serial, const hidl_string& oldPin,
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800868 const hidl_string& newPin, const hidl_string& aid) {
Jayachandran C572f2f42017-03-25 14:30:13 -0700869#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -0800870 RLOGD("changeIccPinForApp: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -0700871#endif
Ruthwar Kumar Ambeer7c373812017-03-23 17:38:56 +0530872 dispatchStrings(serial, mSlotId, RIL_REQUEST_CHANGE_SIM_PIN, true,
Scott Randolphc7213312017-04-03 14:06:40 -0700873 3, oldPin.c_str(), newPin.c_str(), aid.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800874 return Void();
Sanket Padawef220dc52017-01-02 23:46:00 -0800875}
876
877Return<void> RadioImpl::changeIccPin2ForApp(int32_t serial, const hidl_string& oldPin2,
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800878 const hidl_string& newPin2, const hidl_string& aid) {
Jayachandran C572f2f42017-03-25 14:30:13 -0700879#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -0800880 RLOGD("changeIccPin2ForApp: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -0700881#endif
Ruthwar Kumar Ambeer7c373812017-03-23 17:38:56 +0530882 dispatchStrings(serial, mSlotId, RIL_REQUEST_CHANGE_SIM_PIN2, true,
Scott Randolphc7213312017-04-03 14:06:40 -0700883 3, oldPin2.c_str(), newPin2.c_str(), aid.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800884 return Void();
Sanket Padawef220dc52017-01-02 23:46:00 -0800885}
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700886
887Return<void> RadioImpl::supplyNetworkDepersonalization(int32_t serial,
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800888 const hidl_string& netPin) {
Jayachandran C572f2f42017-03-25 14:30:13 -0700889#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -0800890 RLOGD("supplyNetworkDepersonalization: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -0700891#endif
Ruthwar Kumar Ambeer7c373812017-03-23 17:38:56 +0530892 dispatchStrings(serial, mSlotId, RIL_REQUEST_ENTER_NETWORK_DEPERSONALIZATION, true,
Scott Randolphc7213312017-04-03 14:06:40 -0700893 1, netPin.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800894 return Void();
Sanket Padawef220dc52017-01-02 23:46:00 -0800895}
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700896
Sanket Padawef220dc52017-01-02 23:46:00 -0800897Return<void> RadioImpl::getCurrentCalls(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -0700898#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -0800899 RLOGD("getCurrentCalls: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -0700900#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800901 dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_CURRENT_CALLS);
902 return Void();
Sanket Padawef220dc52017-01-02 23:46:00 -0800903}
904
905Return<void> RadioImpl::dial(int32_t serial, const Dial& dialInfo) {
Jayachandran C572f2f42017-03-25 14:30:13 -0700906#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -0800907 RLOGD("dial: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -0700908#endif
Sanket Padawef220dc52017-01-02 23:46:00 -0800909 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_DIAL);
910 if (pRI == NULL) {
911 return Void();
912 }
Jack Yuf68e0da2017-02-07 14:53:09 -0800913 RIL_Dial dial = {};
914 RIL_UUS_Info uusInfo = {};
Sanket Padawef220dc52017-01-02 23:46:00 -0800915 int32_t sizeOfDial = sizeof(dial);
916
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800917 if (!copyHidlStringToRil(&dial.address, dialInfo.address, pRI)) {
Sanket Padawef220dc52017-01-02 23:46:00 -0800918 return Void();
919 }
Jack Yuf68e0da2017-02-07 14:53:09 -0800920 dial.clir = (int) dialInfo.clir;
Sanket Padawef220dc52017-01-02 23:46:00 -0800921
Sanket Padawef220dc52017-01-02 23:46:00 -0800922 if (dialInfo.uusInfo.size() != 0) {
Sanket Padawef220dc52017-01-02 23:46:00 -0800923 uusInfo.uusType = (RIL_UUS_Type) dialInfo.uusInfo[0].uusType;
924 uusInfo.uusDcs = (RIL_UUS_DCS) dialInfo.uusInfo[0].uusDcs;
925
926 if (dialInfo.uusInfo[0].uusData.size() == 0) {
927 uusInfo.uusData = NULL;
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800928 uusInfo.uusLength = 0;
Sanket Padawef220dc52017-01-02 23:46:00 -0800929 } else {
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800930 if (!copyHidlStringToRil(&uusInfo.uusData, dialInfo.uusInfo[0].uusData, pRI)) {
931 memsetAndFreeStrings(1, dial.address);
Sanket Padawef220dc52017-01-02 23:46:00 -0800932 return Void();
933 }
Jack Yuf68e0da2017-02-07 14:53:09 -0800934 uusInfo.uusLength = dialInfo.uusInfo[0].uusData.size();
Sanket Padawef220dc52017-01-02 23:46:00 -0800935 }
936
Sanket Padawef220dc52017-01-02 23:46:00 -0800937 dial.uusInfo = &uusInfo;
938 }
939
Amit Mahajanb3a11bb2017-05-15 16:41:44 -0700940 CALL_ONREQUEST(RIL_REQUEST_DIAL, &dial, sizeOfDial, pRI, mSlotId);
Sanket Padawef220dc52017-01-02 23:46:00 -0800941
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800942 memsetAndFreeStrings(2, dial.address, uusInfo.uusData);
Sanket Padawef220dc52017-01-02 23:46:00 -0800943
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800944 return Void();
Sanket Padawef220dc52017-01-02 23:46:00 -0800945}
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700946
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800947Return<void> RadioImpl::getImsiForApp(int32_t serial, const hidl_string& aid) {
Jayachandran C572f2f42017-03-25 14:30:13 -0700948#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -0800949 RLOGD("getImsiForApp: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -0700950#endif
Ruthwar Kumar Ambeer7c373812017-03-23 17:38:56 +0530951 dispatchStrings(serial, mSlotId, RIL_REQUEST_GET_IMSI, false,
Scott Randolphc7213312017-04-03 14:06:40 -0700952 1, aid.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800953 return Void();
954}
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700955
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800956Return<void> RadioImpl::hangup(int32_t serial, int32_t gsmIndex) {
Jayachandran C572f2f42017-03-25 14:30:13 -0700957#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -0800958 RLOGD("hangup: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -0700959#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800960 dispatchInts(serial, mSlotId, RIL_REQUEST_HANGUP, 1, gsmIndex);
961 return Void();
962}
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700963
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800964Return<void> RadioImpl::hangupWaitingOrBackground(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -0700965#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -0800966 RLOGD("hangupWaitingOrBackground: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -0700967#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800968 dispatchVoid(serial, mSlotId, RIL_REQUEST_HANGUP_WAITING_OR_BACKGROUND);
969 return Void();
970}
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700971
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800972Return<void> RadioImpl::hangupForegroundResumeBackground(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -0700973#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -0800974 RLOGD("hangupForegroundResumeBackground: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -0700975#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800976 dispatchVoid(serial, mSlotId, RIL_REQUEST_HANGUP_FOREGROUND_RESUME_BACKGROUND);
977 return Void();
978}
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700979
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800980Return<void> RadioImpl::switchWaitingOrHoldingAndActive(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -0700981#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -0800982 RLOGD("switchWaitingOrHoldingAndActive: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -0700983#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800984 dispatchVoid(serial, mSlotId, RIL_REQUEST_SWITCH_WAITING_OR_HOLDING_AND_ACTIVE);
985 return Void();
986}
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700987
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800988Return<void> RadioImpl::conference(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -0700989#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -0800990 RLOGD("conference: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -0700991#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800992 dispatchVoid(serial, mSlotId, RIL_REQUEST_CONFERENCE);
993 return Void();
994}
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700995
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800996Return<void> RadioImpl::rejectCall(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -0700997#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -0800998 RLOGD("rejectCall: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -0700999#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001000 dispatchVoid(serial, mSlotId, RIL_REQUEST_UDUB);
1001 return Void();
1002}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001003
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001004Return<void> RadioImpl::getLastCallFailCause(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001005#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001006 RLOGD("getLastCallFailCause: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001007#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001008 dispatchVoid(serial, mSlotId, RIL_REQUEST_LAST_CALL_FAIL_CAUSE);
1009 return Void();
1010}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001011
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001012Return<void> RadioImpl::getSignalStrength(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001013#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001014 RLOGD("getSignalStrength: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001015#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001016 dispatchVoid(serial, mSlotId, RIL_REQUEST_SIGNAL_STRENGTH);
1017 return Void();
1018}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001019
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001020Return<void> RadioImpl::getVoiceRegistrationState(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001021#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001022 RLOGD("getVoiceRegistrationState: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001023#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001024 dispatchVoid(serial, mSlotId, RIL_REQUEST_VOICE_REGISTRATION_STATE);
1025 return Void();
1026}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001027
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001028Return<void> RadioImpl::getDataRegistrationState(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001029#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001030 RLOGD("getDataRegistrationState: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001031#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001032 dispatchVoid(serial, mSlotId, RIL_REQUEST_DATA_REGISTRATION_STATE);
1033 return Void();
1034}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001035
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001036Return<void> RadioImpl::getOperator(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001037#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001038 RLOGD("getOperator: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001039#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001040 dispatchVoid(serial, mSlotId, RIL_REQUEST_OPERATOR);
1041 return Void();
1042}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001043
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001044Return<void> RadioImpl::setRadioPower(int32_t serial, bool on) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08001045 RLOGD("setRadioPower: serial %d on %d", serial, on);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001046 dispatchInts(serial, mSlotId, RIL_REQUEST_RADIO_POWER, 1, BOOL_TO_INT(on));
1047 return Void();
1048}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001049
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001050Return<void> RadioImpl::sendDtmf(int32_t serial, const hidl_string& s) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001051#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001052 RLOGD("sendDtmf: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001053#endif
Scott Randolphc7213312017-04-03 14:06:40 -07001054 dispatchString(serial, mSlotId, RIL_REQUEST_DTMF, s.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001055 return Void();
1056}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001057
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001058Return<void> RadioImpl::sendSms(int32_t serial, const GsmSmsMessage& message) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001059#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001060 RLOGD("sendSms: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001061#endif
Ruthwar Kumar Ambeer7c373812017-03-23 17:38:56 +05301062 dispatchStrings(serial, mSlotId, RIL_REQUEST_SEND_SMS, false,
Scott Randolphc7213312017-04-03 14:06:40 -07001063 2, message.smscPdu.c_str(), message.pdu.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001064 return Void();
1065}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001066
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001067Return<void> RadioImpl::sendSMSExpectMore(int32_t serial, const GsmSmsMessage& message) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001068#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001069 RLOGD("sendSMSExpectMore: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001070#endif
Ruthwar Kumar Ambeer7c373812017-03-23 17:38:56 +05301071 dispatchStrings(serial, mSlotId, RIL_REQUEST_SEND_SMS_EXPECT_MORE, false,
Scott Randolphc7213312017-04-03 14:06:40 -07001072 2, message.smscPdu.c_str(), message.pdu.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001073 return Void();
1074}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001075
Jack Yuc13645e2017-04-13 20:55:03 -07001076static bool convertMvnoTypeToString(MvnoType type, char *&str) {
Jack Yuffc06452017-02-13 11:21:00 -08001077 switch (type) {
Jack Yuc13645e2017-04-13 20:55:03 -07001078 case MvnoType::IMSI:
1079 str = (char *)"imsi";
1080 return true;
1081 case MvnoType::GID:
1082 str = (char *)"gid";
1083 return true;
1084 case MvnoType::SPN:
1085 str = (char *)"spn";
1086 return true;
1087 case MvnoType::NONE:
1088 str = (char *)"";
1089 return true;
Jack Yuffc06452017-02-13 11:21:00 -08001090 }
Jack Yuc13645e2017-04-13 20:55:03 -07001091 return false;
Jack Yuffc06452017-02-13 11:21:00 -08001092}
1093
1094Return<void> RadioImpl::setupDataCall(int32_t serial, RadioTechnology radioTechnology,
1095 const DataProfileInfo& dataProfileInfo, bool modemCognitive,
1096 bool roamingAllowed, bool isRoaming) {
1097
Jayachandran C572f2f42017-03-25 14:30:13 -07001098#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001099 RLOGD("setupDataCall: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001100#endif
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001101
Jack Yuffc06452017-02-13 11:21:00 -08001102 if (s_vendorFunctions->version >= 4 && s_vendorFunctions->version <= 14) {
1103 const hidl_string &protocol =
1104 (isRoaming ? dataProfileInfo.roamingProtocol : dataProfileInfo.protocol);
Ruthwar Kumar Ambeer7c373812017-03-23 17:38:56 +05301105 dispatchStrings(serial, mSlotId, RIL_REQUEST_SETUP_DATA_CALL, true, 7,
Jack Yuffc06452017-02-13 11:21:00 -08001106 std::to_string((int) radioTechnology + 2).c_str(),
1107 std::to_string((int) dataProfileInfo.profileId).c_str(),
1108 dataProfileInfo.apn.c_str(),
1109 dataProfileInfo.user.c_str(),
1110 dataProfileInfo.password.c_str(),
1111 std::to_string((int) dataProfileInfo.authType).c_str(),
1112 protocol.c_str());
1113 } else if (s_vendorFunctions->version >= 15) {
Jack Yuc13645e2017-04-13 20:55:03 -07001114 char *mvnoTypeStr = NULL;
1115 if (!convertMvnoTypeToString(dataProfileInfo.mvnoType, mvnoTypeStr)) {
Jack Yuffc06452017-02-13 11:21:00 -08001116 RequestInfo *pRI = android::addRequestToList(serial, mSlotId,
1117 RIL_REQUEST_SETUP_DATA_CALL);
1118 if (pRI != NULL) {
1119 sendErrorResponse(pRI, RIL_E_INVALID_ARGUMENTS);
1120 }
1121 return Void();
1122 }
Ruthwar Kumar Ambeer7c373812017-03-23 17:38:56 +05301123 dispatchStrings(serial, mSlotId, RIL_REQUEST_SETUP_DATA_CALL, true, 15,
Jack Yuffc06452017-02-13 11:21:00 -08001124 std::to_string((int) radioTechnology + 2).c_str(),
1125 std::to_string((int) dataProfileInfo.profileId).c_str(),
1126 dataProfileInfo.apn.c_str(),
1127 dataProfileInfo.user.c_str(),
1128 dataProfileInfo.password.c_str(),
1129 std::to_string((int) dataProfileInfo.authType).c_str(),
1130 dataProfileInfo.protocol.c_str(),
1131 dataProfileInfo.roamingProtocol.c_str(),
1132 std::to_string(dataProfileInfo.supportedApnTypesBitmap).c_str(),
1133 std::to_string(dataProfileInfo.bearerBitmap).c_str(),
Jack Yuc13645e2017-04-13 20:55:03 -07001134 modemCognitive ? "1" : "0",
Jack Yuffc06452017-02-13 11:21:00 -08001135 std::to_string(dataProfileInfo.mtu).c_str(),
1136 mvnoTypeStr,
1137 dataProfileInfo.mvnoMatchData.c_str(),
Jack Yuc13645e2017-04-13 20:55:03 -07001138 roamingAllowed ? "1" : "0");
Jack Yuffc06452017-02-13 11:21:00 -08001139 } else {
1140 RLOGE("Unsupported RIL version %d, min version expected 4", s_vendorFunctions->version);
1141 RequestInfo *pRI = android::addRequestToList(serial, mSlotId,
1142 RIL_REQUEST_SETUP_DATA_CALL);
1143 if (pRI != NULL) {
1144 sendErrorResponse(pRI, RIL_E_REQUEST_NOT_SUPPORTED);
1145 }
1146 }
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001147 return Void();
1148}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001149
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001150Return<void> RadioImpl::iccIOForApp(int32_t serial, const IccIo& iccIo) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001151#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001152 RLOGD("iccIOForApp: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001153#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001154 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_SIM_IO);
1155 if (pRI == NULL) {
1156 return Void();
1157 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001158
Jack Yu8e732d42017-04-14 00:08:06 -07001159 RIL_SIM_IO_v6 rilIccIo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001160 rilIccIo.command = iccIo.command;
1161 rilIccIo.fileid = iccIo.fileId;
1162 if (!copyHidlStringToRil(&rilIccIo.path, iccIo.path, pRI)) {
1163 return Void();
1164 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001165
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001166 rilIccIo.p1 = iccIo.p1;
1167 rilIccIo.p2 = iccIo.p2;
1168 rilIccIo.p3 = iccIo.p3;
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001169
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001170 if (!copyHidlStringToRil(&rilIccIo.data, iccIo.data, pRI)) {
1171 memsetAndFreeStrings(1, rilIccIo.path);
1172 return Void();
1173 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001174
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001175 if (!copyHidlStringToRil(&rilIccIo.pin2, iccIo.pin2, pRI)) {
1176 memsetAndFreeStrings(2, rilIccIo.path, rilIccIo.data);
1177 return Void();
1178 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001179
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001180 if (!copyHidlStringToRil(&rilIccIo.aidPtr, iccIo.aid, pRI)) {
1181 memsetAndFreeStrings(3, rilIccIo.path, rilIccIo.data, rilIccIo.pin2);
1182 return Void();
1183 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001184
Amit Mahajanb3a11bb2017-05-15 16:41:44 -07001185 CALL_ONREQUEST(RIL_REQUEST_SIM_IO, &rilIccIo, sizeof(rilIccIo), pRI, mSlotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001186
1187 memsetAndFreeStrings(4, rilIccIo.path, rilIccIo.data, rilIccIo.pin2, rilIccIo.aidPtr);
1188
1189 return Void();
1190}
1191
1192Return<void> RadioImpl::sendUssd(int32_t serial, const hidl_string& ussd) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001193#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001194 RLOGD("sendUssd: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001195#endif
Scott Randolphc7213312017-04-03 14:06:40 -07001196 dispatchString(serial, mSlotId, RIL_REQUEST_SEND_USSD, ussd.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001197 return Void();
1198}
1199
1200Return<void> RadioImpl::cancelPendingUssd(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001201#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001202 RLOGD("cancelPendingUssd: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001203#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001204 dispatchVoid(serial, mSlotId, RIL_REQUEST_CANCEL_USSD);
1205 return Void();
1206}
1207
1208Return<void> RadioImpl::getClir(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001209#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001210 RLOGD("getClir: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001211#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001212 dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_CLIR);
1213 return Void();
1214}
1215
1216Return<void> RadioImpl::setClir(int32_t serial, int32_t status) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001217#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001218 RLOGD("setClir: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001219#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001220 dispatchInts(serial, mSlotId, RIL_REQUEST_SET_CLIR, 1, status);
1221 return Void();
1222}
1223
1224Return<void> RadioImpl::getCallForwardStatus(int32_t serial, const CallForwardInfo& callInfo) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001225#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001226 RLOGD("getCallForwardStatus: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001227#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001228 dispatchCallForwardStatus(serial, mSlotId, RIL_REQUEST_QUERY_CALL_FORWARD_STATUS,
1229 callInfo);
1230 return Void();
1231}
1232
1233Return<void> RadioImpl::setCallForward(int32_t serial, const CallForwardInfo& callInfo) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001234#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001235 RLOGD("setCallForward: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001236#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001237 dispatchCallForwardStatus(serial, mSlotId, RIL_REQUEST_SET_CALL_FORWARD,
1238 callInfo);
1239 return Void();
1240}
1241
1242Return<void> RadioImpl::getCallWaiting(int32_t serial, int32_t serviceClass) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001243#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001244 RLOGD("getCallWaiting: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001245#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001246 dispatchInts(serial, mSlotId, RIL_REQUEST_QUERY_CALL_WAITING, 1, serviceClass);
1247 return Void();
1248}
1249
1250Return<void> RadioImpl::setCallWaiting(int32_t serial, bool enable, int32_t serviceClass) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001251#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001252 RLOGD("setCallWaiting: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001253#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001254 dispatchInts(serial, mSlotId, RIL_REQUEST_SET_CALL_WAITING, 2, BOOL_TO_INT(enable),
1255 serviceClass);
1256 return Void();
1257}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001258
1259Return<void> RadioImpl::acknowledgeLastIncomingGsmSms(int32_t serial,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001260 bool success, SmsAcknowledgeFailCause cause) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001261#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001262 RLOGD("acknowledgeLastIncomingGsmSms: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001263#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001264 dispatchInts(serial, mSlotId, RIL_REQUEST_SMS_ACKNOWLEDGE, 2, BOOL_TO_INT(success),
1265 cause);
1266 return Void();
1267}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001268
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001269Return<void> RadioImpl::acceptCall(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001270#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001271 RLOGD("acceptCall: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001272#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001273 dispatchVoid(serial, mSlotId, RIL_REQUEST_ANSWER);
1274 return Void();
1275}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001276
1277Return<void> RadioImpl::deactivateDataCall(int32_t serial,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001278 int32_t cid, bool reasonRadioShutDown) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001279#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001280 RLOGD("deactivateDataCall: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001281#endif
Ruthwar Kumar Ambeer7c373812017-03-23 17:38:56 +05301282 dispatchStrings(serial, mSlotId, RIL_REQUEST_DEACTIVATE_DATA_CALL, false,
Scott Randolphc7213312017-04-03 14:06:40 -07001283 2, (std::to_string(cid)).c_str(), reasonRadioShutDown ? "1" : "0");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001284 return Void();
1285}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001286
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001287Return<void> RadioImpl::getFacilityLockForApp(int32_t serial, const hidl_string& facility,
1288 const hidl_string& password, int32_t serviceClass,
1289 const hidl_string& appId) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001290#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001291 RLOGD("getFacilityLockForApp: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001292#endif
Ruthwar Kumar Ambeer7c373812017-03-23 17:38:56 +05301293 dispatchStrings(serial, mSlotId, RIL_REQUEST_QUERY_FACILITY_LOCK, true,
Scott Randolphc7213312017-04-03 14:06:40 -07001294 4, facility.c_str(), password.c_str(),
1295 (std::to_string(serviceClass)).c_str(), appId.c_str());
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::setFacilityLockForApp(int32_t serial, const hidl_string& facility,
1300 bool lockState, const hidl_string& password,
1301 int32_t serviceClass, const hidl_string& appId) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001302#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001303 RLOGD("setFacilityLockForApp: 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_SET_FACILITY_LOCK, true,
Scott Randolphc7213312017-04-03 14:06:40 -07001306 5, facility.c_str(), lockState ? "1" : "0", 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::setBarringPassword(int32_t serial, const hidl_string& facility,
1312 const hidl_string& oldPassword,
1313 const hidl_string& newPassword) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001314#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001315 RLOGD("setBarringPassword: 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_CHANGE_BARRING_PASSWORD, true,
Sanket Padawe75e42a52017-05-24 10:03:55 -07001318 3, facility.c_str(), oldPassword.c_str(), newPassword.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001319 return Void();
1320}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001321
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001322Return<void> RadioImpl::getNetworkSelectionMode(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001323#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001324 RLOGD("getNetworkSelectionMode: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001325#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001326 dispatchVoid(serial, mSlotId, RIL_REQUEST_QUERY_NETWORK_SELECTION_MODE);
1327 return Void();
1328}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001329
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001330Return<void> RadioImpl::setNetworkSelectionModeAutomatic(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001331#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001332 RLOGD("setNetworkSelectionModeAutomatic: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001333#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001334 dispatchVoid(serial, mSlotId, RIL_REQUEST_SET_NETWORK_SELECTION_AUTOMATIC);
1335 return Void();
1336}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001337
1338Return<void> RadioImpl::setNetworkSelectionModeManual(int32_t serial,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001339 const hidl_string& operatorNumeric) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001340#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001341 RLOGD("setNetworkSelectionModeManual: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001342#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001343 dispatchString(serial, mSlotId, RIL_REQUEST_SET_NETWORK_SELECTION_MANUAL,
Scott Randolphc7213312017-04-03 14:06:40 -07001344 operatorNumeric.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001345 return Void();
1346}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001347
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001348Return<void> RadioImpl::getAvailableNetworks(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001349#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001350 RLOGD("getAvailableNetworks: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001351#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001352 dispatchVoid(serial, mSlotId, RIL_REQUEST_QUERY_AVAILABLE_NETWORKS);
1353 return Void();
1354}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001355
Nathan Harold6a8809d2017-07-07 19:28:58 -07001356Return<void> RadioImpl::startNetworkScan(int32_t serial, const V1_1::NetworkScanRequest& request) {
yinxu3abe7c72017-05-03 15:15:19 -07001357#if VDBG
1358 RLOGD("startNetworkScan: serial %d", serial);
1359#endif
yinxu8688abd2017-05-22 11:26:45 -07001360
1361 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_START_NETWORK_SCAN);
1362 if (pRI == NULL) {
1363 return Void();
1364 }
1365
1366 if (request.specifiers.size() > MAX_RADIO_ACCESS_NETWORKS) {
1367 sendErrorResponse(pRI, RIL_E_INVALID_ARGUMENTS);
1368 return Void();
1369 }
1370
1371 RIL_NetworkScanRequest scan_request = {};
1372
1373 scan_request.type = (RIL_ScanType) request.type;
1374 scan_request.interval = request.interval;
1375 scan_request.specifiers_length = request.specifiers.size();
1376 for (size_t i = 0; i < request.specifiers.size(); ++i) {
1377 if (request.specifiers[i].geranBands.size() > MAX_BANDS ||
1378 request.specifiers[i].utranBands.size() > MAX_BANDS ||
1379 request.specifiers[i].eutranBands.size() > MAX_BANDS ||
1380 request.specifiers[i].channels.size() > MAX_CHANNELS) {
1381 sendErrorResponse(pRI, RIL_E_INVALID_ARGUMENTS);
1382 return Void();
1383 }
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07001384 const V1_1::RadioAccessSpecifier& ras_from =
yinxu8688abd2017-05-22 11:26:45 -07001385 request.specifiers[i];
1386 RIL_RadioAccessSpecifier& ras_to = scan_request.specifiers[i];
1387
1388 ras_to.radio_access_network = (RIL_RadioAccessNetworks) ras_from.radioAccessNetwork;
1389 ras_to.channels_length = ras_from.channels.size();
1390
1391 std::copy(ras_from.channels.begin(), ras_from.channels.end(), ras_to.channels);
1392 const std::vector<uint32_t> * bands = nullptr;
1393 switch (request.specifiers[i].radioAccessNetwork) {
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07001394 case V1_1::RadioAccessNetworks::GERAN:
yinxu8688abd2017-05-22 11:26:45 -07001395 ras_to.bands_length = ras_from.geranBands.size();
1396 bands = (std::vector<uint32_t> *) &ras_from.geranBands;
1397 break;
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07001398 case V1_1::RadioAccessNetworks::UTRAN:
yinxu8688abd2017-05-22 11:26:45 -07001399 ras_to.bands_length = ras_from.utranBands.size();
1400 bands = (std::vector<uint32_t> *) &ras_from.utranBands;
1401 break;
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07001402 case V1_1::RadioAccessNetworks::EUTRAN:
yinxu8688abd2017-05-22 11:26:45 -07001403 ras_to.bands_length = ras_from.eutranBands.size();
1404 bands = (std::vector<uint32_t> *) &ras_from.eutranBands;
1405 break;
1406 default:
1407 sendErrorResponse(pRI, RIL_E_INVALID_ARGUMENTS);
1408 return Void();
1409 }
1410 // safe to copy to geran_bands because it's a union member
yinxu9c7ad932017-06-22 17:10:59 -07001411 for (size_t idx = 0; idx < ras_to.bands_length; ++idx) {
1412 ras_to.bands.geran_bands[idx] = (RIL_GeranBands) (*bands)[idx];
1413 }
yinxu8688abd2017-05-22 11:26:45 -07001414 }
1415
Mathieu Chartierf65b2c92017-06-05 13:59:25 -07001416 CALL_ONREQUEST(RIL_REQUEST_START_NETWORK_SCAN, &scan_request, sizeof(scan_request), pRI,
1417 mSlotId);
yinxu8688abd2017-05-22 11:26:45 -07001418
yinxu3abe7c72017-05-03 15:15:19 -07001419 return Void();
1420}
1421
1422Return<void> RadioImpl::stopNetworkScan(int32_t serial) {
1423#if VDBG
1424 RLOGD("stopNetworkScan: serial %d", serial);
1425#endif
yinxu3abe7c72017-05-03 15:15:19 -07001426 dispatchVoid(serial, mSlotId, RIL_REQUEST_STOP_NETWORK_SCAN);
1427 return Void();
1428}
1429
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001430Return<void> RadioImpl::startDtmf(int32_t serial, const hidl_string& s) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001431#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001432 RLOGD("startDtmf: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001433#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001434 dispatchString(serial, mSlotId, RIL_REQUEST_DTMF_START,
Scott Randolphc7213312017-04-03 14:06:40 -07001435 s.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001436 return Void();
1437}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001438
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001439Return<void> RadioImpl::stopDtmf(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001440#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001441 RLOGD("stopDtmf: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001442#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001443 dispatchVoid(serial, mSlotId, RIL_REQUEST_DTMF_STOP);
1444 return Void();
1445}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001446
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001447Return<void> RadioImpl::getBasebandVersion(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001448#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001449 RLOGD("getBasebandVersion: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001450#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001451 dispatchVoid(serial, mSlotId, RIL_REQUEST_BASEBAND_VERSION);
1452 return Void();
1453}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001454
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001455Return<void> RadioImpl::separateConnection(int32_t serial, int32_t gsmIndex) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001456#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001457 RLOGD("separateConnection: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001458#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001459 dispatchInts(serial, mSlotId, RIL_REQUEST_SEPARATE_CONNECTION, 1, gsmIndex);
1460 return Void();
1461}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001462
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001463Return<void> RadioImpl::setMute(int32_t serial, bool enable) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001464#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001465 RLOGD("setMute: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001466#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001467 dispatchInts(serial, mSlotId, RIL_REQUEST_SET_MUTE, 1, BOOL_TO_INT(enable));
1468 return Void();
1469}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001470
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001471Return<void> RadioImpl::getMute(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001472#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001473 RLOGD("getMute: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001474#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001475 dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_MUTE);
1476 return Void();
1477}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001478
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001479Return<void> RadioImpl::getClip(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001480#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001481 RLOGD("getClip: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001482#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001483 dispatchVoid(serial, mSlotId, RIL_REQUEST_QUERY_CLIP);
1484 return Void();
1485}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001486
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001487Return<void> RadioImpl::getDataCallList(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001488#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001489 RLOGD("getDataCallList: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001490#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001491 dispatchVoid(serial, mSlotId, RIL_REQUEST_DATA_CALL_LIST);
1492 return Void();
1493}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001494
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001495Return<void> RadioImpl::setSuppServiceNotifications(int32_t serial, bool enable) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001496#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001497 RLOGD("setSuppServiceNotifications: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001498#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001499 dispatchInts(serial, mSlotId, RIL_REQUEST_SET_SUPP_SVC_NOTIFICATION, 1,
1500 BOOL_TO_INT(enable));
1501 return Void();
1502}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001503
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001504Return<void> RadioImpl::writeSmsToSim(int32_t serial, const SmsWriteArgs& smsWriteArgs) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001505#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001506 RLOGD("writeSmsToSim: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001507#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001508 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_WRITE_SMS_TO_SIM);
1509 if (pRI == NULL) {
1510 return Void();
1511 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001512
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001513 RIL_SMS_WriteArgs args;
1514 args.status = (int) smsWriteArgs.status;
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001515
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001516 if (!copyHidlStringToRil(&args.pdu, smsWriteArgs.pdu, pRI)) {
1517 return Void();
1518 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001519
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001520 if (!copyHidlStringToRil(&args.smsc, smsWriteArgs.smsc, pRI)) {
1521 memsetAndFreeStrings(1, args.pdu);
1522 return Void();
1523 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001524
Amit Mahajanb3a11bb2017-05-15 16:41:44 -07001525 CALL_ONREQUEST(RIL_REQUEST_WRITE_SMS_TO_SIM, &args, sizeof(args), pRI, mSlotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001526
1527 memsetAndFreeStrings(2, args.smsc, args.pdu);
1528
1529 return Void();
1530}
1531
1532Return<void> RadioImpl::deleteSmsOnSim(int32_t serial, int32_t index) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001533#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001534 RLOGD("deleteSmsOnSim: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001535#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001536 dispatchInts(serial, mSlotId, RIL_REQUEST_DELETE_SMS_ON_SIM, 1, index);
1537 return Void();
1538}
1539
1540Return<void> RadioImpl::setBandMode(int32_t serial, RadioBandMode mode) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001541#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001542 RLOGD("setBandMode: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001543#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001544 dispatchInts(serial, mSlotId, RIL_REQUEST_SET_BAND_MODE, 1, mode);
1545 return Void();
1546}
1547
1548Return<void> RadioImpl::getAvailableBandModes(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001549#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001550 RLOGD("getAvailableBandModes: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001551#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001552 dispatchVoid(serial, mSlotId, RIL_REQUEST_QUERY_AVAILABLE_BAND_MODE);
1553 return Void();
1554}
1555
1556Return<void> RadioImpl::sendEnvelope(int32_t serial, const hidl_string& command) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001557#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001558 RLOGD("sendEnvelope: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001559#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001560 dispatchString(serial, mSlotId, RIL_REQUEST_STK_SEND_ENVELOPE_COMMAND,
Scott Randolphc7213312017-04-03 14:06:40 -07001561 command.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001562 return Void();
1563}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001564
1565Return<void> RadioImpl::sendTerminalResponseToSim(int32_t serial,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001566 const hidl_string& commandResponse) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001567#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001568 RLOGD("sendTerminalResponseToSim: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001569#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001570 dispatchString(serial, mSlotId, RIL_REQUEST_STK_SEND_TERMINAL_RESPONSE,
Scott Randolphc7213312017-04-03 14:06:40 -07001571 commandResponse.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001572 return Void();
1573}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001574
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001575Return<void> RadioImpl::handleStkCallSetupRequestFromSim(int32_t serial, bool accept) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001576#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001577 RLOGD("handleStkCallSetupRequestFromSim: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001578#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001579 dispatchInts(serial, mSlotId, RIL_REQUEST_STK_HANDLE_CALL_SETUP_REQUESTED_FROM_SIM,
1580 1, BOOL_TO_INT(accept));
1581 return Void();
1582}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001583
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001584Return<void> RadioImpl::explicitCallTransfer(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001585#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001586 RLOGD("explicitCallTransfer: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001587#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001588 dispatchVoid(serial, mSlotId, RIL_REQUEST_EXPLICIT_CALL_TRANSFER);
1589 return Void();
1590}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001591
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001592Return<void> RadioImpl::setPreferredNetworkType(int32_t serial, PreferredNetworkType nwType) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001593#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001594 RLOGD("setPreferredNetworkType: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001595#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001596 dispatchInts(serial, mSlotId, RIL_REQUEST_SET_PREFERRED_NETWORK_TYPE, 1, nwType);
1597 return Void();
1598}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001599
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001600Return<void> RadioImpl::getPreferredNetworkType(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001601#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001602 RLOGD("getPreferredNetworkType: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001603#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001604 dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_PREFERRED_NETWORK_TYPE);
1605 return Void();
1606}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001607
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001608Return<void> RadioImpl::getNeighboringCids(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001609#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001610 RLOGD("getNeighboringCids: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001611#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001612 dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_NEIGHBORING_CELL_IDS);
1613 return Void();
1614}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001615
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001616Return<void> RadioImpl::setLocationUpdates(int32_t serial, bool enable) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001617#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001618 RLOGD("setLocationUpdates: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001619#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001620 dispatchInts(serial, mSlotId, RIL_REQUEST_SET_LOCATION_UPDATES, 1, BOOL_TO_INT(enable));
1621 return Void();
1622}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001623
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001624Return<void> RadioImpl::setCdmaSubscriptionSource(int32_t serial, CdmaSubscriptionSource cdmaSub) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001625#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001626 RLOGD("setCdmaSubscriptionSource: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001627#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001628 dispatchInts(serial, mSlotId, RIL_REQUEST_CDMA_SET_SUBSCRIPTION_SOURCE, 1, cdmaSub);
1629 return Void();
1630}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001631
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001632Return<void> RadioImpl::setCdmaRoamingPreference(int32_t serial, CdmaRoamingType type) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001633#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001634 RLOGD("setCdmaRoamingPreference: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001635#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001636 dispatchInts(serial, mSlotId, RIL_REQUEST_CDMA_SET_ROAMING_PREFERENCE, 1, type);
1637 return Void();
1638}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001639
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001640Return<void> RadioImpl::getCdmaRoamingPreference(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001641#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001642 RLOGD("getCdmaRoamingPreference: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001643#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001644 dispatchVoid(serial, mSlotId, RIL_REQUEST_CDMA_QUERY_ROAMING_PREFERENCE);
1645 return Void();
1646}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001647
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001648Return<void> RadioImpl::setTTYMode(int32_t serial, TtyMode mode) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001649#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001650 RLOGD("setTTYMode: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001651#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001652 dispatchInts(serial, mSlotId, RIL_REQUEST_SET_TTY_MODE, 1, mode);
1653 return Void();
1654}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001655
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001656Return<void> RadioImpl::getTTYMode(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001657#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001658 RLOGD("getTTYMode: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001659#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001660 dispatchVoid(serial, mSlotId, RIL_REQUEST_QUERY_TTY_MODE);
1661 return Void();
1662}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001663
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001664Return<void> RadioImpl::setPreferredVoicePrivacy(int32_t serial, bool enable) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001665#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001666 RLOGD("setPreferredVoicePrivacy: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001667#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001668 dispatchInts(serial, mSlotId, RIL_REQUEST_CDMA_SET_PREFERRED_VOICE_PRIVACY_MODE,
1669 1, BOOL_TO_INT(enable));
1670 return Void();
1671}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001672
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001673Return<void> RadioImpl::getPreferredVoicePrivacy(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001674#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001675 RLOGD("getPreferredVoicePrivacy: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001676#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001677 dispatchVoid(serial, mSlotId, RIL_REQUEST_CDMA_QUERY_PREFERRED_VOICE_PRIVACY_MODE);
1678 return Void();
1679}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001680
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001681Return<void> RadioImpl::sendCDMAFeatureCode(int32_t serial, const hidl_string& featureCode) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001682#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001683 RLOGD("sendCDMAFeatureCode: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001684#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001685 dispatchString(serial, mSlotId, RIL_REQUEST_CDMA_FLASH,
Scott Randolphc7213312017-04-03 14:06:40 -07001686 featureCode.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001687 return Void();
1688}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001689
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001690Return<void> RadioImpl::sendBurstDtmf(int32_t serial, const hidl_string& dtmf, int32_t on,
1691 int32_t off) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001692#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001693 RLOGD("sendBurstDtmf: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001694#endif
Ruthwar Kumar Ambeer7c373812017-03-23 17:38:56 +05301695 dispatchStrings(serial, mSlotId, RIL_REQUEST_CDMA_BURST_DTMF, false,
Scott Randolphc7213312017-04-03 14:06:40 -07001696 3, dtmf.c_str(), (std::to_string(on)).c_str(),
1697 (std::to_string(off)).c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001698 return Void();
1699}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001700
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001701void constructCdmaSms(RIL_CDMA_SMS_Message &rcsm, const CdmaSmsMessage& sms) {
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001702 rcsm.uTeleserviceID = sms.teleserviceId;
1703 rcsm.bIsServicePresent = BOOL_TO_INT(sms.isServicePresent);
1704 rcsm.uServicecategory = sms.serviceCategory;
1705 rcsm.sAddress.digit_mode = (RIL_CDMA_SMS_DigitMode) sms.address.digitMode;
1706 rcsm.sAddress.number_mode = (RIL_CDMA_SMS_NumberMode) sms.address.numberMode;
1707 rcsm.sAddress.number_type = (RIL_CDMA_SMS_NumberType) sms.address.numberType;
1708 rcsm.sAddress.number_plan = (RIL_CDMA_SMS_NumberPlan) sms.address.numberPlan;
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001709
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001710 rcsm.sAddress.number_of_digits = sms.address.digits.size();
1711 int digitLimit= MIN((rcsm.sAddress.number_of_digits), RIL_CDMA_SMS_ADDRESS_MAX);
1712 for (int i = 0; i < digitLimit; i++) {
1713 rcsm.sAddress.digits[i] = sms.address.digits[i];
1714 }
1715
1716 rcsm.sSubAddress.subaddressType = (RIL_CDMA_SMS_SubaddressType) sms.subAddress.subaddressType;
1717 rcsm.sSubAddress.odd = BOOL_TO_INT(sms.subAddress.odd);
1718
1719 rcsm.sSubAddress.number_of_digits = sms.subAddress.digits.size();
1720 digitLimit= MIN((rcsm.sSubAddress.number_of_digits), RIL_CDMA_SMS_SUBADDRESS_MAX);
1721 for (int i = 0; i < digitLimit; i++) {
1722 rcsm.sSubAddress.digits[i] = sms.subAddress.digits[i];
1723 }
1724
1725 rcsm.uBearerDataLen = sms.bearerData.size();
1726 digitLimit= MIN((rcsm.uBearerDataLen), RIL_CDMA_SMS_BEARER_DATA_MAX);
1727 for (int i = 0; i < digitLimit; i++) {
1728 rcsm.aBearerData[i] = sms.bearerData[i];
1729 }
1730}
1731
1732Return<void> RadioImpl::sendCdmaSms(int32_t serial, const CdmaSmsMessage& sms) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001733#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001734 RLOGD("sendCdmaSms: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001735#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001736 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_CDMA_SEND_SMS);
1737 if (pRI == NULL) {
1738 return Void();
1739 }
1740
Jack Yu8e732d42017-04-14 00:08:06 -07001741 RIL_CDMA_SMS_Message rcsm = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001742 constructCdmaSms(rcsm, sms);
1743
Amit Mahajanb3a11bb2017-05-15 16:41:44 -07001744 CALL_ONREQUEST(pRI->pCI->requestNumber, &rcsm, sizeof(rcsm), pRI, mSlotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001745 return Void();
1746}
1747
1748Return<void> RadioImpl::acknowledgeLastIncomingCdmaSms(int32_t serial, const CdmaSmsAck& smsAck) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001749#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001750 RLOGD("acknowledgeLastIncomingCdmaSms: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001751#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001752 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_CDMA_SMS_ACKNOWLEDGE);
1753 if (pRI == NULL) {
1754 return Void();
1755 }
1756
Jack Yuf68e0da2017-02-07 14:53:09 -08001757 RIL_CDMA_SMS_Ack rcsa = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001758
1759 rcsa.uErrorClass = (RIL_CDMA_SMS_ErrorClass) smsAck.errorClass;
1760 rcsa.uSMSCauseCode = smsAck.smsCauseCode;
1761
Amit Mahajanb3a11bb2017-05-15 16:41:44 -07001762 CALL_ONREQUEST(pRI->pCI->requestNumber, &rcsa, sizeof(rcsa), pRI, mSlotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001763 return Void();
1764}
1765
1766Return<void> RadioImpl::getGsmBroadcastConfig(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001767#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001768 RLOGD("getGsmBroadcastConfig: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001769#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001770 dispatchVoid(serial, mSlotId, RIL_REQUEST_GSM_GET_BROADCAST_SMS_CONFIG);
1771 return Void();
1772}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001773
1774Return<void> RadioImpl::setGsmBroadcastConfig(int32_t serial,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001775 const hidl_vec<GsmBroadcastSmsConfigInfo>&
1776 configInfo) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001777#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001778 RLOGD("setGsmBroadcastConfig: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001779#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001780 RequestInfo *pRI = android::addRequestToList(serial, mSlotId,
1781 RIL_REQUEST_GSM_SET_BROADCAST_SMS_CONFIG);
1782 if (pRI == NULL) {
1783 return Void();
1784 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001785
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001786 int num = configInfo.size();
1787 RIL_GSM_BroadcastSmsConfigInfo gsmBci[num];
1788 RIL_GSM_BroadcastSmsConfigInfo *gsmBciPtrs[num];
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001789
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001790 for (int i = 0 ; i < num ; i++ ) {
1791 gsmBciPtrs[i] = &gsmBci[i];
1792 gsmBci[i].fromServiceId = configInfo[i].fromServiceId;
1793 gsmBci[i].toServiceId = configInfo[i].toServiceId;
1794 gsmBci[i].fromCodeScheme = configInfo[i].fromCodeScheme;
1795 gsmBci[i].toCodeScheme = configInfo[i].toCodeScheme;
1796 gsmBci[i].selected = BOOL_TO_INT(configInfo[i].selected);
1797 }
1798
Amit Mahajanb3a11bb2017-05-15 16:41:44 -07001799 CALL_ONREQUEST(pRI->pCI->requestNumber, gsmBciPtrs,
1800 num * sizeof(RIL_GSM_BroadcastSmsConfigInfo *), pRI, mSlotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001801 return Void();
1802}
1803
1804Return<void> RadioImpl::setGsmBroadcastActivation(int32_t serial, bool activate) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001805#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001806 RLOGD("setGsmBroadcastActivation: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001807#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001808 dispatchInts(serial, mSlotId, RIL_REQUEST_GSM_SMS_BROADCAST_ACTIVATION,
Sanket Padawe0de29d12017-02-10 13:19:47 -08001809 1, BOOL_TO_INT(!activate));
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001810 return Void();
1811}
1812
1813Return<void> RadioImpl::getCdmaBroadcastConfig(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001814#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001815 RLOGD("getCdmaBroadcastConfig: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001816#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001817 dispatchVoid(serial, mSlotId, RIL_REQUEST_CDMA_GET_BROADCAST_SMS_CONFIG);
1818 return Void();
1819}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001820
1821Return<void> RadioImpl::setCdmaBroadcastConfig(int32_t serial,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001822 const hidl_vec<CdmaBroadcastSmsConfigInfo>&
1823 configInfo) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001824#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001825 RLOGD("setCdmaBroadcastConfig: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001826#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001827 RequestInfo *pRI = android::addRequestToList(serial, mSlotId,
1828 RIL_REQUEST_CDMA_SET_BROADCAST_SMS_CONFIG);
1829 if (pRI == NULL) {
1830 return Void();
1831 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001832
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001833 int num = configInfo.size();
1834 RIL_CDMA_BroadcastSmsConfigInfo cdmaBci[num];
1835 RIL_CDMA_BroadcastSmsConfigInfo *cdmaBciPtrs[num];
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001836
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001837 for (int i = 0 ; i < num ; i++ ) {
1838 cdmaBciPtrs[i] = &cdmaBci[i];
1839 cdmaBci[i].service_category = configInfo[i].serviceCategory;
1840 cdmaBci[i].language = configInfo[i].language;
1841 cdmaBci[i].selected = BOOL_TO_INT(configInfo[i].selected);
1842 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001843
Amit Mahajanb3a11bb2017-05-15 16:41:44 -07001844 CALL_ONREQUEST(pRI->pCI->requestNumber, cdmaBciPtrs,
1845 num * sizeof(RIL_CDMA_BroadcastSmsConfigInfo *), pRI, mSlotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001846 return Void();
1847}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001848
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001849Return<void> RadioImpl::setCdmaBroadcastActivation(int32_t serial, bool activate) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001850#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001851 RLOGD("setCdmaBroadcastActivation: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001852#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001853 dispatchInts(serial, mSlotId, RIL_REQUEST_CDMA_SMS_BROADCAST_ACTIVATION,
Sanket Padawe0de29d12017-02-10 13:19:47 -08001854 1, BOOL_TO_INT(!activate));
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001855 return Void();
1856}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001857
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001858Return<void> RadioImpl::getCDMASubscription(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001859#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001860 RLOGD("getCDMASubscription: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001861#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001862 dispatchVoid(serial, mSlotId, RIL_REQUEST_CDMA_SUBSCRIPTION);
1863 return Void();
1864}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001865
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001866Return<void> RadioImpl::writeSmsToRuim(int32_t serial, const CdmaSmsWriteArgs& cdmaSms) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001867#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001868 RLOGD("writeSmsToRuim: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001869#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001870 RequestInfo *pRI = android::addRequestToList(serial, mSlotId,
1871 RIL_REQUEST_CDMA_WRITE_SMS_TO_RUIM);
1872 if (pRI == NULL) {
1873 return Void();
1874 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001875
Jack Yuf68e0da2017-02-07 14:53:09 -08001876 RIL_CDMA_SMS_WriteArgs rcsw = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001877 rcsw.status = (int) cdmaSms.status;
1878 constructCdmaSms(rcsw.message, cdmaSms.message);
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001879
Amit Mahajanb3a11bb2017-05-15 16:41:44 -07001880 CALL_ONREQUEST(pRI->pCI->requestNumber, &rcsw, sizeof(rcsw), pRI, mSlotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001881 return Void();
1882}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001883
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001884Return<void> RadioImpl::deleteSmsOnRuim(int32_t serial, int32_t index) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001885#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001886 RLOGD("deleteSmsOnRuim: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001887#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001888 dispatchInts(serial, mSlotId, RIL_REQUEST_CDMA_DELETE_SMS_ON_RUIM, 1, index);
1889 return Void();
1890}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001891
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001892Return<void> RadioImpl::getDeviceIdentity(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001893#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001894 RLOGD("getDeviceIdentity: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001895#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001896 dispatchVoid(serial, mSlotId, RIL_REQUEST_DEVICE_IDENTITY);
1897 return Void();
1898}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001899
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001900Return<void> RadioImpl::exitEmergencyCallbackMode(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001901#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001902 RLOGD("exitEmergencyCallbackMode: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001903#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001904 dispatchVoid(serial, mSlotId, RIL_REQUEST_EXIT_EMERGENCY_CALLBACK_MODE);
1905 return Void();
1906}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001907
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001908Return<void> RadioImpl::getSmscAddress(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001909#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001910 RLOGD("getSmscAddress: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001911#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001912 dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_SMSC_ADDRESS);
1913 return Void();
1914}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001915
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001916Return<void> RadioImpl::setSmscAddress(int32_t serial, const hidl_string& smsc) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001917#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001918 RLOGD("setSmscAddress: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001919#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001920 dispatchString(serial, mSlotId, RIL_REQUEST_SET_SMSC_ADDRESS,
Scott Randolphc7213312017-04-03 14:06:40 -07001921 smsc.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001922 return Void();
1923}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001924
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001925Return<void> RadioImpl::reportSmsMemoryStatus(int32_t serial, bool available) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001926#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001927 RLOGD("reportSmsMemoryStatus: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001928#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001929 dispatchInts(serial, mSlotId, RIL_REQUEST_REPORT_SMS_MEMORY_STATUS, 1,
1930 BOOL_TO_INT(available));
1931 return Void();
1932}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001933
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001934Return<void> RadioImpl::reportStkServiceIsRunning(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001935#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001936 RLOGD("reportStkServiceIsRunning: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001937#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001938 dispatchVoid(serial, mSlotId, RIL_REQUEST_REPORT_STK_SERVICE_IS_RUNNING);
1939 return Void();
1940}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001941
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001942Return<void> RadioImpl::getCdmaSubscriptionSource(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001943#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001944 RLOGD("getCdmaSubscriptionSource: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001945#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001946 dispatchVoid(serial, mSlotId, RIL_REQUEST_CDMA_GET_SUBSCRIPTION_SOURCE);
1947 return Void();
1948}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001949
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001950Return<void> RadioImpl::requestIsimAuthentication(int32_t serial, const hidl_string& challenge) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001951#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001952 RLOGD("requestIsimAuthentication: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001953#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001954 dispatchString(serial, mSlotId, RIL_REQUEST_ISIM_AUTHENTICATION,
Scott Randolphc7213312017-04-03 14:06:40 -07001955 challenge.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001956 return Void();
1957}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001958
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001959Return<void> RadioImpl::acknowledgeIncomingGsmSmsWithPdu(int32_t serial, bool success,
1960 const hidl_string& ackPdu) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001961#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001962 RLOGD("acknowledgeIncomingGsmSmsWithPdu: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001963#endif
Ruthwar Kumar Ambeer7c373812017-03-23 17:38:56 +05301964 dispatchStrings(serial, mSlotId, RIL_REQUEST_ACKNOWLEDGE_INCOMING_GSM_SMS_WITH_PDU, false,
Scott Randolphc7213312017-04-03 14:06:40 -07001965 2, success ? "1" : "0", ackPdu.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001966 return Void();
1967}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001968
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001969Return<void> RadioImpl::sendEnvelopeWithStatus(int32_t serial, const hidl_string& contents) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001970#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001971 RLOGD("sendEnvelopeWithStatus: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001972#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001973 dispatchString(serial, mSlotId, RIL_REQUEST_STK_SEND_ENVELOPE_WITH_STATUS,
Scott Randolphc7213312017-04-03 14:06:40 -07001974 contents.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001975 return Void();
1976}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001977
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001978Return<void> RadioImpl::getVoiceRadioTechnology(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001979#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001980 RLOGD("getVoiceRadioTechnology: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001981#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001982 dispatchVoid(serial, mSlotId, RIL_REQUEST_VOICE_RADIO_TECH);
1983 return Void();
1984}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001985
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001986Return<void> RadioImpl::getCellInfoList(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001987#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001988 RLOGD("getCellInfoList: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001989#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001990 dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_CELL_INFO_LIST);
1991 return Void();
1992}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001993
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001994Return<void> RadioImpl::setCellInfoListRate(int32_t serial, int32_t rate) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001995#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001996 RLOGD("setCellInfoListRate: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001997#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001998 dispatchInts(serial, mSlotId, RIL_REQUEST_SET_UNSOL_CELL_INFO_LIST_RATE, 1, rate);
1999 return Void();
2000}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002001
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002002Return<void> RadioImpl::setInitialAttachApn(int32_t serial, const DataProfileInfo& dataProfileInfo,
Jack Yuffc06452017-02-13 11:21:00 -08002003 bool modemCognitive, bool isRoaming) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002004#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002005 RLOGD("setInitialAttachApn: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002006#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002007 RequestInfo *pRI = android::addRequestToList(serial, mSlotId,
2008 RIL_REQUEST_SET_INITIAL_ATTACH_APN);
2009 if (pRI == NULL) {
2010 return Void();
2011 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002012
Jack Yuffc06452017-02-13 11:21:00 -08002013 if (s_vendorFunctions->version <= 14) {
2014 RIL_InitialAttachApn iaa = {};
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002015
Ruthwar Kumar Ambeer7c373812017-03-23 17:38:56 +05302016 if (!copyHidlStringToRil(&iaa.apn, dataProfileInfo.apn, pRI, true)) {
2017 return Void();
Jack Yuffc06452017-02-13 11:21:00 -08002018 }
2019
2020 const hidl_string &protocol =
2021 (isRoaming ? dataProfileInfo.roamingProtocol : dataProfileInfo.protocol);
2022
2023 if (!copyHidlStringToRil(&iaa.protocol, protocol, pRI)) {
Jack Yu8e732d42017-04-14 00:08:06 -07002024 memsetAndFreeStrings(1, iaa.apn);
Jack Yuffc06452017-02-13 11:21:00 -08002025 return Void();
2026 }
2027 iaa.authtype = (int) dataProfileInfo.authType;
2028 if (!copyHidlStringToRil(&iaa.username, dataProfileInfo.user, pRI)) {
Jack Yu8e732d42017-04-14 00:08:06 -07002029 memsetAndFreeStrings(2, iaa.apn, iaa.protocol);
Jack Yuffc06452017-02-13 11:21:00 -08002030 return Void();
2031 }
2032 if (!copyHidlStringToRil(&iaa.password, dataProfileInfo.password, pRI)) {
Jack Yu8e732d42017-04-14 00:08:06 -07002033 memsetAndFreeStrings(3, iaa.apn, iaa.protocol, iaa.username);
Jack Yuffc06452017-02-13 11:21:00 -08002034 return Void();
2035 }
2036
Amit Mahajanb3a11bb2017-05-15 16:41:44 -07002037 CALL_ONREQUEST(RIL_REQUEST_SET_INITIAL_ATTACH_APN, &iaa, sizeof(iaa), pRI, mSlotId);
Jack Yuffc06452017-02-13 11:21:00 -08002038
2039 memsetAndFreeStrings(4, iaa.apn, iaa.protocol, iaa.username, iaa.password);
2040 } else {
2041 RIL_InitialAttachApn_v15 iaa = {};
2042
Ruthwar Kumar Ambeer7c373812017-03-23 17:38:56 +05302043 if (!copyHidlStringToRil(&iaa.apn, dataProfileInfo.apn, pRI, true)) {
2044 return Void();
Jack Yuffc06452017-02-13 11:21:00 -08002045 }
Sanket Padawe46e9ee32017-06-20 12:40:19 -07002046
Jack Yuffc06452017-02-13 11:21:00 -08002047 if (!copyHidlStringToRil(&iaa.protocol, dataProfileInfo.protocol, pRI)) {
Jack Yu8e732d42017-04-14 00:08:06 -07002048 memsetAndFreeStrings(1, iaa.apn);
Jack Yuffc06452017-02-13 11:21:00 -08002049 return Void();
2050 }
2051 if (!copyHidlStringToRil(&iaa.roamingProtocol, dataProfileInfo.roamingProtocol, pRI)) {
Jack Yu8e732d42017-04-14 00:08:06 -07002052 memsetAndFreeStrings(2, iaa.apn, iaa.protocol);
Jack Yuffc06452017-02-13 11:21:00 -08002053 return Void();
2054 }
2055 iaa.authtype = (int) dataProfileInfo.authType;
2056 if (!copyHidlStringToRil(&iaa.username, dataProfileInfo.user, pRI)) {
Jack Yu8e732d42017-04-14 00:08:06 -07002057 memsetAndFreeStrings(3, iaa.apn, iaa.protocol, iaa.roamingProtocol);
Jack Yuffc06452017-02-13 11:21:00 -08002058 return Void();
2059 }
2060 if (!copyHidlStringToRil(&iaa.password, dataProfileInfo.password, pRI)) {
Jack Yu8e732d42017-04-14 00:08:06 -07002061 memsetAndFreeStrings(4, iaa.apn, iaa.protocol, iaa.roamingProtocol, iaa.username);
Jack Yuffc06452017-02-13 11:21:00 -08002062 return Void();
2063 }
2064 iaa.supportedTypesBitmask = dataProfileInfo.supportedApnTypesBitmap;
2065 iaa.bearerBitmask = dataProfileInfo.bearerBitmap;
2066 iaa.modemCognitive = BOOL_TO_INT(modemCognitive);
2067 iaa.mtu = dataProfileInfo.mtu;
2068
Jack Yuc13645e2017-04-13 20:55:03 -07002069 if (!convertMvnoTypeToString(dataProfileInfo.mvnoType, iaa.mvnoType)) {
Jack Yuffc06452017-02-13 11:21:00 -08002070 sendErrorResponse(pRI, RIL_E_INVALID_ARGUMENTS);
Jack Yu8e732d42017-04-14 00:08:06 -07002071 memsetAndFreeStrings(5, iaa.apn, iaa.protocol, iaa.roamingProtocol, iaa.username,
2072 iaa.password);
Jack Yuffc06452017-02-13 11:21:00 -08002073 return Void();
2074 }
2075
2076 if (!copyHidlStringToRil(&iaa.mvnoMatchData, dataProfileInfo.mvnoMatchData, pRI)) {
Jack Yu8e732d42017-04-14 00:08:06 -07002077 memsetAndFreeStrings(5, iaa.apn, iaa.protocol, iaa.roamingProtocol, iaa.username,
2078 iaa.password);
Jack Yuffc06452017-02-13 11:21:00 -08002079 return Void();
2080 }
2081
Amit Mahajanb3a11bb2017-05-15 16:41:44 -07002082 CALL_ONREQUEST(RIL_REQUEST_SET_INITIAL_ATTACH_APN, &iaa, sizeof(iaa), pRI, mSlotId);
Jack Yuffc06452017-02-13 11:21:00 -08002083
2084 memsetAndFreeStrings(6, iaa.apn, iaa.protocol, iaa.roamingProtocol, iaa.username,
2085 iaa.password, iaa.mvnoMatchData);
2086 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002087
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002088 return Void();
2089}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002090
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002091Return<void> RadioImpl::getImsRegistrationState(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002092#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002093 RLOGD("getImsRegistrationState: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002094#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002095 dispatchVoid(serial, mSlotId, RIL_REQUEST_IMS_REGISTRATION_STATE);
2096 return Void();
2097}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002098
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002099bool dispatchImsGsmSms(const ImsSmsMessage& message, RequestInfo *pRI) {
Jack Yuf68e0da2017-02-07 14:53:09 -08002100 RIL_IMS_SMS_Message rism = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002101 char **pStrings;
2102 int countStrings = 2;
2103 int dataLen = sizeof(char *) * countStrings;
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002104
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002105 rism.tech = RADIO_TECH_3GPP;
2106 rism.retry = BOOL_TO_INT(message.retry);
2107 rism.messageRef = message.messageRef;
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002108
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002109 if (message.gsmMessage.size() != 1) {
2110 RLOGE("dispatchImsGsmSms: Invalid len %s", requestToString(pRI->pCI->requestNumber));
Jack Yuffc06452017-02-13 11:21:00 -08002111 sendErrorResponse(pRI, RIL_E_INVALID_ARGUMENTS);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002112 return false;
2113 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002114
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002115 pStrings = (char **)calloc(countStrings, sizeof(char *));
2116 if (pStrings == NULL) {
2117 RLOGE("dispatchImsGsmSms: Memory allocation failed for request %s",
2118 requestToString(pRI->pCI->requestNumber));
Jack Yuffc06452017-02-13 11:21:00 -08002119 sendErrorResponse(pRI, RIL_E_NO_MEMORY);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002120 return false;
2121 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002122
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002123 if (!copyHidlStringToRil(&pStrings[0], message.gsmMessage[0].smscPdu, pRI)) {
2124#ifdef MEMSET_FREED
Jack Yub4295a42017-04-14 12:51:49 -07002125 memset(pStrings, 0, dataLen);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002126#endif
2127 free(pStrings);
2128 return false;
2129 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002130
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002131 if (!copyHidlStringToRil(&pStrings[1], message.gsmMessage[0].pdu, pRI)) {
2132 memsetAndFreeStrings(1, pStrings[0]);
2133#ifdef MEMSET_FREED
Jack Yub4295a42017-04-14 12:51:49 -07002134 memset(pStrings, 0, dataLen);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002135#endif
2136 free(pStrings);
2137 return false;
2138 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002139
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002140 rism.message.gsmMessage = pStrings;
Amit Mahajanb3a11bb2017-05-15 16:41:44 -07002141 CALL_ONREQUEST(pRI->pCI->requestNumber, &rism, sizeof(RIL_RadioTechnologyFamily) +
2142 sizeof(uint8_t) + sizeof(int32_t) + dataLen, pRI, pRI->socket_id);
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002143
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002144 for (int i = 0 ; i < countStrings ; i++) {
2145 memsetAndFreeStrings(1, pStrings[i]);
2146 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002147
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002148#ifdef MEMSET_FREED
Jack Yub4295a42017-04-14 12:51:49 -07002149 memset(pStrings, 0, dataLen);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002150#endif
2151 free(pStrings);
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002152
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002153 return true;
2154}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002155
Sanket Padawec4195802017-06-27 14:53:22 -07002156struct ImsCdmaSms {
2157 RIL_IMS_SMS_Message imsSms;
2158 RIL_CDMA_SMS_Message cdmaSms;
2159};
2160
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002161bool dispatchImsCdmaSms(const ImsSmsMessage& message, RequestInfo *pRI) {
Sanket Padawec4195802017-06-27 14:53:22 -07002162 ImsCdmaSms temp = {};
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002163
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002164 if (message.cdmaMessage.size() != 1) {
2165 RLOGE("dispatchImsCdmaSms: Invalid len %s", requestToString(pRI->pCI->requestNumber));
Jack Yuffc06452017-02-13 11:21:00 -08002166 sendErrorResponse(pRI, RIL_E_INVALID_ARGUMENTS);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002167 return false;
2168 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002169
Sanket Padawec4195802017-06-27 14:53:22 -07002170 temp.imsSms.tech = RADIO_TECH_3GPP2;
2171 temp.imsSms.retry = BOOL_TO_INT(message.retry);
2172 temp.imsSms.messageRef = message.messageRef;
2173 temp.imsSms.message.cdmaMessage = &temp.cdmaSms;
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002174
Sanket Padawec4195802017-06-27 14:53:22 -07002175 constructCdmaSms(temp.cdmaSms, message.cdmaMessage[0]);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002176
Sanket Padawec4195802017-06-27 14:53:22 -07002177 // Vendor code expects payload length to include actual msg payload
2178 // (sizeof(RIL_CDMA_SMS_Message)) instead of (RIL_CDMA_SMS_Message *) + size of other fields in
2179 // RIL_IMS_SMS_Message
2180 int payloadLen = sizeof(RIL_RadioTechnologyFamily) + sizeof(uint8_t) + sizeof(int32_t)
2181 + sizeof(RIL_CDMA_SMS_Message);
2182
2183 CALL_ONREQUEST(pRI->pCI->requestNumber, &temp.imsSms, payloadLen, pRI, pRI->socket_id);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002184
2185 return true;
2186}
2187
2188Return<void> RadioImpl::sendImsSms(int32_t serial, const ImsSmsMessage& message) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002189#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002190 RLOGD("sendImsSms: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002191#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002192 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_IMS_SEND_SMS);
2193 if (pRI == NULL) {
2194 return Void();
2195 }
2196
2197 RIL_RadioTechnologyFamily format = (RIL_RadioTechnologyFamily) message.tech;
2198
2199 if (RADIO_TECH_3GPP == format) {
2200 dispatchImsGsmSms(message, pRI);
2201 } else if (RADIO_TECH_3GPP2 == format) {
2202 dispatchImsCdmaSms(message, pRI);
2203 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08002204 RLOGE("sendImsSms: Invalid radio tech %s",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002205 requestToString(pRI->pCI->requestNumber));
Jack Yuffc06452017-02-13 11:21:00 -08002206 sendErrorResponse(pRI, RIL_E_INVALID_ARGUMENTS);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002207 }
2208 return Void();
2209}
2210
2211Return<void> RadioImpl::iccTransmitApduBasicChannel(int32_t serial, const SimApdu& message) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002212#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002213 RLOGD("iccTransmitApduBasicChannel: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002214#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002215 dispatchIccApdu(serial, mSlotId, RIL_REQUEST_SIM_TRANSMIT_APDU_BASIC, message);
2216 return Void();
2217}
2218
Wileen Chiu410b7562015-11-23 14:25:22 -08002219Return<void> RadioImpl::iccOpenLogicalChannel(int32_t serial, const hidl_string& aid, int32_t p2) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002220#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002221 RLOGD("iccOpenLogicalChannel: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002222#endif
Wileen Chiu410b7562015-11-23 14:25:22 -08002223 if (s_vendorFunctions->version < 15) {
2224 dispatchString(serial, mSlotId, RIL_REQUEST_SIM_OPEN_CHANNEL, aid.c_str());
2225 } else {
2226 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_SIM_OPEN_CHANNEL);
2227 if (pRI == NULL) {
2228 return Void();
2229 }
2230
Jack Yu8e732d42017-04-14 00:08:06 -07002231 RIL_OpenChannelParams params = {};
Wileen Chiu410b7562015-11-23 14:25:22 -08002232
2233 params.p2 = p2;
2234
2235 if (!copyHidlStringToRil(&params.aidPtr, aid, pRI)) {
2236 return Void();
2237 }
2238
Amit Mahajanb3a11bb2017-05-15 16:41:44 -07002239 CALL_ONREQUEST(pRI->pCI->requestNumber, &params, sizeof(params), pRI, mSlotId);
Wileen Chiu410b7562015-11-23 14:25:22 -08002240
2241 memsetAndFreeStrings(1, params.aidPtr);
2242 }
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002243 return Void();
2244}
2245
2246Return<void> RadioImpl::iccCloseLogicalChannel(int32_t serial, int32_t channelId) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002247#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002248 RLOGD("iccCloseLogicalChannel: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002249#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002250 dispatchInts(serial, mSlotId, RIL_REQUEST_SIM_CLOSE_CHANNEL, 1, channelId);
2251 return Void();
2252}
2253
2254Return<void> RadioImpl::iccTransmitApduLogicalChannel(int32_t serial, const SimApdu& message) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002255#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002256 RLOGD("iccTransmitApduLogicalChannel: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002257#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002258 dispatchIccApdu(serial, mSlotId, RIL_REQUEST_SIM_TRANSMIT_APDU_CHANNEL, message);
2259 return Void();
2260}
2261
2262Return<void> RadioImpl::nvReadItem(int32_t serial, NvItem itemId) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002263#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002264 RLOGD("nvReadItem: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002265#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002266 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_NV_READ_ITEM);
2267 if (pRI == NULL) {
2268 return Void();
2269 }
2270
Jack Yu8e732d42017-04-14 00:08:06 -07002271 RIL_NV_ReadItem nvri = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002272 nvri.itemID = (RIL_NV_Item) itemId;
2273
Amit Mahajanb3a11bb2017-05-15 16:41:44 -07002274 CALL_ONREQUEST(pRI->pCI->requestNumber, &nvri, sizeof(nvri), pRI, mSlotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002275 return Void();
2276}
2277
2278Return<void> RadioImpl::nvWriteItem(int32_t serial, const NvWriteItem& item) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002279#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002280 RLOGD("nvWriteItem: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002281#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002282 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_NV_WRITE_ITEM);
2283 if (pRI == NULL) {
2284 return Void();
2285 }
2286
Jack Yu8e732d42017-04-14 00:08:06 -07002287 RIL_NV_WriteItem nvwi = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002288
2289 nvwi.itemID = (RIL_NV_Item) item.itemId;
2290
2291 if (!copyHidlStringToRil(&nvwi.value, item.value, pRI)) {
2292 return Void();
2293 }
2294
Amit Mahajanb3a11bb2017-05-15 16:41:44 -07002295 CALL_ONREQUEST(pRI->pCI->requestNumber, &nvwi, sizeof(nvwi), pRI, mSlotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002296
2297 memsetAndFreeStrings(1, nvwi.value);
2298 return Void();
2299}
2300
2301Return<void> RadioImpl::nvWriteCdmaPrl(int32_t serial, const hidl_vec<uint8_t>& prl) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002302#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002303 RLOGD("nvWriteCdmaPrl: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002304#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002305 dispatchRaw(serial, mSlotId, RIL_REQUEST_NV_WRITE_CDMA_PRL, prl);
2306 return Void();
2307}
2308
2309Return<void> RadioImpl::nvResetConfig(int32_t serial, ResetNvType resetType) {
Jayachandran C32763f02017-04-30 10:21:14 -07002310 int rilResetType = -1;
Jayachandran C572f2f42017-03-25 14:30:13 -07002311#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002312 RLOGD("nvResetConfig: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002313#endif
Jayachandran C32763f02017-04-30 10:21:14 -07002314 /* Convert ResetNvType to RIL.h values
2315 * RIL_REQUEST_NV_RESET_CONFIG
2316 * 1 - reload all NV items
2317 * 2 - erase NV reset (SCRTN)
2318 * 3 - factory reset (RTN)
2319 */
2320 switch(resetType) {
2321 case ResetNvType::RELOAD:
2322 rilResetType = 1;
2323 break;
2324 case ResetNvType::ERASE:
2325 rilResetType = 2;
2326 break;
2327 case ResetNvType::FACTORY_RESET:
2328 rilResetType = 3;
2329 break;
2330 }
2331 dispatchInts(serial, mSlotId, RIL_REQUEST_NV_RESET_CONFIG, 1, rilResetType);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002332 return Void();
2333}
2334
2335Return<void> RadioImpl::setUiccSubscription(int32_t serial, const SelectUiccSub& uiccSub) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002336#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002337 RLOGD("setUiccSubscription: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002338#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002339 RequestInfo *pRI = android::addRequestToList(serial, mSlotId,
2340 RIL_REQUEST_SET_UICC_SUBSCRIPTION);
2341 if (pRI == NULL) {
2342 return Void();
2343 }
2344
Jack Yuf68e0da2017-02-07 14:53:09 -08002345 RIL_SelectUiccSub rilUiccSub = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002346
2347 rilUiccSub.slot = uiccSub.slot;
2348 rilUiccSub.app_index = uiccSub.appIndex;
2349 rilUiccSub.sub_type = (RIL_SubscriptionType) uiccSub.subType;
2350 rilUiccSub.act_status = (RIL_UiccSubActStatus) uiccSub.actStatus;
2351
Amit Mahajanb3a11bb2017-05-15 16:41:44 -07002352 CALL_ONREQUEST(pRI->pCI->requestNumber, &rilUiccSub, sizeof(rilUiccSub), pRI, mSlotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002353 return Void();
2354}
2355
2356Return<void> RadioImpl::setDataAllowed(int32_t serial, bool allow) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002357#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002358 RLOGD("setDataAllowed: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002359#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002360 dispatchInts(serial, mSlotId, RIL_REQUEST_ALLOW_DATA, 1, BOOL_TO_INT(allow));
2361 return Void();
2362}
2363
2364Return<void> RadioImpl::getHardwareConfig(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002365#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002366 RLOGD("getHardwareConfig: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002367#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002368 dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_HARDWARE_CONFIG);
2369 return Void();
2370}
2371
2372Return<void> RadioImpl::requestIccSimAuthentication(int32_t serial, int32_t authContext,
2373 const hidl_string& authData, const hidl_string& aid) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002374#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002375 RLOGD("requestIccSimAuthentication: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002376#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002377 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_SIM_AUTHENTICATION);
2378 if (pRI == NULL) {
2379 return Void();
2380 }
2381
Jack Yu8e732d42017-04-14 00:08:06 -07002382 RIL_SimAuthentication pf = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002383
2384 pf.authContext = authContext;
2385
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002386 if (!copyHidlStringToRil(&pf.authData, authData, pRI)) {
2387 return Void();
2388 }
2389
2390 if (!copyHidlStringToRil(&pf.aid, aid, pRI)) {
2391 memsetAndFreeStrings(1, pf.authData);
2392 return Void();
2393 }
2394
Amit Mahajanb3a11bb2017-05-15 16:41:44 -07002395 CALL_ONREQUEST(pRI->pCI->requestNumber, &pf, sizeof(pf), pRI, mSlotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002396
2397 memsetAndFreeStrings(2, pf.authData, pf.aid);
2398 return Void();
2399}
2400
2401/**
Jack Yuffc06452017-02-13 11:21:00 -08002402 * @param numProfiles number of data profile
2403 * @param dataProfiles the pointer to the actual data profiles. The acceptable type is
2404 RIL_DataProfileInfo or RIL_DataProfileInfo_v15.
2405 * @param dataProfilePtrs the pointer to the pointers that point to each data profile structure
2406 * @param numfields number of string-type member in the data profile structure
2407 * @param ... the variadic parameters are pointers to each string-type member
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002408 **/
Jack Yuffc06452017-02-13 11:21:00 -08002409template <typename T>
2410void freeSetDataProfileData(int numProfiles, T *dataProfiles, T **dataProfilePtrs,
2411 int numfields, ...) {
2412 va_list args;
2413 va_start(args, numfields);
2414
2415 // Iterate through each string-type field that need to be free.
2416 for (int i = 0; i < numfields; i++) {
2417 // Iterate through each data profile and free that specific string-type field.
2418 // The type 'char *T::*' is a type of pointer to a 'char *' member inside T structure.
2419 char *T::*ptr = va_arg(args, char *T::*);
2420 for (int j = 0; j < numProfiles; j++) {
2421 memsetAndFreeStrings(1, dataProfiles[j].*ptr);
2422 }
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002423 }
2424
Jack Yuffc06452017-02-13 11:21:00 -08002425 va_end(args);
2426
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002427#ifdef MEMSET_FREED
Jack Yuffc06452017-02-13 11:21:00 -08002428 memset(dataProfiles, 0, numProfiles * sizeof(T));
2429 memset(dataProfilePtrs, 0, numProfiles * sizeof(T *));
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002430#endif
2431 free(dataProfiles);
2432 free(dataProfilePtrs);
2433}
2434
Jack Yuffc06452017-02-13 11:21:00 -08002435Return<void> RadioImpl::setDataProfile(int32_t serial, const hidl_vec<DataProfileInfo>& profiles,
2436 bool isRoaming) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002437#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002438 RLOGD("setDataProfile: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002439#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002440 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_SET_DATA_PROFILE);
2441 if (pRI == NULL) {
2442 return Void();
2443 }
2444
Jack Yuffc06452017-02-13 11:21:00 -08002445 size_t num = profiles.size();
2446 bool success = false;
2447
2448 if (s_vendorFunctions->version <= 14) {
2449
2450 RIL_DataProfileInfo *dataProfiles =
2451 (RIL_DataProfileInfo *) calloc(num, sizeof(RIL_DataProfileInfo));
2452
2453 if (dataProfiles == NULL) {
2454 RLOGE("Memory allocation failed for request %s",
2455 requestToString(pRI->pCI->requestNumber));
2456 sendErrorResponse(pRI, RIL_E_NO_MEMORY);
2457 return Void();
2458 }
2459
2460 RIL_DataProfileInfo **dataProfilePtrs =
2461 (RIL_DataProfileInfo **) calloc(num, sizeof(RIL_DataProfileInfo *));
2462 if (dataProfilePtrs == NULL) {
2463 RLOGE("Memory allocation failed for request %s",
2464 requestToString(pRI->pCI->requestNumber));
2465 free(dataProfiles);
2466 sendErrorResponse(pRI, RIL_E_NO_MEMORY);
2467 return Void();
2468 }
2469
2470 for (size_t i = 0; i < num; i++) {
2471 dataProfilePtrs[i] = &dataProfiles[i];
2472
Ruthwar Kumar Ambeer7c373812017-03-23 17:38:56 +05302473 success = copyHidlStringToRil(&dataProfiles[i].apn, profiles[i].apn, pRI, true);
Jack Yuffc06452017-02-13 11:21:00 -08002474
2475 const hidl_string &protocol =
2476 (isRoaming ? profiles[i].roamingProtocol : profiles[i].protocol);
2477
Ruthwar Kumar Ambeer7c373812017-03-23 17:38:56 +05302478 if (success && !copyHidlStringToRil(&dataProfiles[i].protocol, protocol, pRI, true)) {
Jack Yuffc06452017-02-13 11:21:00 -08002479 success = false;
2480 }
2481
Ruthwar Kumar Ambeer7c373812017-03-23 17:38:56 +05302482 if (success && !copyHidlStringToRil(&dataProfiles[i].user, profiles[i].user, pRI,
2483 true)) {
Jack Yuffc06452017-02-13 11:21:00 -08002484 success = false;
2485 }
2486 if (success && !copyHidlStringToRil(&dataProfiles[i].password, profiles[i].password,
Ruthwar Kumar Ambeer7c373812017-03-23 17:38:56 +05302487 pRI, true)) {
Jack Yuffc06452017-02-13 11:21:00 -08002488 success = false;
2489 }
2490
2491 if (!success) {
2492 freeSetDataProfileData(num, dataProfiles, dataProfilePtrs, 4,
2493 &RIL_DataProfileInfo::apn, &RIL_DataProfileInfo::protocol,
2494 &RIL_DataProfileInfo::user, &RIL_DataProfileInfo::password);
2495 return Void();
2496 }
2497
2498 dataProfiles[i].profileId = (RIL_DataProfile) profiles[i].profileId;
2499 dataProfiles[i].authType = (int) profiles[i].authType;
2500 dataProfiles[i].type = (int) profiles[i].type;
2501 dataProfiles[i].maxConnsTime = profiles[i].maxConnsTime;
2502 dataProfiles[i].maxConns = profiles[i].maxConns;
2503 dataProfiles[i].waitTime = profiles[i].waitTime;
2504 dataProfiles[i].enabled = BOOL_TO_INT(profiles[i].enabled);
2505 }
2506
Amit Mahajanb3a11bb2017-05-15 16:41:44 -07002507 CALL_ONREQUEST(RIL_REQUEST_SET_DATA_PROFILE, dataProfilePtrs,
2508 num * sizeof(RIL_DataProfileInfo *), pRI, mSlotId);
Jack Yuffc06452017-02-13 11:21:00 -08002509
2510 freeSetDataProfileData(num, dataProfiles, dataProfilePtrs, 4,
2511 &RIL_DataProfileInfo::apn, &RIL_DataProfileInfo::protocol,
2512 &RIL_DataProfileInfo::user, &RIL_DataProfileInfo::password);
2513 } else {
2514 RIL_DataProfileInfo_v15 *dataProfiles =
2515 (RIL_DataProfileInfo_v15 *) calloc(num, sizeof(RIL_DataProfileInfo_v15));
2516
2517 if (dataProfiles == NULL) {
2518 RLOGE("Memory allocation failed for request %s",
2519 requestToString(pRI->pCI->requestNumber));
2520 sendErrorResponse(pRI, RIL_E_NO_MEMORY);
2521 return Void();
2522 }
2523
2524 RIL_DataProfileInfo_v15 **dataProfilePtrs =
2525 (RIL_DataProfileInfo_v15 **) calloc(num, sizeof(RIL_DataProfileInfo_v15 *));
2526 if (dataProfilePtrs == NULL) {
2527 RLOGE("Memory allocation failed for request %s",
2528 requestToString(pRI->pCI->requestNumber));
2529 free(dataProfiles);
2530 sendErrorResponse(pRI, RIL_E_NO_MEMORY);
2531 return Void();
2532 }
2533
2534 for (size_t i = 0; i < num; i++) {
2535 dataProfilePtrs[i] = &dataProfiles[i];
2536
Ruthwar Kumar Ambeer7c373812017-03-23 17:38:56 +05302537 success = copyHidlStringToRil(&dataProfiles[i].apn, profiles[i].apn, pRI, true);
Jack Yuffc06452017-02-13 11:21:00 -08002538 if (success && !copyHidlStringToRil(&dataProfiles[i].protocol, profiles[i].protocol,
2539 pRI)) {
2540 success = false;
2541 }
2542 if (success && !copyHidlStringToRil(&dataProfiles[i].roamingProtocol,
Ruthwar Kumar Ambeer7c373812017-03-23 17:38:56 +05302543 profiles[i].roamingProtocol, pRI, true)) {
Jack Yuffc06452017-02-13 11:21:00 -08002544 success = false;
2545 }
Ruthwar Kumar Ambeer7c373812017-03-23 17:38:56 +05302546 if (success && !copyHidlStringToRil(&dataProfiles[i].user, profiles[i].user, pRI,
2547 true)) {
Jack Yuffc06452017-02-13 11:21:00 -08002548 success = false;
2549 }
2550 if (success && !copyHidlStringToRil(&dataProfiles[i].password, profiles[i].password,
Ruthwar Kumar Ambeer7c373812017-03-23 17:38:56 +05302551 pRI, true)) {
Jack Yuffc06452017-02-13 11:21:00 -08002552 success = false;
2553 }
Jack Yuffc06452017-02-13 11:21:00 -08002554 if (success && !copyHidlStringToRil(&dataProfiles[i].mvnoMatchData,
Ruthwar Kumar Ambeer7c373812017-03-23 17:38:56 +05302555 profiles[i].mvnoMatchData, pRI, true)) {
Jack Yuffc06452017-02-13 11:21:00 -08002556 success = false;
2557 }
2558
Jack Yuc13645e2017-04-13 20:55:03 -07002559 if (success && !convertMvnoTypeToString(profiles[i].mvnoType,
2560 dataProfiles[i].mvnoType)) {
2561 sendErrorResponse(pRI, RIL_E_INVALID_ARGUMENTS);
2562 success = false;
Jack Yuffc06452017-02-13 11:21:00 -08002563 }
2564
2565 if (!success) {
2566 freeSetDataProfileData(num, dataProfiles, dataProfilePtrs, 6,
2567 &RIL_DataProfileInfo_v15::apn, &RIL_DataProfileInfo_v15::protocol,
2568 &RIL_DataProfileInfo_v15::roamingProtocol, &RIL_DataProfileInfo_v15::user,
2569 &RIL_DataProfileInfo_v15::password, &RIL_DataProfileInfo_v15::mvnoMatchData);
2570 return Void();
2571 }
2572
2573 dataProfiles[i].profileId = (RIL_DataProfile) profiles[i].profileId;
2574 dataProfiles[i].authType = (int) profiles[i].authType;
2575 dataProfiles[i].type = (int) profiles[i].type;
2576 dataProfiles[i].maxConnsTime = profiles[i].maxConnsTime;
2577 dataProfiles[i].maxConns = profiles[i].maxConns;
2578 dataProfiles[i].waitTime = profiles[i].waitTime;
2579 dataProfiles[i].enabled = BOOL_TO_INT(profiles[i].enabled);
2580 dataProfiles[i].supportedTypesBitmask = profiles[i].supportedApnTypesBitmap;
2581 dataProfiles[i].bearerBitmask = profiles[i].bearerBitmap;
2582 dataProfiles[i].mtu = profiles[i].mtu;
2583 }
2584
Amit Mahajanb3a11bb2017-05-15 16:41:44 -07002585 CALL_ONREQUEST(RIL_REQUEST_SET_DATA_PROFILE, dataProfilePtrs,
2586 num * sizeof(RIL_DataProfileInfo_v15 *), pRI, mSlotId);
Jack Yuffc06452017-02-13 11:21:00 -08002587
2588 freeSetDataProfileData(num, dataProfiles, dataProfilePtrs, 6,
2589 &RIL_DataProfileInfo_v15::apn, &RIL_DataProfileInfo_v15::protocol,
2590 &RIL_DataProfileInfo_v15::roamingProtocol, &RIL_DataProfileInfo_v15::user,
2591 &RIL_DataProfileInfo_v15::password, &RIL_DataProfileInfo_v15::mvnoMatchData);
2592 }
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002593
2594 return Void();
2595}
2596
2597Return<void> RadioImpl::requestShutdown(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002598#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002599 RLOGD("requestShutdown: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002600#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002601 dispatchVoid(serial, mSlotId, RIL_REQUEST_SHUTDOWN);
2602 return Void();
2603}
2604
2605Return<void> RadioImpl::getRadioCapability(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002606#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002607 RLOGD("getRadioCapability: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002608#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002609 dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_RADIO_CAPABILITY);
2610 return Void();
2611}
2612
2613Return<void> RadioImpl::setRadioCapability(int32_t serial, const RadioCapability& rc) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002614#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002615 RLOGD("setRadioCapability: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002616#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002617 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_SET_RADIO_CAPABILITY);
2618 if (pRI == NULL) {
2619 return Void();
2620 }
2621
Jack Yu8e732d42017-04-14 00:08:06 -07002622 RIL_RadioCapability rilRc = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002623
2624 // TODO : set rilRc.version using HIDL version ?
2625 rilRc.session = rc.session;
2626 rilRc.phase = (int) rc.phase;
2627 rilRc.rat = (int) rc.raf;
2628 rilRc.status = (int) rc.status;
Scott Randolphc7213312017-04-03 14:06:40 -07002629 strncpy(rilRc.logicalModemUuid, rc.logicalModemUuid.c_str(), MAX_UUID_LENGTH);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002630
Amit Mahajanb3a11bb2017-05-15 16:41:44 -07002631 CALL_ONREQUEST(pRI->pCI->requestNumber, &rilRc, sizeof(rilRc), pRI, mSlotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002632
2633 return Void();
2634}
2635
2636Return<void> RadioImpl::startLceService(int32_t serial, int32_t reportInterval, bool pullMode) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002637#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002638 RLOGD("startLceService: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002639#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002640 dispatchInts(serial, mSlotId, RIL_REQUEST_START_LCE, 2, reportInterval,
2641 BOOL_TO_INT(pullMode));
2642 return Void();
2643}
2644
2645Return<void> RadioImpl::stopLceService(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002646#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002647 RLOGD("stopLceService: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002648#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002649 dispatchVoid(serial, mSlotId, RIL_REQUEST_STOP_LCE);
2650 return Void();
2651}
2652
2653Return<void> RadioImpl::pullLceData(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002654#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002655 RLOGD("pullLceData: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002656#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002657 dispatchVoid(serial, mSlotId, RIL_REQUEST_PULL_LCEDATA);
2658 return Void();
2659}
2660
2661Return<void> RadioImpl::getModemActivityInfo(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002662#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002663 RLOGD("getModemActivityInfo: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002664#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002665 dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_ACTIVITY_INFO);
2666 return Void();
2667}
2668
2669Return<void> RadioImpl::setAllowedCarriers(int32_t serial, bool allAllowed,
2670 const CarrierRestrictions& carriers) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002671#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002672 RLOGD("setAllowedCarriers: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002673#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002674 RequestInfo *pRI = android::addRequestToList(serial, mSlotId,
2675 RIL_REQUEST_SET_CARRIER_RESTRICTIONS);
2676 if (pRI == NULL) {
2677 return Void();
2678 }
2679
Jack Yuf68e0da2017-02-07 14:53:09 -08002680 RIL_CarrierRestrictions cr = {};
Jack Yu11ab4042017-02-21 17:08:01 -08002681 RIL_Carrier *allowedCarriers = NULL;
2682 RIL_Carrier *excludedCarriers = NULL;
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002683
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002684 cr.len_allowed_carriers = carriers.allowedCarriers.size();
2685 allowedCarriers = (RIL_Carrier *)calloc(cr.len_allowed_carriers, sizeof(RIL_Carrier));
2686 if (allowedCarriers == NULL) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08002687 RLOGE("setAllowedCarriers: Memory allocation failed for request %s",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002688 requestToString(pRI->pCI->requestNumber));
Jack Yuffc06452017-02-13 11:21:00 -08002689 sendErrorResponse(pRI, RIL_E_NO_MEMORY);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002690 return Void();
2691 }
2692 cr.allowed_carriers = allowedCarriers;
2693
2694 cr.len_excluded_carriers = carriers.excludedCarriers.size();
2695 excludedCarriers = (RIL_Carrier *)calloc(cr.len_excluded_carriers, sizeof(RIL_Carrier));
2696 if (excludedCarriers == NULL) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08002697 RLOGE("setAllowedCarriers: Memory allocation failed for request %s",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002698 requestToString(pRI->pCI->requestNumber));
Jack Yuffc06452017-02-13 11:21:00 -08002699 sendErrorResponse(pRI, RIL_E_NO_MEMORY);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002700#ifdef MEMSET_FREED
2701 memset(allowedCarriers, 0, cr.len_allowed_carriers * sizeof(RIL_Carrier));
2702#endif
2703 free(allowedCarriers);
2704 return Void();
2705 }
2706 cr.excluded_carriers = excludedCarriers;
2707
2708 for (int i = 0; i < cr.len_allowed_carriers; i++) {
Scott Randolphc7213312017-04-03 14:06:40 -07002709 allowedCarriers[i].mcc = carriers.allowedCarriers[i].mcc.c_str();
2710 allowedCarriers[i].mnc = carriers.allowedCarriers[i].mnc.c_str();
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002711 allowedCarriers[i].match_type = (RIL_CarrierMatchType) carriers.allowedCarriers[i].matchType;
Scott Randolphc7213312017-04-03 14:06:40 -07002712 allowedCarriers[i].match_data = carriers.allowedCarriers[i].matchData.c_str();
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002713 }
2714
Amit Mahajan3f510f62017-03-01 10:26:58 -08002715 for (int i = 0; i < cr.len_excluded_carriers; i++) {
Scott Randolphc7213312017-04-03 14:06:40 -07002716 excludedCarriers[i].mcc = carriers.excludedCarriers[i].mcc.c_str();
2717 excludedCarriers[i].mnc = carriers.excludedCarriers[i].mnc.c_str();
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002718 excludedCarriers[i].match_type =
2719 (RIL_CarrierMatchType) carriers.excludedCarriers[i].matchType;
Scott Randolphc7213312017-04-03 14:06:40 -07002720 excludedCarriers[i].match_data = carriers.excludedCarriers[i].matchData.c_str();
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002721 }
2722
Amit Mahajanb3a11bb2017-05-15 16:41:44 -07002723 CALL_ONREQUEST(pRI->pCI->requestNumber, &cr, sizeof(RIL_CarrierRestrictions), pRI, mSlotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002724
2725#ifdef MEMSET_FREED
2726 memset(allowedCarriers, 0, cr.len_allowed_carriers * sizeof(RIL_Carrier));
2727 memset(excludedCarriers, 0, cr.len_excluded_carriers * sizeof(RIL_Carrier));
2728#endif
2729 free(allowedCarriers);
2730 free(excludedCarriers);
2731 return Void();
2732}
2733
2734Return<void> RadioImpl::getAllowedCarriers(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002735#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002736 RLOGD("getAllowedCarriers: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002737#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002738 dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_CARRIER_RESTRICTIONS);
2739 return Void();
2740}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002741
Jack Yu11ab4042017-02-21 17:08:01 -08002742Return<void> RadioImpl::sendDeviceState(int32_t serial, DeviceStateType deviceStateType,
2743 bool state) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002744#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002745 RLOGD("sendDeviceState: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002746#endif
Jack Yu11ab4042017-02-21 17:08:01 -08002747 if (s_vendorFunctions->version < 15) {
2748 if (deviceStateType == DeviceStateType::LOW_DATA_EXPECTED) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08002749 RLOGD("sendDeviceState: calling screen state %d", BOOL_TO_INT(!state));
Jack Yu11ab4042017-02-21 17:08:01 -08002750 dispatchInts(serial, mSlotId, RIL_REQUEST_SCREEN_STATE, 1, BOOL_TO_INT(!state));
2751 } else {
2752 RequestInfo *pRI = android::addRequestToList(serial, mSlotId,
2753 RIL_REQUEST_SEND_DEVICE_STATE);
2754 sendErrorResponse(pRI, RIL_E_REQUEST_NOT_SUPPORTED);
2755 }
2756 return Void();
2757 }
2758 dispatchInts(serial, mSlotId, RIL_REQUEST_SEND_DEVICE_STATE, 2, (int) deviceStateType,
2759 BOOL_TO_INT(state));
2760 return Void();
2761}
2762
2763Return<void> RadioImpl::setIndicationFilter(int32_t serial, int32_t indicationFilter) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002764#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002765 RLOGD("setIndicationFilter: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002766#endif
Jack Yu11ab4042017-02-21 17:08:01 -08002767 if (s_vendorFunctions->version < 15) {
2768 RequestInfo *pRI = android::addRequestToList(serial, mSlotId,
2769 RIL_REQUEST_SET_UNSOLICITED_RESPONSE_FILTER);
2770 sendErrorResponse(pRI, RIL_E_REQUEST_NOT_SUPPORTED);
2771 return Void();
2772 }
2773 dispatchInts(serial, mSlotId, RIL_REQUEST_SET_UNSOLICITED_RESPONSE_FILTER, 1, indicationFilter);
2774 return Void();
2775}
2776
Wileen Chiu718c0bf2017-01-04 11:37:19 -08002777Return<void> RadioImpl::setSimCardPower(int32_t serial, bool powerUp) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002778#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002779 RLOGD("setSimCardPower: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002780#endif
Wileen Chiu718c0bf2017-01-04 11:37:19 -08002781 dispatchInts(serial, mSlotId, RIL_REQUEST_SET_SIM_CARD_POWER, 1, BOOL_TO_INT(powerUp));
2782 return Void();
2783}
2784
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07002785Return<void> RadioImpl::setSimCardPower_1_1(int32_t serial, const V1_1::CardPowerState state) {
Grace Chen08eb6542017-03-23 18:39:48 -07002786#if VDBG
2787 RLOGD("setSimCardPower_1_1: serial %d state %d", serial, state);
2788#endif
2789 dispatchInts(serial, mSlotId, RIL_REQUEST_SET_SIM_CARD_POWER, 1, state);
2790 return Void();
2791}
2792
Nathan Harold6a8809d2017-07-07 19:28:58 -07002793Return<void> RadioImpl::setCarrierInfoForImsiEncryption(int32_t serial,
2794 const V1_1::ImsiEncryptionInfo& data) {
2795#if VDBG
2796 RLOGD("setCarrierInfoForImsiEncryption: serial %d", serial);
2797#endif
2798 RequestInfo *pRI = android::addRequestToList(
2799 serial, mSlotId, RIL_REQUEST_SET_CARRIER_INFO_IMSI_ENCRYPTION);
2800 if (pRI == NULL) {
2801 return Void();
2802 }
2803
2804 RIL_CarrierInfoForImsiEncryption imsiEncryption = {};
2805
2806 if (!copyHidlStringToRil(&imsiEncryption.mnc, data.mnc, pRI)) {
2807 return Void();
2808 }
2809 if (!copyHidlStringToRil(&imsiEncryption.mcc, data.mcc, pRI)) {
2810 memsetAndFreeStrings(1, imsiEncryption.mnc);
2811 return Void();
2812 }
2813 if (!copyHidlStringToRil(&imsiEncryption.keyIdentifier, data.keyIdentifier, pRI)) {
2814 memsetAndFreeStrings(2, imsiEncryption.mnc, imsiEncryption.mcc);
2815 return Void();
2816 }
Youngrak Leee6f16f22017-12-03 10:50:37 -08002817 imsiEncryption.carrierKeyLength = data.carrierKey.size();
2818 imsiEncryption.carrierKey = new uint8_t[imsiEncryption.carrierKeyLength];
2819 memcpy(imsiEncryption.carrierKey, data.carrierKey.data(), imsiEncryption.carrierKeyLength);
Nathan Harold6a8809d2017-07-07 19:28:58 -07002820 imsiEncryption.expirationTime = data.expirationTime;
2821 CALL_ONREQUEST(pRI->pCI->requestNumber, &imsiEncryption,
2822 sizeof(RIL_CarrierInfoForImsiEncryption), pRI, mSlotId);
2823 delete(imsiEncryption.carrierKey);
2824 return Void();
2825}
2826
2827Return<void> RadioImpl::startKeepalive(int32_t serial, const V1_1::KeepaliveRequest& keepalive) {
2828#if VDBG
2829 RLOGD("%s(): %d", __FUNCTION__, serial);
2830#endif
2831 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_START_KEEPALIVE);
2832 if (pRI == NULL) {
2833 return Void();
2834 }
2835
2836 RIL_KeepaliveRequest kaReq = {};
2837
2838 kaReq.type = static_cast<RIL_KeepaliveType>(keepalive.type);
2839 switch(kaReq.type) {
2840 case NATT_IPV4:
2841 if (keepalive.sourceAddress.size() != 4 ||
2842 keepalive.destinationAddress.size() != 4) {
2843 RLOGE("Invalid address for keepalive!");
2844 sendErrorResponse(pRI, RIL_E_INVALID_ARGUMENTS);
2845 return Void();
2846 }
2847 break;
2848 case NATT_IPV6:
2849 if (keepalive.sourceAddress.size() != 16 ||
2850 keepalive.destinationAddress.size() != 16) {
2851 RLOGE("Invalid address for keepalive!");
2852 sendErrorResponse(pRI, RIL_E_INVALID_ARGUMENTS);
2853 return Void();
2854 }
2855 break;
2856 default:
2857 RLOGE("Unknown packet keepalive type!");
2858 sendErrorResponse(pRI, RIL_E_INVALID_ARGUMENTS);
2859 return Void();
2860 }
2861
2862 ::memcpy(kaReq.sourceAddress, keepalive.sourceAddress.data(), keepalive.sourceAddress.size());
2863 kaReq.sourcePort = keepalive.sourcePort;
2864
2865 ::memcpy(kaReq.destinationAddress,
2866 keepalive.destinationAddress.data(), keepalive.destinationAddress.size());
2867 kaReq.destinationPort = keepalive.destinationPort;
2868
2869 kaReq.maxKeepaliveIntervalMillis = keepalive.maxKeepaliveIntervalMillis;
2870 kaReq.cid = keepalive.cid; // This is the context ID of the data call
2871
2872 CALL_ONREQUEST(pRI->pCI->requestNumber, &kaReq, sizeof(RIL_KeepaliveRequest), pRI, mSlotId);
2873 return Void();
2874}
2875
2876Return<void> RadioImpl::stopKeepalive(int32_t serial, int32_t sessionHandle) {
2877#if VDBG
2878 RLOGD("%s(): %d", __FUNCTION__, serial);
2879#endif
2880 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_STOP_KEEPALIVE);
2881 if (pRI == NULL) {
2882 return Void();
2883 }
2884
2885 CALL_ONREQUEST(pRI->pCI->requestNumber, &sessionHandle, sizeof(uint32_t), pRI, mSlotId);
2886 return Void();
2887}
2888
Sanket Padawef220dc52017-01-02 23:46:00 -08002889Return<void> RadioImpl::responseAcknowledgement() {
2890 android::releaseWakeLock();
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002891 return Void();
Sanket Padawef220dc52017-01-02 23:46:00 -08002892}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002893
Amit Mahajan439da362017-02-13 17:43:04 -08002894Return<void> OemHookImpl::setResponseFunctions(
2895 const ::android::sp<IOemHookResponse>& oemHookResponseParam,
2896 const ::android::sp<IOemHookIndication>& oemHookIndicationParam) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002897#if VDBG
Amit Mahajan439da362017-02-13 17:43:04 -08002898 RLOGD("OemHookImpl::setResponseFunctions");
Jayachandran C572f2f42017-03-25 14:30:13 -07002899#endif
Amit Mahajan439da362017-02-13 17:43:04 -08002900
2901 pthread_rwlock_t *radioServiceRwlockPtr = radio::getRadioServiceRwlock(mSlotId);
2902 int ret = pthread_rwlock_wrlock(radioServiceRwlockPtr);
2903 assert(ret == 0);
2904
2905 mOemHookResponse = oemHookResponseParam;
2906 mOemHookIndication = oemHookIndicationParam;
Amit Mahajand423d192017-03-16 17:04:01 -07002907 mCounterOemHook[mSlotId]++;
Amit Mahajan439da362017-02-13 17:43:04 -08002908
2909 ret = pthread_rwlock_unlock(radioServiceRwlockPtr);
2910 assert(ret == 0);
2911
2912 return Void();
2913}
2914
2915Return<void> OemHookImpl::sendRequestRaw(int32_t serial, const hidl_vec<uint8_t>& data) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002916#if VDBG
Amit Mahajan439da362017-02-13 17:43:04 -08002917 RLOGD("OemHookImpl::sendRequestRaw: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002918#endif
Amit Mahajan439da362017-02-13 17:43:04 -08002919 dispatchRaw(serial, mSlotId, RIL_REQUEST_OEM_HOOK_RAW, data);
2920 return Void();
2921}
2922
2923Return<void> OemHookImpl::sendRequestStrings(int32_t serial,
2924 const hidl_vec<hidl_string>& data) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002925#if VDBG
Amit Mahajan439da362017-02-13 17:43:04 -08002926 RLOGD("OemHookImpl::sendRequestStrings: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002927#endif
Amit Mahajan439da362017-02-13 17:43:04 -08002928 dispatchStrings(serial, mSlotId, RIL_REQUEST_OEM_HOOK_STRINGS, data);
2929 return Void();
2930}
2931
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002932/***************************************************************************************************
2933 * RESPONSE FUNCTIONS
2934 * Functions above are used for requests going from framework to vendor code. The ones below are
2935 * responses for those requests coming back from the vendor code.
2936 **************************************************************************************************/
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002937
Sanket Padawef220dc52017-01-02 23:46:00 -08002938void radio::acknowledgeRequest(int slotId, int serial) {
2939 if (radioService[slotId]->mRadioResponse != NULL) {
Amit Mahajan17249842017-01-19 15:05:45 -08002940 Return<void> retStatus = radioService[slotId]->mRadioResponse->acknowledgeRequest(serial);
2941 radioService[slotId]->checkReturnStatus(retStatus);
Sanket Padawef220dc52017-01-02 23:46:00 -08002942 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08002943 RLOGE("acknowledgeRequest: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawef220dc52017-01-02 23:46:00 -08002944 }
2945}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002946
Sanket Padawef220dc52017-01-02 23:46:00 -08002947void populateResponseInfo(RadioResponseInfo& responseInfo, int serial, int responseType,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002948 RIL_Errno e) {
Sanket Padawef220dc52017-01-02 23:46:00 -08002949 responseInfo.serial = serial;
2950 switch (responseType) {
2951 case RESPONSE_SOLICITED:
2952 responseInfo.type = RadioResponseType::SOLICITED;
2953 break;
2954 case RESPONSE_SOLICITED_ACK_EXP:
2955 responseInfo.type = RadioResponseType::SOLICITED_ACK_EXP;
2956 break;
2957 }
2958 responseInfo.error = (RadioError) e;
2959}
2960
Naveen Kalla346bbc02017-03-16 12:55:55 -07002961int responseIntOrEmpty(RadioResponseInfo& responseInfo, int serial, int responseType, RIL_Errno e,
2962 void *response, size_t responseLen) {
2963 populateResponseInfo(responseInfo, serial, responseType, e);
2964 int ret = -1;
2965
2966 if (response == NULL && responseLen == 0) {
2967 // Earlier RILs did not send a response for some cases although the interface
2968 // expected an integer as response. Do not return error if response is empty. Instead
2969 // Return -1 in those cases to maintain backward compatibility.
2970 } else if (response == NULL || responseLen != sizeof(int)) {
2971 RLOGE("responseIntOrEmpty: Invalid response");
2972 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
2973 } else {
2974 int *p_int = (int *) response;
2975 ret = p_int[0];
2976 }
2977 return ret;
2978}
2979
Sanket Padawef220dc52017-01-02 23:46:00 -08002980int responseInt(RadioResponseInfo& responseInfo, int serial, int responseType, RIL_Errno e,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002981 void *response, size_t responseLen) {
Sanket Padawef220dc52017-01-02 23:46:00 -08002982 populateResponseInfo(responseInfo, serial, responseType, e);
2983 int ret = -1;
2984
2985 if (response == NULL || responseLen != sizeof(int)) {
2986 RLOGE("responseInt: Invalid response");
2987 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
2988 } else {
2989 int *p_int = (int *) response;
2990 ret = p_int[0];
2991 }
2992 return ret;
2993}
2994
Amit Mahajan759786a2017-03-03 17:35:47 -08002995int radio::getIccCardStatusResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002996 int responseType, int serial, RIL_Errno e,
2997 void *response, size_t responseLen) {
Sanket Padawef220dc52017-01-02 23:46:00 -08002998 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08002999 RadioResponseInfo responseInfo = {};
Sanket Padawef220dc52017-01-02 23:46:00 -08003000 populateResponseInfo(responseInfo, serial, responseType, e);
Jack Yuf68e0da2017-02-07 14:53:09 -08003001 CardStatus cardStatus = {};
Nathan Harold7da5dd62017-06-08 16:41:52 -07003002 RIL_CardStatus_v6 *p_cur = ((RIL_CardStatus_v6 *) response);
3003 if (response == NULL || responseLen != sizeof(RIL_CardStatus_v6)
3004 || p_cur->gsm_umts_subscription_app_index >= p_cur->num_applications
3005 || p_cur->cdma_subscription_app_index >= p_cur->num_applications
3006 || p_cur->ims_subscription_app_index >= p_cur->num_applications) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003007 RLOGE("getIccCardStatusResponse: Invalid response");
Sanket Padawef220dc52017-01-02 23:46:00 -08003008 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
Amit Mahajancd77a5b2016-08-25 11:19:21 -07003009 } else {
Amit Mahajancd77a5b2016-08-25 11:19:21 -07003010 cardStatus.cardState = (CardState) p_cur->card_state;
3011 cardStatus.universalPinState = (PinState) p_cur->universal_pin_state;
3012 cardStatus.gsmUmtsSubscriptionAppIndex = p_cur->gsm_umts_subscription_app_index;
3013 cardStatus.cdmaSubscriptionAppIndex = p_cur->cdma_subscription_app_index;
3014 cardStatus.imsSubscriptionAppIndex = p_cur->ims_subscription_app_index;
3015
3016 RIL_AppStatus *rilAppStatus = p_cur->applications;
3017 cardStatus.applications.resize(p_cur->num_applications);
3018 AppStatus *appStatus = cardStatus.applications.data();
Jayachandran C572f2f42017-03-25 14:30:13 -07003019#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003020 RLOGD("getIccCardStatusResponse: num_applications %d", p_cur->num_applications);
Jayachandran C572f2f42017-03-25 14:30:13 -07003021#endif
Amit Mahajancd77a5b2016-08-25 11:19:21 -07003022 for (int i = 0; i < p_cur->num_applications; i++) {
3023 appStatus[i].appType = (AppType) rilAppStatus[i].app_type;
3024 appStatus[i].appState = (AppState) rilAppStatus[i].app_state;
3025 appStatus[i].persoSubstate = (PersoSubstate) rilAppStatus[i].perso_substate;
3026 appStatus[i].aidPtr = convertCharPtrToHidlString(rilAppStatus[i].aid_ptr);
3027 appStatus[i].appLabelPtr = convertCharPtrToHidlString(
3028 rilAppStatus[i].app_label_ptr);
3029 appStatus[i].pin1Replaced = rilAppStatus[i].pin1_replaced;
3030 appStatus[i].pin1 = (PinState) rilAppStatus[i].pin1;
3031 appStatus[i].pin2 = (PinState) rilAppStatus[i].pin2;
3032 }
3033 }
3034
Amit Mahajan17249842017-01-19 15:05:45 -08003035 Return<void> retStatus = radioService[slotId]->mRadioResponse->
3036 getIccCardStatusResponse(responseInfo, cardStatus);
3037 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajancd77a5b2016-08-25 11:19:21 -07003038 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003039 RLOGE("getIccCardStatusResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawef220dc52017-01-02 23:46:00 -08003040 }
3041
3042 return 0;
3043}
3044
Amit Mahajan759786a2017-03-03 17:35:47 -08003045int radio::supplyIccPinForAppResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003046 int responseType, int serial, RIL_Errno e,
3047 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003048#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003049 RLOGD("supplyIccPinForAppResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003050#endif
Sanket Padawef220dc52017-01-02 23:46:00 -08003051
3052 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003053 RadioResponseInfo responseInfo = {};
Naveen Kalla346bbc02017-03-16 12:55:55 -07003054 int ret = responseIntOrEmpty(responseInfo, serial, responseType, e, response, responseLen);
Amit Mahajan17249842017-01-19 15:05:45 -08003055 Return<void> retStatus = radioService[slotId]->mRadioResponse->
3056 supplyIccPinForAppResponse(responseInfo, ret);
Amit Mahajanb3a11bb2017-05-15 16:41:44 -07003057 RLOGE("supplyIccPinForAppResponse: amit ret %d", ret);
Amit Mahajan17249842017-01-19 15:05:45 -08003058 radioService[slotId]->checkReturnStatus(retStatus);
Sanket Padawef220dc52017-01-02 23:46:00 -08003059 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003060 RLOGE("supplyIccPinForAppResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawef220dc52017-01-02 23:46:00 -08003061 slotId);
3062 }
3063
3064 return 0;
3065}
3066
Amit Mahajan759786a2017-03-03 17:35:47 -08003067int radio::supplyIccPukForAppResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003068 int responseType, int serial, RIL_Errno e,
3069 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003070#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003071 RLOGD("supplyIccPukForAppResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003072#endif
Sanket Padawef220dc52017-01-02 23:46:00 -08003073
3074 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003075 RadioResponseInfo responseInfo = {};
Naveen Kalla346bbc02017-03-16 12:55:55 -07003076 int ret = responseIntOrEmpty(responseInfo, serial, responseType, e, response, responseLen);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003077 Return<void> retStatus = radioService[slotId]->mRadioResponse->supplyIccPukForAppResponse(
3078 responseInfo, ret);
Amit Mahajan17249842017-01-19 15:05:45 -08003079 radioService[slotId]->checkReturnStatus(retStatus);
Sanket Padawef220dc52017-01-02 23:46:00 -08003080 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003081 RLOGE("supplyIccPukForAppResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawef220dc52017-01-02 23:46:00 -08003082 slotId);
3083 }
3084
3085 return 0;
3086}
3087
Amit Mahajan759786a2017-03-03 17:35:47 -08003088int radio::supplyIccPin2ForAppResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003089 int responseType, int serial, RIL_Errno e,
3090 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003091#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003092 RLOGD("supplyIccPin2ForAppResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003093#endif
Sanket Padawef220dc52017-01-02 23:46:00 -08003094
3095 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003096 RadioResponseInfo responseInfo = {};
Naveen Kalla346bbc02017-03-16 12:55:55 -07003097 int ret = responseIntOrEmpty(responseInfo, serial, responseType, e, response, responseLen);
Amit Mahajan17249842017-01-19 15:05:45 -08003098 Return<void> retStatus = radioService[slotId]->mRadioResponse->
3099 supplyIccPin2ForAppResponse(responseInfo, ret);
3100 radioService[slotId]->checkReturnStatus(retStatus);
Sanket Padawef220dc52017-01-02 23:46:00 -08003101 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003102 RLOGE("supplyIccPin2ForAppResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawef220dc52017-01-02 23:46:00 -08003103 slotId);
3104 }
3105
3106 return 0;
3107}
3108
Amit Mahajan759786a2017-03-03 17:35:47 -08003109int radio::supplyIccPuk2ForAppResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003110 int responseType, int serial, RIL_Errno e,
3111 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003112#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003113 RLOGD("supplyIccPuk2ForAppResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003114#endif
Sanket Padawef220dc52017-01-02 23:46:00 -08003115
3116 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003117 RadioResponseInfo responseInfo = {};
Naveen Kalla346bbc02017-03-16 12:55:55 -07003118 int ret = responseIntOrEmpty(responseInfo, serial, responseType, e, response, responseLen);
Amit Mahajan17249842017-01-19 15:05:45 -08003119 Return<void> retStatus = radioService[slotId]->mRadioResponse->
3120 supplyIccPuk2ForAppResponse(responseInfo, ret);
3121 radioService[slotId]->checkReturnStatus(retStatus);
Sanket Padawef220dc52017-01-02 23:46:00 -08003122 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003123 RLOGE("supplyIccPuk2ForAppResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawef220dc52017-01-02 23:46:00 -08003124 slotId);
3125 }
3126
3127 return 0;
3128}
3129
Amit Mahajan759786a2017-03-03 17:35:47 -08003130int radio::changeIccPinForAppResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003131 int responseType, int serial, RIL_Errno e,
3132 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003133#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003134 RLOGD("changeIccPinForAppResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003135#endif
Sanket Padawef220dc52017-01-02 23:46:00 -08003136
3137 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003138 RadioResponseInfo responseInfo = {};
Naveen Kalla346bbc02017-03-16 12:55:55 -07003139 int ret = responseIntOrEmpty(responseInfo, serial, responseType, e, response, responseLen);
Amit Mahajan17249842017-01-19 15:05:45 -08003140 Return<void> retStatus = radioService[slotId]->mRadioResponse->
3141 changeIccPinForAppResponse(responseInfo, ret);
3142 radioService[slotId]->checkReturnStatus(retStatus);
Sanket Padawef220dc52017-01-02 23:46:00 -08003143 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003144 RLOGE("changeIccPinForAppResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawef220dc52017-01-02 23:46:00 -08003145 slotId);
3146 }
3147
3148 return 0;
3149}
3150
Amit Mahajan759786a2017-03-03 17:35:47 -08003151int radio::changeIccPin2ForAppResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003152 int responseType, int serial, RIL_Errno e,
3153 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003154#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003155 RLOGD("changeIccPin2ForAppResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003156#endif
Sanket Padawef220dc52017-01-02 23:46:00 -08003157
3158 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003159 RadioResponseInfo responseInfo = {};
Naveen Kalla346bbc02017-03-16 12:55:55 -07003160 int ret = responseIntOrEmpty(responseInfo, serial, responseType, e, response, responseLen);
Amit Mahajan17249842017-01-19 15:05:45 -08003161 Return<void> retStatus = radioService[slotId]->mRadioResponse->
3162 changeIccPin2ForAppResponse(responseInfo, ret);
3163 radioService[slotId]->checkReturnStatus(retStatus);
Sanket Padawef220dc52017-01-02 23:46:00 -08003164 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003165 RLOGE("changeIccPin2ForAppResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawef220dc52017-01-02 23:46:00 -08003166 slotId);
3167 }
3168
3169 return 0;
3170}
3171
Amit Mahajan759786a2017-03-03 17:35:47 -08003172int radio::supplyNetworkDepersonalizationResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003173 int responseType, int serial, RIL_Errno e,
3174 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003175#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003176 RLOGD("supplyNetworkDepersonalizationResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003177#endif
Sanket Padawef220dc52017-01-02 23:46:00 -08003178
3179 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003180 RadioResponseInfo responseInfo = {};
Naveen Kalla346bbc02017-03-16 12:55:55 -07003181 int ret = responseIntOrEmpty(responseInfo, serial, responseType, e, response, responseLen);
Amit Mahajan17249842017-01-19 15:05:45 -08003182 Return<void> retStatus = radioService[slotId]->mRadioResponse->
3183 supplyNetworkDepersonalizationResponse(responseInfo, ret);
3184 radioService[slotId]->checkReturnStatus(retStatus);
Sanket Padawef220dc52017-01-02 23:46:00 -08003185 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003186 RLOGE("supplyNetworkDepersonalizationResponse: radioService[%d]->mRadioResponse == "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003187 "NULL", slotId);
Sanket Padawef220dc52017-01-02 23:46:00 -08003188 }
3189
3190 return 0;
3191}
3192
Amit Mahajan759786a2017-03-03 17:35:47 -08003193int radio::getCurrentCallsResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003194 int responseType, int serial, RIL_Errno e,
3195 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003196#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003197 RLOGD("getCurrentCallsResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003198#endif
Sanket Padawef220dc52017-01-02 23:46:00 -08003199
3200 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003201 RadioResponseInfo responseInfo = {};
Sanket Padawef220dc52017-01-02 23:46:00 -08003202 populateResponseInfo(responseInfo, serial, responseType, e);
3203
3204 hidl_vec<Call> calls;
Amit Mahajan13058cb2017-06-07 23:10:27 -07003205 if ((response == NULL && responseLen != 0)
3206 || (responseLen % sizeof(RIL_Call *)) != 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003207 RLOGE("getCurrentCallsResponse: Invalid response");
Amit Mahajan5829a472016-12-28 17:28:07 -08003208 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
Sanket Padawef220dc52017-01-02 23:46:00 -08003209 } else {
3210 int num = responseLen / sizeof(RIL_Call *);
3211 calls.resize(num);
3212
3213 for (int i = 0 ; i < num ; i++) {
3214 RIL_Call *p_cur = ((RIL_Call **) response)[i];
3215 /* each call info */
3216 calls[i].state = (CallState) p_cur->state;
3217 calls[i].index = p_cur->index;
3218 calls[i].toa = p_cur->toa;
3219 calls[i].isMpty = p_cur->isMpty;
3220 calls[i].isMT = p_cur->isMT;
3221 calls[i].als = p_cur->als;
3222 calls[i].isVoice = p_cur->isVoice;
3223 calls[i].isVoicePrivacy = p_cur->isVoicePrivacy;
3224 calls[i].number = convertCharPtrToHidlString(p_cur->number);
3225 calls[i].numberPresentation = (CallPresentation) p_cur->numberPresentation;
3226 calls[i].name = convertCharPtrToHidlString(p_cur->name);
3227 calls[i].namePresentation = (CallPresentation) p_cur->namePresentation;
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003228 if (p_cur->uusInfo != NULL && p_cur->uusInfo->uusData != NULL) {
Sanket Padawef220dc52017-01-02 23:46:00 -08003229 RIL_UUS_Info *uusInfo = p_cur->uusInfo;
Ajay Nambi83e7acd2017-09-05 15:06:22 +05303230 calls[i].uusInfo.resize(1);
Sanket Padawef220dc52017-01-02 23:46:00 -08003231 calls[i].uusInfo[0].uusType = (UusType) uusInfo->uusType;
3232 calls[i].uusInfo[0].uusDcs = (UusDcs) uusInfo->uusDcs;
3233 // convert uusInfo->uusData to a null-terminated string
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003234 char *nullTermStr = strndup(uusInfo->uusData, uusInfo->uusLength);
3235 calls[i].uusInfo[0].uusData = nullTermStr;
3236 free(nullTermStr);
Sanket Padawef220dc52017-01-02 23:46:00 -08003237 }
3238 }
3239 }
3240
Amit Mahajan17249842017-01-19 15:05:45 -08003241 Return<void> retStatus = radioService[slotId]->mRadioResponse->
3242 getCurrentCallsResponse(responseInfo, calls);
3243 radioService[slotId]->checkReturnStatus(retStatus);
Sanket Padawef220dc52017-01-02 23:46:00 -08003244 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003245 RLOGE("getCurrentCallsResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawef220dc52017-01-02 23:46:00 -08003246 }
3247
3248 return 0;
3249}
3250
Amit Mahajan759786a2017-03-03 17:35:47 -08003251int radio::dialResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003252 int responseType, int serial, RIL_Errno e, void *response,
3253 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003254#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003255 RLOGD("dialResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003256#endif
Sanket Padawef220dc52017-01-02 23:46:00 -08003257
3258 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003259 RadioResponseInfo responseInfo = {};
Sanket Padawef220dc52017-01-02 23:46:00 -08003260 populateResponseInfo(responseInfo, serial, responseType, e);
Amit Mahajan17249842017-01-19 15:05:45 -08003261 Return<void> retStatus = radioService[slotId]->mRadioResponse->dialResponse(responseInfo);
3262 radioService[slotId]->checkReturnStatus(retStatus);
Sanket Padawef220dc52017-01-02 23:46:00 -08003263 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003264 RLOGE("dialResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Amit Mahajancd77a5b2016-08-25 11:19:21 -07003265 }
3266
3267 return 0;
3268}
3269
Amit Mahajan759786a2017-03-03 17:35:47 -08003270int radio::getIMSIForAppResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003271 int responseType, int serial, RIL_Errno e, void *response,
3272 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003273#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003274 RLOGD("getIMSIForAppResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003275#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003276
3277 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003278 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003279 populateResponseInfo(responseInfo, serial, responseType, e);
3280 Return<void> retStatus = radioService[slotId]->mRadioResponse->getIMSIForAppResponse(
3281 responseInfo, convertCharPtrToHidlString((char *) response));
3282 radioService[slotId]->checkReturnStatus(retStatus);
3283 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003284 RLOGE("getIMSIForAppResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003285 slotId);
3286 }
3287
3288 return 0;
3289}
3290
Amit Mahajan759786a2017-03-03 17:35:47 -08003291int radio::hangupConnectionResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003292 int responseType, int serial, RIL_Errno e,
3293 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003294#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003295 RLOGD("hangupConnectionResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003296#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003297
3298 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003299 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003300 populateResponseInfo(responseInfo, serial, responseType, e);
3301 Return<void> retStatus = radioService[slotId]->mRadioResponse->hangupConnectionResponse(
3302 responseInfo);
3303 radioService[slotId]->checkReturnStatus(retStatus);
3304 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003305 RLOGE("hangupConnectionResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003306 slotId);
3307 }
3308
3309 return 0;
3310}
3311
Amit Mahajan759786a2017-03-03 17:35:47 -08003312int radio::hangupWaitingOrBackgroundResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003313 int responseType, int serial, RIL_Errno e,
3314 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003315#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003316 RLOGD("hangupWaitingOrBackgroundResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003317#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003318
3319 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003320 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003321 populateResponseInfo(responseInfo, serial, responseType, e);
3322 Return<void> retStatus =
3323 radioService[slotId]->mRadioResponse->hangupWaitingOrBackgroundResponse(
3324 responseInfo);
3325 radioService[slotId]->checkReturnStatus(retStatus);
3326 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003327 RLOGE("hangupWaitingOrBackgroundResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003328 slotId);
3329 }
3330
3331 return 0;
3332}
3333
Amit Mahajan759786a2017-03-03 17:35:47 -08003334int radio::hangupForegroundResumeBackgroundResponse(int slotId, int responseType, int serial,
3335 RIL_Errno e, void *response,
3336 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003337#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003338 RLOGD("hangupWaitingOrBackgroundResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003339#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003340
3341 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003342 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003343 populateResponseInfo(responseInfo, serial, responseType, e);
3344 Return<void> retStatus =
3345 radioService[slotId]->mRadioResponse->hangupWaitingOrBackgroundResponse(
3346 responseInfo);
3347 radioService[slotId]->checkReturnStatus(retStatus);
3348 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003349 RLOGE("hangupWaitingOrBackgroundResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003350 slotId);
3351 }
3352
3353 return 0;
3354}
3355
Amit Mahajan759786a2017-03-03 17:35:47 -08003356int radio::switchWaitingOrHoldingAndActiveResponse(int slotId, int responseType, int serial,
3357 RIL_Errno e, void *response,
3358 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003359#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003360 RLOGD("switchWaitingOrHoldingAndActiveResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003361#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003362
3363 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003364 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003365 populateResponseInfo(responseInfo, serial, responseType, e);
3366 Return<void> retStatus =
3367 radioService[slotId]->mRadioResponse->switchWaitingOrHoldingAndActiveResponse(
3368 responseInfo);
3369 radioService[slotId]->checkReturnStatus(retStatus);
3370 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003371 RLOGE("switchWaitingOrHoldingAndActiveResponse: radioService[%d]->mRadioResponse "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003372 "== NULL", slotId);
3373 }
3374
3375 return 0;
3376}
3377
Amit Mahajan759786a2017-03-03 17:35:47 -08003378int radio::conferenceResponse(int slotId, int responseType,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003379 int serial, RIL_Errno e, void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003380#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003381 RLOGD("conferenceResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003382#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003383
3384 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003385 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003386 populateResponseInfo(responseInfo, serial, responseType, e);
3387 Return<void> retStatus = radioService[slotId]->mRadioResponse->conferenceResponse(
3388 responseInfo);
3389 radioService[slotId]->checkReturnStatus(retStatus);
3390 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003391 RLOGE("conferenceResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003392 slotId);
3393 }
3394
3395 return 0;
3396}
3397
Amit Mahajan759786a2017-03-03 17:35:47 -08003398int radio::rejectCallResponse(int slotId, int responseType,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003399 int serial, RIL_Errno e, void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003400#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003401 RLOGD("rejectCallResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003402#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003403
3404 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003405 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003406 populateResponseInfo(responseInfo, serial, responseType, e);
3407 Return<void> retStatus = radioService[slotId]->mRadioResponse->rejectCallResponse(
3408 responseInfo);
3409 radioService[slotId]->checkReturnStatus(retStatus);
3410 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003411 RLOGE("rejectCallResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003412 slotId);
3413 }
3414
3415 return 0;
3416}
3417
Amit Mahajan759786a2017-03-03 17:35:47 -08003418int radio::getLastCallFailCauseResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003419 int responseType, int serial, RIL_Errno e, void *response,
3420 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003421#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003422 RLOGD("getLastCallFailCauseResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003423#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003424
3425 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003426 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003427 populateResponseInfo(responseInfo, serial, responseType, e);
Jack Yuf68e0da2017-02-07 14:53:09 -08003428
3429 LastCallFailCauseInfo info = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003430 info.vendorCause = hidl_string();
3431 if (response == NULL) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003432 RLOGE("getCurrentCallsResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003433 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
3434 } else if (responseLen == sizeof(int)) {
3435 int *pInt = (int *) response;
3436 info.causeCode = (LastCallFailCause) pInt[0];
3437 } else if (responseLen == sizeof(RIL_LastCallFailCauseInfo)) {
3438 RIL_LastCallFailCauseInfo *pFailCauseInfo = (RIL_LastCallFailCauseInfo *) response;
3439 info.causeCode = (LastCallFailCause) pFailCauseInfo->cause_code;
3440 info.vendorCause = convertCharPtrToHidlString(pFailCauseInfo->vendor_cause);
3441 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003442 RLOGE("getCurrentCallsResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003443 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
3444 }
3445
3446 Return<void> retStatus = radioService[slotId]->mRadioResponse->getLastCallFailCauseResponse(
3447 responseInfo, info);
3448 radioService[slotId]->checkReturnStatus(retStatus);
3449 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003450 RLOGE("getLastCallFailCauseResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003451 slotId);
3452 }
3453
3454 return 0;
3455}
3456
Amit Mahajan759786a2017-03-03 17:35:47 -08003457int radio::getSignalStrengthResponse(int slotId,
Amit Mahajan3df62912017-02-10 01:35:55 +00003458 int responseType, int serial, RIL_Errno e,
3459 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003460#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003461 RLOGD("getSignalStrengthResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003462#endif
Amit Mahajan3df62912017-02-10 01:35:55 +00003463
3464 if (radioService[slotId]->mRadioResponse != NULL) {
Amit Mahajan3da9ac02017-02-13 13:41:28 -08003465 RadioResponseInfo responseInfo = {};
Amit Mahajan3df62912017-02-10 01:35:55 +00003466 populateResponseInfo(responseInfo, serial, responseType, e);
Amit Mahajan3da9ac02017-02-13 13:41:28 -08003467 SignalStrength signalStrength = {};
Amit Mahajan3df62912017-02-10 01:35:55 +00003468 if (response == NULL || responseLen != sizeof(RIL_SignalStrength_v10)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003469 RLOGE("getSignalStrengthResponse: Invalid response");
Amit Mahajan3df62912017-02-10 01:35:55 +00003470 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
3471 } else {
3472 convertRilSignalStrengthToHal(response, responseLen, signalStrength);
3473 }
3474
3475 Return<void> retStatus = radioService[slotId]->mRadioResponse->getSignalStrengthResponse(
3476 responseInfo, signalStrength);
3477 radioService[slotId]->checkReturnStatus(retStatus);
3478 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003479 RLOGE("getSignalStrengthResponse: radioService[%d]->mRadioResponse == NULL",
Amit Mahajan3df62912017-02-10 01:35:55 +00003480 slotId);
3481 }
3482
3483 return 0;
3484}
3485
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003486RIL_CellInfoType getCellInfoTypeRadioTechnology(char *rat) {
3487 if (rat == NULL) {
3488 return RIL_CELL_INFO_TYPE_NONE;
3489 }
3490
3491 int radioTech = atoi(rat);
3492
3493 switch(radioTech) {
3494
3495 case RADIO_TECH_GPRS:
3496 case RADIO_TECH_EDGE:
3497 case RADIO_TECH_GSM: {
3498 return RIL_CELL_INFO_TYPE_GSM;
3499 }
3500
3501 case RADIO_TECH_UMTS:
3502 case RADIO_TECH_HSDPA:
3503 case RADIO_TECH_HSUPA:
3504 case RADIO_TECH_HSPA:
3505 case RADIO_TECH_HSPAP: {
3506 return RIL_CELL_INFO_TYPE_WCDMA;
3507 }
3508
3509 case RADIO_TECH_IS95A:
3510 case RADIO_TECH_IS95B:
3511 case RADIO_TECH_1xRTT:
3512 case RADIO_TECH_EVDO_0:
3513 case RADIO_TECH_EVDO_A:
3514 case RADIO_TECH_EVDO_B:
3515 case RADIO_TECH_EHRPD: {
3516 return RIL_CELL_INFO_TYPE_CDMA;
3517 }
3518
3519 case RADIO_TECH_LTE:
3520 case RADIO_TECH_LTE_CA: {
3521 return RIL_CELL_INFO_TYPE_LTE;
3522 }
3523
3524 case RADIO_TECH_TD_SCDMA: {
3525 return RIL_CELL_INFO_TYPE_TD_SCDMA;
3526 }
3527
3528 default: {
3529 break;
3530 }
3531 }
3532
3533 return RIL_CELL_INFO_TYPE_NONE;
3534
3535}
3536
3537void fillCellIdentityResponse(CellIdentity &cellIdentity, RIL_CellIdentity_v16 &rilCellIdentity) {
3538
3539 cellIdentity.cellIdentityGsm.resize(0);
3540 cellIdentity.cellIdentityWcdma.resize(0);
3541 cellIdentity.cellIdentityCdma.resize(0);
3542 cellIdentity.cellIdentityTdscdma.resize(0);
3543 cellIdentity.cellIdentityLte.resize(0);
3544 cellIdentity.cellInfoType = (CellInfoType)rilCellIdentity.cellInfoType;
3545 switch(rilCellIdentity.cellInfoType) {
3546
3547 case RIL_CELL_INFO_TYPE_GSM: {
3548 cellIdentity.cellIdentityGsm.resize(1);
3549 cellIdentity.cellIdentityGsm[0].mcc =
3550 std::to_string(rilCellIdentity.cellIdentityGsm.mcc);
3551 cellIdentity.cellIdentityGsm[0].mnc =
3552 std::to_string(rilCellIdentity.cellIdentityGsm.mnc);
3553 cellIdentity.cellIdentityGsm[0].lac = rilCellIdentity.cellIdentityGsm.lac;
3554 cellIdentity.cellIdentityGsm[0].cid = rilCellIdentity.cellIdentityGsm.cid;
3555 cellIdentity.cellIdentityGsm[0].arfcn = rilCellIdentity.cellIdentityGsm.arfcn;
3556 cellIdentity.cellIdentityGsm[0].bsic = rilCellIdentity.cellIdentityGsm.bsic;
3557 break;
3558 }
3559
3560 case RIL_CELL_INFO_TYPE_WCDMA: {
3561 cellIdentity.cellIdentityWcdma.resize(1);
3562 cellIdentity.cellIdentityWcdma[0].mcc =
3563 std::to_string(rilCellIdentity.cellIdentityWcdma.mcc);
3564 cellIdentity.cellIdentityWcdma[0].mnc =
3565 std::to_string(rilCellIdentity.cellIdentityWcdma.mnc);
3566 cellIdentity.cellIdentityWcdma[0].lac = rilCellIdentity.cellIdentityWcdma.lac;
3567 cellIdentity.cellIdentityWcdma[0].cid = rilCellIdentity.cellIdentityWcdma.cid;
3568 cellIdentity.cellIdentityWcdma[0].psc = rilCellIdentity.cellIdentityWcdma.psc;
3569 cellIdentity.cellIdentityWcdma[0].uarfcn = rilCellIdentity.cellIdentityWcdma.uarfcn;
3570 break;
3571 }
3572
3573 case RIL_CELL_INFO_TYPE_CDMA: {
3574 cellIdentity.cellIdentityCdma.resize(1);
3575 cellIdentity.cellIdentityCdma[0].networkId = rilCellIdentity.cellIdentityCdma.networkId;
3576 cellIdentity.cellIdentityCdma[0].systemId = rilCellIdentity.cellIdentityCdma.systemId;
3577 cellIdentity.cellIdentityCdma[0].baseStationId =
3578 rilCellIdentity.cellIdentityCdma.basestationId;
3579 cellIdentity.cellIdentityCdma[0].longitude = rilCellIdentity.cellIdentityCdma.longitude;
3580 cellIdentity.cellIdentityCdma[0].latitude = rilCellIdentity.cellIdentityCdma.latitude;
3581 break;
3582 }
3583
3584 case RIL_CELL_INFO_TYPE_LTE: {
3585 cellIdentity.cellIdentityLte.resize(1);
3586 cellIdentity.cellIdentityLte[0].mcc =
3587 std::to_string(rilCellIdentity.cellIdentityLte.mcc);
3588 cellIdentity.cellIdentityLte[0].mnc =
3589 std::to_string(rilCellIdentity.cellIdentityLte.mnc);
3590 cellIdentity.cellIdentityLte[0].ci = rilCellIdentity.cellIdentityLte.ci;
3591 cellIdentity.cellIdentityLte[0].pci = rilCellIdentity.cellIdentityLte.pci;
3592 cellIdentity.cellIdentityLte[0].tac = rilCellIdentity.cellIdentityLte.tac;
3593 cellIdentity.cellIdentityLte[0].earfcn = rilCellIdentity.cellIdentityLte.earfcn;
3594 break;
3595 }
3596
3597 case RIL_CELL_INFO_TYPE_TD_SCDMA: {
3598 cellIdentity.cellIdentityTdscdma.resize(1);
3599 cellIdentity.cellIdentityTdscdma[0].mcc =
3600 std::to_string(rilCellIdentity.cellIdentityTdscdma.mcc);
3601 cellIdentity.cellIdentityTdscdma[0].mnc =
3602 std::to_string(rilCellIdentity.cellIdentityTdscdma.mnc);
3603 cellIdentity.cellIdentityTdscdma[0].lac = rilCellIdentity.cellIdentityTdscdma.lac;
3604 cellIdentity.cellIdentityTdscdma[0].cid = rilCellIdentity.cellIdentityTdscdma.cid;
3605 cellIdentity.cellIdentityTdscdma[0].cpid = rilCellIdentity.cellIdentityTdscdma.cpid;
3606 break;
3607 }
3608
3609 default: {
3610 break;
3611 }
3612 }
3613}
3614
3615int convertResponseStringEntryToInt(char **response, int index, int numStrings) {
3616 if ((response != NULL) && (numStrings > index) && (response[index] != NULL)) {
3617 return atoi(response[index]);
3618 }
3619
3620 return -1;
3621}
3622
Sooraj Sasindran758ee462017-06-07 16:30:18 -07003623int convertResponseHexStringEntryToInt(char **response, int index, int numStrings) {
3624 const int hexBase = 16;
3625 if ((response != NULL) && (numStrings > index) && (response[index] != NULL)) {
3626 return strtol(response[index], NULL, hexBase);
3627 }
3628
3629 return -1;
3630}
3631
3632/* Fill Cell Identity info from Voice Registration State Response.
3633 * This fucntion is applicable only for RIL Version < 15.
3634 * Response is a "char **".
3635 * First and Second entries are in hex string format
3636 * and rest are integers represented in ascii format. */
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003637void fillCellIdentityFromVoiceRegStateResponseString(CellIdentity &cellIdentity,
3638 int numStrings, char** response) {
3639
3640 RIL_CellIdentity_v16 rilCellIdentity;
Jack Yu8e732d42017-04-14 00:08:06 -07003641 memset(&rilCellIdentity, -1, sizeof(RIL_CellIdentity_v16));
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003642
3643 rilCellIdentity.cellInfoType = getCellInfoTypeRadioTechnology(response[3]);
3644 switch(rilCellIdentity.cellInfoType) {
3645
3646 case RIL_CELL_INFO_TYPE_GSM: {
Sooraj Sasindran758ee462017-06-07 16:30:18 -07003647 /* valid LAC are hexstrings in the range 0x0000 - 0xffff */
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003648 rilCellIdentity.cellIdentityGsm.lac =
Sooraj Sasindran758ee462017-06-07 16:30:18 -07003649 convertResponseHexStringEntryToInt(response, 1, numStrings);
3650
3651 /* valid CID are hexstrings in the range 0x00000000 - 0xffffffff */
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003652 rilCellIdentity.cellIdentityGsm.cid =
Sooraj Sasindran758ee462017-06-07 16:30:18 -07003653 convertResponseHexStringEntryToInt(response, 2, numStrings);
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003654 break;
3655 }
3656
3657 case RIL_CELL_INFO_TYPE_WCDMA: {
Sooraj Sasindran758ee462017-06-07 16:30:18 -07003658 /* valid LAC are hexstrings in the range 0x0000 - 0xffff */
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003659 rilCellIdentity.cellIdentityWcdma.lac =
Sooraj Sasindran758ee462017-06-07 16:30:18 -07003660 convertResponseHexStringEntryToInt(response, 1, numStrings);
3661
3662 /* valid CID are hexstrings in the range 0x00000000 - 0xffffffff */
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003663 rilCellIdentity.cellIdentityWcdma.cid =
Sooraj Sasindran758ee462017-06-07 16:30:18 -07003664 convertResponseHexStringEntryToInt(response, 2, numStrings);
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003665 rilCellIdentity.cellIdentityWcdma.psc =
3666 convertResponseStringEntryToInt(response, 14, numStrings);
3667 break;
3668 }
3669
3670 case RIL_CELL_INFO_TYPE_TD_SCDMA:{
Sooraj Sasindran758ee462017-06-07 16:30:18 -07003671 /* valid LAC are hexstrings in the range 0x0000 - 0xffff */
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003672 rilCellIdentity.cellIdentityTdscdma.lac =
Sooraj Sasindran758ee462017-06-07 16:30:18 -07003673 convertResponseHexStringEntryToInt(response, 1, numStrings);
3674
3675 /* valid CID are hexstrings in the range 0x00000000 - 0xffffffff */
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003676 rilCellIdentity.cellIdentityTdscdma.cid =
Sooraj Sasindran758ee462017-06-07 16:30:18 -07003677 convertResponseHexStringEntryToInt(response, 2, numStrings);
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003678 break;
3679 }
3680
3681 case RIL_CELL_INFO_TYPE_CDMA:{
3682 rilCellIdentity.cellIdentityCdma.basestationId =
3683 convertResponseStringEntryToInt(response, 4, numStrings);
Nathan Harold35afd642017-07-07 17:12:04 -07003684 /* Order of Lat. and Long. swapped between RIL and HIDL interface versions. */
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003685 rilCellIdentity.cellIdentityCdma.latitude =
Nathan Harold35afd642017-07-07 17:12:04 -07003686 convertResponseStringEntryToInt(response, 5, numStrings);
3687 rilCellIdentity.cellIdentityCdma.longitude =
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003688 convertResponseStringEntryToInt(response, 6, numStrings);
3689 rilCellIdentity.cellIdentityCdma.systemId =
3690 convertResponseStringEntryToInt(response, 8, numStrings);
3691 rilCellIdentity.cellIdentityCdma.networkId =
3692 convertResponseStringEntryToInt(response, 9, numStrings);
3693 break;
3694 }
3695
Sooraj Sasindranf28e42a2017-03-06 23:07:22 -08003696 case RIL_CELL_INFO_TYPE_LTE:{
Sooraj Sasindran758ee462017-06-07 16:30:18 -07003697 /* valid TAC are hexstrings in the range 0x0000 - 0xffff */
Sooraj Sasindranf28e42a2017-03-06 23:07:22 -08003698 rilCellIdentity.cellIdentityLte.tac =
Sooraj Sasindran758ee462017-06-07 16:30:18 -07003699 convertResponseHexStringEntryToInt(response, 1, numStrings);
3700
3701 /* valid CID are hexstrings in the range 0x00000000 - 0xffffffff */
Sooraj Sasindranf28e42a2017-03-06 23:07:22 -08003702 rilCellIdentity.cellIdentityLte.ci =
Sooraj Sasindran758ee462017-06-07 16:30:18 -07003703 convertResponseHexStringEntryToInt(response, 2, numStrings);
Sooraj Sasindranf28e42a2017-03-06 23:07:22 -08003704 break;
3705 }
3706
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003707 default: {
3708 break;
3709 }
3710 }
3711
3712 fillCellIdentityResponse(cellIdentity, rilCellIdentity);
3713}
3714
Sooraj Sasindran758ee462017-06-07 16:30:18 -07003715/* Fill Cell Identity info from Data Registration State Response.
3716 * This fucntion is applicable only for RIL Version < 15.
3717 * Response is a "char **".
3718 * First and Second entries are in hex string format
3719 * and rest are integers represented in ascii format. */
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003720void fillCellIdentityFromDataRegStateResponseString(CellIdentity &cellIdentity,
3721 int numStrings, char** response) {
3722
3723 RIL_CellIdentity_v16 rilCellIdentity;
Jack Yu8e732d42017-04-14 00:08:06 -07003724 memset(&rilCellIdentity, -1, sizeof(RIL_CellIdentity_v16));
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003725
3726 rilCellIdentity.cellInfoType = getCellInfoTypeRadioTechnology(response[3]);
3727 switch(rilCellIdentity.cellInfoType) {
3728 case RIL_CELL_INFO_TYPE_GSM: {
Sooraj Sasindran758ee462017-06-07 16:30:18 -07003729 /* valid LAC are hexstrings in the range 0x0000 - 0xffff */
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003730 rilCellIdentity.cellIdentityGsm.lac =
Sooraj Sasindran758ee462017-06-07 16:30:18 -07003731 convertResponseHexStringEntryToInt(response, 1, numStrings);
3732
3733 /* valid CID are hexstrings in the range 0x00000000 - 0xffffffff */
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003734 rilCellIdentity.cellIdentityGsm.cid =
Sooraj Sasindran758ee462017-06-07 16:30:18 -07003735 convertResponseHexStringEntryToInt(response, 2, numStrings);
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003736 break;
3737 }
3738 case RIL_CELL_INFO_TYPE_WCDMA: {
Sooraj Sasindran758ee462017-06-07 16:30:18 -07003739 /* valid LAC are hexstrings in the range 0x0000 - 0xffff */
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003740 rilCellIdentity.cellIdentityWcdma.lac =
Sooraj Sasindran758ee462017-06-07 16:30:18 -07003741 convertResponseHexStringEntryToInt(response, 1, numStrings);
3742
3743 /* valid CID are hexstrings in the range 0x00000000 - 0xffffffff */
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003744 rilCellIdentity.cellIdentityWcdma.cid =
Sooraj Sasindran758ee462017-06-07 16:30:18 -07003745 convertResponseHexStringEntryToInt(response, 2, numStrings);
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003746 break;
3747 }
3748 case RIL_CELL_INFO_TYPE_TD_SCDMA:{
Sooraj Sasindran758ee462017-06-07 16:30:18 -07003749 /* valid LAC are hexstrings in the range 0x0000 - 0xffff */
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003750 rilCellIdentity.cellIdentityTdscdma.lac =
Sooraj Sasindran758ee462017-06-07 16:30:18 -07003751 convertResponseHexStringEntryToInt(response, 1, numStrings);
3752
3753 /* valid CID are hexstrings in the range 0x00000000 - 0xffffffff */
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003754 rilCellIdentity.cellIdentityTdscdma.cid =
Sooraj Sasindran758ee462017-06-07 16:30:18 -07003755 convertResponseHexStringEntryToInt(response, 2, numStrings);
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003756 break;
3757 }
3758 case RIL_CELL_INFO_TYPE_LTE: {
3759 rilCellIdentity.cellIdentityLte.tac =
3760 convertResponseStringEntryToInt(response, 6, numStrings);
3761 rilCellIdentity.cellIdentityLte.pci =
3762 convertResponseStringEntryToInt(response, 7, numStrings);
3763 rilCellIdentity.cellIdentityLte.ci =
3764 convertResponseStringEntryToInt(response, 8, numStrings);
3765 break;
3766 }
3767 default: {
3768 break;
3769 }
3770 }
3771
3772 fillCellIdentityResponse(cellIdentity, rilCellIdentity);
3773}
3774
Amit Mahajan759786a2017-03-03 17:35:47 -08003775int radio::getVoiceRegistrationStateResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003776 int responseType, int serial, RIL_Errno e,
3777 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003778#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003779 RLOGD("getVoiceRegistrationStateResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003780#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003781
3782 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003783 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003784 populateResponseInfo(responseInfo, serial, responseType, e);
3785
Jack Yuf68e0da2017-02-07 14:53:09 -08003786 VoiceRegStateResult voiceRegResponse = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003787 int numStrings = responseLen / sizeof(char *);
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003788 if (response == NULL) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003789 RLOGE("getVoiceRegistrationStateResponse Invalid response: NULL");
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003790 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
3791 } else if (s_vendorFunctions->version <= 14) {
3792 if (numStrings != 15) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003793 RLOGE("getVoiceRegistrationStateResponse Invalid response: NULL");
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003794 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
3795 } else {
3796 char **resp = (char **) response;
3797 voiceRegResponse.regState = (RegState) ATOI_NULL_HANDLED_DEF(resp[0], 4);
3798 voiceRegResponse.rat = ATOI_NULL_HANDLED(resp[3]);
3799 voiceRegResponse.cssSupported = ATOI_NULL_HANDLED_DEF(resp[7], 0);
3800 voiceRegResponse.roamingIndicator = ATOI_NULL_HANDLED(resp[10]);
3801 voiceRegResponse.systemIsInPrl = ATOI_NULL_HANDLED_DEF(resp[11], 0);
3802 voiceRegResponse.defaultRoamingIndicator = ATOI_NULL_HANDLED_DEF(resp[12], 0);
3803 voiceRegResponse.reasonForDenial = ATOI_NULL_HANDLED_DEF(resp[13], 0);
3804 fillCellIdentityFromVoiceRegStateResponseString(voiceRegResponse.cellIdentity,
3805 numStrings, resp);
3806 }
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003807 } else {
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003808 RIL_VoiceRegistrationStateResponse *voiceRegState =
3809 (RIL_VoiceRegistrationStateResponse *)response;
3810
3811 if (responseLen != sizeof(RIL_VoiceRegistrationStateResponse)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003812 RLOGE("getVoiceRegistrationStateResponse Invalid response: NULL");
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003813 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
3814 } else {
3815 voiceRegResponse.regState = (RegState) voiceRegState->regState;
3816 voiceRegResponse.rat = voiceRegState->rat;;
3817 voiceRegResponse.cssSupported = voiceRegState->cssSupported;
3818 voiceRegResponse.roamingIndicator = voiceRegState->roamingIndicator;
3819 voiceRegResponse.systemIsInPrl = voiceRegState->systemIsInPrl;
3820 voiceRegResponse.defaultRoamingIndicator = voiceRegState->defaultRoamingIndicator;
3821 voiceRegResponse.reasonForDenial = voiceRegState->reasonForDenial;
3822 fillCellIdentityResponse(voiceRegResponse.cellIdentity,
3823 voiceRegState->cellIdentity);
3824 }
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003825 }
3826
3827 Return<void> retStatus =
3828 radioService[slotId]->mRadioResponse->getVoiceRegistrationStateResponse(
3829 responseInfo, voiceRegResponse);
3830 radioService[slotId]->checkReturnStatus(retStatus);
3831 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003832 RLOGE("getVoiceRegistrationStateResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003833 slotId);
3834 }
3835
3836 return 0;
3837}
3838
Amit Mahajan759786a2017-03-03 17:35:47 -08003839int radio::getDataRegistrationStateResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003840 int responseType, int serial, RIL_Errno e,
3841 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003842#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003843 RLOGD("getDataRegistrationStateResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003844#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003845
3846 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003847 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003848 populateResponseInfo(responseInfo, serial, responseType, e);
Jack Yuf68e0da2017-02-07 14:53:09 -08003849 DataRegStateResult dataRegResponse = {};
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003850 if (response == NULL) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003851 RLOGE("getDataRegistrationStateResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003852 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003853 } else if (s_vendorFunctions->version <= 14) {
3854 int numStrings = responseLen / sizeof(char *);
3855 if ((numStrings != 6) && (numStrings != 11)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003856 RLOGE("getDataRegistrationStateResponse Invalid response: NULL");
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003857 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
3858 } else {
3859 char **resp = (char **) response;
3860 dataRegResponse.regState = (RegState) ATOI_NULL_HANDLED_DEF(resp[0], 4);
3861 dataRegResponse.rat = ATOI_NULL_HANDLED_DEF(resp[3], 0);
3862 dataRegResponse.reasonDataDenied = ATOI_NULL_HANDLED(resp[4]);
3863 dataRegResponse.maxDataCalls = ATOI_NULL_HANDLED_DEF(resp[5], 1);
3864 fillCellIdentityFromDataRegStateResponseString(dataRegResponse.cellIdentity,
3865 numStrings, resp);
3866 }
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003867 } else {
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003868 RIL_DataRegistrationStateResponse *dataRegState =
3869 (RIL_DataRegistrationStateResponse *)response;
3870
3871 if (responseLen != sizeof(RIL_DataRegistrationStateResponse)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003872 RLOGE("getDataRegistrationStateResponse Invalid response: NULL");
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003873 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
3874 } else {
3875 dataRegResponse.regState = (RegState) dataRegState->regState;
3876 dataRegResponse.rat = dataRegState->rat;;
3877 dataRegResponse.reasonDataDenied = dataRegState->reasonDataDenied;
3878 dataRegResponse.maxDataCalls = dataRegState->maxDataCalls;
3879 fillCellIdentityResponse(dataRegResponse.cellIdentity, dataRegState->cellIdentity);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003880 }
3881 }
3882
3883 Return<void> retStatus =
3884 radioService[slotId]->mRadioResponse->getDataRegistrationStateResponse(responseInfo,
3885 dataRegResponse);
3886 radioService[slotId]->checkReturnStatus(retStatus);
3887 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003888 RLOGE("getDataRegistrationStateResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003889 slotId);
3890 }
3891
3892 return 0;
3893}
3894
Amit Mahajan759786a2017-03-03 17:35:47 -08003895int radio::getOperatorResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003896 int responseType, int serial, RIL_Errno e, void *response,
3897 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003898#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003899 RLOGD("getOperatorResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003900#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003901
3902 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003903 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003904 populateResponseInfo(responseInfo, serial, responseType, e);
3905 hidl_string longName;
3906 hidl_string shortName;
3907 hidl_string numeric;
3908 int numStrings = responseLen / sizeof(char *);
3909 if (response == NULL || numStrings != 3) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003910 RLOGE("getOperatorResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003911 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
3912
3913 } else {
3914 char **resp = (char **) response;
3915 longName = convertCharPtrToHidlString(resp[0]);
3916 shortName = convertCharPtrToHidlString(resp[1]);
3917 numeric = convertCharPtrToHidlString(resp[2]);
3918 }
3919 Return<void> retStatus = radioService[slotId]->mRadioResponse->getOperatorResponse(
3920 responseInfo, longName, shortName, numeric);
3921 radioService[slotId]->checkReturnStatus(retStatus);
3922 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003923 RLOGE("getOperatorResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003924 slotId);
3925 }
3926
3927 return 0;
3928}
3929
Amit Mahajan759786a2017-03-03 17:35:47 -08003930int radio::setRadioPowerResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003931 int responseType, int serial, RIL_Errno e, void *response,
3932 size_t responseLen) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003933 RLOGD("setRadioPowerResponse: serial %d", serial);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003934
3935 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003936 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003937 populateResponseInfo(responseInfo, serial, responseType, e);
3938 Return<void> retStatus = radioService[slotId]->mRadioResponse->setRadioPowerResponse(
3939 responseInfo);
3940 radioService[slotId]->checkReturnStatus(retStatus);
3941 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003942 RLOGE("setRadioPowerResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003943 slotId);
3944 }
3945
3946 return 0;
3947}
3948
Amit Mahajan759786a2017-03-03 17:35:47 -08003949int radio::sendDtmfResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003950 int responseType, int serial, RIL_Errno e, void *response,
3951 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003952#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003953 RLOGD("sendDtmfResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003954#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003955
3956 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003957 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003958 populateResponseInfo(responseInfo, serial, responseType, e);
3959 Return<void> retStatus = radioService[slotId]->mRadioResponse->sendDtmfResponse(
3960 responseInfo);
3961 radioService[slotId]->checkReturnStatus(retStatus);
3962 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003963 RLOGE("sendDtmfResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003964 slotId);
3965 }
3966
3967 return 0;
3968}
3969
3970SendSmsResult makeSendSmsResult(RadioResponseInfo& responseInfo, int serial, int responseType,
3971 RIL_Errno e, void *response, size_t responseLen) {
3972 populateResponseInfo(responseInfo, serial, responseType, e);
Jack Yuf68e0da2017-02-07 14:53:09 -08003973 SendSmsResult result = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003974
3975 if (response == NULL || responseLen != sizeof(RIL_SMS_Response)) {
3976 RLOGE("Invalid response: NULL");
3977 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003978 result.ackPDU = hidl_string();
3979 } else {
3980 RIL_SMS_Response *resp = (RIL_SMS_Response *) response;
3981 result.messageRef = resp->messageRef;
3982 result.ackPDU = convertCharPtrToHidlString(resp->ackPDU);
3983 result.errorCode = resp->errorCode;
3984 }
3985 return result;
3986}
3987
Amit Mahajan759786a2017-03-03 17:35:47 -08003988int radio::sendSmsResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003989 int responseType, int serial, RIL_Errno e, void *response,
3990 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003991#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003992 RLOGD("sendSmsResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003993#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003994
3995 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003996 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003997 SendSmsResult result = makeSendSmsResult(responseInfo, serial, responseType, e, response,
3998 responseLen);
3999
4000 Return<void> retStatus = radioService[slotId]->mRadioResponse->sendSmsResponse(responseInfo,
4001 result);
4002 radioService[slotId]->checkReturnStatus(retStatus);
4003 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004004 RLOGE("sendSmsResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004005 }
4006
4007 return 0;
4008}
4009
Amit Mahajan759786a2017-03-03 17:35:47 -08004010int radio::sendSMSExpectMoreResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004011 int responseType, int serial, RIL_Errno e, void *response,
4012 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004013#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004014 RLOGD("sendSMSExpectMoreResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004015#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004016
4017 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004018 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004019 SendSmsResult result = makeSendSmsResult(responseInfo, serial, responseType, e, response,
4020 responseLen);
4021
4022 Return<void> retStatus = radioService[slotId]->mRadioResponse->sendSMSExpectMoreResponse(
4023 responseInfo, result);
4024 radioService[slotId]->checkReturnStatus(retStatus);
4025 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004026 RLOGE("sendSMSExpectMoreResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004027 }
4028
4029 return 0;
4030}
4031
Amit Mahajan759786a2017-03-03 17:35:47 -08004032int radio::setupDataCallResponse(int slotId,
Amit Mahajan3df62912017-02-10 01:35:55 +00004033 int responseType, int serial, RIL_Errno e, void *response,
4034 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004035#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004036 RLOGD("setupDataCallResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004037#endif
Amit Mahajan3df62912017-02-10 01:35:55 +00004038
4039 if (radioService[slotId]->mRadioResponse != NULL) {
Amit Mahajan3da9ac02017-02-13 13:41:28 -08004040 RadioResponseInfo responseInfo = {};
Amit Mahajan3df62912017-02-10 01:35:55 +00004041 populateResponseInfo(responseInfo, serial, responseType, e);
4042
Amit Mahajan3da9ac02017-02-13 13:41:28 -08004043 SetupDataCallResult result = {};
Amit Mahajan13058cb2017-06-07 23:10:27 -07004044 if (response == NULL || (responseLen % sizeof(RIL_Data_Call_Response_v11)) != 0) {
4045 if (response != NULL) {
4046 RLOGE("setupDataCallResponse: Invalid response");
4047 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
4048 }
Jack Yu5079e182017-02-28 15:21:18 -08004049 result.status = DataCallFailCause::ERROR_UNSPECIFIED;
Amit Mahajan3da9ac02017-02-13 13:41:28 -08004050 result.type = hidl_string();
4051 result.ifname = hidl_string();
4052 result.addresses = hidl_string();
4053 result.dnses = hidl_string();
4054 result.gateways = hidl_string();
4055 result.pcscf = hidl_string();
Amit Mahajan3df62912017-02-10 01:35:55 +00004056 } else {
4057 convertRilDataCallToHal((RIL_Data_Call_Response_v11 *) response, result);
4058 }
4059
4060 Return<void> retStatus = radioService[slotId]->mRadioResponse->setupDataCallResponse(
4061 responseInfo, result);
4062 radioService[slotId]->checkReturnStatus(retStatus);
4063 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004064 RLOGE("setupDataCallResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Amit Mahajan3df62912017-02-10 01:35:55 +00004065 }
4066
4067 return 0;
4068}
4069
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004070IccIoResult responseIccIo(RadioResponseInfo& responseInfo, int serial, int responseType,
4071 RIL_Errno e, void *response, size_t responseLen) {
4072 populateResponseInfo(responseInfo, serial, responseType, e);
Jack Yuf68e0da2017-02-07 14:53:09 -08004073 IccIoResult result = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004074
4075 if (response == NULL || responseLen != sizeof(RIL_SIM_IO_Response)) {
4076 RLOGE("Invalid response: NULL");
4077 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004078 result.simResponse = hidl_string();
4079 } else {
4080 RIL_SIM_IO_Response *resp = (RIL_SIM_IO_Response *) response;
4081 result.sw1 = resp->sw1;
4082 result.sw2 = resp->sw2;
4083 result.simResponse = convertCharPtrToHidlString(resp->simResponse);
4084 }
4085 return result;
4086}
4087
Amit Mahajan759786a2017-03-03 17:35:47 -08004088int radio::iccIOForAppResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004089 int responseType, int serial, RIL_Errno e, void *response,
4090 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004091#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004092 RLOGD("iccIOForAppResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004093#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004094
4095 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004096 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004097 IccIoResult result = responseIccIo(responseInfo, serial, responseType, e, response,
4098 responseLen);
4099
4100 Return<void> retStatus = radioService[slotId]->mRadioResponse->iccIOForAppResponse(
4101 responseInfo, result);
4102 radioService[slotId]->checkReturnStatus(retStatus);
4103 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004104 RLOGE("iccIOForAppResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004105 }
4106
4107 return 0;
4108}
4109
Amit Mahajan759786a2017-03-03 17:35:47 -08004110int radio::sendUssdResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004111 int responseType, int serial, RIL_Errno e, void *response,
4112 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004113#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004114 RLOGD("sendUssdResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004115#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004116
4117 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004118 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004119 populateResponseInfo(responseInfo, serial, responseType, e);
4120 Return<void> retStatus = radioService[slotId]->mRadioResponse->sendUssdResponse(
4121 responseInfo);
4122 radioService[slotId]->checkReturnStatus(retStatus);
4123 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004124 RLOGE("sendUssdResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004125 slotId);
4126 }
4127
4128 return 0;
4129}
4130
Amit Mahajan759786a2017-03-03 17:35:47 -08004131int radio::cancelPendingUssdResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004132 int responseType, int serial, RIL_Errno e, void *response,
4133 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004134#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004135 RLOGD("cancelPendingUssdResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004136#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004137
4138 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004139 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004140 populateResponseInfo(responseInfo, serial, responseType, e);
4141 Return<void> retStatus = radioService[slotId]->mRadioResponse->cancelPendingUssdResponse(
4142 responseInfo);
4143 radioService[slotId]->checkReturnStatus(retStatus);
4144 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004145 RLOGE("cancelPendingUssdResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004146 slotId);
4147 }
4148
4149 return 0;
4150}
4151
Amit Mahajan759786a2017-03-03 17:35:47 -08004152int radio::getClirResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004153 int responseType, int serial, RIL_Errno e, void *response,
4154 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004155#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004156 RLOGD("getClirResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004157#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004158
4159 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004160 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004161 populateResponseInfo(responseInfo, serial, responseType, e);
4162 int n = -1, m = -1;
4163 int numInts = responseLen / sizeof(int);
4164 if (response == NULL || numInts != 2) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004165 RLOGE("getClirResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004166 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
4167 } else {
4168 int *pInt = (int *) response;
4169 n = pInt[0];
4170 m = pInt[1];
4171 }
4172 Return<void> retStatus = radioService[slotId]->mRadioResponse->getClirResponse(responseInfo,
4173 n, m);
4174 radioService[slotId]->checkReturnStatus(retStatus);
4175 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004176 RLOGE("getClirResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004177 }
4178
4179 return 0;
4180}
4181
Amit Mahajan759786a2017-03-03 17:35:47 -08004182int radio::setClirResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004183 int responseType, int serial, RIL_Errno e, void *response,
4184 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004185#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004186 RLOGD("setClirResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004187#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004188
4189 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004190 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004191 populateResponseInfo(responseInfo, serial, responseType, e);
4192 Return<void> retStatus = radioService[slotId]->mRadioResponse->setClirResponse(
4193 responseInfo);
4194 radioService[slotId]->checkReturnStatus(retStatus);
4195 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004196 RLOGE("setClirResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004197 }
4198
4199 return 0;
4200}
4201
Amit Mahajan759786a2017-03-03 17:35:47 -08004202int radio::getCallForwardStatusResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004203 int responseType, int serial, RIL_Errno e,
4204 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004205#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004206 RLOGD("getCallForwardStatusResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004207#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004208
4209 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004210 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004211 populateResponseInfo(responseInfo, serial, responseType, e);
4212 hidl_vec<CallForwardInfo> callForwardInfos;
4213
Amit Mahajan13058cb2017-06-07 23:10:27 -07004214 if ((response == NULL && responseLen != 0)
4215 || responseLen % sizeof(RIL_CallForwardInfo *) != 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004216 RLOGE("getCallForwardStatusResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004217 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
4218 } else {
4219 int num = responseLen / sizeof(RIL_CallForwardInfo *);
4220 callForwardInfos.resize(num);
4221 for (int i = 0 ; i < num; i++) {
4222 RIL_CallForwardInfo *resp = ((RIL_CallForwardInfo **) response)[i];
4223 callForwardInfos[i].status = (CallForwardInfoStatus) resp->status;
4224 callForwardInfos[i].reason = resp->reason;
4225 callForwardInfos[i].serviceClass = resp->serviceClass;
4226 callForwardInfos[i].toa = resp->toa;
4227 callForwardInfos[i].number = convertCharPtrToHidlString(resp->number);
4228 callForwardInfos[i].timeSeconds = resp->timeSeconds;
4229 }
4230 }
4231
4232 Return<void> retStatus = radioService[slotId]->mRadioResponse->getCallForwardStatusResponse(
4233 responseInfo, callForwardInfos);
4234 radioService[slotId]->checkReturnStatus(retStatus);
4235 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004236 RLOGE("getCallForwardStatusResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004237 slotId);
4238 }
4239
4240 return 0;
4241}
4242
Amit Mahajan759786a2017-03-03 17:35:47 -08004243int radio::setCallForwardResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004244 int responseType, int serial, RIL_Errno e, void *response,
4245 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004246#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004247 RLOGD("setCallForwardResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004248#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004249
4250 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004251 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004252 populateResponseInfo(responseInfo, serial, responseType, e);
4253 Return<void> retStatus = radioService[slotId]->mRadioResponse->setCallForwardResponse(
4254 responseInfo);
4255 radioService[slotId]->checkReturnStatus(retStatus);
4256 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004257 RLOGE("setCallForwardResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004258 }
4259
4260 return 0;
4261}
4262
Amit Mahajan759786a2017-03-03 17:35:47 -08004263int radio::getCallWaitingResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004264 int responseType, int serial, RIL_Errno e, void *response,
4265 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004266#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004267 RLOGD("getCallWaitingResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004268#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004269
4270 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004271 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004272 populateResponseInfo(responseInfo, serial, responseType, e);
4273 bool enable = false;
4274 int serviceClass = -1;
4275 int numInts = responseLen / sizeof(int);
4276 if (response == NULL || numInts != 2) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004277 RLOGE("getCallWaitingResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004278 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
4279 } else {
4280 int *pInt = (int *) response;
4281 enable = pInt[0] == 1 ? true : false;
4282 serviceClass = pInt[1];
4283 }
Sanket Padawe5375bfa2017-03-07 17:21:05 -08004284 Return<void> retStatus = radioService[slotId]->mRadioResponse->getCallWaitingResponse(
4285 responseInfo, enable, serviceClass);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004286 radioService[slotId]->checkReturnStatus(retStatus);
4287 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004288 RLOGE("getCallWaitingResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004289 }
4290
4291 return 0;
4292}
4293
Amit Mahajan759786a2017-03-03 17:35:47 -08004294int radio::setCallWaitingResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004295 int responseType, int serial, RIL_Errno e, void *response,
4296 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004297#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004298 RLOGD("setCallWaitingResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004299#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004300
4301 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004302 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004303 populateResponseInfo(responseInfo, serial, responseType, e);
4304 Return<void> retStatus = radioService[slotId]->mRadioResponse->setCallWaitingResponse(
4305 responseInfo);
4306 radioService[slotId]->checkReturnStatus(retStatus);
4307 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004308 RLOGE("setCallWaitingResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004309 }
4310
4311 return 0;
4312}
4313
Amit Mahajan759786a2017-03-03 17:35:47 -08004314int radio::acknowledgeLastIncomingGsmSmsResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004315 int responseType, int serial, RIL_Errno e,
4316 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004317#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004318 RLOGD("acknowledgeLastIncomingGsmSmsResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004319#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004320
4321 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004322 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004323 populateResponseInfo(responseInfo, serial, responseType, e);
4324 Return<void> retStatus =
4325 radioService[slotId]->mRadioResponse->acknowledgeLastIncomingGsmSmsResponse(
4326 responseInfo);
4327 radioService[slotId]->checkReturnStatus(retStatus);
4328 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004329 RLOGE("acknowledgeLastIncomingGsmSmsResponse: radioService[%d]->mRadioResponse "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004330 "== NULL", slotId);
4331 }
4332
4333 return 0;
4334}
4335
Amit Mahajan759786a2017-03-03 17:35:47 -08004336int radio::acceptCallResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004337 int responseType, int serial, RIL_Errno e,
4338 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004339#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004340 RLOGD("acceptCallResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004341#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004342
4343 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004344 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004345 populateResponseInfo(responseInfo, serial, responseType, e);
4346 Return<void> retStatus = radioService[slotId]->mRadioResponse->acceptCallResponse(
4347 responseInfo);
4348 radioService[slotId]->checkReturnStatus(retStatus);
4349 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004350 RLOGE("acceptCallResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004351 slotId);
4352 }
4353
4354 return 0;
4355}
4356
Amit Mahajan759786a2017-03-03 17:35:47 -08004357int radio::deactivateDataCallResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004358 int responseType, int serial, RIL_Errno e,
4359 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004360#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004361 RLOGD("deactivateDataCallResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004362#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004363
4364 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004365 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004366 populateResponseInfo(responseInfo, serial, responseType, e);
4367 Return<void> retStatus = radioService[slotId]->mRadioResponse->deactivateDataCallResponse(
4368 responseInfo);
4369 radioService[slotId]->checkReturnStatus(retStatus);
4370 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004371 RLOGE("deactivateDataCallResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004372 slotId);
4373 }
4374
4375 return 0;
4376}
4377
Amit Mahajan759786a2017-03-03 17:35:47 -08004378int radio::getFacilityLockForAppResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004379 int responseType, int serial, RIL_Errno e,
4380 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004381#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004382 RLOGD("getFacilityLockForAppResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004383#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004384
4385 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004386 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004387 int ret = responseInt(responseInfo, serial, responseType, e, response, responseLen);
4388 Return<void> retStatus = radioService[slotId]->mRadioResponse->
4389 getFacilityLockForAppResponse(responseInfo, ret);
4390 radioService[slotId]->checkReturnStatus(retStatus);
4391 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004392 RLOGE("getFacilityLockForAppResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004393 slotId);
4394 }
4395
4396 return 0;
4397}
4398
Amit Mahajan759786a2017-03-03 17:35:47 -08004399int radio::setFacilityLockForAppResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004400 int responseType, int serial, RIL_Errno e,
4401 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004402#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004403 RLOGD("setFacilityLockForAppResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004404#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004405
4406 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004407 RadioResponseInfo responseInfo = {};
Naveen Kalla346bbc02017-03-16 12:55:55 -07004408 int ret = responseIntOrEmpty(responseInfo, serial, responseType, e, response, responseLen);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004409 Return<void> retStatus
4410 = radioService[slotId]->mRadioResponse->setFacilityLockForAppResponse(responseInfo,
4411 ret);
4412 radioService[slotId]->checkReturnStatus(retStatus);
4413 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004414 RLOGE("setFacilityLockForAppResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004415 slotId);
4416 }
4417
4418 return 0;
4419}
4420
Amit Mahajan759786a2017-03-03 17:35:47 -08004421int radio::setBarringPasswordResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004422 int responseType, int serial, RIL_Errno e,
4423 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004424#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004425 RLOGD("acceptCallResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004426#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004427
4428 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004429 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004430 populateResponseInfo(responseInfo, serial, responseType, e);
4431 Return<void> retStatus
4432 = radioService[slotId]->mRadioResponse->setBarringPasswordResponse(responseInfo);
4433 radioService[slotId]->checkReturnStatus(retStatus);
4434 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004435 RLOGE("setBarringPasswordResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004436 slotId);
4437 }
4438
4439 return 0;
4440}
4441
Amit Mahajan759786a2017-03-03 17:35:47 -08004442int radio::getNetworkSelectionModeResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004443 int responseType, int serial, RIL_Errno e, void *response,
4444 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004445#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004446 RLOGD("getNetworkSelectionModeResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004447#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004448
4449 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004450 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004451 populateResponseInfo(responseInfo, serial, responseType, e);
4452 bool manual = false;
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004453 if (response == NULL || responseLen != sizeof(int)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004454 RLOGE("getNetworkSelectionModeResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004455 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
4456 } else {
4457 int *pInt = (int *) response;
4458 manual = pInt[0] == 1 ? true : false;
4459 }
4460 Return<void> retStatus
4461 = radioService[slotId]->mRadioResponse->getNetworkSelectionModeResponse(
4462 responseInfo,
4463 manual);
4464 radioService[slotId]->checkReturnStatus(retStatus);
4465 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004466 RLOGE("getNetworkSelectionModeResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004467 slotId);
4468 }
4469
4470 return 0;
4471}
4472
Amit Mahajan759786a2017-03-03 17:35:47 -08004473int radio::setNetworkSelectionModeAutomaticResponse(int slotId, int responseType, int serial,
4474 RIL_Errno e, void *response,
4475 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004476#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004477 RLOGD("setNetworkSelectionModeAutomaticResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004478#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004479
4480 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004481 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004482 populateResponseInfo(responseInfo, serial, responseType, e);
4483 Return<void> retStatus
4484 = radioService[slotId]->mRadioResponse->setNetworkSelectionModeAutomaticResponse(
4485 responseInfo);
4486 radioService[slotId]->checkReturnStatus(retStatus);
4487 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004488 RLOGE("setNetworkSelectionModeAutomaticResponse: radioService[%d]->mRadioResponse "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004489 "== NULL", slotId);
4490 }
4491
4492 return 0;
4493}
4494
Amit Mahajan759786a2017-03-03 17:35:47 -08004495int radio::setNetworkSelectionModeManualResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004496 int responseType, int serial, RIL_Errno e,
4497 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004498#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004499 RLOGD("setNetworkSelectionModeManualResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004500#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004501
4502 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004503 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004504 populateResponseInfo(responseInfo, serial, responseType, e);
4505 Return<void> retStatus
4506 = radioService[slotId]->mRadioResponse->setNetworkSelectionModeManualResponse(
4507 responseInfo);
4508 radioService[slotId]->checkReturnStatus(retStatus);
4509 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004510 RLOGE("acceptCallResponse: radioService[%d]->setNetworkSelectionModeManualResponse "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004511 "== NULL", slotId);
4512 }
4513
4514 return 0;
4515}
4516
Jack Yuf68e0da2017-02-07 14:53:09 -08004517int convertOperatorStatusToInt(const char *str) {
4518 if (strncmp("unknown", str, 9) == 0) {
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004519 return (int) OperatorStatus::UNKNOWN;
Jack Yuf68e0da2017-02-07 14:53:09 -08004520 } else if (strncmp("available", str, 9) == 0) {
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004521 return (int) OperatorStatus::AVAILABLE;
Jack Yuf68e0da2017-02-07 14:53:09 -08004522 } else if (strncmp("current", str, 9) == 0) {
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004523 return (int) OperatorStatus::CURRENT;
Jack Yuf68e0da2017-02-07 14:53:09 -08004524 } else if (strncmp("forbidden", str, 9) == 0) {
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004525 return (int) OperatorStatus::FORBIDDEN;
4526 } else {
4527 return -1;
4528 }
4529}
4530
Amit Mahajan759786a2017-03-03 17:35:47 -08004531int radio::getAvailableNetworksResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004532 int responseType, int serial, RIL_Errno e, void *response,
4533 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004534#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004535 RLOGD("getAvailableNetworksResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004536#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004537
4538 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004539 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004540 populateResponseInfo(responseInfo, serial, responseType, e);
4541 hidl_vec<OperatorInfo> networks;
Amit Mahajan13058cb2017-06-07 23:10:27 -07004542 if ((response == NULL && responseLen != 0)
4543 || responseLen % (4 * sizeof(char *))!= 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004544 RLOGE("getAvailableNetworksResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004545 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
4546 } else {
4547 char **resp = (char **) response;
4548 int numStrings = responseLen / sizeof(char *);
4549 networks.resize(numStrings/4);
Jayachandran Ce0d755c2017-03-01 18:26:50 -08004550 for (int i = 0, j = 0; i < numStrings; i = i + 4, j++) {
4551 networks[j].alphaLong = convertCharPtrToHidlString(resp[i]);
4552 networks[j].alphaShort = convertCharPtrToHidlString(resp[i + 1]);
4553 networks[j].operatorNumeric = convertCharPtrToHidlString(resp[i + 2]);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004554 int status = convertOperatorStatusToInt(resp[i + 3]);
4555 if (status == -1) {
4556 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
4557 } else {
Jayachandran Ce0d755c2017-03-01 18:26:50 -08004558 networks[j].status = (OperatorStatus) status;
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004559 }
4560 }
4561 }
4562 Return<void> retStatus
4563 = radioService[slotId]->mRadioResponse->getAvailableNetworksResponse(responseInfo,
4564 networks);
4565 radioService[slotId]->checkReturnStatus(retStatus);
4566 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004567 RLOGE("getAvailableNetworksResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004568 slotId);
4569 }
4570
4571 return 0;
4572}
4573
Amit Mahajan759786a2017-03-03 17:35:47 -08004574int radio::startDtmfResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004575 int responseType, int serial, RIL_Errno e,
4576 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004577#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004578 RLOGD("startDtmfResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004579#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004580
4581 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004582 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004583 populateResponseInfo(responseInfo, serial, responseType, e);
4584 Return<void> retStatus
4585 = radioService[slotId]->mRadioResponse->startDtmfResponse(responseInfo);
4586 radioService[slotId]->checkReturnStatus(retStatus);
4587 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004588 RLOGE("startDtmfResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004589 }
4590
4591 return 0;
4592}
4593
Amit Mahajan759786a2017-03-03 17:35:47 -08004594int radio::stopDtmfResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004595 int responseType, int serial, RIL_Errno e,
4596 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004597#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004598 RLOGD("stopDtmfResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004599#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004600
4601 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004602 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004603 populateResponseInfo(responseInfo, serial, responseType, e);
4604 Return<void> retStatus
4605 = radioService[slotId]->mRadioResponse->stopDtmfResponse(responseInfo);
4606 radioService[slotId]->checkReturnStatus(retStatus);
4607 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004608 RLOGE("stopDtmfResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004609 }
4610
4611 return 0;
4612}
4613
Amit Mahajan759786a2017-03-03 17:35:47 -08004614int radio::getBasebandVersionResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004615 int responseType, int serial, RIL_Errno e,
4616 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004617#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004618 RLOGD("getBasebandVersionResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004619#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004620
4621 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004622 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004623 populateResponseInfo(responseInfo, serial, responseType, e);
4624 Return<void> retStatus
4625 = radioService[slotId]->mRadioResponse->getBasebandVersionResponse(responseInfo,
4626 convertCharPtrToHidlString((char *) response));
4627 radioService[slotId]->checkReturnStatus(retStatus);
4628 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004629 RLOGE("getBasebandVersionResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004630 }
4631
4632 return 0;
4633}
4634
Amit Mahajan759786a2017-03-03 17:35:47 -08004635int radio::separateConnectionResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004636 int responseType, int serial, RIL_Errno e,
4637 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004638#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004639 RLOGD("separateConnectionResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004640#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004641
4642 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004643 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004644 populateResponseInfo(responseInfo, serial, responseType, e);
4645 Return<void> retStatus
4646 = radioService[slotId]->mRadioResponse->separateConnectionResponse(responseInfo);
4647 radioService[slotId]->checkReturnStatus(retStatus);
4648 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004649 RLOGE("separateConnectionResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004650 slotId);
4651 }
4652
4653 return 0;
4654}
4655
Amit Mahajan759786a2017-03-03 17:35:47 -08004656int radio::setMuteResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004657 int responseType, int serial, RIL_Errno e,
4658 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004659#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004660 RLOGD("setMuteResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004661#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004662
4663 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004664 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004665 populateResponseInfo(responseInfo, serial, responseType, e);
4666 Return<void> retStatus
4667 = radioService[slotId]->mRadioResponse->setMuteResponse(responseInfo);
4668 radioService[slotId]->checkReturnStatus(retStatus);
4669 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004670 RLOGE("setMuteResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004671 }
4672
4673 return 0;
4674}
4675
Amit Mahajan759786a2017-03-03 17:35:47 -08004676int radio::getMuteResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004677 int responseType, int serial, RIL_Errno e, void *response,
4678 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004679#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004680 RLOGD("getMuteResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004681#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004682
4683 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004684 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004685 populateResponseInfo(responseInfo, serial, responseType, e);
4686 bool enable = false;
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004687 if (response == NULL || responseLen != sizeof(int)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004688 RLOGE("getMuteResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004689 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
4690 } else {
4691 int *pInt = (int *) response;
4692 enable = pInt[0] == 1 ? true : false;
4693 }
4694 Return<void> retStatus = radioService[slotId]->mRadioResponse->getMuteResponse(responseInfo,
4695 enable);
4696 radioService[slotId]->checkReturnStatus(retStatus);
4697 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004698 RLOGE("getMuteResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004699 }
4700
4701 return 0;
4702}
4703
Amit Mahajan759786a2017-03-03 17:35:47 -08004704int radio::getClipResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004705 int responseType, int serial, RIL_Errno e,
4706 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004707#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004708 RLOGD("getClipResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004709#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004710
4711 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004712 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004713 int ret = responseInt(responseInfo, serial, responseType, e, response, responseLen);
4714 Return<void> retStatus = radioService[slotId]->mRadioResponse->getClipResponse(responseInfo,
4715 (ClipStatus) ret);
4716 radioService[slotId]->checkReturnStatus(retStatus);
4717 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004718 RLOGE("getClipResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004719 }
4720
4721 return 0;
4722}
4723
Amit Mahajan759786a2017-03-03 17:35:47 -08004724int radio::getDataCallListResponse(int slotId,
Amit Mahajan3df62912017-02-10 01:35:55 +00004725 int responseType, int serial, RIL_Errno e,
4726 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004727#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004728 RLOGD("getDataCallListResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004729#endif
Amit Mahajan3df62912017-02-10 01:35:55 +00004730
4731 if (radioService[slotId]->mRadioResponse != NULL) {
Amit Mahajan3da9ac02017-02-13 13:41:28 -08004732 RadioResponseInfo responseInfo = {};
Amit Mahajan3df62912017-02-10 01:35:55 +00004733 populateResponseInfo(responseInfo, serial, responseType, e);
4734
4735 hidl_vec<SetupDataCallResult> ret;
Amit Mahajan13058cb2017-06-07 23:10:27 -07004736 if ((response == NULL && responseLen != 0)
4737 || responseLen % sizeof(RIL_Data_Call_Response_v11) != 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004738 RLOGE("getDataCallListResponse: invalid response");
Amit Mahajan3df62912017-02-10 01:35:55 +00004739 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
4740 } else {
4741 convertRilDataCallListToHal(response, responseLen, ret);
4742 }
4743
4744 Return<void> retStatus = radioService[slotId]->mRadioResponse->getDataCallListResponse(
4745 responseInfo, ret);
4746 radioService[slotId]->checkReturnStatus(retStatus);
4747 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004748 RLOGE("getDataCallListResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Amit Mahajan3df62912017-02-10 01:35:55 +00004749 }
4750
4751 return 0;
4752}
4753
Amit Mahajan759786a2017-03-03 17:35:47 -08004754int radio::setSuppServiceNotificationsResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004755 int responseType, int serial, RIL_Errno e,
4756 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004757#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004758 RLOGD("setSuppServiceNotificationsResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004759#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004760
4761 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004762 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004763 populateResponseInfo(responseInfo, serial, responseType, e);
4764 Return<void> retStatus
4765 = radioService[slotId]->mRadioResponse->setSuppServiceNotificationsResponse(
4766 responseInfo);
4767 radioService[slotId]->checkReturnStatus(retStatus);
4768 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004769 RLOGE("setSuppServiceNotificationsResponse: radioService[%d]->mRadioResponse "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004770 "== NULL", slotId);
4771 }
4772
4773 return 0;
4774}
4775
Amit Mahajan759786a2017-03-03 17:35:47 -08004776int radio::deleteSmsOnSimResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004777 int responseType, int serial, RIL_Errno e,
4778 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004779#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004780 RLOGD("deleteSmsOnSimResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004781#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004782
4783 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004784 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004785 populateResponseInfo(responseInfo, serial, responseType, e);
4786 Return<void> retStatus
4787 = radioService[slotId]->mRadioResponse->deleteSmsOnSimResponse(responseInfo);
4788 radioService[slotId]->checkReturnStatus(retStatus);
4789 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004790 RLOGE("deleteSmsOnSimResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004791 }
4792
4793 return 0;
4794}
4795
Amit Mahajan759786a2017-03-03 17:35:47 -08004796int radio::setBandModeResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004797 int responseType, int serial, RIL_Errno e,
4798 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004799#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004800 RLOGD("setBandModeResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004801#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004802
4803 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004804 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004805 populateResponseInfo(responseInfo, serial, responseType, e);
4806 Return<void> retStatus
4807 = radioService[slotId]->mRadioResponse->setBandModeResponse(responseInfo);
4808 radioService[slotId]->checkReturnStatus(retStatus);
4809 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004810 RLOGE("setBandModeResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004811 }
4812
4813 return 0;
4814}
4815
Amit Mahajan759786a2017-03-03 17:35:47 -08004816int radio::writeSmsToSimResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004817 int responseType, int serial, RIL_Errno e,
4818 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004819#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004820 RLOGD("writeSmsToSimResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004821#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004822
4823 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004824 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004825 int ret = responseInt(responseInfo, serial, responseType, e, response, responseLen);
4826 Return<void> retStatus
4827 = radioService[slotId]->mRadioResponse->writeSmsToSimResponse(responseInfo, ret);
4828 radioService[slotId]->checkReturnStatus(retStatus);
4829 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004830 RLOGE("writeSmsToSimResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004831 }
4832
4833 return 0;
4834}
4835
Amit Mahajan759786a2017-03-03 17:35:47 -08004836int radio::getAvailableBandModesResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004837 int responseType, int serial, RIL_Errno e, void *response,
4838 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004839#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004840 RLOGD("getAvailableBandModesResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004841#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004842
4843 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004844 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004845 populateResponseInfo(responseInfo, serial, responseType, e);
4846 hidl_vec<RadioBandMode> modes;
Amit Mahajan13058cb2017-06-07 23:10:27 -07004847 if ((response == NULL && responseLen != 0)|| responseLen % sizeof(int) != 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004848 RLOGE("getAvailableBandModesResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004849 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
4850 } else {
4851 int *pInt = (int *) response;
4852 int numInts = responseLen / sizeof(int);
4853 modes.resize(numInts);
4854 for (int i = 0; i < numInts; i++) {
4855 modes[i] = (RadioBandMode) pInt[i];
4856 }
4857 }
4858 Return<void> retStatus
4859 = radioService[slotId]->mRadioResponse->getAvailableBandModesResponse(responseInfo,
4860 modes);
4861 radioService[slotId]->checkReturnStatus(retStatus);
4862 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004863 RLOGE("getAvailableBandModesResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004864 slotId);
4865 }
4866
4867 return 0;
4868}
4869
Amit Mahajan759786a2017-03-03 17:35:47 -08004870int radio::sendEnvelopeResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004871 int responseType, int serial, RIL_Errno e,
4872 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004873#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004874 RLOGD("sendEnvelopeResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004875#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004876
4877 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004878 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004879 populateResponseInfo(responseInfo, serial, responseType, e);
4880 Return<void> retStatus
4881 = radioService[slotId]->mRadioResponse->sendEnvelopeResponse(responseInfo,
4882 convertCharPtrToHidlString((char *) response));
4883 radioService[slotId]->checkReturnStatus(retStatus);
4884 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004885 RLOGE("sendEnvelopeResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004886 }
4887
4888 return 0;
4889}
4890
Amit Mahajan759786a2017-03-03 17:35:47 -08004891int radio::sendTerminalResponseToSimResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004892 int responseType, int serial, RIL_Errno e,
4893 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004894#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004895 RLOGD("sendTerminalResponseToSimResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004896#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004897
4898 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004899 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004900 populateResponseInfo(responseInfo, serial, responseType, e);
4901 Return<void> retStatus
4902 = radioService[slotId]->mRadioResponse->sendTerminalResponseToSimResponse(
4903 responseInfo);
4904 radioService[slotId]->checkReturnStatus(retStatus);
4905 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004906 RLOGE("sendTerminalResponseToSimResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004907 slotId);
4908 }
4909
4910 return 0;
4911}
4912
Amit Mahajan759786a2017-03-03 17:35:47 -08004913int radio::handleStkCallSetupRequestFromSimResponse(int slotId,
4914 int responseType, int serial,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004915 RIL_Errno e, void *response,
4916 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004917#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004918 RLOGD("handleStkCallSetupRequestFromSimResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004919#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004920
4921 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004922 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004923 populateResponseInfo(responseInfo, serial, responseType, e);
4924 Return<void> retStatus
4925 = radioService[slotId]->mRadioResponse->handleStkCallSetupRequestFromSimResponse(
4926 responseInfo);
4927 radioService[slotId]->checkReturnStatus(retStatus);
4928 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004929 RLOGE("handleStkCallSetupRequestFromSimResponse: radioService[%d]->mRadioResponse "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004930 "== NULL", slotId);
4931 }
4932
4933 return 0;
4934}
4935
Amit Mahajan759786a2017-03-03 17:35:47 -08004936int radio::explicitCallTransferResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004937 int responseType, int serial, RIL_Errno e,
4938 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004939#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004940 RLOGD("explicitCallTransferResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004941#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004942
4943 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004944 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004945 populateResponseInfo(responseInfo, serial, responseType, e);
4946 Return<void> retStatus
4947 = radioService[slotId]->mRadioResponse->explicitCallTransferResponse(responseInfo);
4948 radioService[slotId]->checkReturnStatus(retStatus);
4949 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004950 RLOGE("explicitCallTransferResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004951 slotId);
4952 }
4953
4954 return 0;
4955}
4956
Amit Mahajan759786a2017-03-03 17:35:47 -08004957int radio::setPreferredNetworkTypeResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004958 int responseType, int serial, RIL_Errno e,
4959 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004960#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004961 RLOGD("setPreferredNetworkTypeResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004962#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004963
4964 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004965 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004966 populateResponseInfo(responseInfo, serial, responseType, e);
4967 Return<void> retStatus
4968 = radioService[slotId]->mRadioResponse->setPreferredNetworkTypeResponse(
4969 responseInfo);
4970 radioService[slotId]->checkReturnStatus(retStatus);
4971 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004972 RLOGE("setPreferredNetworkTypeResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004973 slotId);
4974 }
4975
4976 return 0;
4977}
4978
4979
Amit Mahajan759786a2017-03-03 17:35:47 -08004980int radio::getPreferredNetworkTypeResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004981 int responseType, int serial, RIL_Errno e,
4982 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004983#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004984 RLOGD("getPreferredNetworkTypeResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004985#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004986
4987 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004988 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004989 int ret = responseInt(responseInfo, serial, responseType, e, response, responseLen);
4990 Return<void> retStatus
4991 = radioService[slotId]->mRadioResponse->getPreferredNetworkTypeResponse(
4992 responseInfo, (PreferredNetworkType) ret);
4993 radioService[slotId]->checkReturnStatus(retStatus);
4994 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004995 RLOGE("getPreferredNetworkTypeResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004996 slotId);
4997 }
4998
4999 return 0;
5000}
5001
Amit Mahajan759786a2017-03-03 17:35:47 -08005002int radio::getNeighboringCidsResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005003 int responseType, int serial, RIL_Errno e,
5004 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005005#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005006 RLOGD("getNeighboringCidsResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005007#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005008
5009 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005010 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005011 populateResponseInfo(responseInfo, serial, responseType, e);
5012 hidl_vec<NeighboringCell> cells;
5013
Amit Mahajan13058cb2017-06-07 23:10:27 -07005014 if ((response == NULL && responseLen != 0)
5015 || responseLen % sizeof(RIL_NeighboringCell *) != 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005016 RLOGE("getNeighboringCidsResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005017 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
5018 } else {
5019 int num = responseLen / sizeof(RIL_NeighboringCell *);
5020 cells.resize(num);
5021 for (int i = 0 ; i < num; i++) {
5022 RIL_NeighboringCell *resp = ((RIL_NeighboringCell **) response)[i];
5023 cells[i].cid = convertCharPtrToHidlString(resp->cid);
5024 cells[i].rssi = resp->rssi;
5025 }
5026 }
5027
5028 Return<void> retStatus
5029 = radioService[slotId]->mRadioResponse->getNeighboringCidsResponse(responseInfo,
5030 cells);
5031 radioService[slotId]->checkReturnStatus(retStatus);
5032 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005033 RLOGE("getNeighboringCidsResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005034 slotId);
5035 }
5036
5037 return 0;
5038}
5039
Amit Mahajan759786a2017-03-03 17:35:47 -08005040int radio::setLocationUpdatesResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005041 int responseType, int serial, RIL_Errno e,
5042 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005043#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005044 RLOGD("setLocationUpdatesResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005045#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005046
5047 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005048 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005049 populateResponseInfo(responseInfo, serial, responseType, e);
5050 Return<void> retStatus
5051 = radioService[slotId]->mRadioResponse->setLocationUpdatesResponse(responseInfo);
5052 radioService[slotId]->checkReturnStatus(retStatus);
5053 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005054 RLOGE("setLocationUpdatesResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005055 slotId);
5056 }
5057
5058 return 0;
5059}
5060
Amit Mahajan759786a2017-03-03 17:35:47 -08005061int radio::setCdmaSubscriptionSourceResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005062 int responseType, int serial, RIL_Errno e,
5063 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005064#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005065 RLOGD("setCdmaSubscriptionSourceResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005066#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005067
5068 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005069 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005070 populateResponseInfo(responseInfo, serial, responseType, e);
5071 Return<void> retStatus
5072 = radioService[slotId]->mRadioResponse->setCdmaSubscriptionSourceResponse(
5073 responseInfo);
5074 radioService[slotId]->checkReturnStatus(retStatus);
5075 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005076 RLOGE("setCdmaSubscriptionSourceResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005077 slotId);
5078 }
5079
5080 return 0;
5081}
5082
Amit Mahajan759786a2017-03-03 17:35:47 -08005083int radio::setCdmaRoamingPreferenceResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005084 int responseType, int serial, RIL_Errno e,
5085 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005086#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005087 RLOGD("setCdmaRoamingPreferenceResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005088#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005089
5090 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005091 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005092 populateResponseInfo(responseInfo, serial, responseType, e);
5093 Return<void> retStatus
5094 = radioService[slotId]->mRadioResponse->setCdmaRoamingPreferenceResponse(
5095 responseInfo);
5096 radioService[slotId]->checkReturnStatus(retStatus);
5097 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005098 RLOGE("setCdmaRoamingPreferenceResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005099 slotId);
5100 }
5101
5102 return 0;
5103}
5104
Amit Mahajan759786a2017-03-03 17:35:47 -08005105int radio::getCdmaRoamingPreferenceResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005106 int responseType, int serial, RIL_Errno e,
5107 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005108#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005109 RLOGD("getCdmaRoamingPreferenceResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005110#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005111
5112 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005113 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005114 int ret = responseInt(responseInfo, serial, responseType, e, response, responseLen);
5115 Return<void> retStatus
5116 = radioService[slotId]->mRadioResponse->getCdmaRoamingPreferenceResponse(
5117 responseInfo, (CdmaRoamingType) ret);
5118 radioService[slotId]->checkReturnStatus(retStatus);
5119 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005120 RLOGE("getCdmaRoamingPreferenceResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005121 slotId);
5122 }
5123
5124 return 0;
5125}
5126
Amit Mahajan759786a2017-03-03 17:35:47 -08005127int radio::setTTYModeResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005128 int responseType, int serial, RIL_Errno e,
5129 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005130#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005131 RLOGD("setTTYModeResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005132#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005133
5134 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005135 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005136 populateResponseInfo(responseInfo, serial, responseType, e);
5137 Return<void> retStatus
5138 = radioService[slotId]->mRadioResponse->setTTYModeResponse(responseInfo);
5139 radioService[slotId]->checkReturnStatus(retStatus);
5140 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005141 RLOGE("setTTYModeResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005142 }
5143
5144 return 0;
5145}
5146
Amit Mahajan759786a2017-03-03 17:35:47 -08005147int radio::getTTYModeResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005148 int responseType, int serial, RIL_Errno e,
5149 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005150#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005151 RLOGD("getTTYModeResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005152#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005153
5154 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005155 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005156 int ret = responseInt(responseInfo, serial, responseType, e, response, responseLen);
5157 Return<void> retStatus
5158 = radioService[slotId]->mRadioResponse->getTTYModeResponse(responseInfo,
5159 (TtyMode) ret);
5160 radioService[slotId]->checkReturnStatus(retStatus);
5161 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005162 RLOGE("getTTYModeResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005163 }
5164
5165 return 0;
5166}
5167
Amit Mahajan759786a2017-03-03 17:35:47 -08005168int radio::setPreferredVoicePrivacyResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005169 int responseType, int serial, RIL_Errno e,
5170 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005171#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005172 RLOGD("setPreferredVoicePrivacyResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005173#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005174
5175 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005176 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005177 populateResponseInfo(responseInfo, serial, responseType, e);
5178 Return<void> retStatus
5179 = radioService[slotId]->mRadioResponse->setPreferredVoicePrivacyResponse(
5180 responseInfo);
5181 radioService[slotId]->checkReturnStatus(retStatus);
5182 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005183 RLOGE("setPreferredVoicePrivacyResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005184 slotId);
5185 }
5186
5187 return 0;
5188}
5189
Amit Mahajan759786a2017-03-03 17:35:47 -08005190int radio::getPreferredVoicePrivacyResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005191 int responseType, int serial, RIL_Errno e,
5192 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005193#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005194 RLOGD("getPreferredVoicePrivacyResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005195#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005196
5197 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005198 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005199 populateResponseInfo(responseInfo, serial, responseType, e);
5200 bool enable = false;
5201 int numInts = responseLen / sizeof(int);
5202 if (response == NULL || numInts != 1) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005203 RLOGE("getPreferredVoicePrivacyResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005204 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
5205 } else {
5206 int *pInt = (int *) response;
5207 enable = pInt[0] == 1 ? true : false;
5208 }
5209 Return<void> retStatus
5210 = radioService[slotId]->mRadioResponse->getPreferredVoicePrivacyResponse(
5211 responseInfo, enable);
5212 radioService[slotId]->checkReturnStatus(retStatus);
5213 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005214 RLOGE("getPreferredVoicePrivacyResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005215 slotId);
5216 }
5217
5218 return 0;
5219}
5220
Amit Mahajan759786a2017-03-03 17:35:47 -08005221int radio::sendCDMAFeatureCodeResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005222 int responseType, int serial, RIL_Errno e,
5223 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005224#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005225 RLOGD("sendCDMAFeatureCodeResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005226#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005227
5228 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005229 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005230 populateResponseInfo(responseInfo, serial, responseType, e);
5231 Return<void> retStatus
5232 = radioService[slotId]->mRadioResponse->sendCDMAFeatureCodeResponse(responseInfo);
5233 radioService[slotId]->checkReturnStatus(retStatus);
5234 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005235 RLOGE("sendCDMAFeatureCodeResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005236 slotId);
5237 }
5238
5239 return 0;
5240}
5241
Amit Mahajan759786a2017-03-03 17:35:47 -08005242int radio::sendBurstDtmfResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005243 int responseType, int serial, RIL_Errno e,
5244 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005245#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005246 RLOGD("sendBurstDtmfResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005247#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005248
5249 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005250 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005251 populateResponseInfo(responseInfo, serial, responseType, e);
5252 Return<void> retStatus
5253 = radioService[slotId]->mRadioResponse->sendBurstDtmfResponse(responseInfo);
5254 radioService[slotId]->checkReturnStatus(retStatus);
5255 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005256 RLOGE("sendBurstDtmfResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005257 }
5258
5259 return 0;
5260}
5261
Amit Mahajan759786a2017-03-03 17:35:47 -08005262int radio::sendCdmaSmsResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005263 int responseType, int serial, RIL_Errno e, void *response,
5264 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005265#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005266 RLOGD("sendCdmaSmsResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005267#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005268
5269 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005270 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005271 SendSmsResult result = makeSendSmsResult(responseInfo, serial, responseType, e, response,
5272 responseLen);
5273
5274 Return<void> retStatus
5275 = radioService[slotId]->mRadioResponse->sendCdmaSmsResponse(responseInfo, result);
5276 radioService[slotId]->checkReturnStatus(retStatus);
5277 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005278 RLOGE("sendCdmaSmsResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005279 }
5280
5281 return 0;
5282}
5283
Amit Mahajan759786a2017-03-03 17:35:47 -08005284int radio::acknowledgeLastIncomingCdmaSmsResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005285 int responseType, int serial, RIL_Errno e,
5286 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005287#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005288 RLOGD("acknowledgeLastIncomingCdmaSmsResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005289#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005290
5291 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005292 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005293 populateResponseInfo(responseInfo, serial, responseType, e);
5294 Return<void> retStatus
5295 = radioService[slotId]->mRadioResponse->acknowledgeLastIncomingCdmaSmsResponse(
5296 responseInfo);
5297 radioService[slotId]->checkReturnStatus(retStatus);
5298 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005299 RLOGE("acknowledgeLastIncomingCdmaSmsResponse: radioService[%d]->mRadioResponse "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005300 "== NULL", slotId);
5301 }
5302
5303 return 0;
5304}
5305
Amit Mahajan759786a2017-03-03 17:35:47 -08005306int radio::getGsmBroadcastConfigResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005307 int responseType, int serial, RIL_Errno e,
5308 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005309#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005310 RLOGD("getGsmBroadcastConfigResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005311#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005312
5313 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005314 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005315 populateResponseInfo(responseInfo, serial, responseType, e);
5316 hidl_vec<GsmBroadcastSmsConfigInfo> configs;
5317
Amit Mahajan13058cb2017-06-07 23:10:27 -07005318 if ((response == NULL && responseLen != 0)
5319 || responseLen % sizeof(RIL_GSM_BroadcastSmsConfigInfo *) != 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005320 RLOGE("getGsmBroadcastConfigResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005321 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
5322 } else {
5323 int num = responseLen / sizeof(RIL_GSM_BroadcastSmsConfigInfo *);
5324 configs.resize(num);
5325 for (int i = 0 ; i < num; i++) {
5326 RIL_GSM_BroadcastSmsConfigInfo *resp =
5327 ((RIL_GSM_BroadcastSmsConfigInfo **) response)[i];
5328 configs[i].fromServiceId = resp->fromServiceId;
5329 configs[i].toServiceId = resp->toServiceId;
5330 configs[i].fromCodeScheme = resp->fromCodeScheme;
5331 configs[i].toCodeScheme = resp->toCodeScheme;
5332 configs[i].selected = resp->selected == 1 ? true : false;
5333 }
5334 }
5335
5336 Return<void> retStatus
5337 = radioService[slotId]->mRadioResponse->getGsmBroadcastConfigResponse(responseInfo,
5338 configs);
5339 radioService[slotId]->checkReturnStatus(retStatus);
5340 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005341 RLOGE("getGsmBroadcastConfigResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005342 slotId);
5343 }
5344
5345 return 0;
5346}
5347
Amit Mahajan759786a2017-03-03 17:35:47 -08005348int radio::setGsmBroadcastConfigResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005349 int responseType, int serial, RIL_Errno e,
5350 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005351#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005352 RLOGD("setGsmBroadcastConfigResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005353#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005354
5355 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005356 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005357 populateResponseInfo(responseInfo, serial, responseType, e);
5358 Return<void> retStatus
5359 = radioService[slotId]->mRadioResponse->setGsmBroadcastConfigResponse(responseInfo);
5360 radioService[slotId]->checkReturnStatus(retStatus);
5361 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005362 RLOGE("setGsmBroadcastConfigResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005363 slotId);
5364 }
5365
5366 return 0;
5367}
5368
Amit Mahajan759786a2017-03-03 17:35:47 -08005369int radio::setGsmBroadcastActivationResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005370 int responseType, int serial, RIL_Errno e,
5371 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005372#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005373 RLOGD("setGsmBroadcastActivationResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005374#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005375
5376 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005377 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005378 populateResponseInfo(responseInfo, serial, responseType, e);
5379 Return<void> retStatus
5380 = radioService[slotId]->mRadioResponse->setGsmBroadcastActivationResponse(
5381 responseInfo);
5382 radioService[slotId]->checkReturnStatus(retStatus);
5383 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005384 RLOGE("setGsmBroadcastActivationResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005385 slotId);
5386 }
5387
5388 return 0;
5389}
5390
Amit Mahajan759786a2017-03-03 17:35:47 -08005391int radio::getCdmaBroadcastConfigResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005392 int responseType, int serial, RIL_Errno e,
5393 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005394#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005395 RLOGD("getCdmaBroadcastConfigResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005396#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005397
5398 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005399 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005400 populateResponseInfo(responseInfo, serial, responseType, e);
5401 hidl_vec<CdmaBroadcastSmsConfigInfo> configs;
5402
Amit Mahajan13058cb2017-06-07 23:10:27 -07005403 if ((response == NULL && responseLen != 0)
5404 || responseLen % sizeof(RIL_CDMA_BroadcastSmsConfigInfo *) != 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005405 RLOGE("getCdmaBroadcastConfigResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005406 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
5407 } else {
5408 int num = responseLen / sizeof(RIL_CDMA_BroadcastSmsConfigInfo *);
5409 configs.resize(num);
5410 for (int i = 0 ; i < num; i++) {
5411 RIL_CDMA_BroadcastSmsConfigInfo *resp =
5412 ((RIL_CDMA_BroadcastSmsConfigInfo **) response)[i];
5413 configs[i].serviceCategory = resp->service_category;
5414 configs[i].language = resp->language;
5415 configs[i].selected = resp->selected == 1 ? true : false;
5416 }
5417 }
5418
5419 Return<void> retStatus
5420 = radioService[slotId]->mRadioResponse->getCdmaBroadcastConfigResponse(responseInfo,
5421 configs);
5422 radioService[slotId]->checkReturnStatus(retStatus);
5423 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005424 RLOGE("getCdmaBroadcastConfigResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005425 slotId);
5426 }
5427
5428 return 0;
5429}
5430
Amit Mahajan759786a2017-03-03 17:35:47 -08005431int radio::setCdmaBroadcastConfigResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005432 int responseType, int serial, RIL_Errno e,
5433 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005434#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005435 RLOGD("setCdmaBroadcastConfigResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005436#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005437
5438 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005439 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005440 populateResponseInfo(responseInfo, serial, responseType, e);
5441 Return<void> retStatus
5442 = radioService[slotId]->mRadioResponse->setCdmaBroadcastConfigResponse(
5443 responseInfo);
5444 radioService[slotId]->checkReturnStatus(retStatus);
5445 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005446 RLOGE("setCdmaBroadcastConfigResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005447 slotId);
5448 }
5449
5450 return 0;
5451}
5452
Amit Mahajan759786a2017-03-03 17:35:47 -08005453int radio::setCdmaBroadcastActivationResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005454 int responseType, int serial, RIL_Errno e,
5455 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005456#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005457 RLOGD("setCdmaBroadcastActivationResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005458#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005459
5460 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005461 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005462 populateResponseInfo(responseInfo, serial, responseType, e);
5463 Return<void> retStatus
5464 = radioService[slotId]->mRadioResponse->setCdmaBroadcastActivationResponse(
5465 responseInfo);
5466 radioService[slotId]->checkReturnStatus(retStatus);
5467 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005468 RLOGE("setCdmaBroadcastActivationResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005469 slotId);
5470 }
5471
5472 return 0;
5473}
5474
Amit Mahajan759786a2017-03-03 17:35:47 -08005475int radio::getCDMASubscriptionResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005476 int responseType, int serial, RIL_Errno e, void *response,
5477 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005478#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005479 RLOGD("getCDMASubscriptionResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005480#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005481
5482 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005483 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005484 populateResponseInfo(responseInfo, serial, responseType, e);
5485
5486 int numStrings = responseLen / sizeof(char *);
5487 hidl_string emptyString;
5488 if (response == NULL || numStrings != 5) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005489 RLOGE("getOperatorResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005490 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
5491 Return<void> retStatus
5492 = radioService[slotId]->mRadioResponse->getCDMASubscriptionResponse(
5493 responseInfo, emptyString, emptyString, emptyString, emptyString, emptyString);
5494 radioService[slotId]->checkReturnStatus(retStatus);
5495 } else {
5496 char **resp = (char **) response;
5497 Return<void> retStatus
5498 = radioService[slotId]->mRadioResponse->getCDMASubscriptionResponse(
5499 responseInfo,
5500 convertCharPtrToHidlString(resp[0]),
5501 convertCharPtrToHidlString(resp[1]),
5502 convertCharPtrToHidlString(resp[2]),
5503 convertCharPtrToHidlString(resp[3]),
5504 convertCharPtrToHidlString(resp[4]));
5505 radioService[slotId]->checkReturnStatus(retStatus);
5506 }
5507 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005508 RLOGE("getCDMASubscriptionResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005509 slotId);
5510 }
5511
5512 return 0;
5513}
5514
Amit Mahajan759786a2017-03-03 17:35:47 -08005515int radio::writeSmsToRuimResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005516 int responseType, int serial, RIL_Errno e,
5517 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005518#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005519 RLOGD("writeSmsToRuimResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005520#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005521
5522 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005523 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005524 int ret = responseInt(responseInfo, serial, responseType, e, response, responseLen);
5525 Return<void> retStatus
5526 = radioService[slotId]->mRadioResponse->writeSmsToRuimResponse(responseInfo, ret);
5527 radioService[slotId]->checkReturnStatus(retStatus);
5528 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005529 RLOGE("writeSmsToRuimResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005530 }
5531
5532 return 0;
5533}
5534
Amit Mahajan759786a2017-03-03 17:35:47 -08005535int radio::deleteSmsOnRuimResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005536 int responseType, int serial, RIL_Errno e,
5537 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005538#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005539 RLOGD("deleteSmsOnRuimResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005540#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005541
5542 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005543 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005544 populateResponseInfo(responseInfo, serial, responseType, e);
5545 Return<void> retStatus
5546 = radioService[slotId]->mRadioResponse->deleteSmsOnRuimResponse(responseInfo);
5547 radioService[slotId]->checkReturnStatus(retStatus);
5548 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005549 RLOGE("deleteSmsOnRuimResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005550 }
5551
5552 return 0;
5553}
5554
Amit Mahajan759786a2017-03-03 17:35:47 -08005555int radio::getDeviceIdentityResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005556 int responseType, int serial, RIL_Errno e, void *response,
5557 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005558#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005559 RLOGD("getDeviceIdentityResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005560#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005561
5562 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005563 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005564 populateResponseInfo(responseInfo, serial, responseType, e);
5565
5566 int numStrings = responseLen / sizeof(char *);
5567 hidl_string emptyString;
5568 if (response == NULL || numStrings != 4) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005569 RLOGE("getDeviceIdentityResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005570 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
5571 Return<void> retStatus
5572 = radioService[slotId]->mRadioResponse->getDeviceIdentityResponse(responseInfo,
5573 emptyString, emptyString, emptyString, emptyString);
5574 radioService[slotId]->checkReturnStatus(retStatus);
5575 } else {
5576 char **resp = (char **) response;
5577 Return<void> retStatus
5578 = radioService[slotId]->mRadioResponse->getDeviceIdentityResponse(responseInfo,
5579 convertCharPtrToHidlString(resp[0]),
5580 convertCharPtrToHidlString(resp[1]),
5581 convertCharPtrToHidlString(resp[2]),
5582 convertCharPtrToHidlString(resp[3]));
5583 radioService[slotId]->checkReturnStatus(retStatus);
5584 }
5585 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005586 RLOGE("getDeviceIdentityResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005587 slotId);
5588 }
5589
5590 return 0;
5591}
5592
Amit Mahajan759786a2017-03-03 17:35:47 -08005593int radio::exitEmergencyCallbackModeResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005594 int responseType, int serial, RIL_Errno e,
5595 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005596#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005597 RLOGD("exitEmergencyCallbackModeResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005598#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005599
5600 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005601 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005602 populateResponseInfo(responseInfo, serial, responseType, e);
5603 Return<void> retStatus
5604 = radioService[slotId]->mRadioResponse->exitEmergencyCallbackModeResponse(
5605 responseInfo);
5606 radioService[slotId]->checkReturnStatus(retStatus);
5607 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005608 RLOGE("exitEmergencyCallbackModeResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005609 slotId);
5610 }
5611
5612 return 0;
5613}
5614
Amit Mahajan759786a2017-03-03 17:35:47 -08005615int radio::getSmscAddressResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005616 int responseType, int serial, RIL_Errno e,
5617 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005618#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005619 RLOGD("getSmscAddressResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005620#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005621
5622 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005623 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005624 populateResponseInfo(responseInfo, serial, responseType, e);
5625 Return<void> retStatus
5626 = radioService[slotId]->mRadioResponse->getSmscAddressResponse(responseInfo,
5627 convertCharPtrToHidlString((char *) response));
5628 radioService[slotId]->checkReturnStatus(retStatus);
5629 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005630 RLOGE("getSmscAddressResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005631 }
5632
5633 return 0;
5634}
5635
Amit Mahajan759786a2017-03-03 17:35:47 -08005636int radio::setSmscAddressResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005637 int responseType, int serial, RIL_Errno e,
5638 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005639#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005640 RLOGD("setSmscAddressResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005641#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005642
5643 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005644 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005645 populateResponseInfo(responseInfo, serial, responseType, e);
5646 Return<void> retStatus
5647 = radioService[slotId]->mRadioResponse->setSmscAddressResponse(responseInfo);
5648 radioService[slotId]->checkReturnStatus(retStatus);
5649 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005650 RLOGE("setSmscAddressResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005651 }
5652
5653 return 0;
5654}
5655
Amit Mahajan759786a2017-03-03 17:35:47 -08005656int radio::reportSmsMemoryStatusResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005657 int responseType, int serial, RIL_Errno e,
5658 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005659#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005660 RLOGD("reportSmsMemoryStatusResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005661#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005662
5663 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005664 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005665 populateResponseInfo(responseInfo, serial, responseType, e);
5666 Return<void> retStatus
5667 = radioService[slotId]->mRadioResponse->reportSmsMemoryStatusResponse(responseInfo);
5668 radioService[slotId]->checkReturnStatus(retStatus);
5669 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005670 RLOGE("reportSmsMemoryStatusResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005671 slotId);
5672 }
5673
5674 return 0;
5675}
5676
Amit Mahajan759786a2017-03-03 17:35:47 -08005677int radio::reportStkServiceIsRunningResponse(int slotId,
Amit Mahajan5007ffa2017-01-31 17:14:42 -08005678 int responseType, int serial, RIL_Errno e,
5679 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005680#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005681 RLOGD("reportStkServiceIsRunningResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005682#endif
Amit Mahajan5007ffa2017-01-31 17:14:42 -08005683
5684 if (radioService[slotId]->mRadioResponse != NULL) {
Amit Mahajan3da9ac02017-02-13 13:41:28 -08005685 RadioResponseInfo responseInfo = {};
Amit Mahajan5007ffa2017-01-31 17:14:42 -08005686 populateResponseInfo(responseInfo, serial, responseType, e);
5687 Return<void> retStatus = radioService[slotId]->mRadioResponse->
5688 reportStkServiceIsRunningResponse(responseInfo);
5689 radioService[slotId]->checkReturnStatus(retStatus);
5690 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005691 RLOGE("reportStkServiceIsRunningResponse: radioService[%d]->mRadioResponse == NULL",
Amit Mahajan5007ffa2017-01-31 17:14:42 -08005692 slotId);
5693 }
5694
5695 return 0;
5696}
5697
Amit Mahajan759786a2017-03-03 17:35:47 -08005698int radio::getCdmaSubscriptionSourceResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005699 int responseType, int serial, RIL_Errno e,
5700 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005701#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005702 RLOGD("getCdmaSubscriptionSourceResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005703#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005704
5705 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005706 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005707 int ret = responseInt(responseInfo, serial, responseType, e, response, responseLen);
5708 Return<void> retStatus
5709 = radioService[slotId]->mRadioResponse->getCdmaSubscriptionSourceResponse(
5710 responseInfo, (CdmaSubscriptionSource) ret);
5711 radioService[slotId]->checkReturnStatus(retStatus);
5712 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005713 RLOGE("getCdmaSubscriptionSourceResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005714 slotId);
5715 }
5716
5717 return 0;
5718}
5719
Amit Mahajan759786a2017-03-03 17:35:47 -08005720int radio::requestIsimAuthenticationResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005721 int responseType, int serial, RIL_Errno e,
5722 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005723#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005724 RLOGD("requestIsimAuthenticationResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005725#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005726
5727 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005728 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005729 populateResponseInfo(responseInfo, serial, responseType, e);
5730 Return<void> retStatus
5731 = radioService[slotId]->mRadioResponse->requestIsimAuthenticationResponse(
5732 responseInfo,
5733 convertCharPtrToHidlString((char *) response));
5734 radioService[slotId]->checkReturnStatus(retStatus);
5735 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005736 RLOGE("requestIsimAuthenticationResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005737 slotId);
5738 }
5739
5740 return 0;
5741}
5742
Amit Mahajan759786a2017-03-03 17:35:47 -08005743int radio::acknowledgeIncomingGsmSmsWithPduResponse(int slotId,
5744 int responseType,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005745 int serial, RIL_Errno e, void *response,
5746 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005747#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005748 RLOGD("acknowledgeIncomingGsmSmsWithPduResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005749#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005750
5751 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005752 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005753 populateResponseInfo(responseInfo, serial, responseType, e);
5754 Return<void> retStatus
5755 = radioService[slotId]->mRadioResponse->acknowledgeIncomingGsmSmsWithPduResponse(
5756 responseInfo);
5757 radioService[slotId]->checkReturnStatus(retStatus);
5758 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005759 RLOGE("acknowledgeIncomingGsmSmsWithPduResponse: radioService[%d]->mRadioResponse "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005760 "== NULL", slotId);
5761 }
5762
5763 return 0;
5764}
5765
Amit Mahajan759786a2017-03-03 17:35:47 -08005766int radio::sendEnvelopeWithStatusResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005767 int responseType, int serial, RIL_Errno e, void *response,
5768 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005769#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005770 RLOGD("sendEnvelopeWithStatusResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005771#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005772
5773 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005774 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005775 IccIoResult result = responseIccIo(responseInfo, serial, responseType, e,
5776 response, responseLen);
5777
5778 Return<void> retStatus
5779 = radioService[slotId]->mRadioResponse->sendEnvelopeWithStatusResponse(responseInfo,
5780 result);
5781 radioService[slotId]->checkReturnStatus(retStatus);
5782 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005783 RLOGE("sendEnvelopeWithStatusResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005784 slotId);
5785 }
5786
5787 return 0;
5788}
5789
Amit Mahajan759786a2017-03-03 17:35:47 -08005790int radio::getVoiceRadioTechnologyResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005791 int responseType, int serial, RIL_Errno e,
5792 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005793#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005794 RLOGD("getVoiceRadioTechnologyResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005795#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005796
5797 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005798 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005799 int ret = responseInt(responseInfo, serial, responseType, e, response, responseLen);
5800 Return<void> retStatus
5801 = radioService[slotId]->mRadioResponse->getVoiceRadioTechnologyResponse(
5802 responseInfo, (RadioTechnology) ret);
5803 radioService[slotId]->checkReturnStatus(retStatus);
5804 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005805 RLOGE("getVoiceRadioTechnologyResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005806 slotId);
5807 }
5808
5809 return 0;
5810}
5811
Amit Mahajan759786a2017-03-03 17:35:47 -08005812int radio::getCellInfoListResponse(int slotId,
5813 int responseType,
Amit Mahajan3df62912017-02-10 01:35:55 +00005814 int serial, RIL_Errno e, void *response,
5815 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005816#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005817 RLOGD("getCellInfoListResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005818#endif
Amit Mahajan3df62912017-02-10 01:35:55 +00005819
5820 if (radioService[slotId]->mRadioResponse != NULL) {
Amit Mahajan3da9ac02017-02-13 13:41:28 -08005821 RadioResponseInfo responseInfo = {};
Amit Mahajan3df62912017-02-10 01:35:55 +00005822 populateResponseInfo(responseInfo, serial, responseType, e);
5823
5824 hidl_vec<CellInfo> ret;
Amit Mahajan13058cb2017-06-07 23:10:27 -07005825 if ((response == NULL && responseLen != 0)
5826 || responseLen % sizeof(RIL_CellInfo_v12) != 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005827 RLOGE("getCellInfoListResponse: Invalid response");
Amit Mahajan3df62912017-02-10 01:35:55 +00005828 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
5829 } else {
5830 convertRilCellInfoListToHal(response, responseLen, ret);
5831 }
5832
5833 Return<void> retStatus = radioService[slotId]->mRadioResponse->getCellInfoListResponse(
5834 responseInfo, ret);
5835 radioService[slotId]->checkReturnStatus(retStatus);
5836 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005837 RLOGE("getCellInfoListResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Amit Mahajan3df62912017-02-10 01:35:55 +00005838 }
5839
5840 return 0;
5841}
5842
Amit Mahajan759786a2017-03-03 17:35:47 -08005843int radio::setCellInfoListRateResponse(int slotId,
5844 int responseType,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005845 int serial, RIL_Errno e, void *response,
5846 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005847#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005848 RLOGD("setCellInfoListRateResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005849#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005850
5851 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005852 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005853 populateResponseInfo(responseInfo, serial, responseType, e);
5854 Return<void> retStatus
5855 = radioService[slotId]->mRadioResponse->setCellInfoListRateResponse(responseInfo);
5856 radioService[slotId]->checkReturnStatus(retStatus);
5857 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005858 RLOGE("setCellInfoListRateResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005859 slotId);
5860 }
5861
5862 return 0;
5863}
5864
Amit Mahajan759786a2017-03-03 17:35:47 -08005865int radio::setInitialAttachApnResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005866 int responseType, int serial, RIL_Errno e,
5867 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005868#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005869 RLOGD("setInitialAttachApnResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005870#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005871
5872 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005873 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005874 populateResponseInfo(responseInfo, serial, responseType, e);
5875 Return<void> retStatus
5876 = radioService[slotId]->mRadioResponse->setInitialAttachApnResponse(responseInfo);
5877 radioService[slotId]->checkReturnStatus(retStatus);
5878 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005879 RLOGE("setInitialAttachApnResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005880 slotId);
5881 }
5882
5883 return 0;
5884}
5885
Amit Mahajan759786a2017-03-03 17:35:47 -08005886int radio::getImsRegistrationStateResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005887 int responseType, int serial, RIL_Errno e,
5888 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005889#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005890 RLOGD("getImsRegistrationStateResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005891#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005892
5893 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005894 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005895 populateResponseInfo(responseInfo, serial, responseType, e);
5896 bool isRegistered = false;
5897 int ratFamily = 0;
5898 int numInts = responseLen / sizeof(int);
5899 if (response == NULL || numInts != 2) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005900 RLOGE("getImsRegistrationStateResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005901 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
5902 } else {
5903 int *pInt = (int *) response;
5904 isRegistered = pInt[0] == 1 ? true : false;
5905 ratFamily = pInt[1];
5906 }
5907 Return<void> retStatus
5908 = radioService[slotId]->mRadioResponse->getImsRegistrationStateResponse(
5909 responseInfo, isRegistered, (RadioTechnologyFamily) ratFamily);
5910 radioService[slotId]->checkReturnStatus(retStatus);
5911 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005912 RLOGE("getImsRegistrationStateResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005913 slotId);
5914 }
5915
5916 return 0;
5917}
5918
Amit Mahajan759786a2017-03-03 17:35:47 -08005919int radio::sendImsSmsResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005920 int responseType, int serial, RIL_Errno e, void *response,
5921 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005922#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005923 RLOGD("sendImsSmsResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005924#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005925
5926 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005927 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005928 SendSmsResult result = makeSendSmsResult(responseInfo, serial, responseType, e, response,
5929 responseLen);
5930
5931 Return<void> retStatus
5932 = radioService[slotId]->mRadioResponse->sendImsSmsResponse(responseInfo, result);
5933 radioService[slotId]->checkReturnStatus(retStatus);
5934 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005935 RLOGE("sendSmsResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005936 }
5937
5938 return 0;
5939}
5940
Amit Mahajan759786a2017-03-03 17:35:47 -08005941int radio::iccTransmitApduBasicChannelResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005942 int responseType, int serial, RIL_Errno e,
5943 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005944#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005945 RLOGD("iccTransmitApduBasicChannelResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005946#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005947
5948 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005949 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005950 IccIoResult result = responseIccIo(responseInfo, serial, responseType, e, response,
5951 responseLen);
5952
5953 Return<void> retStatus
5954 = radioService[slotId]->mRadioResponse->iccTransmitApduBasicChannelResponse(
5955 responseInfo, result);
5956 radioService[slotId]->checkReturnStatus(retStatus);
5957 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005958 RLOGE("iccTransmitApduBasicChannelResponse: radioService[%d]->mRadioResponse "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005959 "== NULL", slotId);
5960 }
5961
5962 return 0;
5963}
5964
Amit Mahajan759786a2017-03-03 17:35:47 -08005965int radio::iccOpenLogicalChannelResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005966 int responseType, int serial, RIL_Errno e, void *response,
5967 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005968#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005969 RLOGD("iccOpenLogicalChannelResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005970#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005971
5972 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005973 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005974 populateResponseInfo(responseInfo, serial, responseType, e);
5975 int channelId = -1;
5976 hidl_vec<int8_t> selectResponse;
5977 int numInts = responseLen / sizeof(int);
5978 if (response == NULL || responseLen % sizeof(int) != 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005979 RLOGE("iccOpenLogicalChannelResponse Invalid response: NULL");
Amit Mahajan13058cb2017-06-07 23:10:27 -07005980 if (response != NULL) {
5981 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
5982 }
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005983 } else {
5984 int *pInt = (int *) response;
5985 channelId = pInt[0];
5986 selectResponse.resize(numInts - 1);
5987 for (int i = 1; i < numInts; i++) {
5988 selectResponse[i - 1] = (int8_t) pInt[i];
5989 }
5990 }
5991 Return<void> retStatus
5992 = radioService[slotId]->mRadioResponse->iccOpenLogicalChannelResponse(responseInfo,
5993 channelId, selectResponse);
5994 radioService[slotId]->checkReturnStatus(retStatus);
5995 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005996 RLOGE("iccOpenLogicalChannelResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005997 slotId);
5998 }
5999
6000 return 0;
6001}
6002
Amit Mahajan759786a2017-03-03 17:35:47 -08006003int radio::iccCloseLogicalChannelResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006004 int responseType, int serial, RIL_Errno e,
6005 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006006#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006007 RLOGD("iccCloseLogicalChannelResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006008#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006009
6010 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08006011 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006012 populateResponseInfo(responseInfo, serial, responseType, e);
6013 Return<void> retStatus
6014 = radioService[slotId]->mRadioResponse->iccCloseLogicalChannelResponse(
6015 responseInfo);
6016 radioService[slotId]->checkReturnStatus(retStatus);
6017 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006018 RLOGE("iccCloseLogicalChannelResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006019 slotId);
6020 }
6021
6022 return 0;
6023}
6024
Amit Mahajan759786a2017-03-03 17:35:47 -08006025int radio::iccTransmitApduLogicalChannelResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006026 int responseType, int serial, RIL_Errno e,
6027 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006028#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006029 RLOGD("iccTransmitApduLogicalChannelResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006030#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006031
6032 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08006033 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006034 IccIoResult result = responseIccIo(responseInfo, serial, responseType, e, response,
6035 responseLen);
6036
6037 Return<void> retStatus
6038 = radioService[slotId]->mRadioResponse->iccTransmitApduLogicalChannelResponse(
6039 responseInfo, result);
6040 radioService[slotId]->checkReturnStatus(retStatus);
6041 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006042 RLOGE("iccTransmitApduLogicalChannelResponse: radioService[%d]->mRadioResponse "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006043 "== NULL", slotId);
6044 }
6045
6046 return 0;
6047}
6048
Amit Mahajan759786a2017-03-03 17:35:47 -08006049int radio::nvReadItemResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006050 int responseType, int serial, RIL_Errno e,
6051 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006052#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006053 RLOGD("nvReadItemResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006054#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006055
6056 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08006057 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006058 populateResponseInfo(responseInfo, serial, responseType, e);
6059 Return<void> retStatus = radioService[slotId]->mRadioResponse->nvReadItemResponse(
6060 responseInfo,
6061 convertCharPtrToHidlString((char *) response));
6062 radioService[slotId]->checkReturnStatus(retStatus);
6063 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006064 RLOGE("nvReadItemResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006065 }
6066
6067 return 0;
6068}
6069
Amit Mahajan759786a2017-03-03 17:35:47 -08006070int radio::nvWriteItemResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006071 int responseType, int serial, RIL_Errno e,
6072 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006073#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006074 RLOGD("nvWriteItemResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006075#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006076
6077 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08006078 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006079 populateResponseInfo(responseInfo, serial, responseType, e);
6080 Return<void> retStatus
6081 = radioService[slotId]->mRadioResponse->nvWriteItemResponse(responseInfo);
6082 radioService[slotId]->checkReturnStatus(retStatus);
6083 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006084 RLOGE("nvWriteItemResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006085 }
6086
6087 return 0;
6088}
6089
Amit Mahajan759786a2017-03-03 17:35:47 -08006090int radio::nvWriteCdmaPrlResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006091 int responseType, int serial, RIL_Errno e,
6092 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006093#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006094 RLOGD("nvWriteCdmaPrlResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006095#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006096
6097 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08006098 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006099 populateResponseInfo(responseInfo, serial, responseType, e);
6100 Return<void> retStatus
6101 = radioService[slotId]->mRadioResponse->nvWriteCdmaPrlResponse(responseInfo);
6102 radioService[slotId]->checkReturnStatus(retStatus);
6103 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006104 RLOGE("nvWriteCdmaPrlResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006105 }
6106
6107 return 0;
6108}
6109
Amit Mahajan759786a2017-03-03 17:35:47 -08006110int radio::nvResetConfigResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006111 int responseType, int serial, RIL_Errno e,
6112 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006113#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006114 RLOGD("nvResetConfigResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006115#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006116
6117 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08006118 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006119 populateResponseInfo(responseInfo, serial, responseType, e);
6120 Return<void> retStatus
6121 = radioService[slotId]->mRadioResponse->nvResetConfigResponse(responseInfo);
6122 radioService[slotId]->checkReturnStatus(retStatus);
6123 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006124 RLOGE("nvResetConfigResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006125 }
6126
6127 return 0;
6128}
6129
Amit Mahajan759786a2017-03-03 17:35:47 -08006130int radio::setUiccSubscriptionResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006131 int responseType, int serial, RIL_Errno e,
6132 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006133#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006134 RLOGD("setUiccSubscriptionResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006135#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006136
6137 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08006138 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006139 populateResponseInfo(responseInfo, serial, responseType, e);
6140 Return<void> retStatus
6141 = radioService[slotId]->mRadioResponse->setUiccSubscriptionResponse(responseInfo);
6142 radioService[slotId]->checkReturnStatus(retStatus);
6143 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006144 RLOGE("setUiccSubscriptionResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006145 slotId);
6146 }
6147
6148 return 0;
6149}
6150
Amit Mahajan759786a2017-03-03 17:35:47 -08006151int radio::setDataAllowedResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006152 int responseType, int serial, RIL_Errno e,
6153 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006154#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006155 RLOGD("setDataAllowedResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006156#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006157
6158 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08006159 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006160 populateResponseInfo(responseInfo, serial, responseType, e);
6161 Return<void> retStatus
6162 = radioService[slotId]->mRadioResponse->setDataAllowedResponse(responseInfo);
6163 radioService[slotId]->checkReturnStatus(retStatus);
6164 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006165 RLOGE("setDataAllowedResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006166 }
6167
6168 return 0;
6169}
6170
Amit Mahajan759786a2017-03-03 17:35:47 -08006171int radio::getHardwareConfigResponse(int slotId,
Amit Mahajan3df62912017-02-10 01:35:55 +00006172 int responseType, int serial, RIL_Errno e,
6173 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006174#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006175 RLOGD("getHardwareConfigResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006176#endif
Amit Mahajan3df62912017-02-10 01:35:55 +00006177
6178 if (radioService[slotId]->mRadioResponse != NULL) {
Amit Mahajan3da9ac02017-02-13 13:41:28 -08006179 RadioResponseInfo responseInfo = {};
Amit Mahajan3df62912017-02-10 01:35:55 +00006180 populateResponseInfo(responseInfo, serial, responseType, e);
6181
6182 hidl_vec<HardwareConfig> result;
Amit Mahajan13058cb2017-06-07 23:10:27 -07006183 if ((response == NULL && responseLen != 0)
6184 || responseLen % sizeof(RIL_HardwareConfig) != 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006185 RLOGE("hardwareConfigChangedInd: invalid response");
Amit Mahajan3df62912017-02-10 01:35:55 +00006186 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
6187 } else {
6188 convertRilHardwareConfigListToHal(response, responseLen, result);
6189 }
6190
6191 Return<void> retStatus = radioService[slotId]->mRadioResponse->getHardwareConfigResponse(
6192 responseInfo, result);
6193 radioService[slotId]->checkReturnStatus(retStatus);
6194 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006195 RLOGE("getHardwareConfigResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Amit Mahajan3df62912017-02-10 01:35:55 +00006196 }
6197
6198 return 0;
6199}
6200
Amit Mahajan759786a2017-03-03 17:35:47 -08006201int radio::requestIccSimAuthenticationResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006202 int responseType, int serial, RIL_Errno e,
6203 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006204#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006205 RLOGD("requestIccSimAuthenticationResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006206#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006207
6208 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08006209 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006210 IccIoResult result = responseIccIo(responseInfo, serial, responseType, e, response,
6211 responseLen);
6212
6213 Return<void> retStatus
6214 = radioService[slotId]->mRadioResponse->requestIccSimAuthenticationResponse(
6215 responseInfo, result);
6216 radioService[slotId]->checkReturnStatus(retStatus);
6217 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006218 RLOGE("requestIccSimAuthenticationResponse: radioService[%d]->mRadioResponse "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006219 "== NULL", slotId);
6220 }
6221
6222 return 0;
6223}
6224
Amit Mahajan759786a2017-03-03 17:35:47 -08006225int radio::setDataProfileResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006226 int responseType, int serial, RIL_Errno e,
6227 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006228#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006229 RLOGD("setDataProfileResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006230#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006231
6232 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08006233 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006234 populateResponseInfo(responseInfo, serial, responseType, e);
6235 Return<void> retStatus
6236 = radioService[slotId]->mRadioResponse->setDataProfileResponse(responseInfo);
6237 radioService[slotId]->checkReturnStatus(retStatus);
6238 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006239 RLOGE("setDataProfileResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006240 }
6241
6242 return 0;
6243}
6244
Amit Mahajan759786a2017-03-03 17:35:47 -08006245int radio::requestShutdownResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006246 int responseType, int serial, RIL_Errno e,
6247 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006248#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006249 RLOGD("requestShutdownResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006250#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006251
6252 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08006253 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006254 populateResponseInfo(responseInfo, serial, responseType, e);
6255 Return<void> retStatus
6256 = radioService[slotId]->mRadioResponse->requestShutdownResponse(responseInfo);
6257 radioService[slotId]->checkReturnStatus(retStatus);
6258 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006259 RLOGE("requestShutdownResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006260 }
6261
6262 return 0;
6263}
6264
Amit Mahajan3df62912017-02-10 01:35:55 +00006265void responseRadioCapability(RadioResponseInfo& responseInfo, int serial,
6266 int responseType, RIL_Errno e, void *response, size_t responseLen, RadioCapability& rc) {
6267 populateResponseInfo(responseInfo, serial, responseType, e);
6268
Amit Mahajan1fbff082017-02-24 11:24:39 -08006269 if (response == NULL || responseLen != sizeof(RIL_RadioCapability)) {
Amit Mahajan3df62912017-02-10 01:35:55 +00006270 RLOGE("responseRadioCapability: Invalid response");
6271 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
Amit Mahajan3da9ac02017-02-13 13:41:28 -08006272 rc.logicalModemUuid = hidl_string();
Amit Mahajan3df62912017-02-10 01:35:55 +00006273 } else {
6274 convertRilRadioCapabilityToHal(response, responseLen, rc);
6275 }
6276}
6277
Amit Mahajan759786a2017-03-03 17:35:47 -08006278int radio::getRadioCapabilityResponse(int slotId,
Amit Mahajan3df62912017-02-10 01:35:55 +00006279 int responseType, int serial, RIL_Errno e,
6280 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006281#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006282 RLOGD("getRadioCapabilityResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006283#endif
Amit Mahajan3df62912017-02-10 01:35:55 +00006284
6285 if (radioService[slotId]->mRadioResponse != NULL) {
Amit Mahajan3da9ac02017-02-13 13:41:28 -08006286 RadioResponseInfo responseInfo = {};
6287 RadioCapability result = {};
Amit Mahajan3df62912017-02-10 01:35:55 +00006288 responseRadioCapability(responseInfo, serial, responseType, e, response, responseLen,
6289 result);
6290 Return<void> retStatus = radioService[slotId]->mRadioResponse->getRadioCapabilityResponse(
6291 responseInfo, result);
6292 radioService[slotId]->checkReturnStatus(retStatus);
6293 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006294 RLOGE("getRadioCapabilityResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Amit Mahajan3df62912017-02-10 01:35:55 +00006295 }
6296
6297 return 0;
6298}
6299
Amit Mahajan759786a2017-03-03 17:35:47 -08006300int radio::setRadioCapabilityResponse(int slotId,
Amit Mahajan3df62912017-02-10 01:35:55 +00006301 int responseType, int serial, RIL_Errno e,
6302 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006303#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006304 RLOGD("setRadioCapabilityResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006305#endif
Amit Mahajan3df62912017-02-10 01:35:55 +00006306
6307 if (radioService[slotId]->mRadioResponse != NULL) {
Amit Mahajan3da9ac02017-02-13 13:41:28 -08006308 RadioResponseInfo responseInfo = {};
6309 RadioCapability result = {};
Amit Mahajan3df62912017-02-10 01:35:55 +00006310 responseRadioCapability(responseInfo, serial, responseType, e, response, responseLen,
6311 result);
6312 Return<void> retStatus = radioService[slotId]->mRadioResponse->setRadioCapabilityResponse(
6313 responseInfo, result);
6314 radioService[slotId]->checkReturnStatus(retStatus);
6315 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006316 RLOGE("setRadioCapabilityResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Amit Mahajan3df62912017-02-10 01:35:55 +00006317 }
6318
6319 return 0;
6320}
6321
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006322LceStatusInfo responseLceStatusInfo(RadioResponseInfo& responseInfo, int serial, int responseType,
6323 RIL_Errno e, void *response, size_t responseLen) {
6324 populateResponseInfo(responseInfo, serial, responseType, e);
Jack Yuf68e0da2017-02-07 14:53:09 -08006325 LceStatusInfo result = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006326
6327 if (response == NULL || responseLen != sizeof(RIL_LceStatusInfo)) {
6328 RLOGE("Invalid response: NULL");
6329 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006330 } else {
6331 RIL_LceStatusInfo *resp = (RIL_LceStatusInfo *) response;
6332 result.lceStatus = (LceStatus) resp->lce_status;
6333 result.actualIntervalMs = (uint8_t) resp->actual_interval_ms;
6334 }
6335 return result;
6336}
6337
Amit Mahajan759786a2017-03-03 17:35:47 -08006338int radio::startLceServiceResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006339 int responseType, int serial, RIL_Errno e,
6340 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006341#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006342 RLOGD("startLceServiceResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006343#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006344
6345 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08006346 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006347 LceStatusInfo result = responseLceStatusInfo(responseInfo, serial, responseType, e,
6348 response, responseLen);
6349
6350 Return<void> retStatus
6351 = radioService[slotId]->mRadioResponse->startLceServiceResponse(responseInfo,
6352 result);
6353 radioService[slotId]->checkReturnStatus(retStatus);
6354 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006355 RLOGE("startLceServiceResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006356 }
6357
6358 return 0;
6359}
6360
Amit Mahajan759786a2017-03-03 17:35:47 -08006361int radio::stopLceServiceResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006362 int responseType, int serial, RIL_Errno e,
6363 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006364#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006365 RLOGD("stopLceServiceResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006366#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006367
6368 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08006369 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006370 LceStatusInfo result = responseLceStatusInfo(responseInfo, serial, responseType, e,
6371 response, responseLen);
6372
6373 Return<void> retStatus
6374 = radioService[slotId]->mRadioResponse->stopLceServiceResponse(responseInfo,
6375 result);
6376 radioService[slotId]->checkReturnStatus(retStatus);
6377 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006378 RLOGE("stopLceServiceResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006379 }
6380
6381 return 0;
6382}
6383
Amit Mahajan759786a2017-03-03 17:35:47 -08006384int radio::pullLceDataResponse(int slotId,
Amit Mahajan3df62912017-02-10 01:35:55 +00006385 int responseType, int serial, RIL_Errno e,
6386 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006387#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006388 RLOGD("pullLceDataResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006389#endif
Amit Mahajan3df62912017-02-10 01:35:55 +00006390
6391 if (radioService[slotId]->mRadioResponse != NULL) {
Amit Mahajan3da9ac02017-02-13 13:41:28 -08006392 RadioResponseInfo responseInfo = {};
Amit Mahajan3df62912017-02-10 01:35:55 +00006393 populateResponseInfo(responseInfo, serial, responseType, e);
6394
Amit Mahajan3da9ac02017-02-13 13:41:28 -08006395 LceDataInfo result = {};
Amit Mahajan3df62912017-02-10 01:35:55 +00006396 if (response == NULL || responseLen != sizeof(RIL_LceDataInfo)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006397 RLOGE("pullLceDataResponse: Invalid response");
Amit Mahajan3df62912017-02-10 01:35:55 +00006398 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
Amit Mahajan3df62912017-02-10 01:35:55 +00006399 } else {
6400 convertRilLceDataInfoToHal(response, responseLen, result);
6401 }
6402
6403 Return<void> retStatus = radioService[slotId]->mRadioResponse->pullLceDataResponse(
6404 responseInfo, result);
6405 radioService[slotId]->checkReturnStatus(retStatus);
6406 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006407 RLOGE("pullLceDataResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Amit Mahajan3df62912017-02-10 01:35:55 +00006408 }
6409
6410 return 0;
6411}
6412
Amit Mahajan759786a2017-03-03 17:35:47 -08006413int radio::getModemActivityInfoResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006414 int responseType, int serial, RIL_Errno e,
6415 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006416#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006417 RLOGD("getModemActivityInfoResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006418#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006419
6420 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08006421 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006422 populateResponseInfo(responseInfo, serial, responseType, e);
6423 ActivityStatsInfo info;
6424 if (response == NULL || responseLen != sizeof(RIL_ActivityStatsInfo)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006425 RLOGE("getModemActivityInfoResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006426 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006427 } else {
6428 RIL_ActivityStatsInfo *resp = (RIL_ActivityStatsInfo *)response;
6429 info.sleepModeTimeMs = resp->sleep_mode_time_ms;
6430 info.idleModeTimeMs = resp->idle_mode_time_ms;
6431 for(int i = 0; i < RIL_NUM_TX_POWER_LEVELS; i++) {
6432 info.txmModetimeMs[i] = resp->tx_mode_time_ms[i];
6433 }
6434 info.rxModeTimeMs = resp->rx_mode_time_ms;
6435 }
6436
6437 Return<void> retStatus
6438 = radioService[slotId]->mRadioResponse->getModemActivityInfoResponse(responseInfo,
6439 info);
6440 radioService[slotId]->checkReturnStatus(retStatus);
6441 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006442 RLOGE("getModemActivityInfoResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006443 slotId);
6444 }
6445
6446 return 0;
6447}
6448
Amit Mahajan759786a2017-03-03 17:35:47 -08006449int radio::setAllowedCarriersResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006450 int responseType, int serial, RIL_Errno e,
6451 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006452#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006453 RLOGD("setAllowedCarriersResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006454#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006455
6456 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08006457 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006458 int ret = responseInt(responseInfo, serial, responseType, e, response, responseLen);
6459 Return<void> retStatus
6460 = radioService[slotId]->mRadioResponse->setAllowedCarriersResponse(responseInfo,
6461 ret);
6462 radioService[slotId]->checkReturnStatus(retStatus);
6463 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006464 RLOGE("setAllowedCarriersResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006465 slotId);
6466 }
6467
6468 return 0;
6469}
6470
Amit Mahajan759786a2017-03-03 17:35:47 -08006471int radio::getAllowedCarriersResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006472 int responseType, int serial, RIL_Errno e,
6473 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006474#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006475 RLOGD("getAllowedCarriersResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006476#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006477
6478 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08006479 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006480 populateResponseInfo(responseInfo, serial, responseType, e);
Jack Yuf68e0da2017-02-07 14:53:09 -08006481 CarrierRestrictions carrierInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006482 bool allAllowed = true;
Jayachandran C70f7d2e2017-04-28 00:57:13 -07006483 if (response == NULL) {
6484#if VDBG
6485 RLOGD("getAllowedCarriersResponse response is NULL: all allowed");
6486#endif
6487 carrierInfo.allowedCarriers.resize(0);
6488 carrierInfo.excludedCarriers.resize(0);
6489 } else if (responseLen != sizeof(RIL_CarrierRestrictions)) {
6490 RLOGE("getAllowedCarriersResponse Invalid response");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006491 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
6492 } else {
6493 RIL_CarrierRestrictions *pCr = (RIL_CarrierRestrictions *)response;
6494 if (pCr->len_allowed_carriers > 0 || pCr->len_excluded_carriers > 0) {
6495 allAllowed = false;
6496 }
6497
6498 carrierInfo.allowedCarriers.resize(pCr->len_allowed_carriers);
6499 for(int i = 0; i < pCr->len_allowed_carriers; i++) {
6500 RIL_Carrier *carrier = pCr->allowed_carriers + i;
6501 carrierInfo.allowedCarriers[i].mcc = convertCharPtrToHidlString(carrier->mcc);
6502 carrierInfo.allowedCarriers[i].mnc = convertCharPtrToHidlString(carrier->mnc);
6503 carrierInfo.allowedCarriers[i].matchType = (CarrierMatchType) carrier->match_type;
6504 carrierInfo.allowedCarriers[i].matchData =
6505 convertCharPtrToHidlString(carrier->match_data);
6506 }
6507
6508 carrierInfo.excludedCarriers.resize(pCr->len_excluded_carriers);
6509 for(int i = 0; i < pCr->len_excluded_carriers; i++) {
6510 RIL_Carrier *carrier = pCr->excluded_carriers + i;
6511 carrierInfo.excludedCarriers[i].mcc = convertCharPtrToHidlString(carrier->mcc);
6512 carrierInfo.excludedCarriers[i].mnc = convertCharPtrToHidlString(carrier->mnc);
6513 carrierInfo.excludedCarriers[i].matchType = (CarrierMatchType) carrier->match_type;
6514 carrierInfo.excludedCarriers[i].matchData =
6515 convertCharPtrToHidlString(carrier->match_data);
6516 }
6517 }
6518
6519 Return<void> retStatus
6520 = radioService[slotId]->mRadioResponse->getAllowedCarriersResponse(responseInfo,
6521 allAllowed, carrierInfo);
6522 radioService[slotId]->checkReturnStatus(retStatus);
6523 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006524 RLOGE("getAllowedCarriersResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006525 slotId);
6526 }
6527
6528 return 0;
6529}
6530
Amit Mahajan759786a2017-03-03 17:35:47 -08006531int radio::sendDeviceStateResponse(int slotId,
Jack Yu11ab4042017-02-21 17:08:01 -08006532 int responseType, int serial, RIL_Errno e,
6533 void *response, size_t responselen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006534#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006535 RLOGD("sendDeviceStateResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006536#endif
Jack Yu11ab4042017-02-21 17:08:01 -08006537
6538 if (radioService[slotId]->mRadioResponse != NULL) {
6539 RadioResponseInfo responseInfo = {};
6540 populateResponseInfo(responseInfo, serial, responseType, e);
6541 Return<void> retStatus
6542 = radioService[slotId]->mRadioResponse->sendDeviceStateResponse(responseInfo);
6543 radioService[slotId]->checkReturnStatus(retStatus);
6544 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006545 RLOGE("sendDeviceStateResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Jack Yu11ab4042017-02-21 17:08:01 -08006546 }
6547
6548 return 0;
6549}
6550
pkanwardb8e0942017-03-17 12:49:34 -07006551int radio::setCarrierInfoForImsiEncryptionResponse(int slotId,
6552 int responseType, int serial, RIL_Errno e,
6553 void *response, size_t responseLen) {
6554 RLOGD("setCarrierInfoForImsiEncryptionResponse: serial %d", serial);
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07006555 if (radioService[slotId]->mRadioResponseV1_1 != NULL) {
pkanwardb8e0942017-03-17 12:49:34 -07006556 RadioResponseInfo responseInfo = {};
6557 populateResponseInfo(responseInfo, serial, responseType, e);
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07006558 Return<void> retStatus = radioService[slotId]->mRadioResponseV1_1->
6559 setCarrierInfoForImsiEncryptionResponse(responseInfo);
6560 radioService[slotId]->checkReturnStatus(retStatus);
pkanwardb8e0942017-03-17 12:49:34 -07006561 } else {
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07006562 RLOGE("setCarrierInfoForImsiEncryptionResponse: radioService[%d]->mRadioResponseV1_1 == "
6563 "NULL", slotId);
pkanwardb8e0942017-03-17 12:49:34 -07006564 }
6565 return 0;
6566}
6567
Amit Mahajan759786a2017-03-03 17:35:47 -08006568int radio::setIndicationFilterResponse(int slotId,
Jack Yu11ab4042017-02-21 17:08:01 -08006569 int responseType, int serial, RIL_Errno e,
6570 void *response, size_t responselen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006571#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006572 RLOGD("setIndicationFilterResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006573#endif
Jack Yu11ab4042017-02-21 17:08:01 -08006574
6575 if (radioService[slotId]->mRadioResponse != NULL) {
6576 RadioResponseInfo responseInfo = {};
6577 populateResponseInfo(responseInfo, serial, responseType, e);
6578 Return<void> retStatus
6579 = radioService[slotId]->mRadioResponse->setIndicationFilterResponse(responseInfo);
6580 radioService[slotId]->checkReturnStatus(retStatus);
6581 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006582 RLOGE("setIndicationFilterResponse: radioService[%d]->mRadioResponse == NULL",
Jack Yu11ab4042017-02-21 17:08:01 -08006583 slotId);
6584 }
6585
6586 return 0;
6587}
6588
Amit Mahajan759786a2017-03-03 17:35:47 -08006589int radio::setSimCardPowerResponse(int slotId,
Wileen Chiu718c0bf2017-01-04 11:37:19 -08006590 int responseType, int serial, RIL_Errno e,
6591 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006592#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006593 RLOGD("setSimCardPowerResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006594#endif
Wileen Chiu718c0bf2017-01-04 11:37:19 -08006595
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07006596 if (radioService[slotId]->mRadioResponse != NULL
6597 || radioService[slotId]->mRadioResponseV1_1 != NULL) {
Wileen Chiu718c0bf2017-01-04 11:37:19 -08006598 RadioResponseInfo responseInfo = {};
6599 populateResponseInfo(responseInfo, serial, responseType, e);
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07006600 if (radioService[slotId]->mRadioResponseV1_1 != NULL) {
6601 Return<void> retStatus = radioService[slotId]->mRadioResponseV1_1->
6602 setSimCardPowerResponse_1_1(responseInfo);
Grace Chen08eb6542017-03-23 18:39:48 -07006603 radioService[slotId]->checkReturnStatus(retStatus);
6604 } else {
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07006605 RLOGD("setSimCardPowerResponse: radioService[%d]->mRadioResponseV1_1 == NULL",
Grace Chen08eb6542017-03-23 18:39:48 -07006606 slotId);
6607 Return<void> retStatus
6608 = radioService[slotId]->mRadioResponse->setSimCardPowerResponse(responseInfo);
6609 radioService[slotId]->checkReturnStatus(retStatus);
6610 }
Wileen Chiu718c0bf2017-01-04 11:37:19 -08006611 } else {
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07006612 RLOGE("setSimCardPowerResponse: radioService[%d]->mRadioResponse == NULL && "
6613 "radioService[%d]->mRadioResponseV1_1 == NULL", slotId, slotId);
Wileen Chiu718c0bf2017-01-04 11:37:19 -08006614 }
Wileen Chiu718c0bf2017-01-04 11:37:19 -08006615 return 0;
6616}
6617
yinxu8688abd2017-05-22 11:26:45 -07006618int radio::startNetworkScanResponse(int slotId, int responseType, int serial, RIL_Errno e,
6619 void *response, size_t responseLen) {
6620#if VDBG
6621 RLOGD("startNetworkScanResponse: serial %d", serial);
6622#endif
6623
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07006624 if (radioService[slotId]->mRadioResponseV1_1 != NULL) {
yinxu8688abd2017-05-22 11:26:45 -07006625 RadioResponseInfo responseInfo = {};
6626 populateResponseInfo(responseInfo, serial, responseType, e);
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07006627 Return<void> retStatus
6628 = radioService[slotId]->mRadioResponseV1_1->startNetworkScanResponse(responseInfo);
6629 radioService[slotId]->checkReturnStatus(retStatus);
yinxu8688abd2017-05-22 11:26:45 -07006630 } else {
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07006631 RLOGE("startNetworkScanResponse: radioService[%d]->mRadioResponseV1_1 == NULL", slotId);
yinxu8688abd2017-05-22 11:26:45 -07006632 }
6633
6634 return 0;
6635}
6636
6637int radio::stopNetworkScanResponse(int slotId, int responseType, int serial, RIL_Errno e,
6638 void *response, size_t responseLen) {
6639#if VDBG
6640 RLOGD("stopNetworkScanResponse: serial %d", serial);
6641#endif
6642
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07006643 if (radioService[slotId]->mRadioResponseV1_1 != NULL) {
yinxu8688abd2017-05-22 11:26:45 -07006644 RadioResponseInfo responseInfo = {};
6645 populateResponseInfo(responseInfo, serial, responseType, e);
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07006646 Return<void> retStatus
6647 = radioService[slotId]->mRadioResponseV1_1->stopNetworkScanResponse(responseInfo);
6648 radioService[slotId]->checkReturnStatus(retStatus);
yinxu8688abd2017-05-22 11:26:45 -07006649 } else {
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07006650 RLOGE("stopNetworkScanResponse: radioService[%d]->mRadioResponseV1_1 == NULL", slotId);
yinxu8688abd2017-05-22 11:26:45 -07006651 }
6652
6653 return 0;
6654}
6655
Nathan Harold6a8809d2017-07-07 19:28:58 -07006656void convertRilKeepaliveStatusToHal(const RIL_KeepaliveStatus *rilStatus,
6657 V1_1::KeepaliveStatus& halStatus) {
6658 halStatus.sessionHandle = rilStatus->sessionHandle;
6659 halStatus.code = static_cast<V1_1::KeepaliveStatusCode>(rilStatus->code);
6660}
6661
6662int radio::startKeepaliveResponse(int slotId, int responseType, int serial, RIL_Errno e,
6663 void *response, size_t responseLen) {
6664#if VDBG
6665 RLOGD("%s(): %d", __FUNCTION__, serial);
6666#endif
6667 RadioResponseInfo responseInfo = {};
6668 populateResponseInfo(responseInfo, serial, responseType, e);
6669
6670 // If we don't have a radio service, there's nothing we can do
6671 if (radioService[slotId]->mRadioResponseV1_1 == NULL) {
6672 RLOGE("%s: radioService[%d]->mRadioResponseV1_1 == NULL", __FUNCTION__, slotId);
6673 return 0;
6674 }
6675
6676 V1_1::KeepaliveStatus ks = {};
6677 if (response == NULL || responseLen != sizeof(V1_1::KeepaliveStatus)) {
6678 RLOGE("%s: invalid response - %d", __FUNCTION__, static_cast<int>(e));
6679 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
6680 } else {
6681 convertRilKeepaliveStatusToHal(static_cast<RIL_KeepaliveStatus*>(response), ks);
6682 }
6683
6684 Return<void> retStatus =
6685 radioService[slotId]->mRadioResponseV1_1->startKeepaliveResponse(responseInfo, ks);
6686 radioService[slotId]->checkReturnStatus(retStatus);
6687 return 0;
6688}
6689
6690int radio::stopKeepaliveResponse(int slotId, int responseType, int serial, RIL_Errno e,
6691 void *response, size_t responseLen) {
6692#if VDBG
6693 RLOGD("%s(): %d", __FUNCTION__, serial);
6694#endif
6695 RadioResponseInfo responseInfo = {};
6696 populateResponseInfo(responseInfo, serial, responseType, e);
6697
6698 // If we don't have a radio service, there's nothing we can do
6699 if (radioService[slotId]->mRadioResponseV1_1 == NULL) {
6700 RLOGE("%s: radioService[%d]->mRadioResponseV1_1 == NULL", __FUNCTION__, slotId);
6701 return 0;
6702 }
6703
6704 Return<void> retStatus =
6705 radioService[slotId]->mRadioResponseV1_1->stopKeepaliveResponse(responseInfo);
6706 radioService[slotId]->checkReturnStatus(retStatus);
6707 return 0;
6708}
6709
Amit Mahajan759786a2017-03-03 17:35:47 -08006710int radio::sendRequestRawResponse(int slotId,
Amit Mahajan439da362017-02-13 17:43:04 -08006711 int responseType, int serial, RIL_Errno e,
6712 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006713#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006714 RLOGD("sendRequestRawResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006715#endif
Amit Mahajan439da362017-02-13 17:43:04 -08006716
Steven Moreland6cc40042018-03-20 11:20:05 -07006717 if (!kOemHookEnabled) return 0;
6718
Amit Mahajan439da362017-02-13 17:43:04 -08006719 if (oemHookService[slotId]->mOemHookResponse != NULL) {
6720 RadioResponseInfo responseInfo = {};
6721 populateResponseInfo(responseInfo, serial, responseType, e);
6722 hidl_vec<uint8_t> data;
6723
6724 if (response == NULL) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006725 RLOGE("sendRequestRawResponse: Invalid response");
Amit Mahajan439da362017-02-13 17:43:04 -08006726 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
6727 } else {
6728 data.setToExternal((uint8_t *) response, responseLen);
6729 }
6730 Return<void> retStatus = oemHookService[slotId]->mOemHookResponse->
6731 sendRequestRawResponse(responseInfo, data);
Amit Mahajand423d192017-03-16 17:04:01 -07006732 checkReturnStatus(slotId, retStatus, false);
Amit Mahajan439da362017-02-13 17:43:04 -08006733 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006734 RLOGE("sendRequestRawResponse: oemHookService[%d]->mOemHookResponse == NULL",
Amit Mahajan439da362017-02-13 17:43:04 -08006735 slotId);
6736 }
6737
6738 return 0;
6739}
6740
Amit Mahajan759786a2017-03-03 17:35:47 -08006741int radio::sendRequestStringsResponse(int slotId,
Amit Mahajan439da362017-02-13 17:43:04 -08006742 int responseType, int serial, RIL_Errno e,
6743 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006744#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006745 RLOGD("sendRequestStringsResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006746#endif
Amit Mahajan439da362017-02-13 17:43:04 -08006747
Steven Moreland6cc40042018-03-20 11:20:05 -07006748 if (!kOemHookEnabled) return 0;
6749
Amit Mahajan439da362017-02-13 17:43:04 -08006750 if (oemHookService[slotId]->mOemHookResponse != NULL) {
6751 RadioResponseInfo responseInfo = {};
6752 populateResponseInfo(responseInfo, serial, responseType, e);
6753 hidl_vec<hidl_string> data;
6754
Amit Mahajan13058cb2017-06-07 23:10:27 -07006755 if ((response == NULL && responseLen != 0) || responseLen % sizeof(char *) != 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006756 RLOGE("sendRequestStringsResponse Invalid response: NULL");
Amit Mahajan439da362017-02-13 17:43:04 -08006757 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
6758 } else {
6759 char **resp = (char **) response;
6760 int numStrings = responseLen / sizeof(char *);
6761 data.resize(numStrings);
6762 for (int i = 0; i < numStrings; i++) {
6763 data[i] = convertCharPtrToHidlString(resp[i]);
6764 }
6765 }
6766 Return<void> retStatus
6767 = oemHookService[slotId]->mOemHookResponse->sendRequestStringsResponse(
6768 responseInfo, data);
Amit Mahajand423d192017-03-16 17:04:01 -07006769 checkReturnStatus(slotId, retStatus, false);
Amit Mahajan439da362017-02-13 17:43:04 -08006770 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006771 RLOGE("sendRequestStringsResponse: oemHookService[%d]->mOemHookResponse == "
Amit Mahajan439da362017-02-13 17:43:04 -08006772 "NULL", slotId);
6773 }
6774
6775 return 0;
6776}
6777
Nathan Harold6a8809d2017-07-07 19:28:58 -07006778/***************************************************************************************************
6779 * INDICATION FUNCTIONS
6780 * The below function handle unsolicited messages coming from the Radio
6781 * (messages for which there is no pending request)
6782 **************************************************************************************************/
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006783
Amit Mahajan5829a472016-12-28 17:28:07 -08006784RadioIndicationType convertIntToRadioIndicationType(int indicationType) {
6785 return indicationType == RESPONSE_UNSOLICITED ? (RadioIndicationType::UNSOLICITED) :
6786 (RadioIndicationType::UNSOLICITED_ACK_EXP);
6787}
6788
Amit Mahajan759786a2017-03-03 17:35:47 -08006789int radio::radioStateChangedInd(int slotId,
Amit Mahajan1f652692017-03-01 12:08:46 -08006790 int indicationType, int token, RIL_Errno e, void *response,
6791 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08006792 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajanb3a11bb2017-05-15 16:41:44 -07006793 RadioState radioState =
6794 (RadioState) CALL_ONSTATEREQUEST(slotId);
Amit Mahajan111ddca2017-03-03 12:05:13 -08006795 RLOGD("radioStateChangedInd: radioState %d", radioState);
Amit Mahajan17249842017-01-19 15:05:45 -08006796 Return<void> retStatus = radioService[slotId]->mRadioIndication->radioStateChanged(
Amit Mahajan1f652692017-03-01 12:08:46 -08006797 convertIntToRadioIndicationType(indicationType), radioState);
Amit Mahajan17249842017-01-19 15:05:45 -08006798 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajancd77a5b2016-08-25 11:19:21 -07006799 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006800 RLOGE("radioStateChangedInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajancd77a5b2016-08-25 11:19:21 -07006801 }
Amit Mahajan1f652692017-03-01 12:08:46 -08006802
6803 return 0;
Amit Mahajancd77a5b2016-08-25 11:19:21 -07006804}
6805
Amit Mahajan759786a2017-03-03 17:35:47 -08006806int radio::callStateChangedInd(int slotId,
Amit Mahajan5829a472016-12-28 17:28:07 -08006807 int indicationType, int token, RIL_Errno e, void *response,
6808 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08006809 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006810#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006811 RLOGD("callStateChangedInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07006812#endif
Amit Mahajan17249842017-01-19 15:05:45 -08006813 Return<void> retStatus = radioService[slotId]->mRadioIndication->callStateChanged(
Amit Mahajan5829a472016-12-28 17:28:07 -08006814 convertIntToRadioIndicationType(indicationType));
Amit Mahajan17249842017-01-19 15:05:45 -08006815 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08006816 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006817 RLOGE("callStateChangedInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08006818 }
6819
6820 return 0;
6821}
6822
Amit Mahajan759786a2017-03-03 17:35:47 -08006823int radio::networkStateChangedInd(int slotId,
Amit Mahajan1f652692017-03-01 12:08:46 -08006824 int indicationType, int token, RIL_Errno e, void *response,
6825 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08006826 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006827#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006828 RLOGD("networkStateChangedInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07006829#endif
Jack Yu06181bb2017-01-10 12:10:41 -08006830 Return<void> retStatus = radioService[slotId]->mRadioIndication->networkStateChanged(
Amit Mahajan5829a472016-12-28 17:28:07 -08006831 convertIntToRadioIndicationType(indicationType));
Amit Mahajan17249842017-01-19 15:05:45 -08006832 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08006833 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006834 RLOGE("networkStateChangedInd: radioService[%d]->mRadioIndication == NULL",
Amit Mahajan2fa9e632017-01-06 16:55:33 -08006835 slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08006836 }
6837
6838 return 0;
6839}
6840
6841uint8_t hexCharToInt(uint8_t c) {
6842 if (c >= '0' && c <= '9') return (c - '0');
6843 if (c >= 'A' && c <= 'F') return (c - 'A' + 10);
6844 if (c >= 'a' && c <= 'f') return (c - 'a' + 10);
6845
6846 return INVALID_HEX_CHAR;
6847}
6848
6849uint8_t * convertHexStringToBytes(void *response, size_t responseLen) {
6850 if (responseLen % 2 != 0) {
6851 return NULL;
6852 }
6853
6854 uint8_t *bytes = (uint8_t *)calloc(responseLen/2, sizeof(uint8_t));
6855 if (bytes == NULL) {
6856 RLOGE("convertHexStringToBytes: cannot allocate memory for bytes string");
6857 return NULL;
6858 }
6859 uint8_t *hexString = (uint8_t *)response;
6860
Wei Wang100ac9b2017-02-03 14:18:07 -08006861 for (size_t i = 0; i < responseLen; i += 2) {
Amit Mahajan5829a472016-12-28 17:28:07 -08006862 uint8_t hexChar1 = hexCharToInt(hexString[i]);
6863 uint8_t hexChar2 = hexCharToInt(hexString[i + 1]);
6864
6865 if (hexChar1 == INVALID_HEX_CHAR || hexChar2 == INVALID_HEX_CHAR) {
6866 RLOGE("convertHexStringToBytes: invalid hex char %d %d",
6867 hexString[i], hexString[i + 1]);
6868 free(bytes);
6869 return NULL;
6870 }
6871 bytes[i/2] = ((hexChar1 << 4) | hexChar2);
6872 }
6873
6874 return bytes;
6875}
6876
Amit Mahajan759786a2017-03-03 17:35:47 -08006877int radio::newSmsInd(int slotId, int indicationType,
Amit Mahajan5829a472016-12-28 17:28:07 -08006878 int token, RIL_Errno e, void *response, size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08006879 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan5829a472016-12-28 17:28:07 -08006880 if (response == NULL || responseLen == 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006881 RLOGE("newSmsInd: invalid response");
Amit Mahajan5829a472016-12-28 17:28:07 -08006882 return 0;
6883 }
6884
6885 uint8_t *bytes = convertHexStringToBytes(response, responseLen);
6886 if (bytes == NULL) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006887 RLOGE("newSmsInd: convertHexStringToBytes failed");
Amit Mahajan5829a472016-12-28 17:28:07 -08006888 return 0;
6889 }
6890
6891 hidl_vec<uint8_t> pdu;
6892 pdu.setToExternal(bytes, responseLen/2);
Jayachandran C572f2f42017-03-25 14:30:13 -07006893#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006894 RLOGD("newSmsInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07006895#endif
Amit Mahajan17249842017-01-19 15:05:45 -08006896 Return<void> retStatus = radioService[slotId]->mRadioIndication->newSms(
Amit Mahajan5829a472016-12-28 17:28:07 -08006897 convertIntToRadioIndicationType(indicationType), pdu);
Amit Mahajan17249842017-01-19 15:05:45 -08006898 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08006899 free(bytes);
6900 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006901 RLOGE("newSmsInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08006902 }
6903
6904 return 0;
6905}
6906
Amit Mahajan759786a2017-03-03 17:35:47 -08006907int radio::newSmsStatusReportInd(int slotId,
Amit Mahajan5829a472016-12-28 17:28:07 -08006908 int indicationType, int token, RIL_Errno e, void *response,
6909 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08006910 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan5829a472016-12-28 17:28:07 -08006911 if (response == NULL || responseLen == 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006912 RLOGE("newSmsStatusReportInd: invalid response");
Amit Mahajan5829a472016-12-28 17:28:07 -08006913 return 0;
6914 }
6915
6916 uint8_t *bytes = convertHexStringToBytes(response, responseLen);
6917 if (bytes == NULL) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006918 RLOGE("newSmsStatusReportInd: convertHexStringToBytes failed");
Amit Mahajan5829a472016-12-28 17:28:07 -08006919 return 0;
6920 }
6921
6922 hidl_vec<uint8_t> pdu;
6923 pdu.setToExternal(bytes, responseLen/2);
Jayachandran C572f2f42017-03-25 14:30:13 -07006924#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006925 RLOGD("newSmsStatusReportInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07006926#endif
Amit Mahajan17249842017-01-19 15:05:45 -08006927 Return<void> retStatus = radioService[slotId]->mRadioIndication->newSmsStatusReport(
Amit Mahajan5829a472016-12-28 17:28:07 -08006928 convertIntToRadioIndicationType(indicationType), pdu);
Amit Mahajan17249842017-01-19 15:05:45 -08006929 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08006930 free(bytes);
6931 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006932 RLOGE("newSmsStatusReportInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08006933 }
6934
6935 return 0;
6936}
6937
Amit Mahajan759786a2017-03-03 17:35:47 -08006938int radio::newSmsOnSimInd(int slotId, int indicationType,
Amit Mahajan5829a472016-12-28 17:28:07 -08006939 int token, RIL_Errno e, void *response, size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08006940 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan5829a472016-12-28 17:28:07 -08006941 if (response == NULL || responseLen != sizeof(int)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006942 RLOGE("newSmsOnSimInd: invalid response");
Amit Mahajan5829a472016-12-28 17:28:07 -08006943 return 0;
6944 }
6945 int32_t recordNumber = ((int32_t *) response)[0];
Jayachandran C572f2f42017-03-25 14:30:13 -07006946#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006947 RLOGD("newSmsOnSimInd: slotIndex %d", recordNumber);
Jayachandran C572f2f42017-03-25 14:30:13 -07006948#endif
Amit Mahajan17249842017-01-19 15:05:45 -08006949 Return<void> retStatus = radioService[slotId]->mRadioIndication->newSmsOnSim(
Amit Mahajan5829a472016-12-28 17:28:07 -08006950 convertIntToRadioIndicationType(indicationType), recordNumber);
Amit Mahajan17249842017-01-19 15:05:45 -08006951 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08006952 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006953 RLOGE("newSmsOnSimInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08006954 }
6955
6956 return 0;
6957}
6958
Amit Mahajan759786a2017-03-03 17:35:47 -08006959int radio::onUssdInd(int slotId, int indicationType,
Amit Mahajan5829a472016-12-28 17:28:07 -08006960 int token, RIL_Errno e, void *response, size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08006961 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan5829a472016-12-28 17:28:07 -08006962 if (response == NULL || responseLen != 2 * sizeof(char *)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006963 RLOGE("onUssdInd: invalid response");
Amit Mahajan5829a472016-12-28 17:28:07 -08006964 return 0;
6965 }
6966 char **strings = (char **) response;
6967 char *mode = strings[0];
6968 hidl_string msg = convertCharPtrToHidlString(strings[1]);
6969 UssdModeType modeType = (UssdModeType) atoi(mode);
Jayachandran C572f2f42017-03-25 14:30:13 -07006970#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006971 RLOGD("onUssdInd: mode %s", mode);
Jayachandran C572f2f42017-03-25 14:30:13 -07006972#endif
Amit Mahajan17249842017-01-19 15:05:45 -08006973 Return<void> retStatus = radioService[slotId]->mRadioIndication->onUssd(
Amit Mahajan5829a472016-12-28 17:28:07 -08006974 convertIntToRadioIndicationType(indicationType), modeType, msg);
Amit Mahajan17249842017-01-19 15:05:45 -08006975 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08006976 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006977 RLOGE("onUssdInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08006978 }
6979
6980 return 0;
6981}
6982
Amit Mahajan759786a2017-03-03 17:35:47 -08006983int radio::nitzTimeReceivedInd(int slotId,
Amit Mahajan5829a472016-12-28 17:28:07 -08006984 int indicationType, int token, RIL_Errno e, void *response,
6985 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08006986 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan5829a472016-12-28 17:28:07 -08006987 if (response == NULL || responseLen == 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006988 RLOGE("nitzTimeReceivedInd: invalid response");
Amit Mahajan5829a472016-12-28 17:28:07 -08006989 return 0;
6990 }
6991 hidl_string nitzTime = convertCharPtrToHidlString((char *) response);
Jayachandran C572f2f42017-03-25 14:30:13 -07006992#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006993 RLOGD("nitzTimeReceivedInd: nitzTime %s receivedTime %" PRId64, nitzTime.c_str(),
Amit Mahajane9a10e62018-02-23 17:12:15 -08006994 nitzTimeReceived[slotId]);
Jayachandran C572f2f42017-03-25 14:30:13 -07006995#endif
Amit Mahajan17249842017-01-19 15:05:45 -08006996 Return<void> retStatus = radioService[slotId]->mRadioIndication->nitzTimeReceived(
Amit Mahajane9a10e62018-02-23 17:12:15 -08006997 convertIntToRadioIndicationType(indicationType), nitzTime,
6998 nitzTimeReceived[slotId]);
Amit Mahajan17249842017-01-19 15:05:45 -08006999 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08007000 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007001 RLOGE("nitzTimeReceivedInd: radioService[%d]->mRadioIndication == NULL", slotId);
Weilun Dud2c30932017-02-09 12:32:42 -08007002 return -1;
Amit Mahajan5829a472016-12-28 17:28:07 -08007003 }
7004
7005 return 0;
7006}
7007
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007008void convertRilSignalStrengthToHal(void *response, size_t responseLen,
7009 SignalStrength& signalStrength) {
7010 RIL_SignalStrength_v10 *rilSignalStrength = (RIL_SignalStrength_v10 *) response;
7011
7012 // Fixup LTE for backwards compatibility
7013 // signalStrength: -1 -> 99
7014 if (rilSignalStrength->LTE_SignalStrength.signalStrength == -1) {
7015 rilSignalStrength->LTE_SignalStrength.signalStrength = 99;
7016 }
7017 // rsrp: -1 -> INT_MAX all other negative value to positive.
7018 // So remap here
7019 if (rilSignalStrength->LTE_SignalStrength.rsrp == -1) {
7020 rilSignalStrength->LTE_SignalStrength.rsrp = INT_MAX;
7021 } else if (rilSignalStrength->LTE_SignalStrength.rsrp < -1) {
7022 rilSignalStrength->LTE_SignalStrength.rsrp = -rilSignalStrength->LTE_SignalStrength.rsrp;
7023 }
7024 // rsrq: -1 -> INT_MAX
7025 if (rilSignalStrength->LTE_SignalStrength.rsrq == -1) {
7026 rilSignalStrength->LTE_SignalStrength.rsrq = INT_MAX;
7027 }
7028 // Not remapping rssnr is already using INT_MAX
7029 // cqi: -1 -> INT_MAX
7030 if (rilSignalStrength->LTE_SignalStrength.cqi == -1) {
7031 rilSignalStrength->LTE_SignalStrength.cqi = INT_MAX;
7032 }
7033
7034 signalStrength.gw.signalStrength = rilSignalStrength->GW_SignalStrength.signalStrength;
7035 signalStrength.gw.bitErrorRate = rilSignalStrength->GW_SignalStrength.bitErrorRate;
7036 signalStrength.cdma.dbm = rilSignalStrength->CDMA_SignalStrength.dbm;
7037 signalStrength.cdma.ecio = rilSignalStrength->CDMA_SignalStrength.ecio;
7038 signalStrength.evdo.dbm = rilSignalStrength->EVDO_SignalStrength.dbm;
7039 signalStrength.evdo.ecio = rilSignalStrength->EVDO_SignalStrength.ecio;
7040 signalStrength.evdo.signalNoiseRatio =
7041 rilSignalStrength->EVDO_SignalStrength.signalNoiseRatio;
7042 signalStrength.lte.signalStrength = rilSignalStrength->LTE_SignalStrength.signalStrength;
7043 signalStrength.lte.rsrp = rilSignalStrength->LTE_SignalStrength.rsrp;
7044 signalStrength.lte.rsrq = rilSignalStrength->LTE_SignalStrength.rsrq;
7045 signalStrength.lte.rssnr = rilSignalStrength->LTE_SignalStrength.rssnr;
7046 signalStrength.lte.cqi = rilSignalStrength->LTE_SignalStrength.cqi;
7047 signalStrength.lte.timingAdvance = rilSignalStrength->LTE_SignalStrength.timingAdvance;
7048 signalStrength.tdScdma.rscp = rilSignalStrength->TD_SCDMA_SignalStrength.rscp;
7049}
7050
Amit Mahajan759786a2017-03-03 17:35:47 -08007051int radio::currentSignalStrengthInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007052 int indicationType, int token, RIL_Errno e,
7053 void *response, size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007054 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007055 if (response == NULL || responseLen != sizeof(RIL_SignalStrength_v10)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007056 RLOGE("currentSignalStrengthInd: invalid response");
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007057 return 0;
7058 }
7059
Jack Yuf68e0da2017-02-07 14:53:09 -08007060 SignalStrength signalStrength = {};
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007061 convertRilSignalStrengthToHal(response, responseLen, signalStrength);
7062
Jayachandran C572f2f42017-03-25 14:30:13 -07007063#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007064 RLOGD("currentSignalStrengthInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07007065#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007066 Return<void> retStatus = radioService[slotId]->mRadioIndication->currentSignalStrength(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007067 convertIntToRadioIndicationType(indicationType), signalStrength);
Amit Mahajan17249842017-01-19 15:05:45 -08007068 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007069 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007070 RLOGE("currentSignalStrengthInd: radioService[%d]->mRadioIndication == NULL",
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007071 slotId);
7072 }
7073
7074 return 0;
7075}
7076
Amit Mahajan5829a472016-12-28 17:28:07 -08007077void convertRilDataCallToHal(RIL_Data_Call_Response_v11 *dcResponse,
7078 SetupDataCallResult& dcResult) {
Jack Yu5079e182017-02-28 15:21:18 -08007079 dcResult.status = (DataCallFailCause) dcResponse->status;
Amit Mahajan5829a472016-12-28 17:28:07 -08007080 dcResult.suggestedRetryTime = dcResponse->suggestedRetryTime;
7081 dcResult.cid = dcResponse->cid;
7082 dcResult.active = dcResponse->active;
7083 dcResult.type = convertCharPtrToHidlString(dcResponse->type);
7084 dcResult.ifname = convertCharPtrToHidlString(dcResponse->ifname);
7085 dcResult.addresses = convertCharPtrToHidlString(dcResponse->addresses);
7086 dcResult.dnses = convertCharPtrToHidlString(dcResponse->dnses);
7087 dcResult.gateways = convertCharPtrToHidlString(dcResponse->gateways);
7088 dcResult.pcscf = convertCharPtrToHidlString(dcResponse->pcscf);
7089 dcResult.mtu = dcResponse->mtu;
7090}
7091
7092void convertRilDataCallListToHal(void *response, size_t responseLen,
7093 hidl_vec<SetupDataCallResult>& dcResultList) {
7094 int num = responseLen / sizeof(RIL_Data_Call_Response_v11);
7095
7096 RIL_Data_Call_Response_v11 *dcResponse = (RIL_Data_Call_Response_v11 *) response;
7097 dcResultList.resize(num);
7098 for (int i = 0; i < num; i++) {
7099 convertRilDataCallToHal(&dcResponse[i], dcResultList[i]);
7100 }
7101}
7102
Amit Mahajan759786a2017-03-03 17:35:47 -08007103int radio::dataCallListChangedInd(int slotId,
Amit Mahajan5829a472016-12-28 17:28:07 -08007104 int indicationType, int token, RIL_Errno e, void *response,
7105 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007106 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan13058cb2017-06-07 23:10:27 -07007107 if ((response == NULL && responseLen != 0)
7108 || responseLen % sizeof(RIL_Data_Call_Response_v11) != 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007109 RLOGE("dataCallListChangedInd: invalid response");
Amit Mahajan5829a472016-12-28 17:28:07 -08007110 return 0;
7111 }
7112 hidl_vec<SetupDataCallResult> dcList;
7113 convertRilDataCallListToHal(response, responseLen, dcList);
Jayachandran C572f2f42017-03-25 14:30:13 -07007114#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007115 RLOGD("dataCallListChangedInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07007116#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007117 Return<void> retStatus = radioService[slotId]->mRadioIndication->dataCallListChanged(
Amit Mahajan5829a472016-12-28 17:28:07 -08007118 convertIntToRadioIndicationType(indicationType), dcList);
Amit Mahajan17249842017-01-19 15:05:45 -08007119 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08007120 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007121 RLOGE("dataCallListChangedInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08007122 }
7123
7124 return 0;
7125}
7126
Amit Mahajan759786a2017-03-03 17:35:47 -08007127int radio::suppSvcNotifyInd(int slotId, int indicationType,
Amit Mahajan5829a472016-12-28 17:28:07 -08007128 int token, RIL_Errno e, void *response, size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007129 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan5829a472016-12-28 17:28:07 -08007130 if (response == NULL || responseLen != sizeof(RIL_SuppSvcNotification)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007131 RLOGE("suppSvcNotifyInd: invalid response");
Amit Mahajan5829a472016-12-28 17:28:07 -08007132 return 0;
7133 }
7134
Jack Yuf68e0da2017-02-07 14:53:09 -08007135 SuppSvcNotification suppSvc = {};
Amit Mahajan5829a472016-12-28 17:28:07 -08007136 RIL_SuppSvcNotification *ssn = (RIL_SuppSvcNotification *) response;
7137 suppSvc.isMT = ssn->notificationType;
7138 suppSvc.code = ssn->code;
7139 suppSvc.index = ssn->index;
7140 suppSvc.type = ssn->type;
7141 suppSvc.number = convertCharPtrToHidlString(ssn->number);
7142
Jayachandran C572f2f42017-03-25 14:30:13 -07007143#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007144 RLOGD("suppSvcNotifyInd: isMT %d code %d index %d type %d",
Amit Mahajan5829a472016-12-28 17:28:07 -08007145 suppSvc.isMT, suppSvc.code, suppSvc.index, suppSvc.type);
Jayachandran C572f2f42017-03-25 14:30:13 -07007146#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007147 Return<void> retStatus = radioService[slotId]->mRadioIndication->suppSvcNotify(
Amit Mahajan5829a472016-12-28 17:28:07 -08007148 convertIntToRadioIndicationType(indicationType), suppSvc);
Amit Mahajan17249842017-01-19 15:05:45 -08007149 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08007150 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007151 RLOGE("suppSvcNotifyInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08007152 }
7153
7154 return 0;
7155}
7156
Amit Mahajan759786a2017-03-03 17:35:47 -08007157int radio::stkSessionEndInd(int slotId, int indicationType,
Amit Mahajan5829a472016-12-28 17:28:07 -08007158 int token, RIL_Errno e, void *response, size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007159 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Jayachandran C572f2f42017-03-25 14:30:13 -07007160#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007161 RLOGD("stkSessionEndInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07007162#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007163 Return<void> retStatus = radioService[slotId]->mRadioIndication->stkSessionEnd(
Amit Mahajan5829a472016-12-28 17:28:07 -08007164 convertIntToRadioIndicationType(indicationType));
Amit Mahajan17249842017-01-19 15:05:45 -08007165 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08007166 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007167 RLOGE("stkSessionEndInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08007168 }
7169
7170 return 0;
7171}
7172
Amit Mahajan759786a2017-03-03 17:35:47 -08007173int radio::stkProactiveCommandInd(int slotId,
Amit Mahajan5829a472016-12-28 17:28:07 -08007174 int indicationType, int token, RIL_Errno e, void *response,
7175 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007176 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan5829a472016-12-28 17:28:07 -08007177 if (response == NULL || responseLen == 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007178 RLOGE("stkProactiveCommandInd: invalid response");
Amit Mahajan5829a472016-12-28 17:28:07 -08007179 return 0;
7180 }
Jayachandran C572f2f42017-03-25 14:30:13 -07007181#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007182 RLOGD("stkProactiveCommandInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07007183#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007184 Return<void> retStatus = radioService[slotId]->mRadioIndication->stkProactiveCommand(
Amit Mahajan5829a472016-12-28 17:28:07 -08007185 convertIntToRadioIndicationType(indicationType),
7186 convertCharPtrToHidlString((char *) response));
Amit Mahajan17249842017-01-19 15:05:45 -08007187 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08007188 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007189 RLOGE("stkProactiveCommandInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08007190 }
7191
7192 return 0;
7193}
7194
Amit Mahajan759786a2017-03-03 17:35:47 -08007195int radio::stkEventNotifyInd(int slotId, int indicationType,
Amit Mahajan5829a472016-12-28 17:28:07 -08007196 int token, RIL_Errno e, void *response, size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007197 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan5829a472016-12-28 17:28:07 -08007198 if (response == NULL || responseLen == 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007199 RLOGE("stkEventNotifyInd: invalid response");
Amit Mahajan5829a472016-12-28 17:28:07 -08007200 return 0;
7201 }
Jayachandran C572f2f42017-03-25 14:30:13 -07007202#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007203 RLOGD("stkEventNotifyInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07007204#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007205 Return<void> retStatus = radioService[slotId]->mRadioIndication->stkEventNotify(
Amit Mahajan5829a472016-12-28 17:28:07 -08007206 convertIntToRadioIndicationType(indicationType),
7207 convertCharPtrToHidlString((char *) response));
Amit Mahajan17249842017-01-19 15:05:45 -08007208 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08007209 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007210 RLOGE("stkEventNotifyInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08007211 }
7212
7213 return 0;
7214}
7215
Amit Mahajan759786a2017-03-03 17:35:47 -08007216int radio::stkCallSetupInd(int slotId, int indicationType,
Amit Mahajan5829a472016-12-28 17:28:07 -08007217 int token, RIL_Errno e, void *response, size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007218 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan5829a472016-12-28 17:28:07 -08007219 if (response == NULL || responseLen != sizeof(int)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007220 RLOGE("stkCallSetupInd: invalid response");
Amit Mahajan5829a472016-12-28 17:28:07 -08007221 return 0;
7222 }
7223 int32_t timeout = ((int32_t *) response)[0];
Jayachandran C572f2f42017-03-25 14:30:13 -07007224#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007225 RLOGD("stkCallSetupInd: timeout %d", timeout);
Jayachandran C572f2f42017-03-25 14:30:13 -07007226#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007227 Return<void> retStatus = radioService[slotId]->mRadioIndication->stkCallSetup(
Amit Mahajan5829a472016-12-28 17:28:07 -08007228 convertIntToRadioIndicationType(indicationType), timeout);
Amit Mahajan17249842017-01-19 15:05:45 -08007229 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08007230 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007231 RLOGE("stkCallSetupInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08007232 }
7233
7234 return 0;
7235}
7236
Amit Mahajan759786a2017-03-03 17:35:47 -08007237int radio::simSmsStorageFullInd(int slotId,
Amit Mahajan5829a472016-12-28 17:28:07 -08007238 int indicationType, int token, RIL_Errno e, void *response,
7239 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007240 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Jayachandran C572f2f42017-03-25 14:30:13 -07007241#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007242 RLOGD("simSmsStorageFullInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07007243#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007244 Return<void> retStatus = radioService[slotId]->mRadioIndication->simSmsStorageFull(
Amit Mahajan5829a472016-12-28 17:28:07 -08007245 convertIntToRadioIndicationType(indicationType));
Amit Mahajan17249842017-01-19 15:05:45 -08007246 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08007247 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007248 RLOGE("simSmsStorageFullInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08007249 }
7250
7251 return 0;
7252}
7253
Amit Mahajan759786a2017-03-03 17:35:47 -08007254int radio::simRefreshInd(int slotId, int indicationType,
Amit Mahajan5829a472016-12-28 17:28:07 -08007255 int token, RIL_Errno e, void *response, size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007256 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan5829a472016-12-28 17:28:07 -08007257 if (response == NULL || responseLen != sizeof(RIL_SimRefreshResponse_v7)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007258 RLOGE("simRefreshInd: invalid response");
Amit Mahajan5829a472016-12-28 17:28:07 -08007259 return 0;
7260 }
7261
Jack Yuf68e0da2017-02-07 14:53:09 -08007262 SimRefreshResult refreshResult = {};
Amit Mahajan5829a472016-12-28 17:28:07 -08007263 RIL_SimRefreshResponse_v7 *simRefreshResponse = ((RIL_SimRefreshResponse_v7 *) response);
7264 refreshResult.type =
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07007265 (V1_0::SimRefreshType) simRefreshResponse->result;
Amit Mahajan5829a472016-12-28 17:28:07 -08007266 refreshResult.efId = simRefreshResponse->ef_id;
7267 refreshResult.aid = convertCharPtrToHidlString(simRefreshResponse->aid);
7268
Jayachandran C572f2f42017-03-25 14:30:13 -07007269#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007270 RLOGD("simRefreshInd: type %d efId %d", refreshResult.type, refreshResult.efId);
Jayachandran C572f2f42017-03-25 14:30:13 -07007271#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007272 Return<void> retStatus = radioService[slotId]->mRadioIndication->simRefresh(
Amit Mahajan5829a472016-12-28 17:28:07 -08007273 convertIntToRadioIndicationType(indicationType), refreshResult);
Amit Mahajan17249842017-01-19 15:05:45 -08007274 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08007275 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007276 RLOGE("simRefreshInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08007277 }
7278
7279 return 0;
7280}
7281
7282void convertRilCdmaSignalInfoRecordToHal(RIL_CDMA_SignalInfoRecord *signalInfoRecord,
7283 CdmaSignalInfoRecord& record) {
7284 record.isPresent = signalInfoRecord->isPresent;
7285 record.signalType = signalInfoRecord->signalType;
7286 record.alertPitch = signalInfoRecord->alertPitch;
7287 record.signal = signalInfoRecord->signal;
7288}
7289
Amit Mahajan759786a2017-03-03 17:35:47 -08007290int radio::callRingInd(int slotId, int indicationType,
Amit Mahajan5829a472016-12-28 17:28:07 -08007291 int token, RIL_Errno e, void *response, size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007292 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan5829a472016-12-28 17:28:07 -08007293 bool isGsm;
Jack Yuf68e0da2017-02-07 14:53:09 -08007294 CdmaSignalInfoRecord record = {};
Amit Mahajan5829a472016-12-28 17:28:07 -08007295 if (response == NULL || responseLen == 0) {
7296 isGsm = true;
7297 } else {
7298 isGsm = false;
7299 if (responseLen != sizeof (RIL_CDMA_SignalInfoRecord)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007300 RLOGE("callRingInd: invalid response");
Amit Mahajan5829a472016-12-28 17:28:07 -08007301 return 0;
7302 }
7303 convertRilCdmaSignalInfoRecordToHal((RIL_CDMA_SignalInfoRecord *) response, record);
7304 }
7305
Jayachandran C572f2f42017-03-25 14:30:13 -07007306#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007307 RLOGD("callRingInd: isGsm %d", isGsm);
Jayachandran C572f2f42017-03-25 14:30:13 -07007308#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007309 Return<void> retStatus = radioService[slotId]->mRadioIndication->callRing(
Amit Mahajan5829a472016-12-28 17:28:07 -08007310 convertIntToRadioIndicationType(indicationType), isGsm, record);
Amit Mahajan17249842017-01-19 15:05:45 -08007311 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08007312 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007313 RLOGE("callRingInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08007314 }
7315
7316 return 0;
7317}
7318
Amit Mahajan759786a2017-03-03 17:35:47 -08007319int radio::simStatusChangedInd(int slotId,
Amit Mahajan5829a472016-12-28 17:28:07 -08007320 int indicationType, int token, RIL_Errno e, void *response,
7321 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007322 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Jayachandran C572f2f42017-03-25 14:30:13 -07007323#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007324 RLOGD("simStatusChangedInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07007325#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007326 Return<void> retStatus = radioService[slotId]->mRadioIndication->simStatusChanged(
Amit Mahajan5829a472016-12-28 17:28:07 -08007327 convertIntToRadioIndicationType(indicationType));
Amit Mahajan17249842017-01-19 15:05:45 -08007328 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08007329 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007330 RLOGE("simStatusChangedInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08007331 }
7332
7333 return 0;
7334}
7335
Amit Mahajan759786a2017-03-03 17:35:47 -08007336int radio::cdmaNewSmsInd(int slotId, int indicationType,
Amit Mahajan5829a472016-12-28 17:28:07 -08007337 int token, RIL_Errno e, void *response, size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007338 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan5829a472016-12-28 17:28:07 -08007339 if (response == NULL || responseLen != sizeof(RIL_CDMA_SMS_Message)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007340 RLOGE("cdmaNewSmsInd: invalid response");
Amit Mahajan5829a472016-12-28 17:28:07 -08007341 return 0;
7342 }
7343
Jack Yuf68e0da2017-02-07 14:53:09 -08007344 CdmaSmsMessage msg = {};
Amit Mahajan5829a472016-12-28 17:28:07 -08007345 RIL_CDMA_SMS_Message *rilMsg = (RIL_CDMA_SMS_Message *) response;
7346 msg.teleserviceId = rilMsg->uTeleserviceID;
7347 msg.isServicePresent = rilMsg->bIsServicePresent;
7348 msg.serviceCategory = rilMsg->uServicecategory;
7349 msg.address.digitMode =
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07007350 (V1_0::CdmaSmsDigitMode) rilMsg->sAddress.digit_mode;
Amit Mahajan5829a472016-12-28 17:28:07 -08007351 msg.address.numberMode =
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07007352 (V1_0::CdmaSmsNumberMode) rilMsg->sAddress.number_mode;
Amit Mahajan5829a472016-12-28 17:28:07 -08007353 msg.address.numberType =
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07007354 (V1_0::CdmaSmsNumberType) rilMsg->sAddress.number_type;
Amit Mahajan5829a472016-12-28 17:28:07 -08007355 msg.address.numberPlan =
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07007356 (V1_0::CdmaSmsNumberPlan) rilMsg->sAddress.number_plan;
Amit Mahajan5829a472016-12-28 17:28:07 -08007357
7358 int digitLimit = MIN((rilMsg->sAddress.number_of_digits), RIL_CDMA_SMS_ADDRESS_MAX);
7359 msg.address.digits.setToExternal(rilMsg->sAddress.digits, digitLimit);
7360
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07007361 msg.subAddress.subaddressType = (V1_0::CdmaSmsSubaddressType)
Amit Mahajan5829a472016-12-28 17:28:07 -08007362 rilMsg->sSubAddress.subaddressType;
7363 msg.subAddress.odd = rilMsg->sSubAddress.odd;
7364
7365 digitLimit= MIN((rilMsg->sSubAddress.number_of_digits), RIL_CDMA_SMS_SUBADDRESS_MAX);
7366 msg.subAddress.digits.setToExternal(rilMsg->sSubAddress.digits, digitLimit);
7367
7368 digitLimit = MIN((rilMsg->uBearerDataLen), RIL_CDMA_SMS_BEARER_DATA_MAX);
7369 msg.bearerData.setToExternal(rilMsg->aBearerData, digitLimit);
7370
Jayachandran C572f2f42017-03-25 14:30:13 -07007371#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007372 RLOGD("cdmaNewSmsInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07007373#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007374 Return<void> retStatus = radioService[slotId]->mRadioIndication->cdmaNewSms(
Amit Mahajan5829a472016-12-28 17:28:07 -08007375 convertIntToRadioIndicationType(indicationType), msg);
Amit Mahajan17249842017-01-19 15:05:45 -08007376 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08007377 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007378 RLOGE("cdmaNewSmsInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08007379 }
7380
7381 return 0;
7382}
7383
Amit Mahajan759786a2017-03-03 17:35:47 -08007384int radio::newBroadcastSmsInd(int slotId,
Amit Mahajan1955c742016-12-29 07:07:54 -08007385 int indicationType, int token, RIL_Errno e, void *response,
7386 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007387 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan1955c742016-12-29 07:07:54 -08007388 if (response == NULL || responseLen == 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007389 RLOGE("newBroadcastSmsInd: invalid response");
Amit Mahajan1955c742016-12-29 07:07:54 -08007390 return 0;
7391 }
7392
7393 hidl_vec<uint8_t> data;
7394 data.setToExternal((uint8_t *) response, responseLen);
Jayachandran C572f2f42017-03-25 14:30:13 -07007395#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007396 RLOGD("newBroadcastSmsInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07007397#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007398 Return<void> retStatus = radioService[slotId]->mRadioIndication->newBroadcastSms(
Amit Mahajan1955c742016-12-29 07:07:54 -08007399 convertIntToRadioIndicationType(indicationType), data);
Amit Mahajan17249842017-01-19 15:05:45 -08007400 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan1955c742016-12-29 07:07:54 -08007401 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007402 RLOGE("newBroadcastSmsInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan1955c742016-12-29 07:07:54 -08007403 }
7404
7405 return 0;
7406}
7407
Amit Mahajan759786a2017-03-03 17:35:47 -08007408int radio::cdmaRuimSmsStorageFullInd(int slotId,
Amit Mahajan1955c742016-12-29 07:07:54 -08007409 int indicationType, int token, RIL_Errno e, void *response,
7410 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007411 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Jayachandran C572f2f42017-03-25 14:30:13 -07007412#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007413 RLOGD("cdmaRuimSmsStorageFullInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07007414#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007415 Return<void> retStatus = radioService[slotId]->mRadioIndication->cdmaRuimSmsStorageFull(
Amit Mahajan1955c742016-12-29 07:07:54 -08007416 convertIntToRadioIndicationType(indicationType));
Amit Mahajan17249842017-01-19 15:05:45 -08007417 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan1955c742016-12-29 07:07:54 -08007418 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007419 RLOGE("cdmaRuimSmsStorageFullInd: radioService[%d]->mRadioIndication == NULL",
Amit Mahajan1955c742016-12-29 07:07:54 -08007420 slotId);
7421 }
7422
7423 return 0;
7424}
7425
Amit Mahajan759786a2017-03-03 17:35:47 -08007426int radio::restrictedStateChangedInd(int slotId,
Amit Mahajan1955c742016-12-29 07:07:54 -08007427 int indicationType, int token, RIL_Errno e, void *response,
7428 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007429 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan1955c742016-12-29 07:07:54 -08007430 if (response == NULL || responseLen != sizeof(int)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007431 RLOGE("restrictedStateChangedInd: invalid response");
Amit Mahajan1955c742016-12-29 07:07:54 -08007432 return 0;
7433 }
7434 int32_t state = ((int32_t *) response)[0];
Jayachandran C572f2f42017-03-25 14:30:13 -07007435#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007436 RLOGD("restrictedStateChangedInd: state %d", state);
Jayachandran C572f2f42017-03-25 14:30:13 -07007437#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007438 Return<void> retStatus = radioService[slotId]->mRadioIndication->restrictedStateChanged(
Amit Mahajan1955c742016-12-29 07:07:54 -08007439 convertIntToRadioIndicationType(indicationType), (PhoneRestrictedState) state);
Amit Mahajan17249842017-01-19 15:05:45 -08007440 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan1955c742016-12-29 07:07:54 -08007441 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007442 RLOGE("restrictedStateChangedInd: radioService[%d]->mRadioIndication == NULL",
Amit Mahajan1955c742016-12-29 07:07:54 -08007443 slotId);
7444 }
7445
7446 return 0;
7447}
7448
Amit Mahajan759786a2017-03-03 17:35:47 -08007449int radio::enterEmergencyCallbackModeInd(int slotId,
Amit Mahajan1955c742016-12-29 07:07:54 -08007450 int indicationType, int token, RIL_Errno e, void *response,
7451 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007452 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Jayachandran C572f2f42017-03-25 14:30:13 -07007453#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007454 RLOGD("enterEmergencyCallbackModeInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07007455#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007456 Return<void> retStatus = radioService[slotId]->mRadioIndication->enterEmergencyCallbackMode(
Amit Mahajan1955c742016-12-29 07:07:54 -08007457 convertIntToRadioIndicationType(indicationType));
Amit Mahajan17249842017-01-19 15:05:45 -08007458 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan1955c742016-12-29 07:07:54 -08007459 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007460 RLOGE("enterEmergencyCallbackModeInd: radioService[%d]->mRadioIndication == NULL",
Amit Mahajan1955c742016-12-29 07:07:54 -08007461 slotId);
7462 }
7463
7464 return 0;
7465}
7466
Amit Mahajan759786a2017-03-03 17:35:47 -08007467int radio::cdmaCallWaitingInd(int slotId,
Amit Mahajan1955c742016-12-29 07:07:54 -08007468 int indicationType, int token, RIL_Errno e, void *response,
7469 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007470 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan1955c742016-12-29 07:07:54 -08007471 if (response == NULL || responseLen != sizeof(RIL_CDMA_CallWaiting_v6)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007472 RLOGE("cdmaCallWaitingInd: invalid response");
Amit Mahajan1955c742016-12-29 07:07:54 -08007473 return 0;
7474 }
7475
Jack Yuf68e0da2017-02-07 14:53:09 -08007476 CdmaCallWaiting callWaitingRecord = {};
Amit Mahajan1955c742016-12-29 07:07:54 -08007477 RIL_CDMA_CallWaiting_v6 *callWaitingRil = ((RIL_CDMA_CallWaiting_v6 *) response);
7478 callWaitingRecord.number = convertCharPtrToHidlString(callWaitingRil->number);
7479 callWaitingRecord.numberPresentation =
7480 (CdmaCallWaitingNumberPresentation) callWaitingRil->numberPresentation;
7481 callWaitingRecord.name = convertCharPtrToHidlString(callWaitingRil->name);
7482 convertRilCdmaSignalInfoRecordToHal(&callWaitingRil->signalInfoRecord,
7483 callWaitingRecord.signalInfoRecord);
7484 callWaitingRecord.numberType = (CdmaCallWaitingNumberType) callWaitingRil->number_type;
7485 callWaitingRecord.numberPlan = (CdmaCallWaitingNumberPlan) callWaitingRil->number_plan;
7486
Jayachandran C572f2f42017-03-25 14:30:13 -07007487#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007488 RLOGD("cdmaCallWaitingInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07007489#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007490 Return<void> retStatus = radioService[slotId]->mRadioIndication->cdmaCallWaiting(
Amit Mahajan1955c742016-12-29 07:07:54 -08007491 convertIntToRadioIndicationType(indicationType), callWaitingRecord);
Amit Mahajan17249842017-01-19 15:05:45 -08007492 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan1955c742016-12-29 07:07:54 -08007493 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007494 RLOGE("cdmaCallWaitingInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan1955c742016-12-29 07:07:54 -08007495 }
7496
7497 return 0;
7498}
7499
Amit Mahajan759786a2017-03-03 17:35:47 -08007500int radio::cdmaOtaProvisionStatusInd(int slotId,
Amit Mahajan1955c742016-12-29 07:07:54 -08007501 int indicationType, int token, RIL_Errno e, void *response,
7502 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007503 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan1955c742016-12-29 07:07:54 -08007504 if (response == NULL || responseLen != sizeof(int)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007505 RLOGE("cdmaOtaProvisionStatusInd: invalid response");
Amit Mahajan1955c742016-12-29 07:07:54 -08007506 return 0;
7507 }
7508 int32_t status = ((int32_t *) response)[0];
Jayachandran C572f2f42017-03-25 14:30:13 -07007509#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007510 RLOGD("cdmaOtaProvisionStatusInd: status %d", status);
Jayachandran C572f2f42017-03-25 14:30:13 -07007511#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007512 Return<void> retStatus = radioService[slotId]->mRadioIndication->cdmaOtaProvisionStatus(
Amit Mahajan1955c742016-12-29 07:07:54 -08007513 convertIntToRadioIndicationType(indicationType), (CdmaOtaProvisionStatus) status);
Amit Mahajan17249842017-01-19 15:05:45 -08007514 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan1955c742016-12-29 07:07:54 -08007515 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007516 RLOGE("cdmaOtaProvisionStatusInd: radioService[%d]->mRadioIndication == NULL",
Amit Mahajan1955c742016-12-29 07:07:54 -08007517 slotId);
7518 }
7519
7520 return 0;
7521}
7522
Amit Mahajan759786a2017-03-03 17:35:47 -08007523int radio::cdmaInfoRecInd(int slotId,
Amit Mahajan1955c742016-12-29 07:07:54 -08007524 int indicationType, int token, RIL_Errno e, void *response,
7525 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007526 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan1955c742016-12-29 07:07:54 -08007527 if (response == NULL || responseLen != sizeof(RIL_CDMA_InformationRecords)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007528 RLOGE("cdmaInfoRecInd: invalid response");
Amit Mahajan1955c742016-12-29 07:07:54 -08007529 return 0;
7530 }
7531
Jack Yuf68e0da2017-02-07 14:53:09 -08007532 CdmaInformationRecords records = {};
Amit Mahajan1955c742016-12-29 07:07:54 -08007533 RIL_CDMA_InformationRecords *recordsRil = (RIL_CDMA_InformationRecords *) response;
7534
7535 char* string8 = NULL;
7536 int num = MIN(recordsRil->numberOfInfoRecs, RIL_CDMA_MAX_NUMBER_OF_INFO_RECS);
7537 if (recordsRil->numberOfInfoRecs > RIL_CDMA_MAX_NUMBER_OF_INFO_RECS) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007538 RLOGE("cdmaInfoRecInd: received %d recs which is more than %d, dropping "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08007539 "additional ones", recordsRil->numberOfInfoRecs,
Amit Mahajan1955c742016-12-29 07:07:54 -08007540 RIL_CDMA_MAX_NUMBER_OF_INFO_RECS);
7541 }
7542 records.infoRec.resize(num);
7543 for (int i = 0 ; i < num ; i++) {
7544 CdmaInformationRecord *record = &records.infoRec[i];
7545 RIL_CDMA_InformationRecord *infoRec = &recordsRil->infoRec[i];
7546 record->name = (CdmaInfoRecName) infoRec->name;
Sanket Padawe378ccdd2017-01-24 14:11:12 -08007547 // All vectors should be size 0 except one which will be size 1. Set everything to
7548 // size 0 initially.
7549 record->display.resize(0);
7550 record->number.resize(0);
7551 record->signal.resize(0);
7552 record->redir.resize(0);
7553 record->lineCtrl.resize(0);
7554 record->clir.resize(0);
7555 record->audioCtrl.resize(0);
Amit Mahajan1955c742016-12-29 07:07:54 -08007556 switch (infoRec->name) {
7557 case RIL_CDMA_DISPLAY_INFO_REC:
7558 case RIL_CDMA_EXTENDED_DISPLAY_INFO_REC: {
7559 if (infoRec->rec.display.alpha_len > CDMA_ALPHA_INFO_BUFFER_LENGTH) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007560 RLOGE("cdmaInfoRecInd: invalid display info response length %d "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08007561 "expected not more than %d", (int) infoRec->rec.display.alpha_len,
Amit Mahajan1955c742016-12-29 07:07:54 -08007562 CDMA_ALPHA_INFO_BUFFER_LENGTH);
7563 return 0;
7564 }
7565 string8 = (char*) malloc((infoRec->rec.display.alpha_len + 1) * sizeof(char));
7566 if (string8 == NULL) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007567 RLOGE("cdmaInfoRecInd: Memory allocation failed for "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08007568 "responseCdmaInformationRecords");
Amit Mahajan1955c742016-12-29 07:07:54 -08007569 return 0;
7570 }
7571 memcpy(string8, infoRec->rec.display.alpha_buf, infoRec->rec.display.alpha_len);
7572 string8[(int)infoRec->rec.display.alpha_len] = '\0';
7573
7574 record->display.resize(1);
7575 record->display[0].alphaBuf = string8;
7576 free(string8);
7577 string8 = NULL;
7578 break;
7579 }
7580
7581 case RIL_CDMA_CALLED_PARTY_NUMBER_INFO_REC:
7582 case RIL_CDMA_CALLING_PARTY_NUMBER_INFO_REC:
7583 case RIL_CDMA_CONNECTED_NUMBER_INFO_REC: {
7584 if (infoRec->rec.number.len > CDMA_NUMBER_INFO_BUFFER_LENGTH) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007585 RLOGE("cdmaInfoRecInd: invalid display info response length %d "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08007586 "expected not more than %d", (int) infoRec->rec.number.len,
Amit Mahajan1955c742016-12-29 07:07:54 -08007587 CDMA_NUMBER_INFO_BUFFER_LENGTH);
7588 return 0;
7589 }
7590 string8 = (char*) malloc((infoRec->rec.number.len + 1) * sizeof(char));
7591 if (string8 == NULL) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007592 RLOGE("cdmaInfoRecInd: Memory allocation failed for "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08007593 "responseCdmaInformationRecords");
Amit Mahajan1955c742016-12-29 07:07:54 -08007594 return 0;
7595 }
7596 memcpy(string8, infoRec->rec.number.buf, infoRec->rec.number.len);
7597 string8[(int)infoRec->rec.number.len] = '\0';
7598
7599 record->number.resize(1);
7600 record->number[0].number = string8;
7601 free(string8);
7602 string8 = NULL;
7603 record->number[0].numberType = infoRec->rec.number.number_type;
7604 record->number[0].numberPlan = infoRec->rec.number.number_plan;
7605 record->number[0].pi = infoRec->rec.number.pi;
7606 record->number[0].si = infoRec->rec.number.si;
7607 break;
7608 }
7609
7610 case RIL_CDMA_SIGNAL_INFO_REC: {
7611 record->signal.resize(1);
7612 record->signal[0].isPresent = infoRec->rec.signal.isPresent;
7613 record->signal[0].signalType = infoRec->rec.signal.signalType;
7614 record->signal[0].alertPitch = infoRec->rec.signal.alertPitch;
7615 record->signal[0].signal = infoRec->rec.signal.signal;
7616 break;
7617 }
7618
7619 case RIL_CDMA_REDIRECTING_NUMBER_INFO_REC: {
7620 if (infoRec->rec.redir.redirectingNumber.len >
7621 CDMA_NUMBER_INFO_BUFFER_LENGTH) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007622 RLOGE("cdmaInfoRecInd: invalid display info response length %d "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08007623 "expected not more than %d\n",
Amit Mahajan1955c742016-12-29 07:07:54 -08007624 (int)infoRec->rec.redir.redirectingNumber.len,
7625 CDMA_NUMBER_INFO_BUFFER_LENGTH);
7626 return 0;
7627 }
7628 string8 = (char*) malloc((infoRec->rec.redir.redirectingNumber.len + 1) *
7629 sizeof(char));
7630 if (string8 == NULL) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007631 RLOGE("cdmaInfoRecInd: Memory allocation failed for "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08007632 "responseCdmaInformationRecords");
Amit Mahajan1955c742016-12-29 07:07:54 -08007633 return 0;
7634 }
7635 memcpy(string8, infoRec->rec.redir.redirectingNumber.buf,
7636 infoRec->rec.redir.redirectingNumber.len);
7637 string8[(int)infoRec->rec.redir.redirectingNumber.len] = '\0';
7638
7639 record->redir.resize(1);
7640 record->redir[0].redirectingNumber.number = string8;
7641 free(string8);
7642 string8 = NULL;
7643 record->redir[0].redirectingNumber.numberType =
7644 infoRec->rec.redir.redirectingNumber.number_type;
7645 record->redir[0].redirectingNumber.numberPlan =
7646 infoRec->rec.redir.redirectingNumber.number_plan;
7647 record->redir[0].redirectingNumber.pi = infoRec->rec.redir.redirectingNumber.pi;
7648 record->redir[0].redirectingNumber.si = infoRec->rec.redir.redirectingNumber.si;
7649 record->redir[0].redirectingReason =
7650 (CdmaRedirectingReason) infoRec->rec.redir.redirectingReason;
7651 break;
7652 }
7653
7654 case RIL_CDMA_LINE_CONTROL_INFO_REC: {
7655 record->lineCtrl.resize(1);
7656 record->lineCtrl[0].lineCtrlPolarityIncluded =
7657 infoRec->rec.lineCtrl.lineCtrlPolarityIncluded;
7658 record->lineCtrl[0].lineCtrlToggle = infoRec->rec.lineCtrl.lineCtrlToggle;
7659 record->lineCtrl[0].lineCtrlReverse = infoRec->rec.lineCtrl.lineCtrlReverse;
7660 record->lineCtrl[0].lineCtrlPowerDenial =
7661 infoRec->rec.lineCtrl.lineCtrlPowerDenial;
7662 break;
7663 }
7664
7665 case RIL_CDMA_T53_CLIR_INFO_REC: {
7666 record->clir.resize(1);
7667 record->clir[0].cause = infoRec->rec.clir.cause;
7668 break;
7669 }
7670
7671 case RIL_CDMA_T53_AUDIO_CONTROL_INFO_REC: {
7672 record->audioCtrl.resize(1);
7673 record->audioCtrl[0].upLink = infoRec->rec.audioCtrl.upLink;
7674 record->audioCtrl[0].downLink = infoRec->rec.audioCtrl.downLink;
7675 break;
7676 }
7677
7678 case RIL_CDMA_T53_RELEASE_INFO_REC:
Amit Mahajan111ddca2017-03-03 12:05:13 -08007679 RLOGE("cdmaInfoRecInd: RIL_CDMA_T53_RELEASE_INFO_REC: INVALID");
Amit Mahajan1955c742016-12-29 07:07:54 -08007680 return 0;
7681
7682 default:
Amit Mahajan111ddca2017-03-03 12:05:13 -08007683 RLOGE("cdmaInfoRecInd: Incorrect name value");
Amit Mahajan1955c742016-12-29 07:07:54 -08007684 return 0;
7685 }
7686 }
7687
Jayachandran C572f2f42017-03-25 14:30:13 -07007688#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007689 RLOGD("cdmaInfoRecInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07007690#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007691 Return<void> retStatus = radioService[slotId]->mRadioIndication->cdmaInfoRec(
Amit Mahajan1955c742016-12-29 07:07:54 -08007692 convertIntToRadioIndicationType(indicationType), records);
Amit Mahajan17249842017-01-19 15:05:45 -08007693 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan1955c742016-12-29 07:07:54 -08007694 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007695 RLOGE("cdmaInfoRecInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan1955c742016-12-29 07:07:54 -08007696 }
7697
7698 return 0;
7699}
7700
Amit Mahajan759786a2017-03-03 17:35:47 -08007701int radio::indicateRingbackToneInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007702 int indicationType, int token, RIL_Errno e, void *response,
7703 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007704 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007705 if (response == NULL || responseLen != sizeof(int)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007706 RLOGE("indicateRingbackToneInd: invalid response");
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007707 return 0;
7708 }
7709 bool start = ((int32_t *) response)[0];
Jayachandran C572f2f42017-03-25 14:30:13 -07007710#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007711 RLOGD("indicateRingbackToneInd: start %d", start);
Jayachandran C572f2f42017-03-25 14:30:13 -07007712#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007713 Return<void> retStatus = radioService[slotId]->mRadioIndication->indicateRingbackTone(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007714 convertIntToRadioIndicationType(indicationType), start);
Amit Mahajan17249842017-01-19 15:05:45 -08007715 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007716 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007717 RLOGE("indicateRingbackToneInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007718 }
7719
7720 return 0;
7721}
7722
Amit Mahajan759786a2017-03-03 17:35:47 -08007723int radio::resendIncallMuteInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007724 int indicationType, int token, RIL_Errno e, void *response,
7725 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007726 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Jayachandran C572f2f42017-03-25 14:30:13 -07007727#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007728 RLOGD("resendIncallMuteInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07007729#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007730 Return<void> retStatus = radioService[slotId]->mRadioIndication->resendIncallMute(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007731 convertIntToRadioIndicationType(indicationType));
Amit Mahajan17249842017-01-19 15:05:45 -08007732 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007733 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007734 RLOGE("resendIncallMuteInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007735 }
7736
7737 return 0;
7738}
7739
Amit Mahajan759786a2017-03-03 17:35:47 -08007740int radio::cdmaSubscriptionSourceChangedInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007741 int indicationType, int token, RIL_Errno e,
7742 void *response, size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007743 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007744 if (response == NULL || responseLen != sizeof(int)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007745 RLOGE("cdmaSubscriptionSourceChangedInd: invalid response");
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007746 return 0;
7747 }
7748 int32_t cdmaSource = ((int32_t *) response)[0];
Jayachandran C572f2f42017-03-25 14:30:13 -07007749#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007750 RLOGD("cdmaSubscriptionSourceChangedInd: cdmaSource %d", cdmaSource);
Jayachandran C572f2f42017-03-25 14:30:13 -07007751#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007752 Return<void> retStatus = radioService[slotId]->mRadioIndication->
7753 cdmaSubscriptionSourceChanged(convertIntToRadioIndicationType(indicationType),
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007754 (CdmaSubscriptionSource) cdmaSource);
Amit Mahajan17249842017-01-19 15:05:45 -08007755 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007756 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007757 RLOGE("cdmaSubscriptionSourceChangedInd: radioService[%d]->mRadioIndication == NULL",
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007758 slotId);
7759 }
7760
7761 return 0;
7762}
7763
Amit Mahajan759786a2017-03-03 17:35:47 -08007764int radio::cdmaPrlChangedInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007765 int indicationType, int token, RIL_Errno e, void *response,
7766 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007767 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007768 if (response == NULL || responseLen != sizeof(int)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007769 RLOGE("cdmaPrlChangedInd: invalid response");
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007770 return 0;
7771 }
7772 int32_t version = ((int32_t *) response)[0];
Jayachandran C572f2f42017-03-25 14:30:13 -07007773#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007774 RLOGD("cdmaPrlChangedInd: version %d", version);
Jayachandran C572f2f42017-03-25 14:30:13 -07007775#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007776 Return<void> retStatus = radioService[slotId]->mRadioIndication->cdmaPrlChanged(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007777 convertIntToRadioIndicationType(indicationType), version);
Amit Mahajan17249842017-01-19 15:05:45 -08007778 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007779 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007780 RLOGE("cdmaPrlChangedInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007781 }
7782
7783 return 0;
7784}
7785
Amit Mahajan759786a2017-03-03 17:35:47 -08007786int radio::exitEmergencyCallbackModeInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007787 int indicationType, int token, RIL_Errno e, void *response,
7788 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007789 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Jayachandran C572f2f42017-03-25 14:30:13 -07007790#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007791 RLOGD("exitEmergencyCallbackModeInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07007792#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007793 Return<void> retStatus = radioService[slotId]->mRadioIndication->exitEmergencyCallbackMode(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007794 convertIntToRadioIndicationType(indicationType));
Amit Mahajan17249842017-01-19 15:05:45 -08007795 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007796 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007797 RLOGE("exitEmergencyCallbackModeInd: radioService[%d]->mRadioIndication == NULL",
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007798 slotId);
7799 }
7800
7801 return 0;
7802}
7803
Amit Mahajan759786a2017-03-03 17:35:47 -08007804int radio::rilConnectedInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007805 int indicationType, int token, RIL_Errno e, void *response,
7806 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007807 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007808 RLOGD("rilConnectedInd");
Amit Mahajan17249842017-01-19 15:05:45 -08007809 Return<void> retStatus = radioService[slotId]->mRadioIndication->rilConnected(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007810 convertIntToRadioIndicationType(indicationType));
Amit Mahajan17249842017-01-19 15:05:45 -08007811 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007812 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007813 RLOGE("rilConnectedInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007814 }
7815
7816 return 0;
7817}
7818
Amit Mahajan759786a2017-03-03 17:35:47 -08007819int radio::voiceRadioTechChangedInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007820 int indicationType, int token, RIL_Errno e, void *response,
7821 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007822 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007823 if (response == NULL || responseLen != sizeof(int)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007824 RLOGE("voiceRadioTechChangedInd: invalid response");
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007825 return 0;
7826 }
7827 int32_t rat = ((int32_t *) response)[0];
Jayachandran C572f2f42017-03-25 14:30:13 -07007828#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007829 RLOGD("voiceRadioTechChangedInd: rat %d", rat);
Jayachandran C572f2f42017-03-25 14:30:13 -07007830#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007831 Return<void> retStatus = radioService[slotId]->mRadioIndication->voiceRadioTechChanged(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007832 convertIntToRadioIndicationType(indicationType), (RadioTechnology) rat);
Amit Mahajan17249842017-01-19 15:05:45 -08007833 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007834 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007835 RLOGE("voiceRadioTechChangedInd: radioService[%d]->mRadioIndication == NULL",
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007836 slotId);
7837 }
7838
7839 return 0;
7840}
7841
7842void convertRilCellInfoListToHal(void *response, size_t responseLen, hidl_vec<CellInfo>& records) {
7843 int num = responseLen / sizeof(RIL_CellInfo_v12);
7844 records.resize(num);
7845
7846 RIL_CellInfo_v12 *rillCellInfo = (RIL_CellInfo_v12 *) response;
7847 for (int i = 0; i < num; i++) {
7848 records[i].cellInfoType = (CellInfoType) rillCellInfo->cellInfoType;
7849 records[i].registered = rillCellInfo->registered;
7850 records[i].timeStampType = (TimeStampType) rillCellInfo->timeStampType;
7851 records[i].timeStamp = rillCellInfo->timeStamp;
Sanket Padawe378ccdd2017-01-24 14:11:12 -08007852 // All vectors should be size 0 except one which will be size 1. Set everything to
7853 // size 0 initially.
7854 records[i].gsm.resize(0);
7855 records[i].wcdma.resize(0);
7856 records[i].cdma.resize(0);
7857 records[i].lte.resize(0);
7858 records[i].tdscdma.resize(0);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007859 switch(rillCellInfo->cellInfoType) {
7860 case RIL_CELL_INFO_TYPE_GSM: {
7861 records[i].gsm.resize(1);
7862 CellInfoGsm *cellInfoGsm = &records[i].gsm[0];
7863 cellInfoGsm->cellIdentityGsm.mcc =
7864 std::to_string(rillCellInfo->CellInfo.gsm.cellIdentityGsm.mcc);
7865 cellInfoGsm->cellIdentityGsm.mnc =
7866 std::to_string(rillCellInfo->CellInfo.gsm.cellIdentityGsm.mnc);
7867 cellInfoGsm->cellIdentityGsm.lac =
7868 rillCellInfo->CellInfo.gsm.cellIdentityGsm.lac;
7869 cellInfoGsm->cellIdentityGsm.cid =
7870 rillCellInfo->CellInfo.gsm.cellIdentityGsm.cid;
7871 cellInfoGsm->cellIdentityGsm.arfcn =
7872 rillCellInfo->CellInfo.gsm.cellIdentityGsm.arfcn;
7873 cellInfoGsm->cellIdentityGsm.bsic =
7874 rillCellInfo->CellInfo.gsm.cellIdentityGsm.bsic;
7875 cellInfoGsm->signalStrengthGsm.signalStrength =
7876 rillCellInfo->CellInfo.gsm.signalStrengthGsm.signalStrength;
7877 cellInfoGsm->signalStrengthGsm.bitErrorRate =
7878 rillCellInfo->CellInfo.gsm.signalStrengthGsm.bitErrorRate;
7879 cellInfoGsm->signalStrengthGsm.timingAdvance =
7880 rillCellInfo->CellInfo.gsm.signalStrengthGsm.timingAdvance;
7881 break;
7882 }
7883
7884 case RIL_CELL_INFO_TYPE_WCDMA: {
7885 records[i].wcdma.resize(1);
7886 CellInfoWcdma *cellInfoWcdma = &records[i].wcdma[0];
7887 cellInfoWcdma->cellIdentityWcdma.mcc =
7888 std::to_string(rillCellInfo->CellInfo.wcdma.cellIdentityWcdma.mcc);
7889 cellInfoWcdma->cellIdentityWcdma.mnc =
7890 std::to_string(rillCellInfo->CellInfo.wcdma.cellIdentityWcdma.mnc);
7891 cellInfoWcdma->cellIdentityWcdma.lac =
7892 rillCellInfo->CellInfo.wcdma.cellIdentityWcdma.lac;
7893 cellInfoWcdma->cellIdentityWcdma.cid =
7894 rillCellInfo->CellInfo.wcdma.cellIdentityWcdma.cid;
7895 cellInfoWcdma->cellIdentityWcdma.psc =
7896 rillCellInfo->CellInfo.wcdma.cellIdentityWcdma.psc;
7897 cellInfoWcdma->cellIdentityWcdma.uarfcn =
7898 rillCellInfo->CellInfo.wcdma.cellIdentityWcdma.uarfcn;
7899 cellInfoWcdma->signalStrengthWcdma.signalStrength =
7900 rillCellInfo->CellInfo.wcdma.signalStrengthWcdma.signalStrength;
7901 cellInfoWcdma->signalStrengthWcdma.bitErrorRate =
7902 rillCellInfo->CellInfo.wcdma.signalStrengthWcdma.bitErrorRate;
7903 break;
7904 }
7905
7906 case RIL_CELL_INFO_TYPE_CDMA: {
7907 records[i].cdma.resize(1);
7908 CellInfoCdma *cellInfoCdma = &records[i].cdma[0];
7909 cellInfoCdma->cellIdentityCdma.networkId =
7910 rillCellInfo->CellInfo.cdma.cellIdentityCdma.networkId;
7911 cellInfoCdma->cellIdentityCdma.systemId =
7912 rillCellInfo->CellInfo.cdma.cellIdentityCdma.systemId;
7913 cellInfoCdma->cellIdentityCdma.baseStationId =
7914 rillCellInfo->CellInfo.cdma.cellIdentityCdma.basestationId;
7915 cellInfoCdma->cellIdentityCdma.longitude =
7916 rillCellInfo->CellInfo.cdma.cellIdentityCdma.longitude;
7917 cellInfoCdma->cellIdentityCdma.latitude =
7918 rillCellInfo->CellInfo.cdma.cellIdentityCdma.latitude;
7919 cellInfoCdma->signalStrengthCdma.dbm =
7920 rillCellInfo->CellInfo.cdma.signalStrengthCdma.dbm;
7921 cellInfoCdma->signalStrengthCdma.ecio =
7922 rillCellInfo->CellInfo.cdma.signalStrengthCdma.ecio;
7923 cellInfoCdma->signalStrengthEvdo.dbm =
7924 rillCellInfo->CellInfo.cdma.signalStrengthEvdo.dbm;
7925 cellInfoCdma->signalStrengthEvdo.ecio =
7926 rillCellInfo->CellInfo.cdma.signalStrengthEvdo.ecio;
7927 cellInfoCdma->signalStrengthEvdo.signalNoiseRatio =
7928 rillCellInfo->CellInfo.cdma.signalStrengthEvdo.signalNoiseRatio;
7929 break;
7930 }
7931
7932 case RIL_CELL_INFO_TYPE_LTE: {
7933 records[i].lte.resize(1);
7934 CellInfoLte *cellInfoLte = &records[i].lte[0];
7935 cellInfoLte->cellIdentityLte.mcc =
7936 std::to_string(rillCellInfo->CellInfo.lte.cellIdentityLte.mcc);
7937 cellInfoLte->cellIdentityLte.mnc =
7938 std::to_string(rillCellInfo->CellInfo.lte.cellIdentityLte.mnc);
7939 cellInfoLte->cellIdentityLte.ci =
7940 rillCellInfo->CellInfo.lte.cellIdentityLte.ci;
7941 cellInfoLte->cellIdentityLte.pci =
7942 rillCellInfo->CellInfo.lte.cellIdentityLte.pci;
7943 cellInfoLte->cellIdentityLte.tac =
7944 rillCellInfo->CellInfo.lte.cellIdentityLte.tac;
7945 cellInfoLte->cellIdentityLte.earfcn =
7946 rillCellInfo->CellInfo.lte.cellIdentityLte.earfcn;
7947 cellInfoLte->signalStrengthLte.signalStrength =
7948 rillCellInfo->CellInfo.lte.signalStrengthLte.signalStrength;
7949 cellInfoLte->signalStrengthLte.rsrp =
7950 rillCellInfo->CellInfo.lte.signalStrengthLte.rsrp;
7951 cellInfoLte->signalStrengthLte.rsrq =
7952 rillCellInfo->CellInfo.lte.signalStrengthLte.rsrq;
7953 cellInfoLte->signalStrengthLte.rssnr =
7954 rillCellInfo->CellInfo.lte.signalStrengthLte.rssnr;
7955 cellInfoLte->signalStrengthLte.cqi =
7956 rillCellInfo->CellInfo.lte.signalStrengthLte.cqi;
7957 cellInfoLte->signalStrengthLte.timingAdvance =
7958 rillCellInfo->CellInfo.lte.signalStrengthLte.timingAdvance;
7959 break;
7960 }
7961
7962 case RIL_CELL_INFO_TYPE_TD_SCDMA: {
7963 records[i].tdscdma.resize(1);
7964 CellInfoTdscdma *cellInfoTdscdma = &records[i].tdscdma[0];
7965 cellInfoTdscdma->cellIdentityTdscdma.mcc =
7966 std::to_string(rillCellInfo->CellInfo.tdscdma.cellIdentityTdscdma.mcc);
7967 cellInfoTdscdma->cellIdentityTdscdma.mnc =
7968 std::to_string(rillCellInfo->CellInfo.tdscdma.cellIdentityTdscdma.mnc);
7969 cellInfoTdscdma->cellIdentityTdscdma.lac =
7970 rillCellInfo->CellInfo.tdscdma.cellIdentityTdscdma.lac;
7971 cellInfoTdscdma->cellIdentityTdscdma.cid =
7972 rillCellInfo->CellInfo.tdscdma.cellIdentityTdscdma.cid;
7973 cellInfoTdscdma->cellIdentityTdscdma.cpid =
7974 rillCellInfo->CellInfo.tdscdma.cellIdentityTdscdma.cpid;
7975 cellInfoTdscdma->signalStrengthTdscdma.rscp =
7976 rillCellInfo->CellInfo.tdscdma.signalStrengthTdscdma.rscp;
7977 break;
7978 }
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08007979 default: {
7980 break;
7981 }
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007982 }
7983 rillCellInfo += 1;
7984 }
7985}
7986
Amit Mahajan759786a2017-03-03 17:35:47 -08007987int radio::cellInfoListInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007988 int indicationType, int token, RIL_Errno e, void *response,
7989 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007990 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan13058cb2017-06-07 23:10:27 -07007991 if ((response == NULL && responseLen != 0) || responseLen % sizeof(RIL_CellInfo_v12) != 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007992 RLOGE("cellInfoListInd: invalid response");
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007993 return 0;
7994 }
7995
7996 hidl_vec<CellInfo> records;
7997 convertRilCellInfoListToHal(response, responseLen, records);
7998
Jayachandran C572f2f42017-03-25 14:30:13 -07007999#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08008000 RLOGD("cellInfoListInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07008001#endif
Amit Mahajan17249842017-01-19 15:05:45 -08008002 Return<void> retStatus = radioService[slotId]->mRadioIndication->cellInfoList(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008003 convertIntToRadioIndicationType(indicationType), records);
Amit Mahajan17249842017-01-19 15:05:45 -08008004 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008005 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008006 RLOGE("cellInfoListInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008007 }
8008
8009 return 0;
8010}
8011
Amit Mahajan759786a2017-03-03 17:35:47 -08008012int radio::imsNetworkStateChangedInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008013 int indicationType, int token, RIL_Errno e, void *response,
8014 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08008015 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Jayachandran C572f2f42017-03-25 14:30:13 -07008016#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08008017 RLOGD("imsNetworkStateChangedInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07008018#endif
Amit Mahajan17249842017-01-19 15:05:45 -08008019 Return<void> retStatus = radioService[slotId]->mRadioIndication->imsNetworkStateChanged(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008020 convertIntToRadioIndicationType(indicationType));
Amit Mahajan17249842017-01-19 15:05:45 -08008021 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008022 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008023 RLOGE("imsNetworkStateChangedInd: radioService[%d]->mRadioIndication == NULL",
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008024 slotId);
8025 }
8026
8027 return 0;
8028}
8029
Amit Mahajan759786a2017-03-03 17:35:47 -08008030int radio::subscriptionStatusChangedInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008031 int indicationType, int token, RIL_Errno e, void *response,
8032 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08008033 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008034 if (response == NULL || responseLen != sizeof(int)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008035 RLOGE("subscriptionStatusChangedInd: invalid response");
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008036 return 0;
8037 }
8038 bool activate = ((int32_t *) response)[0];
Jayachandran C572f2f42017-03-25 14:30:13 -07008039#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08008040 RLOGD("subscriptionStatusChangedInd: activate %d", activate);
Jayachandran C572f2f42017-03-25 14:30:13 -07008041#endif
Amit Mahajan17249842017-01-19 15:05:45 -08008042 Return<void> retStatus = radioService[slotId]->mRadioIndication->subscriptionStatusChanged(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008043 convertIntToRadioIndicationType(indicationType), activate);
Amit Mahajan17249842017-01-19 15:05:45 -08008044 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008045 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008046 RLOGE("subscriptionStatusChangedInd: radioService[%d]->mRadioIndication == NULL",
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008047 slotId);
8048 }
8049
8050 return 0;
8051}
8052
Amit Mahajan759786a2017-03-03 17:35:47 -08008053int radio::srvccStateNotifyInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008054 int indicationType, int token, RIL_Errno e, void *response,
8055 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08008056 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008057 if (response == NULL || responseLen != sizeof(int)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008058 RLOGE("srvccStateNotifyInd: invalid response");
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008059 return 0;
8060 }
8061 int32_t state = ((int32_t *) response)[0];
Jayachandran C572f2f42017-03-25 14:30:13 -07008062#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08008063 RLOGD("srvccStateNotifyInd: rat %d", state);
Jayachandran C572f2f42017-03-25 14:30:13 -07008064#endif
Amit Mahajan17249842017-01-19 15:05:45 -08008065 Return<void> retStatus = radioService[slotId]->mRadioIndication->srvccStateNotify(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008066 convertIntToRadioIndicationType(indicationType), (SrvccState) state);
Amit Mahajan17249842017-01-19 15:05:45 -08008067 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008068 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008069 RLOGE("srvccStateNotifyInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008070 }
8071
8072 return 0;
8073}
8074
8075void convertRilHardwareConfigListToHal(void *response, size_t responseLen,
8076 hidl_vec<HardwareConfig>& records) {
8077 int num = responseLen / sizeof(RIL_HardwareConfig);
8078 records.resize(num);
8079
8080 RIL_HardwareConfig *rilHardwareConfig = (RIL_HardwareConfig *) response;
8081 for (int i = 0; i < num; i++) {
8082 records[i].type = (HardwareConfigType) rilHardwareConfig[i].type;
8083 records[i].uuid = convertCharPtrToHidlString(rilHardwareConfig[i].uuid);
8084 records[i].state = (HardwareConfigState) rilHardwareConfig[i].state;
8085 switch (rilHardwareConfig[i].type) {
8086 case RIL_HARDWARE_CONFIG_MODEM: {
8087 records[i].modem.resize(1);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08008088 records[i].sim.resize(0);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008089 HardwareConfigModem *hwConfigModem = &records[i].modem[0];
8090 hwConfigModem->rat = rilHardwareConfig[i].cfg.modem.rat;
8091 hwConfigModem->maxVoice = rilHardwareConfig[i].cfg.modem.maxVoice;
8092 hwConfigModem->maxData = rilHardwareConfig[i].cfg.modem.maxData;
8093 hwConfigModem->maxStandby = rilHardwareConfig[i].cfg.modem.maxStandby;
8094 break;
8095 }
8096
8097 case RIL_HARDWARE_CONFIG_SIM: {
8098 records[i].sim.resize(1);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08008099 records[i].modem.resize(0);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008100 records[i].sim[0].modemUuid =
8101 convertCharPtrToHidlString(rilHardwareConfig[i].cfg.sim.modemUuid);
8102 break;
8103 }
8104 }
8105 }
8106}
8107
Amit Mahajan759786a2017-03-03 17:35:47 -08008108int radio::hardwareConfigChangedInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008109 int indicationType, int token, RIL_Errno e, void *response,
8110 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08008111 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan13058cb2017-06-07 23:10:27 -07008112 if ((response == NULL && responseLen != 0)
8113 || responseLen % sizeof(RIL_HardwareConfig) != 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008114 RLOGE("hardwareConfigChangedInd: invalid response");
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008115 return 0;
8116 }
8117
8118 hidl_vec<HardwareConfig> configs;
8119 convertRilHardwareConfigListToHal(response, responseLen, configs);
8120
Jayachandran C572f2f42017-03-25 14:30:13 -07008121#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08008122 RLOGD("hardwareConfigChangedInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07008123#endif
Amit Mahajan17249842017-01-19 15:05:45 -08008124 Return<void> retStatus = radioService[slotId]->mRadioIndication->hardwareConfigChanged(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008125 convertIntToRadioIndicationType(indicationType), configs);
Amit Mahajan17249842017-01-19 15:05:45 -08008126 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008127 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008128 RLOGE("hardwareConfigChangedInd: radioService[%d]->mRadioIndication == NULL",
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008129 slotId);
8130 }
8131
8132 return 0;
8133}
8134
8135void convertRilRadioCapabilityToHal(void *response, size_t responseLen, RadioCapability& rc) {
8136 RIL_RadioCapability *rilRadioCapability = (RIL_RadioCapability *) response;
8137 rc.session = rilRadioCapability->session;
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07008138 rc.phase = (V1_0::RadioCapabilityPhase) rilRadioCapability->phase;
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008139 rc.raf = rilRadioCapability->rat;
8140 rc.logicalModemUuid = convertCharPtrToHidlString(rilRadioCapability->logicalModemUuid);
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07008141 rc.status = (V1_0::RadioCapabilityStatus) rilRadioCapability->status;
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008142}
8143
Amit Mahajan759786a2017-03-03 17:35:47 -08008144int radio::radioCapabilityIndicationInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008145 int indicationType, int token, RIL_Errno e, void *response,
8146 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08008147 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008148 if (response == NULL || responseLen != sizeof(RIL_RadioCapability)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008149 RLOGE("radioCapabilityIndicationInd: invalid response");
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008150 return 0;
8151 }
8152
Jack Yuf68e0da2017-02-07 14:53:09 -08008153 RadioCapability rc = {};
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008154 convertRilRadioCapabilityToHal(response, responseLen, rc);
8155
Jayachandran C572f2f42017-03-25 14:30:13 -07008156#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08008157 RLOGD("radioCapabilityIndicationInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07008158#endif
Amit Mahajan17249842017-01-19 15:05:45 -08008159 Return<void> retStatus = radioService[slotId]->mRadioIndication->radioCapabilityIndication(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008160 convertIntToRadioIndicationType(indicationType), rc);
Amit Mahajan17249842017-01-19 15:05:45 -08008161 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008162 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008163 RLOGE("radioCapabilityIndicationInd: radioService[%d]->mRadioIndication == NULL",
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008164 slotId);
8165 }
8166
8167 return 0;
8168}
8169
8170bool isServiceTypeCfQuery(RIL_SsServiceType serType, RIL_SsRequestType reqType) {
8171 if ((reqType == SS_INTERROGATION) &&
8172 (serType == SS_CFU ||
8173 serType == SS_CF_BUSY ||
8174 serType == SS_CF_NO_REPLY ||
8175 serType == SS_CF_NOT_REACHABLE ||
8176 serType == SS_CF_ALL ||
8177 serType == SS_CF_ALL_CONDITIONAL)) {
8178 return true;
8179 }
8180 return false;
8181}
8182
Amit Mahajan759786a2017-03-03 17:35:47 -08008183int radio::onSupplementaryServiceIndicationInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008184 int indicationType, int token, RIL_Errno e,
8185 void *response, size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08008186 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008187 if (response == NULL || responseLen != sizeof(RIL_StkCcUnsolSsResponse)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008188 RLOGE("onSupplementaryServiceIndicationInd: invalid response");
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008189 return 0;
8190 }
8191
8192 RIL_StkCcUnsolSsResponse *rilSsResponse = (RIL_StkCcUnsolSsResponse *) response;
Jack Yuf68e0da2017-02-07 14:53:09 -08008193 StkCcUnsolSsResult ss = {};
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008194 ss.serviceType = (SsServiceType) rilSsResponse->serviceType;
8195 ss.requestType = (SsRequestType) rilSsResponse->requestType;
8196 ss.teleserviceType = (SsTeleserviceType) rilSsResponse->teleserviceType;
8197 ss.serviceClass = rilSsResponse->serviceClass;
8198 ss.result = (RadioError) rilSsResponse->result;
8199
8200 if (isServiceTypeCfQuery(rilSsResponse->serviceType, rilSsResponse->requestType)) {
Jayachandran C572f2f42017-03-25 14:30:13 -07008201#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08008202 RLOGD("onSupplementaryServiceIndicationInd CF type, num of Cf elements %d",
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008203 rilSsResponse->cfData.numValidIndexes);
Jayachandran C572f2f42017-03-25 14:30:13 -07008204#endif
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008205 if (rilSsResponse->cfData.numValidIndexes > NUM_SERVICE_CLASSES) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008206 RLOGE("onSupplementaryServiceIndicationInd numValidIndexes is greater than "
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008207 "max value %d, truncating it to max value", NUM_SERVICE_CLASSES);
8208 rilSsResponse->cfData.numValidIndexes = NUM_SERVICE_CLASSES;
8209 }
8210
8211 ss.cfData.resize(1);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08008212 ss.ssInfo.resize(0);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008213
8214 /* number of call info's */
8215 ss.cfData[0].cfInfo.resize(rilSsResponse->cfData.numValidIndexes);
8216
8217 for (int i = 0; i < rilSsResponse->cfData.numValidIndexes; i++) {
8218 RIL_CallForwardInfo cf = rilSsResponse->cfData.cfInfo[i];
8219 CallForwardInfo *cfInfo = &ss.cfData[0].cfInfo[i];
8220
8221 cfInfo->status = (CallForwardInfoStatus) cf.status;
8222 cfInfo->reason = cf.reason;
8223 cfInfo->serviceClass = cf.serviceClass;
8224 cfInfo->toa = cf.toa;
8225 cfInfo->number = convertCharPtrToHidlString(cf.number);
8226 cfInfo->timeSeconds = cf.timeSeconds;
Jayachandran C572f2f42017-03-25 14:30:13 -07008227#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08008228 RLOGD("onSupplementaryServiceIndicationInd: "
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008229 "Data: %d,reason=%d,cls=%d,toa=%d,num=%s,tout=%d],", cf.status,
8230 cf.reason, cf.serviceClass, cf.toa, (char*)cf.number, cf.timeSeconds);
Jayachandran C572f2f42017-03-25 14:30:13 -07008231#endif
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008232 }
8233 } else {
8234 ss.ssInfo.resize(1);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08008235 ss.cfData.resize(0);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008236
8237 /* each int */
8238 ss.ssInfo[0].ssInfo.resize(SS_INFO_MAX);
8239 for (int i = 0; i < SS_INFO_MAX; i++) {
Jayachandran C572f2f42017-03-25 14:30:13 -07008240#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08008241 RLOGD("onSupplementaryServiceIndicationInd: Data: %d",
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008242 rilSsResponse->ssInfo[i]);
Jayachandran C572f2f42017-03-25 14:30:13 -07008243#endif
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008244 ss.ssInfo[0].ssInfo[i] = rilSsResponse->ssInfo[i];
8245 }
8246 }
8247
Jayachandran C572f2f42017-03-25 14:30:13 -07008248#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08008249 RLOGD("onSupplementaryServiceIndicationInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07008250#endif
Amit Mahajan17249842017-01-19 15:05:45 -08008251 Return<void> retStatus = radioService[slotId]->mRadioIndication->
8252 onSupplementaryServiceIndication(convertIntToRadioIndicationType(indicationType),
8253 ss);
8254 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008255 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008256 RLOGE("onSupplementaryServiceIndicationInd: "
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008257 "radioService[%d]->mRadioIndication == NULL", slotId);
8258 }
8259
8260 return 0;
8261}
8262
Amit Mahajan759786a2017-03-03 17:35:47 -08008263int radio::stkCallControlAlphaNotifyInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008264 int indicationType, int token, RIL_Errno e, void *response,
8265 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08008266 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008267 if (response == NULL || responseLen == 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008268 RLOGE("stkCallControlAlphaNotifyInd: invalid response");
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008269 return 0;
8270 }
Jayachandran C572f2f42017-03-25 14:30:13 -07008271#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08008272 RLOGD("stkCallControlAlphaNotifyInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07008273#endif
Amit Mahajan17249842017-01-19 15:05:45 -08008274 Return<void> retStatus = radioService[slotId]->mRadioIndication->stkCallControlAlphaNotify(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008275 convertIntToRadioIndicationType(indicationType),
8276 convertCharPtrToHidlString((char *) response));
Amit Mahajan17249842017-01-19 15:05:45 -08008277 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008278 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008279 RLOGE("stkCallControlAlphaNotifyInd: radioService[%d]->mRadioIndication == NULL",
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008280 slotId);
8281 }
8282
8283 return 0;
8284}
8285
8286void convertRilLceDataInfoToHal(void *response, size_t responseLen, LceDataInfo& lce) {
8287 RIL_LceDataInfo *rilLceDataInfo = (RIL_LceDataInfo *)response;
8288 lce.lastHopCapacityKbps = rilLceDataInfo->last_hop_capacity_kbps;
8289 lce.confidenceLevel = rilLceDataInfo->confidence_level;
8290 lce.lceSuspended = rilLceDataInfo->lce_suspended;
8291}
8292
Amit Mahajan759786a2017-03-03 17:35:47 -08008293int radio::lceDataInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008294 int indicationType, int token, RIL_Errno e, void *response,
8295 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08008296 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008297 if (response == NULL || responseLen != sizeof(RIL_LceDataInfo)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008298 RLOGE("lceDataInd: invalid response");
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008299 return 0;
8300 }
8301
Jack Yuf68e0da2017-02-07 14:53:09 -08008302 LceDataInfo lce = {};
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008303 convertRilLceDataInfoToHal(response, responseLen, lce);
Jayachandran C572f2f42017-03-25 14:30:13 -07008304#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08008305 RLOGD("lceDataInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07008306#endif
Amit Mahajan17249842017-01-19 15:05:45 -08008307 Return<void> retStatus = radioService[slotId]->mRadioIndication->lceData(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008308 convertIntToRadioIndicationType(indicationType), lce);
Amit Mahajan17249842017-01-19 15:05:45 -08008309 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008310 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008311 RLOGE("lceDataInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008312 }
8313
8314 return 0;
8315}
8316
Amit Mahajan759786a2017-03-03 17:35:47 -08008317int radio::pcoDataInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008318 int indicationType, int token, RIL_Errno e, void *response,
8319 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08008320 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008321 if (response == NULL || responseLen != sizeof(RIL_PCO_Data)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008322 RLOGE("pcoDataInd: invalid response");
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008323 return 0;
8324 }
8325
Jack Yuf68e0da2017-02-07 14:53:09 -08008326 PcoDataInfo pco = {};
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008327 RIL_PCO_Data *rilPcoData = (RIL_PCO_Data *)response;
8328 pco.cid = rilPcoData->cid;
8329 pco.bearerProto = convertCharPtrToHidlString(rilPcoData->bearer_proto);
8330 pco.pcoId = rilPcoData->pco_id;
8331 pco.contents.setToExternal((uint8_t *) rilPcoData->contents, rilPcoData->contents_length);
8332
Jayachandran C572f2f42017-03-25 14:30:13 -07008333#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08008334 RLOGD("pcoDataInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07008335#endif
Amit Mahajan17249842017-01-19 15:05:45 -08008336 Return<void> retStatus = radioService[slotId]->mRadioIndication->pcoData(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008337 convertIntToRadioIndicationType(indicationType), pco);
Amit Mahajan17249842017-01-19 15:05:45 -08008338 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008339 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008340 RLOGE("pcoDataInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008341 }
8342
8343 return 0;
8344}
8345
Amit Mahajan759786a2017-03-03 17:35:47 -08008346int radio::modemResetInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008347 int indicationType, int token, RIL_Errno e, void *response,
8348 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08008349 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008350 if (response == NULL || responseLen == 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008351 RLOGE("modemResetInd: invalid response");
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008352 return 0;
8353 }
Jayachandran C572f2f42017-03-25 14:30:13 -07008354#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08008355 RLOGD("modemResetInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07008356#endif
Amit Mahajan17249842017-01-19 15:05:45 -08008357 Return<void> retStatus = radioService[slotId]->mRadioIndication->modemReset(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008358 convertIntToRadioIndicationType(indicationType),
8359 convertCharPtrToHidlString((char *) response));
Amit Mahajan17249842017-01-19 15:05:45 -08008360 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008361 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008362 RLOGE("modemResetInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008363 }
8364
8365 return 0;
8366}
8367
yinxu3abe7c72017-05-03 15:15:19 -07008368int radio::networkScanResultInd(int slotId,
8369 int indicationType, int token, RIL_Errno e, void *response,
yinxu8688abd2017-05-22 11:26:45 -07008370 size_t responseLen) {
yinxu3abe7c72017-05-03 15:15:19 -07008371#if VDBG
8372 RLOGD("networkScanResultInd");
8373#endif
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07008374 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndicationV1_1 != NULL) {
yinxu8688abd2017-05-22 11:26:45 -07008375 if (response == NULL || responseLen == 0) {
8376 RLOGE("networkScanResultInd: invalid response");
8377 return 0;
8378 }
8379 RLOGD("networkScanResultInd");
8380
8381#if VDBG
8382 RLOGD("networkScanResultInd");
8383#endif
8384
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07008385 RIL_NetworkScanResult *networkScanResult = (RIL_NetworkScanResult *) response;
yinxu8688abd2017-05-22 11:26:45 -07008386
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07008387 V1_1::NetworkScanResult result;
8388 result.status = (V1_1::ScanStatus) networkScanResult->status;
Sooraj Sasindran982ba7a2018-05-07 21:20:43 -07008389 result.error = (RadioError) networkScanResult->error;
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07008390 convertRilCellInfoListToHal(
8391 networkScanResult->network_infos,
8392 networkScanResult->network_infos_length * sizeof(RIL_CellInfo_v12),
8393 result.networkInfos);
yinxu8688abd2017-05-22 11:26:45 -07008394
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07008395 Return<void> retStatus = radioService[slotId]->mRadioIndicationV1_1->networkScanResult(
8396 convertIntToRadioIndicationType(indicationType), result);
8397 radioService[slotId]->checkReturnStatus(retStatus);
yinxu8688abd2017-05-22 11:26:45 -07008398 } else {
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07008399 RLOGE("networkScanResultInd: radioService[%d]->mRadioIndicationV1_1 == NULL", slotId);
yinxu8688abd2017-05-22 11:26:45 -07008400 }
yinxu3abe7c72017-05-03 15:15:19 -07008401 return 0;
8402}
8403
pkanwardb8e0942017-03-17 12:49:34 -07008404int radio::carrierInfoForImsiEncryption(int slotId,
8405 int indicationType, int token, RIL_Errno e, void *response,
8406 size_t responseLen) {
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07008407 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndicationV1_1 != NULL) {
pkanwardb8e0942017-03-17 12:49:34 -07008408 if (response == NULL || responseLen == 0) {
8409 RLOGE("carrierInfoForImsiEncryption: invalid response");
8410 return 0;
8411 }
8412 RLOGD("carrierInfoForImsiEncryption");
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07008413 Return<void> retStatus = radioService[slotId]->mRadioIndicationV1_1->
8414 carrierInfoForImsiEncryption(convertIntToRadioIndicationType(indicationType));
8415 radioService[slotId]->checkReturnStatus(retStatus);
pkanwardb8e0942017-03-17 12:49:34 -07008416 } else {
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07008417 RLOGE("carrierInfoForImsiEncryption: radioService[%d]->mRadioIndicationV1_1 == NULL",
8418 slotId);
pkanwardb8e0942017-03-17 12:49:34 -07008419 }
8420
8421 return 0;
8422}
8423
Nathan Harold6a8809d2017-07-07 19:28:58 -07008424int radio::keepaliveStatusInd(int slotId,
8425 int indicationType, int token, RIL_Errno e, void *response,
8426 size_t responseLen) {
8427#if VDBG
8428 RLOGD("%s(): token=%d", __FUNCTION__, token);
8429#endif
8430 if (radioService[slotId] == NULL || radioService[slotId]->mRadioIndication == NULL) {
8431 RLOGE("%s: radioService[%d]->mRadioIndication == NULL", __FUNCTION__, slotId);
8432 return 0;
8433 }
8434
8435 auto ret = V1_1::IRadioIndication::castFrom(
8436 radioService[slotId]->mRadioIndication);
8437 if (!ret.isOk()) {
8438 RLOGE("%s: ret.isOk() == false for radioService[%d]", __FUNCTION__, slotId);
8439 return 0;
8440 }
8441 sp<V1_1::IRadioIndication> radioIndicationV1_1 = ret;
8442
8443 if (response == NULL || responseLen != sizeof(V1_1::KeepaliveStatus)) {
8444 RLOGE("%s: invalid response", __FUNCTION__);
8445 return 0;
8446 }
8447
8448 V1_1::KeepaliveStatus ks;
8449 convertRilKeepaliveStatusToHal(static_cast<RIL_KeepaliveStatus*>(response), ks);
8450
8451 Return<void> retStatus = radioIndicationV1_1->keepaliveStatus(
8452 convertIntToRadioIndicationType(indicationType), ks);
8453 radioService[slotId]->checkReturnStatus(retStatus);
8454 return 0;
8455}
8456
Amit Mahajan759786a2017-03-03 17:35:47 -08008457int radio::oemHookRawInd(int slotId,
Amit Mahajan439da362017-02-13 17:43:04 -08008458 int indicationType, int token, RIL_Errno e, void *response,
8459 size_t responseLen) {
Steven Moreland6cc40042018-03-20 11:20:05 -07008460 if (!kOemHookEnabled) return 0;
8461
Amit Mahajan439da362017-02-13 17:43:04 -08008462 if (oemHookService[slotId] != NULL && oemHookService[slotId]->mOemHookIndication != NULL) {
8463 if (response == NULL || responseLen == 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008464 RLOGE("oemHookRawInd: invalid response");
Amit Mahajan439da362017-02-13 17:43:04 -08008465 return 0;
8466 }
8467
8468 hidl_vec<uint8_t> data;
8469 data.setToExternal((uint8_t *) response, responseLen);
Jayachandran C572f2f42017-03-25 14:30:13 -07008470#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08008471 RLOGD("oemHookRawInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07008472#endif
Amit Mahajan439da362017-02-13 17:43:04 -08008473 Return<void> retStatus = oemHookService[slotId]->mOemHookIndication->oemHookRaw(
8474 convertIntToRadioIndicationType(indicationType), data);
Amit Mahajand423d192017-03-16 17:04:01 -07008475 checkReturnStatus(slotId, retStatus, false);
Amit Mahajan439da362017-02-13 17:43:04 -08008476 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008477 RLOGE("oemHookRawInd: oemHookService[%d]->mOemHookIndication == NULL", slotId);
Amit Mahajan439da362017-02-13 17:43:04 -08008478 }
8479
8480 return 0;
8481}
8482
Amit Mahajancd77a5b2016-08-25 11:19:21 -07008483void radio::registerService(RIL_RadioFunctions *callbacks, CommandInfo *commands) {
8484 using namespace android::hardware;
8485 int simCount = 1;
Amit Mahajan439da362017-02-13 17:43:04 -08008486 const char *serviceNames[] = {
Amit Mahajan7955c432017-03-28 11:17:55 -07008487 android::RIL_getServiceName()
Amit Mahajancd77a5b2016-08-25 11:19:21 -07008488 #if (SIM_COUNT >= 2)
Amit Mahajan7955c432017-03-28 11:17:55 -07008489 , RIL2_SERVICE_NAME
Amit Mahajancd77a5b2016-08-25 11:19:21 -07008490 #if (SIM_COUNT >= 3)
Amit Mahajan7955c432017-03-28 11:17:55 -07008491 , RIL3_SERVICE_NAME
Amit Mahajancd77a5b2016-08-25 11:19:21 -07008492 #if (SIM_COUNT >= 4)
Amit Mahajan7955c432017-03-28 11:17:55 -07008493 , RIL4_SERVICE_NAME
Amit Mahajan439da362017-02-13 17:43:04 -08008494 #endif
8495 #endif
8496 #endif
8497 };
8498
Amit Mahajancd77a5b2016-08-25 11:19:21 -07008499 #if (SIM_COUNT >= 2)
8500 simCount = SIM_COUNT;
8501 #endif
8502
terrycrhuang456df1b2018-05-04 13:47:06 +08008503 s_vendorFunctions = callbacks;
8504 s_commands = commands;
8505
Amit Mahajancd77a5b2016-08-25 11:19:21 -07008506 configureRpcThreadpool(1, true /* callerWillJoin */);
8507 for (int i = 0; i < simCount; i++) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08008508 pthread_rwlock_t *radioServiceRwlockPtr = getRadioServiceRwlock(i);
8509 int ret = pthread_rwlock_wrlock(radioServiceRwlockPtr);
8510 assert(ret == 0);
8511
Amit Mahajancd77a5b2016-08-25 11:19:21 -07008512 radioService[i] = new RadioImpl;
Sanket Padawef220dc52017-01-02 23:46:00 -08008513 radioService[i]->mSlotId = i;
pkanwardb8e0942017-03-17 12:49:34 -07008514 RLOGD("registerService: starting android::hardware::radio::V1_1::IRadio %s",
8515 serviceNames[i]);
Amit Mahajancd77a5b2016-08-25 11:19:21 -07008516 android::status_t status = radioService[i]->registerAsService(serviceNames[i]);
Steven Moreland6cc40042018-03-20 11:20:05 -07008517
8518 if (kOemHookEnabled) {
8519 oemHookService[i] = new OemHookImpl;
8520 oemHookService[i]->mSlotId = i;
8521 status = oemHookService[i]->registerAsService(serviceNames[i]);
8522 }
Amit Mahajan932e08e2017-01-24 05:45:02 -08008523
8524 ret = pthread_rwlock_unlock(radioServiceRwlockPtr);
8525 assert(ret == 0);
Amit Mahajancd77a5b2016-08-25 11:19:21 -07008526 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07008527}
8528
8529void rilc_thread_pool() {
8530 joinRpcThreadpool();
Amit Mahajan932e08e2017-01-24 05:45:02 -08008531}
8532
8533pthread_rwlock_t * radio::getRadioServiceRwlock(int slotId) {
8534 pthread_rwlock_t *radioServiceRwlockPtr = &radioServiceRwlock;
8535
8536 #if (SIM_COUNT >= 2)
8537 if (slotId == 2) radioServiceRwlockPtr = &radioServiceRwlock2;
8538 #if (SIM_COUNT >= 3)
8539 if (slotId == 3) radioServiceRwlockPtr = &radioServiceRwlock3;
8540 #if (SIM_COUNT >= 4)
8541 if (slotId == 4) radioServiceRwlockPtr = &radioServiceRwlock4;
8542 #endif
8543 #endif
8544 #endif
8545
8546 return radioServiceRwlockPtr;
Sanket Padawe0de29d12017-02-10 13:19:47 -08008547}
Amit Mahajane9a10e62018-02-23 17:12:15 -08008548
8549// should acquire write lock for the corresponding service before calling this
8550void radio::setNitzTimeReceived(int slotId, long timeReceived) {
8551 nitzTimeReceived[slotId] = timeReceived;
8552}