blob: 324e1387ff7e93acadbe70d89a8c004c9ae1db84 [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
pkanwarc61837e2017-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 Chen797c1c22017-03-23 18:39:48 -070022#include <android/hardware/radio/1.1/types.h>
pkanwarc61837e2017-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
35using namespace android::hardware::radio::V1_0;
Amit Mahajan439da362017-02-13 17:43:04 -080036using namespace android::hardware::radio::deprecated::V1_0;
Amit Mahajancd77a5b2016-08-25 11:19:21 -070037using ::android::hardware::configureRpcThreadpool;
38using ::android::hardware::joinRpcThreadpool;
39using ::android::hardware::Return;
Amit Mahajancd77a5b2016-08-25 11:19:21 -070040using ::android::hardware::hidl_string;
41using ::android::hardware::hidl_vec;
42using ::android::hardware::hidl_array;
yinxu584379e2017-05-03 15:15:19 -070043using ::android::hardware::radio::V1_1::NetworkScanRequest;
Amit Mahajancd77a5b2016-08-25 11:19:21 -070044using ::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
54RIL_RadioFunctions *s_vendorFunctions = NULL;
Amit Mahajancd77a5b2016-08-25 11:19:21 -070055static CommandInfo *s_commands;
56
57struct RadioImpl;
Amit Mahajan439da362017-02-13 17:43:04 -080058struct OemHookImpl;
Amit Mahajancd77a5b2016-08-25 11:19:21 -070059
60#if (SIM_COUNT >= 2)
61sp<RadioImpl> radioService[SIM_COUNT];
Amit Mahajan439da362017-02-13 17:43:04 -080062sp<OemHookImpl> oemHookService[SIM_COUNT];
63// counter used for synchronization. It is incremented every time response callbacks are updated.
Amit Mahajand423d192017-03-16 17:04:01 -070064volatile int32_t mCounterRadio[SIM_COUNT];
65volatile int32_t mCounterOemHook[SIM_COUNT];
Amit Mahajancd77a5b2016-08-25 11:19:21 -070066#else
67sp<RadioImpl> radioService[1];
Amit Mahajan439da362017-02-13 17:43:04 -080068sp<OemHookImpl> oemHookService[1];
69// counter used for synchronization. It is incremented every time response callbacks are updated.
Amit Mahajand423d192017-03-16 17:04:01 -070070volatile int32_t mCounterRadio[1];
71volatile int32_t mCounterOemHook[1];
Amit Mahajancd77a5b2016-08-25 11:19:21 -070072#endif
73
Amit Mahajan932e08e2017-01-24 05:45:02 -080074static pthread_rwlock_t radioServiceRwlock = PTHREAD_RWLOCK_INITIALIZER;
75
76#if (SIM_COUNT >= 2)
77static pthread_rwlock_t radioServiceRwlock2 = PTHREAD_RWLOCK_INITIALIZER;
78#if (SIM_COUNT >= 3)
79static pthread_rwlock_t radioServiceRwlock3 = PTHREAD_RWLOCK_INITIALIZER;
80#if (SIM_COUNT >= 4)
81static pthread_rwlock_t radioServiceRwlock4 = PTHREAD_RWLOCK_INITIALIZER;
82#endif
83#endif
84#endif
85
Amit Mahajan3df62912017-02-10 01:35:55 +000086void convertRilHardwareConfigListToHal(void *response, size_t responseLen,
87 hidl_vec<HardwareConfig>& records);
88
89void convertRilRadioCapabilityToHal(void *response, size_t responseLen, RadioCapability& rc);
90
91void convertRilLceDataInfoToHal(void *response, size_t responseLen, LceDataInfo& lce);
92
93void convertRilSignalStrengthToHal(void *response, size_t responseLen,
94 SignalStrength& signalStrength);
95
96void convertRilDataCallToHal(RIL_Data_Call_Response_v11 *dcResponse,
97 SetupDataCallResult& dcResult);
98
99void convertRilDataCallListToHal(void *response, size_t responseLen,
100 hidl_vec<SetupDataCallResult>& dcResultList);
101
102void convertRilCellInfoListToHal(void *response, size_t responseLen, hidl_vec<CellInfo>& records);
103
pkanwarc61837e2017-03-17 12:49:34 -0700104struct RadioImpl : public ::android::hardware::radio::V1_1::IRadio {
Sanket Padawef220dc52017-01-02 23:46:00 -0800105 int32_t mSlotId;
106 sp<IRadioResponse> mRadioResponse;
107 sp<IRadioIndication> mRadioIndication;
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700108
109 Return<void> setResponseFunctions(
110 const ::android::sp<IRadioResponse>& radioResponse,
111 const ::android::sp<IRadioIndication>& radioIndication);
112
113 Return<void> getIccCardStatus(int32_t serial);
114
Sanket Padawef220dc52017-01-02 23:46:00 -0800115 Return<void> supplyIccPinForApp(int32_t serial, const hidl_string& pin,
116 const hidl_string& aid);
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700117
Sanket Padawef220dc52017-01-02 23:46:00 -0800118 Return<void> supplyIccPukForApp(int32_t serial, const hidl_string& puk,
119 const hidl_string& pin, const hidl_string& aid);
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700120
121 Return<void> supplyIccPin2ForApp(int32_t serial,
Sanket Padawef220dc52017-01-02 23:46:00 -0800122 const hidl_string& pin2,
123 const hidl_string& aid);
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700124
Sanket Padawef220dc52017-01-02 23:46:00 -0800125 Return<void> supplyIccPuk2ForApp(int32_t serial, const hidl_string& puk2,
126 const hidl_string& pin2, const hidl_string& aid);
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700127
Sanket Padawef220dc52017-01-02 23:46:00 -0800128 Return<void> changeIccPinForApp(int32_t serial, const hidl_string& oldPin,
129 const hidl_string& newPin, const hidl_string& aid);
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700130
Sanket Padawef220dc52017-01-02 23:46:00 -0800131 Return<void> changeIccPin2ForApp(int32_t serial, const hidl_string& oldPin2,
132 const hidl_string& newPin2, const hidl_string& aid);
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700133
Sanket Padawef220dc52017-01-02 23:46:00 -0800134 Return<void> supplyNetworkDepersonalization(int32_t serial, const hidl_string& netPin);
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700135
136 Return<void> getCurrentCalls(int32_t serial);
137
Sanket Padawef220dc52017-01-02 23:46:00 -0800138 Return<void> dial(int32_t serial, const Dial& dialInfo);
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700139
140 Return<void> getImsiForApp(int32_t serial,
141 const ::android::hardware::hidl_string& aid);
142
143 Return<void> hangup(int32_t serial, int32_t gsmIndex);
144
145 Return<void> hangupWaitingOrBackground(int32_t serial);
146
147 Return<void> hangupForegroundResumeBackground(int32_t serial);
148
149 Return<void> switchWaitingOrHoldingAndActive(int32_t serial);
150
151 Return<void> conference(int32_t serial);
152
153 Return<void> rejectCall(int32_t serial);
154
155 Return<void> getLastCallFailCause(int32_t serial);
156
157 Return<void> getSignalStrength(int32_t serial);
158
159 Return<void> getVoiceRegistrationState(int32_t serial);
160
161 Return<void> getDataRegistrationState(int32_t serial);
162
163 Return<void> getOperator(int32_t serial);
164
165 Return<void> setRadioPower(int32_t serial, bool on);
166
167 Return<void> sendDtmf(int32_t serial,
168 const ::android::hardware::hidl_string& s);
169
170 Return<void> sendSms(int32_t serial, const GsmSmsMessage& message);
171
172 Return<void> sendSMSExpectMore(int32_t serial, const GsmSmsMessage& message);
173
174 Return<void> setupDataCall(int32_t serial,
Jack Yu06181bb2017-01-10 12:10:41 -0800175 RadioTechnology radioTechnology,
176 const DataProfileInfo& profileInfo,
177 bool modemCognitive,
Jack Yuffc06452017-02-13 11:21:00 -0800178 bool roamingAllowed,
179 bool isRoaming);
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700180
181 Return<void> iccIOForApp(int32_t serial,
182 const IccIo& iccIo);
183
184 Return<void> sendUssd(int32_t serial,
185 const ::android::hardware::hidl_string& ussd);
186
187 Return<void> cancelPendingUssd(int32_t serial);
188
189 Return<void> getClir(int32_t serial);
190
191 Return<void> setClir(int32_t serial, int32_t status);
192
193 Return<void> getCallForwardStatus(int32_t serial,
194 const CallForwardInfo& callInfo);
195
196 Return<void> setCallForward(int32_t serial,
197 const CallForwardInfo& callInfo);
198
199 Return<void> getCallWaiting(int32_t serial, int32_t serviceClass);
200
201 Return<void> setCallWaiting(int32_t serial, bool enable, int32_t serviceClass);
202
203 Return<void> acknowledgeLastIncomingGsmSms(int32_t serial,
204 bool success, SmsAcknowledgeFailCause cause);
205
206 Return<void> acceptCall(int32_t serial);
207
208 Return<void> deactivateDataCall(int32_t serial,
209 int32_t cid, bool reasonRadioShutDown);
210
211 Return<void> getFacilityLockForApp(int32_t serial,
212 const ::android::hardware::hidl_string& facility,
213 const ::android::hardware::hidl_string& password,
214 int32_t serviceClass,
215 const ::android::hardware::hidl_string& appId);
216
217 Return<void> setFacilityLockForApp(int32_t serial,
218 const ::android::hardware::hidl_string& facility,
219 bool lockState,
220 const ::android::hardware::hidl_string& password,
221 int32_t serviceClass,
222 const ::android::hardware::hidl_string& appId);
223
224 Return<void> setBarringPassword(int32_t serial,
225 const ::android::hardware::hidl_string& facility,
226 const ::android::hardware::hidl_string& oldPassword,
227 const ::android::hardware::hidl_string& newPassword);
228
229 Return<void> getNetworkSelectionMode(int32_t serial);
230
231 Return<void> setNetworkSelectionModeAutomatic(int32_t serial);
232
233 Return<void> setNetworkSelectionModeManual(int32_t serial,
234 const ::android::hardware::hidl_string& operatorNumeric);
235
236 Return<void> getAvailableNetworks(int32_t serial);
237
yinxu584379e2017-05-03 15:15:19 -0700238 Return<void> startNetworkScan(int32_t serial, const NetworkScanRequest& request);
239
240 Return<void> stopNetworkScan(int32_t serial);
241
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700242 Return<void> startDtmf(int32_t serial,
243 const ::android::hardware::hidl_string& s);
244
245 Return<void> stopDtmf(int32_t serial);
246
247 Return<void> getBasebandVersion(int32_t serial);
248
249 Return<void> separateConnection(int32_t serial, int32_t gsmIndex);
250
251 Return<void> setMute(int32_t serial, bool enable);
252
253 Return<void> getMute(int32_t serial);
254
255 Return<void> getClip(int32_t serial);
256
257 Return<void> getDataCallList(int32_t serial);
258
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700259 Return<void> setSuppServiceNotifications(int32_t serial, bool enable);
260
261 Return<void> writeSmsToSim(int32_t serial,
262 const SmsWriteArgs& smsWriteArgs);
263
264 Return<void> deleteSmsOnSim(int32_t serial, int32_t index);
265
266 Return<void> setBandMode(int32_t serial, RadioBandMode mode);
267
268 Return<void> getAvailableBandModes(int32_t serial);
269
270 Return<void> sendEnvelope(int32_t serial,
271 const ::android::hardware::hidl_string& command);
272
273 Return<void> sendTerminalResponseToSim(int32_t serial,
274 const ::android::hardware::hidl_string& commandResponse);
275
276 Return<void> handleStkCallSetupRequestFromSim(int32_t serial, bool accept);
277
278 Return<void> explicitCallTransfer(int32_t serial);
279
280 Return<void> setPreferredNetworkType(int32_t serial, PreferredNetworkType nwType);
281
282 Return<void> getPreferredNetworkType(int32_t serial);
283
284 Return<void> getNeighboringCids(int32_t serial);
285
286 Return<void> setLocationUpdates(int32_t serial, bool enable);
287
288 Return<void> setCdmaSubscriptionSource(int32_t serial,
289 CdmaSubscriptionSource cdmaSub);
290
291 Return<void> setCdmaRoamingPreference(int32_t serial, CdmaRoamingType type);
292
293 Return<void> getCdmaRoamingPreference(int32_t serial);
294
295 Return<void> setTTYMode(int32_t serial, TtyMode mode);
296
297 Return<void> getTTYMode(int32_t serial);
298
299 Return<void> setPreferredVoicePrivacy(int32_t serial, bool enable);
300
301 Return<void> getPreferredVoicePrivacy(int32_t serial);
302
303 Return<void> sendCDMAFeatureCode(int32_t serial,
304 const ::android::hardware::hidl_string& featureCode);
305
306 Return<void> sendBurstDtmf(int32_t serial,
307 const ::android::hardware::hidl_string& dtmf,
308 int32_t on,
309 int32_t off);
310
311 Return<void> sendCdmaSms(int32_t serial, const CdmaSmsMessage& sms);
312
313 Return<void> acknowledgeLastIncomingCdmaSms(int32_t serial,
314 const CdmaSmsAck& smsAck);
315
316 Return<void> getGsmBroadcastConfig(int32_t serial);
317
318 Return<void> setGsmBroadcastConfig(int32_t serial,
319 const hidl_vec<GsmBroadcastSmsConfigInfo>& configInfo);
320
321 Return<void> setGsmBroadcastActivation(int32_t serial, bool activate);
322
323 Return<void> getCdmaBroadcastConfig(int32_t serial);
324
325 Return<void> setCdmaBroadcastConfig(int32_t serial,
326 const hidl_vec<CdmaBroadcastSmsConfigInfo>& configInfo);
327
328 Return<void> setCdmaBroadcastActivation(int32_t serial, bool activate);
329
330 Return<void> getCDMASubscription(int32_t serial);
331
332 Return<void> writeSmsToRuim(int32_t serial, const CdmaSmsWriteArgs& cdmaSms);
333
334 Return<void> deleteSmsOnRuim(int32_t serial, int32_t index);
335
336 Return<void> getDeviceIdentity(int32_t serial);
337
338 Return<void> exitEmergencyCallbackMode(int32_t serial);
339
340 Return<void> getSmscAddress(int32_t serial);
341
342 Return<void> setSmscAddress(int32_t serial,
343 const ::android::hardware::hidl_string& smsc);
344
345 Return<void> reportSmsMemoryStatus(int32_t serial, bool available);
346
347 Return<void> reportStkServiceIsRunning(int32_t serial);
348
349 Return<void> getCdmaSubscriptionSource(int32_t serial);
350
351 Return<void> requestIsimAuthentication(int32_t serial,
352 const ::android::hardware::hidl_string& challenge);
353
354 Return<void> acknowledgeIncomingGsmSmsWithPdu(int32_t serial,
355 bool success,
356 const ::android::hardware::hidl_string& ackPdu);
357
358 Return<void> sendEnvelopeWithStatus(int32_t serial,
359 const ::android::hardware::hidl_string& contents);
360
361 Return<void> getVoiceRadioTechnology(int32_t serial);
362
363 Return<void> getCellInfoList(int32_t serial);
364
365 Return<void> setCellInfoListRate(int32_t serial, int32_t rate);
366
Jack Yu06181bb2017-01-10 12:10:41 -0800367 Return<void> setInitialAttachApn(int32_t serial, const DataProfileInfo& dataProfileInfo,
Jack Yuffc06452017-02-13 11:21:00 -0800368 bool modemCognitive, bool isRoaming);
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700369
370 Return<void> getImsRegistrationState(int32_t serial);
371
372 Return<void> sendImsSms(int32_t serial, const ImsSmsMessage& message);
373
374 Return<void> iccTransmitApduBasicChannel(int32_t serial, const SimApdu& message);
375
376 Return<void> iccOpenLogicalChannel(int32_t serial,
Wileen Chiu410b7562015-11-23 14:25:22 -0800377 const ::android::hardware::hidl_string& aid, int32_t p2);
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700378
379 Return<void> iccCloseLogicalChannel(int32_t serial, int32_t channelId);
380
381 Return<void> iccTransmitApduLogicalChannel(int32_t serial, const SimApdu& message);
382
383 Return<void> nvReadItem(int32_t serial, NvItem itemId);
384
385 Return<void> nvWriteItem(int32_t serial, const NvWriteItem& item);
386
387 Return<void> nvWriteCdmaPrl(int32_t serial,
388 const ::android::hardware::hidl_vec<uint8_t>& prl);
389
390 Return<void> nvResetConfig(int32_t serial, ResetNvType resetType);
391
392 Return<void> setUiccSubscription(int32_t serial, const SelectUiccSub& uiccSub);
393
394 Return<void> setDataAllowed(int32_t serial, bool allow);
395
396 Return<void> getHardwareConfig(int32_t serial);
397
398 Return<void> requestIccSimAuthentication(int32_t serial,
399 int32_t authContext,
400 const ::android::hardware::hidl_string& authData,
401 const ::android::hardware::hidl_string& aid);
402
403 Return<void> setDataProfile(int32_t serial,
Jack Yuffc06452017-02-13 11:21:00 -0800404 const ::android::hardware::hidl_vec<DataProfileInfo>& profiles, bool isRoaming);
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700405
406 Return<void> requestShutdown(int32_t serial);
407
408 Return<void> getRadioCapability(int32_t serial);
409
410 Return<void> setRadioCapability(int32_t serial, const RadioCapability& rc);
411
412 Return<void> startLceService(int32_t serial, int32_t reportInterval, bool pullMode);
413
414 Return<void> stopLceService(int32_t serial);
415
416 Return<void> pullLceData(int32_t serial);
417
418 Return<void> getModemActivityInfo(int32_t serial);
419
420 Return<void> setAllowedCarriers(int32_t serial,
421 bool allAllowed,
422 const CarrierRestrictions& carriers);
423
424 Return<void> getAllowedCarriers(int32_t serial);
425
Jack Yu06181bb2017-01-10 12:10:41 -0800426 Return<void> sendDeviceState(int32_t serial, DeviceStateType deviceStateType, bool state);
427
428 Return<void> setIndicationFilter(int32_t serial, int32_t indicationFilter);
429
Wileen Chiu718c0bf2017-01-04 11:37:19 -0800430 Return<void> setSimCardPower(int32_t serial, bool powerUp);
Grace Chen797c1c22017-03-23 18:39:48 -0700431 Return<void> setSimCardPower_1_1(int32_t serial,
432 const ::android::hardware::radio::V1_1::CardPowerState state);
Wileen Chiu718c0bf2017-01-04 11:37:19 -0800433
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700434 Return<void> responseAcknowledgement();
Amit Mahajan17249842017-01-19 15:05:45 -0800435
pkanwarc61837e2017-03-17 12:49:34 -0700436 Return<void> setCarrierInfoForImsiEncryption(int32_t serial,
pkanwarb10761e2017-05-21 10:24:30 -0700437 const ::android::hardware::radio::V1_1::ImsiEncryptionInfo& message);
pkanwarc61837e2017-03-17 12:49:34 -0700438
Amit Mahajan17249842017-01-19 15:05:45 -0800439 void checkReturnStatus(Return<void>& ret);
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700440};
441
Amit Mahajan439da362017-02-13 17:43:04 -0800442struct OemHookImpl : public IOemHook {
443 int32_t mSlotId;
444 sp<IOemHookResponse> mOemHookResponse;
445 sp<IOemHookIndication> mOemHookIndication;
446
447 Return<void> setResponseFunctions(
448 const ::android::sp<IOemHookResponse>& oemHookResponse,
449 const ::android::sp<IOemHookIndication>& oemHookIndication);
450
451 Return<void> sendRequestRaw(int32_t serial,
452 const ::android::hardware::hidl_vec<uint8_t>& data);
453
454 Return<void> sendRequestStrings(int32_t serial,
455 const ::android::hardware::hidl_vec<::android::hardware::hidl_string>& data);
456};
457
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800458void memsetAndFreeStrings(int numPointers, ...) {
459 va_list ap;
460 va_start(ap, numPointers);
461 for (int i = 0; i < numPointers; i++) {
462 char *ptr = va_arg(ap, char *);
463 if (ptr) {
464#ifdef MEMSET_FREED
Jack Yub4295a42017-04-14 12:51:49 -0700465#define MAX_STRING_LENGTH 4096
466 memset(ptr, 0, strnlen(ptr, MAX_STRING_LENGTH));
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800467#endif
468 free(ptr);
469 }
470 }
471 va_end(ap);
472}
473
Jack Yuffc06452017-02-13 11:21:00 -0800474void sendErrorResponse(RequestInfo *pRI, RIL_Errno err) {
Amit Mahajan759786a2017-03-03 17:35:47 -0800475 pRI->pCI->responseFunction((int) pRI->socket_id,
Jack Yuffc06452017-02-13 11:21:00 -0800476 (int) RadioResponseType::SOLICITED, pRI->token, err, NULL, 0);
477}
478
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800479/**
Jack Yuf68e0da2017-02-07 14:53:09 -0800480 * Copies over src to dest. If memory allocation fails, responseFunction() is called for the
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800481 * request with error RIL_E_NO_MEMORY.
482 * Returns true on success, and false on failure.
483 */
Jack Yuf68e0da2017-02-07 14:53:09 -0800484bool copyHidlStringToRil(char **dest, const hidl_string &src, RequestInfo *pRI) {
485 size_t len = src.size();
486 if (len == 0) {
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800487 *dest = NULL;
488 return true;
489 }
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800490 *dest = (char *) calloc(len + 1, sizeof(char));
491 if (*dest == NULL) {
492 RLOGE("Memory allocation failed for request %s", requestToString(pRI->pCI->requestNumber));
Jack Yuffc06452017-02-13 11:21:00 -0800493 sendErrorResponse(pRI, RIL_E_NO_MEMORY);
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800494 return false;
495 }
Scott Randolphc7213312017-04-03 14:06:40 -0700496 strncpy(*dest, src.c_str(), len + 1);
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800497 return true;
498}
499
500hidl_string convertCharPtrToHidlString(const char *ptr) {
501 hidl_string ret;
502 if (ptr != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -0800503 // TODO: replace this with strnlen
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800504 ret.setToExternal(ptr, strlen(ptr));
505 }
506 return ret;
507}
508
509bool dispatchVoid(int serial, int slotId, int request) {
510 RequestInfo *pRI = android::addRequestToList(serial, slotId, request);
511 if (pRI == NULL) {
512 return false;
513 }
514 s_vendorFunctions->onRequest(request, NULL, 0, pRI);
515 return true;
516}
517
518bool dispatchString(int serial, int slotId, int request, const char * str) {
519 RequestInfo *pRI = android::addRequestToList(serial, slotId, request);
520 if (pRI == NULL) {
521 return false;
522 }
523
524 char *pString;
525 if (!copyHidlStringToRil(&pString, str, pRI)) {
526 return false;
527 }
528
529 s_vendorFunctions->onRequest(request, pString, sizeof(char *), pRI);
530
531 memsetAndFreeStrings(1, pString);
532 return true;
533}
534
535bool dispatchStrings(int serial, int slotId, int request, int countStrings, ...) {
536 RequestInfo *pRI = android::addRequestToList(serial, slotId, request);
537 if (pRI == NULL) {
538 return false;
539 }
540
Sanket Padawef220dc52017-01-02 23:46:00 -0800541 char **pStrings;
Sanket Padawef220dc52017-01-02 23:46:00 -0800542 pStrings = (char **)calloc(countStrings, sizeof(char *));
543 if (pStrings == NULL) {
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800544 RLOGE("Memory allocation failed for request %s", requestToString(request));
Jack Yuffc06452017-02-13 11:21:00 -0800545 sendErrorResponse(pRI, RIL_E_NO_MEMORY);
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800546 return false;
Sanket Padawef220dc52017-01-02 23:46:00 -0800547 }
548 va_list ap;
549 va_start(ap, countStrings);
550 for (int i = 0; i < countStrings; i++) {
551 const char* str = va_arg(ap, const char *);
Jack Yuc13645e2017-04-13 20:55:03 -0700552 if (!copyHidlStringToRil(&pStrings[i], hidl_string(str), pRI)) {
Sanket Padawef220dc52017-01-02 23:46:00 -0800553 va_end(ap);
Sanket Padawef220dc52017-01-02 23:46:00 -0800554 for (int j = 0; j < i; j++) {
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800555 memsetAndFreeStrings(1, pStrings[j]);
Sanket Padawef220dc52017-01-02 23:46:00 -0800556 }
557 free(pStrings);
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800558 return false;
Sanket Padawef220dc52017-01-02 23:46:00 -0800559 }
Sanket Padawef220dc52017-01-02 23:46:00 -0800560 }
561 va_end(ap);
562
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800563 s_vendorFunctions->onRequest(request, pStrings, countStrings * sizeof(char *), pRI);
Sanket Padawef220dc52017-01-02 23:46:00 -0800564
565 if (pStrings != NULL) {
566 for (int i = 0 ; i < countStrings ; i++) {
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800567 memsetAndFreeStrings(1, pStrings[i]);
Sanket Padawef220dc52017-01-02 23:46:00 -0800568 }
569
570#ifdef MEMSET_FREED
571 memset(pStrings, 0, countStrings * sizeof(char *));
572#endif
573 free(pStrings);
574 }
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800575 return true;
576}
577
578bool dispatchStrings(int serial, int slotId, int request, const hidl_vec<hidl_string>& data) {
579 RequestInfo *pRI = android::addRequestToList(serial, slotId, request);
580 if (pRI == NULL) {
581 return false;
582 }
583
584 int countStrings = data.size();
585 char **pStrings;
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800586 pStrings = (char **)calloc(countStrings, sizeof(char *));
587 if (pStrings == NULL) {
588 RLOGE("Memory allocation failed for request %s", requestToString(request));
Jack Yuffc06452017-02-13 11:21:00 -0800589 sendErrorResponse(pRI, RIL_E_NO_MEMORY);
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800590 return false;
591 }
592
593 for (int i = 0; i < countStrings; i++) {
Jack Yuf68e0da2017-02-07 14:53:09 -0800594 if (!copyHidlStringToRil(&pStrings[i], data[i], pRI)) {
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800595 for (int j = 0; j < i; j++) {
596 memsetAndFreeStrings(1, pStrings[j]);
597 }
598 free(pStrings);
599 return false;
600 }
601 }
602
603 s_vendorFunctions->onRequest(request, pStrings, countStrings * sizeof(char *), pRI);
604
605 if (pStrings != NULL) {
606 for (int i = 0 ; i < countStrings ; i++) {
607 memsetAndFreeStrings(1, pStrings[i]);
608 }
609
610#ifdef MEMSET_FREED
611 memset(pStrings, 0, countStrings * sizeof(char *));
612#endif
613 free(pStrings);
614 }
615 return true;
616}
617
618bool dispatchInts(int serial, int slotId, int request, int countInts, ...) {
619 RequestInfo *pRI = android::addRequestToList(serial, slotId, request);
620 if (pRI == NULL) {
621 return false;
622 }
623
Jack Yuffc06452017-02-13 11:21:00 -0800624 int *pInts = (int *)calloc(countInts, sizeof(int));
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800625
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800626 if (pInts == NULL) {
627 RLOGE("Memory allocation failed for request %s", requestToString(request));
Jack Yuffc06452017-02-13 11:21:00 -0800628 sendErrorResponse(pRI, RIL_E_NO_MEMORY);
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800629 return false;
630 }
631 va_list ap;
632 va_start(ap, countInts);
633 for (int i = 0; i < countInts; i++) {
634 pInts[i] = va_arg(ap, int);
635 }
636 va_end(ap);
637
638 s_vendorFunctions->onRequest(request, pInts, countInts * sizeof(int), pRI);
639
640 if (pInts != NULL) {
641#ifdef MEMSET_FREED
642 memset(pInts, 0, countInts * sizeof(int));
643#endif
644 free(pInts);
645 }
646 return true;
647}
648
649bool dispatchCallForwardStatus(int serial, int slotId, int request,
650 const CallForwardInfo& callInfo) {
651 RequestInfo *pRI = android::addRequestToList(serial, slotId, request);
652 if (pRI == NULL) {
653 return false;
654 }
655
656 RIL_CallForwardInfo cf;
657 cf.status = (int) callInfo.status;
658 cf.reason = callInfo.reason;
659 cf.serviceClass = callInfo.serviceClass;
660 cf.toa = callInfo.toa;
661 cf.timeSeconds = callInfo.timeSeconds;
662
663 if (!copyHidlStringToRil(&cf.number, callInfo.number, pRI)) {
664 return false;
665 }
666
667 s_vendorFunctions->onRequest(request, &cf, sizeof(cf), pRI);
668
669 memsetAndFreeStrings(1, cf.number);
670
671 return true;
672}
673
674bool dispatchRaw(int serial, int slotId, int request, const hidl_vec<uint8_t>& rawBytes) {
675 RequestInfo *pRI = android::addRequestToList(serial, slotId, request);
676 if (pRI == NULL) {
677 return false;
678 }
679
680 const uint8_t *uData = rawBytes.data();
681
682 s_vendorFunctions->onRequest(request, (void *) uData, rawBytes.size(), pRI);
683
684 return true;
685}
686
687bool dispatchIccApdu(int serial, int slotId, int request, const SimApdu& message) {
688 RequestInfo *pRI = android::addRequestToList(serial, slotId, request);
689 if (pRI == NULL) {
690 return false;
691 }
692
Jack Yu8e732d42017-04-14 00:08:06 -0700693 RIL_SIM_APDU apdu = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800694
695 apdu.sessionid = message.sessionId;
696 apdu.cla = message.cla;
697 apdu.instruction = message.instruction;
698 apdu.p1 = message.p1;
699 apdu.p2 = message.p2;
700 apdu.p3 = message.p3;
701
702 if (!copyHidlStringToRil(&apdu.data, message.data, pRI)) {
703 return false;
704 }
705
706 s_vendorFunctions->onRequest(request, &apdu, sizeof(apdu), pRI);
707
708 memsetAndFreeStrings(1, apdu.data);
709
710 return true;
Sanket Padawef220dc52017-01-02 23:46:00 -0800711}
712
Amit Mahajand423d192017-03-16 17:04:01 -0700713void checkReturnStatus(int32_t slotId, Return<void>& ret, bool isRadioService) {
Amit Mahajan17249842017-01-19 15:05:45 -0800714 if (ret.isOk() == false) {
Amit Mahajan439da362017-02-13 17:43:04 -0800715 RLOGE("checkReturnStatus: unable to call response/indication callback");
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800716 // Remote process hosting the callbacks must be dead. Reset the callback objects;
Amit Mahajan17249842017-01-19 15:05:45 -0800717 // there's no other recovery to be done here. When the client process is back up, it will
718 // call setResponseFunctions()
Amit Mahajan932e08e2017-01-24 05:45:02 -0800719
720 // Caller should already hold rdlock, release that first
721 // note the current counter to avoid overwriting updates made by another thread before
722 // write lock is acquired.
Amit Mahajand423d192017-03-16 17:04:01 -0700723 int counter = isRadioService ? mCounterRadio[slotId] : mCounterOemHook[slotId];
Amit Mahajan439da362017-02-13 17:43:04 -0800724 pthread_rwlock_t *radioServiceRwlockPtr = radio::getRadioServiceRwlock(slotId);
Amit Mahajan932e08e2017-01-24 05:45:02 -0800725 int ret = pthread_rwlock_unlock(radioServiceRwlockPtr);
726 assert(ret == 0);
727
728 // acquire wrlock
729 ret = pthread_rwlock_wrlock(radioServiceRwlockPtr);
730 assert(ret == 0);
731
732 // make sure the counter value has not changed
Amit Mahajand423d192017-03-16 17:04:01 -0700733 if (counter == (isRadioService ? mCounterRadio[slotId] : mCounterOemHook[slotId])) {
734 if (isRadioService) {
735 radioService[slotId]->mRadioResponse = NULL;
736 radioService[slotId]->mRadioIndication = NULL;
737 } else {
738 oemHookService[slotId]->mOemHookResponse = NULL;
739 oemHookService[slotId]->mOemHookIndication = NULL;
740 }
741 isRadioService ? mCounterRadio[slotId]++ : mCounterOemHook[slotId]++;
Amit Mahajan932e08e2017-01-24 05:45:02 -0800742 } else {
Amit Mahajan439da362017-02-13 17:43:04 -0800743 RLOGE("checkReturnStatus: not resetting responseFunctions as they likely "
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800744 "got updated on another thread");
Amit Mahajan932e08e2017-01-24 05:45:02 -0800745 }
746
747 // release wrlock
748 ret = pthread_rwlock_unlock(radioServiceRwlockPtr);
749 assert(ret == 0);
750
751 // Reacquire rdlock
752 ret = pthread_rwlock_rdlock(radioServiceRwlockPtr);
753 assert(ret == 0);
Amit Mahajan17249842017-01-19 15:05:45 -0800754 }
755}
756
Amit Mahajan439da362017-02-13 17:43:04 -0800757void RadioImpl::checkReturnStatus(Return<void>& ret) {
Amit Mahajand423d192017-03-16 17:04:01 -0700758 ::checkReturnStatus(mSlotId, ret, true);
Amit Mahajan439da362017-02-13 17:43:04 -0800759}
760
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700761Return<void> RadioImpl::setResponseFunctions(
762 const ::android::sp<IRadioResponse>& radioResponseParam,
763 const ::android::sp<IRadioIndication>& radioIndicationParam) {
Amit Mahajan111ddca2017-03-03 12:05:13 -0800764 RLOGD("setResponseFunctions");
Amit Mahajan932e08e2017-01-24 05:45:02 -0800765
766 pthread_rwlock_t *radioServiceRwlockPtr = radio::getRadioServiceRwlock(mSlotId);
767 int ret = pthread_rwlock_wrlock(radioServiceRwlockPtr);
768 assert(ret == 0);
769
Sanket Padawef220dc52017-01-02 23:46:00 -0800770 mRadioResponse = radioResponseParam;
771 mRadioIndication = radioIndicationParam;
Amit Mahajand423d192017-03-16 17:04:01 -0700772 mCounterRadio[mSlotId]++;
Amit Mahajan932e08e2017-01-24 05:45:02 -0800773
774 ret = pthread_rwlock_unlock(radioServiceRwlockPtr);
775 assert(ret == 0);
776
Amit Mahajan60482fd2017-03-14 16:39:27 -0700777 // client is connected. Send initial indications.
778 android::onNewCommandConnect((RIL_SOCKET_ID) mSlotId);
779
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800780 return Void();
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700781}
782
783Return<void> RadioImpl::getIccCardStatus(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -0700784#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -0800785 RLOGD("getIccCardStatus: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -0700786#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800787 dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_SIM_STATUS);
788 return Void();
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700789}
790
Sanket Padawef220dc52017-01-02 23:46:00 -0800791Return<void> RadioImpl::supplyIccPinForApp(int32_t serial, const hidl_string& pin,
792 const hidl_string& aid) {
Jayachandran C572f2f42017-03-25 14:30:13 -0700793#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -0800794 RLOGD("supplyIccPinForApp: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -0700795#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800796 dispatchStrings(serial, mSlotId, RIL_REQUEST_ENTER_SIM_PIN,
Scott Randolphc7213312017-04-03 14:06:40 -0700797 2, pin.c_str(), aid.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800798 return Void();
Sanket Padawef220dc52017-01-02 23:46:00 -0800799}
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700800
Sanket Padawef220dc52017-01-02 23:46:00 -0800801Return<void> RadioImpl::supplyIccPukForApp(int32_t serial, const hidl_string& puk,
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800802 const hidl_string& pin, const hidl_string& aid) {
Jayachandran C572f2f42017-03-25 14:30:13 -0700803#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -0800804 RLOGD("supplyIccPukForApp: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -0700805#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800806 dispatchStrings(serial, mSlotId, RIL_REQUEST_ENTER_SIM_PUK,
Scott Randolphc7213312017-04-03 14:06:40 -0700807 3, puk.c_str(), pin.c_str(), aid.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800808 return Void();
Sanket Padawef220dc52017-01-02 23:46:00 -0800809}
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700810
Sanket Padawef220dc52017-01-02 23:46:00 -0800811Return<void> RadioImpl::supplyIccPin2ForApp(int32_t serial, const hidl_string& pin2,
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800812 const hidl_string& aid) {
Jayachandran C572f2f42017-03-25 14:30:13 -0700813#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -0800814 RLOGD("supplyIccPin2ForApp: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -0700815#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800816 dispatchStrings(serial, mSlotId, RIL_REQUEST_ENTER_SIM_PIN2,
Scott Randolphc7213312017-04-03 14:06:40 -0700817 2, pin2.c_str(), aid.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800818 return Void();
Sanket Padawef220dc52017-01-02 23:46:00 -0800819}
820
821Return<void> RadioImpl::supplyIccPuk2ForApp(int32_t serial, const hidl_string& puk2,
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800822 const hidl_string& pin2, const hidl_string& aid) {
Jayachandran C572f2f42017-03-25 14:30:13 -0700823#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -0800824 RLOGD("supplyIccPuk2ForApp: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -0700825#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800826 dispatchStrings(serial, mSlotId, RIL_REQUEST_ENTER_SIM_PUK2,
Scott Randolphc7213312017-04-03 14:06:40 -0700827 3, puk2.c_str(), pin2.c_str(), aid.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800828 return Void();
Sanket Padawef220dc52017-01-02 23:46:00 -0800829}
830
831Return<void> RadioImpl::changeIccPinForApp(int32_t serial, const hidl_string& oldPin,
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800832 const hidl_string& newPin, const hidl_string& aid) {
Jayachandran C572f2f42017-03-25 14:30:13 -0700833#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -0800834 RLOGD("changeIccPinForApp: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -0700835#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800836 dispatchStrings(serial, mSlotId, RIL_REQUEST_CHANGE_SIM_PIN,
Scott Randolphc7213312017-04-03 14:06:40 -0700837 3, oldPin.c_str(), newPin.c_str(), aid.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800838 return Void();
Sanket Padawef220dc52017-01-02 23:46:00 -0800839}
840
841Return<void> RadioImpl::changeIccPin2ForApp(int32_t serial, const hidl_string& oldPin2,
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800842 const hidl_string& newPin2, const hidl_string& aid) {
Jayachandran C572f2f42017-03-25 14:30:13 -0700843#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -0800844 RLOGD("changeIccPin2ForApp: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -0700845#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800846 dispatchStrings(serial, mSlotId, RIL_REQUEST_CHANGE_SIM_PIN2,
Scott Randolphc7213312017-04-03 14:06:40 -0700847 3, oldPin2.c_str(), newPin2.c_str(), aid.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800848 return Void();
Sanket Padawef220dc52017-01-02 23:46:00 -0800849}
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700850
851Return<void> RadioImpl::supplyNetworkDepersonalization(int32_t serial,
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800852 const hidl_string& netPin) {
Jayachandran C572f2f42017-03-25 14:30:13 -0700853#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -0800854 RLOGD("supplyNetworkDepersonalization: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -0700855#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800856 dispatchStrings(serial, mSlotId, RIL_REQUEST_ENTER_NETWORK_DEPERSONALIZATION,
Scott Randolphc7213312017-04-03 14:06:40 -0700857 1, netPin.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800858 return Void();
Sanket Padawef220dc52017-01-02 23:46:00 -0800859}
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700860
Sanket Padawef220dc52017-01-02 23:46:00 -0800861Return<void> RadioImpl::getCurrentCalls(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -0700862#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -0800863 RLOGD("getCurrentCalls: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -0700864#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800865 dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_CURRENT_CALLS);
866 return Void();
Sanket Padawef220dc52017-01-02 23:46:00 -0800867}
868
869Return<void> RadioImpl::dial(int32_t serial, const Dial& dialInfo) {
Jayachandran C572f2f42017-03-25 14:30:13 -0700870#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -0800871 RLOGD("dial: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -0700872#endif
Sanket Padawef220dc52017-01-02 23:46:00 -0800873 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_DIAL);
874 if (pRI == NULL) {
875 return Void();
876 }
Jack Yuf68e0da2017-02-07 14:53:09 -0800877 RIL_Dial dial = {};
878 RIL_UUS_Info uusInfo = {};
Sanket Padawef220dc52017-01-02 23:46:00 -0800879 int32_t sizeOfDial = sizeof(dial);
880
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800881 if (!copyHidlStringToRil(&dial.address, dialInfo.address, pRI)) {
Sanket Padawef220dc52017-01-02 23:46:00 -0800882 return Void();
883 }
Jack Yuf68e0da2017-02-07 14:53:09 -0800884 dial.clir = (int) dialInfo.clir;
Sanket Padawef220dc52017-01-02 23:46:00 -0800885
Sanket Padawef220dc52017-01-02 23:46:00 -0800886 if (dialInfo.uusInfo.size() != 0) {
Sanket Padawef220dc52017-01-02 23:46:00 -0800887 uusInfo.uusType = (RIL_UUS_Type) dialInfo.uusInfo[0].uusType;
888 uusInfo.uusDcs = (RIL_UUS_DCS) dialInfo.uusInfo[0].uusDcs;
889
890 if (dialInfo.uusInfo[0].uusData.size() == 0) {
891 uusInfo.uusData = NULL;
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800892 uusInfo.uusLength = 0;
Sanket Padawef220dc52017-01-02 23:46:00 -0800893 } else {
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800894 if (!copyHidlStringToRil(&uusInfo.uusData, dialInfo.uusInfo[0].uusData, pRI)) {
895 memsetAndFreeStrings(1, dial.address);
Sanket Padawef220dc52017-01-02 23:46:00 -0800896 return Void();
897 }
Jack Yuf68e0da2017-02-07 14:53:09 -0800898 uusInfo.uusLength = dialInfo.uusInfo[0].uusData.size();
Sanket Padawef220dc52017-01-02 23:46:00 -0800899 }
900
Sanket Padawef220dc52017-01-02 23:46:00 -0800901 dial.uusInfo = &uusInfo;
902 }
903
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800904 s_vendorFunctions->onRequest(RIL_REQUEST_DIAL, &dial, sizeOfDial, pRI);
Sanket Padawef220dc52017-01-02 23:46:00 -0800905
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800906 memsetAndFreeStrings(2, dial.address, uusInfo.uusData);
Sanket Padawef220dc52017-01-02 23:46:00 -0800907
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800908 return Void();
Sanket Padawef220dc52017-01-02 23:46:00 -0800909}
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700910
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800911Return<void> RadioImpl::getImsiForApp(int32_t serial, const hidl_string& aid) {
Jayachandran C572f2f42017-03-25 14:30:13 -0700912#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -0800913 RLOGD("getImsiForApp: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -0700914#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800915 dispatchStrings(serial, mSlotId, RIL_REQUEST_GET_IMSI,
Scott Randolphc7213312017-04-03 14:06:40 -0700916 1, aid.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800917 return Void();
918}
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700919
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800920Return<void> RadioImpl::hangup(int32_t serial, int32_t gsmIndex) {
Jayachandran C572f2f42017-03-25 14:30:13 -0700921#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -0800922 RLOGD("hangup: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -0700923#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800924 dispatchInts(serial, mSlotId, RIL_REQUEST_HANGUP, 1, gsmIndex);
925 return Void();
926}
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700927
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800928Return<void> RadioImpl::hangupWaitingOrBackground(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -0700929#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -0800930 RLOGD("hangupWaitingOrBackground: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -0700931#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800932 dispatchVoid(serial, mSlotId, RIL_REQUEST_HANGUP_WAITING_OR_BACKGROUND);
933 return Void();
934}
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700935
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800936Return<void> RadioImpl::hangupForegroundResumeBackground(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -0700937#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -0800938 RLOGD("hangupForegroundResumeBackground: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -0700939#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800940 dispatchVoid(serial, mSlotId, RIL_REQUEST_HANGUP_FOREGROUND_RESUME_BACKGROUND);
941 return Void();
942}
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700943
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800944Return<void> RadioImpl::switchWaitingOrHoldingAndActive(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -0700945#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -0800946 RLOGD("switchWaitingOrHoldingAndActive: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -0700947#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800948 dispatchVoid(serial, mSlotId, RIL_REQUEST_SWITCH_WAITING_OR_HOLDING_AND_ACTIVE);
949 return Void();
950}
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700951
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800952Return<void> RadioImpl::conference(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -0700953#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -0800954 RLOGD("conference: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -0700955#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800956 dispatchVoid(serial, mSlotId, RIL_REQUEST_CONFERENCE);
957 return Void();
958}
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700959
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800960Return<void> RadioImpl::rejectCall(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -0700961#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -0800962 RLOGD("rejectCall: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -0700963#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800964 dispatchVoid(serial, mSlotId, RIL_REQUEST_UDUB);
965 return Void();
966}
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700967
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800968Return<void> RadioImpl::getLastCallFailCause(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -0700969#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -0800970 RLOGD("getLastCallFailCause: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -0700971#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800972 dispatchVoid(serial, mSlotId, RIL_REQUEST_LAST_CALL_FAIL_CAUSE);
973 return Void();
974}
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700975
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800976Return<void> RadioImpl::getSignalStrength(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -0700977#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -0800978 RLOGD("getSignalStrength: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -0700979#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800980 dispatchVoid(serial, mSlotId, RIL_REQUEST_SIGNAL_STRENGTH);
981 return Void();
982}
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700983
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800984Return<void> RadioImpl::getVoiceRegistrationState(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -0700985#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -0800986 RLOGD("getVoiceRegistrationState: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -0700987#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800988 dispatchVoid(serial, mSlotId, RIL_REQUEST_VOICE_REGISTRATION_STATE);
989 return Void();
990}
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700991
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800992Return<void> RadioImpl::getDataRegistrationState(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -0700993#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -0800994 RLOGD("getDataRegistrationState: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -0700995#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800996 dispatchVoid(serial, mSlotId, RIL_REQUEST_DATA_REGISTRATION_STATE);
997 return Void();
998}
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700999
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001000Return<void> RadioImpl::getOperator(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001001#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001002 RLOGD("getOperator: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001003#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001004 dispatchVoid(serial, mSlotId, RIL_REQUEST_OPERATOR);
1005 return Void();
1006}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001007
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001008Return<void> RadioImpl::setRadioPower(int32_t serial, bool on) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08001009 RLOGD("setRadioPower: serial %d on %d", serial, on);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001010 dispatchInts(serial, mSlotId, RIL_REQUEST_RADIO_POWER, 1, BOOL_TO_INT(on));
1011 return Void();
1012}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001013
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001014Return<void> RadioImpl::sendDtmf(int32_t serial, const hidl_string& s) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001015#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001016 RLOGD("sendDtmf: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001017#endif
Scott Randolphc7213312017-04-03 14:06:40 -07001018 dispatchString(serial, mSlotId, RIL_REQUEST_DTMF, s.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001019 return Void();
1020}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001021
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001022Return<void> RadioImpl::sendSms(int32_t serial, const GsmSmsMessage& message) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001023#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001024 RLOGD("sendSms: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001025#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001026 dispatchStrings(serial, mSlotId, RIL_REQUEST_SEND_SMS,
Scott Randolphc7213312017-04-03 14:06:40 -07001027 2, message.smscPdu.c_str(), message.pdu.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001028 return Void();
1029}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001030
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001031Return<void> RadioImpl::sendSMSExpectMore(int32_t serial, const GsmSmsMessage& message) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001032#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001033 RLOGD("sendSMSExpectMore: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001034#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001035 dispatchStrings(serial, mSlotId, RIL_REQUEST_SEND_SMS_EXPECT_MORE,
Scott Randolphc7213312017-04-03 14:06:40 -07001036 2, message.smscPdu.c_str(), message.pdu.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001037 return Void();
1038}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001039
Jack Yuc13645e2017-04-13 20:55:03 -07001040static bool convertMvnoTypeToString(MvnoType type, char *&str) {
Jack Yuffc06452017-02-13 11:21:00 -08001041 switch (type) {
Jack Yuc13645e2017-04-13 20:55:03 -07001042 case MvnoType::IMSI:
1043 str = (char *)"imsi";
1044 return true;
1045 case MvnoType::GID:
1046 str = (char *)"gid";
1047 return true;
1048 case MvnoType::SPN:
1049 str = (char *)"spn";
1050 return true;
1051 case MvnoType::NONE:
1052 str = (char *)"";
1053 return true;
Jack Yuffc06452017-02-13 11:21:00 -08001054 }
Jack Yuc13645e2017-04-13 20:55:03 -07001055 return false;
Jack Yuffc06452017-02-13 11:21:00 -08001056}
1057
1058Return<void> RadioImpl::setupDataCall(int32_t serial, RadioTechnology radioTechnology,
1059 const DataProfileInfo& dataProfileInfo, bool modemCognitive,
1060 bool roamingAllowed, bool isRoaming) {
1061
Jayachandran C572f2f42017-03-25 14:30:13 -07001062#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001063 RLOGD("setupDataCall: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001064#endif
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001065
Jack Yuffc06452017-02-13 11:21:00 -08001066 if (s_vendorFunctions->version >= 4 && s_vendorFunctions->version <= 14) {
1067 const hidl_string &protocol =
1068 (isRoaming ? dataProfileInfo.roamingProtocol : dataProfileInfo.protocol);
1069 dispatchStrings(serial, mSlotId, RIL_REQUEST_SETUP_DATA_CALL, 7,
1070 std::to_string((int) radioTechnology + 2).c_str(),
1071 std::to_string((int) dataProfileInfo.profileId).c_str(),
1072 dataProfileInfo.apn.c_str(),
1073 dataProfileInfo.user.c_str(),
1074 dataProfileInfo.password.c_str(),
1075 std::to_string((int) dataProfileInfo.authType).c_str(),
1076 protocol.c_str());
1077 } else if (s_vendorFunctions->version >= 15) {
Jack Yuc13645e2017-04-13 20:55:03 -07001078 char *mvnoTypeStr = NULL;
1079 if (!convertMvnoTypeToString(dataProfileInfo.mvnoType, mvnoTypeStr)) {
Jack Yuffc06452017-02-13 11:21:00 -08001080 RequestInfo *pRI = android::addRequestToList(serial, mSlotId,
1081 RIL_REQUEST_SETUP_DATA_CALL);
1082 if (pRI != NULL) {
1083 sendErrorResponse(pRI, RIL_E_INVALID_ARGUMENTS);
1084 }
1085 return Void();
1086 }
1087 dispatchStrings(serial, mSlotId, RIL_REQUEST_SETUP_DATA_CALL, 15,
1088 std::to_string((int) radioTechnology + 2).c_str(),
1089 std::to_string((int) dataProfileInfo.profileId).c_str(),
1090 dataProfileInfo.apn.c_str(),
1091 dataProfileInfo.user.c_str(),
1092 dataProfileInfo.password.c_str(),
1093 std::to_string((int) dataProfileInfo.authType).c_str(),
1094 dataProfileInfo.protocol.c_str(),
1095 dataProfileInfo.roamingProtocol.c_str(),
1096 std::to_string(dataProfileInfo.supportedApnTypesBitmap).c_str(),
1097 std::to_string(dataProfileInfo.bearerBitmap).c_str(),
Jack Yuc13645e2017-04-13 20:55:03 -07001098 modemCognitive ? "1" : "0",
Jack Yuffc06452017-02-13 11:21:00 -08001099 std::to_string(dataProfileInfo.mtu).c_str(),
1100 mvnoTypeStr,
1101 dataProfileInfo.mvnoMatchData.c_str(),
Jack Yuc13645e2017-04-13 20:55:03 -07001102 roamingAllowed ? "1" : "0");
Jack Yuffc06452017-02-13 11:21:00 -08001103 } else {
1104 RLOGE("Unsupported RIL version %d, min version expected 4", s_vendorFunctions->version);
1105 RequestInfo *pRI = android::addRequestToList(serial, mSlotId,
1106 RIL_REQUEST_SETUP_DATA_CALL);
1107 if (pRI != NULL) {
1108 sendErrorResponse(pRI, RIL_E_REQUEST_NOT_SUPPORTED);
1109 }
1110 }
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001111 return Void();
1112}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001113
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001114Return<void> RadioImpl::iccIOForApp(int32_t serial, const IccIo& iccIo) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001115#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001116 RLOGD("iccIOForApp: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001117#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001118 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_SIM_IO);
1119 if (pRI == NULL) {
1120 return Void();
1121 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001122
Jack Yu8e732d42017-04-14 00:08:06 -07001123 RIL_SIM_IO_v6 rilIccIo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001124 rilIccIo.command = iccIo.command;
1125 rilIccIo.fileid = iccIo.fileId;
1126 if (!copyHidlStringToRil(&rilIccIo.path, iccIo.path, pRI)) {
1127 return Void();
1128 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001129
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001130 rilIccIo.p1 = iccIo.p1;
1131 rilIccIo.p2 = iccIo.p2;
1132 rilIccIo.p3 = iccIo.p3;
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001133
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001134 if (!copyHidlStringToRil(&rilIccIo.data, iccIo.data, pRI)) {
1135 memsetAndFreeStrings(1, rilIccIo.path);
1136 return Void();
1137 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001138
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001139 if (!copyHidlStringToRil(&rilIccIo.pin2, iccIo.pin2, pRI)) {
1140 memsetAndFreeStrings(2, rilIccIo.path, rilIccIo.data);
1141 return Void();
1142 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001143
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001144 if (!copyHidlStringToRil(&rilIccIo.aidPtr, iccIo.aid, pRI)) {
1145 memsetAndFreeStrings(3, rilIccIo.path, rilIccIo.data, rilIccIo.pin2);
1146 return Void();
1147 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001148
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001149 s_vendorFunctions->onRequest(RIL_REQUEST_SIM_IO, &rilIccIo, sizeof(rilIccIo), pRI);
1150
1151 memsetAndFreeStrings(4, rilIccIo.path, rilIccIo.data, rilIccIo.pin2, rilIccIo.aidPtr);
1152
1153 return Void();
1154}
1155
1156Return<void> RadioImpl::sendUssd(int32_t serial, const hidl_string& ussd) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001157#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001158 RLOGD("sendUssd: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001159#endif
Scott Randolphc7213312017-04-03 14:06:40 -07001160 dispatchString(serial, mSlotId, RIL_REQUEST_SEND_USSD, ussd.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001161 return Void();
1162}
1163
1164Return<void> RadioImpl::cancelPendingUssd(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001165#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001166 RLOGD("cancelPendingUssd: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001167#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001168 dispatchVoid(serial, mSlotId, RIL_REQUEST_CANCEL_USSD);
1169 return Void();
1170}
1171
1172Return<void> RadioImpl::getClir(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001173#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001174 RLOGD("getClir: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001175#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001176 dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_CLIR);
1177 return Void();
1178}
1179
1180Return<void> RadioImpl::setClir(int32_t serial, int32_t status) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001181#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001182 RLOGD("setClir: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001183#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001184 dispatchInts(serial, mSlotId, RIL_REQUEST_SET_CLIR, 1, status);
1185 return Void();
1186}
1187
1188Return<void> RadioImpl::getCallForwardStatus(int32_t serial, const CallForwardInfo& callInfo) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001189#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001190 RLOGD("getCallForwardStatus: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001191#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001192 dispatchCallForwardStatus(serial, mSlotId, RIL_REQUEST_QUERY_CALL_FORWARD_STATUS,
1193 callInfo);
1194 return Void();
1195}
1196
1197Return<void> RadioImpl::setCallForward(int32_t serial, const CallForwardInfo& callInfo) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001198#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001199 RLOGD("setCallForward: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001200#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001201 dispatchCallForwardStatus(serial, mSlotId, RIL_REQUEST_SET_CALL_FORWARD,
1202 callInfo);
1203 return Void();
1204}
1205
1206Return<void> RadioImpl::getCallWaiting(int32_t serial, int32_t serviceClass) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001207#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001208 RLOGD("getCallWaiting: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001209#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001210 dispatchInts(serial, mSlotId, RIL_REQUEST_QUERY_CALL_WAITING, 1, serviceClass);
1211 return Void();
1212}
1213
1214Return<void> RadioImpl::setCallWaiting(int32_t serial, bool enable, int32_t serviceClass) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001215#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001216 RLOGD("setCallWaiting: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001217#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001218 dispatchInts(serial, mSlotId, RIL_REQUEST_SET_CALL_WAITING, 2, BOOL_TO_INT(enable),
1219 serviceClass);
1220 return Void();
1221}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001222
1223Return<void> RadioImpl::acknowledgeLastIncomingGsmSms(int32_t serial,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001224 bool success, SmsAcknowledgeFailCause cause) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001225#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001226 RLOGD("acknowledgeLastIncomingGsmSms: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001227#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001228 dispatchInts(serial, mSlotId, RIL_REQUEST_SMS_ACKNOWLEDGE, 2, BOOL_TO_INT(success),
1229 cause);
1230 return Void();
1231}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001232
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001233Return<void> RadioImpl::acceptCall(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001234#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001235 RLOGD("acceptCall: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001236#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001237 dispatchVoid(serial, mSlotId, RIL_REQUEST_ANSWER);
1238 return Void();
1239}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001240
1241Return<void> RadioImpl::deactivateDataCall(int32_t serial,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001242 int32_t cid, bool reasonRadioShutDown) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001243#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001244 RLOGD("deactivateDataCall: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001245#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001246 dispatchStrings(serial, mSlotId, RIL_REQUEST_DEACTIVATE_DATA_CALL,
Scott Randolphc7213312017-04-03 14:06:40 -07001247 2, (std::to_string(cid)).c_str(), reasonRadioShutDown ? "1" : "0");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001248 return Void();
1249}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001250
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001251Return<void> RadioImpl::getFacilityLockForApp(int32_t serial, const hidl_string& facility,
1252 const hidl_string& password, int32_t serviceClass,
1253 const hidl_string& appId) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001254#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001255 RLOGD("getFacilityLockForApp: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001256#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001257 dispatchStrings(serial, mSlotId, RIL_REQUEST_QUERY_FACILITY_LOCK,
Scott Randolphc7213312017-04-03 14:06:40 -07001258 4, facility.c_str(), password.c_str(),
1259 (std::to_string(serviceClass)).c_str(), appId.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001260 return Void();
1261}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001262
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001263Return<void> RadioImpl::setFacilityLockForApp(int32_t serial, const hidl_string& facility,
1264 bool lockState, const hidl_string& password,
1265 int32_t serviceClass, const hidl_string& appId) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001266#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001267 RLOGD("setFacilityLockForApp: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001268#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001269 dispatchStrings(serial, mSlotId, RIL_REQUEST_SET_FACILITY_LOCK,
Scott Randolphc7213312017-04-03 14:06:40 -07001270 5, facility.c_str(), lockState ? "1" : "0", password.c_str(),
1271 (std::to_string(serviceClass)).c_str(), appId.c_str() );
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001272 return Void();
1273}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001274
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001275Return<void> RadioImpl::setBarringPassword(int32_t serial, const hidl_string& facility,
1276 const hidl_string& oldPassword,
1277 const hidl_string& newPassword) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001278#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001279 RLOGD("setBarringPassword: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001280#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001281 dispatchStrings(serial, mSlotId, RIL_REQUEST_CHANGE_BARRING_PASSWORD,
Scott Randolphc7213312017-04-03 14:06:40 -07001282 2, oldPassword.c_str(), newPassword.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001283 return Void();
1284}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001285
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001286Return<void> RadioImpl::getNetworkSelectionMode(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001287#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001288 RLOGD("getNetworkSelectionMode: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001289#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001290 dispatchVoid(serial, mSlotId, RIL_REQUEST_QUERY_NETWORK_SELECTION_MODE);
1291 return Void();
1292}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001293
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001294Return<void> RadioImpl::setNetworkSelectionModeAutomatic(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001295#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001296 RLOGD("setNetworkSelectionModeAutomatic: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001297#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001298 dispatchVoid(serial, mSlotId, RIL_REQUEST_SET_NETWORK_SELECTION_AUTOMATIC);
1299 return Void();
1300}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001301
1302Return<void> RadioImpl::setNetworkSelectionModeManual(int32_t serial,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001303 const hidl_string& operatorNumeric) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001304#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001305 RLOGD("setNetworkSelectionModeManual: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001306#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001307 dispatchString(serial, mSlotId, RIL_REQUEST_SET_NETWORK_SELECTION_MANUAL,
Scott Randolphc7213312017-04-03 14:06:40 -07001308 operatorNumeric.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001309 return Void();
1310}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001311
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001312Return<void> RadioImpl::getAvailableNetworks(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001313#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001314 RLOGD("getAvailableNetworks: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001315#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001316 dispatchVoid(serial, mSlotId, RIL_REQUEST_QUERY_AVAILABLE_NETWORKS);
1317 return Void();
1318}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001319
yinxu584379e2017-05-03 15:15:19 -07001320Return<void> RadioImpl::startNetworkScan(int32_t serial, const NetworkScanRequest& request) {
1321#if VDBG
1322 RLOGD("startNetworkScan: serial %d", serial);
1323#endif
yinxu8688abd2017-05-22 11:26:45 -07001324
1325 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_START_NETWORK_SCAN);
1326 if (pRI == NULL) {
1327 return Void();
1328 }
1329
1330 if (request.specifiers.size() > MAX_RADIO_ACCESS_NETWORKS) {
1331 sendErrorResponse(pRI, RIL_E_INVALID_ARGUMENTS);
1332 return Void();
1333 }
1334
1335 RIL_NetworkScanRequest scan_request = {};
1336
1337 scan_request.type = (RIL_ScanType) request.type;
1338 scan_request.interval = request.interval;
1339 scan_request.specifiers_length = request.specifiers.size();
1340 for (size_t i = 0; i < request.specifiers.size(); ++i) {
1341 if (request.specifiers[i].geranBands.size() > MAX_BANDS ||
1342 request.specifiers[i].utranBands.size() > MAX_BANDS ||
1343 request.specifiers[i].eutranBands.size() > MAX_BANDS ||
1344 request.specifiers[i].channels.size() > MAX_CHANNELS) {
1345 sendErrorResponse(pRI, RIL_E_INVALID_ARGUMENTS);
1346 return Void();
1347 }
1348 const ::android::hardware::radio::V1_1::RadioAccessSpecifier& ras_from =
1349 request.specifiers[i];
1350 RIL_RadioAccessSpecifier& ras_to = scan_request.specifiers[i];
1351
1352 ras_to.radio_access_network = (RIL_RadioAccessNetworks) ras_from.radioAccessNetwork;
1353 ras_to.channels_length = ras_from.channels.size();
1354
1355 std::copy(ras_from.channels.begin(), ras_from.channels.end(), ras_to.channels);
1356 const std::vector<uint32_t> * bands = nullptr;
1357 switch (request.specifiers[i].radioAccessNetwork) {
1358 case ::android::hardware::radio::V1_1::RadioAccessNetworks::GERAN:
1359 ras_to.bands_length = ras_from.geranBands.size();
1360 bands = (std::vector<uint32_t> *) &ras_from.geranBands;
1361 break;
1362 case ::android::hardware::radio::V1_1::RadioAccessNetworks::UTRAN:
1363 ras_to.bands_length = ras_from.utranBands.size();
1364 bands = (std::vector<uint32_t> *) &ras_from.utranBands;
1365 break;
1366 case ::android::hardware::radio::V1_1::RadioAccessNetworks::EUTRAN:
1367 ras_to.bands_length = ras_from.eutranBands.size();
1368 bands = (std::vector<uint32_t> *) &ras_from.eutranBands;
1369 break;
1370 default:
1371 sendErrorResponse(pRI, RIL_E_INVALID_ARGUMENTS);
1372 return Void();
1373 }
1374 // safe to copy to geran_bands because it's a union member
yinxudab31662017-06-22 17:10:59 -07001375 for (size_t idx = 0; idx < ras_to.bands_length; ++idx) {
1376 ras_to.bands.geran_bands[idx] = (RIL_GeranBands) (*bands)[idx];
1377 }
yinxu8688abd2017-05-22 11:26:45 -07001378 }
1379
1380 s_vendorFunctions->onRequest(
1381 RIL_REQUEST_START_NETWORK_SCAN, &scan_request, sizeof(scan_request), pRI);
1382
yinxu584379e2017-05-03 15:15:19 -07001383 return Void();
1384}
1385
1386Return<void> RadioImpl::stopNetworkScan(int32_t serial) {
1387#if VDBG
1388 RLOGD("stopNetworkScan: serial %d", serial);
1389#endif
yinxu584379e2017-05-03 15:15:19 -07001390 dispatchVoid(serial, mSlotId, RIL_REQUEST_STOP_NETWORK_SCAN);
1391 return Void();
1392}
1393
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001394Return<void> RadioImpl::startDtmf(int32_t serial, const hidl_string& s) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001395#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001396 RLOGD("startDtmf: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001397#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001398 dispatchString(serial, mSlotId, RIL_REQUEST_DTMF_START,
Scott Randolphc7213312017-04-03 14:06:40 -07001399 s.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001400 return Void();
1401}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001402
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001403Return<void> RadioImpl::stopDtmf(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001404#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001405 RLOGD("stopDtmf: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001406#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001407 dispatchVoid(serial, mSlotId, RIL_REQUEST_DTMF_STOP);
1408 return Void();
1409}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001410
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001411Return<void> RadioImpl::getBasebandVersion(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001412#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001413 RLOGD("getBasebandVersion: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001414#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001415 dispatchVoid(serial, mSlotId, RIL_REQUEST_BASEBAND_VERSION);
1416 return Void();
1417}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001418
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001419Return<void> RadioImpl::separateConnection(int32_t serial, int32_t gsmIndex) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001420#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001421 RLOGD("separateConnection: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001422#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001423 dispatchInts(serial, mSlotId, RIL_REQUEST_SEPARATE_CONNECTION, 1, gsmIndex);
1424 return Void();
1425}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001426
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001427Return<void> RadioImpl::setMute(int32_t serial, bool enable) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001428#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001429 RLOGD("setMute: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001430#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001431 dispatchInts(serial, mSlotId, RIL_REQUEST_SET_MUTE, 1, BOOL_TO_INT(enable));
1432 return Void();
1433}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001434
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001435Return<void> RadioImpl::getMute(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001436#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001437 RLOGD("getMute: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001438#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001439 dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_MUTE);
1440 return Void();
1441}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001442
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001443Return<void> RadioImpl::getClip(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001444#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001445 RLOGD("getClip: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001446#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001447 dispatchVoid(serial, mSlotId, RIL_REQUEST_QUERY_CLIP);
1448 return Void();
1449}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001450
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001451Return<void> RadioImpl::getDataCallList(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001452#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001453 RLOGD("getDataCallList: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001454#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001455 dispatchVoid(serial, mSlotId, RIL_REQUEST_DATA_CALL_LIST);
1456 return Void();
1457}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001458
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001459Return<void> RadioImpl::setSuppServiceNotifications(int32_t serial, bool enable) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001460#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001461 RLOGD("setSuppServiceNotifications: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001462#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001463 dispatchInts(serial, mSlotId, RIL_REQUEST_SET_SUPP_SVC_NOTIFICATION, 1,
1464 BOOL_TO_INT(enable));
1465 return Void();
1466}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001467
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001468Return<void> RadioImpl::writeSmsToSim(int32_t serial, const SmsWriteArgs& smsWriteArgs) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001469#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001470 RLOGD("writeSmsToSim: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001471#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001472 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_WRITE_SMS_TO_SIM);
1473 if (pRI == NULL) {
1474 return Void();
1475 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001476
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001477 RIL_SMS_WriteArgs args;
1478 args.status = (int) smsWriteArgs.status;
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001479
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001480 int len;
1481 if (!copyHidlStringToRil(&args.pdu, smsWriteArgs.pdu, pRI)) {
1482 return Void();
1483 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001484
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001485 if (!copyHidlStringToRil(&args.smsc, smsWriteArgs.smsc, pRI)) {
1486 memsetAndFreeStrings(1, args.pdu);
1487 return Void();
1488 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001489
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001490 s_vendorFunctions->onRequest(RIL_REQUEST_WRITE_SMS_TO_SIM, &args, sizeof(args), pRI);
1491
1492 memsetAndFreeStrings(2, args.smsc, args.pdu);
1493
1494 return Void();
1495}
1496
1497Return<void> RadioImpl::deleteSmsOnSim(int32_t serial, int32_t index) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001498#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001499 RLOGD("deleteSmsOnSim: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001500#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001501 dispatchInts(serial, mSlotId, RIL_REQUEST_DELETE_SMS_ON_SIM, 1, index);
1502 return Void();
1503}
1504
1505Return<void> RadioImpl::setBandMode(int32_t serial, RadioBandMode mode) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001506#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001507 RLOGD("setBandMode: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001508#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001509 dispatchInts(serial, mSlotId, RIL_REQUEST_SET_BAND_MODE, 1, mode);
1510 return Void();
1511}
1512
1513Return<void> RadioImpl::getAvailableBandModes(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001514#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001515 RLOGD("getAvailableBandModes: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001516#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001517 dispatchVoid(serial, mSlotId, RIL_REQUEST_QUERY_AVAILABLE_BAND_MODE);
1518 return Void();
1519}
1520
1521Return<void> RadioImpl::sendEnvelope(int32_t serial, const hidl_string& command) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001522#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001523 RLOGD("sendEnvelope: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001524#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001525 dispatchString(serial, mSlotId, RIL_REQUEST_STK_SEND_ENVELOPE_COMMAND,
Scott Randolphc7213312017-04-03 14:06:40 -07001526 command.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001527 return Void();
1528}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001529
1530Return<void> RadioImpl::sendTerminalResponseToSim(int32_t serial,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001531 const hidl_string& commandResponse) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001532#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001533 RLOGD("sendTerminalResponseToSim: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001534#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001535 dispatchString(serial, mSlotId, RIL_REQUEST_STK_SEND_TERMINAL_RESPONSE,
Scott Randolphc7213312017-04-03 14:06:40 -07001536 commandResponse.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001537 return Void();
1538}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001539
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001540Return<void> RadioImpl::handleStkCallSetupRequestFromSim(int32_t serial, bool accept) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001541#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001542 RLOGD("handleStkCallSetupRequestFromSim: 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_STK_HANDLE_CALL_SETUP_REQUESTED_FROM_SIM,
1545 1, BOOL_TO_INT(accept));
1546 return Void();
1547}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001548
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001549Return<void> RadioImpl::explicitCallTransfer(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001550#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001551 RLOGD("explicitCallTransfer: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001552#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001553 dispatchVoid(serial, mSlotId, RIL_REQUEST_EXPLICIT_CALL_TRANSFER);
1554 return Void();
1555}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001556
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001557Return<void> RadioImpl::setPreferredNetworkType(int32_t serial, PreferredNetworkType nwType) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001558#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001559 RLOGD("setPreferredNetworkType: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001560#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001561 dispatchInts(serial, mSlotId, RIL_REQUEST_SET_PREFERRED_NETWORK_TYPE, 1, nwType);
1562 return Void();
1563}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001564
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001565Return<void> RadioImpl::getPreferredNetworkType(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001566#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001567 RLOGD("getPreferredNetworkType: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001568#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001569 dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_PREFERRED_NETWORK_TYPE);
1570 return Void();
1571}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001572
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001573Return<void> RadioImpl::getNeighboringCids(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001574#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001575 RLOGD("getNeighboringCids: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001576#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001577 dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_NEIGHBORING_CELL_IDS);
1578 return Void();
1579}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001580
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001581Return<void> RadioImpl::setLocationUpdates(int32_t serial, bool enable) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001582#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001583 RLOGD("setLocationUpdates: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001584#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001585 dispatchInts(serial, mSlotId, RIL_REQUEST_SET_LOCATION_UPDATES, 1, BOOL_TO_INT(enable));
1586 return Void();
1587}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001588
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001589Return<void> RadioImpl::setCdmaSubscriptionSource(int32_t serial, CdmaSubscriptionSource cdmaSub) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001590#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001591 RLOGD("setCdmaSubscriptionSource: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001592#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001593 dispatchInts(serial, mSlotId, RIL_REQUEST_CDMA_SET_SUBSCRIPTION_SOURCE, 1, cdmaSub);
1594 return Void();
1595}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001596
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001597Return<void> RadioImpl::setCdmaRoamingPreference(int32_t serial, CdmaRoamingType type) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001598#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001599 RLOGD("setCdmaRoamingPreference: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001600#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001601 dispatchInts(serial, mSlotId, RIL_REQUEST_CDMA_SET_ROAMING_PREFERENCE, 1, type);
1602 return Void();
1603}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001604
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001605Return<void> RadioImpl::getCdmaRoamingPreference(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001606#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001607 RLOGD("getCdmaRoamingPreference: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001608#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001609 dispatchVoid(serial, mSlotId, RIL_REQUEST_CDMA_QUERY_ROAMING_PREFERENCE);
1610 return Void();
1611}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001612
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001613Return<void> RadioImpl::setTTYMode(int32_t serial, TtyMode mode) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001614#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001615 RLOGD("setTTYMode: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001616#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001617 dispatchInts(serial, mSlotId, RIL_REQUEST_SET_TTY_MODE, 1, mode);
1618 return Void();
1619}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001620
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001621Return<void> RadioImpl::getTTYMode(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001622#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001623 RLOGD("getTTYMode: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001624#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001625 dispatchVoid(serial, mSlotId, RIL_REQUEST_QUERY_TTY_MODE);
1626 return Void();
1627}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001628
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001629Return<void> RadioImpl::setPreferredVoicePrivacy(int32_t serial, bool enable) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001630#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001631 RLOGD("setPreferredVoicePrivacy: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001632#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001633 dispatchInts(serial, mSlotId, RIL_REQUEST_CDMA_SET_PREFERRED_VOICE_PRIVACY_MODE,
1634 1, BOOL_TO_INT(enable));
1635 return Void();
1636}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001637
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001638Return<void> RadioImpl::getPreferredVoicePrivacy(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001639#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001640 RLOGD("getPreferredVoicePrivacy: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001641#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001642 dispatchVoid(serial, mSlotId, RIL_REQUEST_CDMA_QUERY_PREFERRED_VOICE_PRIVACY_MODE);
1643 return Void();
1644}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001645
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001646Return<void> RadioImpl::sendCDMAFeatureCode(int32_t serial, const hidl_string& featureCode) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001647#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001648 RLOGD("sendCDMAFeatureCode: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001649#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001650 dispatchString(serial, mSlotId, RIL_REQUEST_CDMA_FLASH,
Scott Randolphc7213312017-04-03 14:06:40 -07001651 featureCode.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001652 return Void();
1653}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001654
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001655Return<void> RadioImpl::sendBurstDtmf(int32_t serial, const hidl_string& dtmf, int32_t on,
1656 int32_t off) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001657#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001658 RLOGD("sendBurstDtmf: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001659#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001660 dispatchStrings(serial, mSlotId, RIL_REQUEST_CDMA_BURST_DTMF,
Scott Randolphc7213312017-04-03 14:06:40 -07001661 3, dtmf.c_str(), (std::to_string(on)).c_str(),
1662 (std::to_string(off)).c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001663 return Void();
1664}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001665
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001666void constructCdmaSms(RIL_CDMA_SMS_Message &rcsm, const CdmaSmsMessage& sms) {
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001667 rcsm.uTeleserviceID = sms.teleserviceId;
1668 rcsm.bIsServicePresent = BOOL_TO_INT(sms.isServicePresent);
1669 rcsm.uServicecategory = sms.serviceCategory;
1670 rcsm.sAddress.digit_mode = (RIL_CDMA_SMS_DigitMode) sms.address.digitMode;
1671 rcsm.sAddress.number_mode = (RIL_CDMA_SMS_NumberMode) sms.address.numberMode;
1672 rcsm.sAddress.number_type = (RIL_CDMA_SMS_NumberType) sms.address.numberType;
1673 rcsm.sAddress.number_plan = (RIL_CDMA_SMS_NumberPlan) sms.address.numberPlan;
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001674
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001675 rcsm.sAddress.number_of_digits = sms.address.digits.size();
1676 int digitLimit= MIN((rcsm.sAddress.number_of_digits), RIL_CDMA_SMS_ADDRESS_MAX);
1677 for (int i = 0; i < digitLimit; i++) {
1678 rcsm.sAddress.digits[i] = sms.address.digits[i];
1679 }
1680
1681 rcsm.sSubAddress.subaddressType = (RIL_CDMA_SMS_SubaddressType) sms.subAddress.subaddressType;
1682 rcsm.sSubAddress.odd = BOOL_TO_INT(sms.subAddress.odd);
1683
1684 rcsm.sSubAddress.number_of_digits = sms.subAddress.digits.size();
1685 digitLimit= MIN((rcsm.sSubAddress.number_of_digits), RIL_CDMA_SMS_SUBADDRESS_MAX);
1686 for (int i = 0; i < digitLimit; i++) {
1687 rcsm.sSubAddress.digits[i] = sms.subAddress.digits[i];
1688 }
1689
1690 rcsm.uBearerDataLen = sms.bearerData.size();
1691 digitLimit= MIN((rcsm.uBearerDataLen), RIL_CDMA_SMS_BEARER_DATA_MAX);
1692 for (int i = 0; i < digitLimit; i++) {
1693 rcsm.aBearerData[i] = sms.bearerData[i];
1694 }
1695}
1696
1697Return<void> RadioImpl::sendCdmaSms(int32_t serial, const CdmaSmsMessage& sms) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001698#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001699 RLOGD("sendCdmaSms: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001700#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001701 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_CDMA_SEND_SMS);
1702 if (pRI == NULL) {
1703 return Void();
1704 }
1705
Jack Yu8e732d42017-04-14 00:08:06 -07001706 RIL_CDMA_SMS_Message rcsm = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001707 constructCdmaSms(rcsm, sms);
1708
1709 s_vendorFunctions->onRequest(pRI->pCI->requestNumber, &rcsm, sizeof(rcsm), pRI);
1710 return Void();
1711}
1712
1713Return<void> RadioImpl::acknowledgeLastIncomingCdmaSms(int32_t serial, const CdmaSmsAck& smsAck) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001714#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001715 RLOGD("acknowledgeLastIncomingCdmaSms: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001716#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001717 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_CDMA_SMS_ACKNOWLEDGE);
1718 if (pRI == NULL) {
1719 return Void();
1720 }
1721
Jack Yuf68e0da2017-02-07 14:53:09 -08001722 RIL_CDMA_SMS_Ack rcsa = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001723
1724 rcsa.uErrorClass = (RIL_CDMA_SMS_ErrorClass) smsAck.errorClass;
1725 rcsa.uSMSCauseCode = smsAck.smsCauseCode;
1726
1727 s_vendorFunctions->onRequest(pRI->pCI->requestNumber, &rcsa, sizeof(rcsa), pRI);
1728 return Void();
1729}
1730
1731Return<void> RadioImpl::getGsmBroadcastConfig(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001732#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001733 RLOGD("getGsmBroadcastConfig: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001734#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001735 dispatchVoid(serial, mSlotId, RIL_REQUEST_GSM_GET_BROADCAST_SMS_CONFIG);
1736 return Void();
1737}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001738
1739Return<void> RadioImpl::setGsmBroadcastConfig(int32_t serial,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001740 const hidl_vec<GsmBroadcastSmsConfigInfo>&
1741 configInfo) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001742#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001743 RLOGD("setGsmBroadcastConfig: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001744#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001745 RequestInfo *pRI = android::addRequestToList(serial, mSlotId,
1746 RIL_REQUEST_GSM_SET_BROADCAST_SMS_CONFIG);
1747 if (pRI == NULL) {
1748 return Void();
1749 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001750
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001751 int num = configInfo.size();
1752 RIL_GSM_BroadcastSmsConfigInfo gsmBci[num];
1753 RIL_GSM_BroadcastSmsConfigInfo *gsmBciPtrs[num];
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001754
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001755 for (int i = 0 ; i < num ; i++ ) {
1756 gsmBciPtrs[i] = &gsmBci[i];
1757 gsmBci[i].fromServiceId = configInfo[i].fromServiceId;
1758 gsmBci[i].toServiceId = configInfo[i].toServiceId;
1759 gsmBci[i].fromCodeScheme = configInfo[i].fromCodeScheme;
1760 gsmBci[i].toCodeScheme = configInfo[i].toCodeScheme;
1761 gsmBci[i].selected = BOOL_TO_INT(configInfo[i].selected);
1762 }
1763
1764 s_vendorFunctions->onRequest(pRI->pCI->requestNumber, gsmBciPtrs,
1765 num * sizeof(RIL_GSM_BroadcastSmsConfigInfo *), pRI);
1766 return Void();
1767}
1768
1769Return<void> RadioImpl::setGsmBroadcastActivation(int32_t serial, bool activate) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001770#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001771 RLOGD("setGsmBroadcastActivation: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001772#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001773 dispatchInts(serial, mSlotId, RIL_REQUEST_GSM_SMS_BROADCAST_ACTIVATION,
Sanket Padawe0de29d12017-02-10 13:19:47 -08001774 1, BOOL_TO_INT(!activate));
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001775 return Void();
1776}
1777
1778Return<void> RadioImpl::getCdmaBroadcastConfig(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001779#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001780 RLOGD("getCdmaBroadcastConfig: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001781#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001782 dispatchVoid(serial, mSlotId, RIL_REQUEST_CDMA_GET_BROADCAST_SMS_CONFIG);
1783 return Void();
1784}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001785
1786Return<void> RadioImpl::setCdmaBroadcastConfig(int32_t serial,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001787 const hidl_vec<CdmaBroadcastSmsConfigInfo>&
1788 configInfo) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001789#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001790 RLOGD("setCdmaBroadcastConfig: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001791#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001792 RequestInfo *pRI = android::addRequestToList(serial, mSlotId,
1793 RIL_REQUEST_CDMA_SET_BROADCAST_SMS_CONFIG);
1794 if (pRI == NULL) {
1795 return Void();
1796 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001797
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001798 int num = configInfo.size();
1799 RIL_CDMA_BroadcastSmsConfigInfo cdmaBci[num];
1800 RIL_CDMA_BroadcastSmsConfigInfo *cdmaBciPtrs[num];
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001801
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001802 for (int i = 0 ; i < num ; i++ ) {
1803 cdmaBciPtrs[i] = &cdmaBci[i];
1804 cdmaBci[i].service_category = configInfo[i].serviceCategory;
1805 cdmaBci[i].language = configInfo[i].language;
1806 cdmaBci[i].selected = BOOL_TO_INT(configInfo[i].selected);
1807 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001808
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001809 s_vendorFunctions->onRequest(pRI->pCI->requestNumber, cdmaBciPtrs,
1810 num * sizeof(RIL_CDMA_BroadcastSmsConfigInfo *), pRI);
1811 return Void();
1812}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001813
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001814Return<void> RadioImpl::setCdmaBroadcastActivation(int32_t serial, bool activate) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001815#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001816 RLOGD("setCdmaBroadcastActivation: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001817#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001818 dispatchInts(serial, mSlotId, RIL_REQUEST_CDMA_SMS_BROADCAST_ACTIVATION,
Sanket Padawe0de29d12017-02-10 13:19:47 -08001819 1, BOOL_TO_INT(!activate));
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001820 return Void();
1821}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001822
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001823Return<void> RadioImpl::getCDMASubscription(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001824#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001825 RLOGD("getCDMASubscription: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001826#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001827 dispatchVoid(serial, mSlotId, RIL_REQUEST_CDMA_SUBSCRIPTION);
1828 return Void();
1829}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001830
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001831Return<void> RadioImpl::writeSmsToRuim(int32_t serial, const CdmaSmsWriteArgs& cdmaSms) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001832#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001833 RLOGD("writeSmsToRuim: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001834#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001835 RequestInfo *pRI = android::addRequestToList(serial, mSlotId,
1836 RIL_REQUEST_CDMA_WRITE_SMS_TO_RUIM);
1837 if (pRI == NULL) {
1838 return Void();
1839 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001840
Jack Yuf68e0da2017-02-07 14:53:09 -08001841 RIL_CDMA_SMS_WriteArgs rcsw = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001842 rcsw.status = (int) cdmaSms.status;
1843 constructCdmaSms(rcsw.message, cdmaSms.message);
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001844
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001845 s_vendorFunctions->onRequest(pRI->pCI->requestNumber, &rcsw, sizeof(rcsw), pRI);
1846 return Void();
1847}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001848
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001849Return<void> RadioImpl::deleteSmsOnRuim(int32_t serial, int32_t index) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001850#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001851 RLOGD("deleteSmsOnRuim: 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_DELETE_SMS_ON_RUIM, 1, index);
1854 return Void();
1855}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001856
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001857Return<void> RadioImpl::getDeviceIdentity(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001858#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001859 RLOGD("getDeviceIdentity: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001860#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001861 dispatchVoid(serial, mSlotId, RIL_REQUEST_DEVICE_IDENTITY);
1862 return Void();
1863}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001864
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001865Return<void> RadioImpl::exitEmergencyCallbackMode(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001866#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001867 RLOGD("exitEmergencyCallbackMode: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001868#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001869 dispatchVoid(serial, mSlotId, RIL_REQUEST_EXIT_EMERGENCY_CALLBACK_MODE);
1870 return Void();
1871}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001872
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001873Return<void> RadioImpl::getSmscAddress(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001874#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001875 RLOGD("getSmscAddress: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001876#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001877 dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_SMSC_ADDRESS);
1878 return Void();
1879}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001880
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001881Return<void> RadioImpl::setSmscAddress(int32_t serial, const hidl_string& smsc) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001882#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001883 RLOGD("setSmscAddress: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001884#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001885 dispatchString(serial, mSlotId, RIL_REQUEST_SET_SMSC_ADDRESS,
Scott Randolphc7213312017-04-03 14:06:40 -07001886 smsc.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001887 return Void();
1888}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001889
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001890Return<void> RadioImpl::reportSmsMemoryStatus(int32_t serial, bool available) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001891#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001892 RLOGD("reportSmsMemoryStatus: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001893#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001894 dispatchInts(serial, mSlotId, RIL_REQUEST_REPORT_SMS_MEMORY_STATUS, 1,
1895 BOOL_TO_INT(available));
1896 return Void();
1897}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001898
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001899Return<void> RadioImpl::reportStkServiceIsRunning(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001900#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001901 RLOGD("reportStkServiceIsRunning: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001902#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001903 dispatchVoid(serial, mSlotId, RIL_REQUEST_REPORT_STK_SERVICE_IS_RUNNING);
1904 return Void();
1905}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001906
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001907Return<void> RadioImpl::getCdmaSubscriptionSource(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001908#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001909 RLOGD("getCdmaSubscriptionSource: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001910#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001911 dispatchVoid(serial, mSlotId, RIL_REQUEST_CDMA_GET_SUBSCRIPTION_SOURCE);
1912 return Void();
1913}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001914
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001915Return<void> RadioImpl::requestIsimAuthentication(int32_t serial, const hidl_string& challenge) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001916#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001917 RLOGD("requestIsimAuthentication: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001918#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001919 dispatchString(serial, mSlotId, RIL_REQUEST_ISIM_AUTHENTICATION,
Scott Randolphc7213312017-04-03 14:06:40 -07001920 challenge.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001921 return Void();
1922}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001923
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001924Return<void> RadioImpl::acknowledgeIncomingGsmSmsWithPdu(int32_t serial, bool success,
1925 const hidl_string& ackPdu) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001926#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001927 RLOGD("acknowledgeIncomingGsmSmsWithPdu: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001928#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001929 dispatchStrings(serial, mSlotId, RIL_REQUEST_ACKNOWLEDGE_INCOMING_GSM_SMS_WITH_PDU,
Scott Randolphc7213312017-04-03 14:06:40 -07001930 2, success ? "1" : "0", ackPdu.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001931 return Void();
1932}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001933
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001934Return<void> RadioImpl::sendEnvelopeWithStatus(int32_t serial, const hidl_string& contents) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001935#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001936 RLOGD("sendEnvelopeWithStatus: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001937#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001938 dispatchString(serial, mSlotId, RIL_REQUEST_STK_SEND_ENVELOPE_WITH_STATUS,
Scott Randolphc7213312017-04-03 14:06:40 -07001939 contents.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001940 return Void();
1941}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001942
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001943Return<void> RadioImpl::getVoiceRadioTechnology(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001944#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001945 RLOGD("getVoiceRadioTechnology: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001946#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001947 dispatchVoid(serial, mSlotId, RIL_REQUEST_VOICE_RADIO_TECH);
1948 return Void();
1949}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001950
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001951Return<void> RadioImpl::getCellInfoList(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001952#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001953 RLOGD("getCellInfoList: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001954#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001955 dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_CELL_INFO_LIST);
1956 return Void();
1957}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001958
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001959Return<void> RadioImpl::setCellInfoListRate(int32_t serial, int32_t rate) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001960#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001961 RLOGD("setCellInfoListRate: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001962#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001963 dispatchInts(serial, mSlotId, RIL_REQUEST_SET_UNSOL_CELL_INFO_LIST_RATE, 1, rate);
1964 return Void();
1965}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001966
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001967Return<void> RadioImpl::setInitialAttachApn(int32_t serial, const DataProfileInfo& dataProfileInfo,
Jack Yuffc06452017-02-13 11:21:00 -08001968 bool modemCognitive, bool isRoaming) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001969#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001970 RLOGD("setInitialAttachApn: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001971#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001972 RequestInfo *pRI = android::addRequestToList(serial, mSlotId,
1973 RIL_REQUEST_SET_INITIAL_ATTACH_APN);
1974 if (pRI == NULL) {
1975 return Void();
1976 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001977
Jack Yuffc06452017-02-13 11:21:00 -08001978 if (s_vendorFunctions->version <= 14) {
1979 RIL_InitialAttachApn iaa = {};
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001980
Jack Yuffc06452017-02-13 11:21:00 -08001981 if (!copyHidlStringToRil(&iaa.apn, dataProfileInfo.apn, pRI)) {
1982 return Void();
1983 }
1984
1985 const hidl_string &protocol =
1986 (isRoaming ? dataProfileInfo.roamingProtocol : dataProfileInfo.protocol);
1987
1988 if (!copyHidlStringToRil(&iaa.protocol, protocol, pRI)) {
Jack Yu8e732d42017-04-14 00:08:06 -07001989 memsetAndFreeStrings(1, iaa.apn);
Jack Yuffc06452017-02-13 11:21:00 -08001990 return Void();
1991 }
1992 iaa.authtype = (int) dataProfileInfo.authType;
1993 if (!copyHidlStringToRil(&iaa.username, dataProfileInfo.user, pRI)) {
Jack Yu8e732d42017-04-14 00:08:06 -07001994 memsetAndFreeStrings(2, iaa.apn, iaa.protocol);
Jack Yuffc06452017-02-13 11:21:00 -08001995 return Void();
1996 }
1997 if (!copyHidlStringToRil(&iaa.password, dataProfileInfo.password, pRI)) {
Jack Yu8e732d42017-04-14 00:08:06 -07001998 memsetAndFreeStrings(3, iaa.apn, iaa.protocol, iaa.username);
Jack Yuffc06452017-02-13 11:21:00 -08001999 return Void();
2000 }
2001
2002 s_vendorFunctions->onRequest(RIL_REQUEST_SET_INITIAL_ATTACH_APN, &iaa, sizeof(iaa), pRI);
2003
2004 memsetAndFreeStrings(4, iaa.apn, iaa.protocol, iaa.username, iaa.password);
2005 } else {
2006 RIL_InitialAttachApn_v15 iaa = {};
2007
2008 if (!copyHidlStringToRil(&iaa.apn, dataProfileInfo.apn, pRI)) {
2009 return Void();
2010 }
2011 if (!copyHidlStringToRil(&iaa.protocol, dataProfileInfo.protocol, pRI)) {
Jack Yu8e732d42017-04-14 00:08:06 -07002012 memsetAndFreeStrings(1, iaa.apn);
Jack Yuffc06452017-02-13 11:21:00 -08002013 return Void();
2014 }
2015 if (!copyHidlStringToRil(&iaa.roamingProtocol, dataProfileInfo.roamingProtocol, pRI)) {
Jack Yu8e732d42017-04-14 00:08:06 -07002016 memsetAndFreeStrings(2, iaa.apn, iaa.protocol);
Jack Yuffc06452017-02-13 11:21:00 -08002017 return Void();
2018 }
2019 iaa.authtype = (int) dataProfileInfo.authType;
2020 if (!copyHidlStringToRil(&iaa.username, dataProfileInfo.user, pRI)) {
Jack Yu8e732d42017-04-14 00:08:06 -07002021 memsetAndFreeStrings(3, iaa.apn, iaa.protocol, iaa.roamingProtocol);
Jack Yuffc06452017-02-13 11:21:00 -08002022 return Void();
2023 }
2024 if (!copyHidlStringToRil(&iaa.password, dataProfileInfo.password, pRI)) {
Jack Yu8e732d42017-04-14 00:08:06 -07002025 memsetAndFreeStrings(4, iaa.apn, iaa.protocol, iaa.roamingProtocol, iaa.username);
Jack Yuffc06452017-02-13 11:21:00 -08002026 return Void();
2027 }
2028 iaa.supportedTypesBitmask = dataProfileInfo.supportedApnTypesBitmap;
2029 iaa.bearerBitmask = dataProfileInfo.bearerBitmap;
2030 iaa.modemCognitive = BOOL_TO_INT(modemCognitive);
2031 iaa.mtu = dataProfileInfo.mtu;
2032
Jack Yuc13645e2017-04-13 20:55:03 -07002033 if (!convertMvnoTypeToString(dataProfileInfo.mvnoType, iaa.mvnoType)) {
Jack Yuffc06452017-02-13 11:21:00 -08002034 sendErrorResponse(pRI, RIL_E_INVALID_ARGUMENTS);
Jack Yu8e732d42017-04-14 00:08:06 -07002035 memsetAndFreeStrings(5, iaa.apn, iaa.protocol, iaa.roamingProtocol, iaa.username,
2036 iaa.password);
Jack Yuffc06452017-02-13 11:21:00 -08002037 return Void();
2038 }
2039
2040 if (!copyHidlStringToRil(&iaa.mvnoMatchData, dataProfileInfo.mvnoMatchData, pRI)) {
Jack Yu8e732d42017-04-14 00:08:06 -07002041 memsetAndFreeStrings(5, iaa.apn, iaa.protocol, iaa.roamingProtocol, iaa.username,
2042 iaa.password);
Jack Yuffc06452017-02-13 11:21:00 -08002043 return Void();
2044 }
2045
2046 s_vendorFunctions->onRequest(RIL_REQUEST_SET_INITIAL_ATTACH_APN, &iaa, sizeof(iaa), pRI);
2047
2048 memsetAndFreeStrings(6, iaa.apn, iaa.protocol, iaa.roamingProtocol, iaa.username,
2049 iaa.password, iaa.mvnoMatchData);
2050 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002051
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002052 return Void();
2053}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002054
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002055Return<void> RadioImpl::getImsRegistrationState(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002056#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002057 RLOGD("getImsRegistrationState: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002058#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002059 dispatchVoid(serial, mSlotId, RIL_REQUEST_IMS_REGISTRATION_STATE);
2060 return Void();
2061}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002062
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002063bool dispatchImsGsmSms(const ImsSmsMessage& message, RequestInfo *pRI) {
Jack Yuf68e0da2017-02-07 14:53:09 -08002064 RIL_IMS_SMS_Message rism = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002065 char **pStrings;
2066 int countStrings = 2;
2067 int dataLen = sizeof(char *) * countStrings;
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002068
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002069 rism.tech = RADIO_TECH_3GPP;
2070 rism.retry = BOOL_TO_INT(message.retry);
2071 rism.messageRef = message.messageRef;
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002072
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002073 if (message.gsmMessage.size() != 1) {
2074 RLOGE("dispatchImsGsmSms: Invalid len %s", requestToString(pRI->pCI->requestNumber));
Jack Yuffc06452017-02-13 11:21:00 -08002075 sendErrorResponse(pRI, RIL_E_INVALID_ARGUMENTS);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002076 return false;
2077 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002078
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002079 pStrings = (char **)calloc(countStrings, sizeof(char *));
2080 if (pStrings == NULL) {
2081 RLOGE("dispatchImsGsmSms: Memory allocation failed for request %s",
2082 requestToString(pRI->pCI->requestNumber));
Jack Yuffc06452017-02-13 11:21:00 -08002083 sendErrorResponse(pRI, RIL_E_NO_MEMORY);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002084 return false;
2085 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002086
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002087 if (!copyHidlStringToRil(&pStrings[0], message.gsmMessage[0].smscPdu, pRI)) {
2088#ifdef MEMSET_FREED
Jack Yub4295a42017-04-14 12:51:49 -07002089 memset(pStrings, 0, dataLen);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002090#endif
2091 free(pStrings);
2092 return false;
2093 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002094
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002095 if (!copyHidlStringToRil(&pStrings[1], message.gsmMessage[0].pdu, pRI)) {
2096 memsetAndFreeStrings(1, pStrings[0]);
2097#ifdef MEMSET_FREED
Jack Yub4295a42017-04-14 12:51:49 -07002098 memset(pStrings, 0, dataLen);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002099#endif
2100 free(pStrings);
2101 return false;
2102 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002103
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002104 rism.message.gsmMessage = pStrings;
2105 s_vendorFunctions->onRequest(pRI->pCI->requestNumber, &rism, sizeof(RIL_RadioTechnologyFamily) +
2106 sizeof(uint8_t) + sizeof(int32_t) + dataLen, pRI);
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002107
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002108 for (int i = 0 ; i < countStrings ; i++) {
2109 memsetAndFreeStrings(1, pStrings[i]);
2110 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002111
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002112#ifdef MEMSET_FREED
Jack Yub4295a42017-04-14 12:51:49 -07002113 memset(pStrings, 0, dataLen);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002114#endif
2115 free(pStrings);
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002116
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002117 return true;
2118}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002119
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002120bool dispatchImsCdmaSms(const ImsSmsMessage& message, RequestInfo *pRI) {
Jack Yu8e732d42017-04-14 00:08:06 -07002121 RIL_IMS_SMS_Message rism = {};
2122 RIL_CDMA_SMS_Message rcsm = {};
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002123
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002124 if (message.cdmaMessage.size() != 1) {
2125 RLOGE("dispatchImsCdmaSms: Invalid len %s", requestToString(pRI->pCI->requestNumber));
Jack Yuffc06452017-02-13 11:21:00 -08002126 sendErrorResponse(pRI, RIL_E_INVALID_ARGUMENTS);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002127 return false;
2128 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002129
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002130 rism.tech = RADIO_TECH_3GPP2;
2131 rism.retry = BOOL_TO_INT(message.retry);
2132 rism.messageRef = message.messageRef;
2133 rism.message.cdmaMessage = &rcsm;
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002134
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002135 constructCdmaSms(rcsm, message.cdmaMessage[0]);
2136
2137 s_vendorFunctions->onRequest(pRI->pCI->requestNumber, &rism, sizeof(RIL_RadioTechnologyFamily) +
2138 sizeof(uint8_t) + sizeof(int32_t) + sizeof(rcsm), pRI);
2139
2140 return true;
2141}
2142
2143Return<void> RadioImpl::sendImsSms(int32_t serial, const ImsSmsMessage& message) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002144#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002145 RLOGD("sendImsSms: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002146#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002147 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_IMS_SEND_SMS);
2148 if (pRI == NULL) {
2149 return Void();
2150 }
2151
2152 RIL_RadioTechnologyFamily format = (RIL_RadioTechnologyFamily) message.tech;
2153
2154 if (RADIO_TECH_3GPP == format) {
2155 dispatchImsGsmSms(message, pRI);
2156 } else if (RADIO_TECH_3GPP2 == format) {
2157 dispatchImsCdmaSms(message, pRI);
2158 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08002159 RLOGE("sendImsSms: Invalid radio tech %s",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002160 requestToString(pRI->pCI->requestNumber));
Jack Yuffc06452017-02-13 11:21:00 -08002161 sendErrorResponse(pRI, RIL_E_INVALID_ARGUMENTS);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002162 }
2163 return Void();
2164}
2165
2166Return<void> RadioImpl::iccTransmitApduBasicChannel(int32_t serial, const SimApdu& message) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002167#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002168 RLOGD("iccTransmitApduBasicChannel: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002169#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002170 dispatchIccApdu(serial, mSlotId, RIL_REQUEST_SIM_TRANSMIT_APDU_BASIC, message);
2171 return Void();
2172}
2173
Wileen Chiu410b7562015-11-23 14:25:22 -08002174Return<void> RadioImpl::iccOpenLogicalChannel(int32_t serial, const hidl_string& aid, int32_t p2) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002175#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002176 RLOGD("iccOpenLogicalChannel: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002177#endif
Wileen Chiu410b7562015-11-23 14:25:22 -08002178 if (s_vendorFunctions->version < 15) {
2179 dispatchString(serial, mSlotId, RIL_REQUEST_SIM_OPEN_CHANNEL, aid.c_str());
2180 } else {
2181 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_SIM_OPEN_CHANNEL);
2182 if (pRI == NULL) {
2183 return Void();
2184 }
2185
Jack Yu8e732d42017-04-14 00:08:06 -07002186 RIL_OpenChannelParams params = {};
Wileen Chiu410b7562015-11-23 14:25:22 -08002187
2188 params.p2 = p2;
2189
2190 if (!copyHidlStringToRil(&params.aidPtr, aid, pRI)) {
2191 return Void();
2192 }
2193
2194 s_vendorFunctions->onRequest(pRI->pCI->requestNumber, &params, sizeof(params), pRI);
2195
2196 memsetAndFreeStrings(1, params.aidPtr);
2197 }
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002198 return Void();
2199}
2200
2201Return<void> RadioImpl::iccCloseLogicalChannel(int32_t serial, int32_t channelId) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002202#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002203 RLOGD("iccCloseLogicalChannel: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002204#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002205 dispatchInts(serial, mSlotId, RIL_REQUEST_SIM_CLOSE_CHANNEL, 1, channelId);
2206 return Void();
2207}
2208
2209Return<void> RadioImpl::iccTransmitApduLogicalChannel(int32_t serial, const SimApdu& message) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002210#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002211 RLOGD("iccTransmitApduLogicalChannel: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002212#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002213 dispatchIccApdu(serial, mSlotId, RIL_REQUEST_SIM_TRANSMIT_APDU_CHANNEL, message);
2214 return Void();
2215}
2216
2217Return<void> RadioImpl::nvReadItem(int32_t serial, NvItem itemId) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002218#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002219 RLOGD("nvReadItem: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002220#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002221 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_NV_READ_ITEM);
2222 if (pRI == NULL) {
2223 return Void();
2224 }
2225
Jack Yu8e732d42017-04-14 00:08:06 -07002226 RIL_NV_ReadItem nvri = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002227 nvri.itemID = (RIL_NV_Item) itemId;
2228
2229 s_vendorFunctions->onRequest(pRI->pCI->requestNumber, &nvri, sizeof(nvri), pRI);
2230 return Void();
2231}
2232
2233Return<void> RadioImpl::nvWriteItem(int32_t serial, const NvWriteItem& item) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002234#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002235 RLOGD("nvWriteItem: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002236#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002237 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_NV_WRITE_ITEM);
2238 if (pRI == NULL) {
2239 return Void();
2240 }
2241
Jack Yu8e732d42017-04-14 00:08:06 -07002242 RIL_NV_WriteItem nvwi = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002243
2244 nvwi.itemID = (RIL_NV_Item) item.itemId;
2245
2246 if (!copyHidlStringToRil(&nvwi.value, item.value, pRI)) {
2247 return Void();
2248 }
2249
2250 s_vendorFunctions->onRequest(pRI->pCI->requestNumber, &nvwi, sizeof(nvwi), pRI);
2251
2252 memsetAndFreeStrings(1, nvwi.value);
2253 return Void();
2254}
2255
2256Return<void> RadioImpl::nvWriteCdmaPrl(int32_t serial, const hidl_vec<uint8_t>& prl) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002257#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002258 RLOGD("nvWriteCdmaPrl: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002259#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002260 dispatchRaw(serial, mSlotId, RIL_REQUEST_NV_WRITE_CDMA_PRL, prl);
2261 return Void();
2262}
2263
2264Return<void> RadioImpl::nvResetConfig(int32_t serial, ResetNvType resetType) {
Jayachandran C32763f02017-04-30 10:21:14 -07002265 int rilResetType = -1;
Jayachandran C572f2f42017-03-25 14:30:13 -07002266#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002267 RLOGD("nvResetConfig: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002268#endif
Jayachandran C32763f02017-04-30 10:21:14 -07002269 /* Convert ResetNvType to RIL.h values
2270 * RIL_REQUEST_NV_RESET_CONFIG
2271 * 1 - reload all NV items
2272 * 2 - erase NV reset (SCRTN)
2273 * 3 - factory reset (RTN)
2274 */
2275 switch(resetType) {
2276 case ResetNvType::RELOAD:
2277 rilResetType = 1;
2278 break;
2279 case ResetNvType::ERASE:
2280 rilResetType = 2;
2281 break;
2282 case ResetNvType::FACTORY_RESET:
2283 rilResetType = 3;
2284 break;
2285 }
2286 dispatchInts(serial, mSlotId, RIL_REQUEST_NV_RESET_CONFIG, 1, rilResetType);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002287 return Void();
2288}
2289
2290Return<void> RadioImpl::setUiccSubscription(int32_t serial, const SelectUiccSub& uiccSub) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002291#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002292 RLOGD("setUiccSubscription: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002293#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002294 RequestInfo *pRI = android::addRequestToList(serial, mSlotId,
2295 RIL_REQUEST_SET_UICC_SUBSCRIPTION);
2296 if (pRI == NULL) {
2297 return Void();
2298 }
2299
Jack Yuf68e0da2017-02-07 14:53:09 -08002300 RIL_SelectUiccSub rilUiccSub = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002301
2302 rilUiccSub.slot = uiccSub.slot;
2303 rilUiccSub.app_index = uiccSub.appIndex;
2304 rilUiccSub.sub_type = (RIL_SubscriptionType) uiccSub.subType;
2305 rilUiccSub.act_status = (RIL_UiccSubActStatus) uiccSub.actStatus;
2306
2307 s_vendorFunctions->onRequest(pRI->pCI->requestNumber, &rilUiccSub, sizeof(rilUiccSub), pRI);
2308 return Void();
2309}
2310
2311Return<void> RadioImpl::setDataAllowed(int32_t serial, bool allow) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002312#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002313 RLOGD("setDataAllowed: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002314#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002315 dispatchInts(serial, mSlotId, RIL_REQUEST_ALLOW_DATA, 1, BOOL_TO_INT(allow));
2316 return Void();
2317}
2318
2319Return<void> RadioImpl::getHardwareConfig(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002320#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002321 RLOGD("getHardwareConfig: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002322#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002323 dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_HARDWARE_CONFIG);
2324 return Void();
2325}
2326
2327Return<void> RadioImpl::requestIccSimAuthentication(int32_t serial, int32_t authContext,
2328 const hidl_string& authData, const hidl_string& aid) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002329#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002330 RLOGD("requestIccSimAuthentication: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002331#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002332 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_SIM_AUTHENTICATION);
2333 if (pRI == NULL) {
2334 return Void();
2335 }
2336
Jack Yu8e732d42017-04-14 00:08:06 -07002337 RIL_SimAuthentication pf = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002338
2339 pf.authContext = authContext;
2340
2341 int len;
2342 if (!copyHidlStringToRil(&pf.authData, authData, pRI)) {
2343 return Void();
2344 }
2345
2346 if (!copyHidlStringToRil(&pf.aid, aid, pRI)) {
2347 memsetAndFreeStrings(1, pf.authData);
2348 return Void();
2349 }
2350
2351 s_vendorFunctions->onRequest(pRI->pCI->requestNumber, &pf, sizeof(pf), pRI);
2352
2353 memsetAndFreeStrings(2, pf.authData, pf.aid);
2354 return Void();
2355}
2356
2357/**
Jack Yuffc06452017-02-13 11:21:00 -08002358 * @param numProfiles number of data profile
2359 * @param dataProfiles the pointer to the actual data profiles. The acceptable type is
2360 RIL_DataProfileInfo or RIL_DataProfileInfo_v15.
2361 * @param dataProfilePtrs the pointer to the pointers that point to each data profile structure
2362 * @param numfields number of string-type member in the data profile structure
2363 * @param ... the variadic parameters are pointers to each string-type member
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002364 **/
Jack Yuffc06452017-02-13 11:21:00 -08002365template <typename T>
2366void freeSetDataProfileData(int numProfiles, T *dataProfiles, T **dataProfilePtrs,
2367 int numfields, ...) {
2368 va_list args;
2369 va_start(args, numfields);
2370
2371 // Iterate through each string-type field that need to be free.
2372 for (int i = 0; i < numfields; i++) {
2373 // Iterate through each data profile and free that specific string-type field.
2374 // The type 'char *T::*' is a type of pointer to a 'char *' member inside T structure.
2375 char *T::*ptr = va_arg(args, char *T::*);
2376 for (int j = 0; j < numProfiles; j++) {
2377 memsetAndFreeStrings(1, dataProfiles[j].*ptr);
2378 }
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002379 }
2380
Jack Yuffc06452017-02-13 11:21:00 -08002381 va_end(args);
2382
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002383#ifdef MEMSET_FREED
Jack Yuffc06452017-02-13 11:21:00 -08002384 memset(dataProfiles, 0, numProfiles * sizeof(T));
2385 memset(dataProfilePtrs, 0, numProfiles * sizeof(T *));
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002386#endif
2387 free(dataProfiles);
2388 free(dataProfilePtrs);
2389}
2390
Jack Yuffc06452017-02-13 11:21:00 -08002391Return<void> RadioImpl::setDataProfile(int32_t serial, const hidl_vec<DataProfileInfo>& profiles,
2392 bool isRoaming) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002393#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002394 RLOGD("setDataProfile: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002395#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002396 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_SET_DATA_PROFILE);
2397 if (pRI == NULL) {
2398 return Void();
2399 }
2400
Jack Yuffc06452017-02-13 11:21:00 -08002401 size_t num = profiles.size();
2402 bool success = false;
2403
2404 if (s_vendorFunctions->version <= 14) {
2405
2406 RIL_DataProfileInfo *dataProfiles =
2407 (RIL_DataProfileInfo *) calloc(num, sizeof(RIL_DataProfileInfo));
2408
2409 if (dataProfiles == NULL) {
2410 RLOGE("Memory allocation failed for request %s",
2411 requestToString(pRI->pCI->requestNumber));
2412 sendErrorResponse(pRI, RIL_E_NO_MEMORY);
2413 return Void();
2414 }
2415
2416 RIL_DataProfileInfo **dataProfilePtrs =
2417 (RIL_DataProfileInfo **) calloc(num, sizeof(RIL_DataProfileInfo *));
2418 if (dataProfilePtrs == NULL) {
2419 RLOGE("Memory allocation failed for request %s",
2420 requestToString(pRI->pCI->requestNumber));
2421 free(dataProfiles);
2422 sendErrorResponse(pRI, RIL_E_NO_MEMORY);
2423 return Void();
2424 }
2425
2426 for (size_t i = 0; i < num; i++) {
2427 dataProfilePtrs[i] = &dataProfiles[i];
2428
2429 success = copyHidlStringToRil(&dataProfiles[i].apn, profiles[i].apn, pRI);
2430
2431 const hidl_string &protocol =
2432 (isRoaming ? profiles[i].roamingProtocol : profiles[i].protocol);
2433
2434 if (success && !copyHidlStringToRil(&dataProfiles[i].protocol, protocol, pRI)) {
2435 success = false;
2436 }
2437
2438 if (success && !copyHidlStringToRil(&dataProfiles[i].user, profiles[i].user, pRI)) {
2439 success = false;
2440 }
2441 if (success && !copyHidlStringToRil(&dataProfiles[i].password, profiles[i].password,
2442 pRI)) {
2443 success = false;
2444 }
2445
2446 if (!success) {
2447 freeSetDataProfileData(num, dataProfiles, dataProfilePtrs, 4,
2448 &RIL_DataProfileInfo::apn, &RIL_DataProfileInfo::protocol,
2449 &RIL_DataProfileInfo::user, &RIL_DataProfileInfo::password);
2450 return Void();
2451 }
2452
2453 dataProfiles[i].profileId = (RIL_DataProfile) profiles[i].profileId;
2454 dataProfiles[i].authType = (int) profiles[i].authType;
2455 dataProfiles[i].type = (int) profiles[i].type;
2456 dataProfiles[i].maxConnsTime = profiles[i].maxConnsTime;
2457 dataProfiles[i].maxConns = profiles[i].maxConns;
2458 dataProfiles[i].waitTime = profiles[i].waitTime;
2459 dataProfiles[i].enabled = BOOL_TO_INT(profiles[i].enabled);
2460 }
2461
2462 s_vendorFunctions->onRequest(RIL_REQUEST_SET_DATA_PROFILE, dataProfilePtrs,
2463 num * sizeof(RIL_DataProfileInfo *), pRI);
2464
2465 freeSetDataProfileData(num, dataProfiles, dataProfilePtrs, 4,
2466 &RIL_DataProfileInfo::apn, &RIL_DataProfileInfo::protocol,
2467 &RIL_DataProfileInfo::user, &RIL_DataProfileInfo::password);
2468 } else {
2469 RIL_DataProfileInfo_v15 *dataProfiles =
2470 (RIL_DataProfileInfo_v15 *) calloc(num, sizeof(RIL_DataProfileInfo_v15));
2471
2472 if (dataProfiles == NULL) {
2473 RLOGE("Memory allocation failed for request %s",
2474 requestToString(pRI->pCI->requestNumber));
2475 sendErrorResponse(pRI, RIL_E_NO_MEMORY);
2476 return Void();
2477 }
2478
2479 RIL_DataProfileInfo_v15 **dataProfilePtrs =
2480 (RIL_DataProfileInfo_v15 **) calloc(num, sizeof(RIL_DataProfileInfo_v15 *));
2481 if (dataProfilePtrs == NULL) {
2482 RLOGE("Memory allocation failed for request %s",
2483 requestToString(pRI->pCI->requestNumber));
2484 free(dataProfiles);
2485 sendErrorResponse(pRI, RIL_E_NO_MEMORY);
2486 return Void();
2487 }
2488
2489 for (size_t i = 0; i < num; i++) {
2490 dataProfilePtrs[i] = &dataProfiles[i];
2491
2492 success = copyHidlStringToRil(&dataProfiles[i].apn, profiles[i].apn, pRI);
2493 if (success && !copyHidlStringToRil(&dataProfiles[i].protocol, profiles[i].protocol,
2494 pRI)) {
2495 success = false;
2496 }
2497 if (success && !copyHidlStringToRil(&dataProfiles[i].roamingProtocol,
2498 profiles[i].roamingProtocol, pRI)) {
2499 success = false;
2500 }
2501 if (success && !copyHidlStringToRil(&dataProfiles[i].user, profiles[i].user, pRI)) {
2502 success = false;
2503 }
2504 if (success && !copyHidlStringToRil(&dataProfiles[i].password, profiles[i].password,
2505 pRI)) {
2506 success = false;
2507 }
Jack Yuffc06452017-02-13 11:21:00 -08002508 if (success && !copyHidlStringToRil(&dataProfiles[i].mvnoMatchData,
2509 profiles[i].mvnoMatchData, pRI)) {
2510 success = false;
2511 }
2512
Jack Yuc13645e2017-04-13 20:55:03 -07002513 if (success && !convertMvnoTypeToString(profiles[i].mvnoType,
2514 dataProfiles[i].mvnoType)) {
2515 sendErrorResponse(pRI, RIL_E_INVALID_ARGUMENTS);
2516 success = false;
Jack Yuffc06452017-02-13 11:21:00 -08002517 }
2518
2519 if (!success) {
2520 freeSetDataProfileData(num, dataProfiles, dataProfilePtrs, 6,
2521 &RIL_DataProfileInfo_v15::apn, &RIL_DataProfileInfo_v15::protocol,
2522 &RIL_DataProfileInfo_v15::roamingProtocol, &RIL_DataProfileInfo_v15::user,
2523 &RIL_DataProfileInfo_v15::password, &RIL_DataProfileInfo_v15::mvnoMatchData);
2524 return Void();
2525 }
2526
2527 dataProfiles[i].profileId = (RIL_DataProfile) profiles[i].profileId;
2528 dataProfiles[i].authType = (int) profiles[i].authType;
2529 dataProfiles[i].type = (int) profiles[i].type;
2530 dataProfiles[i].maxConnsTime = profiles[i].maxConnsTime;
2531 dataProfiles[i].maxConns = profiles[i].maxConns;
2532 dataProfiles[i].waitTime = profiles[i].waitTime;
2533 dataProfiles[i].enabled = BOOL_TO_INT(profiles[i].enabled);
2534 dataProfiles[i].supportedTypesBitmask = profiles[i].supportedApnTypesBitmap;
2535 dataProfiles[i].bearerBitmask = profiles[i].bearerBitmap;
2536 dataProfiles[i].mtu = profiles[i].mtu;
2537 }
2538
2539 s_vendorFunctions->onRequest(RIL_REQUEST_SET_DATA_PROFILE, dataProfilePtrs,
2540 num * sizeof(RIL_DataProfileInfo_v15 *), pRI);
2541
2542 freeSetDataProfileData(num, dataProfiles, dataProfilePtrs, 6,
2543 &RIL_DataProfileInfo_v15::apn, &RIL_DataProfileInfo_v15::protocol,
2544 &RIL_DataProfileInfo_v15::roamingProtocol, &RIL_DataProfileInfo_v15::user,
2545 &RIL_DataProfileInfo_v15::password, &RIL_DataProfileInfo_v15::mvnoMatchData);
2546 }
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002547
2548 return Void();
2549}
2550
2551Return<void> RadioImpl::requestShutdown(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002552#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002553 RLOGD("requestShutdown: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002554#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002555 dispatchVoid(serial, mSlotId, RIL_REQUEST_SHUTDOWN);
2556 return Void();
2557}
2558
2559Return<void> RadioImpl::getRadioCapability(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002560#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002561 RLOGD("getRadioCapability: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002562#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002563 dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_RADIO_CAPABILITY);
2564 return Void();
2565}
2566
2567Return<void> RadioImpl::setRadioCapability(int32_t serial, const RadioCapability& rc) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002568#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002569 RLOGD("setRadioCapability: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002570#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002571 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_SET_RADIO_CAPABILITY);
2572 if (pRI == NULL) {
2573 return Void();
2574 }
2575
Jack Yu8e732d42017-04-14 00:08:06 -07002576 RIL_RadioCapability rilRc = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002577
2578 // TODO : set rilRc.version using HIDL version ?
2579 rilRc.session = rc.session;
2580 rilRc.phase = (int) rc.phase;
2581 rilRc.rat = (int) rc.raf;
2582 rilRc.status = (int) rc.status;
Scott Randolphc7213312017-04-03 14:06:40 -07002583 strncpy(rilRc.logicalModemUuid, rc.logicalModemUuid.c_str(), MAX_UUID_LENGTH);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002584
2585 s_vendorFunctions->onRequest(pRI->pCI->requestNumber, &rilRc, sizeof(rilRc), pRI);
2586
2587 return Void();
2588}
2589
2590Return<void> RadioImpl::startLceService(int32_t serial, int32_t reportInterval, bool pullMode) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002591#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002592 RLOGD("startLceService: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002593#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002594 dispatchInts(serial, mSlotId, RIL_REQUEST_START_LCE, 2, reportInterval,
2595 BOOL_TO_INT(pullMode));
2596 return Void();
2597}
2598
2599Return<void> RadioImpl::stopLceService(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002600#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002601 RLOGD("stopLceService: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002602#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002603 dispatchVoid(serial, mSlotId, RIL_REQUEST_STOP_LCE);
2604 return Void();
2605}
2606
2607Return<void> RadioImpl::pullLceData(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002608#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002609 RLOGD("pullLceData: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002610#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002611 dispatchVoid(serial, mSlotId, RIL_REQUEST_PULL_LCEDATA);
2612 return Void();
2613}
2614
2615Return<void> RadioImpl::getModemActivityInfo(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002616#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002617 RLOGD("getModemActivityInfo: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002618#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002619 dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_ACTIVITY_INFO);
2620 return Void();
2621}
2622
2623Return<void> RadioImpl::setAllowedCarriers(int32_t serial, bool allAllowed,
2624 const CarrierRestrictions& carriers) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002625#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002626 RLOGD("setAllowedCarriers: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002627#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002628 RequestInfo *pRI = android::addRequestToList(serial, mSlotId,
2629 RIL_REQUEST_SET_CARRIER_RESTRICTIONS);
2630 if (pRI == NULL) {
2631 return Void();
2632 }
2633
Jack Yuf68e0da2017-02-07 14:53:09 -08002634 RIL_CarrierRestrictions cr = {};
Jack Yu11ab4042017-02-21 17:08:01 -08002635 RIL_Carrier *allowedCarriers = NULL;
2636 RIL_Carrier *excludedCarriers = NULL;
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002637
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002638 cr.len_allowed_carriers = carriers.allowedCarriers.size();
2639 allowedCarriers = (RIL_Carrier *)calloc(cr.len_allowed_carriers, sizeof(RIL_Carrier));
2640 if (allowedCarriers == NULL) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08002641 RLOGE("setAllowedCarriers: Memory allocation failed for request %s",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002642 requestToString(pRI->pCI->requestNumber));
Jack Yuffc06452017-02-13 11:21:00 -08002643 sendErrorResponse(pRI, RIL_E_NO_MEMORY);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002644 return Void();
2645 }
2646 cr.allowed_carriers = allowedCarriers;
2647
2648 cr.len_excluded_carriers = carriers.excludedCarriers.size();
2649 excludedCarriers = (RIL_Carrier *)calloc(cr.len_excluded_carriers, sizeof(RIL_Carrier));
2650 if (excludedCarriers == NULL) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08002651 RLOGE("setAllowedCarriers: Memory allocation failed for request %s",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002652 requestToString(pRI->pCI->requestNumber));
Jack Yuffc06452017-02-13 11:21:00 -08002653 sendErrorResponse(pRI, RIL_E_NO_MEMORY);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002654#ifdef MEMSET_FREED
2655 memset(allowedCarriers, 0, cr.len_allowed_carriers * sizeof(RIL_Carrier));
2656#endif
2657 free(allowedCarriers);
2658 return Void();
2659 }
2660 cr.excluded_carriers = excludedCarriers;
2661
2662 for (int i = 0; i < cr.len_allowed_carriers; i++) {
Scott Randolphc7213312017-04-03 14:06:40 -07002663 allowedCarriers[i].mcc = carriers.allowedCarriers[i].mcc.c_str();
2664 allowedCarriers[i].mnc = carriers.allowedCarriers[i].mnc.c_str();
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002665 allowedCarriers[i].match_type = (RIL_CarrierMatchType) carriers.allowedCarriers[i].matchType;
Scott Randolphc7213312017-04-03 14:06:40 -07002666 allowedCarriers[i].match_data = carriers.allowedCarriers[i].matchData.c_str();
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002667 }
2668
Amit Mahajan3f510f62017-03-01 10:26:58 -08002669 for (int i = 0; i < cr.len_excluded_carriers; i++) {
Scott Randolphc7213312017-04-03 14:06:40 -07002670 excludedCarriers[i].mcc = carriers.excludedCarriers[i].mcc.c_str();
2671 excludedCarriers[i].mnc = carriers.excludedCarriers[i].mnc.c_str();
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002672 excludedCarriers[i].match_type =
2673 (RIL_CarrierMatchType) carriers.excludedCarriers[i].matchType;
Scott Randolphc7213312017-04-03 14:06:40 -07002674 excludedCarriers[i].match_data = carriers.excludedCarriers[i].matchData.c_str();
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002675 }
2676
2677 s_vendorFunctions->onRequest(pRI->pCI->requestNumber, &cr, sizeof(RIL_CarrierRestrictions), pRI);
2678
2679#ifdef MEMSET_FREED
2680 memset(allowedCarriers, 0, cr.len_allowed_carriers * sizeof(RIL_Carrier));
2681 memset(excludedCarriers, 0, cr.len_excluded_carriers * sizeof(RIL_Carrier));
2682#endif
2683 free(allowedCarriers);
2684 free(excludedCarriers);
2685 return Void();
2686}
2687
2688Return<void> RadioImpl::getAllowedCarriers(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002689#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002690 RLOGD("getAllowedCarriers: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002691#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002692 dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_CARRIER_RESTRICTIONS);
2693 return Void();
2694}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002695
Jack Yu11ab4042017-02-21 17:08:01 -08002696Return<void> RadioImpl::sendDeviceState(int32_t serial, DeviceStateType deviceStateType,
2697 bool state) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002698#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002699 RLOGD("sendDeviceState: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002700#endif
Jack Yu11ab4042017-02-21 17:08:01 -08002701 if (s_vendorFunctions->version < 15) {
2702 if (deviceStateType == DeviceStateType::LOW_DATA_EXPECTED) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08002703 RLOGD("sendDeviceState: calling screen state %d", BOOL_TO_INT(!state));
Jack Yu11ab4042017-02-21 17:08:01 -08002704 dispatchInts(serial, mSlotId, RIL_REQUEST_SCREEN_STATE, 1, BOOL_TO_INT(!state));
2705 } else {
2706 RequestInfo *pRI = android::addRequestToList(serial, mSlotId,
2707 RIL_REQUEST_SEND_DEVICE_STATE);
2708 sendErrorResponse(pRI, RIL_E_REQUEST_NOT_SUPPORTED);
2709 }
2710 return Void();
2711 }
2712 dispatchInts(serial, mSlotId, RIL_REQUEST_SEND_DEVICE_STATE, 2, (int) deviceStateType,
2713 BOOL_TO_INT(state));
2714 return Void();
2715}
2716
2717Return<void> RadioImpl::setIndicationFilter(int32_t serial, int32_t indicationFilter) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002718#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002719 RLOGD("setIndicationFilter: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002720#endif
Jack Yu11ab4042017-02-21 17:08:01 -08002721 if (s_vendorFunctions->version < 15) {
2722 RequestInfo *pRI = android::addRequestToList(serial, mSlotId,
2723 RIL_REQUEST_SET_UNSOLICITED_RESPONSE_FILTER);
2724 sendErrorResponse(pRI, RIL_E_REQUEST_NOT_SUPPORTED);
2725 return Void();
2726 }
2727 dispatchInts(serial, mSlotId, RIL_REQUEST_SET_UNSOLICITED_RESPONSE_FILTER, 1, indicationFilter);
2728 return Void();
2729}
2730
Wileen Chiu718c0bf2017-01-04 11:37:19 -08002731Return<void> RadioImpl::setSimCardPower(int32_t serial, bool powerUp) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002732#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002733 RLOGD("setSimCardPower: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002734#endif
Wileen Chiu718c0bf2017-01-04 11:37:19 -08002735 dispatchInts(serial, mSlotId, RIL_REQUEST_SET_SIM_CARD_POWER, 1, BOOL_TO_INT(powerUp));
2736 return Void();
2737}
2738
Grace Chen797c1c22017-03-23 18:39:48 -07002739Return<void> RadioImpl::setSimCardPower_1_1(int32_t serial,
2740 const ::android::hardware::radio::V1_1::CardPowerState state) {
2741#if VDBG
2742 RLOGD("setSimCardPower_1_1: serial %d state %d", serial, state);
2743#endif
2744 dispatchInts(serial, mSlotId, RIL_REQUEST_SET_SIM_CARD_POWER, 1, state);
2745 return Void();
2746}
2747
Sanket Padawef220dc52017-01-02 23:46:00 -08002748Return<void> RadioImpl::responseAcknowledgement() {
2749 android::releaseWakeLock();
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002750 return Void();
Sanket Padawef220dc52017-01-02 23:46:00 -08002751}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002752
Amit Mahajan439da362017-02-13 17:43:04 -08002753Return<void> OemHookImpl::setResponseFunctions(
2754 const ::android::sp<IOemHookResponse>& oemHookResponseParam,
2755 const ::android::sp<IOemHookIndication>& oemHookIndicationParam) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002756#if VDBG
Amit Mahajan439da362017-02-13 17:43:04 -08002757 RLOGD("OemHookImpl::setResponseFunctions");
Jayachandran C572f2f42017-03-25 14:30:13 -07002758#endif
Amit Mahajan439da362017-02-13 17:43:04 -08002759
2760 pthread_rwlock_t *radioServiceRwlockPtr = radio::getRadioServiceRwlock(mSlotId);
2761 int ret = pthread_rwlock_wrlock(radioServiceRwlockPtr);
2762 assert(ret == 0);
2763
2764 mOemHookResponse = oemHookResponseParam;
2765 mOemHookIndication = oemHookIndicationParam;
Amit Mahajand423d192017-03-16 17:04:01 -07002766 mCounterOemHook[mSlotId]++;
Amit Mahajan439da362017-02-13 17:43:04 -08002767
2768 ret = pthread_rwlock_unlock(radioServiceRwlockPtr);
2769 assert(ret == 0);
2770
2771 return Void();
2772}
2773
2774Return<void> OemHookImpl::sendRequestRaw(int32_t serial, const hidl_vec<uint8_t>& data) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002775#if VDBG
Amit Mahajan439da362017-02-13 17:43:04 -08002776 RLOGD("OemHookImpl::sendRequestRaw: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002777#endif
Amit Mahajan439da362017-02-13 17:43:04 -08002778 dispatchRaw(serial, mSlotId, RIL_REQUEST_OEM_HOOK_RAW, data);
2779 return Void();
2780}
2781
2782Return<void> OemHookImpl::sendRequestStrings(int32_t serial,
2783 const hidl_vec<hidl_string>& data) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002784#if VDBG
Amit Mahajan439da362017-02-13 17:43:04 -08002785 RLOGD("OemHookImpl::sendRequestStrings: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002786#endif
Amit Mahajan439da362017-02-13 17:43:04 -08002787 dispatchStrings(serial, mSlotId, RIL_REQUEST_OEM_HOOK_STRINGS, data);
2788 return Void();
2789}
2790
pkanwarc61837e2017-03-17 12:49:34 -07002791Return<void> RadioImpl::setCarrierInfoForImsiEncryption(int32_t serial,
pkanwarb10761e2017-05-21 10:24:30 -07002792 const ::android::hardware::radio::V1_1::ImsiEncryptionInfo& data) {
pkanwarc61837e2017-03-17 12:49:34 -07002793 RLOGD("setCarrierInfoForImsiEncryption: serial %d", serial);
pkanwarb10761e2017-05-21 10:24:30 -07002794 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_SET_CARRIER_INFO_IMSI_ENCRYPTION);
2795 RIL_CarrierInfoForImsiEncryption imsiEncryption = {};
2796
2797 if (!copyHidlStringToRil(&imsiEncryption.mnc, data.mnc, pRI)) {
2798 return Void();
2799 }
2800 if (!copyHidlStringToRil(&imsiEncryption.mcc, data.mcc, pRI)) {
2801 memsetAndFreeStrings(1, imsiEncryption.mnc);
2802 return Void();
2803 }
2804 if (!copyHidlStringToRil(&imsiEncryption.keyIdentifier, data.keyIdentifier, pRI)) {
2805 memsetAndFreeStrings(2, imsiEncryption.mnc, imsiEncryption.mcc);
2806 return Void();
2807 }
2808 int32_t lSize = data.carrierKey.size();
2809 imsiEncryption.carrierKey = new uint8_t[lSize];
2810 memcpy(imsiEncryption.carrierKey, data.carrierKey.data(), lSize);
2811 imsiEncryption.expirationTime = data.expirationTime;
2812 s_vendorFunctions->onRequest(pRI->pCI->requestNumber, &imsiEncryption, sizeof(RIL_CarrierInfoForImsiEncryption), pRI);
2813 delete(imsiEncryption.carrierKey);
pkanwarc61837e2017-03-17 12:49:34 -07002814 return Void();
2815}
2816
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002817/***************************************************************************************************
2818 * RESPONSE FUNCTIONS
2819 * Functions above are used for requests going from framework to vendor code. The ones below are
2820 * responses for those requests coming back from the vendor code.
2821 **************************************************************************************************/
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002822
Sanket Padawef220dc52017-01-02 23:46:00 -08002823void radio::acknowledgeRequest(int slotId, int serial) {
2824 if (radioService[slotId]->mRadioResponse != NULL) {
Amit Mahajan17249842017-01-19 15:05:45 -08002825 Return<void> retStatus = radioService[slotId]->mRadioResponse->acknowledgeRequest(serial);
2826 radioService[slotId]->checkReturnStatus(retStatus);
Sanket Padawef220dc52017-01-02 23:46:00 -08002827 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08002828 RLOGE("acknowledgeRequest: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawef220dc52017-01-02 23:46:00 -08002829 }
2830}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002831
Sanket Padawef220dc52017-01-02 23:46:00 -08002832void populateResponseInfo(RadioResponseInfo& responseInfo, int serial, int responseType,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002833 RIL_Errno e) {
Sanket Padawef220dc52017-01-02 23:46:00 -08002834 responseInfo.serial = serial;
2835 switch (responseType) {
2836 case RESPONSE_SOLICITED:
2837 responseInfo.type = RadioResponseType::SOLICITED;
2838 break;
2839 case RESPONSE_SOLICITED_ACK_EXP:
2840 responseInfo.type = RadioResponseType::SOLICITED_ACK_EXP;
2841 break;
2842 }
2843 responseInfo.error = (RadioError) e;
2844}
2845
Naveen Kalla346bbc02017-03-16 12:55:55 -07002846int responseIntOrEmpty(RadioResponseInfo& responseInfo, int serial, int responseType, RIL_Errno e,
2847 void *response, size_t responseLen) {
2848 populateResponseInfo(responseInfo, serial, responseType, e);
2849 int ret = -1;
2850
2851 if (response == NULL && responseLen == 0) {
2852 // Earlier RILs did not send a response for some cases although the interface
2853 // expected an integer as response. Do not return error if response is empty. Instead
2854 // Return -1 in those cases to maintain backward compatibility.
2855 } else if (response == NULL || responseLen != sizeof(int)) {
2856 RLOGE("responseIntOrEmpty: Invalid response");
2857 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
2858 } else {
2859 int *p_int = (int *) response;
2860 ret = p_int[0];
2861 }
2862 return ret;
2863}
2864
Sanket Padawef220dc52017-01-02 23:46:00 -08002865int responseInt(RadioResponseInfo& responseInfo, int serial, int responseType, RIL_Errno e,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002866 void *response, size_t responseLen) {
Sanket Padawef220dc52017-01-02 23:46:00 -08002867 populateResponseInfo(responseInfo, serial, responseType, e);
2868 int ret = -1;
2869
2870 if (response == NULL || responseLen != sizeof(int)) {
2871 RLOGE("responseInt: Invalid response");
2872 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
2873 } else {
2874 int *p_int = (int *) response;
2875 ret = p_int[0];
2876 }
2877 return ret;
2878}
2879
Amit Mahajan759786a2017-03-03 17:35:47 -08002880int radio::getIccCardStatusResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002881 int responseType, int serial, RIL_Errno e,
2882 void *response, size_t responseLen) {
Sanket Padawef220dc52017-01-02 23:46:00 -08002883 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08002884 RadioResponseInfo responseInfo = {};
Sanket Padawef220dc52017-01-02 23:46:00 -08002885 populateResponseInfo(responseInfo, serial, responseType, e);
Jack Yuf68e0da2017-02-07 14:53:09 -08002886 CardStatus cardStatus = {};
Sanket Padawef220dc52017-01-02 23:46:00 -08002887 if (response == NULL || responseLen != sizeof(RIL_CardStatus_v6)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08002888 RLOGE("getIccCardStatusResponse: Invalid response");
Sanket Padawef220dc52017-01-02 23:46:00 -08002889 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002890 } else {
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002891 RIL_CardStatus_v6 *p_cur = ((RIL_CardStatus_v6 *) response);
2892 cardStatus.cardState = (CardState) p_cur->card_state;
2893 cardStatus.universalPinState = (PinState) p_cur->universal_pin_state;
2894 cardStatus.gsmUmtsSubscriptionAppIndex = p_cur->gsm_umts_subscription_app_index;
2895 cardStatus.cdmaSubscriptionAppIndex = p_cur->cdma_subscription_app_index;
2896 cardStatus.imsSubscriptionAppIndex = p_cur->ims_subscription_app_index;
2897
2898 RIL_AppStatus *rilAppStatus = p_cur->applications;
2899 cardStatus.applications.resize(p_cur->num_applications);
2900 AppStatus *appStatus = cardStatus.applications.data();
Jayachandran C572f2f42017-03-25 14:30:13 -07002901#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002902 RLOGD("getIccCardStatusResponse: num_applications %d", p_cur->num_applications);
Jayachandran C572f2f42017-03-25 14:30:13 -07002903#endif
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002904 for (int i = 0; i < p_cur->num_applications; i++) {
2905 appStatus[i].appType = (AppType) rilAppStatus[i].app_type;
2906 appStatus[i].appState = (AppState) rilAppStatus[i].app_state;
2907 appStatus[i].persoSubstate = (PersoSubstate) rilAppStatus[i].perso_substate;
2908 appStatus[i].aidPtr = convertCharPtrToHidlString(rilAppStatus[i].aid_ptr);
2909 appStatus[i].appLabelPtr = convertCharPtrToHidlString(
2910 rilAppStatus[i].app_label_ptr);
2911 appStatus[i].pin1Replaced = rilAppStatus[i].pin1_replaced;
2912 appStatus[i].pin1 = (PinState) rilAppStatus[i].pin1;
2913 appStatus[i].pin2 = (PinState) rilAppStatus[i].pin2;
2914 }
2915 }
2916
Amit Mahajan17249842017-01-19 15:05:45 -08002917 Return<void> retStatus = radioService[slotId]->mRadioResponse->
2918 getIccCardStatusResponse(responseInfo, cardStatus);
2919 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002920 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08002921 RLOGE("getIccCardStatusResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawef220dc52017-01-02 23:46:00 -08002922 }
2923
2924 return 0;
2925}
2926
Amit Mahajan759786a2017-03-03 17:35:47 -08002927int radio::supplyIccPinForAppResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002928 int responseType, int serial, RIL_Errno e,
2929 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002930#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002931 RLOGD("supplyIccPinForAppResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002932#endif
Sanket Padawef220dc52017-01-02 23:46:00 -08002933
2934 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08002935 RadioResponseInfo responseInfo = {};
Naveen Kalla346bbc02017-03-16 12:55:55 -07002936 int ret = responseIntOrEmpty(responseInfo, serial, responseType, e, response, responseLen);
Amit Mahajan17249842017-01-19 15:05:45 -08002937 Return<void> retStatus = radioService[slotId]->mRadioResponse->
2938 supplyIccPinForAppResponse(responseInfo, ret);
2939 radioService[slotId]->checkReturnStatus(retStatus);
Sanket Padawef220dc52017-01-02 23:46:00 -08002940 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08002941 RLOGE("supplyIccPinForAppResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawef220dc52017-01-02 23:46:00 -08002942 slotId);
2943 }
2944
2945 return 0;
2946}
2947
Amit Mahajan759786a2017-03-03 17:35:47 -08002948int radio::supplyIccPukForAppResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002949 int responseType, int serial, RIL_Errno e,
2950 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002951#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002952 RLOGD("supplyIccPukForAppResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002953#endif
Sanket Padawef220dc52017-01-02 23:46:00 -08002954
2955 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08002956 RadioResponseInfo responseInfo = {};
Naveen Kalla346bbc02017-03-16 12:55:55 -07002957 int ret = responseIntOrEmpty(responseInfo, serial, responseType, e, response, responseLen);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002958 Return<void> retStatus = radioService[slotId]->mRadioResponse->supplyIccPukForAppResponse(
2959 responseInfo, ret);
Amit Mahajan17249842017-01-19 15:05:45 -08002960 radioService[slotId]->checkReturnStatus(retStatus);
Sanket Padawef220dc52017-01-02 23:46:00 -08002961 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08002962 RLOGE("supplyIccPukForAppResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawef220dc52017-01-02 23:46:00 -08002963 slotId);
2964 }
2965
2966 return 0;
2967}
2968
Amit Mahajan759786a2017-03-03 17:35:47 -08002969int radio::supplyIccPin2ForAppResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002970 int responseType, int serial, RIL_Errno e,
2971 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002972#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002973 RLOGD("supplyIccPin2ForAppResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002974#endif
Sanket Padawef220dc52017-01-02 23:46:00 -08002975
2976 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08002977 RadioResponseInfo responseInfo = {};
Naveen Kalla346bbc02017-03-16 12:55:55 -07002978 int ret = responseIntOrEmpty(responseInfo, serial, responseType, e, response, responseLen);
Amit Mahajan17249842017-01-19 15:05:45 -08002979 Return<void> retStatus = radioService[slotId]->mRadioResponse->
2980 supplyIccPin2ForAppResponse(responseInfo, ret);
2981 radioService[slotId]->checkReturnStatus(retStatus);
Sanket Padawef220dc52017-01-02 23:46:00 -08002982 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08002983 RLOGE("supplyIccPin2ForAppResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawef220dc52017-01-02 23:46:00 -08002984 slotId);
2985 }
2986
2987 return 0;
2988}
2989
Amit Mahajan759786a2017-03-03 17:35:47 -08002990int radio::supplyIccPuk2ForAppResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002991 int responseType, int serial, RIL_Errno e,
2992 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002993#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002994 RLOGD("supplyIccPuk2ForAppResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002995#endif
Sanket Padawef220dc52017-01-02 23:46:00 -08002996
2997 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08002998 RadioResponseInfo responseInfo = {};
Naveen Kalla346bbc02017-03-16 12:55:55 -07002999 int ret = responseIntOrEmpty(responseInfo, serial, responseType, e, response, responseLen);
Amit Mahajan17249842017-01-19 15:05:45 -08003000 Return<void> retStatus = radioService[slotId]->mRadioResponse->
3001 supplyIccPuk2ForAppResponse(responseInfo, ret);
3002 radioService[slotId]->checkReturnStatus(retStatus);
Sanket Padawef220dc52017-01-02 23:46:00 -08003003 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003004 RLOGE("supplyIccPuk2ForAppResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawef220dc52017-01-02 23:46:00 -08003005 slotId);
3006 }
3007
3008 return 0;
3009}
3010
Amit Mahajan759786a2017-03-03 17:35:47 -08003011int radio::changeIccPinForAppResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003012 int responseType, int serial, RIL_Errno e,
3013 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003014#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003015 RLOGD("changeIccPinForAppResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003016#endif
Sanket Padawef220dc52017-01-02 23:46:00 -08003017
3018 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003019 RadioResponseInfo responseInfo = {};
Naveen Kalla346bbc02017-03-16 12:55:55 -07003020 int ret = responseIntOrEmpty(responseInfo, serial, responseType, e, response, responseLen);
Amit Mahajan17249842017-01-19 15:05:45 -08003021 Return<void> retStatus = radioService[slotId]->mRadioResponse->
3022 changeIccPinForAppResponse(responseInfo, ret);
3023 radioService[slotId]->checkReturnStatus(retStatus);
Sanket Padawef220dc52017-01-02 23:46:00 -08003024 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003025 RLOGE("changeIccPinForAppResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawef220dc52017-01-02 23:46:00 -08003026 slotId);
3027 }
3028
3029 return 0;
3030}
3031
Amit Mahajan759786a2017-03-03 17:35:47 -08003032int radio::changeIccPin2ForAppResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003033 int responseType, int serial, RIL_Errno e,
3034 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003035#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003036 RLOGD("changeIccPin2ForAppResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003037#endif
Sanket Padawef220dc52017-01-02 23:46:00 -08003038
3039 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003040 RadioResponseInfo responseInfo = {};
Naveen Kalla346bbc02017-03-16 12:55:55 -07003041 int ret = responseIntOrEmpty(responseInfo, serial, responseType, e, response, responseLen);
Amit Mahajan17249842017-01-19 15:05:45 -08003042 Return<void> retStatus = radioService[slotId]->mRadioResponse->
3043 changeIccPin2ForAppResponse(responseInfo, ret);
3044 radioService[slotId]->checkReturnStatus(retStatus);
Sanket Padawef220dc52017-01-02 23:46:00 -08003045 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003046 RLOGE("changeIccPin2ForAppResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawef220dc52017-01-02 23:46:00 -08003047 slotId);
3048 }
3049
3050 return 0;
3051}
3052
Amit Mahajan759786a2017-03-03 17:35:47 -08003053int radio::supplyNetworkDepersonalizationResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003054 int responseType, int serial, RIL_Errno e,
3055 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003056#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003057 RLOGD("supplyNetworkDepersonalizationResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003058#endif
Sanket Padawef220dc52017-01-02 23:46:00 -08003059
3060 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003061 RadioResponseInfo responseInfo = {};
Naveen Kalla346bbc02017-03-16 12:55:55 -07003062 int ret = responseIntOrEmpty(responseInfo, serial, responseType, e, response, responseLen);
Amit Mahajan17249842017-01-19 15:05:45 -08003063 Return<void> retStatus = radioService[slotId]->mRadioResponse->
3064 supplyNetworkDepersonalizationResponse(responseInfo, ret);
3065 radioService[slotId]->checkReturnStatus(retStatus);
Sanket Padawef220dc52017-01-02 23:46:00 -08003066 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003067 RLOGE("supplyNetworkDepersonalizationResponse: radioService[%d]->mRadioResponse == "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003068 "NULL", slotId);
Sanket Padawef220dc52017-01-02 23:46:00 -08003069 }
3070
3071 return 0;
3072}
3073
Amit Mahajan759786a2017-03-03 17:35:47 -08003074int radio::getCurrentCallsResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003075 int responseType, int serial, RIL_Errno e,
3076 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003077#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003078 RLOGD("getCurrentCallsResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003079#endif
Sanket Padawef220dc52017-01-02 23:46:00 -08003080
3081 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003082 RadioResponseInfo responseInfo = {};
Sanket Padawef220dc52017-01-02 23:46:00 -08003083 populateResponseInfo(responseInfo, serial, responseType, e);
3084
3085 hidl_vec<Call> calls;
3086 if (response == NULL || (responseLen % sizeof(RIL_Call *)) != 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003087 RLOGE("getCurrentCallsResponse: Invalid response");
Amit Mahajan5829a472016-12-28 17:28:07 -08003088 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
Sanket Padawef220dc52017-01-02 23:46:00 -08003089 } else {
3090 int num = responseLen / sizeof(RIL_Call *);
3091 calls.resize(num);
3092
3093 for (int i = 0 ; i < num ; i++) {
3094 RIL_Call *p_cur = ((RIL_Call **) response)[i];
3095 /* each call info */
3096 calls[i].state = (CallState) p_cur->state;
3097 calls[i].index = p_cur->index;
3098 calls[i].toa = p_cur->toa;
3099 calls[i].isMpty = p_cur->isMpty;
3100 calls[i].isMT = p_cur->isMT;
3101 calls[i].als = p_cur->als;
3102 calls[i].isVoice = p_cur->isVoice;
3103 calls[i].isVoicePrivacy = p_cur->isVoicePrivacy;
3104 calls[i].number = convertCharPtrToHidlString(p_cur->number);
3105 calls[i].numberPresentation = (CallPresentation) p_cur->numberPresentation;
3106 calls[i].name = convertCharPtrToHidlString(p_cur->name);
3107 calls[i].namePresentation = (CallPresentation) p_cur->namePresentation;
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003108 if (p_cur->uusInfo != NULL && p_cur->uusInfo->uusData != NULL) {
Sanket Padawef220dc52017-01-02 23:46:00 -08003109 RIL_UUS_Info *uusInfo = p_cur->uusInfo;
3110 calls[i].uusInfo[0].uusType = (UusType) uusInfo->uusType;
3111 calls[i].uusInfo[0].uusDcs = (UusDcs) uusInfo->uusDcs;
3112 // convert uusInfo->uusData to a null-terminated string
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003113 char *nullTermStr = strndup(uusInfo->uusData, uusInfo->uusLength);
3114 calls[i].uusInfo[0].uusData = nullTermStr;
3115 free(nullTermStr);
Sanket Padawef220dc52017-01-02 23:46:00 -08003116 }
3117 }
3118 }
3119
Amit Mahajan17249842017-01-19 15:05:45 -08003120 Return<void> retStatus = radioService[slotId]->mRadioResponse->
3121 getCurrentCallsResponse(responseInfo, calls);
3122 radioService[slotId]->checkReturnStatus(retStatus);
Sanket Padawef220dc52017-01-02 23:46:00 -08003123 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003124 RLOGE("getCurrentCallsResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawef220dc52017-01-02 23:46:00 -08003125 }
3126
3127 return 0;
3128}
3129
Amit Mahajan759786a2017-03-03 17:35:47 -08003130int radio::dialResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003131 int responseType, int serial, RIL_Errno e, void *response,
3132 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003133#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003134 RLOGD("dialResponse: 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 = {};
Sanket Padawef220dc52017-01-02 23:46:00 -08003139 populateResponseInfo(responseInfo, serial, responseType, e);
Amit Mahajan17249842017-01-19 15:05:45 -08003140 Return<void> retStatus = radioService[slotId]->mRadioResponse->dialResponse(responseInfo);
3141 radioService[slotId]->checkReturnStatus(retStatus);
Sanket Padawef220dc52017-01-02 23:46:00 -08003142 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003143 RLOGE("dialResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Amit Mahajancd77a5b2016-08-25 11:19:21 -07003144 }
3145
3146 return 0;
3147}
3148
Amit Mahajan759786a2017-03-03 17:35:47 -08003149int radio::getIMSIForAppResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003150 int responseType, int serial, RIL_Errno e, void *response,
3151 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003152#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003153 RLOGD("getIMSIForAppResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003154#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003155
3156 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003157 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003158 populateResponseInfo(responseInfo, serial, responseType, e);
3159 Return<void> retStatus = radioService[slotId]->mRadioResponse->getIMSIForAppResponse(
3160 responseInfo, convertCharPtrToHidlString((char *) response));
3161 radioService[slotId]->checkReturnStatus(retStatus);
3162 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003163 RLOGE("getIMSIForAppResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003164 slotId);
3165 }
3166
3167 return 0;
3168}
3169
Amit Mahajan759786a2017-03-03 17:35:47 -08003170int radio::hangupConnectionResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003171 int responseType, int serial, RIL_Errno e,
3172 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003173#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003174 RLOGD("hangupConnectionResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003175#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003176
3177 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003178 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003179 populateResponseInfo(responseInfo, serial, responseType, e);
3180 Return<void> retStatus = radioService[slotId]->mRadioResponse->hangupConnectionResponse(
3181 responseInfo);
3182 radioService[slotId]->checkReturnStatus(retStatus);
3183 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003184 RLOGE("hangupConnectionResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003185 slotId);
3186 }
3187
3188 return 0;
3189}
3190
Amit Mahajan759786a2017-03-03 17:35:47 -08003191int radio::hangupWaitingOrBackgroundResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003192 int responseType, int serial, RIL_Errno e,
3193 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003194#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003195 RLOGD("hangupWaitingOrBackgroundResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003196#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003197
3198 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003199 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003200 populateResponseInfo(responseInfo, serial, responseType, e);
3201 Return<void> retStatus =
3202 radioService[slotId]->mRadioResponse->hangupWaitingOrBackgroundResponse(
3203 responseInfo);
3204 radioService[slotId]->checkReturnStatus(retStatus);
3205 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003206 RLOGE("hangupWaitingOrBackgroundResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003207 slotId);
3208 }
3209
3210 return 0;
3211}
3212
Amit Mahajan759786a2017-03-03 17:35:47 -08003213int radio::hangupForegroundResumeBackgroundResponse(int slotId, int responseType, int serial,
3214 RIL_Errno e, void *response,
3215 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003216#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003217 RLOGD("hangupWaitingOrBackgroundResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003218#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003219
3220 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003221 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003222 populateResponseInfo(responseInfo, serial, responseType, e);
3223 Return<void> retStatus =
3224 radioService[slotId]->mRadioResponse->hangupWaitingOrBackgroundResponse(
3225 responseInfo);
3226 radioService[slotId]->checkReturnStatus(retStatus);
3227 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003228 RLOGE("hangupWaitingOrBackgroundResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003229 slotId);
3230 }
3231
3232 return 0;
3233}
3234
Amit Mahajan759786a2017-03-03 17:35:47 -08003235int radio::switchWaitingOrHoldingAndActiveResponse(int slotId, int responseType, int serial,
3236 RIL_Errno e, void *response,
3237 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003238#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003239 RLOGD("switchWaitingOrHoldingAndActiveResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003240#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003241
3242 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003243 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003244 populateResponseInfo(responseInfo, serial, responseType, e);
3245 Return<void> retStatus =
3246 radioService[slotId]->mRadioResponse->switchWaitingOrHoldingAndActiveResponse(
3247 responseInfo);
3248 radioService[slotId]->checkReturnStatus(retStatus);
3249 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003250 RLOGE("switchWaitingOrHoldingAndActiveResponse: radioService[%d]->mRadioResponse "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003251 "== NULL", slotId);
3252 }
3253
3254 return 0;
3255}
3256
Amit Mahajan759786a2017-03-03 17:35:47 -08003257int radio::conferenceResponse(int slotId, int responseType,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003258 int serial, RIL_Errno e, void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003259#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003260 RLOGD("conferenceResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003261#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003262
3263 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003264 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003265 populateResponseInfo(responseInfo, serial, responseType, e);
3266 Return<void> retStatus = radioService[slotId]->mRadioResponse->conferenceResponse(
3267 responseInfo);
3268 radioService[slotId]->checkReturnStatus(retStatus);
3269 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003270 RLOGE("conferenceResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003271 slotId);
3272 }
3273
3274 return 0;
3275}
3276
Amit Mahajan759786a2017-03-03 17:35:47 -08003277int radio::rejectCallResponse(int slotId, int responseType,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003278 int serial, RIL_Errno e, void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003279#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003280 RLOGD("rejectCallResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003281#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003282
3283 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003284 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003285 populateResponseInfo(responseInfo, serial, responseType, e);
3286 Return<void> retStatus = radioService[slotId]->mRadioResponse->rejectCallResponse(
3287 responseInfo);
3288 radioService[slotId]->checkReturnStatus(retStatus);
3289 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003290 RLOGE("rejectCallResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003291 slotId);
3292 }
3293
3294 return 0;
3295}
3296
Amit Mahajan759786a2017-03-03 17:35:47 -08003297int radio::getLastCallFailCauseResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003298 int responseType, int serial, RIL_Errno e, void *response,
3299 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003300#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003301 RLOGD("getLastCallFailCauseResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003302#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003303
3304 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003305 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003306 populateResponseInfo(responseInfo, serial, responseType, e);
Jack Yuf68e0da2017-02-07 14:53:09 -08003307
3308 LastCallFailCauseInfo info = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003309 info.vendorCause = hidl_string();
3310 if (response == NULL) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003311 RLOGE("getCurrentCallsResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003312 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
3313 } else if (responseLen == sizeof(int)) {
3314 int *pInt = (int *) response;
3315 info.causeCode = (LastCallFailCause) pInt[0];
3316 } else if (responseLen == sizeof(RIL_LastCallFailCauseInfo)) {
3317 RIL_LastCallFailCauseInfo *pFailCauseInfo = (RIL_LastCallFailCauseInfo *) response;
3318 info.causeCode = (LastCallFailCause) pFailCauseInfo->cause_code;
3319 info.vendorCause = convertCharPtrToHidlString(pFailCauseInfo->vendor_cause);
3320 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003321 RLOGE("getCurrentCallsResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003322 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
3323 }
3324
3325 Return<void> retStatus = radioService[slotId]->mRadioResponse->getLastCallFailCauseResponse(
3326 responseInfo, info);
3327 radioService[slotId]->checkReturnStatus(retStatus);
3328 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003329 RLOGE("getLastCallFailCauseResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003330 slotId);
3331 }
3332
3333 return 0;
3334}
3335
Amit Mahajan759786a2017-03-03 17:35:47 -08003336int radio::getSignalStrengthResponse(int slotId,
Amit Mahajan3df62912017-02-10 01:35:55 +00003337 int responseType, int serial, RIL_Errno e,
3338 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003339#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003340 RLOGD("getSignalStrengthResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003341#endif
Amit Mahajan3df62912017-02-10 01:35:55 +00003342
3343 if (radioService[slotId]->mRadioResponse != NULL) {
Amit Mahajan3da9ac02017-02-13 13:41:28 -08003344 RadioResponseInfo responseInfo = {};
Amit Mahajan3df62912017-02-10 01:35:55 +00003345 populateResponseInfo(responseInfo, serial, responseType, e);
Amit Mahajan3da9ac02017-02-13 13:41:28 -08003346 SignalStrength signalStrength = {};
Amit Mahajan3df62912017-02-10 01:35:55 +00003347 if (response == NULL || responseLen != sizeof(RIL_SignalStrength_v10)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003348 RLOGE("getSignalStrengthResponse: Invalid response");
Amit Mahajan3df62912017-02-10 01:35:55 +00003349 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
3350 } else {
3351 convertRilSignalStrengthToHal(response, responseLen, signalStrength);
3352 }
3353
3354 Return<void> retStatus = radioService[slotId]->mRadioResponse->getSignalStrengthResponse(
3355 responseInfo, signalStrength);
3356 radioService[slotId]->checkReturnStatus(retStatus);
3357 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003358 RLOGE("getSignalStrengthResponse: radioService[%d]->mRadioResponse == NULL",
Amit Mahajan3df62912017-02-10 01:35:55 +00003359 slotId);
3360 }
3361
3362 return 0;
3363}
3364
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003365RIL_CellInfoType getCellInfoTypeRadioTechnology(char *rat) {
3366 if (rat == NULL) {
3367 return RIL_CELL_INFO_TYPE_NONE;
3368 }
3369
3370 int radioTech = atoi(rat);
3371
3372 switch(radioTech) {
3373
3374 case RADIO_TECH_GPRS:
3375 case RADIO_TECH_EDGE:
3376 case RADIO_TECH_GSM: {
3377 return RIL_CELL_INFO_TYPE_GSM;
3378 }
3379
3380 case RADIO_TECH_UMTS:
3381 case RADIO_TECH_HSDPA:
3382 case RADIO_TECH_HSUPA:
3383 case RADIO_TECH_HSPA:
3384 case RADIO_TECH_HSPAP: {
3385 return RIL_CELL_INFO_TYPE_WCDMA;
3386 }
3387
3388 case RADIO_TECH_IS95A:
3389 case RADIO_TECH_IS95B:
3390 case RADIO_TECH_1xRTT:
3391 case RADIO_TECH_EVDO_0:
3392 case RADIO_TECH_EVDO_A:
3393 case RADIO_TECH_EVDO_B:
3394 case RADIO_TECH_EHRPD: {
3395 return RIL_CELL_INFO_TYPE_CDMA;
3396 }
3397
3398 case RADIO_TECH_LTE:
3399 case RADIO_TECH_LTE_CA: {
3400 return RIL_CELL_INFO_TYPE_LTE;
3401 }
3402
3403 case RADIO_TECH_TD_SCDMA: {
3404 return RIL_CELL_INFO_TYPE_TD_SCDMA;
3405 }
3406
3407 default: {
3408 break;
3409 }
3410 }
3411
3412 return RIL_CELL_INFO_TYPE_NONE;
3413
3414}
3415
3416void fillCellIdentityResponse(CellIdentity &cellIdentity, RIL_CellIdentity_v16 &rilCellIdentity) {
3417
3418 cellIdentity.cellIdentityGsm.resize(0);
3419 cellIdentity.cellIdentityWcdma.resize(0);
3420 cellIdentity.cellIdentityCdma.resize(0);
3421 cellIdentity.cellIdentityTdscdma.resize(0);
3422 cellIdentity.cellIdentityLte.resize(0);
3423 cellIdentity.cellInfoType = (CellInfoType)rilCellIdentity.cellInfoType;
3424 switch(rilCellIdentity.cellInfoType) {
3425
3426 case RIL_CELL_INFO_TYPE_GSM: {
3427 cellIdentity.cellIdentityGsm.resize(1);
3428 cellIdentity.cellIdentityGsm[0].mcc =
3429 std::to_string(rilCellIdentity.cellIdentityGsm.mcc);
3430 cellIdentity.cellIdentityGsm[0].mnc =
3431 std::to_string(rilCellIdentity.cellIdentityGsm.mnc);
3432 cellIdentity.cellIdentityGsm[0].lac = rilCellIdentity.cellIdentityGsm.lac;
3433 cellIdentity.cellIdentityGsm[0].cid = rilCellIdentity.cellIdentityGsm.cid;
3434 cellIdentity.cellIdentityGsm[0].arfcn = rilCellIdentity.cellIdentityGsm.arfcn;
3435 cellIdentity.cellIdentityGsm[0].bsic = rilCellIdentity.cellIdentityGsm.bsic;
3436 break;
3437 }
3438
3439 case RIL_CELL_INFO_TYPE_WCDMA: {
3440 cellIdentity.cellIdentityWcdma.resize(1);
3441 cellIdentity.cellIdentityWcdma[0].mcc =
3442 std::to_string(rilCellIdentity.cellIdentityWcdma.mcc);
3443 cellIdentity.cellIdentityWcdma[0].mnc =
3444 std::to_string(rilCellIdentity.cellIdentityWcdma.mnc);
3445 cellIdentity.cellIdentityWcdma[0].lac = rilCellIdentity.cellIdentityWcdma.lac;
3446 cellIdentity.cellIdentityWcdma[0].cid = rilCellIdentity.cellIdentityWcdma.cid;
3447 cellIdentity.cellIdentityWcdma[0].psc = rilCellIdentity.cellIdentityWcdma.psc;
3448 cellIdentity.cellIdentityWcdma[0].uarfcn = rilCellIdentity.cellIdentityWcdma.uarfcn;
3449 break;
3450 }
3451
3452 case RIL_CELL_INFO_TYPE_CDMA: {
3453 cellIdentity.cellIdentityCdma.resize(1);
3454 cellIdentity.cellIdentityCdma[0].networkId = rilCellIdentity.cellIdentityCdma.networkId;
3455 cellIdentity.cellIdentityCdma[0].systemId = rilCellIdentity.cellIdentityCdma.systemId;
3456 cellIdentity.cellIdentityCdma[0].baseStationId =
3457 rilCellIdentity.cellIdentityCdma.basestationId;
3458 cellIdentity.cellIdentityCdma[0].longitude = rilCellIdentity.cellIdentityCdma.longitude;
3459 cellIdentity.cellIdentityCdma[0].latitude = rilCellIdentity.cellIdentityCdma.latitude;
3460 break;
3461 }
3462
3463 case RIL_CELL_INFO_TYPE_LTE: {
3464 cellIdentity.cellIdentityLte.resize(1);
3465 cellIdentity.cellIdentityLte[0].mcc =
3466 std::to_string(rilCellIdentity.cellIdentityLte.mcc);
3467 cellIdentity.cellIdentityLte[0].mnc =
3468 std::to_string(rilCellIdentity.cellIdentityLte.mnc);
3469 cellIdentity.cellIdentityLte[0].ci = rilCellIdentity.cellIdentityLte.ci;
3470 cellIdentity.cellIdentityLte[0].pci = rilCellIdentity.cellIdentityLte.pci;
3471 cellIdentity.cellIdentityLte[0].tac = rilCellIdentity.cellIdentityLte.tac;
3472 cellIdentity.cellIdentityLte[0].earfcn = rilCellIdentity.cellIdentityLte.earfcn;
3473 break;
3474 }
3475
3476 case RIL_CELL_INFO_TYPE_TD_SCDMA: {
3477 cellIdentity.cellIdentityTdscdma.resize(1);
3478 cellIdentity.cellIdentityTdscdma[0].mcc =
3479 std::to_string(rilCellIdentity.cellIdentityTdscdma.mcc);
3480 cellIdentity.cellIdentityTdscdma[0].mnc =
3481 std::to_string(rilCellIdentity.cellIdentityTdscdma.mnc);
3482 cellIdentity.cellIdentityTdscdma[0].lac = rilCellIdentity.cellIdentityTdscdma.lac;
3483 cellIdentity.cellIdentityTdscdma[0].cid = rilCellIdentity.cellIdentityTdscdma.cid;
3484 cellIdentity.cellIdentityTdscdma[0].cpid = rilCellIdentity.cellIdentityTdscdma.cpid;
3485 break;
3486 }
3487
3488 default: {
3489 break;
3490 }
3491 }
3492}
3493
3494int convertResponseStringEntryToInt(char **response, int index, int numStrings) {
3495 if ((response != NULL) && (numStrings > index) && (response[index] != NULL)) {
3496 return atoi(response[index]);
3497 }
3498
3499 return -1;
3500}
3501
3502void fillCellIdentityFromVoiceRegStateResponseString(CellIdentity &cellIdentity,
3503 int numStrings, char** response) {
3504
3505 RIL_CellIdentity_v16 rilCellIdentity;
Jack Yu8e732d42017-04-14 00:08:06 -07003506 memset(&rilCellIdentity, -1, sizeof(RIL_CellIdentity_v16));
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003507
3508 rilCellIdentity.cellInfoType = getCellInfoTypeRadioTechnology(response[3]);
3509 switch(rilCellIdentity.cellInfoType) {
3510
3511 case RIL_CELL_INFO_TYPE_GSM: {
3512 rilCellIdentity.cellIdentityGsm.lac =
3513 convertResponseStringEntryToInt(response, 1, numStrings);
3514 rilCellIdentity.cellIdentityGsm.cid =
3515 convertResponseStringEntryToInt(response, 2, numStrings);
3516 break;
3517 }
3518
3519 case RIL_CELL_INFO_TYPE_WCDMA: {
3520 rilCellIdentity.cellIdentityWcdma.lac =
3521 convertResponseStringEntryToInt(response, 1, numStrings);
3522 rilCellIdentity.cellIdentityWcdma.cid =
3523 convertResponseStringEntryToInt(response, 2, numStrings);
3524 rilCellIdentity.cellIdentityWcdma.psc =
3525 convertResponseStringEntryToInt(response, 14, numStrings);
3526 break;
3527 }
3528
3529 case RIL_CELL_INFO_TYPE_TD_SCDMA:{
3530 rilCellIdentity.cellIdentityTdscdma.lac =
3531 convertResponseStringEntryToInt(response, 1, numStrings);
3532 rilCellIdentity.cellIdentityTdscdma.cid =
3533 convertResponseStringEntryToInt(response, 2, numStrings);
3534 break;
3535 }
3536
3537 case RIL_CELL_INFO_TYPE_CDMA:{
3538 rilCellIdentity.cellIdentityCdma.basestationId =
3539 convertResponseStringEntryToInt(response, 4, numStrings);
3540 rilCellIdentity.cellIdentityCdma.longitude =
3541 convertResponseStringEntryToInt(response, 5, numStrings);
3542 rilCellIdentity.cellIdentityCdma.latitude =
3543 convertResponseStringEntryToInt(response, 6, numStrings);
3544 rilCellIdentity.cellIdentityCdma.systemId =
3545 convertResponseStringEntryToInt(response, 8, numStrings);
3546 rilCellIdentity.cellIdentityCdma.networkId =
3547 convertResponseStringEntryToInt(response, 9, numStrings);
3548 break;
3549 }
3550
Sooraj Sasindranf28e42a2017-03-06 23:07:22 -08003551 case RIL_CELL_INFO_TYPE_LTE:{
3552 rilCellIdentity.cellIdentityLte.tac =
3553 convertResponseStringEntryToInt(response, 1, numStrings);
3554 rilCellIdentity.cellIdentityLte.ci =
3555 convertResponseStringEntryToInt(response, 2, numStrings);
3556 break;
3557 }
3558
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003559 default: {
3560 break;
3561 }
3562 }
3563
3564 fillCellIdentityResponse(cellIdentity, rilCellIdentity);
3565}
3566
3567void fillCellIdentityFromDataRegStateResponseString(CellIdentity &cellIdentity,
3568 int numStrings, char** response) {
3569
3570 RIL_CellIdentity_v16 rilCellIdentity;
Jack Yu8e732d42017-04-14 00:08:06 -07003571 memset(&rilCellIdentity, -1, sizeof(RIL_CellIdentity_v16));
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003572
3573 rilCellIdentity.cellInfoType = getCellInfoTypeRadioTechnology(response[3]);
3574 switch(rilCellIdentity.cellInfoType) {
3575 case RIL_CELL_INFO_TYPE_GSM: {
3576 rilCellIdentity.cellIdentityGsm.lac =
3577 convertResponseStringEntryToInt(response, 1, numStrings);
3578 rilCellIdentity.cellIdentityGsm.cid =
3579 convertResponseStringEntryToInt(response, 2, numStrings);
3580 break;
3581 }
3582 case RIL_CELL_INFO_TYPE_WCDMA: {
3583 rilCellIdentity.cellIdentityWcdma.lac =
3584 convertResponseStringEntryToInt(response, 1, numStrings);
3585 rilCellIdentity.cellIdentityWcdma.cid =
3586 convertResponseStringEntryToInt(response, 2, numStrings);
3587 break;
3588 }
3589 case RIL_CELL_INFO_TYPE_TD_SCDMA:{
3590 rilCellIdentity.cellIdentityTdscdma.lac =
3591 convertResponseStringEntryToInt(response, 1, numStrings);
3592 rilCellIdentity.cellIdentityTdscdma.cid =
3593 convertResponseStringEntryToInt(response, 2, numStrings);
3594 break;
3595 }
3596 case RIL_CELL_INFO_TYPE_LTE: {
3597 rilCellIdentity.cellIdentityLte.tac =
3598 convertResponseStringEntryToInt(response, 6, numStrings);
3599 rilCellIdentity.cellIdentityLte.pci =
3600 convertResponseStringEntryToInt(response, 7, numStrings);
3601 rilCellIdentity.cellIdentityLte.ci =
3602 convertResponseStringEntryToInt(response, 8, numStrings);
3603 break;
3604 }
3605 default: {
3606 break;
3607 }
3608 }
3609
3610 fillCellIdentityResponse(cellIdentity, rilCellIdentity);
3611}
3612
Amit Mahajan759786a2017-03-03 17:35:47 -08003613int radio::getVoiceRegistrationStateResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003614 int responseType, int serial, RIL_Errno e,
3615 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003616#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003617 RLOGD("getVoiceRegistrationStateResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003618#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003619
3620 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003621 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003622 populateResponseInfo(responseInfo, serial, responseType, e);
3623
Jack Yuf68e0da2017-02-07 14:53:09 -08003624 VoiceRegStateResult voiceRegResponse = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003625 int numStrings = responseLen / sizeof(char *);
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003626 if (response == NULL) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003627 RLOGE("getVoiceRegistrationStateResponse Invalid response: NULL");
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003628 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
3629 } else if (s_vendorFunctions->version <= 14) {
3630 if (numStrings != 15) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003631 RLOGE("getVoiceRegistrationStateResponse Invalid response: NULL");
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003632 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
3633 } else {
3634 char **resp = (char **) response;
3635 voiceRegResponse.regState = (RegState) ATOI_NULL_HANDLED_DEF(resp[0], 4);
3636 voiceRegResponse.rat = ATOI_NULL_HANDLED(resp[3]);
3637 voiceRegResponse.cssSupported = ATOI_NULL_HANDLED_DEF(resp[7], 0);
3638 voiceRegResponse.roamingIndicator = ATOI_NULL_HANDLED(resp[10]);
3639 voiceRegResponse.systemIsInPrl = ATOI_NULL_HANDLED_DEF(resp[11], 0);
3640 voiceRegResponse.defaultRoamingIndicator = ATOI_NULL_HANDLED_DEF(resp[12], 0);
3641 voiceRegResponse.reasonForDenial = ATOI_NULL_HANDLED_DEF(resp[13], 0);
3642 fillCellIdentityFromVoiceRegStateResponseString(voiceRegResponse.cellIdentity,
3643 numStrings, resp);
3644 }
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003645 } else {
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003646 RIL_VoiceRegistrationStateResponse *voiceRegState =
3647 (RIL_VoiceRegistrationStateResponse *)response;
3648
3649 if (responseLen != sizeof(RIL_VoiceRegistrationStateResponse)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003650 RLOGE("getVoiceRegistrationStateResponse Invalid response: NULL");
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003651 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
3652 } else {
3653 voiceRegResponse.regState = (RegState) voiceRegState->regState;
3654 voiceRegResponse.rat = voiceRegState->rat;;
3655 voiceRegResponse.cssSupported = voiceRegState->cssSupported;
3656 voiceRegResponse.roamingIndicator = voiceRegState->roamingIndicator;
3657 voiceRegResponse.systemIsInPrl = voiceRegState->systemIsInPrl;
3658 voiceRegResponse.defaultRoamingIndicator = voiceRegState->defaultRoamingIndicator;
3659 voiceRegResponse.reasonForDenial = voiceRegState->reasonForDenial;
3660 fillCellIdentityResponse(voiceRegResponse.cellIdentity,
3661 voiceRegState->cellIdentity);
3662 }
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003663 }
3664
3665 Return<void> retStatus =
3666 radioService[slotId]->mRadioResponse->getVoiceRegistrationStateResponse(
3667 responseInfo, voiceRegResponse);
3668 radioService[slotId]->checkReturnStatus(retStatus);
3669 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003670 RLOGE("getVoiceRegistrationStateResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003671 slotId);
3672 }
3673
3674 return 0;
3675}
3676
Amit Mahajan759786a2017-03-03 17:35:47 -08003677int radio::getDataRegistrationStateResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003678 int responseType, int serial, RIL_Errno e,
3679 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003680#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003681 RLOGD("getDataRegistrationStateResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003682#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003683
3684 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003685 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003686 populateResponseInfo(responseInfo, serial, responseType, e);
Jack Yuf68e0da2017-02-07 14:53:09 -08003687 DataRegStateResult dataRegResponse = {};
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003688 if (response == NULL) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003689 RLOGE("getDataRegistrationStateResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003690 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003691 } else if (s_vendorFunctions->version <= 14) {
3692 int numStrings = responseLen / sizeof(char *);
3693 if ((numStrings != 6) && (numStrings != 11)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003694 RLOGE("getDataRegistrationStateResponse Invalid response: NULL");
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003695 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
3696 } else {
3697 char **resp = (char **) response;
3698 dataRegResponse.regState = (RegState) ATOI_NULL_HANDLED_DEF(resp[0], 4);
3699 dataRegResponse.rat = ATOI_NULL_HANDLED_DEF(resp[3], 0);
3700 dataRegResponse.reasonDataDenied = ATOI_NULL_HANDLED(resp[4]);
3701 dataRegResponse.maxDataCalls = ATOI_NULL_HANDLED_DEF(resp[5], 1);
3702 fillCellIdentityFromDataRegStateResponseString(dataRegResponse.cellIdentity,
3703 numStrings, resp);
3704 }
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003705 } else {
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003706 RIL_DataRegistrationStateResponse *dataRegState =
3707 (RIL_DataRegistrationStateResponse *)response;
3708
3709 if (responseLen != sizeof(RIL_DataRegistrationStateResponse)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003710 RLOGE("getDataRegistrationStateResponse Invalid response: NULL");
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003711 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
3712 } else {
3713 dataRegResponse.regState = (RegState) dataRegState->regState;
3714 dataRegResponse.rat = dataRegState->rat;;
3715 dataRegResponse.reasonDataDenied = dataRegState->reasonDataDenied;
3716 dataRegResponse.maxDataCalls = dataRegState->maxDataCalls;
3717 fillCellIdentityResponse(dataRegResponse.cellIdentity, dataRegState->cellIdentity);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003718 }
3719 }
3720
3721 Return<void> retStatus =
3722 radioService[slotId]->mRadioResponse->getDataRegistrationStateResponse(responseInfo,
3723 dataRegResponse);
3724 radioService[slotId]->checkReturnStatus(retStatus);
3725 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003726 RLOGE("getDataRegistrationStateResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003727 slotId);
3728 }
3729
3730 return 0;
3731}
3732
Amit Mahajan759786a2017-03-03 17:35:47 -08003733int radio::getOperatorResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003734 int responseType, int serial, RIL_Errno e, void *response,
3735 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003736#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003737 RLOGD("getOperatorResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003738#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003739
3740 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003741 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003742 populateResponseInfo(responseInfo, serial, responseType, e);
3743 hidl_string longName;
3744 hidl_string shortName;
3745 hidl_string numeric;
3746 int numStrings = responseLen / sizeof(char *);
3747 if (response == NULL || numStrings != 3) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003748 RLOGE("getOperatorResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003749 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
3750
3751 } else {
3752 char **resp = (char **) response;
3753 longName = convertCharPtrToHidlString(resp[0]);
3754 shortName = convertCharPtrToHidlString(resp[1]);
3755 numeric = convertCharPtrToHidlString(resp[2]);
3756 }
3757 Return<void> retStatus = radioService[slotId]->mRadioResponse->getOperatorResponse(
3758 responseInfo, longName, shortName, numeric);
3759 radioService[slotId]->checkReturnStatus(retStatus);
3760 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003761 RLOGE("getOperatorResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003762 slotId);
3763 }
3764
3765 return 0;
3766}
3767
Amit Mahajan759786a2017-03-03 17:35:47 -08003768int radio::setRadioPowerResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003769 int responseType, int serial, RIL_Errno e, void *response,
3770 size_t responseLen) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003771 RLOGD("setRadioPowerResponse: serial %d", serial);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003772
3773 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003774 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003775 populateResponseInfo(responseInfo, serial, responseType, e);
3776 Return<void> retStatus = radioService[slotId]->mRadioResponse->setRadioPowerResponse(
3777 responseInfo);
3778 radioService[slotId]->checkReturnStatus(retStatus);
3779 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003780 RLOGE("setRadioPowerResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003781 slotId);
3782 }
3783
3784 return 0;
3785}
3786
Amit Mahajan759786a2017-03-03 17:35:47 -08003787int radio::sendDtmfResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003788 int responseType, int serial, RIL_Errno e, void *response,
3789 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003790#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003791 RLOGD("sendDtmfResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003792#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003793
3794 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003795 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003796 populateResponseInfo(responseInfo, serial, responseType, e);
3797 Return<void> retStatus = radioService[slotId]->mRadioResponse->sendDtmfResponse(
3798 responseInfo);
3799 radioService[slotId]->checkReturnStatus(retStatus);
3800 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003801 RLOGE("sendDtmfResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003802 slotId);
3803 }
3804
3805 return 0;
3806}
3807
3808SendSmsResult makeSendSmsResult(RadioResponseInfo& responseInfo, int serial, int responseType,
3809 RIL_Errno e, void *response, size_t responseLen) {
3810 populateResponseInfo(responseInfo, serial, responseType, e);
Jack Yuf68e0da2017-02-07 14:53:09 -08003811 SendSmsResult result = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003812
3813 if (response == NULL || responseLen != sizeof(RIL_SMS_Response)) {
3814 RLOGE("Invalid response: NULL");
3815 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003816 result.ackPDU = hidl_string();
3817 } else {
3818 RIL_SMS_Response *resp = (RIL_SMS_Response *) response;
3819 result.messageRef = resp->messageRef;
3820 result.ackPDU = convertCharPtrToHidlString(resp->ackPDU);
3821 result.errorCode = resp->errorCode;
3822 }
3823 return result;
3824}
3825
Amit Mahajan759786a2017-03-03 17:35:47 -08003826int radio::sendSmsResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003827 int responseType, int serial, RIL_Errno e, void *response,
3828 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003829#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003830 RLOGD("sendSmsResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003831#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003832
3833 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003834 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003835 SendSmsResult result = makeSendSmsResult(responseInfo, serial, responseType, e, response,
3836 responseLen);
3837
3838 Return<void> retStatus = radioService[slotId]->mRadioResponse->sendSmsResponse(responseInfo,
3839 result);
3840 radioService[slotId]->checkReturnStatus(retStatus);
3841 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003842 RLOGE("sendSmsResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003843 }
3844
3845 return 0;
3846}
3847
Amit Mahajan759786a2017-03-03 17:35:47 -08003848int radio::sendSMSExpectMoreResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003849 int responseType, int serial, RIL_Errno e, void *response,
3850 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003851#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003852 RLOGD("sendSMSExpectMoreResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003853#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003854
3855 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003856 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003857 SendSmsResult result = makeSendSmsResult(responseInfo, serial, responseType, e, response,
3858 responseLen);
3859
3860 Return<void> retStatus = radioService[slotId]->mRadioResponse->sendSMSExpectMoreResponse(
3861 responseInfo, result);
3862 radioService[slotId]->checkReturnStatus(retStatus);
3863 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003864 RLOGE("sendSMSExpectMoreResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003865 }
3866
3867 return 0;
3868}
3869
Amit Mahajan759786a2017-03-03 17:35:47 -08003870int radio::setupDataCallResponse(int slotId,
Amit Mahajan3df62912017-02-10 01:35:55 +00003871 int responseType, int serial, RIL_Errno e, void *response,
3872 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003873#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003874 RLOGD("setupDataCallResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003875#endif
Amit Mahajan3df62912017-02-10 01:35:55 +00003876
3877 if (radioService[slotId]->mRadioResponse != NULL) {
Amit Mahajan3da9ac02017-02-13 13:41:28 -08003878 RadioResponseInfo responseInfo = {};
Amit Mahajan3df62912017-02-10 01:35:55 +00003879 populateResponseInfo(responseInfo, serial, responseType, e);
3880
Amit Mahajan3da9ac02017-02-13 13:41:28 -08003881 SetupDataCallResult result = {};
Amit Mahajan3df62912017-02-10 01:35:55 +00003882 if (response == NULL || responseLen != sizeof(RIL_Data_Call_Response_v11)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003883 RLOGE("setupDataCallResponse: Invalid response");
Amit Mahajan3df62912017-02-10 01:35:55 +00003884 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
Jack Yu5079e182017-02-28 15:21:18 -08003885 result.status = DataCallFailCause::ERROR_UNSPECIFIED;
Amit Mahajan3da9ac02017-02-13 13:41:28 -08003886 result.type = hidl_string();
3887 result.ifname = hidl_string();
3888 result.addresses = hidl_string();
3889 result.dnses = hidl_string();
3890 result.gateways = hidl_string();
3891 result.pcscf = hidl_string();
Amit Mahajan3df62912017-02-10 01:35:55 +00003892 } else {
3893 convertRilDataCallToHal((RIL_Data_Call_Response_v11 *) response, result);
3894 }
3895
3896 Return<void> retStatus = radioService[slotId]->mRadioResponse->setupDataCallResponse(
3897 responseInfo, result);
3898 radioService[slotId]->checkReturnStatus(retStatus);
3899 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003900 RLOGE("setupDataCallResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Amit Mahajan3df62912017-02-10 01:35:55 +00003901 }
3902
3903 return 0;
3904}
3905
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003906IccIoResult responseIccIo(RadioResponseInfo& responseInfo, int serial, int responseType,
3907 RIL_Errno e, void *response, size_t responseLen) {
3908 populateResponseInfo(responseInfo, serial, responseType, e);
Jack Yuf68e0da2017-02-07 14:53:09 -08003909 IccIoResult result = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003910
3911 if (response == NULL || responseLen != sizeof(RIL_SIM_IO_Response)) {
3912 RLOGE("Invalid response: NULL");
3913 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003914 result.simResponse = hidl_string();
3915 } else {
3916 RIL_SIM_IO_Response *resp = (RIL_SIM_IO_Response *) response;
3917 result.sw1 = resp->sw1;
3918 result.sw2 = resp->sw2;
3919 result.simResponse = convertCharPtrToHidlString(resp->simResponse);
3920 }
3921 return result;
3922}
3923
Amit Mahajan759786a2017-03-03 17:35:47 -08003924int radio::iccIOForAppResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003925 int responseType, int serial, RIL_Errno e, void *response,
3926 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003927#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003928 RLOGD("iccIOForAppResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003929#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003930
3931 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003932 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003933 IccIoResult result = responseIccIo(responseInfo, serial, responseType, e, response,
3934 responseLen);
3935
3936 Return<void> retStatus = radioService[slotId]->mRadioResponse->iccIOForAppResponse(
3937 responseInfo, result);
3938 radioService[slotId]->checkReturnStatus(retStatus);
3939 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003940 RLOGE("iccIOForAppResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003941 }
3942
3943 return 0;
3944}
3945
Amit Mahajan759786a2017-03-03 17:35:47 -08003946int radio::sendUssdResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003947 int responseType, int serial, RIL_Errno e, void *response,
3948 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003949#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003950 RLOGD("sendUssdResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003951#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003952
3953 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003954 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003955 populateResponseInfo(responseInfo, serial, responseType, e);
3956 Return<void> retStatus = radioService[slotId]->mRadioResponse->sendUssdResponse(
3957 responseInfo);
3958 radioService[slotId]->checkReturnStatus(retStatus);
3959 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003960 RLOGE("sendUssdResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003961 slotId);
3962 }
3963
3964 return 0;
3965}
3966
Amit Mahajan759786a2017-03-03 17:35:47 -08003967int radio::cancelPendingUssdResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003968 int responseType, int serial, RIL_Errno e, void *response,
3969 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003970#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003971 RLOGD("cancelPendingUssdResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003972#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003973
3974 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003975 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003976 populateResponseInfo(responseInfo, serial, responseType, e);
3977 Return<void> retStatus = radioService[slotId]->mRadioResponse->cancelPendingUssdResponse(
3978 responseInfo);
3979 radioService[slotId]->checkReturnStatus(retStatus);
3980 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003981 RLOGE("cancelPendingUssdResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003982 slotId);
3983 }
3984
3985 return 0;
3986}
3987
Amit Mahajan759786a2017-03-03 17:35:47 -08003988int radio::getClirResponse(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("getClirResponse: 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 populateResponseInfo(responseInfo, serial, responseType, e);
3998 int n = -1, m = -1;
3999 int numInts = responseLen / sizeof(int);
4000 if (response == NULL || numInts != 2) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004001 RLOGE("getClirResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004002 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
4003 } else {
4004 int *pInt = (int *) response;
4005 n = pInt[0];
4006 m = pInt[1];
4007 }
4008 Return<void> retStatus = radioService[slotId]->mRadioResponse->getClirResponse(responseInfo,
4009 n, m);
4010 radioService[slotId]->checkReturnStatus(retStatus);
4011 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004012 RLOGE("getClirResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004013 }
4014
4015 return 0;
4016}
4017
Amit Mahajan759786a2017-03-03 17:35:47 -08004018int radio::setClirResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004019 int responseType, int serial, RIL_Errno e, void *response,
4020 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004021#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004022 RLOGD("setClirResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004023#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004024
4025 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004026 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004027 populateResponseInfo(responseInfo, serial, responseType, e);
4028 Return<void> retStatus = radioService[slotId]->mRadioResponse->setClirResponse(
4029 responseInfo);
4030 radioService[slotId]->checkReturnStatus(retStatus);
4031 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004032 RLOGE("setClirResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004033 }
4034
4035 return 0;
4036}
4037
Amit Mahajan759786a2017-03-03 17:35:47 -08004038int radio::getCallForwardStatusResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004039 int responseType, int serial, RIL_Errno e,
4040 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004041#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004042 RLOGD("getCallForwardStatusResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004043#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004044
4045 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004046 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004047 populateResponseInfo(responseInfo, serial, responseType, e);
4048 hidl_vec<CallForwardInfo> callForwardInfos;
4049
4050 if (response == NULL || responseLen % sizeof(RIL_CallForwardInfo *) != 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004051 RLOGE("getCallForwardStatusResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004052 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
4053 } else {
4054 int num = responseLen / sizeof(RIL_CallForwardInfo *);
4055 callForwardInfos.resize(num);
4056 for (int i = 0 ; i < num; i++) {
4057 RIL_CallForwardInfo *resp = ((RIL_CallForwardInfo **) response)[i];
4058 callForwardInfos[i].status = (CallForwardInfoStatus) resp->status;
4059 callForwardInfos[i].reason = resp->reason;
4060 callForwardInfos[i].serviceClass = resp->serviceClass;
4061 callForwardInfos[i].toa = resp->toa;
4062 callForwardInfos[i].number = convertCharPtrToHidlString(resp->number);
4063 callForwardInfos[i].timeSeconds = resp->timeSeconds;
4064 }
4065 }
4066
4067 Return<void> retStatus = radioService[slotId]->mRadioResponse->getCallForwardStatusResponse(
4068 responseInfo, callForwardInfos);
4069 radioService[slotId]->checkReturnStatus(retStatus);
4070 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004071 RLOGE("getCallForwardStatusResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004072 slotId);
4073 }
4074
4075 return 0;
4076}
4077
Amit Mahajan759786a2017-03-03 17:35:47 -08004078int radio::setCallForwardResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004079 int responseType, int serial, RIL_Errno e, void *response,
4080 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004081#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004082 RLOGD("setCallForwardResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004083#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004084
4085 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004086 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004087 populateResponseInfo(responseInfo, serial, responseType, e);
4088 Return<void> retStatus = radioService[slotId]->mRadioResponse->setCallForwardResponse(
4089 responseInfo);
4090 radioService[slotId]->checkReturnStatus(retStatus);
4091 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004092 RLOGE("setCallForwardResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004093 }
4094
4095 return 0;
4096}
4097
Amit Mahajan759786a2017-03-03 17:35:47 -08004098int radio::getCallWaitingResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004099 int responseType, int serial, RIL_Errno e, void *response,
4100 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004101#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004102 RLOGD("getCallWaitingResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004103#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004104
4105 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004106 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004107 populateResponseInfo(responseInfo, serial, responseType, e);
4108 bool enable = false;
4109 int serviceClass = -1;
4110 int numInts = responseLen / sizeof(int);
4111 if (response == NULL || numInts != 2) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004112 RLOGE("getCallWaitingResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004113 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
4114 } else {
4115 int *pInt = (int *) response;
4116 enable = pInt[0] == 1 ? true : false;
4117 serviceClass = pInt[1];
4118 }
Sanket Padawe5375bfa2017-03-07 17:21:05 -08004119 Return<void> retStatus = radioService[slotId]->mRadioResponse->getCallWaitingResponse(
4120 responseInfo, enable, serviceClass);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004121 radioService[slotId]->checkReturnStatus(retStatus);
4122 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004123 RLOGE("getCallWaitingResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004124 }
4125
4126 return 0;
4127}
4128
Amit Mahajan759786a2017-03-03 17:35:47 -08004129int radio::setCallWaitingResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004130 int responseType, int serial, RIL_Errno e, void *response,
4131 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004132#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004133 RLOGD("setCallWaitingResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004134#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004135
4136 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004137 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004138 populateResponseInfo(responseInfo, serial, responseType, e);
4139 Return<void> retStatus = radioService[slotId]->mRadioResponse->setCallWaitingResponse(
4140 responseInfo);
4141 radioService[slotId]->checkReturnStatus(retStatus);
4142 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004143 RLOGE("setCallWaitingResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004144 }
4145
4146 return 0;
4147}
4148
Amit Mahajan759786a2017-03-03 17:35:47 -08004149int radio::acknowledgeLastIncomingGsmSmsResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004150 int responseType, int serial, RIL_Errno e,
4151 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004152#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004153 RLOGD("acknowledgeLastIncomingGsmSmsResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004154#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004155
4156 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004157 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004158 populateResponseInfo(responseInfo, serial, responseType, e);
4159 Return<void> retStatus =
4160 radioService[slotId]->mRadioResponse->acknowledgeLastIncomingGsmSmsResponse(
4161 responseInfo);
4162 radioService[slotId]->checkReturnStatus(retStatus);
4163 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004164 RLOGE("acknowledgeLastIncomingGsmSmsResponse: radioService[%d]->mRadioResponse "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004165 "== NULL", slotId);
4166 }
4167
4168 return 0;
4169}
4170
Amit Mahajan759786a2017-03-03 17:35:47 -08004171int radio::acceptCallResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004172 int responseType, int serial, RIL_Errno e,
4173 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004174#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004175 RLOGD("acceptCallResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004176#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004177
4178 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004179 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004180 populateResponseInfo(responseInfo, serial, responseType, e);
4181 Return<void> retStatus = radioService[slotId]->mRadioResponse->acceptCallResponse(
4182 responseInfo);
4183 radioService[slotId]->checkReturnStatus(retStatus);
4184 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004185 RLOGE("acceptCallResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004186 slotId);
4187 }
4188
4189 return 0;
4190}
4191
Amit Mahajan759786a2017-03-03 17:35:47 -08004192int radio::deactivateDataCallResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004193 int responseType, int serial, RIL_Errno e,
4194 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004195#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004196 RLOGD("deactivateDataCallResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004197#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004198
4199 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004200 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004201 populateResponseInfo(responseInfo, serial, responseType, e);
4202 Return<void> retStatus = radioService[slotId]->mRadioResponse->deactivateDataCallResponse(
4203 responseInfo);
4204 radioService[slotId]->checkReturnStatus(retStatus);
4205 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004206 RLOGE("deactivateDataCallResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004207 slotId);
4208 }
4209
4210 return 0;
4211}
4212
Amit Mahajan759786a2017-03-03 17:35:47 -08004213int radio::getFacilityLockForAppResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004214 int responseType, int serial, RIL_Errno e,
4215 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004216#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004217 RLOGD("getFacilityLockForAppResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004218#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004219
4220 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004221 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004222 int ret = responseInt(responseInfo, serial, responseType, e, response, responseLen);
4223 Return<void> retStatus = radioService[slotId]->mRadioResponse->
4224 getFacilityLockForAppResponse(responseInfo, ret);
4225 radioService[slotId]->checkReturnStatus(retStatus);
4226 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004227 RLOGE("getFacilityLockForAppResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004228 slotId);
4229 }
4230
4231 return 0;
4232}
4233
Amit Mahajan759786a2017-03-03 17:35:47 -08004234int radio::setFacilityLockForAppResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004235 int responseType, int serial, RIL_Errno e,
4236 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004237#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004238 RLOGD("setFacilityLockForAppResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004239#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004240
4241 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004242 RadioResponseInfo responseInfo = {};
Naveen Kalla346bbc02017-03-16 12:55:55 -07004243 int ret = responseIntOrEmpty(responseInfo, serial, responseType, e, response, responseLen);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004244 Return<void> retStatus
4245 = radioService[slotId]->mRadioResponse->setFacilityLockForAppResponse(responseInfo,
4246 ret);
4247 radioService[slotId]->checkReturnStatus(retStatus);
4248 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004249 RLOGE("setFacilityLockForAppResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004250 slotId);
4251 }
4252
4253 return 0;
4254}
4255
Amit Mahajan759786a2017-03-03 17:35:47 -08004256int radio::setBarringPasswordResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004257 int responseType, int serial, RIL_Errno e,
4258 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004259#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004260 RLOGD("acceptCallResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004261#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004262
4263 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004264 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004265 populateResponseInfo(responseInfo, serial, responseType, e);
4266 Return<void> retStatus
4267 = radioService[slotId]->mRadioResponse->setBarringPasswordResponse(responseInfo);
4268 radioService[slotId]->checkReturnStatus(retStatus);
4269 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004270 RLOGE("setBarringPasswordResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004271 slotId);
4272 }
4273
4274 return 0;
4275}
4276
Amit Mahajan759786a2017-03-03 17:35:47 -08004277int radio::getNetworkSelectionModeResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004278 int responseType, int serial, RIL_Errno e, void *response,
4279 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004280#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004281 RLOGD("getNetworkSelectionModeResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004282#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004283
4284 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004285 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004286 populateResponseInfo(responseInfo, serial, responseType, e);
4287 bool manual = false;
4288 int serviceClass;
4289 if (response == NULL || responseLen != sizeof(int)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004290 RLOGE("getNetworkSelectionModeResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004291 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
4292 } else {
4293 int *pInt = (int *) response;
4294 manual = pInt[0] == 1 ? true : false;
4295 }
4296 Return<void> retStatus
4297 = radioService[slotId]->mRadioResponse->getNetworkSelectionModeResponse(
4298 responseInfo,
4299 manual);
4300 radioService[slotId]->checkReturnStatus(retStatus);
4301 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004302 RLOGE("getNetworkSelectionModeResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004303 slotId);
4304 }
4305
4306 return 0;
4307}
4308
Amit Mahajan759786a2017-03-03 17:35:47 -08004309int radio::setNetworkSelectionModeAutomaticResponse(int slotId, int responseType, int serial,
4310 RIL_Errno e, void *response,
4311 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004312#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004313 RLOGD("setNetworkSelectionModeAutomaticResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004314#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004315
4316 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004317 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004318 populateResponseInfo(responseInfo, serial, responseType, e);
4319 Return<void> retStatus
4320 = radioService[slotId]->mRadioResponse->setNetworkSelectionModeAutomaticResponse(
4321 responseInfo);
4322 radioService[slotId]->checkReturnStatus(retStatus);
4323 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004324 RLOGE("setNetworkSelectionModeAutomaticResponse: radioService[%d]->mRadioResponse "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004325 "== NULL", slotId);
4326 }
4327
4328 return 0;
4329}
4330
Amit Mahajan759786a2017-03-03 17:35:47 -08004331int radio::setNetworkSelectionModeManualResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004332 int responseType, int serial, RIL_Errno e,
4333 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004334#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004335 RLOGD("setNetworkSelectionModeManualResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004336#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004337
4338 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004339 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004340 populateResponseInfo(responseInfo, serial, responseType, e);
4341 Return<void> retStatus
4342 = radioService[slotId]->mRadioResponse->setNetworkSelectionModeManualResponse(
4343 responseInfo);
4344 radioService[slotId]->checkReturnStatus(retStatus);
4345 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004346 RLOGE("acceptCallResponse: radioService[%d]->setNetworkSelectionModeManualResponse "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004347 "== NULL", slotId);
4348 }
4349
4350 return 0;
4351}
4352
Jack Yuf68e0da2017-02-07 14:53:09 -08004353int convertOperatorStatusToInt(const char *str) {
4354 if (strncmp("unknown", str, 9) == 0) {
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004355 return (int) OperatorStatus::UNKNOWN;
Jack Yuf68e0da2017-02-07 14:53:09 -08004356 } else if (strncmp("available", str, 9) == 0) {
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004357 return (int) OperatorStatus::AVAILABLE;
Jack Yuf68e0da2017-02-07 14:53:09 -08004358 } else if (strncmp("current", str, 9) == 0) {
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004359 return (int) OperatorStatus::CURRENT;
Jack Yuf68e0da2017-02-07 14:53:09 -08004360 } else if (strncmp("forbidden", str, 9) == 0) {
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004361 return (int) OperatorStatus::FORBIDDEN;
4362 } else {
4363 return -1;
4364 }
4365}
4366
Amit Mahajan759786a2017-03-03 17:35:47 -08004367int radio::getAvailableNetworksResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004368 int responseType, int serial, RIL_Errno e, void *response,
4369 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004370#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004371 RLOGD("getAvailableNetworksResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004372#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004373
4374 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004375 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004376 populateResponseInfo(responseInfo, serial, responseType, e);
4377 hidl_vec<OperatorInfo> networks;
4378 if (response == NULL || responseLen % (4 * sizeof(char *))!= 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004379 RLOGE("getAvailableNetworksResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004380 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
4381 } else {
4382 char **resp = (char **) response;
4383 int numStrings = responseLen / sizeof(char *);
4384 networks.resize(numStrings/4);
Jayachandran Ce0d755c2017-03-01 18:26:50 -08004385 for (int i = 0, j = 0; i < numStrings; i = i + 4, j++) {
4386 networks[j].alphaLong = convertCharPtrToHidlString(resp[i]);
4387 networks[j].alphaShort = convertCharPtrToHidlString(resp[i + 1]);
4388 networks[j].operatorNumeric = convertCharPtrToHidlString(resp[i + 2]);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004389 int status = convertOperatorStatusToInt(resp[i + 3]);
4390 if (status == -1) {
4391 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
4392 } else {
Jayachandran Ce0d755c2017-03-01 18:26:50 -08004393 networks[j].status = (OperatorStatus) status;
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004394 }
4395 }
4396 }
4397 Return<void> retStatus
4398 = radioService[slotId]->mRadioResponse->getAvailableNetworksResponse(responseInfo,
4399 networks);
4400 radioService[slotId]->checkReturnStatus(retStatus);
4401 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004402 RLOGE("getAvailableNetworksResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004403 slotId);
4404 }
4405
4406 return 0;
4407}
4408
Amit Mahajan759786a2017-03-03 17:35:47 -08004409int radio::startDtmfResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004410 int responseType, int serial, RIL_Errno e,
4411 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004412#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004413 RLOGD("startDtmfResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004414#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004415
4416 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004417 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004418 populateResponseInfo(responseInfo, serial, responseType, e);
4419 Return<void> retStatus
4420 = radioService[slotId]->mRadioResponse->startDtmfResponse(responseInfo);
4421 radioService[slotId]->checkReturnStatus(retStatus);
4422 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004423 RLOGE("startDtmfResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004424 }
4425
4426 return 0;
4427}
4428
Amit Mahajan759786a2017-03-03 17:35:47 -08004429int radio::stopDtmfResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004430 int responseType, int serial, RIL_Errno e,
4431 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004432#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004433 RLOGD("stopDtmfResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004434#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004435
4436 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004437 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004438 populateResponseInfo(responseInfo, serial, responseType, e);
4439 Return<void> retStatus
4440 = radioService[slotId]->mRadioResponse->stopDtmfResponse(responseInfo);
4441 radioService[slotId]->checkReturnStatus(retStatus);
4442 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004443 RLOGE("stopDtmfResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004444 }
4445
4446 return 0;
4447}
4448
Amit Mahajan759786a2017-03-03 17:35:47 -08004449int radio::getBasebandVersionResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004450 int responseType, int serial, RIL_Errno e,
4451 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004452#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004453 RLOGD("getBasebandVersionResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004454#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004455
4456 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004457 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004458 populateResponseInfo(responseInfo, serial, responseType, e);
4459 Return<void> retStatus
4460 = radioService[slotId]->mRadioResponse->getBasebandVersionResponse(responseInfo,
4461 convertCharPtrToHidlString((char *) response));
4462 radioService[slotId]->checkReturnStatus(retStatus);
4463 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004464 RLOGE("getBasebandVersionResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004465 }
4466
4467 return 0;
4468}
4469
Amit Mahajan759786a2017-03-03 17:35:47 -08004470int radio::separateConnectionResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004471 int responseType, int serial, RIL_Errno e,
4472 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004473#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004474 RLOGD("separateConnectionResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004475#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004476
4477 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004478 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004479 populateResponseInfo(responseInfo, serial, responseType, e);
4480 Return<void> retStatus
4481 = radioService[slotId]->mRadioResponse->separateConnectionResponse(responseInfo);
4482 radioService[slotId]->checkReturnStatus(retStatus);
4483 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004484 RLOGE("separateConnectionResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004485 slotId);
4486 }
4487
4488 return 0;
4489}
4490
Amit Mahajan759786a2017-03-03 17:35:47 -08004491int radio::setMuteResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004492 int responseType, int serial, RIL_Errno e,
4493 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004494#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004495 RLOGD("setMuteResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004496#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004497
4498 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004499 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004500 populateResponseInfo(responseInfo, serial, responseType, e);
4501 Return<void> retStatus
4502 = radioService[slotId]->mRadioResponse->setMuteResponse(responseInfo);
4503 radioService[slotId]->checkReturnStatus(retStatus);
4504 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004505 RLOGE("setMuteResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004506 }
4507
4508 return 0;
4509}
4510
Amit Mahajan759786a2017-03-03 17:35:47 -08004511int radio::getMuteResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004512 int responseType, int serial, RIL_Errno e, void *response,
4513 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004514#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004515 RLOGD("getMuteResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004516#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004517
4518 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004519 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004520 populateResponseInfo(responseInfo, serial, responseType, e);
4521 bool enable = false;
4522 int serviceClass;
4523 if (response == NULL || responseLen != sizeof(int)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004524 RLOGE("getMuteResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004525 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
4526 } else {
4527 int *pInt = (int *) response;
4528 enable = pInt[0] == 1 ? true : false;
4529 }
4530 Return<void> retStatus = radioService[slotId]->mRadioResponse->getMuteResponse(responseInfo,
4531 enable);
4532 radioService[slotId]->checkReturnStatus(retStatus);
4533 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004534 RLOGE("getMuteResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004535 }
4536
4537 return 0;
4538}
4539
Amit Mahajan759786a2017-03-03 17:35:47 -08004540int radio::getClipResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004541 int responseType, int serial, RIL_Errno e,
4542 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004543#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004544 RLOGD("getClipResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004545#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004546
4547 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004548 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004549 int ret = responseInt(responseInfo, serial, responseType, e, response, responseLen);
4550 Return<void> retStatus = radioService[slotId]->mRadioResponse->getClipResponse(responseInfo,
4551 (ClipStatus) ret);
4552 radioService[slotId]->checkReturnStatus(retStatus);
4553 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004554 RLOGE("getClipResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004555 }
4556
4557 return 0;
4558}
4559
Amit Mahajan759786a2017-03-03 17:35:47 -08004560int radio::getDataCallListResponse(int slotId,
Amit Mahajan3df62912017-02-10 01:35:55 +00004561 int responseType, int serial, RIL_Errno e,
4562 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004563#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004564 RLOGD("getDataCallListResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004565#endif
Amit Mahajan3df62912017-02-10 01:35:55 +00004566
4567 if (radioService[slotId]->mRadioResponse != NULL) {
Amit Mahajan3da9ac02017-02-13 13:41:28 -08004568 RadioResponseInfo responseInfo = {};
Amit Mahajan3df62912017-02-10 01:35:55 +00004569 populateResponseInfo(responseInfo, serial, responseType, e);
4570
4571 hidl_vec<SetupDataCallResult> ret;
4572 if (response == NULL || responseLen % sizeof(RIL_Data_Call_Response_v11) != 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004573 RLOGE("getDataCallListResponse: invalid response");
Amit Mahajan3df62912017-02-10 01:35:55 +00004574 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
4575 } else {
4576 convertRilDataCallListToHal(response, responseLen, ret);
4577 }
4578
4579 Return<void> retStatus = radioService[slotId]->mRadioResponse->getDataCallListResponse(
4580 responseInfo, ret);
4581 radioService[slotId]->checkReturnStatus(retStatus);
4582 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004583 RLOGE("getDataCallListResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Amit Mahajan3df62912017-02-10 01:35:55 +00004584 }
4585
4586 return 0;
4587}
4588
Amit Mahajan759786a2017-03-03 17:35:47 -08004589int radio::setSuppServiceNotificationsResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004590 int responseType, int serial, RIL_Errno e,
4591 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004592#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004593 RLOGD("setSuppServiceNotificationsResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004594#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004595
4596 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004597 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004598 populateResponseInfo(responseInfo, serial, responseType, e);
4599 Return<void> retStatus
4600 = radioService[slotId]->mRadioResponse->setSuppServiceNotificationsResponse(
4601 responseInfo);
4602 radioService[slotId]->checkReturnStatus(retStatus);
4603 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004604 RLOGE("setSuppServiceNotificationsResponse: radioService[%d]->mRadioResponse "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004605 "== NULL", slotId);
4606 }
4607
4608 return 0;
4609}
4610
Amit Mahajan759786a2017-03-03 17:35:47 -08004611int radio::deleteSmsOnSimResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004612 int responseType, int serial, RIL_Errno e,
4613 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004614#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004615 RLOGD("deleteSmsOnSimResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004616#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004617
4618 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004619 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004620 populateResponseInfo(responseInfo, serial, responseType, e);
4621 Return<void> retStatus
4622 = radioService[slotId]->mRadioResponse->deleteSmsOnSimResponse(responseInfo);
4623 radioService[slotId]->checkReturnStatus(retStatus);
4624 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004625 RLOGE("deleteSmsOnSimResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004626 }
4627
4628 return 0;
4629}
4630
Amit Mahajan759786a2017-03-03 17:35:47 -08004631int radio::setBandModeResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004632 int responseType, int serial, RIL_Errno e,
4633 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004634#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004635 RLOGD("setBandModeResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004636#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004637
4638 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004639 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004640 populateResponseInfo(responseInfo, serial, responseType, e);
4641 Return<void> retStatus
4642 = radioService[slotId]->mRadioResponse->setBandModeResponse(responseInfo);
4643 radioService[slotId]->checkReturnStatus(retStatus);
4644 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004645 RLOGE("setBandModeResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004646 }
4647
4648 return 0;
4649}
4650
Amit Mahajan759786a2017-03-03 17:35:47 -08004651int radio::writeSmsToSimResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004652 int responseType, int serial, RIL_Errno e,
4653 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004654#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004655 RLOGD("writeSmsToSimResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004656#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004657
4658 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004659 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004660 int ret = responseInt(responseInfo, serial, responseType, e, response, responseLen);
4661 Return<void> retStatus
4662 = radioService[slotId]->mRadioResponse->writeSmsToSimResponse(responseInfo, ret);
4663 radioService[slotId]->checkReturnStatus(retStatus);
4664 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004665 RLOGE("writeSmsToSimResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004666 }
4667
4668 return 0;
4669}
4670
Amit Mahajan759786a2017-03-03 17:35:47 -08004671int radio::getAvailableBandModesResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004672 int responseType, int serial, RIL_Errno e, void *response,
4673 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004674#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004675 RLOGD("getAvailableBandModesResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004676#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004677
4678 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004679 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004680 populateResponseInfo(responseInfo, serial, responseType, e);
4681 hidl_vec<RadioBandMode> modes;
4682 if (response == NULL || responseLen % sizeof(int) != 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004683 RLOGE("getAvailableBandModesResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004684 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
4685 } else {
4686 int *pInt = (int *) response;
4687 int numInts = responseLen / sizeof(int);
4688 modes.resize(numInts);
4689 for (int i = 0; i < numInts; i++) {
4690 modes[i] = (RadioBandMode) pInt[i];
4691 }
4692 }
4693 Return<void> retStatus
4694 = radioService[slotId]->mRadioResponse->getAvailableBandModesResponse(responseInfo,
4695 modes);
4696 radioService[slotId]->checkReturnStatus(retStatus);
4697 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004698 RLOGE("getAvailableBandModesResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004699 slotId);
4700 }
4701
4702 return 0;
4703}
4704
Amit Mahajan759786a2017-03-03 17:35:47 -08004705int radio::sendEnvelopeResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004706 int responseType, int serial, RIL_Errno e,
4707 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004708#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004709 RLOGD("sendEnvelopeResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004710#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004711
4712 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004713 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004714 populateResponseInfo(responseInfo, serial, responseType, e);
4715 Return<void> retStatus
4716 = radioService[slotId]->mRadioResponse->sendEnvelopeResponse(responseInfo,
4717 convertCharPtrToHidlString((char *) response));
4718 radioService[slotId]->checkReturnStatus(retStatus);
4719 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004720 RLOGE("sendEnvelopeResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004721 }
4722
4723 return 0;
4724}
4725
Amit Mahajan759786a2017-03-03 17:35:47 -08004726int radio::sendTerminalResponseToSimResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004727 int responseType, int serial, RIL_Errno e,
4728 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004729#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004730 RLOGD("sendTerminalResponseToSimResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004731#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004732
4733 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004734 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004735 populateResponseInfo(responseInfo, serial, responseType, e);
4736 Return<void> retStatus
4737 = radioService[slotId]->mRadioResponse->sendTerminalResponseToSimResponse(
4738 responseInfo);
4739 radioService[slotId]->checkReturnStatus(retStatus);
4740 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004741 RLOGE("sendTerminalResponseToSimResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004742 slotId);
4743 }
4744
4745 return 0;
4746}
4747
Amit Mahajan759786a2017-03-03 17:35:47 -08004748int radio::handleStkCallSetupRequestFromSimResponse(int slotId,
4749 int responseType, int serial,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004750 RIL_Errno e, void *response,
4751 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004752#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004753 RLOGD("handleStkCallSetupRequestFromSimResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004754#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004755
4756 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004757 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004758 populateResponseInfo(responseInfo, serial, responseType, e);
4759 Return<void> retStatus
4760 = radioService[slotId]->mRadioResponse->handleStkCallSetupRequestFromSimResponse(
4761 responseInfo);
4762 radioService[slotId]->checkReturnStatus(retStatus);
4763 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004764 RLOGE("handleStkCallSetupRequestFromSimResponse: radioService[%d]->mRadioResponse "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004765 "== NULL", slotId);
4766 }
4767
4768 return 0;
4769}
4770
Amit Mahajan759786a2017-03-03 17:35:47 -08004771int radio::explicitCallTransferResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004772 int responseType, int serial, RIL_Errno e,
4773 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004774#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004775 RLOGD("explicitCallTransferResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004776#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004777
4778 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004779 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004780 populateResponseInfo(responseInfo, serial, responseType, e);
4781 Return<void> retStatus
4782 = radioService[slotId]->mRadioResponse->explicitCallTransferResponse(responseInfo);
4783 radioService[slotId]->checkReturnStatus(retStatus);
4784 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004785 RLOGE("explicitCallTransferResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004786 slotId);
4787 }
4788
4789 return 0;
4790}
4791
Amit Mahajan759786a2017-03-03 17:35:47 -08004792int radio::setPreferredNetworkTypeResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004793 int responseType, int serial, RIL_Errno e,
4794 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004795#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004796 RLOGD("setPreferredNetworkTypeResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004797#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004798
4799 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004800 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004801 populateResponseInfo(responseInfo, serial, responseType, e);
4802 Return<void> retStatus
4803 = radioService[slotId]->mRadioResponse->setPreferredNetworkTypeResponse(
4804 responseInfo);
4805 radioService[slotId]->checkReturnStatus(retStatus);
4806 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004807 RLOGE("setPreferredNetworkTypeResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004808 slotId);
4809 }
4810
4811 return 0;
4812}
4813
4814
Amit Mahajan759786a2017-03-03 17:35:47 -08004815int radio::getPreferredNetworkTypeResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004816 int responseType, int serial, RIL_Errno e,
4817 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004818#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004819 RLOGD("getPreferredNetworkTypeResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004820#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004821
4822 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004823 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004824 int ret = responseInt(responseInfo, serial, responseType, e, response, responseLen);
4825 Return<void> retStatus
4826 = radioService[slotId]->mRadioResponse->getPreferredNetworkTypeResponse(
4827 responseInfo, (PreferredNetworkType) ret);
4828 radioService[slotId]->checkReturnStatus(retStatus);
4829 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004830 RLOGE("getPreferredNetworkTypeResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004831 slotId);
4832 }
4833
4834 return 0;
4835}
4836
Amit Mahajan759786a2017-03-03 17:35:47 -08004837int radio::getNeighboringCidsResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004838 int responseType, int serial, RIL_Errno e,
4839 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004840#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004841 RLOGD("getNeighboringCidsResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004842#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004843
4844 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004845 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004846 populateResponseInfo(responseInfo, serial, responseType, e);
4847 hidl_vec<NeighboringCell> cells;
4848
4849 if (response == NULL || responseLen % sizeof(RIL_NeighboringCell *) != 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004850 RLOGE("getNeighboringCidsResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004851 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
4852 } else {
4853 int num = responseLen / sizeof(RIL_NeighboringCell *);
4854 cells.resize(num);
4855 for (int i = 0 ; i < num; i++) {
4856 RIL_NeighboringCell *resp = ((RIL_NeighboringCell **) response)[i];
4857 cells[i].cid = convertCharPtrToHidlString(resp->cid);
4858 cells[i].rssi = resp->rssi;
4859 }
4860 }
4861
4862 Return<void> retStatus
4863 = radioService[slotId]->mRadioResponse->getNeighboringCidsResponse(responseInfo,
4864 cells);
4865 radioService[slotId]->checkReturnStatus(retStatus);
4866 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004867 RLOGE("getNeighboringCidsResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004868 slotId);
4869 }
4870
4871 return 0;
4872}
4873
Amit Mahajan759786a2017-03-03 17:35:47 -08004874int radio::setLocationUpdatesResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004875 int responseType, int serial, RIL_Errno e,
4876 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004877#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004878 RLOGD("setLocationUpdatesResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004879#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004880
4881 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004882 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004883 populateResponseInfo(responseInfo, serial, responseType, e);
4884 Return<void> retStatus
4885 = radioService[slotId]->mRadioResponse->setLocationUpdatesResponse(responseInfo);
4886 radioService[slotId]->checkReturnStatus(retStatus);
4887 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004888 RLOGE("setLocationUpdatesResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004889 slotId);
4890 }
4891
4892 return 0;
4893}
4894
Amit Mahajan759786a2017-03-03 17:35:47 -08004895int radio::setCdmaSubscriptionSourceResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004896 int responseType, int serial, RIL_Errno e,
4897 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004898#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004899 RLOGD("setCdmaSubscriptionSourceResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004900#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004901
4902 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004903 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004904 populateResponseInfo(responseInfo, serial, responseType, e);
4905 Return<void> retStatus
4906 = radioService[slotId]->mRadioResponse->setCdmaSubscriptionSourceResponse(
4907 responseInfo);
4908 radioService[slotId]->checkReturnStatus(retStatus);
4909 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004910 RLOGE("setCdmaSubscriptionSourceResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004911 slotId);
4912 }
4913
4914 return 0;
4915}
4916
Amit Mahajan759786a2017-03-03 17:35:47 -08004917int radio::setCdmaRoamingPreferenceResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004918 int responseType, int serial, RIL_Errno e,
4919 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004920#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004921 RLOGD("setCdmaRoamingPreferenceResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004922#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004923
4924 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004925 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004926 populateResponseInfo(responseInfo, serial, responseType, e);
4927 Return<void> retStatus
4928 = radioService[slotId]->mRadioResponse->setCdmaRoamingPreferenceResponse(
4929 responseInfo);
4930 radioService[slotId]->checkReturnStatus(retStatus);
4931 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004932 RLOGE("setCdmaRoamingPreferenceResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004933 slotId);
4934 }
4935
4936 return 0;
4937}
4938
Amit Mahajan759786a2017-03-03 17:35:47 -08004939int radio::getCdmaRoamingPreferenceResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004940 int responseType, int serial, RIL_Errno e,
4941 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004942#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004943 RLOGD("getCdmaRoamingPreferenceResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004944#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004945
4946 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004947 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004948 int ret = responseInt(responseInfo, serial, responseType, e, response, responseLen);
4949 Return<void> retStatus
4950 = radioService[slotId]->mRadioResponse->getCdmaRoamingPreferenceResponse(
4951 responseInfo, (CdmaRoamingType) ret);
4952 radioService[slotId]->checkReturnStatus(retStatus);
4953 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004954 RLOGE("getCdmaRoamingPreferenceResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004955 slotId);
4956 }
4957
4958 return 0;
4959}
4960
Amit Mahajan759786a2017-03-03 17:35:47 -08004961int radio::setTTYModeResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004962 int responseType, int serial, RIL_Errno e,
4963 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004964#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004965 RLOGD("setTTYModeResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004966#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004967
4968 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004969 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004970 populateResponseInfo(responseInfo, serial, responseType, e);
4971 Return<void> retStatus
4972 = radioService[slotId]->mRadioResponse->setTTYModeResponse(responseInfo);
4973 radioService[slotId]->checkReturnStatus(retStatus);
4974 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004975 RLOGE("setTTYModeResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004976 }
4977
4978 return 0;
4979}
4980
Amit Mahajan759786a2017-03-03 17:35:47 -08004981int radio::getTTYModeResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004982 int responseType, int serial, RIL_Errno e,
4983 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004984#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004985 RLOGD("getTTYModeResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004986#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004987
4988 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004989 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004990 int ret = responseInt(responseInfo, serial, responseType, e, response, responseLen);
4991 Return<void> retStatus
4992 = radioService[slotId]->mRadioResponse->getTTYModeResponse(responseInfo,
4993 (TtyMode) ret);
4994 radioService[slotId]->checkReturnStatus(retStatus);
4995 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004996 RLOGE("getTTYModeResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004997 }
4998
4999 return 0;
5000}
5001
Amit Mahajan759786a2017-03-03 17:35:47 -08005002int radio::setPreferredVoicePrivacyResponse(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("setPreferredVoicePrivacyResponse: 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 Return<void> retStatus
5013 = radioService[slotId]->mRadioResponse->setPreferredVoicePrivacyResponse(
5014 responseInfo);
5015 radioService[slotId]->checkReturnStatus(retStatus);
5016 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005017 RLOGE("setPreferredVoicePrivacyResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005018 slotId);
5019 }
5020
5021 return 0;
5022}
5023
Amit Mahajan759786a2017-03-03 17:35:47 -08005024int radio::getPreferredVoicePrivacyResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005025 int responseType, int serial, RIL_Errno e,
5026 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005027#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005028 RLOGD("getPreferredVoicePrivacyResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005029#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005030
5031 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005032 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005033 populateResponseInfo(responseInfo, serial, responseType, e);
5034 bool enable = false;
5035 int numInts = responseLen / sizeof(int);
5036 if (response == NULL || numInts != 1) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005037 RLOGE("getPreferredVoicePrivacyResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005038 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
5039 } else {
5040 int *pInt = (int *) response;
5041 enable = pInt[0] == 1 ? true : false;
5042 }
5043 Return<void> retStatus
5044 = radioService[slotId]->mRadioResponse->getPreferredVoicePrivacyResponse(
5045 responseInfo, enable);
5046 radioService[slotId]->checkReturnStatus(retStatus);
5047 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005048 RLOGE("getPreferredVoicePrivacyResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005049 slotId);
5050 }
5051
5052 return 0;
5053}
5054
Amit Mahajan759786a2017-03-03 17:35:47 -08005055int radio::sendCDMAFeatureCodeResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005056 int responseType, int serial, RIL_Errno e,
5057 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005058#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005059 RLOGD("sendCDMAFeatureCodeResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005060#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005061
5062 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005063 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005064 populateResponseInfo(responseInfo, serial, responseType, e);
5065 Return<void> retStatus
5066 = radioService[slotId]->mRadioResponse->sendCDMAFeatureCodeResponse(responseInfo);
5067 radioService[slotId]->checkReturnStatus(retStatus);
5068 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005069 RLOGE("sendCDMAFeatureCodeResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005070 slotId);
5071 }
5072
5073 return 0;
5074}
5075
Amit Mahajan759786a2017-03-03 17:35:47 -08005076int radio::sendBurstDtmfResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005077 int responseType, int serial, RIL_Errno e,
5078 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005079#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005080 RLOGD("sendBurstDtmfResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005081#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005082
5083 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005084 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005085 populateResponseInfo(responseInfo, serial, responseType, e);
5086 Return<void> retStatus
5087 = radioService[slotId]->mRadioResponse->sendBurstDtmfResponse(responseInfo);
5088 radioService[slotId]->checkReturnStatus(retStatus);
5089 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005090 RLOGE("sendBurstDtmfResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005091 }
5092
5093 return 0;
5094}
5095
Amit Mahajan759786a2017-03-03 17:35:47 -08005096int radio::sendCdmaSmsResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005097 int responseType, int serial, RIL_Errno e, void *response,
5098 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005099#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005100 RLOGD("sendCdmaSmsResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005101#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005102
5103 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005104 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005105 SendSmsResult result = makeSendSmsResult(responseInfo, serial, responseType, e, response,
5106 responseLen);
5107
5108 Return<void> retStatus
5109 = radioService[slotId]->mRadioResponse->sendCdmaSmsResponse(responseInfo, result);
5110 radioService[slotId]->checkReturnStatus(retStatus);
5111 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005112 RLOGE("sendCdmaSmsResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005113 }
5114
5115 return 0;
5116}
5117
Amit Mahajan759786a2017-03-03 17:35:47 -08005118int radio::acknowledgeLastIncomingCdmaSmsResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005119 int responseType, int serial, RIL_Errno e,
5120 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005121#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005122 RLOGD("acknowledgeLastIncomingCdmaSmsResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005123#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005124
5125 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005126 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005127 populateResponseInfo(responseInfo, serial, responseType, e);
5128 Return<void> retStatus
5129 = radioService[slotId]->mRadioResponse->acknowledgeLastIncomingCdmaSmsResponse(
5130 responseInfo);
5131 radioService[slotId]->checkReturnStatus(retStatus);
5132 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005133 RLOGE("acknowledgeLastIncomingCdmaSmsResponse: radioService[%d]->mRadioResponse "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005134 "== NULL", slotId);
5135 }
5136
5137 return 0;
5138}
5139
Amit Mahajan759786a2017-03-03 17:35:47 -08005140int radio::getGsmBroadcastConfigResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005141 int responseType, int serial, RIL_Errno e,
5142 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005143#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005144 RLOGD("getGsmBroadcastConfigResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005145#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005146
5147 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005148 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005149 populateResponseInfo(responseInfo, serial, responseType, e);
5150 hidl_vec<GsmBroadcastSmsConfigInfo> configs;
5151
5152 if (response == NULL || responseLen % sizeof(RIL_GSM_BroadcastSmsConfigInfo *) != 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005153 RLOGE("getGsmBroadcastConfigResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005154 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
5155 } else {
5156 int num = responseLen / sizeof(RIL_GSM_BroadcastSmsConfigInfo *);
5157 configs.resize(num);
5158 for (int i = 0 ; i < num; i++) {
5159 RIL_GSM_BroadcastSmsConfigInfo *resp =
5160 ((RIL_GSM_BroadcastSmsConfigInfo **) response)[i];
5161 configs[i].fromServiceId = resp->fromServiceId;
5162 configs[i].toServiceId = resp->toServiceId;
5163 configs[i].fromCodeScheme = resp->fromCodeScheme;
5164 configs[i].toCodeScheme = resp->toCodeScheme;
5165 configs[i].selected = resp->selected == 1 ? true : false;
5166 }
5167 }
5168
5169 Return<void> retStatus
5170 = radioService[slotId]->mRadioResponse->getGsmBroadcastConfigResponse(responseInfo,
5171 configs);
5172 radioService[slotId]->checkReturnStatus(retStatus);
5173 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005174 RLOGE("getGsmBroadcastConfigResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005175 slotId);
5176 }
5177
5178 return 0;
5179}
5180
Amit Mahajan759786a2017-03-03 17:35:47 -08005181int radio::setGsmBroadcastConfigResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005182 int responseType, int serial, RIL_Errno e,
5183 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005184#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005185 RLOGD("setGsmBroadcastConfigResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005186#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005187
5188 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005189 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005190 populateResponseInfo(responseInfo, serial, responseType, e);
5191 Return<void> retStatus
5192 = radioService[slotId]->mRadioResponse->setGsmBroadcastConfigResponse(responseInfo);
5193 radioService[slotId]->checkReturnStatus(retStatus);
5194 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005195 RLOGE("setGsmBroadcastConfigResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005196 slotId);
5197 }
5198
5199 return 0;
5200}
5201
Amit Mahajan759786a2017-03-03 17:35:47 -08005202int radio::setGsmBroadcastActivationResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005203 int responseType, int serial, RIL_Errno e,
5204 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005205#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005206 RLOGD("setGsmBroadcastActivationResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005207#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005208
5209 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005210 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005211 populateResponseInfo(responseInfo, serial, responseType, e);
5212 Return<void> retStatus
5213 = radioService[slotId]->mRadioResponse->setGsmBroadcastActivationResponse(
5214 responseInfo);
5215 radioService[slotId]->checkReturnStatus(retStatus);
5216 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005217 RLOGE("setGsmBroadcastActivationResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005218 slotId);
5219 }
5220
5221 return 0;
5222}
5223
Amit Mahajan759786a2017-03-03 17:35:47 -08005224int radio::getCdmaBroadcastConfigResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005225 int responseType, int serial, RIL_Errno e,
5226 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005227#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005228 RLOGD("getCdmaBroadcastConfigResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005229#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005230
5231 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005232 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005233 populateResponseInfo(responseInfo, serial, responseType, e);
5234 hidl_vec<CdmaBroadcastSmsConfigInfo> configs;
5235
5236 if (response == NULL || responseLen % sizeof(RIL_CDMA_BroadcastSmsConfigInfo *) != 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005237 RLOGE("getCdmaBroadcastConfigResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005238 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
5239 } else {
5240 int num = responseLen / sizeof(RIL_CDMA_BroadcastSmsConfigInfo *);
5241 configs.resize(num);
5242 for (int i = 0 ; i < num; i++) {
5243 RIL_CDMA_BroadcastSmsConfigInfo *resp =
5244 ((RIL_CDMA_BroadcastSmsConfigInfo **) response)[i];
5245 configs[i].serviceCategory = resp->service_category;
5246 configs[i].language = resp->language;
5247 configs[i].selected = resp->selected == 1 ? true : false;
5248 }
5249 }
5250
5251 Return<void> retStatus
5252 = radioService[slotId]->mRadioResponse->getCdmaBroadcastConfigResponse(responseInfo,
5253 configs);
5254 radioService[slotId]->checkReturnStatus(retStatus);
5255 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005256 RLOGE("getCdmaBroadcastConfigResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005257 slotId);
5258 }
5259
5260 return 0;
5261}
5262
Amit Mahajan759786a2017-03-03 17:35:47 -08005263int radio::setCdmaBroadcastConfigResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005264 int responseType, int serial, RIL_Errno e,
5265 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005266#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005267 RLOGD("setCdmaBroadcastConfigResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005268#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005269
5270 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005271 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005272 populateResponseInfo(responseInfo, serial, responseType, e);
5273 Return<void> retStatus
5274 = radioService[slotId]->mRadioResponse->setCdmaBroadcastConfigResponse(
5275 responseInfo);
5276 radioService[slotId]->checkReturnStatus(retStatus);
5277 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005278 RLOGE("setCdmaBroadcastConfigResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005279 slotId);
5280 }
5281
5282 return 0;
5283}
5284
Amit Mahajan759786a2017-03-03 17:35:47 -08005285int radio::setCdmaBroadcastActivationResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005286 int responseType, int serial, RIL_Errno e,
5287 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005288#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005289 RLOGD("setCdmaBroadcastActivationResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005290#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005291
5292 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005293 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005294 populateResponseInfo(responseInfo, serial, responseType, e);
5295 Return<void> retStatus
5296 = radioService[slotId]->mRadioResponse->setCdmaBroadcastActivationResponse(
5297 responseInfo);
5298 radioService[slotId]->checkReturnStatus(retStatus);
5299 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005300 RLOGE("setCdmaBroadcastActivationResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005301 slotId);
5302 }
5303
5304 return 0;
5305}
5306
Amit Mahajan759786a2017-03-03 17:35:47 -08005307int radio::getCDMASubscriptionResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005308 int responseType, int serial, RIL_Errno e, void *response,
5309 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005310#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005311 RLOGD("getCDMASubscriptionResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005312#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005313
5314 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005315 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005316 populateResponseInfo(responseInfo, serial, responseType, e);
5317
5318 int numStrings = responseLen / sizeof(char *);
5319 hidl_string emptyString;
5320 if (response == NULL || numStrings != 5) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005321 RLOGE("getOperatorResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005322 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
5323 Return<void> retStatus
5324 = radioService[slotId]->mRadioResponse->getCDMASubscriptionResponse(
5325 responseInfo, emptyString, emptyString, emptyString, emptyString, emptyString);
5326 radioService[slotId]->checkReturnStatus(retStatus);
5327 } else {
5328 char **resp = (char **) response;
5329 Return<void> retStatus
5330 = radioService[slotId]->mRadioResponse->getCDMASubscriptionResponse(
5331 responseInfo,
5332 convertCharPtrToHidlString(resp[0]),
5333 convertCharPtrToHidlString(resp[1]),
5334 convertCharPtrToHidlString(resp[2]),
5335 convertCharPtrToHidlString(resp[3]),
5336 convertCharPtrToHidlString(resp[4]));
5337 radioService[slotId]->checkReturnStatus(retStatus);
5338 }
5339 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005340 RLOGE("getCDMASubscriptionResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005341 slotId);
5342 }
5343
5344 return 0;
5345}
5346
Amit Mahajan759786a2017-03-03 17:35:47 -08005347int radio::writeSmsToRuimResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005348 int responseType, int serial, RIL_Errno e,
5349 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005350#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005351 RLOGD("writeSmsToRuimResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005352#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005353
5354 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005355 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005356 int ret = responseInt(responseInfo, serial, responseType, e, response, responseLen);
5357 Return<void> retStatus
5358 = radioService[slotId]->mRadioResponse->writeSmsToRuimResponse(responseInfo, ret);
5359 radioService[slotId]->checkReturnStatus(retStatus);
5360 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005361 RLOGE("writeSmsToRuimResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005362 }
5363
5364 return 0;
5365}
5366
Amit Mahajan759786a2017-03-03 17:35:47 -08005367int radio::deleteSmsOnRuimResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005368 int responseType, int serial, RIL_Errno e,
5369 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005370#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005371 RLOGD("deleteSmsOnRuimResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005372#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005373
5374 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005375 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005376 populateResponseInfo(responseInfo, serial, responseType, e);
5377 Return<void> retStatus
5378 = radioService[slotId]->mRadioResponse->deleteSmsOnRuimResponse(responseInfo);
5379 radioService[slotId]->checkReturnStatus(retStatus);
5380 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005381 RLOGE("deleteSmsOnRuimResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005382 }
5383
5384 return 0;
5385}
5386
Amit Mahajan759786a2017-03-03 17:35:47 -08005387int radio::getDeviceIdentityResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005388 int responseType, int serial, RIL_Errno e, void *response,
5389 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005390#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005391 RLOGD("getDeviceIdentityResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005392#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005393
5394 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005395 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005396 populateResponseInfo(responseInfo, serial, responseType, e);
5397
5398 int numStrings = responseLen / sizeof(char *);
5399 hidl_string emptyString;
5400 if (response == NULL || numStrings != 4) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005401 RLOGE("getDeviceIdentityResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005402 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
5403 Return<void> retStatus
5404 = radioService[slotId]->mRadioResponse->getDeviceIdentityResponse(responseInfo,
5405 emptyString, emptyString, emptyString, emptyString);
5406 radioService[slotId]->checkReturnStatus(retStatus);
5407 } else {
5408 char **resp = (char **) response;
5409 Return<void> retStatus
5410 = radioService[slotId]->mRadioResponse->getDeviceIdentityResponse(responseInfo,
5411 convertCharPtrToHidlString(resp[0]),
5412 convertCharPtrToHidlString(resp[1]),
5413 convertCharPtrToHidlString(resp[2]),
5414 convertCharPtrToHidlString(resp[3]));
5415 radioService[slotId]->checkReturnStatus(retStatus);
5416 }
5417 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005418 RLOGE("getDeviceIdentityResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005419 slotId);
5420 }
5421
5422 return 0;
5423}
5424
Amit Mahajan759786a2017-03-03 17:35:47 -08005425int radio::exitEmergencyCallbackModeResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005426 int responseType, int serial, RIL_Errno e,
5427 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005428#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005429 RLOGD("exitEmergencyCallbackModeResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005430#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005431
5432 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005433 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005434 populateResponseInfo(responseInfo, serial, responseType, e);
5435 Return<void> retStatus
5436 = radioService[slotId]->mRadioResponse->exitEmergencyCallbackModeResponse(
5437 responseInfo);
5438 radioService[slotId]->checkReturnStatus(retStatus);
5439 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005440 RLOGE("exitEmergencyCallbackModeResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005441 slotId);
5442 }
5443
5444 return 0;
5445}
5446
Amit Mahajan759786a2017-03-03 17:35:47 -08005447int radio::getSmscAddressResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005448 int responseType, int serial, RIL_Errno e,
5449 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005450#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005451 RLOGD("getSmscAddressResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005452#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005453
5454 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005455 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005456 populateResponseInfo(responseInfo, serial, responseType, e);
5457 Return<void> retStatus
5458 = radioService[slotId]->mRadioResponse->getSmscAddressResponse(responseInfo,
5459 convertCharPtrToHidlString((char *) response));
5460 radioService[slotId]->checkReturnStatus(retStatus);
5461 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005462 RLOGE("getSmscAddressResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005463 }
5464
5465 return 0;
5466}
5467
Amit Mahajan759786a2017-03-03 17:35:47 -08005468int radio::setSmscAddressResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005469 int responseType, int serial, RIL_Errno e,
5470 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005471#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005472 RLOGD("setSmscAddressResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005473#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005474
5475 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005476 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005477 populateResponseInfo(responseInfo, serial, responseType, e);
5478 Return<void> retStatus
5479 = radioService[slotId]->mRadioResponse->setSmscAddressResponse(responseInfo);
5480 radioService[slotId]->checkReturnStatus(retStatus);
5481 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005482 RLOGE("setSmscAddressResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005483 }
5484
5485 return 0;
5486}
5487
Amit Mahajan759786a2017-03-03 17:35:47 -08005488int radio::reportSmsMemoryStatusResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005489 int responseType, int serial, RIL_Errno e,
5490 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005491#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005492 RLOGD("reportSmsMemoryStatusResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005493#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005494
5495 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005496 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005497 populateResponseInfo(responseInfo, serial, responseType, e);
5498 Return<void> retStatus
5499 = radioService[slotId]->mRadioResponse->reportSmsMemoryStatusResponse(responseInfo);
5500 radioService[slotId]->checkReturnStatus(retStatus);
5501 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005502 RLOGE("reportSmsMemoryStatusResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005503 slotId);
5504 }
5505
5506 return 0;
5507}
5508
Amit Mahajan759786a2017-03-03 17:35:47 -08005509int radio::reportStkServiceIsRunningResponse(int slotId,
Amit Mahajan5007ffa2017-01-31 17:14:42 -08005510 int responseType, int serial, RIL_Errno e,
5511 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005512#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005513 RLOGD("reportStkServiceIsRunningResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005514#endif
Amit Mahajan5007ffa2017-01-31 17:14:42 -08005515
5516 if (radioService[slotId]->mRadioResponse != NULL) {
Amit Mahajan3da9ac02017-02-13 13:41:28 -08005517 RadioResponseInfo responseInfo = {};
Amit Mahajan5007ffa2017-01-31 17:14:42 -08005518 populateResponseInfo(responseInfo, serial, responseType, e);
5519 Return<void> retStatus = radioService[slotId]->mRadioResponse->
5520 reportStkServiceIsRunningResponse(responseInfo);
5521 radioService[slotId]->checkReturnStatus(retStatus);
5522 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005523 RLOGE("reportStkServiceIsRunningResponse: radioService[%d]->mRadioResponse == NULL",
Amit Mahajan5007ffa2017-01-31 17:14:42 -08005524 slotId);
5525 }
5526
5527 return 0;
5528}
5529
Amit Mahajan759786a2017-03-03 17:35:47 -08005530int radio::getCdmaSubscriptionSourceResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005531 int responseType, int serial, RIL_Errno e,
5532 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005533#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005534 RLOGD("getCdmaSubscriptionSourceResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005535#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005536
5537 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005538 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005539 int ret = responseInt(responseInfo, serial, responseType, e, response, responseLen);
5540 Return<void> retStatus
5541 = radioService[slotId]->mRadioResponse->getCdmaSubscriptionSourceResponse(
5542 responseInfo, (CdmaSubscriptionSource) ret);
5543 radioService[slotId]->checkReturnStatus(retStatus);
5544 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005545 RLOGE("getCdmaSubscriptionSourceResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005546 slotId);
5547 }
5548
5549 return 0;
5550}
5551
Amit Mahajan759786a2017-03-03 17:35:47 -08005552int radio::requestIsimAuthenticationResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005553 int responseType, int serial, RIL_Errno e,
5554 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005555#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005556 RLOGD("requestIsimAuthenticationResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005557#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005558
5559 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005560 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005561 populateResponseInfo(responseInfo, serial, responseType, e);
5562 Return<void> retStatus
5563 = radioService[slotId]->mRadioResponse->requestIsimAuthenticationResponse(
5564 responseInfo,
5565 convertCharPtrToHidlString((char *) response));
5566 radioService[slotId]->checkReturnStatus(retStatus);
5567 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005568 RLOGE("requestIsimAuthenticationResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005569 slotId);
5570 }
5571
5572 return 0;
5573}
5574
Amit Mahajan759786a2017-03-03 17:35:47 -08005575int radio::acknowledgeIncomingGsmSmsWithPduResponse(int slotId,
5576 int responseType,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005577 int serial, RIL_Errno e, void *response,
5578 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005579#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005580 RLOGD("acknowledgeIncomingGsmSmsWithPduResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005581#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005582
5583 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005584 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005585 populateResponseInfo(responseInfo, serial, responseType, e);
5586 Return<void> retStatus
5587 = radioService[slotId]->mRadioResponse->acknowledgeIncomingGsmSmsWithPduResponse(
5588 responseInfo);
5589 radioService[slotId]->checkReturnStatus(retStatus);
5590 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005591 RLOGE("acknowledgeIncomingGsmSmsWithPduResponse: radioService[%d]->mRadioResponse "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005592 "== NULL", slotId);
5593 }
5594
5595 return 0;
5596}
5597
Amit Mahajan759786a2017-03-03 17:35:47 -08005598int radio::sendEnvelopeWithStatusResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005599 int responseType, int serial, RIL_Errno e, void *response,
5600 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005601#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005602 RLOGD("sendEnvelopeWithStatusResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005603#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005604
5605 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005606 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005607 IccIoResult result = responseIccIo(responseInfo, serial, responseType, e,
5608 response, responseLen);
5609
5610 Return<void> retStatus
5611 = radioService[slotId]->mRadioResponse->sendEnvelopeWithStatusResponse(responseInfo,
5612 result);
5613 radioService[slotId]->checkReturnStatus(retStatus);
5614 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005615 RLOGE("sendEnvelopeWithStatusResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005616 slotId);
5617 }
5618
5619 return 0;
5620}
5621
Amit Mahajan759786a2017-03-03 17:35:47 -08005622int radio::getVoiceRadioTechnologyResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005623 int responseType, int serial, RIL_Errno e,
5624 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005625#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005626 RLOGD("getVoiceRadioTechnologyResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005627#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005628
5629 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005630 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005631 int ret = responseInt(responseInfo, serial, responseType, e, response, responseLen);
5632 Return<void> retStatus
5633 = radioService[slotId]->mRadioResponse->getVoiceRadioTechnologyResponse(
5634 responseInfo, (RadioTechnology) ret);
5635 radioService[slotId]->checkReturnStatus(retStatus);
5636 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005637 RLOGE("getVoiceRadioTechnologyResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005638 slotId);
5639 }
5640
5641 return 0;
5642}
5643
Amit Mahajan759786a2017-03-03 17:35:47 -08005644int radio::getCellInfoListResponse(int slotId,
5645 int responseType,
Amit Mahajan3df62912017-02-10 01:35:55 +00005646 int serial, RIL_Errno e, void *response,
5647 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005648#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005649 RLOGD("getCellInfoListResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005650#endif
Amit Mahajan3df62912017-02-10 01:35:55 +00005651
5652 if (radioService[slotId]->mRadioResponse != NULL) {
Amit Mahajan3da9ac02017-02-13 13:41:28 -08005653 RadioResponseInfo responseInfo = {};
Amit Mahajan3df62912017-02-10 01:35:55 +00005654 populateResponseInfo(responseInfo, serial, responseType, e);
5655
5656 hidl_vec<CellInfo> ret;
5657 if (response == NULL || responseLen % sizeof(RIL_CellInfo_v12) != 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005658 RLOGE("getCellInfoListResponse: Invalid response");
Amit Mahajan3df62912017-02-10 01:35:55 +00005659 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
5660 } else {
5661 convertRilCellInfoListToHal(response, responseLen, ret);
5662 }
5663
5664 Return<void> retStatus = radioService[slotId]->mRadioResponse->getCellInfoListResponse(
5665 responseInfo, ret);
5666 radioService[slotId]->checkReturnStatus(retStatus);
5667 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005668 RLOGE("getCellInfoListResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Amit Mahajan3df62912017-02-10 01:35:55 +00005669 }
5670
5671 return 0;
5672}
5673
Amit Mahajan759786a2017-03-03 17:35:47 -08005674int radio::setCellInfoListRateResponse(int slotId,
5675 int responseType,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005676 int serial, RIL_Errno e, void *response,
5677 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005678#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005679 RLOGD("setCellInfoListRateResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005680#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005681
5682 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005683 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005684 populateResponseInfo(responseInfo, serial, responseType, e);
5685 Return<void> retStatus
5686 = radioService[slotId]->mRadioResponse->setCellInfoListRateResponse(responseInfo);
5687 radioService[slotId]->checkReturnStatus(retStatus);
5688 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005689 RLOGE("setCellInfoListRateResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005690 slotId);
5691 }
5692
5693 return 0;
5694}
5695
Amit Mahajan759786a2017-03-03 17:35:47 -08005696int radio::setInitialAttachApnResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005697 int responseType, int serial, RIL_Errno e,
5698 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005699#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005700 RLOGD("setInitialAttachApnResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005701#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005702
5703 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005704 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005705 populateResponseInfo(responseInfo, serial, responseType, e);
5706 Return<void> retStatus
5707 = radioService[slotId]->mRadioResponse->setInitialAttachApnResponse(responseInfo);
5708 radioService[slotId]->checkReturnStatus(retStatus);
5709 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005710 RLOGE("setInitialAttachApnResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005711 slotId);
5712 }
5713
5714 return 0;
5715}
5716
Amit Mahajan759786a2017-03-03 17:35:47 -08005717int radio::getImsRegistrationStateResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005718 int responseType, int serial, RIL_Errno e,
5719 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005720#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005721 RLOGD("getImsRegistrationStateResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005722#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005723
5724 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005725 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005726 populateResponseInfo(responseInfo, serial, responseType, e);
5727 bool isRegistered = false;
5728 int ratFamily = 0;
5729 int numInts = responseLen / sizeof(int);
5730 if (response == NULL || numInts != 2) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005731 RLOGE("getImsRegistrationStateResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005732 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
5733 } else {
5734 int *pInt = (int *) response;
5735 isRegistered = pInt[0] == 1 ? true : false;
5736 ratFamily = pInt[1];
5737 }
5738 Return<void> retStatus
5739 = radioService[slotId]->mRadioResponse->getImsRegistrationStateResponse(
5740 responseInfo, isRegistered, (RadioTechnologyFamily) ratFamily);
5741 radioService[slotId]->checkReturnStatus(retStatus);
5742 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005743 RLOGE("getImsRegistrationStateResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005744 slotId);
5745 }
5746
5747 return 0;
5748}
5749
Amit Mahajan759786a2017-03-03 17:35:47 -08005750int radio::sendImsSmsResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005751 int responseType, int serial, RIL_Errno e, void *response,
5752 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005753#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005754 RLOGD("sendImsSmsResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005755#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005756
5757 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005758 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005759 SendSmsResult result = makeSendSmsResult(responseInfo, serial, responseType, e, response,
5760 responseLen);
5761
5762 Return<void> retStatus
5763 = radioService[slotId]->mRadioResponse->sendImsSmsResponse(responseInfo, result);
5764 radioService[slotId]->checkReturnStatus(retStatus);
5765 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005766 RLOGE("sendSmsResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005767 }
5768
5769 return 0;
5770}
5771
Amit Mahajan759786a2017-03-03 17:35:47 -08005772int radio::iccTransmitApduBasicChannelResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005773 int responseType, int serial, RIL_Errno e,
5774 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005775#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005776 RLOGD("iccTransmitApduBasicChannelResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005777#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005778
5779 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005780 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005781 IccIoResult result = responseIccIo(responseInfo, serial, responseType, e, response,
5782 responseLen);
5783
5784 Return<void> retStatus
5785 = radioService[slotId]->mRadioResponse->iccTransmitApduBasicChannelResponse(
5786 responseInfo, result);
5787 radioService[slotId]->checkReturnStatus(retStatus);
5788 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005789 RLOGE("iccTransmitApduBasicChannelResponse: radioService[%d]->mRadioResponse "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005790 "== NULL", slotId);
5791 }
5792
5793 return 0;
5794}
5795
Amit Mahajan759786a2017-03-03 17:35:47 -08005796int radio::iccOpenLogicalChannelResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005797 int responseType, int serial, RIL_Errno e, void *response,
5798 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005799#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005800 RLOGD("iccOpenLogicalChannelResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005801#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005802
5803 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005804 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005805 populateResponseInfo(responseInfo, serial, responseType, e);
5806 int channelId = -1;
5807 hidl_vec<int8_t> selectResponse;
5808 int numInts = responseLen / sizeof(int);
5809 if (response == NULL || responseLen % sizeof(int) != 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005810 RLOGE("iccOpenLogicalChannelResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005811 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
5812 } else {
5813 int *pInt = (int *) response;
5814 channelId = pInt[0];
5815 selectResponse.resize(numInts - 1);
5816 for (int i = 1; i < numInts; i++) {
5817 selectResponse[i - 1] = (int8_t) pInt[i];
5818 }
5819 }
5820 Return<void> retStatus
5821 = radioService[slotId]->mRadioResponse->iccOpenLogicalChannelResponse(responseInfo,
5822 channelId, selectResponse);
5823 radioService[slotId]->checkReturnStatus(retStatus);
5824 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005825 RLOGE("iccOpenLogicalChannelResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005826 slotId);
5827 }
5828
5829 return 0;
5830}
5831
Amit Mahajan759786a2017-03-03 17:35:47 -08005832int radio::iccCloseLogicalChannelResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005833 int responseType, int serial, RIL_Errno e,
5834 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005835#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005836 RLOGD("iccCloseLogicalChannelResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005837#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005838
5839 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005840 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005841 populateResponseInfo(responseInfo, serial, responseType, e);
5842 Return<void> retStatus
5843 = radioService[slotId]->mRadioResponse->iccCloseLogicalChannelResponse(
5844 responseInfo);
5845 radioService[slotId]->checkReturnStatus(retStatus);
5846 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005847 RLOGE("iccCloseLogicalChannelResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005848 slotId);
5849 }
5850
5851 return 0;
5852}
5853
Amit Mahajan759786a2017-03-03 17:35:47 -08005854int radio::iccTransmitApduLogicalChannelResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005855 int responseType, int serial, RIL_Errno e,
5856 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005857#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005858 RLOGD("iccTransmitApduLogicalChannelResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005859#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005860
5861 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005862 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005863 IccIoResult result = responseIccIo(responseInfo, serial, responseType, e, response,
5864 responseLen);
5865
5866 Return<void> retStatus
5867 = radioService[slotId]->mRadioResponse->iccTransmitApduLogicalChannelResponse(
5868 responseInfo, result);
5869 radioService[slotId]->checkReturnStatus(retStatus);
5870 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005871 RLOGE("iccTransmitApduLogicalChannelResponse: radioService[%d]->mRadioResponse "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005872 "== NULL", slotId);
5873 }
5874
5875 return 0;
5876}
5877
Amit Mahajan759786a2017-03-03 17:35:47 -08005878int radio::nvReadItemResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005879 int responseType, int serial, RIL_Errno e,
5880 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005881#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005882 RLOGD("nvReadItemResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005883#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005884
5885 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005886 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005887 populateResponseInfo(responseInfo, serial, responseType, e);
5888 Return<void> retStatus = radioService[slotId]->mRadioResponse->nvReadItemResponse(
5889 responseInfo,
5890 convertCharPtrToHidlString((char *) response));
5891 radioService[slotId]->checkReturnStatus(retStatus);
5892 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005893 RLOGE("nvReadItemResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005894 }
5895
5896 return 0;
5897}
5898
Amit Mahajan759786a2017-03-03 17:35:47 -08005899int radio::nvWriteItemResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005900 int responseType, int serial, RIL_Errno e,
5901 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005902#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005903 RLOGD("nvWriteItemResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005904#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005905
5906 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005907 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005908 populateResponseInfo(responseInfo, serial, responseType, e);
5909 Return<void> retStatus
5910 = radioService[slotId]->mRadioResponse->nvWriteItemResponse(responseInfo);
5911 radioService[slotId]->checkReturnStatus(retStatus);
5912 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005913 RLOGE("nvWriteItemResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005914 }
5915
5916 return 0;
5917}
5918
Amit Mahajan759786a2017-03-03 17:35:47 -08005919int radio::nvWriteCdmaPrlResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005920 int responseType, int serial, RIL_Errno e,
5921 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005922#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005923 RLOGD("nvWriteCdmaPrlResponse: 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 populateResponseInfo(responseInfo, serial, responseType, e);
5929 Return<void> retStatus
5930 = radioService[slotId]->mRadioResponse->nvWriteCdmaPrlResponse(responseInfo);
5931 radioService[slotId]->checkReturnStatus(retStatus);
5932 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005933 RLOGE("nvWriteCdmaPrlResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005934 }
5935
5936 return 0;
5937}
5938
Amit Mahajan759786a2017-03-03 17:35:47 -08005939int radio::nvResetConfigResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005940 int responseType, int serial, RIL_Errno e,
5941 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005942#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005943 RLOGD("nvResetConfigResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005944#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005945
5946 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005947 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005948 populateResponseInfo(responseInfo, serial, responseType, e);
5949 Return<void> retStatus
5950 = radioService[slotId]->mRadioResponse->nvResetConfigResponse(responseInfo);
5951 radioService[slotId]->checkReturnStatus(retStatus);
5952 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005953 RLOGE("nvResetConfigResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005954 }
5955
5956 return 0;
5957}
5958
Amit Mahajan759786a2017-03-03 17:35:47 -08005959int radio::setUiccSubscriptionResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005960 int responseType, int serial, RIL_Errno e,
5961 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005962#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005963 RLOGD("setUiccSubscriptionResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005964#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005965
5966 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005967 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005968 populateResponseInfo(responseInfo, serial, responseType, e);
5969 Return<void> retStatus
5970 = radioService[slotId]->mRadioResponse->setUiccSubscriptionResponse(responseInfo);
5971 radioService[slotId]->checkReturnStatus(retStatus);
5972 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005973 RLOGE("setUiccSubscriptionResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005974 slotId);
5975 }
5976
5977 return 0;
5978}
5979
Amit Mahajan759786a2017-03-03 17:35:47 -08005980int radio::setDataAllowedResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005981 int responseType, int serial, RIL_Errno e,
5982 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005983#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005984 RLOGD("setDataAllowedResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005985#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005986
5987 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005988 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005989 populateResponseInfo(responseInfo, serial, responseType, e);
5990 Return<void> retStatus
5991 = radioService[slotId]->mRadioResponse->setDataAllowedResponse(responseInfo);
5992 radioService[slotId]->checkReturnStatus(retStatus);
5993 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005994 RLOGE("setDataAllowedResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005995 }
5996
5997 return 0;
5998}
5999
Amit Mahajan759786a2017-03-03 17:35:47 -08006000int radio::getHardwareConfigResponse(int slotId,
Amit Mahajan3df62912017-02-10 01:35:55 +00006001 int responseType, int serial, RIL_Errno e,
6002 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006003#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006004 RLOGD("getHardwareConfigResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006005#endif
Amit Mahajan3df62912017-02-10 01:35:55 +00006006
6007 if (radioService[slotId]->mRadioResponse != NULL) {
Amit Mahajan3da9ac02017-02-13 13:41:28 -08006008 RadioResponseInfo responseInfo = {};
Amit Mahajan3df62912017-02-10 01:35:55 +00006009 populateResponseInfo(responseInfo, serial, responseType, e);
6010
6011 hidl_vec<HardwareConfig> result;
6012 if (response == NULL || responseLen % sizeof(RIL_HardwareConfig) != 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006013 RLOGE("hardwareConfigChangedInd: invalid response");
Amit Mahajan3df62912017-02-10 01:35:55 +00006014 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
6015 } else {
6016 convertRilHardwareConfigListToHal(response, responseLen, result);
6017 }
6018
6019 Return<void> retStatus = radioService[slotId]->mRadioResponse->getHardwareConfigResponse(
6020 responseInfo, result);
6021 radioService[slotId]->checkReturnStatus(retStatus);
6022 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006023 RLOGE("getHardwareConfigResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Amit Mahajan3df62912017-02-10 01:35:55 +00006024 }
6025
6026 return 0;
6027}
6028
Amit Mahajan759786a2017-03-03 17:35:47 -08006029int radio::requestIccSimAuthenticationResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006030 int responseType, int serial, RIL_Errno e,
6031 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006032#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006033 RLOGD("requestIccSimAuthenticationResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006034#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006035
6036 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08006037 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006038 IccIoResult result = responseIccIo(responseInfo, serial, responseType, e, response,
6039 responseLen);
6040
6041 Return<void> retStatus
6042 = radioService[slotId]->mRadioResponse->requestIccSimAuthenticationResponse(
6043 responseInfo, result);
6044 radioService[slotId]->checkReturnStatus(retStatus);
6045 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006046 RLOGE("requestIccSimAuthenticationResponse: radioService[%d]->mRadioResponse "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006047 "== NULL", slotId);
6048 }
6049
6050 return 0;
6051}
6052
Amit Mahajan759786a2017-03-03 17:35:47 -08006053int radio::setDataProfileResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006054 int responseType, int serial, RIL_Errno e,
6055 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006056#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006057 RLOGD("setDataProfileResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006058#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006059
6060 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08006061 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006062 populateResponseInfo(responseInfo, serial, responseType, e);
6063 Return<void> retStatus
6064 = radioService[slotId]->mRadioResponse->setDataProfileResponse(responseInfo);
6065 radioService[slotId]->checkReturnStatus(retStatus);
6066 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006067 RLOGE("setDataProfileResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006068 }
6069
6070 return 0;
6071}
6072
Amit Mahajan759786a2017-03-03 17:35:47 -08006073int radio::requestShutdownResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006074 int responseType, int serial, RIL_Errno e,
6075 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006076#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006077 RLOGD("requestShutdownResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006078#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006079
6080 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08006081 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006082 populateResponseInfo(responseInfo, serial, responseType, e);
6083 Return<void> retStatus
6084 = radioService[slotId]->mRadioResponse->requestShutdownResponse(responseInfo);
6085 radioService[slotId]->checkReturnStatus(retStatus);
6086 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006087 RLOGE("requestShutdownResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006088 }
6089
6090 return 0;
6091}
6092
Amit Mahajan3df62912017-02-10 01:35:55 +00006093void responseRadioCapability(RadioResponseInfo& responseInfo, int serial,
6094 int responseType, RIL_Errno e, void *response, size_t responseLen, RadioCapability& rc) {
6095 populateResponseInfo(responseInfo, serial, responseType, e);
6096
Amit Mahajan1fbff082017-02-24 11:24:39 -08006097 if (response == NULL || responseLen != sizeof(RIL_RadioCapability)) {
Amit Mahajan3df62912017-02-10 01:35:55 +00006098 RLOGE("responseRadioCapability: Invalid response");
6099 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
Amit Mahajan3da9ac02017-02-13 13:41:28 -08006100 rc.logicalModemUuid = hidl_string();
Amit Mahajan3df62912017-02-10 01:35:55 +00006101 } else {
6102 convertRilRadioCapabilityToHal(response, responseLen, rc);
6103 }
6104}
6105
Amit Mahajan759786a2017-03-03 17:35:47 -08006106int radio::getRadioCapabilityResponse(int slotId,
Amit Mahajan3df62912017-02-10 01:35:55 +00006107 int responseType, int serial, RIL_Errno e,
6108 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006109#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006110 RLOGD("getRadioCapabilityResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006111#endif
Amit Mahajan3df62912017-02-10 01:35:55 +00006112
6113 if (radioService[slotId]->mRadioResponse != NULL) {
Amit Mahajan3da9ac02017-02-13 13:41:28 -08006114 RadioResponseInfo responseInfo = {};
6115 RadioCapability result = {};
Amit Mahajan3df62912017-02-10 01:35:55 +00006116 responseRadioCapability(responseInfo, serial, responseType, e, response, responseLen,
6117 result);
6118 Return<void> retStatus = radioService[slotId]->mRadioResponse->getRadioCapabilityResponse(
6119 responseInfo, result);
6120 radioService[slotId]->checkReturnStatus(retStatus);
6121 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006122 RLOGE("getRadioCapabilityResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Amit Mahajan3df62912017-02-10 01:35:55 +00006123 }
6124
6125 return 0;
6126}
6127
Amit Mahajan759786a2017-03-03 17:35:47 -08006128int radio::setRadioCapabilityResponse(int slotId,
Amit Mahajan3df62912017-02-10 01:35:55 +00006129 int responseType, int serial, RIL_Errno e,
6130 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006131#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006132 RLOGD("setRadioCapabilityResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006133#endif
Amit Mahajan3df62912017-02-10 01:35:55 +00006134
6135 if (radioService[slotId]->mRadioResponse != NULL) {
Amit Mahajan3da9ac02017-02-13 13:41:28 -08006136 RadioResponseInfo responseInfo = {};
6137 RadioCapability result = {};
Amit Mahajan3df62912017-02-10 01:35:55 +00006138 responseRadioCapability(responseInfo, serial, responseType, e, response, responseLen,
6139 result);
6140 Return<void> retStatus = radioService[slotId]->mRadioResponse->setRadioCapabilityResponse(
6141 responseInfo, result);
6142 radioService[slotId]->checkReturnStatus(retStatus);
6143 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006144 RLOGE("setRadioCapabilityResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Amit Mahajan3df62912017-02-10 01:35:55 +00006145 }
6146
6147 return 0;
6148}
6149
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006150LceStatusInfo responseLceStatusInfo(RadioResponseInfo& responseInfo, int serial, int responseType,
6151 RIL_Errno e, void *response, size_t responseLen) {
6152 populateResponseInfo(responseInfo, serial, responseType, e);
Jack Yuf68e0da2017-02-07 14:53:09 -08006153 LceStatusInfo result = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006154
6155 if (response == NULL || responseLen != sizeof(RIL_LceStatusInfo)) {
6156 RLOGE("Invalid response: NULL");
6157 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006158 } else {
6159 RIL_LceStatusInfo *resp = (RIL_LceStatusInfo *) response;
6160 result.lceStatus = (LceStatus) resp->lce_status;
6161 result.actualIntervalMs = (uint8_t) resp->actual_interval_ms;
6162 }
6163 return result;
6164}
6165
Amit Mahajan759786a2017-03-03 17:35:47 -08006166int radio::startLceServiceResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006167 int responseType, int serial, RIL_Errno e,
6168 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006169#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006170 RLOGD("startLceServiceResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006171#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006172
6173 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08006174 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006175 LceStatusInfo result = responseLceStatusInfo(responseInfo, serial, responseType, e,
6176 response, responseLen);
6177
6178 Return<void> retStatus
6179 = radioService[slotId]->mRadioResponse->startLceServiceResponse(responseInfo,
6180 result);
6181 radioService[slotId]->checkReturnStatus(retStatus);
6182 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006183 RLOGE("startLceServiceResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006184 }
6185
6186 return 0;
6187}
6188
Amit Mahajan759786a2017-03-03 17:35:47 -08006189int radio::stopLceServiceResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006190 int responseType, int serial, RIL_Errno e,
6191 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006192#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006193 RLOGD("stopLceServiceResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006194#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006195
6196 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08006197 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006198 LceStatusInfo result = responseLceStatusInfo(responseInfo, serial, responseType, e,
6199 response, responseLen);
6200
6201 Return<void> retStatus
6202 = radioService[slotId]->mRadioResponse->stopLceServiceResponse(responseInfo,
6203 result);
6204 radioService[slotId]->checkReturnStatus(retStatus);
6205 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006206 RLOGE("stopLceServiceResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006207 }
6208
6209 return 0;
6210}
6211
Amit Mahajan759786a2017-03-03 17:35:47 -08006212int radio::pullLceDataResponse(int slotId,
Amit Mahajan3df62912017-02-10 01:35:55 +00006213 int responseType, int serial, RIL_Errno e,
6214 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006215#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006216 RLOGD("pullLceDataResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006217#endif
Amit Mahajan3df62912017-02-10 01:35:55 +00006218
6219 if (radioService[slotId]->mRadioResponse != NULL) {
Amit Mahajan3da9ac02017-02-13 13:41:28 -08006220 RadioResponseInfo responseInfo = {};
Amit Mahajan3df62912017-02-10 01:35:55 +00006221 populateResponseInfo(responseInfo, serial, responseType, e);
6222
Amit Mahajan3da9ac02017-02-13 13:41:28 -08006223 LceDataInfo result = {};
Amit Mahajan3df62912017-02-10 01:35:55 +00006224 if (response == NULL || responseLen != sizeof(RIL_LceDataInfo)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006225 RLOGE("pullLceDataResponse: Invalid response");
Amit Mahajan3df62912017-02-10 01:35:55 +00006226 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
Amit Mahajan3df62912017-02-10 01:35:55 +00006227 } else {
6228 convertRilLceDataInfoToHal(response, responseLen, result);
6229 }
6230
6231 Return<void> retStatus = radioService[slotId]->mRadioResponse->pullLceDataResponse(
6232 responseInfo, result);
6233 radioService[slotId]->checkReturnStatus(retStatus);
6234 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006235 RLOGE("pullLceDataResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Amit Mahajan3df62912017-02-10 01:35:55 +00006236 }
6237
6238 return 0;
6239}
6240
Amit Mahajan759786a2017-03-03 17:35:47 -08006241int radio::getModemActivityInfoResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006242 int responseType, int serial, RIL_Errno e,
6243 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006244#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006245 RLOGD("getModemActivityInfoResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006246#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006247
6248 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08006249 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006250 populateResponseInfo(responseInfo, serial, responseType, e);
6251 ActivityStatsInfo info;
6252 if (response == NULL || responseLen != sizeof(RIL_ActivityStatsInfo)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006253 RLOGE("getModemActivityInfoResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006254 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006255 } else {
6256 RIL_ActivityStatsInfo *resp = (RIL_ActivityStatsInfo *)response;
6257 info.sleepModeTimeMs = resp->sleep_mode_time_ms;
6258 info.idleModeTimeMs = resp->idle_mode_time_ms;
6259 for(int i = 0; i < RIL_NUM_TX_POWER_LEVELS; i++) {
6260 info.txmModetimeMs[i] = resp->tx_mode_time_ms[i];
6261 }
6262 info.rxModeTimeMs = resp->rx_mode_time_ms;
6263 }
6264
6265 Return<void> retStatus
6266 = radioService[slotId]->mRadioResponse->getModemActivityInfoResponse(responseInfo,
6267 info);
6268 radioService[slotId]->checkReturnStatus(retStatus);
6269 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006270 RLOGE("getModemActivityInfoResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006271 slotId);
6272 }
6273
6274 return 0;
6275}
6276
Amit Mahajan759786a2017-03-03 17:35:47 -08006277int radio::setAllowedCarriersResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006278 int responseType, int serial, RIL_Errno e,
6279 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006280#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006281 RLOGD("setAllowedCarriersResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006282#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006283
6284 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08006285 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006286 int ret = responseInt(responseInfo, serial, responseType, e, response, responseLen);
6287 Return<void> retStatus
6288 = radioService[slotId]->mRadioResponse->setAllowedCarriersResponse(responseInfo,
6289 ret);
6290 radioService[slotId]->checkReturnStatus(retStatus);
6291 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006292 RLOGE("setAllowedCarriersResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006293 slotId);
6294 }
6295
6296 return 0;
6297}
6298
Amit Mahajan759786a2017-03-03 17:35:47 -08006299int radio::getAllowedCarriersResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006300 int responseType, int serial, RIL_Errno e,
6301 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006302#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006303 RLOGD("getAllowedCarriersResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006304#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006305
6306 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08006307 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006308 populateResponseInfo(responseInfo, serial, responseType, e);
Jack Yuf68e0da2017-02-07 14:53:09 -08006309 CarrierRestrictions carrierInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006310 bool allAllowed = true;
Jayachandran C70f7d2e2017-04-28 00:57:13 -07006311 if (response == NULL) {
6312#if VDBG
6313 RLOGD("getAllowedCarriersResponse response is NULL: all allowed");
6314#endif
6315 carrierInfo.allowedCarriers.resize(0);
6316 carrierInfo.excludedCarriers.resize(0);
6317 } else if (responseLen != sizeof(RIL_CarrierRestrictions)) {
6318 RLOGE("getAllowedCarriersResponse Invalid response");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006319 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
6320 } else {
6321 RIL_CarrierRestrictions *pCr = (RIL_CarrierRestrictions *)response;
6322 if (pCr->len_allowed_carriers > 0 || pCr->len_excluded_carriers > 0) {
6323 allAllowed = false;
6324 }
6325
6326 carrierInfo.allowedCarriers.resize(pCr->len_allowed_carriers);
6327 for(int i = 0; i < pCr->len_allowed_carriers; i++) {
6328 RIL_Carrier *carrier = pCr->allowed_carriers + i;
6329 carrierInfo.allowedCarriers[i].mcc = convertCharPtrToHidlString(carrier->mcc);
6330 carrierInfo.allowedCarriers[i].mnc = convertCharPtrToHidlString(carrier->mnc);
6331 carrierInfo.allowedCarriers[i].matchType = (CarrierMatchType) carrier->match_type;
6332 carrierInfo.allowedCarriers[i].matchData =
6333 convertCharPtrToHidlString(carrier->match_data);
6334 }
6335
6336 carrierInfo.excludedCarriers.resize(pCr->len_excluded_carriers);
6337 for(int i = 0; i < pCr->len_excluded_carriers; i++) {
6338 RIL_Carrier *carrier = pCr->excluded_carriers + i;
6339 carrierInfo.excludedCarriers[i].mcc = convertCharPtrToHidlString(carrier->mcc);
6340 carrierInfo.excludedCarriers[i].mnc = convertCharPtrToHidlString(carrier->mnc);
6341 carrierInfo.excludedCarriers[i].matchType = (CarrierMatchType) carrier->match_type;
6342 carrierInfo.excludedCarriers[i].matchData =
6343 convertCharPtrToHidlString(carrier->match_data);
6344 }
6345 }
6346
6347 Return<void> retStatus
6348 = radioService[slotId]->mRadioResponse->getAllowedCarriersResponse(responseInfo,
6349 allAllowed, carrierInfo);
6350 radioService[slotId]->checkReturnStatus(retStatus);
6351 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006352 RLOGE("getAllowedCarriersResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006353 slotId);
6354 }
6355
6356 return 0;
6357}
6358
Amit Mahajan759786a2017-03-03 17:35:47 -08006359int radio::sendDeviceStateResponse(int slotId,
Jack Yu11ab4042017-02-21 17:08:01 -08006360 int responseType, int serial, RIL_Errno e,
6361 void *response, size_t responselen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006362#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006363 RLOGD("sendDeviceStateResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006364#endif
Jack Yu11ab4042017-02-21 17:08:01 -08006365
6366 if (radioService[slotId]->mRadioResponse != NULL) {
6367 RadioResponseInfo responseInfo = {};
6368 populateResponseInfo(responseInfo, serial, responseType, e);
6369 Return<void> retStatus
6370 = radioService[slotId]->mRadioResponse->sendDeviceStateResponse(responseInfo);
6371 radioService[slotId]->checkReturnStatus(retStatus);
6372 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006373 RLOGE("sendDeviceStateResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Jack Yu11ab4042017-02-21 17:08:01 -08006374 }
6375
6376 return 0;
6377}
6378
pkanwarc61837e2017-03-17 12:49:34 -07006379int radio::setCarrierInfoForImsiEncryptionResponse(int slotId,
6380 int responseType, int serial, RIL_Errno e,
6381 void *response, size_t responseLen) {
6382 RLOGD("setCarrierInfoForImsiEncryptionResponse: serial %d", serial);
6383 if (radioService[slotId]->mRadioResponse != NULL) {
6384 RadioResponseInfo responseInfo = {};
6385 populateResponseInfo(responseInfo, serial, responseType, e);
6386 Return<sp<::android::hardware::radio::V1_1::IRadioResponse>> ret =
6387 ::android::hardware::radio::V1_1::IRadioResponse::castFrom(
6388 radioService[slotId]->mRadioResponse);
6389 if (ret.isOk()) {
6390 sp<::android::hardware::radio::V1_1::IRadioResponse> radioResponseV1_1 = ret;
6391 Return<void> retStatus
6392 = radioResponseV1_1->setCarrierInfoForImsiEncryptionResponse(responseInfo);
6393 radioService[slotId]->checkReturnStatus(retStatus);
6394 } else {
6395 RLOGE("setCarrierInfoForImsiEncryptionResponse: ret.isOk() == false for "
6396 "radioService[%d]" , slotId);
6397 }
6398 } else {
6399 RLOGE("setCarrierInfoForImsiEncryptionResponse: radioService[%d]->mRadioResponse == NULL",
6400 slotId);
6401 }
6402 return 0;
6403}
6404
Amit Mahajan759786a2017-03-03 17:35:47 -08006405int radio::setIndicationFilterResponse(int slotId,
Jack Yu11ab4042017-02-21 17:08:01 -08006406 int responseType, int serial, RIL_Errno e,
6407 void *response, size_t responselen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006408#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006409 RLOGD("setIndicationFilterResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006410#endif
Jack Yu11ab4042017-02-21 17:08:01 -08006411
6412 if (radioService[slotId]->mRadioResponse != NULL) {
6413 RadioResponseInfo responseInfo = {};
6414 populateResponseInfo(responseInfo, serial, responseType, e);
6415 Return<void> retStatus
6416 = radioService[slotId]->mRadioResponse->setIndicationFilterResponse(responseInfo);
6417 radioService[slotId]->checkReturnStatus(retStatus);
6418 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006419 RLOGE("setIndicationFilterResponse: radioService[%d]->mRadioResponse == NULL",
Jack Yu11ab4042017-02-21 17:08:01 -08006420 slotId);
6421 }
6422
6423 return 0;
6424}
6425
Amit Mahajan759786a2017-03-03 17:35:47 -08006426int radio::setSimCardPowerResponse(int slotId,
Wileen Chiu718c0bf2017-01-04 11:37:19 -08006427 int responseType, int serial, RIL_Errno e,
6428 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006429#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006430 RLOGD("setSimCardPowerResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006431#endif
Wileen Chiu718c0bf2017-01-04 11:37:19 -08006432
6433 if (radioService[slotId]->mRadioResponse != NULL) {
6434 RadioResponseInfo responseInfo = {};
6435 populateResponseInfo(responseInfo, serial, responseType, e);
Grace Chen797c1c22017-03-23 18:39:48 -07006436 Return<sp<::android::hardware::radio::V1_1::IRadioResponse>> ret =
6437 ::android::hardware::radio::V1_1::IRadioResponse::castFrom(
6438 radioService[slotId]->mRadioResponse);
6439 if (ret.isOk()) {
6440 sp<::android::hardware::radio::V1_1::IRadioResponse> radioResponseV1_1 = ret;
6441 Return<void> retStatus
6442 = radioResponseV1_1->setSimCardPowerResponse_1_1(responseInfo);
6443 radioService[slotId]->checkReturnStatus(retStatus);
6444 } else {
6445 RLOGD("setSimCardPowerResponse: ret.isOK() == false for radioService[%d]",
6446 slotId);
6447 Return<void> retStatus
6448 = radioService[slotId]->mRadioResponse->setSimCardPowerResponse(responseInfo);
6449 radioService[slotId]->checkReturnStatus(retStatus);
6450 }
Wileen Chiu718c0bf2017-01-04 11:37:19 -08006451 } else {
Grace Chen797c1c22017-03-23 18:39:48 -07006452 RLOGE("setSimCardPowerResponse: radioService[%d]->mRadioResponse == NULL",
6453 slotId);
Wileen Chiu718c0bf2017-01-04 11:37:19 -08006454 }
Wileen Chiu718c0bf2017-01-04 11:37:19 -08006455 return 0;
6456}
6457
yinxu8688abd2017-05-22 11:26:45 -07006458int radio::startNetworkScanResponse(int slotId, int responseType, int serial, RIL_Errno e,
6459 void *response, size_t responseLen) {
6460#if VDBG
6461 RLOGD("startNetworkScanResponse: serial %d", serial);
6462#endif
6463
6464 if (radioService[slotId]->mRadioResponse != NULL) {
6465 RadioResponseInfo responseInfo = {};
6466 populateResponseInfo(responseInfo, serial, responseType, e);
6467 Return<sp<::android::hardware::radio::V1_1::IRadioResponse>> ret =
6468 ::android::hardware::radio::V1_1::IRadioResponse::castFrom(
6469 radioService[slotId]->mRadioResponse);
6470 if (ret.isOk()) {
6471 sp<::android::hardware::radio::V1_1::IRadioResponse> radioResponseV1_1 = ret;
6472 Return<void> retStatus = radioResponseV1_1->startNetworkScanResponse(responseInfo);
6473 radioService[slotId]->checkReturnStatus(retStatus);
6474 } else {
6475 RLOGD("startNetworkScanResponse: ret.isOK() == false for radioService[%d]", slotId);
6476 }
6477 } else {
6478 RLOGE("startNetworkScanResponse: radioService[%d]->mRadioResponse == NULL", slotId);
6479 }
6480
6481 return 0;
6482}
6483
6484int radio::stopNetworkScanResponse(int slotId, int responseType, int serial, RIL_Errno e,
6485 void *response, size_t responseLen) {
6486#if VDBG
6487 RLOGD("stopNetworkScanResponse: serial %d", serial);
6488#endif
6489
6490 if (radioService[slotId]->mRadioResponse != NULL) {
6491 RadioResponseInfo responseInfo = {};
6492 populateResponseInfo(responseInfo, serial, responseType, e);
6493 Return<sp<::android::hardware::radio::V1_1::IRadioResponse>> ret =
6494 ::android::hardware::radio::V1_1::IRadioResponse::castFrom(
6495 radioService[slotId]->mRadioResponse);
6496 if (ret.isOk()) {
6497 sp<::android::hardware::radio::V1_1::IRadioResponse> radioResponseV1_1 = ret;
6498 Return<void> retStatus = radioResponseV1_1->stopNetworkScanResponse(responseInfo);
6499 radioService[slotId]->checkReturnStatus(retStatus);
6500 } else {
6501 RLOGD("stopNetworkScanResponse: ret.isOK() == false for radioService[%d]", slotId);
6502 }
6503 } else {
6504 RLOGE("stopNetworkScanResponse: radioService[%d]->mRadioResponse == NULL", slotId);
6505 }
6506
6507 return 0;
6508}
6509
Amit Mahajan759786a2017-03-03 17:35:47 -08006510int radio::sendRequestRawResponse(int slotId,
Amit Mahajan439da362017-02-13 17:43:04 -08006511 int responseType, int serial, RIL_Errno e,
6512 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006513#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006514 RLOGD("sendRequestRawResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006515#endif
Amit Mahajan439da362017-02-13 17:43:04 -08006516
6517 if (oemHookService[slotId]->mOemHookResponse != NULL) {
6518 RadioResponseInfo responseInfo = {};
6519 populateResponseInfo(responseInfo, serial, responseType, e);
6520 hidl_vec<uint8_t> data;
6521
6522 if (response == NULL) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006523 RLOGE("sendRequestRawResponse: Invalid response");
Amit Mahajan439da362017-02-13 17:43:04 -08006524 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
6525 } else {
6526 data.setToExternal((uint8_t *) response, responseLen);
6527 }
6528 Return<void> retStatus = oemHookService[slotId]->mOemHookResponse->
6529 sendRequestRawResponse(responseInfo, data);
Amit Mahajand423d192017-03-16 17:04:01 -07006530 checkReturnStatus(slotId, retStatus, false);
Amit Mahajan439da362017-02-13 17:43:04 -08006531 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006532 RLOGE("sendRequestRawResponse: oemHookService[%d]->mOemHookResponse == NULL",
Amit Mahajan439da362017-02-13 17:43:04 -08006533 slotId);
6534 }
6535
6536 return 0;
6537}
6538
Amit Mahajan759786a2017-03-03 17:35:47 -08006539int radio::sendRequestStringsResponse(int slotId,
Amit Mahajan439da362017-02-13 17:43:04 -08006540 int responseType, int serial, RIL_Errno e,
6541 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006542#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006543 RLOGD("sendRequestStringsResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006544#endif
Amit Mahajan439da362017-02-13 17:43:04 -08006545
6546 if (oemHookService[slotId]->mOemHookResponse != NULL) {
6547 RadioResponseInfo responseInfo = {};
6548 populateResponseInfo(responseInfo, serial, responseType, e);
6549 hidl_vec<hidl_string> data;
6550
6551 if (response == NULL || responseLen % sizeof(char *) != 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006552 RLOGE("sendRequestStringsResponse Invalid response: NULL");
Amit Mahajan439da362017-02-13 17:43:04 -08006553 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
6554 } else {
6555 char **resp = (char **) response;
6556 int numStrings = responseLen / sizeof(char *);
6557 data.resize(numStrings);
6558 for (int i = 0; i < numStrings; i++) {
6559 data[i] = convertCharPtrToHidlString(resp[i]);
6560 }
6561 }
6562 Return<void> retStatus
6563 = oemHookService[slotId]->mOemHookResponse->sendRequestStringsResponse(
6564 responseInfo, data);
Amit Mahajand423d192017-03-16 17:04:01 -07006565 checkReturnStatus(slotId, retStatus, false);
Amit Mahajan439da362017-02-13 17:43:04 -08006566 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006567 RLOGE("sendRequestStringsResponse: oemHookService[%d]->mOemHookResponse == "
Amit Mahajan439da362017-02-13 17:43:04 -08006568 "NULL", slotId);
6569 }
6570
6571 return 0;
6572}
6573
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006574// Radio Indication functions
6575
Amit Mahajan5829a472016-12-28 17:28:07 -08006576RadioIndicationType convertIntToRadioIndicationType(int indicationType) {
6577 return indicationType == RESPONSE_UNSOLICITED ? (RadioIndicationType::UNSOLICITED) :
6578 (RadioIndicationType::UNSOLICITED_ACK_EXP);
6579}
6580
Amit Mahajan759786a2017-03-03 17:35:47 -08006581int radio::radioStateChangedInd(int slotId,
Amit Mahajan1f652692017-03-01 12:08:46 -08006582 int indicationType, int token, RIL_Errno e, void *response,
6583 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08006584 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan1f652692017-03-01 12:08:46 -08006585 RadioState radioState = (RadioState) s_vendorFunctions->onStateRequest();
Amit Mahajan111ddca2017-03-03 12:05:13 -08006586 RLOGD("radioStateChangedInd: radioState %d", radioState);
Amit Mahajan17249842017-01-19 15:05:45 -08006587 Return<void> retStatus = radioService[slotId]->mRadioIndication->radioStateChanged(
Amit Mahajan1f652692017-03-01 12:08:46 -08006588 convertIntToRadioIndicationType(indicationType), radioState);
Amit Mahajan17249842017-01-19 15:05:45 -08006589 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajancd77a5b2016-08-25 11:19:21 -07006590 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006591 RLOGE("radioStateChangedInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajancd77a5b2016-08-25 11:19:21 -07006592 }
Amit Mahajan1f652692017-03-01 12:08:46 -08006593
6594 return 0;
Amit Mahajancd77a5b2016-08-25 11:19:21 -07006595}
6596
Amit Mahajan759786a2017-03-03 17:35:47 -08006597int radio::callStateChangedInd(int slotId,
Amit Mahajan5829a472016-12-28 17:28:07 -08006598 int indicationType, int token, RIL_Errno e, void *response,
6599 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08006600 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006601#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006602 RLOGD("callStateChangedInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07006603#endif
Amit Mahajan17249842017-01-19 15:05:45 -08006604 Return<void> retStatus = radioService[slotId]->mRadioIndication->callStateChanged(
Amit Mahajan5829a472016-12-28 17:28:07 -08006605 convertIntToRadioIndicationType(indicationType));
Amit Mahajan17249842017-01-19 15:05:45 -08006606 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08006607 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006608 RLOGE("callStateChangedInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08006609 }
6610
6611 return 0;
6612}
6613
Amit Mahajan759786a2017-03-03 17:35:47 -08006614int radio::networkStateChangedInd(int slotId,
Amit Mahajan1f652692017-03-01 12:08:46 -08006615 int indicationType, int token, RIL_Errno e, void *response,
6616 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08006617 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006618#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006619 RLOGD("networkStateChangedInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07006620#endif
Jack Yu06181bb2017-01-10 12:10:41 -08006621 Return<void> retStatus = radioService[slotId]->mRadioIndication->networkStateChanged(
Amit Mahajan5829a472016-12-28 17:28:07 -08006622 convertIntToRadioIndicationType(indicationType));
Amit Mahajan17249842017-01-19 15:05:45 -08006623 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08006624 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006625 RLOGE("networkStateChangedInd: radioService[%d]->mRadioIndication == NULL",
Amit Mahajan2fa9e632017-01-06 16:55:33 -08006626 slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08006627 }
6628
6629 return 0;
6630}
6631
6632uint8_t hexCharToInt(uint8_t c) {
6633 if (c >= '0' && c <= '9') return (c - '0');
6634 if (c >= 'A' && c <= 'F') return (c - 'A' + 10);
6635 if (c >= 'a' && c <= 'f') return (c - 'a' + 10);
6636
6637 return INVALID_HEX_CHAR;
6638}
6639
6640uint8_t * convertHexStringToBytes(void *response, size_t responseLen) {
6641 if (responseLen % 2 != 0) {
6642 return NULL;
6643 }
6644
6645 uint8_t *bytes = (uint8_t *)calloc(responseLen/2, sizeof(uint8_t));
6646 if (bytes == NULL) {
6647 RLOGE("convertHexStringToBytes: cannot allocate memory for bytes string");
6648 return NULL;
6649 }
6650 uint8_t *hexString = (uint8_t *)response;
6651
Wei Wang100ac9b2017-02-03 14:18:07 -08006652 for (size_t i = 0; i < responseLen; i += 2) {
Amit Mahajan5829a472016-12-28 17:28:07 -08006653 uint8_t hexChar1 = hexCharToInt(hexString[i]);
6654 uint8_t hexChar2 = hexCharToInt(hexString[i + 1]);
6655
6656 if (hexChar1 == INVALID_HEX_CHAR || hexChar2 == INVALID_HEX_CHAR) {
6657 RLOGE("convertHexStringToBytes: invalid hex char %d %d",
6658 hexString[i], hexString[i + 1]);
6659 free(bytes);
6660 return NULL;
6661 }
6662 bytes[i/2] = ((hexChar1 << 4) | hexChar2);
6663 }
6664
6665 return bytes;
6666}
6667
Amit Mahajan759786a2017-03-03 17:35:47 -08006668int radio::newSmsInd(int slotId, int indicationType,
Amit Mahajan5829a472016-12-28 17:28:07 -08006669 int token, RIL_Errno e, void *response, size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08006670 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan5829a472016-12-28 17:28:07 -08006671 if (response == NULL || responseLen == 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006672 RLOGE("newSmsInd: invalid response");
Amit Mahajan5829a472016-12-28 17:28:07 -08006673 return 0;
6674 }
6675
6676 uint8_t *bytes = convertHexStringToBytes(response, responseLen);
6677 if (bytes == NULL) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006678 RLOGE("newSmsInd: convertHexStringToBytes failed");
Amit Mahajan5829a472016-12-28 17:28:07 -08006679 return 0;
6680 }
6681
6682 hidl_vec<uint8_t> pdu;
6683 pdu.setToExternal(bytes, responseLen/2);
Jayachandran C572f2f42017-03-25 14:30:13 -07006684#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006685 RLOGD("newSmsInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07006686#endif
Amit Mahajan17249842017-01-19 15:05:45 -08006687 Return<void> retStatus = radioService[slotId]->mRadioIndication->newSms(
Amit Mahajan5829a472016-12-28 17:28:07 -08006688 convertIntToRadioIndicationType(indicationType), pdu);
Amit Mahajan17249842017-01-19 15:05:45 -08006689 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08006690 free(bytes);
6691 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006692 RLOGE("newSmsInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08006693 }
6694
6695 return 0;
6696}
6697
Amit Mahajan759786a2017-03-03 17:35:47 -08006698int radio::newSmsStatusReportInd(int slotId,
Amit Mahajan5829a472016-12-28 17:28:07 -08006699 int indicationType, int token, RIL_Errno e, void *response,
6700 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08006701 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan5829a472016-12-28 17:28:07 -08006702 if (response == NULL || responseLen == 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006703 RLOGE("newSmsStatusReportInd: invalid response");
Amit Mahajan5829a472016-12-28 17:28:07 -08006704 return 0;
6705 }
6706
6707 uint8_t *bytes = convertHexStringToBytes(response, responseLen);
6708 if (bytes == NULL) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006709 RLOGE("newSmsStatusReportInd: convertHexStringToBytes failed");
Amit Mahajan5829a472016-12-28 17:28:07 -08006710 return 0;
6711 }
6712
6713 hidl_vec<uint8_t> pdu;
6714 pdu.setToExternal(bytes, responseLen/2);
Jayachandran C572f2f42017-03-25 14:30:13 -07006715#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006716 RLOGD("newSmsStatusReportInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07006717#endif
Amit Mahajan17249842017-01-19 15:05:45 -08006718 Return<void> retStatus = radioService[slotId]->mRadioIndication->newSmsStatusReport(
Amit Mahajan5829a472016-12-28 17:28:07 -08006719 convertIntToRadioIndicationType(indicationType), pdu);
Amit Mahajan17249842017-01-19 15:05:45 -08006720 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08006721 free(bytes);
6722 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006723 RLOGE("newSmsStatusReportInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08006724 }
6725
6726 return 0;
6727}
6728
Amit Mahajan759786a2017-03-03 17:35:47 -08006729int radio::newSmsOnSimInd(int slotId, int indicationType,
Amit Mahajan5829a472016-12-28 17:28:07 -08006730 int token, RIL_Errno e, void *response, size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08006731 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan5829a472016-12-28 17:28:07 -08006732 if (response == NULL || responseLen != sizeof(int)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006733 RLOGE("newSmsOnSimInd: invalid response");
Amit Mahajan5829a472016-12-28 17:28:07 -08006734 return 0;
6735 }
6736 int32_t recordNumber = ((int32_t *) response)[0];
Jayachandran C572f2f42017-03-25 14:30:13 -07006737#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006738 RLOGD("newSmsOnSimInd: slotIndex %d", recordNumber);
Jayachandran C572f2f42017-03-25 14:30:13 -07006739#endif
Amit Mahajan17249842017-01-19 15:05:45 -08006740 Return<void> retStatus = radioService[slotId]->mRadioIndication->newSmsOnSim(
Amit Mahajan5829a472016-12-28 17:28:07 -08006741 convertIntToRadioIndicationType(indicationType), recordNumber);
Amit Mahajan17249842017-01-19 15:05:45 -08006742 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08006743 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006744 RLOGE("newSmsOnSimInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08006745 }
6746
6747 return 0;
6748}
6749
Amit Mahajan759786a2017-03-03 17:35:47 -08006750int radio::onUssdInd(int slotId, int indicationType,
Amit Mahajan5829a472016-12-28 17:28:07 -08006751 int token, RIL_Errno e, void *response, size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08006752 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan5829a472016-12-28 17:28:07 -08006753 if (response == NULL || responseLen != 2 * sizeof(char *)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006754 RLOGE("onUssdInd: invalid response");
Amit Mahajan5829a472016-12-28 17:28:07 -08006755 return 0;
6756 }
6757 char **strings = (char **) response;
6758 char *mode = strings[0];
6759 hidl_string msg = convertCharPtrToHidlString(strings[1]);
6760 UssdModeType modeType = (UssdModeType) atoi(mode);
Jayachandran C572f2f42017-03-25 14:30:13 -07006761#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006762 RLOGD("onUssdInd: mode %s", mode);
Jayachandran C572f2f42017-03-25 14:30:13 -07006763#endif
Amit Mahajan17249842017-01-19 15:05:45 -08006764 Return<void> retStatus = radioService[slotId]->mRadioIndication->onUssd(
Amit Mahajan5829a472016-12-28 17:28:07 -08006765 convertIntToRadioIndicationType(indicationType), modeType, msg);
Amit Mahajan17249842017-01-19 15:05:45 -08006766 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08006767 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006768 RLOGE("onUssdInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08006769 }
6770
6771 return 0;
6772}
6773
Amit Mahajan759786a2017-03-03 17:35:47 -08006774int radio::nitzTimeReceivedInd(int slotId,
Amit Mahajan5829a472016-12-28 17:28:07 -08006775 int indicationType, int token, RIL_Errno e, void *response,
6776 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08006777 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan5829a472016-12-28 17:28:07 -08006778 if (response == NULL || responseLen == 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006779 RLOGE("nitzTimeReceivedInd: invalid response");
Amit Mahajan5829a472016-12-28 17:28:07 -08006780 return 0;
6781 }
6782 hidl_string nitzTime = convertCharPtrToHidlString((char *) response);
6783 int64_t timeReceived = android::elapsedRealtime();
Jayachandran C572f2f42017-03-25 14:30:13 -07006784#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006785 RLOGD("nitzTimeReceivedInd: nitzTime %s receivedTime %" PRId64, nitzTime.c_str(),
Amit Mahajan2fa9e632017-01-06 16:55:33 -08006786 timeReceived);
Jayachandran C572f2f42017-03-25 14:30:13 -07006787#endif
Amit Mahajan17249842017-01-19 15:05:45 -08006788 Return<void> retStatus = radioService[slotId]->mRadioIndication->nitzTimeReceived(
Amit Mahajan5829a472016-12-28 17:28:07 -08006789 convertIntToRadioIndicationType(indicationType), nitzTime, timeReceived);
Amit Mahajan17249842017-01-19 15:05:45 -08006790 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08006791 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006792 RLOGE("nitzTimeReceivedInd: radioService[%d]->mRadioIndication == NULL", slotId);
Weilun Dud2c30932017-02-09 12:32:42 -08006793 return -1;
Amit Mahajan5829a472016-12-28 17:28:07 -08006794 }
6795
6796 return 0;
6797}
6798
Amit Mahajan2fa9e632017-01-06 16:55:33 -08006799void convertRilSignalStrengthToHal(void *response, size_t responseLen,
6800 SignalStrength& signalStrength) {
6801 RIL_SignalStrength_v10 *rilSignalStrength = (RIL_SignalStrength_v10 *) response;
6802
6803 // Fixup LTE for backwards compatibility
6804 // signalStrength: -1 -> 99
6805 if (rilSignalStrength->LTE_SignalStrength.signalStrength == -1) {
6806 rilSignalStrength->LTE_SignalStrength.signalStrength = 99;
6807 }
6808 // rsrp: -1 -> INT_MAX all other negative value to positive.
6809 // So remap here
6810 if (rilSignalStrength->LTE_SignalStrength.rsrp == -1) {
6811 rilSignalStrength->LTE_SignalStrength.rsrp = INT_MAX;
6812 } else if (rilSignalStrength->LTE_SignalStrength.rsrp < -1) {
6813 rilSignalStrength->LTE_SignalStrength.rsrp = -rilSignalStrength->LTE_SignalStrength.rsrp;
6814 }
6815 // rsrq: -1 -> INT_MAX
6816 if (rilSignalStrength->LTE_SignalStrength.rsrq == -1) {
6817 rilSignalStrength->LTE_SignalStrength.rsrq = INT_MAX;
6818 }
6819 // Not remapping rssnr is already using INT_MAX
6820 // cqi: -1 -> INT_MAX
6821 if (rilSignalStrength->LTE_SignalStrength.cqi == -1) {
6822 rilSignalStrength->LTE_SignalStrength.cqi = INT_MAX;
6823 }
6824
6825 signalStrength.gw.signalStrength = rilSignalStrength->GW_SignalStrength.signalStrength;
6826 signalStrength.gw.bitErrorRate = rilSignalStrength->GW_SignalStrength.bitErrorRate;
6827 signalStrength.cdma.dbm = rilSignalStrength->CDMA_SignalStrength.dbm;
6828 signalStrength.cdma.ecio = rilSignalStrength->CDMA_SignalStrength.ecio;
6829 signalStrength.evdo.dbm = rilSignalStrength->EVDO_SignalStrength.dbm;
6830 signalStrength.evdo.ecio = rilSignalStrength->EVDO_SignalStrength.ecio;
6831 signalStrength.evdo.signalNoiseRatio =
6832 rilSignalStrength->EVDO_SignalStrength.signalNoiseRatio;
6833 signalStrength.lte.signalStrength = rilSignalStrength->LTE_SignalStrength.signalStrength;
6834 signalStrength.lte.rsrp = rilSignalStrength->LTE_SignalStrength.rsrp;
6835 signalStrength.lte.rsrq = rilSignalStrength->LTE_SignalStrength.rsrq;
6836 signalStrength.lte.rssnr = rilSignalStrength->LTE_SignalStrength.rssnr;
6837 signalStrength.lte.cqi = rilSignalStrength->LTE_SignalStrength.cqi;
6838 signalStrength.lte.timingAdvance = rilSignalStrength->LTE_SignalStrength.timingAdvance;
6839 signalStrength.tdScdma.rscp = rilSignalStrength->TD_SCDMA_SignalStrength.rscp;
6840}
6841
Amit Mahajan759786a2017-03-03 17:35:47 -08006842int radio::currentSignalStrengthInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08006843 int indicationType, int token, RIL_Errno e,
6844 void *response, size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08006845 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan2fa9e632017-01-06 16:55:33 -08006846 if (response == NULL || responseLen != sizeof(RIL_SignalStrength_v10)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006847 RLOGE("currentSignalStrengthInd: invalid response");
Amit Mahajan2fa9e632017-01-06 16:55:33 -08006848 return 0;
6849 }
6850
Jack Yuf68e0da2017-02-07 14:53:09 -08006851 SignalStrength signalStrength = {};
Amit Mahajan2fa9e632017-01-06 16:55:33 -08006852 convertRilSignalStrengthToHal(response, responseLen, signalStrength);
6853
Jayachandran C572f2f42017-03-25 14:30:13 -07006854#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006855 RLOGD("currentSignalStrengthInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07006856#endif
Amit Mahajan17249842017-01-19 15:05:45 -08006857 Return<void> retStatus = radioService[slotId]->mRadioIndication->currentSignalStrength(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08006858 convertIntToRadioIndicationType(indicationType), signalStrength);
Amit Mahajan17249842017-01-19 15:05:45 -08006859 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08006860 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006861 RLOGE("currentSignalStrengthInd: radioService[%d]->mRadioIndication == NULL",
Amit Mahajan2fa9e632017-01-06 16:55:33 -08006862 slotId);
6863 }
6864
6865 return 0;
6866}
6867
Amit Mahajan5829a472016-12-28 17:28:07 -08006868void convertRilDataCallToHal(RIL_Data_Call_Response_v11 *dcResponse,
6869 SetupDataCallResult& dcResult) {
Jack Yu5079e182017-02-28 15:21:18 -08006870 dcResult.status = (DataCallFailCause) dcResponse->status;
Amit Mahajan5829a472016-12-28 17:28:07 -08006871 dcResult.suggestedRetryTime = dcResponse->suggestedRetryTime;
6872 dcResult.cid = dcResponse->cid;
6873 dcResult.active = dcResponse->active;
6874 dcResult.type = convertCharPtrToHidlString(dcResponse->type);
6875 dcResult.ifname = convertCharPtrToHidlString(dcResponse->ifname);
6876 dcResult.addresses = convertCharPtrToHidlString(dcResponse->addresses);
6877 dcResult.dnses = convertCharPtrToHidlString(dcResponse->dnses);
6878 dcResult.gateways = convertCharPtrToHidlString(dcResponse->gateways);
6879 dcResult.pcscf = convertCharPtrToHidlString(dcResponse->pcscf);
6880 dcResult.mtu = dcResponse->mtu;
6881}
6882
6883void convertRilDataCallListToHal(void *response, size_t responseLen,
6884 hidl_vec<SetupDataCallResult>& dcResultList) {
6885 int num = responseLen / sizeof(RIL_Data_Call_Response_v11);
6886
6887 RIL_Data_Call_Response_v11 *dcResponse = (RIL_Data_Call_Response_v11 *) response;
6888 dcResultList.resize(num);
6889 for (int i = 0; i < num; i++) {
6890 convertRilDataCallToHal(&dcResponse[i], dcResultList[i]);
6891 }
6892}
6893
Amit Mahajan759786a2017-03-03 17:35:47 -08006894int radio::dataCallListChangedInd(int slotId,
Amit Mahajan5829a472016-12-28 17:28:07 -08006895 int indicationType, int token, RIL_Errno e, void *response,
6896 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08006897 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan5829a472016-12-28 17:28:07 -08006898 if (response == NULL || responseLen % sizeof(RIL_Data_Call_Response_v11) != 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006899 RLOGE("dataCallListChangedInd: invalid response");
Amit Mahajan5829a472016-12-28 17:28:07 -08006900 return 0;
6901 }
6902 hidl_vec<SetupDataCallResult> dcList;
6903 convertRilDataCallListToHal(response, responseLen, dcList);
Jayachandran C572f2f42017-03-25 14:30:13 -07006904#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006905 RLOGD("dataCallListChangedInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07006906#endif
Amit Mahajan17249842017-01-19 15:05:45 -08006907 Return<void> retStatus = radioService[slotId]->mRadioIndication->dataCallListChanged(
Amit Mahajan5829a472016-12-28 17:28:07 -08006908 convertIntToRadioIndicationType(indicationType), dcList);
Amit Mahajan17249842017-01-19 15:05:45 -08006909 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08006910 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006911 RLOGE("dataCallListChangedInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08006912 }
6913
6914 return 0;
6915}
6916
Amit Mahajan759786a2017-03-03 17:35:47 -08006917int radio::suppSvcNotifyInd(int slotId, int indicationType,
Amit Mahajan5829a472016-12-28 17:28:07 -08006918 int token, RIL_Errno e, void *response, size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08006919 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan5829a472016-12-28 17:28:07 -08006920 if (response == NULL || responseLen != sizeof(RIL_SuppSvcNotification)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006921 RLOGE("suppSvcNotifyInd: invalid response");
Amit Mahajan5829a472016-12-28 17:28:07 -08006922 return 0;
6923 }
6924
Jack Yuf68e0da2017-02-07 14:53:09 -08006925 SuppSvcNotification suppSvc = {};
Amit Mahajan5829a472016-12-28 17:28:07 -08006926 RIL_SuppSvcNotification *ssn = (RIL_SuppSvcNotification *) response;
6927 suppSvc.isMT = ssn->notificationType;
6928 suppSvc.code = ssn->code;
6929 suppSvc.index = ssn->index;
6930 suppSvc.type = ssn->type;
6931 suppSvc.number = convertCharPtrToHidlString(ssn->number);
6932
Jayachandran C572f2f42017-03-25 14:30:13 -07006933#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006934 RLOGD("suppSvcNotifyInd: isMT %d code %d index %d type %d",
Amit Mahajan5829a472016-12-28 17:28:07 -08006935 suppSvc.isMT, suppSvc.code, suppSvc.index, suppSvc.type);
Jayachandran C572f2f42017-03-25 14:30:13 -07006936#endif
Amit Mahajan17249842017-01-19 15:05:45 -08006937 Return<void> retStatus = radioService[slotId]->mRadioIndication->suppSvcNotify(
Amit Mahajan5829a472016-12-28 17:28:07 -08006938 convertIntToRadioIndicationType(indicationType), suppSvc);
Amit Mahajan17249842017-01-19 15:05:45 -08006939 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08006940 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006941 RLOGE("suppSvcNotifyInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08006942 }
6943
6944 return 0;
6945}
6946
Amit Mahajan759786a2017-03-03 17:35:47 -08006947int radio::stkSessionEndInd(int slotId, int indicationType,
Amit Mahajan5829a472016-12-28 17:28:07 -08006948 int token, RIL_Errno e, void *response, size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08006949 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006950#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006951 RLOGD("stkSessionEndInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07006952#endif
Amit Mahajan17249842017-01-19 15:05:45 -08006953 Return<void> retStatus = radioService[slotId]->mRadioIndication->stkSessionEnd(
Amit Mahajan5829a472016-12-28 17:28:07 -08006954 convertIntToRadioIndicationType(indicationType));
Amit Mahajan17249842017-01-19 15:05:45 -08006955 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08006956 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006957 RLOGE("stkSessionEndInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08006958 }
6959
6960 return 0;
6961}
6962
Amit Mahajan759786a2017-03-03 17:35:47 -08006963int radio::stkProactiveCommandInd(int slotId,
Amit Mahajan5829a472016-12-28 17:28:07 -08006964 int indicationType, int token, RIL_Errno e, void *response,
6965 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08006966 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan5829a472016-12-28 17:28:07 -08006967 if (response == NULL || responseLen == 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006968 RLOGE("stkProactiveCommandInd: invalid response");
Amit Mahajan5829a472016-12-28 17:28:07 -08006969 return 0;
6970 }
Jayachandran C572f2f42017-03-25 14:30:13 -07006971#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006972 RLOGD("stkProactiveCommandInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07006973#endif
Amit Mahajan17249842017-01-19 15:05:45 -08006974 Return<void> retStatus = radioService[slotId]->mRadioIndication->stkProactiveCommand(
Amit Mahajan5829a472016-12-28 17:28:07 -08006975 convertIntToRadioIndicationType(indicationType),
6976 convertCharPtrToHidlString((char *) response));
Amit Mahajan17249842017-01-19 15:05:45 -08006977 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08006978 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006979 RLOGE("stkProactiveCommandInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08006980 }
6981
6982 return 0;
6983}
6984
Amit Mahajan759786a2017-03-03 17:35:47 -08006985int radio::stkEventNotifyInd(int slotId, int indicationType,
Amit Mahajan5829a472016-12-28 17:28:07 -08006986 int token, RIL_Errno e, void *response, size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08006987 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan5829a472016-12-28 17:28:07 -08006988 if (response == NULL || responseLen == 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006989 RLOGE("stkEventNotifyInd: invalid response");
Amit Mahajan5829a472016-12-28 17:28:07 -08006990 return 0;
6991 }
Jayachandran C572f2f42017-03-25 14:30:13 -07006992#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006993 RLOGD("stkEventNotifyInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07006994#endif
Amit Mahajan17249842017-01-19 15:05:45 -08006995 Return<void> retStatus = radioService[slotId]->mRadioIndication->stkEventNotify(
Amit Mahajan5829a472016-12-28 17:28:07 -08006996 convertIntToRadioIndicationType(indicationType),
6997 convertCharPtrToHidlString((char *) response));
Amit Mahajan17249842017-01-19 15:05:45 -08006998 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08006999 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007000 RLOGE("stkEventNotifyInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08007001 }
7002
7003 return 0;
7004}
7005
Amit Mahajan759786a2017-03-03 17:35:47 -08007006int radio::stkCallSetupInd(int slotId, int indicationType,
Amit Mahajan5829a472016-12-28 17:28:07 -08007007 int token, RIL_Errno e, void *response, size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007008 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan5829a472016-12-28 17:28:07 -08007009 if (response == NULL || responseLen != sizeof(int)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007010 RLOGE("stkCallSetupInd: invalid response");
Amit Mahajan5829a472016-12-28 17:28:07 -08007011 return 0;
7012 }
7013 int32_t timeout = ((int32_t *) response)[0];
Jayachandran C572f2f42017-03-25 14:30:13 -07007014#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007015 RLOGD("stkCallSetupInd: timeout %d", timeout);
Jayachandran C572f2f42017-03-25 14:30:13 -07007016#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007017 Return<void> retStatus = radioService[slotId]->mRadioIndication->stkCallSetup(
Amit Mahajan5829a472016-12-28 17:28:07 -08007018 convertIntToRadioIndicationType(indicationType), timeout);
Amit Mahajan17249842017-01-19 15:05:45 -08007019 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08007020 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007021 RLOGE("stkCallSetupInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08007022 }
7023
7024 return 0;
7025}
7026
Amit Mahajan759786a2017-03-03 17:35:47 -08007027int radio::simSmsStorageFullInd(int slotId,
Amit Mahajan5829a472016-12-28 17:28:07 -08007028 int indicationType, int token, RIL_Errno e, void *response,
7029 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007030 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Jayachandran C572f2f42017-03-25 14:30:13 -07007031#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007032 RLOGD("simSmsStorageFullInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07007033#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007034 Return<void> retStatus = radioService[slotId]->mRadioIndication->simSmsStorageFull(
Amit Mahajan5829a472016-12-28 17:28:07 -08007035 convertIntToRadioIndicationType(indicationType));
Amit Mahajan17249842017-01-19 15:05:45 -08007036 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08007037 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007038 RLOGE("simSmsStorageFullInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08007039 }
7040
7041 return 0;
7042}
7043
Amit Mahajan759786a2017-03-03 17:35:47 -08007044int radio::simRefreshInd(int slotId, int indicationType,
Amit Mahajan5829a472016-12-28 17:28:07 -08007045 int token, RIL_Errno e, void *response, size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007046 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan5829a472016-12-28 17:28:07 -08007047 if (response == NULL || responseLen != sizeof(RIL_SimRefreshResponse_v7)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007048 RLOGE("simRefreshInd: invalid response");
Amit Mahajan5829a472016-12-28 17:28:07 -08007049 return 0;
7050 }
7051
Jack Yuf68e0da2017-02-07 14:53:09 -08007052 SimRefreshResult refreshResult = {};
Amit Mahajan5829a472016-12-28 17:28:07 -08007053 RIL_SimRefreshResponse_v7 *simRefreshResponse = ((RIL_SimRefreshResponse_v7 *) response);
7054 refreshResult.type =
7055 (android::hardware::radio::V1_0::SimRefreshType) simRefreshResponse->result;
7056 refreshResult.efId = simRefreshResponse->ef_id;
7057 refreshResult.aid = convertCharPtrToHidlString(simRefreshResponse->aid);
7058
Jayachandran C572f2f42017-03-25 14:30:13 -07007059#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007060 RLOGD("simRefreshInd: type %d efId %d", refreshResult.type, refreshResult.efId);
Jayachandran C572f2f42017-03-25 14:30:13 -07007061#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007062 Return<void> retStatus = radioService[slotId]->mRadioIndication->simRefresh(
Amit Mahajan5829a472016-12-28 17:28:07 -08007063 convertIntToRadioIndicationType(indicationType), refreshResult);
Amit Mahajan17249842017-01-19 15:05:45 -08007064 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08007065 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007066 RLOGE("simRefreshInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08007067 }
7068
7069 return 0;
7070}
7071
7072void convertRilCdmaSignalInfoRecordToHal(RIL_CDMA_SignalInfoRecord *signalInfoRecord,
7073 CdmaSignalInfoRecord& record) {
7074 record.isPresent = signalInfoRecord->isPresent;
7075 record.signalType = signalInfoRecord->signalType;
7076 record.alertPitch = signalInfoRecord->alertPitch;
7077 record.signal = signalInfoRecord->signal;
7078}
7079
Amit Mahajan759786a2017-03-03 17:35:47 -08007080int radio::callRingInd(int slotId, int indicationType,
Amit Mahajan5829a472016-12-28 17:28:07 -08007081 int token, RIL_Errno e, void *response, size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007082 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan5829a472016-12-28 17:28:07 -08007083 bool isGsm;
Jack Yuf68e0da2017-02-07 14:53:09 -08007084 CdmaSignalInfoRecord record = {};
Amit Mahajan5829a472016-12-28 17:28:07 -08007085 if (response == NULL || responseLen == 0) {
7086 isGsm = true;
7087 } else {
7088 isGsm = false;
7089 if (responseLen != sizeof (RIL_CDMA_SignalInfoRecord)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007090 RLOGE("callRingInd: invalid response");
Amit Mahajan5829a472016-12-28 17:28:07 -08007091 return 0;
7092 }
7093 convertRilCdmaSignalInfoRecordToHal((RIL_CDMA_SignalInfoRecord *) response, record);
7094 }
7095
Jayachandran C572f2f42017-03-25 14:30:13 -07007096#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007097 RLOGD("callRingInd: isGsm %d", isGsm);
Jayachandran C572f2f42017-03-25 14:30:13 -07007098#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007099 Return<void> retStatus = radioService[slotId]->mRadioIndication->callRing(
Amit Mahajan5829a472016-12-28 17:28:07 -08007100 convertIntToRadioIndicationType(indicationType), isGsm, record);
Amit Mahajan17249842017-01-19 15:05:45 -08007101 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08007102 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007103 RLOGE("callRingInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08007104 }
7105
7106 return 0;
7107}
7108
Amit Mahajan759786a2017-03-03 17:35:47 -08007109int radio::simStatusChangedInd(int slotId,
Amit Mahajan5829a472016-12-28 17:28:07 -08007110 int indicationType, int token, RIL_Errno e, void *response,
7111 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007112 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Jayachandran C572f2f42017-03-25 14:30:13 -07007113#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007114 RLOGD("simStatusChangedInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07007115#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007116 Return<void> retStatus = radioService[slotId]->mRadioIndication->simStatusChanged(
Amit Mahajan5829a472016-12-28 17:28:07 -08007117 convertIntToRadioIndicationType(indicationType));
Amit Mahajan17249842017-01-19 15:05:45 -08007118 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08007119 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007120 RLOGE("simStatusChangedInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08007121 }
7122
7123 return 0;
7124}
7125
Amit Mahajan759786a2017-03-03 17:35:47 -08007126int radio::cdmaNewSmsInd(int slotId, int indicationType,
Amit Mahajan5829a472016-12-28 17:28:07 -08007127 int token, RIL_Errno e, void *response, size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007128 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan5829a472016-12-28 17:28:07 -08007129 if (response == NULL || responseLen != sizeof(RIL_CDMA_SMS_Message)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007130 RLOGE("cdmaNewSmsInd: invalid response");
Amit Mahajan5829a472016-12-28 17:28:07 -08007131 return 0;
7132 }
7133
Jack Yuf68e0da2017-02-07 14:53:09 -08007134 CdmaSmsMessage msg = {};
Amit Mahajan5829a472016-12-28 17:28:07 -08007135 RIL_CDMA_SMS_Message *rilMsg = (RIL_CDMA_SMS_Message *) response;
7136 msg.teleserviceId = rilMsg->uTeleserviceID;
7137 msg.isServicePresent = rilMsg->bIsServicePresent;
7138 msg.serviceCategory = rilMsg->uServicecategory;
7139 msg.address.digitMode =
7140 (android::hardware::radio::V1_0::CdmaSmsDigitMode) rilMsg->sAddress.digit_mode;
7141 msg.address.numberMode =
7142 (android::hardware::radio::V1_0::CdmaSmsNumberMode) rilMsg->sAddress.number_mode;
7143 msg.address.numberType =
7144 (android::hardware::radio::V1_0::CdmaSmsNumberType) rilMsg->sAddress.number_type;
7145 msg.address.numberPlan =
7146 (android::hardware::radio::V1_0::CdmaSmsNumberPlan) rilMsg->sAddress.number_plan;
7147
7148 int digitLimit = MIN((rilMsg->sAddress.number_of_digits), RIL_CDMA_SMS_ADDRESS_MAX);
7149 msg.address.digits.setToExternal(rilMsg->sAddress.digits, digitLimit);
7150
7151 msg.subAddress.subaddressType = (android::hardware::radio::V1_0::CdmaSmsSubaddressType)
7152 rilMsg->sSubAddress.subaddressType;
7153 msg.subAddress.odd = rilMsg->sSubAddress.odd;
7154
7155 digitLimit= MIN((rilMsg->sSubAddress.number_of_digits), RIL_CDMA_SMS_SUBADDRESS_MAX);
7156 msg.subAddress.digits.setToExternal(rilMsg->sSubAddress.digits, digitLimit);
7157
7158 digitLimit = MIN((rilMsg->uBearerDataLen), RIL_CDMA_SMS_BEARER_DATA_MAX);
7159 msg.bearerData.setToExternal(rilMsg->aBearerData, digitLimit);
7160
Jayachandran C572f2f42017-03-25 14:30:13 -07007161#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007162 RLOGD("cdmaNewSmsInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07007163#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007164 Return<void> retStatus = radioService[slotId]->mRadioIndication->cdmaNewSms(
Amit Mahajan5829a472016-12-28 17:28:07 -08007165 convertIntToRadioIndicationType(indicationType), msg);
Amit Mahajan17249842017-01-19 15:05:45 -08007166 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08007167 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007168 RLOGE("cdmaNewSmsInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08007169 }
7170
7171 return 0;
7172}
7173
Amit Mahajan759786a2017-03-03 17:35:47 -08007174int radio::newBroadcastSmsInd(int slotId,
Amit Mahajan1955c742016-12-29 07:07:54 -08007175 int indicationType, int token, RIL_Errno e, void *response,
7176 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007177 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan1955c742016-12-29 07:07:54 -08007178 if (response == NULL || responseLen == 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007179 RLOGE("newBroadcastSmsInd: invalid response");
Amit Mahajan1955c742016-12-29 07:07:54 -08007180 return 0;
7181 }
7182
7183 hidl_vec<uint8_t> data;
7184 data.setToExternal((uint8_t *) response, responseLen);
Jayachandran C572f2f42017-03-25 14:30:13 -07007185#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007186 RLOGD("newBroadcastSmsInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07007187#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007188 Return<void> retStatus = radioService[slotId]->mRadioIndication->newBroadcastSms(
Amit Mahajan1955c742016-12-29 07:07:54 -08007189 convertIntToRadioIndicationType(indicationType), data);
Amit Mahajan17249842017-01-19 15:05:45 -08007190 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan1955c742016-12-29 07:07:54 -08007191 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007192 RLOGE("newBroadcastSmsInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan1955c742016-12-29 07:07:54 -08007193 }
7194
7195 return 0;
7196}
7197
Amit Mahajan759786a2017-03-03 17:35:47 -08007198int radio::cdmaRuimSmsStorageFullInd(int slotId,
Amit Mahajan1955c742016-12-29 07:07:54 -08007199 int indicationType, int token, RIL_Errno e, void *response,
7200 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007201 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Jayachandran C572f2f42017-03-25 14:30:13 -07007202#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007203 RLOGD("cdmaRuimSmsStorageFullInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07007204#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007205 Return<void> retStatus = radioService[slotId]->mRadioIndication->cdmaRuimSmsStorageFull(
Amit Mahajan1955c742016-12-29 07:07:54 -08007206 convertIntToRadioIndicationType(indicationType));
Amit Mahajan17249842017-01-19 15:05:45 -08007207 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan1955c742016-12-29 07:07:54 -08007208 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007209 RLOGE("cdmaRuimSmsStorageFullInd: radioService[%d]->mRadioIndication == NULL",
Amit Mahajan1955c742016-12-29 07:07:54 -08007210 slotId);
7211 }
7212
7213 return 0;
7214}
7215
Amit Mahajan759786a2017-03-03 17:35:47 -08007216int radio::restrictedStateChangedInd(int slotId,
Amit Mahajan1955c742016-12-29 07:07:54 -08007217 int indicationType, int token, RIL_Errno e, void *response,
7218 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007219 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan1955c742016-12-29 07:07:54 -08007220 if (response == NULL || responseLen != sizeof(int)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007221 RLOGE("restrictedStateChangedInd: invalid response");
Amit Mahajan1955c742016-12-29 07:07:54 -08007222 return 0;
7223 }
7224 int32_t state = ((int32_t *) response)[0];
Jayachandran C572f2f42017-03-25 14:30:13 -07007225#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007226 RLOGD("restrictedStateChangedInd: state %d", state);
Jayachandran C572f2f42017-03-25 14:30:13 -07007227#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007228 Return<void> retStatus = radioService[slotId]->mRadioIndication->restrictedStateChanged(
Amit Mahajan1955c742016-12-29 07:07:54 -08007229 convertIntToRadioIndicationType(indicationType), (PhoneRestrictedState) state);
Amit Mahajan17249842017-01-19 15:05:45 -08007230 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan1955c742016-12-29 07:07:54 -08007231 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007232 RLOGE("restrictedStateChangedInd: radioService[%d]->mRadioIndication == NULL",
Amit Mahajan1955c742016-12-29 07:07:54 -08007233 slotId);
7234 }
7235
7236 return 0;
7237}
7238
Amit Mahajan759786a2017-03-03 17:35:47 -08007239int radio::enterEmergencyCallbackModeInd(int slotId,
Amit Mahajan1955c742016-12-29 07:07:54 -08007240 int indicationType, int token, RIL_Errno e, void *response,
7241 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007242 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Jayachandran C572f2f42017-03-25 14:30:13 -07007243#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007244 RLOGD("enterEmergencyCallbackModeInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07007245#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007246 Return<void> retStatus = radioService[slotId]->mRadioIndication->enterEmergencyCallbackMode(
Amit Mahajan1955c742016-12-29 07:07:54 -08007247 convertIntToRadioIndicationType(indicationType));
Amit Mahajan17249842017-01-19 15:05:45 -08007248 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan1955c742016-12-29 07:07:54 -08007249 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007250 RLOGE("enterEmergencyCallbackModeInd: radioService[%d]->mRadioIndication == NULL",
Amit Mahajan1955c742016-12-29 07:07:54 -08007251 slotId);
7252 }
7253
7254 return 0;
7255}
7256
Amit Mahajan759786a2017-03-03 17:35:47 -08007257int radio::cdmaCallWaitingInd(int slotId,
Amit Mahajan1955c742016-12-29 07:07:54 -08007258 int indicationType, int token, RIL_Errno e, void *response,
7259 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007260 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan1955c742016-12-29 07:07:54 -08007261 if (response == NULL || responseLen != sizeof(RIL_CDMA_CallWaiting_v6)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007262 RLOGE("cdmaCallWaitingInd: invalid response");
Amit Mahajan1955c742016-12-29 07:07:54 -08007263 return 0;
7264 }
7265
Jack Yuf68e0da2017-02-07 14:53:09 -08007266 CdmaCallWaiting callWaitingRecord = {};
Amit Mahajan1955c742016-12-29 07:07:54 -08007267 RIL_CDMA_CallWaiting_v6 *callWaitingRil = ((RIL_CDMA_CallWaiting_v6 *) response);
7268 callWaitingRecord.number = convertCharPtrToHidlString(callWaitingRil->number);
7269 callWaitingRecord.numberPresentation =
7270 (CdmaCallWaitingNumberPresentation) callWaitingRil->numberPresentation;
7271 callWaitingRecord.name = convertCharPtrToHidlString(callWaitingRil->name);
7272 convertRilCdmaSignalInfoRecordToHal(&callWaitingRil->signalInfoRecord,
7273 callWaitingRecord.signalInfoRecord);
7274 callWaitingRecord.numberType = (CdmaCallWaitingNumberType) callWaitingRil->number_type;
7275 callWaitingRecord.numberPlan = (CdmaCallWaitingNumberPlan) callWaitingRil->number_plan;
7276
Jayachandran C572f2f42017-03-25 14:30:13 -07007277#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007278 RLOGD("cdmaCallWaitingInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07007279#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007280 Return<void> retStatus = radioService[slotId]->mRadioIndication->cdmaCallWaiting(
Amit Mahajan1955c742016-12-29 07:07:54 -08007281 convertIntToRadioIndicationType(indicationType), callWaitingRecord);
Amit Mahajan17249842017-01-19 15:05:45 -08007282 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan1955c742016-12-29 07:07:54 -08007283 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007284 RLOGE("cdmaCallWaitingInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan1955c742016-12-29 07:07:54 -08007285 }
7286
7287 return 0;
7288}
7289
Amit Mahajan759786a2017-03-03 17:35:47 -08007290int radio::cdmaOtaProvisionStatusInd(int slotId,
Amit Mahajan1955c742016-12-29 07:07:54 -08007291 int indicationType, int token, RIL_Errno e, void *response,
7292 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007293 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan1955c742016-12-29 07:07:54 -08007294 if (response == NULL || responseLen != sizeof(int)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007295 RLOGE("cdmaOtaProvisionStatusInd: invalid response");
Amit Mahajan1955c742016-12-29 07:07:54 -08007296 return 0;
7297 }
7298 int32_t status = ((int32_t *) response)[0];
Jayachandran C572f2f42017-03-25 14:30:13 -07007299#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007300 RLOGD("cdmaOtaProvisionStatusInd: status %d", status);
Jayachandran C572f2f42017-03-25 14:30:13 -07007301#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007302 Return<void> retStatus = radioService[slotId]->mRadioIndication->cdmaOtaProvisionStatus(
Amit Mahajan1955c742016-12-29 07:07:54 -08007303 convertIntToRadioIndicationType(indicationType), (CdmaOtaProvisionStatus) status);
Amit Mahajan17249842017-01-19 15:05:45 -08007304 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan1955c742016-12-29 07:07:54 -08007305 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007306 RLOGE("cdmaOtaProvisionStatusInd: radioService[%d]->mRadioIndication == NULL",
Amit Mahajan1955c742016-12-29 07:07:54 -08007307 slotId);
7308 }
7309
7310 return 0;
7311}
7312
Amit Mahajan759786a2017-03-03 17:35:47 -08007313int radio::cdmaInfoRecInd(int slotId,
Amit Mahajan1955c742016-12-29 07:07:54 -08007314 int indicationType, int token, RIL_Errno e, void *response,
7315 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007316 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan1955c742016-12-29 07:07:54 -08007317 if (response == NULL || responseLen != sizeof(RIL_CDMA_InformationRecords)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007318 RLOGE("cdmaInfoRecInd: invalid response");
Amit Mahajan1955c742016-12-29 07:07:54 -08007319 return 0;
7320 }
7321
Jack Yuf68e0da2017-02-07 14:53:09 -08007322 CdmaInformationRecords records = {};
Amit Mahajan1955c742016-12-29 07:07:54 -08007323 RIL_CDMA_InformationRecords *recordsRil = (RIL_CDMA_InformationRecords *) response;
7324
7325 char* string8 = NULL;
7326 int num = MIN(recordsRil->numberOfInfoRecs, RIL_CDMA_MAX_NUMBER_OF_INFO_RECS);
7327 if (recordsRil->numberOfInfoRecs > RIL_CDMA_MAX_NUMBER_OF_INFO_RECS) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007328 RLOGE("cdmaInfoRecInd: received %d recs which is more than %d, dropping "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08007329 "additional ones", recordsRil->numberOfInfoRecs,
Amit Mahajan1955c742016-12-29 07:07:54 -08007330 RIL_CDMA_MAX_NUMBER_OF_INFO_RECS);
7331 }
7332 records.infoRec.resize(num);
7333 for (int i = 0 ; i < num ; i++) {
7334 CdmaInformationRecord *record = &records.infoRec[i];
7335 RIL_CDMA_InformationRecord *infoRec = &recordsRil->infoRec[i];
7336 record->name = (CdmaInfoRecName) infoRec->name;
Sanket Padawe378ccdd2017-01-24 14:11:12 -08007337 // All vectors should be size 0 except one which will be size 1. Set everything to
7338 // size 0 initially.
7339 record->display.resize(0);
7340 record->number.resize(0);
7341 record->signal.resize(0);
7342 record->redir.resize(0);
7343 record->lineCtrl.resize(0);
7344 record->clir.resize(0);
7345 record->audioCtrl.resize(0);
Amit Mahajan1955c742016-12-29 07:07:54 -08007346 switch (infoRec->name) {
7347 case RIL_CDMA_DISPLAY_INFO_REC:
7348 case RIL_CDMA_EXTENDED_DISPLAY_INFO_REC: {
7349 if (infoRec->rec.display.alpha_len > CDMA_ALPHA_INFO_BUFFER_LENGTH) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007350 RLOGE("cdmaInfoRecInd: invalid display info response length %d "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08007351 "expected not more than %d", (int) infoRec->rec.display.alpha_len,
Amit Mahajan1955c742016-12-29 07:07:54 -08007352 CDMA_ALPHA_INFO_BUFFER_LENGTH);
7353 return 0;
7354 }
7355 string8 = (char*) malloc((infoRec->rec.display.alpha_len + 1) * sizeof(char));
7356 if (string8 == NULL) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007357 RLOGE("cdmaInfoRecInd: Memory allocation failed for "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08007358 "responseCdmaInformationRecords");
Amit Mahajan1955c742016-12-29 07:07:54 -08007359 return 0;
7360 }
7361 memcpy(string8, infoRec->rec.display.alpha_buf, infoRec->rec.display.alpha_len);
7362 string8[(int)infoRec->rec.display.alpha_len] = '\0';
7363
7364 record->display.resize(1);
7365 record->display[0].alphaBuf = string8;
7366 free(string8);
7367 string8 = NULL;
7368 break;
7369 }
7370
7371 case RIL_CDMA_CALLED_PARTY_NUMBER_INFO_REC:
7372 case RIL_CDMA_CALLING_PARTY_NUMBER_INFO_REC:
7373 case RIL_CDMA_CONNECTED_NUMBER_INFO_REC: {
7374 if (infoRec->rec.number.len > CDMA_NUMBER_INFO_BUFFER_LENGTH) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007375 RLOGE("cdmaInfoRecInd: invalid display info response length %d "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08007376 "expected not more than %d", (int) infoRec->rec.number.len,
Amit Mahajan1955c742016-12-29 07:07:54 -08007377 CDMA_NUMBER_INFO_BUFFER_LENGTH);
7378 return 0;
7379 }
7380 string8 = (char*) malloc((infoRec->rec.number.len + 1) * sizeof(char));
7381 if (string8 == NULL) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007382 RLOGE("cdmaInfoRecInd: Memory allocation failed for "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08007383 "responseCdmaInformationRecords");
Amit Mahajan1955c742016-12-29 07:07:54 -08007384 return 0;
7385 }
7386 memcpy(string8, infoRec->rec.number.buf, infoRec->rec.number.len);
7387 string8[(int)infoRec->rec.number.len] = '\0';
7388
7389 record->number.resize(1);
7390 record->number[0].number = string8;
7391 free(string8);
7392 string8 = NULL;
7393 record->number[0].numberType = infoRec->rec.number.number_type;
7394 record->number[0].numberPlan = infoRec->rec.number.number_plan;
7395 record->number[0].pi = infoRec->rec.number.pi;
7396 record->number[0].si = infoRec->rec.number.si;
7397 break;
7398 }
7399
7400 case RIL_CDMA_SIGNAL_INFO_REC: {
7401 record->signal.resize(1);
7402 record->signal[0].isPresent = infoRec->rec.signal.isPresent;
7403 record->signal[0].signalType = infoRec->rec.signal.signalType;
7404 record->signal[0].alertPitch = infoRec->rec.signal.alertPitch;
7405 record->signal[0].signal = infoRec->rec.signal.signal;
7406 break;
7407 }
7408
7409 case RIL_CDMA_REDIRECTING_NUMBER_INFO_REC: {
7410 if (infoRec->rec.redir.redirectingNumber.len >
7411 CDMA_NUMBER_INFO_BUFFER_LENGTH) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007412 RLOGE("cdmaInfoRecInd: invalid display info response length %d "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08007413 "expected not more than %d\n",
Amit Mahajan1955c742016-12-29 07:07:54 -08007414 (int)infoRec->rec.redir.redirectingNumber.len,
7415 CDMA_NUMBER_INFO_BUFFER_LENGTH);
7416 return 0;
7417 }
7418 string8 = (char*) malloc((infoRec->rec.redir.redirectingNumber.len + 1) *
7419 sizeof(char));
7420 if (string8 == NULL) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007421 RLOGE("cdmaInfoRecInd: Memory allocation failed for "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08007422 "responseCdmaInformationRecords");
Amit Mahajan1955c742016-12-29 07:07:54 -08007423 return 0;
7424 }
7425 memcpy(string8, infoRec->rec.redir.redirectingNumber.buf,
7426 infoRec->rec.redir.redirectingNumber.len);
7427 string8[(int)infoRec->rec.redir.redirectingNumber.len] = '\0';
7428
7429 record->redir.resize(1);
7430 record->redir[0].redirectingNumber.number = string8;
7431 free(string8);
7432 string8 = NULL;
7433 record->redir[0].redirectingNumber.numberType =
7434 infoRec->rec.redir.redirectingNumber.number_type;
7435 record->redir[0].redirectingNumber.numberPlan =
7436 infoRec->rec.redir.redirectingNumber.number_plan;
7437 record->redir[0].redirectingNumber.pi = infoRec->rec.redir.redirectingNumber.pi;
7438 record->redir[0].redirectingNumber.si = infoRec->rec.redir.redirectingNumber.si;
7439 record->redir[0].redirectingReason =
7440 (CdmaRedirectingReason) infoRec->rec.redir.redirectingReason;
7441 break;
7442 }
7443
7444 case RIL_CDMA_LINE_CONTROL_INFO_REC: {
7445 record->lineCtrl.resize(1);
7446 record->lineCtrl[0].lineCtrlPolarityIncluded =
7447 infoRec->rec.lineCtrl.lineCtrlPolarityIncluded;
7448 record->lineCtrl[0].lineCtrlToggle = infoRec->rec.lineCtrl.lineCtrlToggle;
7449 record->lineCtrl[0].lineCtrlReverse = infoRec->rec.lineCtrl.lineCtrlReverse;
7450 record->lineCtrl[0].lineCtrlPowerDenial =
7451 infoRec->rec.lineCtrl.lineCtrlPowerDenial;
7452 break;
7453 }
7454
7455 case RIL_CDMA_T53_CLIR_INFO_REC: {
7456 record->clir.resize(1);
7457 record->clir[0].cause = infoRec->rec.clir.cause;
7458 break;
7459 }
7460
7461 case RIL_CDMA_T53_AUDIO_CONTROL_INFO_REC: {
7462 record->audioCtrl.resize(1);
7463 record->audioCtrl[0].upLink = infoRec->rec.audioCtrl.upLink;
7464 record->audioCtrl[0].downLink = infoRec->rec.audioCtrl.downLink;
7465 break;
7466 }
7467
7468 case RIL_CDMA_T53_RELEASE_INFO_REC:
Amit Mahajan111ddca2017-03-03 12:05:13 -08007469 RLOGE("cdmaInfoRecInd: RIL_CDMA_T53_RELEASE_INFO_REC: INVALID");
Amit Mahajan1955c742016-12-29 07:07:54 -08007470 return 0;
7471
7472 default:
Amit Mahajan111ddca2017-03-03 12:05:13 -08007473 RLOGE("cdmaInfoRecInd: Incorrect name value");
Amit Mahajan1955c742016-12-29 07:07:54 -08007474 return 0;
7475 }
7476 }
7477
Jayachandran C572f2f42017-03-25 14:30:13 -07007478#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007479 RLOGD("cdmaInfoRecInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07007480#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007481 Return<void> retStatus = radioService[slotId]->mRadioIndication->cdmaInfoRec(
Amit Mahajan1955c742016-12-29 07:07:54 -08007482 convertIntToRadioIndicationType(indicationType), records);
Amit Mahajan17249842017-01-19 15:05:45 -08007483 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan1955c742016-12-29 07:07:54 -08007484 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007485 RLOGE("cdmaInfoRecInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan1955c742016-12-29 07:07:54 -08007486 }
7487
7488 return 0;
7489}
7490
Amit Mahajan759786a2017-03-03 17:35:47 -08007491int radio::indicateRingbackToneInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007492 int indicationType, int token, RIL_Errno e, void *response,
7493 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007494 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007495 if (response == NULL || responseLen != sizeof(int)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007496 RLOGE("indicateRingbackToneInd: invalid response");
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007497 return 0;
7498 }
7499 bool start = ((int32_t *) response)[0];
Jayachandran C572f2f42017-03-25 14:30:13 -07007500#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007501 RLOGD("indicateRingbackToneInd: start %d", start);
Jayachandran C572f2f42017-03-25 14:30:13 -07007502#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007503 Return<void> retStatus = radioService[slotId]->mRadioIndication->indicateRingbackTone(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007504 convertIntToRadioIndicationType(indicationType), start);
Amit Mahajan17249842017-01-19 15:05:45 -08007505 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007506 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007507 RLOGE("indicateRingbackToneInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007508 }
7509
7510 return 0;
7511}
7512
Amit Mahajan759786a2017-03-03 17:35:47 -08007513int radio::resendIncallMuteInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007514 int indicationType, int token, RIL_Errno e, void *response,
7515 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007516 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Jayachandran C572f2f42017-03-25 14:30:13 -07007517#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007518 RLOGD("resendIncallMuteInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07007519#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007520 Return<void> retStatus = radioService[slotId]->mRadioIndication->resendIncallMute(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007521 convertIntToRadioIndicationType(indicationType));
Amit Mahajan17249842017-01-19 15:05:45 -08007522 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007523 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007524 RLOGE("resendIncallMuteInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007525 }
7526
7527 return 0;
7528}
7529
Amit Mahajan759786a2017-03-03 17:35:47 -08007530int radio::cdmaSubscriptionSourceChangedInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007531 int indicationType, int token, RIL_Errno e,
7532 void *response, size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007533 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007534 if (response == NULL || responseLen != sizeof(int)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007535 RLOGE("cdmaSubscriptionSourceChangedInd: invalid response");
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007536 return 0;
7537 }
7538 int32_t cdmaSource = ((int32_t *) response)[0];
Jayachandran C572f2f42017-03-25 14:30:13 -07007539#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007540 RLOGD("cdmaSubscriptionSourceChangedInd: cdmaSource %d", cdmaSource);
Jayachandran C572f2f42017-03-25 14:30:13 -07007541#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007542 Return<void> retStatus = radioService[slotId]->mRadioIndication->
7543 cdmaSubscriptionSourceChanged(convertIntToRadioIndicationType(indicationType),
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007544 (CdmaSubscriptionSource) cdmaSource);
Amit Mahajan17249842017-01-19 15:05:45 -08007545 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007546 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007547 RLOGE("cdmaSubscriptionSourceChangedInd: radioService[%d]->mRadioIndication == NULL",
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007548 slotId);
7549 }
7550
7551 return 0;
7552}
7553
Amit Mahajan759786a2017-03-03 17:35:47 -08007554int radio::cdmaPrlChangedInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007555 int indicationType, int token, RIL_Errno e, void *response,
7556 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007557 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007558 if (response == NULL || responseLen != sizeof(int)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007559 RLOGE("cdmaPrlChangedInd: invalid response");
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007560 return 0;
7561 }
7562 int32_t version = ((int32_t *) response)[0];
Jayachandran C572f2f42017-03-25 14:30:13 -07007563#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007564 RLOGD("cdmaPrlChangedInd: version %d", version);
Jayachandran C572f2f42017-03-25 14:30:13 -07007565#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007566 Return<void> retStatus = radioService[slotId]->mRadioIndication->cdmaPrlChanged(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007567 convertIntToRadioIndicationType(indicationType), version);
Amit Mahajan17249842017-01-19 15:05:45 -08007568 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007569 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007570 RLOGE("cdmaPrlChangedInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007571 }
7572
7573 return 0;
7574}
7575
Amit Mahajan759786a2017-03-03 17:35:47 -08007576int radio::exitEmergencyCallbackModeInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007577 int indicationType, int token, RIL_Errno e, void *response,
7578 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007579 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Jayachandran C572f2f42017-03-25 14:30:13 -07007580#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007581 RLOGD("exitEmergencyCallbackModeInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07007582#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007583 Return<void> retStatus = radioService[slotId]->mRadioIndication->exitEmergencyCallbackMode(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007584 convertIntToRadioIndicationType(indicationType));
Amit Mahajan17249842017-01-19 15:05:45 -08007585 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007586 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007587 RLOGE("exitEmergencyCallbackModeInd: radioService[%d]->mRadioIndication == NULL",
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007588 slotId);
7589 }
7590
7591 return 0;
7592}
7593
Amit Mahajan759786a2017-03-03 17:35:47 -08007594int radio::rilConnectedInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007595 int indicationType, int token, RIL_Errno e, void *response,
7596 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007597 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007598 RLOGD("rilConnectedInd");
Amit Mahajan17249842017-01-19 15:05:45 -08007599 Return<void> retStatus = radioService[slotId]->mRadioIndication->rilConnected(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007600 convertIntToRadioIndicationType(indicationType));
Amit Mahajan17249842017-01-19 15:05:45 -08007601 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007602 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007603 RLOGE("rilConnectedInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007604 }
7605
7606 return 0;
7607}
7608
Amit Mahajan759786a2017-03-03 17:35:47 -08007609int radio::voiceRadioTechChangedInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007610 int indicationType, int token, RIL_Errno e, void *response,
7611 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007612 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007613 if (response == NULL || responseLen != sizeof(int)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007614 RLOGE("voiceRadioTechChangedInd: invalid response");
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007615 return 0;
7616 }
7617 int32_t rat = ((int32_t *) response)[0];
Jayachandran C572f2f42017-03-25 14:30:13 -07007618#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007619 RLOGD("voiceRadioTechChangedInd: rat %d", rat);
Jayachandran C572f2f42017-03-25 14:30:13 -07007620#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007621 Return<void> retStatus = radioService[slotId]->mRadioIndication->voiceRadioTechChanged(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007622 convertIntToRadioIndicationType(indicationType), (RadioTechnology) rat);
Amit Mahajan17249842017-01-19 15:05:45 -08007623 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007624 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007625 RLOGE("voiceRadioTechChangedInd: radioService[%d]->mRadioIndication == NULL",
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007626 slotId);
7627 }
7628
7629 return 0;
7630}
7631
7632void convertRilCellInfoListToHal(void *response, size_t responseLen, hidl_vec<CellInfo>& records) {
7633 int num = responseLen / sizeof(RIL_CellInfo_v12);
7634 records.resize(num);
7635
7636 RIL_CellInfo_v12 *rillCellInfo = (RIL_CellInfo_v12 *) response;
7637 for (int i = 0; i < num; i++) {
7638 records[i].cellInfoType = (CellInfoType) rillCellInfo->cellInfoType;
7639 records[i].registered = rillCellInfo->registered;
7640 records[i].timeStampType = (TimeStampType) rillCellInfo->timeStampType;
7641 records[i].timeStamp = rillCellInfo->timeStamp;
Sanket Padawe378ccdd2017-01-24 14:11:12 -08007642 // All vectors should be size 0 except one which will be size 1. Set everything to
7643 // size 0 initially.
7644 records[i].gsm.resize(0);
7645 records[i].wcdma.resize(0);
7646 records[i].cdma.resize(0);
7647 records[i].lte.resize(0);
7648 records[i].tdscdma.resize(0);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007649 switch(rillCellInfo->cellInfoType) {
7650 case RIL_CELL_INFO_TYPE_GSM: {
7651 records[i].gsm.resize(1);
7652 CellInfoGsm *cellInfoGsm = &records[i].gsm[0];
7653 cellInfoGsm->cellIdentityGsm.mcc =
7654 std::to_string(rillCellInfo->CellInfo.gsm.cellIdentityGsm.mcc);
7655 cellInfoGsm->cellIdentityGsm.mnc =
7656 std::to_string(rillCellInfo->CellInfo.gsm.cellIdentityGsm.mnc);
7657 cellInfoGsm->cellIdentityGsm.lac =
7658 rillCellInfo->CellInfo.gsm.cellIdentityGsm.lac;
7659 cellInfoGsm->cellIdentityGsm.cid =
7660 rillCellInfo->CellInfo.gsm.cellIdentityGsm.cid;
7661 cellInfoGsm->cellIdentityGsm.arfcn =
7662 rillCellInfo->CellInfo.gsm.cellIdentityGsm.arfcn;
7663 cellInfoGsm->cellIdentityGsm.bsic =
7664 rillCellInfo->CellInfo.gsm.cellIdentityGsm.bsic;
7665 cellInfoGsm->signalStrengthGsm.signalStrength =
7666 rillCellInfo->CellInfo.gsm.signalStrengthGsm.signalStrength;
7667 cellInfoGsm->signalStrengthGsm.bitErrorRate =
7668 rillCellInfo->CellInfo.gsm.signalStrengthGsm.bitErrorRate;
7669 cellInfoGsm->signalStrengthGsm.timingAdvance =
7670 rillCellInfo->CellInfo.gsm.signalStrengthGsm.timingAdvance;
7671 break;
7672 }
7673
7674 case RIL_CELL_INFO_TYPE_WCDMA: {
7675 records[i].wcdma.resize(1);
7676 CellInfoWcdma *cellInfoWcdma = &records[i].wcdma[0];
7677 cellInfoWcdma->cellIdentityWcdma.mcc =
7678 std::to_string(rillCellInfo->CellInfo.wcdma.cellIdentityWcdma.mcc);
7679 cellInfoWcdma->cellIdentityWcdma.mnc =
7680 std::to_string(rillCellInfo->CellInfo.wcdma.cellIdentityWcdma.mnc);
7681 cellInfoWcdma->cellIdentityWcdma.lac =
7682 rillCellInfo->CellInfo.wcdma.cellIdentityWcdma.lac;
7683 cellInfoWcdma->cellIdentityWcdma.cid =
7684 rillCellInfo->CellInfo.wcdma.cellIdentityWcdma.cid;
7685 cellInfoWcdma->cellIdentityWcdma.psc =
7686 rillCellInfo->CellInfo.wcdma.cellIdentityWcdma.psc;
7687 cellInfoWcdma->cellIdentityWcdma.uarfcn =
7688 rillCellInfo->CellInfo.wcdma.cellIdentityWcdma.uarfcn;
7689 cellInfoWcdma->signalStrengthWcdma.signalStrength =
7690 rillCellInfo->CellInfo.wcdma.signalStrengthWcdma.signalStrength;
7691 cellInfoWcdma->signalStrengthWcdma.bitErrorRate =
7692 rillCellInfo->CellInfo.wcdma.signalStrengthWcdma.bitErrorRate;
7693 break;
7694 }
7695
7696 case RIL_CELL_INFO_TYPE_CDMA: {
7697 records[i].cdma.resize(1);
7698 CellInfoCdma *cellInfoCdma = &records[i].cdma[0];
7699 cellInfoCdma->cellIdentityCdma.networkId =
7700 rillCellInfo->CellInfo.cdma.cellIdentityCdma.networkId;
7701 cellInfoCdma->cellIdentityCdma.systemId =
7702 rillCellInfo->CellInfo.cdma.cellIdentityCdma.systemId;
7703 cellInfoCdma->cellIdentityCdma.baseStationId =
7704 rillCellInfo->CellInfo.cdma.cellIdentityCdma.basestationId;
7705 cellInfoCdma->cellIdentityCdma.longitude =
7706 rillCellInfo->CellInfo.cdma.cellIdentityCdma.longitude;
7707 cellInfoCdma->cellIdentityCdma.latitude =
7708 rillCellInfo->CellInfo.cdma.cellIdentityCdma.latitude;
7709 cellInfoCdma->signalStrengthCdma.dbm =
7710 rillCellInfo->CellInfo.cdma.signalStrengthCdma.dbm;
7711 cellInfoCdma->signalStrengthCdma.ecio =
7712 rillCellInfo->CellInfo.cdma.signalStrengthCdma.ecio;
7713 cellInfoCdma->signalStrengthEvdo.dbm =
7714 rillCellInfo->CellInfo.cdma.signalStrengthEvdo.dbm;
7715 cellInfoCdma->signalStrengthEvdo.ecio =
7716 rillCellInfo->CellInfo.cdma.signalStrengthEvdo.ecio;
7717 cellInfoCdma->signalStrengthEvdo.signalNoiseRatio =
7718 rillCellInfo->CellInfo.cdma.signalStrengthEvdo.signalNoiseRatio;
7719 break;
7720 }
7721
7722 case RIL_CELL_INFO_TYPE_LTE: {
7723 records[i].lte.resize(1);
7724 CellInfoLte *cellInfoLte = &records[i].lte[0];
7725 cellInfoLte->cellIdentityLte.mcc =
7726 std::to_string(rillCellInfo->CellInfo.lte.cellIdentityLte.mcc);
7727 cellInfoLte->cellIdentityLte.mnc =
7728 std::to_string(rillCellInfo->CellInfo.lte.cellIdentityLte.mnc);
7729 cellInfoLte->cellIdentityLte.ci =
7730 rillCellInfo->CellInfo.lte.cellIdentityLte.ci;
7731 cellInfoLte->cellIdentityLte.pci =
7732 rillCellInfo->CellInfo.lte.cellIdentityLte.pci;
7733 cellInfoLte->cellIdentityLte.tac =
7734 rillCellInfo->CellInfo.lte.cellIdentityLte.tac;
7735 cellInfoLte->cellIdentityLte.earfcn =
7736 rillCellInfo->CellInfo.lte.cellIdentityLte.earfcn;
7737 cellInfoLte->signalStrengthLte.signalStrength =
7738 rillCellInfo->CellInfo.lte.signalStrengthLte.signalStrength;
7739 cellInfoLte->signalStrengthLte.rsrp =
7740 rillCellInfo->CellInfo.lte.signalStrengthLte.rsrp;
7741 cellInfoLte->signalStrengthLte.rsrq =
7742 rillCellInfo->CellInfo.lte.signalStrengthLte.rsrq;
7743 cellInfoLte->signalStrengthLte.rssnr =
7744 rillCellInfo->CellInfo.lte.signalStrengthLte.rssnr;
7745 cellInfoLte->signalStrengthLte.cqi =
7746 rillCellInfo->CellInfo.lte.signalStrengthLte.cqi;
7747 cellInfoLte->signalStrengthLte.timingAdvance =
7748 rillCellInfo->CellInfo.lte.signalStrengthLte.timingAdvance;
7749 break;
7750 }
7751
7752 case RIL_CELL_INFO_TYPE_TD_SCDMA: {
7753 records[i].tdscdma.resize(1);
7754 CellInfoTdscdma *cellInfoTdscdma = &records[i].tdscdma[0];
7755 cellInfoTdscdma->cellIdentityTdscdma.mcc =
7756 std::to_string(rillCellInfo->CellInfo.tdscdma.cellIdentityTdscdma.mcc);
7757 cellInfoTdscdma->cellIdentityTdscdma.mnc =
7758 std::to_string(rillCellInfo->CellInfo.tdscdma.cellIdentityTdscdma.mnc);
7759 cellInfoTdscdma->cellIdentityTdscdma.lac =
7760 rillCellInfo->CellInfo.tdscdma.cellIdentityTdscdma.lac;
7761 cellInfoTdscdma->cellIdentityTdscdma.cid =
7762 rillCellInfo->CellInfo.tdscdma.cellIdentityTdscdma.cid;
7763 cellInfoTdscdma->cellIdentityTdscdma.cpid =
7764 rillCellInfo->CellInfo.tdscdma.cellIdentityTdscdma.cpid;
7765 cellInfoTdscdma->signalStrengthTdscdma.rscp =
7766 rillCellInfo->CellInfo.tdscdma.signalStrengthTdscdma.rscp;
7767 break;
7768 }
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08007769 default: {
7770 break;
7771 }
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007772 }
7773 rillCellInfo += 1;
7774 }
7775}
7776
Amit Mahajan759786a2017-03-03 17:35:47 -08007777int radio::cellInfoListInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007778 int indicationType, int token, RIL_Errno e, void *response,
7779 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007780 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007781 if (response == NULL || responseLen % sizeof(RIL_CellInfo_v12) != 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007782 RLOGE("cellInfoListInd: invalid response");
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007783 return 0;
7784 }
7785
7786 hidl_vec<CellInfo> records;
7787 convertRilCellInfoListToHal(response, responseLen, records);
7788
Jayachandran C572f2f42017-03-25 14:30:13 -07007789#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007790 RLOGD("cellInfoListInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07007791#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007792 Return<void> retStatus = radioService[slotId]->mRadioIndication->cellInfoList(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007793 convertIntToRadioIndicationType(indicationType), records);
Amit Mahajan17249842017-01-19 15:05:45 -08007794 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007795 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007796 RLOGE("cellInfoListInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007797 }
7798
7799 return 0;
7800}
7801
Amit Mahajan759786a2017-03-03 17:35:47 -08007802int radio::imsNetworkStateChangedInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007803 int indicationType, int token, RIL_Errno e, void *response,
7804 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007805 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Jayachandran C572f2f42017-03-25 14:30:13 -07007806#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007807 RLOGD("imsNetworkStateChangedInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07007808#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007809 Return<void> retStatus = radioService[slotId]->mRadioIndication->imsNetworkStateChanged(
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("imsNetworkStateChangedInd: radioService[%d]->mRadioIndication == NULL",
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007814 slotId);
7815 }
7816
7817 return 0;
7818}
7819
Amit Mahajan759786a2017-03-03 17:35:47 -08007820int radio::subscriptionStatusChangedInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007821 int indicationType, int token, RIL_Errno e, void *response,
7822 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007823 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007824 if (response == NULL || responseLen != sizeof(int)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007825 RLOGE("subscriptionStatusChangedInd: invalid response");
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007826 return 0;
7827 }
7828 bool activate = ((int32_t *) response)[0];
Jayachandran C572f2f42017-03-25 14:30:13 -07007829#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007830 RLOGD("subscriptionStatusChangedInd: activate %d", activate);
Jayachandran C572f2f42017-03-25 14:30:13 -07007831#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007832 Return<void> retStatus = radioService[slotId]->mRadioIndication->subscriptionStatusChanged(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007833 convertIntToRadioIndicationType(indicationType), activate);
Amit Mahajan17249842017-01-19 15:05:45 -08007834 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007835 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007836 RLOGE("subscriptionStatusChangedInd: radioService[%d]->mRadioIndication == NULL",
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007837 slotId);
7838 }
7839
7840 return 0;
7841}
7842
Amit Mahajan759786a2017-03-03 17:35:47 -08007843int radio::srvccStateNotifyInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007844 int indicationType, int token, RIL_Errno e, void *response,
7845 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007846 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007847 if (response == NULL || responseLen != sizeof(int)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007848 RLOGE("srvccStateNotifyInd: invalid response");
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007849 return 0;
7850 }
7851 int32_t state = ((int32_t *) response)[0];
Jayachandran C572f2f42017-03-25 14:30:13 -07007852#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007853 RLOGD("srvccStateNotifyInd: rat %d", state);
Jayachandran C572f2f42017-03-25 14:30:13 -07007854#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007855 Return<void> retStatus = radioService[slotId]->mRadioIndication->srvccStateNotify(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007856 convertIntToRadioIndicationType(indicationType), (SrvccState) state);
Amit Mahajan17249842017-01-19 15:05:45 -08007857 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007858 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007859 RLOGE("srvccStateNotifyInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007860 }
7861
7862 return 0;
7863}
7864
7865void convertRilHardwareConfigListToHal(void *response, size_t responseLen,
7866 hidl_vec<HardwareConfig>& records) {
7867 int num = responseLen / sizeof(RIL_HardwareConfig);
7868 records.resize(num);
7869
7870 RIL_HardwareConfig *rilHardwareConfig = (RIL_HardwareConfig *) response;
7871 for (int i = 0; i < num; i++) {
7872 records[i].type = (HardwareConfigType) rilHardwareConfig[i].type;
7873 records[i].uuid = convertCharPtrToHidlString(rilHardwareConfig[i].uuid);
7874 records[i].state = (HardwareConfigState) rilHardwareConfig[i].state;
7875 switch (rilHardwareConfig[i].type) {
7876 case RIL_HARDWARE_CONFIG_MODEM: {
7877 records[i].modem.resize(1);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08007878 records[i].sim.resize(0);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007879 HardwareConfigModem *hwConfigModem = &records[i].modem[0];
7880 hwConfigModem->rat = rilHardwareConfig[i].cfg.modem.rat;
7881 hwConfigModem->maxVoice = rilHardwareConfig[i].cfg.modem.maxVoice;
7882 hwConfigModem->maxData = rilHardwareConfig[i].cfg.modem.maxData;
7883 hwConfigModem->maxStandby = rilHardwareConfig[i].cfg.modem.maxStandby;
7884 break;
7885 }
7886
7887 case RIL_HARDWARE_CONFIG_SIM: {
7888 records[i].sim.resize(1);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08007889 records[i].modem.resize(0);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007890 records[i].sim[0].modemUuid =
7891 convertCharPtrToHidlString(rilHardwareConfig[i].cfg.sim.modemUuid);
7892 break;
7893 }
7894 }
7895 }
7896}
7897
Amit Mahajan759786a2017-03-03 17:35:47 -08007898int radio::hardwareConfigChangedInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007899 int indicationType, int token, RIL_Errno e, void *response,
7900 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007901 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007902 if (response == NULL || responseLen % sizeof(RIL_HardwareConfig) != 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007903 RLOGE("hardwareConfigChangedInd: invalid response");
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007904 return 0;
7905 }
7906
7907 hidl_vec<HardwareConfig> configs;
7908 convertRilHardwareConfigListToHal(response, responseLen, configs);
7909
Jayachandran C572f2f42017-03-25 14:30:13 -07007910#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007911 RLOGD("hardwareConfigChangedInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07007912#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007913 Return<void> retStatus = radioService[slotId]->mRadioIndication->hardwareConfigChanged(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007914 convertIntToRadioIndicationType(indicationType), configs);
Amit Mahajan17249842017-01-19 15:05:45 -08007915 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007916 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007917 RLOGE("hardwareConfigChangedInd: radioService[%d]->mRadioIndication == NULL",
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007918 slotId);
7919 }
7920
7921 return 0;
7922}
7923
7924void convertRilRadioCapabilityToHal(void *response, size_t responseLen, RadioCapability& rc) {
7925 RIL_RadioCapability *rilRadioCapability = (RIL_RadioCapability *) response;
7926 rc.session = rilRadioCapability->session;
7927 rc.phase = (android::hardware::radio::V1_0::RadioCapabilityPhase) rilRadioCapability->phase;
7928 rc.raf = rilRadioCapability->rat;
7929 rc.logicalModemUuid = convertCharPtrToHidlString(rilRadioCapability->logicalModemUuid);
7930 rc.status = (android::hardware::radio::V1_0::RadioCapabilityStatus) rilRadioCapability->status;
7931}
7932
Amit Mahajan759786a2017-03-03 17:35:47 -08007933int radio::radioCapabilityIndicationInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007934 int indicationType, int token, RIL_Errno e, void *response,
7935 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007936 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007937 if (response == NULL || responseLen != sizeof(RIL_RadioCapability)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007938 RLOGE("radioCapabilityIndicationInd: invalid response");
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007939 return 0;
7940 }
7941
Jack Yuf68e0da2017-02-07 14:53:09 -08007942 RadioCapability rc = {};
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007943 convertRilRadioCapabilityToHal(response, responseLen, rc);
7944
Jayachandran C572f2f42017-03-25 14:30:13 -07007945#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007946 RLOGD("radioCapabilityIndicationInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07007947#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007948 Return<void> retStatus = radioService[slotId]->mRadioIndication->radioCapabilityIndication(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007949 convertIntToRadioIndicationType(indicationType), rc);
Amit Mahajan17249842017-01-19 15:05:45 -08007950 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007951 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007952 RLOGE("radioCapabilityIndicationInd: radioService[%d]->mRadioIndication == NULL",
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007953 slotId);
7954 }
7955
7956 return 0;
7957}
7958
7959bool isServiceTypeCfQuery(RIL_SsServiceType serType, RIL_SsRequestType reqType) {
7960 if ((reqType == SS_INTERROGATION) &&
7961 (serType == SS_CFU ||
7962 serType == SS_CF_BUSY ||
7963 serType == SS_CF_NO_REPLY ||
7964 serType == SS_CF_NOT_REACHABLE ||
7965 serType == SS_CF_ALL ||
7966 serType == SS_CF_ALL_CONDITIONAL)) {
7967 return true;
7968 }
7969 return false;
7970}
7971
Amit Mahajan759786a2017-03-03 17:35:47 -08007972int radio::onSupplementaryServiceIndicationInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007973 int indicationType, int token, RIL_Errno e,
7974 void *response, size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007975 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007976 if (response == NULL || responseLen != sizeof(RIL_StkCcUnsolSsResponse)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007977 RLOGE("onSupplementaryServiceIndicationInd: invalid response");
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007978 return 0;
7979 }
7980
7981 RIL_StkCcUnsolSsResponse *rilSsResponse = (RIL_StkCcUnsolSsResponse *) response;
Jack Yuf68e0da2017-02-07 14:53:09 -08007982 StkCcUnsolSsResult ss = {};
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007983 ss.serviceType = (SsServiceType) rilSsResponse->serviceType;
7984 ss.requestType = (SsRequestType) rilSsResponse->requestType;
7985 ss.teleserviceType = (SsTeleserviceType) rilSsResponse->teleserviceType;
7986 ss.serviceClass = rilSsResponse->serviceClass;
7987 ss.result = (RadioError) rilSsResponse->result;
7988
7989 if (isServiceTypeCfQuery(rilSsResponse->serviceType, rilSsResponse->requestType)) {
Jayachandran C572f2f42017-03-25 14:30:13 -07007990#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007991 RLOGD("onSupplementaryServiceIndicationInd CF type, num of Cf elements %d",
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007992 rilSsResponse->cfData.numValidIndexes);
Jayachandran C572f2f42017-03-25 14:30:13 -07007993#endif
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007994 if (rilSsResponse->cfData.numValidIndexes > NUM_SERVICE_CLASSES) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007995 RLOGE("onSupplementaryServiceIndicationInd numValidIndexes is greater than "
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007996 "max value %d, truncating it to max value", NUM_SERVICE_CLASSES);
7997 rilSsResponse->cfData.numValidIndexes = NUM_SERVICE_CLASSES;
7998 }
7999
8000 ss.cfData.resize(1);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08008001 ss.ssInfo.resize(0);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008002
8003 /* number of call info's */
8004 ss.cfData[0].cfInfo.resize(rilSsResponse->cfData.numValidIndexes);
8005
8006 for (int i = 0; i < rilSsResponse->cfData.numValidIndexes; i++) {
8007 RIL_CallForwardInfo cf = rilSsResponse->cfData.cfInfo[i];
8008 CallForwardInfo *cfInfo = &ss.cfData[0].cfInfo[i];
8009
8010 cfInfo->status = (CallForwardInfoStatus) cf.status;
8011 cfInfo->reason = cf.reason;
8012 cfInfo->serviceClass = cf.serviceClass;
8013 cfInfo->toa = cf.toa;
8014 cfInfo->number = convertCharPtrToHidlString(cf.number);
8015 cfInfo->timeSeconds = cf.timeSeconds;
Jayachandran C572f2f42017-03-25 14:30:13 -07008016#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08008017 RLOGD("onSupplementaryServiceIndicationInd: "
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008018 "Data: %d,reason=%d,cls=%d,toa=%d,num=%s,tout=%d],", cf.status,
8019 cf.reason, cf.serviceClass, cf.toa, (char*)cf.number, cf.timeSeconds);
Jayachandran C572f2f42017-03-25 14:30:13 -07008020#endif
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008021 }
8022 } else {
8023 ss.ssInfo.resize(1);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08008024 ss.cfData.resize(0);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008025
8026 /* each int */
8027 ss.ssInfo[0].ssInfo.resize(SS_INFO_MAX);
8028 for (int i = 0; i < SS_INFO_MAX; i++) {
Jayachandran C572f2f42017-03-25 14:30:13 -07008029#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08008030 RLOGD("onSupplementaryServiceIndicationInd: Data: %d",
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008031 rilSsResponse->ssInfo[i]);
Jayachandran C572f2f42017-03-25 14:30:13 -07008032#endif
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008033 ss.ssInfo[0].ssInfo[i] = rilSsResponse->ssInfo[i];
8034 }
8035 }
8036
Jayachandran C572f2f42017-03-25 14:30:13 -07008037#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08008038 RLOGD("onSupplementaryServiceIndicationInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07008039#endif
Amit Mahajan17249842017-01-19 15:05:45 -08008040 Return<void> retStatus = radioService[slotId]->mRadioIndication->
8041 onSupplementaryServiceIndication(convertIntToRadioIndicationType(indicationType),
8042 ss);
8043 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008044 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008045 RLOGE("onSupplementaryServiceIndicationInd: "
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008046 "radioService[%d]->mRadioIndication == NULL", slotId);
8047 }
8048
8049 return 0;
8050}
8051
Amit Mahajan759786a2017-03-03 17:35:47 -08008052int radio::stkCallControlAlphaNotifyInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008053 int indicationType, int token, RIL_Errno e, void *response,
8054 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08008055 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008056 if (response == NULL || responseLen == 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008057 RLOGE("stkCallControlAlphaNotifyInd: invalid response");
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008058 return 0;
8059 }
Jayachandran C572f2f42017-03-25 14:30:13 -07008060#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08008061 RLOGD("stkCallControlAlphaNotifyInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07008062#endif
Amit Mahajan17249842017-01-19 15:05:45 -08008063 Return<void> retStatus = radioService[slotId]->mRadioIndication->stkCallControlAlphaNotify(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008064 convertIntToRadioIndicationType(indicationType),
8065 convertCharPtrToHidlString((char *) response));
Amit Mahajan17249842017-01-19 15:05:45 -08008066 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008067 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008068 RLOGE("stkCallControlAlphaNotifyInd: radioService[%d]->mRadioIndication == NULL",
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008069 slotId);
8070 }
8071
8072 return 0;
8073}
8074
8075void convertRilLceDataInfoToHal(void *response, size_t responseLen, LceDataInfo& lce) {
8076 RIL_LceDataInfo *rilLceDataInfo = (RIL_LceDataInfo *)response;
8077 lce.lastHopCapacityKbps = rilLceDataInfo->last_hop_capacity_kbps;
8078 lce.confidenceLevel = rilLceDataInfo->confidence_level;
8079 lce.lceSuspended = rilLceDataInfo->lce_suspended;
8080}
8081
Amit Mahajan759786a2017-03-03 17:35:47 -08008082int radio::lceDataInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008083 int indicationType, int token, RIL_Errno e, void *response,
8084 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08008085 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008086 if (response == NULL || responseLen != sizeof(RIL_LceDataInfo)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008087 RLOGE("lceDataInd: invalid response");
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008088 return 0;
8089 }
8090
Jack Yuf68e0da2017-02-07 14:53:09 -08008091 LceDataInfo lce = {};
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008092 convertRilLceDataInfoToHal(response, responseLen, lce);
Jayachandran C572f2f42017-03-25 14:30:13 -07008093#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08008094 RLOGD("lceDataInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07008095#endif
Amit Mahajan17249842017-01-19 15:05:45 -08008096 Return<void> retStatus = radioService[slotId]->mRadioIndication->lceData(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008097 convertIntToRadioIndicationType(indicationType), lce);
Amit Mahajan17249842017-01-19 15:05:45 -08008098 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008099 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008100 RLOGE("lceDataInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008101 }
8102
8103 return 0;
8104}
8105
Amit Mahajan759786a2017-03-03 17:35:47 -08008106int radio::pcoDataInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008107 int indicationType, int token, RIL_Errno e, void *response,
8108 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08008109 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008110 if (response == NULL || responseLen != sizeof(RIL_PCO_Data)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008111 RLOGE("pcoDataInd: invalid response");
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008112 return 0;
8113 }
8114
Jack Yuf68e0da2017-02-07 14:53:09 -08008115 PcoDataInfo pco = {};
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008116 RIL_PCO_Data *rilPcoData = (RIL_PCO_Data *)response;
8117 pco.cid = rilPcoData->cid;
8118 pco.bearerProto = convertCharPtrToHidlString(rilPcoData->bearer_proto);
8119 pco.pcoId = rilPcoData->pco_id;
8120 pco.contents.setToExternal((uint8_t *) rilPcoData->contents, rilPcoData->contents_length);
8121
Jayachandran C572f2f42017-03-25 14:30:13 -07008122#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08008123 RLOGD("pcoDataInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07008124#endif
Amit Mahajan17249842017-01-19 15:05:45 -08008125 Return<void> retStatus = radioService[slotId]->mRadioIndication->pcoData(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008126 convertIntToRadioIndicationType(indicationType), pco);
Amit Mahajan17249842017-01-19 15:05:45 -08008127 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008128 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008129 RLOGE("pcoDataInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008130 }
8131
8132 return 0;
8133}
8134
Amit Mahajan759786a2017-03-03 17:35:47 -08008135int radio::modemResetInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008136 int indicationType, int token, RIL_Errno e, void *response,
8137 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08008138 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008139 if (response == NULL || responseLen == 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008140 RLOGE("modemResetInd: invalid response");
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008141 return 0;
8142 }
Jayachandran C572f2f42017-03-25 14:30:13 -07008143#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08008144 RLOGD("modemResetInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07008145#endif
Amit Mahajan17249842017-01-19 15:05:45 -08008146 Return<void> retStatus = radioService[slotId]->mRadioIndication->modemReset(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008147 convertIntToRadioIndicationType(indicationType),
8148 convertCharPtrToHidlString((char *) response));
Amit Mahajan17249842017-01-19 15:05:45 -08008149 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008150 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008151 RLOGE("modemResetInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008152 }
8153
8154 return 0;
8155}
8156
yinxu584379e2017-05-03 15:15:19 -07008157int radio::networkScanResultInd(int slotId,
8158 int indicationType, int token, RIL_Errno e, void *response,
yinxu8688abd2017-05-22 11:26:45 -07008159 size_t responseLen) {
yinxu584379e2017-05-03 15:15:19 -07008160#if VDBG
8161 RLOGD("networkScanResultInd");
8162#endif
yinxu8688abd2017-05-22 11:26:45 -07008163 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
8164 if (response == NULL || responseLen == 0) {
8165 RLOGE("networkScanResultInd: invalid response");
8166 return 0;
8167 }
8168 RLOGD("networkScanResultInd");
8169
8170#if VDBG
8171 RLOGD("networkScanResultInd");
8172#endif
8173
8174 Return<sp<::android::hardware::radio::V1_1::IRadioIndication>> ret =
8175 ::android::hardware::radio::V1_1::IRadioIndication::castFrom(
8176 radioService[slotId]->mRadioIndication);
8177 if (ret.isOk()) {
8178 RIL_NetworkScanResult *networkScanResult = (RIL_NetworkScanResult *) response;
8179
8180 ::android::hardware::radio::V1_1::NetworkScanResult result;
8181 result.status =
8182 (::android::hardware::radio::V1_1::ScanStatus) networkScanResult->status;
8183 result.error = (RadioError) e;
8184 convertRilCellInfoListToHal(
8185 networkScanResult->network_infos,
8186 networkScanResult->network_infos_length * sizeof(RIL_CellInfo_v12),
8187 result.networkInfos);
8188
8189 sp<::android::hardware::radio::V1_1::IRadioIndication> radioIndicationV1_1 = ret;
8190 Return<void> retStatus = radioIndicationV1_1->networkScanResult(
8191 convertIntToRadioIndicationType(indicationType), result);
8192 radioService[slotId]->checkReturnStatus(retStatus);
8193 } else {
8194 RLOGE("networkScanResultInd: ret.isOk() == false for radioService[%d]", slotId);
8195 }
8196 } else {
8197 RLOGE("networkScanResultInd: radioService[%d]->mRadioIndication == NULL", slotId);
8198 }
yinxu584379e2017-05-03 15:15:19 -07008199 return 0;
8200}
8201
pkanwarc61837e2017-03-17 12:49:34 -07008202int radio::carrierInfoForImsiEncryption(int slotId,
8203 int indicationType, int token, RIL_Errno e, void *response,
8204 size_t responseLen) {
8205 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
8206 if (response == NULL || responseLen == 0) {
8207 RLOGE("carrierInfoForImsiEncryption: invalid response");
8208 return 0;
8209 }
8210 RLOGD("carrierInfoForImsiEncryption");
8211 Return<sp<::android::hardware::radio::V1_1::IRadioIndication>> ret =
8212 ::android::hardware::radio::V1_1::IRadioIndication::castFrom(
8213 radioService[slotId]->mRadioIndication);
8214 if (ret.isOk()) {
8215 sp<::android::hardware::radio::V1_1::IRadioIndication> radioIndicationV1_1 = ret;
8216 Return<void> retStatus = radioIndicationV1_1->carrierInfoForImsiEncryption(
8217 convertIntToRadioIndicationType(indicationType));
8218 radioService[slotId]->checkReturnStatus(retStatus);
8219 } else {
8220 RLOGE("carrierInfoForImsiEncryptionResponse: ret.isOk() == false for radioService[%d]",
8221 slotId);
8222 }
8223 } else {
8224 RLOGE("carrierInfoForImsiEncryption: radioService[%d]->mRadioIndication == NULL", slotId);
8225 }
8226
8227 return 0;
8228}
8229
Amit Mahajan759786a2017-03-03 17:35:47 -08008230int radio::oemHookRawInd(int slotId,
Amit Mahajan439da362017-02-13 17:43:04 -08008231 int indicationType, int token, RIL_Errno e, void *response,
8232 size_t responseLen) {
8233 if (oemHookService[slotId] != NULL && oemHookService[slotId]->mOemHookIndication != NULL) {
8234 if (response == NULL || responseLen == 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008235 RLOGE("oemHookRawInd: invalid response");
Amit Mahajan439da362017-02-13 17:43:04 -08008236 return 0;
8237 }
8238
8239 hidl_vec<uint8_t> data;
8240 data.setToExternal((uint8_t *) response, responseLen);
Jayachandran C572f2f42017-03-25 14:30:13 -07008241#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08008242 RLOGD("oemHookRawInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07008243#endif
Amit Mahajan439da362017-02-13 17:43:04 -08008244 Return<void> retStatus = oemHookService[slotId]->mOemHookIndication->oemHookRaw(
8245 convertIntToRadioIndicationType(indicationType), data);
Amit Mahajand423d192017-03-16 17:04:01 -07008246 checkReturnStatus(slotId, retStatus, false);
Amit Mahajan439da362017-02-13 17:43:04 -08008247 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008248 RLOGE("oemHookRawInd: oemHookService[%d]->mOemHookIndication == NULL", slotId);
Amit Mahajan439da362017-02-13 17:43:04 -08008249 }
8250
8251 return 0;
8252}
8253
Amit Mahajancd77a5b2016-08-25 11:19:21 -07008254void radio::registerService(RIL_RadioFunctions *callbacks, CommandInfo *commands) {
8255 using namespace android::hardware;
8256 int simCount = 1;
Amit Mahajan439da362017-02-13 17:43:04 -08008257 const char *serviceNames[] = {
Amit Mahajan7955c432017-03-28 11:17:55 -07008258 android::RIL_getServiceName()
Amit Mahajancd77a5b2016-08-25 11:19:21 -07008259 #if (SIM_COUNT >= 2)
Amit Mahajan7955c432017-03-28 11:17:55 -07008260 , RIL2_SERVICE_NAME
Amit Mahajancd77a5b2016-08-25 11:19:21 -07008261 #if (SIM_COUNT >= 3)
Amit Mahajan7955c432017-03-28 11:17:55 -07008262 , RIL3_SERVICE_NAME
Amit Mahajancd77a5b2016-08-25 11:19:21 -07008263 #if (SIM_COUNT >= 4)
Amit Mahajan7955c432017-03-28 11:17:55 -07008264 , RIL4_SERVICE_NAME
Amit Mahajan439da362017-02-13 17:43:04 -08008265 #endif
8266 #endif
8267 #endif
8268 };
8269
Amit Mahajancd77a5b2016-08-25 11:19:21 -07008270 #if (SIM_COUNT >= 2)
8271 simCount = SIM_COUNT;
8272 #endif
8273
8274 configureRpcThreadpool(1, true /* callerWillJoin */);
8275 for (int i = 0; i < simCount; i++) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08008276 pthread_rwlock_t *radioServiceRwlockPtr = getRadioServiceRwlock(i);
8277 int ret = pthread_rwlock_wrlock(radioServiceRwlockPtr);
8278 assert(ret == 0);
8279
Amit Mahajancd77a5b2016-08-25 11:19:21 -07008280 radioService[i] = new RadioImpl;
Sanket Padawef220dc52017-01-02 23:46:00 -08008281 radioService[i]->mSlotId = i;
Amit Mahajan439da362017-02-13 17:43:04 -08008282 oemHookService[i] = new OemHookImpl;
8283 oemHookService[i]->mSlotId = i;
pkanwarc61837e2017-03-17 12:49:34 -07008284 RLOGD("registerService: starting android::hardware::radio::V1_1::IRadio %s",
8285 serviceNames[i]);
Amit Mahajancd77a5b2016-08-25 11:19:21 -07008286 android::status_t status = radioService[i]->registerAsService(serviceNames[i]);
Amit Mahajan7955c432017-03-28 11:17:55 -07008287 status = oemHookService[i]->registerAsService(serviceNames[i]);
Amit Mahajan932e08e2017-01-24 05:45:02 -08008288
8289 ret = pthread_rwlock_unlock(radioServiceRwlockPtr);
8290 assert(ret == 0);
Amit Mahajancd77a5b2016-08-25 11:19:21 -07008291 }
8292
Sanket Padawe378ccdd2017-01-24 14:11:12 -08008293 s_vendorFunctions = callbacks;
Amit Mahajancd77a5b2016-08-25 11:19:21 -07008294 s_commands = commands;
8295}
8296
8297void rilc_thread_pool() {
8298 joinRpcThreadpool();
Amit Mahajan932e08e2017-01-24 05:45:02 -08008299}
8300
8301pthread_rwlock_t * radio::getRadioServiceRwlock(int slotId) {
8302 pthread_rwlock_t *radioServiceRwlockPtr = &radioServiceRwlock;
8303
8304 #if (SIM_COUNT >= 2)
8305 if (slotId == 2) radioServiceRwlockPtr = &radioServiceRwlock2;
8306 #if (SIM_COUNT >= 3)
8307 if (slotId == 3) radioServiceRwlockPtr = &radioServiceRwlock3;
8308 #if (SIM_COUNT >= 4)
8309 if (slotId == 4) radioServiceRwlockPtr = &radioServiceRwlock4;
8310 #endif
8311 #endif
8312 #endif
8313
8314 return radioServiceRwlockPtr;
Sanket Padawe0de29d12017-02-10 13:19:47 -08008315}