blob: 205436ee69a2c9e5af9d4b85a2b15044ed5cc856 [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
1375 std::memcpy(&ras_to.bands.geran_bands, bands, ras_to.bands_length * sizeof(uint32_t));
1376 }
1377
1378 s_vendorFunctions->onRequest(
1379 RIL_REQUEST_START_NETWORK_SCAN, &scan_request, sizeof(scan_request), pRI);
1380
yinxu584379e2017-05-03 15:15:19 -07001381 return Void();
1382}
1383
1384Return<void> RadioImpl::stopNetworkScan(int32_t serial) {
1385#if VDBG
1386 RLOGD("stopNetworkScan: serial %d", serial);
1387#endif
yinxu584379e2017-05-03 15:15:19 -07001388 dispatchVoid(serial, mSlotId, RIL_REQUEST_STOP_NETWORK_SCAN);
1389 return Void();
1390}
1391
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001392Return<void> RadioImpl::startDtmf(int32_t serial, const hidl_string& s) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001393#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001394 RLOGD("startDtmf: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001395#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001396 dispatchString(serial, mSlotId, RIL_REQUEST_DTMF_START,
Scott Randolphc7213312017-04-03 14:06:40 -07001397 s.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001398 return Void();
1399}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001400
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001401Return<void> RadioImpl::stopDtmf(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001402#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001403 RLOGD("stopDtmf: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001404#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001405 dispatchVoid(serial, mSlotId, RIL_REQUEST_DTMF_STOP);
1406 return Void();
1407}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001408
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001409Return<void> RadioImpl::getBasebandVersion(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001410#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001411 RLOGD("getBasebandVersion: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001412#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001413 dispatchVoid(serial, mSlotId, RIL_REQUEST_BASEBAND_VERSION);
1414 return Void();
1415}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001416
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001417Return<void> RadioImpl::separateConnection(int32_t serial, int32_t gsmIndex) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001418#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001419 RLOGD("separateConnection: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001420#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001421 dispatchInts(serial, mSlotId, RIL_REQUEST_SEPARATE_CONNECTION, 1, gsmIndex);
1422 return Void();
1423}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001424
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001425Return<void> RadioImpl::setMute(int32_t serial, bool enable) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001426#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001427 RLOGD("setMute: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001428#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001429 dispatchInts(serial, mSlotId, RIL_REQUEST_SET_MUTE, 1, BOOL_TO_INT(enable));
1430 return Void();
1431}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001432
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001433Return<void> RadioImpl::getMute(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001434#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001435 RLOGD("getMute: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001436#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001437 dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_MUTE);
1438 return Void();
1439}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001440
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001441Return<void> RadioImpl::getClip(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001442#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001443 RLOGD("getClip: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001444#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001445 dispatchVoid(serial, mSlotId, RIL_REQUEST_QUERY_CLIP);
1446 return Void();
1447}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001448
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001449Return<void> RadioImpl::getDataCallList(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001450#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001451 RLOGD("getDataCallList: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001452#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001453 dispatchVoid(serial, mSlotId, RIL_REQUEST_DATA_CALL_LIST);
1454 return Void();
1455}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001456
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001457Return<void> RadioImpl::setSuppServiceNotifications(int32_t serial, bool enable) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001458#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001459 RLOGD("setSuppServiceNotifications: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001460#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001461 dispatchInts(serial, mSlotId, RIL_REQUEST_SET_SUPP_SVC_NOTIFICATION, 1,
1462 BOOL_TO_INT(enable));
1463 return Void();
1464}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001465
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001466Return<void> RadioImpl::writeSmsToSim(int32_t serial, const SmsWriteArgs& smsWriteArgs) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001467#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001468 RLOGD("writeSmsToSim: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001469#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001470 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_WRITE_SMS_TO_SIM);
1471 if (pRI == NULL) {
1472 return Void();
1473 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001474
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001475 RIL_SMS_WriteArgs args;
1476 args.status = (int) smsWriteArgs.status;
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001477
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001478 int len;
1479 if (!copyHidlStringToRil(&args.pdu, smsWriteArgs.pdu, pRI)) {
1480 return Void();
1481 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001482
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001483 if (!copyHidlStringToRil(&args.smsc, smsWriteArgs.smsc, pRI)) {
1484 memsetAndFreeStrings(1, args.pdu);
1485 return Void();
1486 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001487
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001488 s_vendorFunctions->onRequest(RIL_REQUEST_WRITE_SMS_TO_SIM, &args, sizeof(args), pRI);
1489
1490 memsetAndFreeStrings(2, args.smsc, args.pdu);
1491
1492 return Void();
1493}
1494
1495Return<void> RadioImpl::deleteSmsOnSim(int32_t serial, int32_t index) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001496#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001497 RLOGD("deleteSmsOnSim: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001498#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001499 dispatchInts(serial, mSlotId, RIL_REQUEST_DELETE_SMS_ON_SIM, 1, index);
1500 return Void();
1501}
1502
1503Return<void> RadioImpl::setBandMode(int32_t serial, RadioBandMode mode) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001504#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001505 RLOGD("setBandMode: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001506#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001507 dispatchInts(serial, mSlotId, RIL_REQUEST_SET_BAND_MODE, 1, mode);
1508 return Void();
1509}
1510
1511Return<void> RadioImpl::getAvailableBandModes(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001512#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001513 RLOGD("getAvailableBandModes: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001514#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001515 dispatchVoid(serial, mSlotId, RIL_REQUEST_QUERY_AVAILABLE_BAND_MODE);
1516 return Void();
1517}
1518
1519Return<void> RadioImpl::sendEnvelope(int32_t serial, const hidl_string& command) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001520#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001521 RLOGD("sendEnvelope: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001522#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001523 dispatchString(serial, mSlotId, RIL_REQUEST_STK_SEND_ENVELOPE_COMMAND,
Scott Randolphc7213312017-04-03 14:06:40 -07001524 command.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001525 return Void();
1526}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001527
1528Return<void> RadioImpl::sendTerminalResponseToSim(int32_t serial,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001529 const hidl_string& commandResponse) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001530#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001531 RLOGD("sendTerminalResponseToSim: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001532#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001533 dispatchString(serial, mSlotId, RIL_REQUEST_STK_SEND_TERMINAL_RESPONSE,
Scott Randolphc7213312017-04-03 14:06:40 -07001534 commandResponse.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001535 return Void();
1536}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001537
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001538Return<void> RadioImpl::handleStkCallSetupRequestFromSim(int32_t serial, bool accept) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001539#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001540 RLOGD("handleStkCallSetupRequestFromSim: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001541#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001542 dispatchInts(serial, mSlotId, RIL_REQUEST_STK_HANDLE_CALL_SETUP_REQUESTED_FROM_SIM,
1543 1, BOOL_TO_INT(accept));
1544 return Void();
1545}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001546
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001547Return<void> RadioImpl::explicitCallTransfer(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001548#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001549 RLOGD("explicitCallTransfer: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001550#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001551 dispatchVoid(serial, mSlotId, RIL_REQUEST_EXPLICIT_CALL_TRANSFER);
1552 return Void();
1553}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001554
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001555Return<void> RadioImpl::setPreferredNetworkType(int32_t serial, PreferredNetworkType nwType) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001556#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001557 RLOGD("setPreferredNetworkType: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001558#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001559 dispatchInts(serial, mSlotId, RIL_REQUEST_SET_PREFERRED_NETWORK_TYPE, 1, nwType);
1560 return Void();
1561}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001562
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001563Return<void> RadioImpl::getPreferredNetworkType(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001564#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001565 RLOGD("getPreferredNetworkType: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001566#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001567 dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_PREFERRED_NETWORK_TYPE);
1568 return Void();
1569}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001570
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001571Return<void> RadioImpl::getNeighboringCids(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001572#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001573 RLOGD("getNeighboringCids: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001574#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001575 dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_NEIGHBORING_CELL_IDS);
1576 return Void();
1577}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001578
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001579Return<void> RadioImpl::setLocationUpdates(int32_t serial, bool enable) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001580#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001581 RLOGD("setLocationUpdates: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001582#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001583 dispatchInts(serial, mSlotId, RIL_REQUEST_SET_LOCATION_UPDATES, 1, BOOL_TO_INT(enable));
1584 return Void();
1585}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001586
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001587Return<void> RadioImpl::setCdmaSubscriptionSource(int32_t serial, CdmaSubscriptionSource cdmaSub) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001588#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001589 RLOGD("setCdmaSubscriptionSource: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001590#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001591 dispatchInts(serial, mSlotId, RIL_REQUEST_CDMA_SET_SUBSCRIPTION_SOURCE, 1, cdmaSub);
1592 return Void();
1593}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001594
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001595Return<void> RadioImpl::setCdmaRoamingPreference(int32_t serial, CdmaRoamingType type) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001596#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001597 RLOGD("setCdmaRoamingPreference: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001598#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001599 dispatchInts(serial, mSlotId, RIL_REQUEST_CDMA_SET_ROAMING_PREFERENCE, 1, type);
1600 return Void();
1601}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001602
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001603Return<void> RadioImpl::getCdmaRoamingPreference(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001604#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001605 RLOGD("getCdmaRoamingPreference: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001606#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001607 dispatchVoid(serial, mSlotId, RIL_REQUEST_CDMA_QUERY_ROAMING_PREFERENCE);
1608 return Void();
1609}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001610
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001611Return<void> RadioImpl::setTTYMode(int32_t serial, TtyMode mode) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001612#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001613 RLOGD("setTTYMode: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001614#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001615 dispatchInts(serial, mSlotId, RIL_REQUEST_SET_TTY_MODE, 1, mode);
1616 return Void();
1617}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001618
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001619Return<void> RadioImpl::getTTYMode(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001620#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001621 RLOGD("getTTYMode: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001622#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001623 dispatchVoid(serial, mSlotId, RIL_REQUEST_QUERY_TTY_MODE);
1624 return Void();
1625}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001626
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001627Return<void> RadioImpl::setPreferredVoicePrivacy(int32_t serial, bool enable) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001628#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001629 RLOGD("setPreferredVoicePrivacy: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001630#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001631 dispatchInts(serial, mSlotId, RIL_REQUEST_CDMA_SET_PREFERRED_VOICE_PRIVACY_MODE,
1632 1, BOOL_TO_INT(enable));
1633 return Void();
1634}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001635
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001636Return<void> RadioImpl::getPreferredVoicePrivacy(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001637#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001638 RLOGD("getPreferredVoicePrivacy: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001639#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001640 dispatchVoid(serial, mSlotId, RIL_REQUEST_CDMA_QUERY_PREFERRED_VOICE_PRIVACY_MODE);
1641 return Void();
1642}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001643
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001644Return<void> RadioImpl::sendCDMAFeatureCode(int32_t serial, const hidl_string& featureCode) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001645#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001646 RLOGD("sendCDMAFeatureCode: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001647#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001648 dispatchString(serial, mSlotId, RIL_REQUEST_CDMA_FLASH,
Scott Randolphc7213312017-04-03 14:06:40 -07001649 featureCode.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001650 return Void();
1651}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001652
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001653Return<void> RadioImpl::sendBurstDtmf(int32_t serial, const hidl_string& dtmf, int32_t on,
1654 int32_t off) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001655#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001656 RLOGD("sendBurstDtmf: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001657#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001658 dispatchStrings(serial, mSlotId, RIL_REQUEST_CDMA_BURST_DTMF,
Scott Randolphc7213312017-04-03 14:06:40 -07001659 3, dtmf.c_str(), (std::to_string(on)).c_str(),
1660 (std::to_string(off)).c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001661 return Void();
1662}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001663
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001664void constructCdmaSms(RIL_CDMA_SMS_Message &rcsm, const CdmaSmsMessage& sms) {
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001665 rcsm.uTeleserviceID = sms.teleserviceId;
1666 rcsm.bIsServicePresent = BOOL_TO_INT(sms.isServicePresent);
1667 rcsm.uServicecategory = sms.serviceCategory;
1668 rcsm.sAddress.digit_mode = (RIL_CDMA_SMS_DigitMode) sms.address.digitMode;
1669 rcsm.sAddress.number_mode = (RIL_CDMA_SMS_NumberMode) sms.address.numberMode;
1670 rcsm.sAddress.number_type = (RIL_CDMA_SMS_NumberType) sms.address.numberType;
1671 rcsm.sAddress.number_plan = (RIL_CDMA_SMS_NumberPlan) sms.address.numberPlan;
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001672
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001673 rcsm.sAddress.number_of_digits = sms.address.digits.size();
1674 int digitLimit= MIN((rcsm.sAddress.number_of_digits), RIL_CDMA_SMS_ADDRESS_MAX);
1675 for (int i = 0; i < digitLimit; i++) {
1676 rcsm.sAddress.digits[i] = sms.address.digits[i];
1677 }
1678
1679 rcsm.sSubAddress.subaddressType = (RIL_CDMA_SMS_SubaddressType) sms.subAddress.subaddressType;
1680 rcsm.sSubAddress.odd = BOOL_TO_INT(sms.subAddress.odd);
1681
1682 rcsm.sSubAddress.number_of_digits = sms.subAddress.digits.size();
1683 digitLimit= MIN((rcsm.sSubAddress.number_of_digits), RIL_CDMA_SMS_SUBADDRESS_MAX);
1684 for (int i = 0; i < digitLimit; i++) {
1685 rcsm.sSubAddress.digits[i] = sms.subAddress.digits[i];
1686 }
1687
1688 rcsm.uBearerDataLen = sms.bearerData.size();
1689 digitLimit= MIN((rcsm.uBearerDataLen), RIL_CDMA_SMS_BEARER_DATA_MAX);
1690 for (int i = 0; i < digitLimit; i++) {
1691 rcsm.aBearerData[i] = sms.bearerData[i];
1692 }
1693}
1694
1695Return<void> RadioImpl::sendCdmaSms(int32_t serial, const CdmaSmsMessage& sms) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001696#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001697 RLOGD("sendCdmaSms: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001698#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001699 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_CDMA_SEND_SMS);
1700 if (pRI == NULL) {
1701 return Void();
1702 }
1703
Jack Yu8e732d42017-04-14 00:08:06 -07001704 RIL_CDMA_SMS_Message rcsm = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001705 constructCdmaSms(rcsm, sms);
1706
1707 s_vendorFunctions->onRequest(pRI->pCI->requestNumber, &rcsm, sizeof(rcsm), pRI);
1708 return Void();
1709}
1710
1711Return<void> RadioImpl::acknowledgeLastIncomingCdmaSms(int32_t serial, const CdmaSmsAck& smsAck) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001712#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001713 RLOGD("acknowledgeLastIncomingCdmaSms: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001714#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001715 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_CDMA_SMS_ACKNOWLEDGE);
1716 if (pRI == NULL) {
1717 return Void();
1718 }
1719
Jack Yuf68e0da2017-02-07 14:53:09 -08001720 RIL_CDMA_SMS_Ack rcsa = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001721
1722 rcsa.uErrorClass = (RIL_CDMA_SMS_ErrorClass) smsAck.errorClass;
1723 rcsa.uSMSCauseCode = smsAck.smsCauseCode;
1724
1725 s_vendorFunctions->onRequest(pRI->pCI->requestNumber, &rcsa, sizeof(rcsa), pRI);
1726 return Void();
1727}
1728
1729Return<void> RadioImpl::getGsmBroadcastConfig(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001730#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001731 RLOGD("getGsmBroadcastConfig: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001732#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001733 dispatchVoid(serial, mSlotId, RIL_REQUEST_GSM_GET_BROADCAST_SMS_CONFIG);
1734 return Void();
1735}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001736
1737Return<void> RadioImpl::setGsmBroadcastConfig(int32_t serial,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001738 const hidl_vec<GsmBroadcastSmsConfigInfo>&
1739 configInfo) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001740#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001741 RLOGD("setGsmBroadcastConfig: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001742#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001743 RequestInfo *pRI = android::addRequestToList(serial, mSlotId,
1744 RIL_REQUEST_GSM_SET_BROADCAST_SMS_CONFIG);
1745 if (pRI == NULL) {
1746 return Void();
1747 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001748
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001749 int num = configInfo.size();
1750 RIL_GSM_BroadcastSmsConfigInfo gsmBci[num];
1751 RIL_GSM_BroadcastSmsConfigInfo *gsmBciPtrs[num];
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001752
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001753 for (int i = 0 ; i < num ; i++ ) {
1754 gsmBciPtrs[i] = &gsmBci[i];
1755 gsmBci[i].fromServiceId = configInfo[i].fromServiceId;
1756 gsmBci[i].toServiceId = configInfo[i].toServiceId;
1757 gsmBci[i].fromCodeScheme = configInfo[i].fromCodeScheme;
1758 gsmBci[i].toCodeScheme = configInfo[i].toCodeScheme;
1759 gsmBci[i].selected = BOOL_TO_INT(configInfo[i].selected);
1760 }
1761
1762 s_vendorFunctions->onRequest(pRI->pCI->requestNumber, gsmBciPtrs,
1763 num * sizeof(RIL_GSM_BroadcastSmsConfigInfo *), pRI);
1764 return Void();
1765}
1766
1767Return<void> RadioImpl::setGsmBroadcastActivation(int32_t serial, bool activate) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001768#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001769 RLOGD("setGsmBroadcastActivation: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001770#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001771 dispatchInts(serial, mSlotId, RIL_REQUEST_GSM_SMS_BROADCAST_ACTIVATION,
Sanket Padawe0de29d12017-02-10 13:19:47 -08001772 1, BOOL_TO_INT(!activate));
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001773 return Void();
1774}
1775
1776Return<void> RadioImpl::getCdmaBroadcastConfig(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001777#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001778 RLOGD("getCdmaBroadcastConfig: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001779#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001780 dispatchVoid(serial, mSlotId, RIL_REQUEST_CDMA_GET_BROADCAST_SMS_CONFIG);
1781 return Void();
1782}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001783
1784Return<void> RadioImpl::setCdmaBroadcastConfig(int32_t serial,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001785 const hidl_vec<CdmaBroadcastSmsConfigInfo>&
1786 configInfo) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001787#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001788 RLOGD("setCdmaBroadcastConfig: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001789#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001790 RequestInfo *pRI = android::addRequestToList(serial, mSlotId,
1791 RIL_REQUEST_CDMA_SET_BROADCAST_SMS_CONFIG);
1792 if (pRI == NULL) {
1793 return Void();
1794 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001795
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001796 int num = configInfo.size();
1797 RIL_CDMA_BroadcastSmsConfigInfo cdmaBci[num];
1798 RIL_CDMA_BroadcastSmsConfigInfo *cdmaBciPtrs[num];
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001799
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001800 for (int i = 0 ; i < num ; i++ ) {
1801 cdmaBciPtrs[i] = &cdmaBci[i];
1802 cdmaBci[i].service_category = configInfo[i].serviceCategory;
1803 cdmaBci[i].language = configInfo[i].language;
1804 cdmaBci[i].selected = BOOL_TO_INT(configInfo[i].selected);
1805 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001806
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001807 s_vendorFunctions->onRequest(pRI->pCI->requestNumber, cdmaBciPtrs,
1808 num * sizeof(RIL_CDMA_BroadcastSmsConfigInfo *), pRI);
1809 return Void();
1810}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001811
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001812Return<void> RadioImpl::setCdmaBroadcastActivation(int32_t serial, bool activate) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001813#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001814 RLOGD("setCdmaBroadcastActivation: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001815#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001816 dispatchInts(serial, mSlotId, RIL_REQUEST_CDMA_SMS_BROADCAST_ACTIVATION,
Sanket Padawe0de29d12017-02-10 13:19:47 -08001817 1, BOOL_TO_INT(!activate));
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001818 return Void();
1819}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001820
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001821Return<void> RadioImpl::getCDMASubscription(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001822#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001823 RLOGD("getCDMASubscription: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001824#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001825 dispatchVoid(serial, mSlotId, RIL_REQUEST_CDMA_SUBSCRIPTION);
1826 return Void();
1827}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001828
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001829Return<void> RadioImpl::writeSmsToRuim(int32_t serial, const CdmaSmsWriteArgs& cdmaSms) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001830#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001831 RLOGD("writeSmsToRuim: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001832#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001833 RequestInfo *pRI = android::addRequestToList(serial, mSlotId,
1834 RIL_REQUEST_CDMA_WRITE_SMS_TO_RUIM);
1835 if (pRI == NULL) {
1836 return Void();
1837 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001838
Jack Yuf68e0da2017-02-07 14:53:09 -08001839 RIL_CDMA_SMS_WriteArgs rcsw = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001840 rcsw.status = (int) cdmaSms.status;
1841 constructCdmaSms(rcsw.message, cdmaSms.message);
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001842
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001843 s_vendorFunctions->onRequest(pRI->pCI->requestNumber, &rcsw, sizeof(rcsw), pRI);
1844 return Void();
1845}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001846
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001847Return<void> RadioImpl::deleteSmsOnRuim(int32_t serial, int32_t index) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001848#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001849 RLOGD("deleteSmsOnRuim: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001850#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001851 dispatchInts(serial, mSlotId, RIL_REQUEST_CDMA_DELETE_SMS_ON_RUIM, 1, index);
1852 return Void();
1853}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001854
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001855Return<void> RadioImpl::getDeviceIdentity(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001856#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001857 RLOGD("getDeviceIdentity: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001858#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001859 dispatchVoid(serial, mSlotId, RIL_REQUEST_DEVICE_IDENTITY);
1860 return Void();
1861}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001862
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001863Return<void> RadioImpl::exitEmergencyCallbackMode(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001864#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001865 RLOGD("exitEmergencyCallbackMode: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001866#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001867 dispatchVoid(serial, mSlotId, RIL_REQUEST_EXIT_EMERGENCY_CALLBACK_MODE);
1868 return Void();
1869}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001870
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001871Return<void> RadioImpl::getSmscAddress(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001872#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001873 RLOGD("getSmscAddress: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001874#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001875 dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_SMSC_ADDRESS);
1876 return Void();
1877}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001878
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001879Return<void> RadioImpl::setSmscAddress(int32_t serial, const hidl_string& smsc) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001880#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001881 RLOGD("setSmscAddress: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001882#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001883 dispatchString(serial, mSlotId, RIL_REQUEST_SET_SMSC_ADDRESS,
Scott Randolphc7213312017-04-03 14:06:40 -07001884 smsc.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001885 return Void();
1886}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001887
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001888Return<void> RadioImpl::reportSmsMemoryStatus(int32_t serial, bool available) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001889#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001890 RLOGD("reportSmsMemoryStatus: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001891#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001892 dispatchInts(serial, mSlotId, RIL_REQUEST_REPORT_SMS_MEMORY_STATUS, 1,
1893 BOOL_TO_INT(available));
1894 return Void();
1895}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001896
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001897Return<void> RadioImpl::reportStkServiceIsRunning(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001898#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001899 RLOGD("reportStkServiceIsRunning: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001900#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001901 dispatchVoid(serial, mSlotId, RIL_REQUEST_REPORT_STK_SERVICE_IS_RUNNING);
1902 return Void();
1903}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001904
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001905Return<void> RadioImpl::getCdmaSubscriptionSource(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001906#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001907 RLOGD("getCdmaSubscriptionSource: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001908#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001909 dispatchVoid(serial, mSlotId, RIL_REQUEST_CDMA_GET_SUBSCRIPTION_SOURCE);
1910 return Void();
1911}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001912
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001913Return<void> RadioImpl::requestIsimAuthentication(int32_t serial, const hidl_string& challenge) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001914#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001915 RLOGD("requestIsimAuthentication: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001916#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001917 dispatchString(serial, mSlotId, RIL_REQUEST_ISIM_AUTHENTICATION,
Scott Randolphc7213312017-04-03 14:06:40 -07001918 challenge.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001919 return Void();
1920}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001921
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001922Return<void> RadioImpl::acknowledgeIncomingGsmSmsWithPdu(int32_t serial, bool success,
1923 const hidl_string& ackPdu) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001924#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001925 RLOGD("acknowledgeIncomingGsmSmsWithPdu: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001926#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001927 dispatchStrings(serial, mSlotId, RIL_REQUEST_ACKNOWLEDGE_INCOMING_GSM_SMS_WITH_PDU,
Scott Randolphc7213312017-04-03 14:06:40 -07001928 2, success ? "1" : "0", ackPdu.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001929 return Void();
1930}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001931
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001932Return<void> RadioImpl::sendEnvelopeWithStatus(int32_t serial, const hidl_string& contents) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001933#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001934 RLOGD("sendEnvelopeWithStatus: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001935#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001936 dispatchString(serial, mSlotId, RIL_REQUEST_STK_SEND_ENVELOPE_WITH_STATUS,
Scott Randolphc7213312017-04-03 14:06:40 -07001937 contents.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001938 return Void();
1939}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001940
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001941Return<void> RadioImpl::getVoiceRadioTechnology(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001942#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001943 RLOGD("getVoiceRadioTechnology: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001944#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001945 dispatchVoid(serial, mSlotId, RIL_REQUEST_VOICE_RADIO_TECH);
1946 return Void();
1947}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001948
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001949Return<void> RadioImpl::getCellInfoList(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001950#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001951 RLOGD("getCellInfoList: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001952#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001953 dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_CELL_INFO_LIST);
1954 return Void();
1955}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001956
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001957Return<void> RadioImpl::setCellInfoListRate(int32_t serial, int32_t rate) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001958#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001959 RLOGD("setCellInfoListRate: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001960#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001961 dispatchInts(serial, mSlotId, RIL_REQUEST_SET_UNSOL_CELL_INFO_LIST_RATE, 1, rate);
1962 return Void();
1963}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001964
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001965Return<void> RadioImpl::setInitialAttachApn(int32_t serial, const DataProfileInfo& dataProfileInfo,
Jack Yuffc06452017-02-13 11:21:00 -08001966 bool modemCognitive, bool isRoaming) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001967#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001968 RLOGD("setInitialAttachApn: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001969#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001970 RequestInfo *pRI = android::addRequestToList(serial, mSlotId,
1971 RIL_REQUEST_SET_INITIAL_ATTACH_APN);
1972 if (pRI == NULL) {
1973 return Void();
1974 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001975
Jack Yuffc06452017-02-13 11:21:00 -08001976 if (s_vendorFunctions->version <= 14) {
1977 RIL_InitialAttachApn iaa = {};
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001978
Jack Yuffc06452017-02-13 11:21:00 -08001979 if (!copyHidlStringToRil(&iaa.apn, dataProfileInfo.apn, pRI)) {
1980 return Void();
1981 }
1982
1983 const hidl_string &protocol =
1984 (isRoaming ? dataProfileInfo.roamingProtocol : dataProfileInfo.protocol);
1985
1986 if (!copyHidlStringToRil(&iaa.protocol, protocol, pRI)) {
Jack Yu8e732d42017-04-14 00:08:06 -07001987 memsetAndFreeStrings(1, iaa.apn);
Jack Yuffc06452017-02-13 11:21:00 -08001988 return Void();
1989 }
1990 iaa.authtype = (int) dataProfileInfo.authType;
1991 if (!copyHidlStringToRil(&iaa.username, dataProfileInfo.user, pRI)) {
Jack Yu8e732d42017-04-14 00:08:06 -07001992 memsetAndFreeStrings(2, iaa.apn, iaa.protocol);
Jack Yuffc06452017-02-13 11:21:00 -08001993 return Void();
1994 }
1995 if (!copyHidlStringToRil(&iaa.password, dataProfileInfo.password, pRI)) {
Jack Yu8e732d42017-04-14 00:08:06 -07001996 memsetAndFreeStrings(3, iaa.apn, iaa.protocol, iaa.username);
Jack Yuffc06452017-02-13 11:21:00 -08001997 return Void();
1998 }
1999
2000 s_vendorFunctions->onRequest(RIL_REQUEST_SET_INITIAL_ATTACH_APN, &iaa, sizeof(iaa), pRI);
2001
2002 memsetAndFreeStrings(4, iaa.apn, iaa.protocol, iaa.username, iaa.password);
2003 } else {
2004 RIL_InitialAttachApn_v15 iaa = {};
2005
2006 if (!copyHidlStringToRil(&iaa.apn, dataProfileInfo.apn, pRI)) {
2007 return Void();
2008 }
2009 if (!copyHidlStringToRil(&iaa.protocol, dataProfileInfo.protocol, pRI)) {
Jack Yu8e732d42017-04-14 00:08:06 -07002010 memsetAndFreeStrings(1, iaa.apn);
Jack Yuffc06452017-02-13 11:21:00 -08002011 return Void();
2012 }
2013 if (!copyHidlStringToRil(&iaa.roamingProtocol, dataProfileInfo.roamingProtocol, pRI)) {
Jack Yu8e732d42017-04-14 00:08:06 -07002014 memsetAndFreeStrings(2, iaa.apn, iaa.protocol);
Jack Yuffc06452017-02-13 11:21:00 -08002015 return Void();
2016 }
2017 iaa.authtype = (int) dataProfileInfo.authType;
2018 if (!copyHidlStringToRil(&iaa.username, dataProfileInfo.user, pRI)) {
Jack Yu8e732d42017-04-14 00:08:06 -07002019 memsetAndFreeStrings(3, iaa.apn, iaa.protocol, iaa.roamingProtocol);
Jack Yuffc06452017-02-13 11:21:00 -08002020 return Void();
2021 }
2022 if (!copyHidlStringToRil(&iaa.password, dataProfileInfo.password, pRI)) {
Jack Yu8e732d42017-04-14 00:08:06 -07002023 memsetAndFreeStrings(4, iaa.apn, iaa.protocol, iaa.roamingProtocol, iaa.username);
Jack Yuffc06452017-02-13 11:21:00 -08002024 return Void();
2025 }
2026 iaa.supportedTypesBitmask = dataProfileInfo.supportedApnTypesBitmap;
2027 iaa.bearerBitmask = dataProfileInfo.bearerBitmap;
2028 iaa.modemCognitive = BOOL_TO_INT(modemCognitive);
2029 iaa.mtu = dataProfileInfo.mtu;
2030
Jack Yuc13645e2017-04-13 20:55:03 -07002031 if (!convertMvnoTypeToString(dataProfileInfo.mvnoType, iaa.mvnoType)) {
Jack Yuffc06452017-02-13 11:21:00 -08002032 sendErrorResponse(pRI, RIL_E_INVALID_ARGUMENTS);
Jack Yu8e732d42017-04-14 00:08:06 -07002033 memsetAndFreeStrings(5, iaa.apn, iaa.protocol, iaa.roamingProtocol, iaa.username,
2034 iaa.password);
Jack Yuffc06452017-02-13 11:21:00 -08002035 return Void();
2036 }
2037
2038 if (!copyHidlStringToRil(&iaa.mvnoMatchData, dataProfileInfo.mvnoMatchData, pRI)) {
Jack Yu8e732d42017-04-14 00:08:06 -07002039 memsetAndFreeStrings(5, iaa.apn, iaa.protocol, iaa.roamingProtocol, iaa.username,
2040 iaa.password);
Jack Yuffc06452017-02-13 11:21:00 -08002041 return Void();
2042 }
2043
2044 s_vendorFunctions->onRequest(RIL_REQUEST_SET_INITIAL_ATTACH_APN, &iaa, sizeof(iaa), pRI);
2045
2046 memsetAndFreeStrings(6, iaa.apn, iaa.protocol, iaa.roamingProtocol, iaa.username,
2047 iaa.password, iaa.mvnoMatchData);
2048 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002049
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002050 return Void();
2051}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002052
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002053Return<void> RadioImpl::getImsRegistrationState(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002054#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002055 RLOGD("getImsRegistrationState: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002056#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002057 dispatchVoid(serial, mSlotId, RIL_REQUEST_IMS_REGISTRATION_STATE);
2058 return Void();
2059}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002060
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002061bool dispatchImsGsmSms(const ImsSmsMessage& message, RequestInfo *pRI) {
Jack Yuf68e0da2017-02-07 14:53:09 -08002062 RIL_IMS_SMS_Message rism = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002063 char **pStrings;
2064 int countStrings = 2;
2065 int dataLen = sizeof(char *) * countStrings;
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002066
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002067 rism.tech = RADIO_TECH_3GPP;
2068 rism.retry = BOOL_TO_INT(message.retry);
2069 rism.messageRef = message.messageRef;
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002070
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002071 if (message.gsmMessage.size() != 1) {
2072 RLOGE("dispatchImsGsmSms: Invalid len %s", requestToString(pRI->pCI->requestNumber));
Jack Yuffc06452017-02-13 11:21:00 -08002073 sendErrorResponse(pRI, RIL_E_INVALID_ARGUMENTS);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002074 return false;
2075 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002076
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002077 pStrings = (char **)calloc(countStrings, sizeof(char *));
2078 if (pStrings == NULL) {
2079 RLOGE("dispatchImsGsmSms: Memory allocation failed for request %s",
2080 requestToString(pRI->pCI->requestNumber));
Jack Yuffc06452017-02-13 11:21:00 -08002081 sendErrorResponse(pRI, RIL_E_NO_MEMORY);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002082 return false;
2083 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002084
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002085 if (!copyHidlStringToRil(&pStrings[0], message.gsmMessage[0].smscPdu, pRI)) {
2086#ifdef MEMSET_FREED
Jack Yub4295a42017-04-14 12:51:49 -07002087 memset(pStrings, 0, dataLen);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002088#endif
2089 free(pStrings);
2090 return false;
2091 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002092
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002093 if (!copyHidlStringToRil(&pStrings[1], message.gsmMessage[0].pdu, pRI)) {
2094 memsetAndFreeStrings(1, pStrings[0]);
2095#ifdef MEMSET_FREED
Jack Yub4295a42017-04-14 12:51:49 -07002096 memset(pStrings, 0, dataLen);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002097#endif
2098 free(pStrings);
2099 return false;
2100 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002101
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002102 rism.message.gsmMessage = pStrings;
2103 s_vendorFunctions->onRequest(pRI->pCI->requestNumber, &rism, sizeof(RIL_RadioTechnologyFamily) +
2104 sizeof(uint8_t) + sizeof(int32_t) + dataLen, pRI);
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002105
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002106 for (int i = 0 ; i < countStrings ; i++) {
2107 memsetAndFreeStrings(1, pStrings[i]);
2108 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002109
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002110#ifdef MEMSET_FREED
Jack Yub4295a42017-04-14 12:51:49 -07002111 memset(pStrings, 0, dataLen);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002112#endif
2113 free(pStrings);
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002114
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002115 return true;
2116}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002117
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002118bool dispatchImsCdmaSms(const ImsSmsMessage& message, RequestInfo *pRI) {
Jack Yu8e732d42017-04-14 00:08:06 -07002119 RIL_IMS_SMS_Message rism = {};
2120 RIL_CDMA_SMS_Message rcsm = {};
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002121
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002122 if (message.cdmaMessage.size() != 1) {
2123 RLOGE("dispatchImsCdmaSms: Invalid len %s", requestToString(pRI->pCI->requestNumber));
Jack Yuffc06452017-02-13 11:21:00 -08002124 sendErrorResponse(pRI, RIL_E_INVALID_ARGUMENTS);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002125 return false;
2126 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002127
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002128 rism.tech = RADIO_TECH_3GPP2;
2129 rism.retry = BOOL_TO_INT(message.retry);
2130 rism.messageRef = message.messageRef;
2131 rism.message.cdmaMessage = &rcsm;
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002132
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002133 constructCdmaSms(rcsm, message.cdmaMessage[0]);
2134
2135 s_vendorFunctions->onRequest(pRI->pCI->requestNumber, &rism, sizeof(RIL_RadioTechnologyFamily) +
2136 sizeof(uint8_t) + sizeof(int32_t) + sizeof(rcsm), pRI);
2137
2138 return true;
2139}
2140
2141Return<void> RadioImpl::sendImsSms(int32_t serial, const ImsSmsMessage& message) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002142#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002143 RLOGD("sendImsSms: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002144#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002145 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_IMS_SEND_SMS);
2146 if (pRI == NULL) {
2147 return Void();
2148 }
2149
2150 RIL_RadioTechnologyFamily format = (RIL_RadioTechnologyFamily) message.tech;
2151
2152 if (RADIO_TECH_3GPP == format) {
2153 dispatchImsGsmSms(message, pRI);
2154 } else if (RADIO_TECH_3GPP2 == format) {
2155 dispatchImsCdmaSms(message, pRI);
2156 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08002157 RLOGE("sendImsSms: Invalid radio tech %s",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002158 requestToString(pRI->pCI->requestNumber));
Jack Yuffc06452017-02-13 11:21:00 -08002159 sendErrorResponse(pRI, RIL_E_INVALID_ARGUMENTS);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002160 }
2161 return Void();
2162}
2163
2164Return<void> RadioImpl::iccTransmitApduBasicChannel(int32_t serial, const SimApdu& message) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002165#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002166 RLOGD("iccTransmitApduBasicChannel: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002167#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002168 dispatchIccApdu(serial, mSlotId, RIL_REQUEST_SIM_TRANSMIT_APDU_BASIC, message);
2169 return Void();
2170}
2171
Wileen Chiu410b7562015-11-23 14:25:22 -08002172Return<void> RadioImpl::iccOpenLogicalChannel(int32_t serial, const hidl_string& aid, int32_t p2) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002173#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002174 RLOGD("iccOpenLogicalChannel: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002175#endif
Wileen Chiu410b7562015-11-23 14:25:22 -08002176 if (s_vendorFunctions->version < 15) {
2177 dispatchString(serial, mSlotId, RIL_REQUEST_SIM_OPEN_CHANNEL, aid.c_str());
2178 } else {
2179 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_SIM_OPEN_CHANNEL);
2180 if (pRI == NULL) {
2181 return Void();
2182 }
2183
Jack Yu8e732d42017-04-14 00:08:06 -07002184 RIL_OpenChannelParams params = {};
Wileen Chiu410b7562015-11-23 14:25:22 -08002185
2186 params.p2 = p2;
2187
2188 if (!copyHidlStringToRil(&params.aidPtr, aid, pRI)) {
2189 return Void();
2190 }
2191
2192 s_vendorFunctions->onRequest(pRI->pCI->requestNumber, &params, sizeof(params), pRI);
2193
2194 memsetAndFreeStrings(1, params.aidPtr);
2195 }
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002196 return Void();
2197}
2198
2199Return<void> RadioImpl::iccCloseLogicalChannel(int32_t serial, int32_t channelId) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002200#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002201 RLOGD("iccCloseLogicalChannel: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002202#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002203 dispatchInts(serial, mSlotId, RIL_REQUEST_SIM_CLOSE_CHANNEL, 1, channelId);
2204 return Void();
2205}
2206
2207Return<void> RadioImpl::iccTransmitApduLogicalChannel(int32_t serial, const SimApdu& message) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002208#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002209 RLOGD("iccTransmitApduLogicalChannel: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002210#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002211 dispatchIccApdu(serial, mSlotId, RIL_REQUEST_SIM_TRANSMIT_APDU_CHANNEL, message);
2212 return Void();
2213}
2214
2215Return<void> RadioImpl::nvReadItem(int32_t serial, NvItem itemId) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002216#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002217 RLOGD("nvReadItem: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002218#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002219 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_NV_READ_ITEM);
2220 if (pRI == NULL) {
2221 return Void();
2222 }
2223
Jack Yu8e732d42017-04-14 00:08:06 -07002224 RIL_NV_ReadItem nvri = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002225 nvri.itemID = (RIL_NV_Item) itemId;
2226
2227 s_vendorFunctions->onRequest(pRI->pCI->requestNumber, &nvri, sizeof(nvri), pRI);
2228 return Void();
2229}
2230
2231Return<void> RadioImpl::nvWriteItem(int32_t serial, const NvWriteItem& item) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002232#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002233 RLOGD("nvWriteItem: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002234#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002235 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_NV_WRITE_ITEM);
2236 if (pRI == NULL) {
2237 return Void();
2238 }
2239
Jack Yu8e732d42017-04-14 00:08:06 -07002240 RIL_NV_WriteItem nvwi = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002241
2242 nvwi.itemID = (RIL_NV_Item) item.itemId;
2243
2244 if (!copyHidlStringToRil(&nvwi.value, item.value, pRI)) {
2245 return Void();
2246 }
2247
2248 s_vendorFunctions->onRequest(pRI->pCI->requestNumber, &nvwi, sizeof(nvwi), pRI);
2249
2250 memsetAndFreeStrings(1, nvwi.value);
2251 return Void();
2252}
2253
2254Return<void> RadioImpl::nvWriteCdmaPrl(int32_t serial, const hidl_vec<uint8_t>& prl) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002255#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002256 RLOGD("nvWriteCdmaPrl: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002257#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002258 dispatchRaw(serial, mSlotId, RIL_REQUEST_NV_WRITE_CDMA_PRL, prl);
2259 return Void();
2260}
2261
2262Return<void> RadioImpl::nvResetConfig(int32_t serial, ResetNvType resetType) {
Jayachandran C32763f02017-04-30 10:21:14 -07002263 int rilResetType = -1;
Jayachandran C572f2f42017-03-25 14:30:13 -07002264#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002265 RLOGD("nvResetConfig: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002266#endif
Jayachandran C32763f02017-04-30 10:21:14 -07002267 /* Convert ResetNvType to RIL.h values
2268 * RIL_REQUEST_NV_RESET_CONFIG
2269 * 1 - reload all NV items
2270 * 2 - erase NV reset (SCRTN)
2271 * 3 - factory reset (RTN)
2272 */
2273 switch(resetType) {
2274 case ResetNvType::RELOAD:
2275 rilResetType = 1;
2276 break;
2277 case ResetNvType::ERASE:
2278 rilResetType = 2;
2279 break;
2280 case ResetNvType::FACTORY_RESET:
2281 rilResetType = 3;
2282 break;
2283 }
2284 dispatchInts(serial, mSlotId, RIL_REQUEST_NV_RESET_CONFIG, 1, rilResetType);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002285 return Void();
2286}
2287
2288Return<void> RadioImpl::setUiccSubscription(int32_t serial, const SelectUiccSub& uiccSub) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002289#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002290 RLOGD("setUiccSubscription: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002291#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002292 RequestInfo *pRI = android::addRequestToList(serial, mSlotId,
2293 RIL_REQUEST_SET_UICC_SUBSCRIPTION);
2294 if (pRI == NULL) {
2295 return Void();
2296 }
2297
Jack Yuf68e0da2017-02-07 14:53:09 -08002298 RIL_SelectUiccSub rilUiccSub = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002299
2300 rilUiccSub.slot = uiccSub.slot;
2301 rilUiccSub.app_index = uiccSub.appIndex;
2302 rilUiccSub.sub_type = (RIL_SubscriptionType) uiccSub.subType;
2303 rilUiccSub.act_status = (RIL_UiccSubActStatus) uiccSub.actStatus;
2304
2305 s_vendorFunctions->onRequest(pRI->pCI->requestNumber, &rilUiccSub, sizeof(rilUiccSub), pRI);
2306 return Void();
2307}
2308
2309Return<void> RadioImpl::setDataAllowed(int32_t serial, bool allow) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002310#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002311 RLOGD("setDataAllowed: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002312#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002313 dispatchInts(serial, mSlotId, RIL_REQUEST_ALLOW_DATA, 1, BOOL_TO_INT(allow));
2314 return Void();
2315}
2316
2317Return<void> RadioImpl::getHardwareConfig(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002318#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002319 RLOGD("getHardwareConfig: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002320#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002321 dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_HARDWARE_CONFIG);
2322 return Void();
2323}
2324
2325Return<void> RadioImpl::requestIccSimAuthentication(int32_t serial, int32_t authContext,
2326 const hidl_string& authData, const hidl_string& aid) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002327#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002328 RLOGD("requestIccSimAuthentication: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002329#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002330 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_SIM_AUTHENTICATION);
2331 if (pRI == NULL) {
2332 return Void();
2333 }
2334
Jack Yu8e732d42017-04-14 00:08:06 -07002335 RIL_SimAuthentication pf = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002336
2337 pf.authContext = authContext;
2338
2339 int len;
2340 if (!copyHidlStringToRil(&pf.authData, authData, pRI)) {
2341 return Void();
2342 }
2343
2344 if (!copyHidlStringToRil(&pf.aid, aid, pRI)) {
2345 memsetAndFreeStrings(1, pf.authData);
2346 return Void();
2347 }
2348
2349 s_vendorFunctions->onRequest(pRI->pCI->requestNumber, &pf, sizeof(pf), pRI);
2350
2351 memsetAndFreeStrings(2, pf.authData, pf.aid);
2352 return Void();
2353}
2354
2355/**
Jack Yuffc06452017-02-13 11:21:00 -08002356 * @param numProfiles number of data profile
2357 * @param dataProfiles the pointer to the actual data profiles. The acceptable type is
2358 RIL_DataProfileInfo or RIL_DataProfileInfo_v15.
2359 * @param dataProfilePtrs the pointer to the pointers that point to each data profile structure
2360 * @param numfields number of string-type member in the data profile structure
2361 * @param ... the variadic parameters are pointers to each string-type member
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002362 **/
Jack Yuffc06452017-02-13 11:21:00 -08002363template <typename T>
2364void freeSetDataProfileData(int numProfiles, T *dataProfiles, T **dataProfilePtrs,
2365 int numfields, ...) {
2366 va_list args;
2367 va_start(args, numfields);
2368
2369 // Iterate through each string-type field that need to be free.
2370 for (int i = 0; i < numfields; i++) {
2371 // Iterate through each data profile and free that specific string-type field.
2372 // The type 'char *T::*' is a type of pointer to a 'char *' member inside T structure.
2373 char *T::*ptr = va_arg(args, char *T::*);
2374 for (int j = 0; j < numProfiles; j++) {
2375 memsetAndFreeStrings(1, dataProfiles[j].*ptr);
2376 }
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002377 }
2378
Jack Yuffc06452017-02-13 11:21:00 -08002379 va_end(args);
2380
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002381#ifdef MEMSET_FREED
Jack Yuffc06452017-02-13 11:21:00 -08002382 memset(dataProfiles, 0, numProfiles * sizeof(T));
2383 memset(dataProfilePtrs, 0, numProfiles * sizeof(T *));
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002384#endif
2385 free(dataProfiles);
2386 free(dataProfilePtrs);
2387}
2388
Jack Yuffc06452017-02-13 11:21:00 -08002389Return<void> RadioImpl::setDataProfile(int32_t serial, const hidl_vec<DataProfileInfo>& profiles,
2390 bool isRoaming) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002391#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002392 RLOGD("setDataProfile: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002393#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002394 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_SET_DATA_PROFILE);
2395 if (pRI == NULL) {
2396 return Void();
2397 }
2398
Jack Yuffc06452017-02-13 11:21:00 -08002399 size_t num = profiles.size();
2400 bool success = false;
2401
2402 if (s_vendorFunctions->version <= 14) {
2403
2404 RIL_DataProfileInfo *dataProfiles =
2405 (RIL_DataProfileInfo *) calloc(num, sizeof(RIL_DataProfileInfo));
2406
2407 if (dataProfiles == NULL) {
2408 RLOGE("Memory allocation failed for request %s",
2409 requestToString(pRI->pCI->requestNumber));
2410 sendErrorResponse(pRI, RIL_E_NO_MEMORY);
2411 return Void();
2412 }
2413
2414 RIL_DataProfileInfo **dataProfilePtrs =
2415 (RIL_DataProfileInfo **) calloc(num, sizeof(RIL_DataProfileInfo *));
2416 if (dataProfilePtrs == NULL) {
2417 RLOGE("Memory allocation failed for request %s",
2418 requestToString(pRI->pCI->requestNumber));
2419 free(dataProfiles);
2420 sendErrorResponse(pRI, RIL_E_NO_MEMORY);
2421 return Void();
2422 }
2423
2424 for (size_t i = 0; i < num; i++) {
2425 dataProfilePtrs[i] = &dataProfiles[i];
2426
2427 success = copyHidlStringToRil(&dataProfiles[i].apn, profiles[i].apn, pRI);
2428
2429 const hidl_string &protocol =
2430 (isRoaming ? profiles[i].roamingProtocol : profiles[i].protocol);
2431
2432 if (success && !copyHidlStringToRil(&dataProfiles[i].protocol, protocol, pRI)) {
2433 success = false;
2434 }
2435
2436 if (success && !copyHidlStringToRil(&dataProfiles[i].user, profiles[i].user, pRI)) {
2437 success = false;
2438 }
2439 if (success && !copyHidlStringToRil(&dataProfiles[i].password, profiles[i].password,
2440 pRI)) {
2441 success = false;
2442 }
2443
2444 if (!success) {
2445 freeSetDataProfileData(num, dataProfiles, dataProfilePtrs, 4,
2446 &RIL_DataProfileInfo::apn, &RIL_DataProfileInfo::protocol,
2447 &RIL_DataProfileInfo::user, &RIL_DataProfileInfo::password);
2448 return Void();
2449 }
2450
2451 dataProfiles[i].profileId = (RIL_DataProfile) profiles[i].profileId;
2452 dataProfiles[i].authType = (int) profiles[i].authType;
2453 dataProfiles[i].type = (int) profiles[i].type;
2454 dataProfiles[i].maxConnsTime = profiles[i].maxConnsTime;
2455 dataProfiles[i].maxConns = profiles[i].maxConns;
2456 dataProfiles[i].waitTime = profiles[i].waitTime;
2457 dataProfiles[i].enabled = BOOL_TO_INT(profiles[i].enabled);
2458 }
2459
2460 s_vendorFunctions->onRequest(RIL_REQUEST_SET_DATA_PROFILE, dataProfilePtrs,
2461 num * sizeof(RIL_DataProfileInfo *), pRI);
2462
2463 freeSetDataProfileData(num, dataProfiles, dataProfilePtrs, 4,
2464 &RIL_DataProfileInfo::apn, &RIL_DataProfileInfo::protocol,
2465 &RIL_DataProfileInfo::user, &RIL_DataProfileInfo::password);
2466 } else {
2467 RIL_DataProfileInfo_v15 *dataProfiles =
2468 (RIL_DataProfileInfo_v15 *) calloc(num, sizeof(RIL_DataProfileInfo_v15));
2469
2470 if (dataProfiles == NULL) {
2471 RLOGE("Memory allocation failed for request %s",
2472 requestToString(pRI->pCI->requestNumber));
2473 sendErrorResponse(pRI, RIL_E_NO_MEMORY);
2474 return Void();
2475 }
2476
2477 RIL_DataProfileInfo_v15 **dataProfilePtrs =
2478 (RIL_DataProfileInfo_v15 **) calloc(num, sizeof(RIL_DataProfileInfo_v15 *));
2479 if (dataProfilePtrs == NULL) {
2480 RLOGE("Memory allocation failed for request %s",
2481 requestToString(pRI->pCI->requestNumber));
2482 free(dataProfiles);
2483 sendErrorResponse(pRI, RIL_E_NO_MEMORY);
2484 return Void();
2485 }
2486
2487 for (size_t i = 0; i < num; i++) {
2488 dataProfilePtrs[i] = &dataProfiles[i];
2489
2490 success = copyHidlStringToRil(&dataProfiles[i].apn, profiles[i].apn, pRI);
2491 if (success && !copyHidlStringToRil(&dataProfiles[i].protocol, profiles[i].protocol,
2492 pRI)) {
2493 success = false;
2494 }
2495 if (success && !copyHidlStringToRil(&dataProfiles[i].roamingProtocol,
2496 profiles[i].roamingProtocol, pRI)) {
2497 success = false;
2498 }
2499 if (success && !copyHidlStringToRil(&dataProfiles[i].user, profiles[i].user, pRI)) {
2500 success = false;
2501 }
2502 if (success && !copyHidlStringToRil(&dataProfiles[i].password, profiles[i].password,
2503 pRI)) {
2504 success = false;
2505 }
Jack Yuffc06452017-02-13 11:21:00 -08002506 if (success && !copyHidlStringToRil(&dataProfiles[i].mvnoMatchData,
2507 profiles[i].mvnoMatchData, pRI)) {
2508 success = false;
2509 }
2510
Jack Yuc13645e2017-04-13 20:55:03 -07002511 if (success && !convertMvnoTypeToString(profiles[i].mvnoType,
2512 dataProfiles[i].mvnoType)) {
2513 sendErrorResponse(pRI, RIL_E_INVALID_ARGUMENTS);
2514 success = false;
Jack Yuffc06452017-02-13 11:21:00 -08002515 }
2516
2517 if (!success) {
2518 freeSetDataProfileData(num, dataProfiles, dataProfilePtrs, 6,
2519 &RIL_DataProfileInfo_v15::apn, &RIL_DataProfileInfo_v15::protocol,
2520 &RIL_DataProfileInfo_v15::roamingProtocol, &RIL_DataProfileInfo_v15::user,
2521 &RIL_DataProfileInfo_v15::password, &RIL_DataProfileInfo_v15::mvnoMatchData);
2522 return Void();
2523 }
2524
2525 dataProfiles[i].profileId = (RIL_DataProfile) profiles[i].profileId;
2526 dataProfiles[i].authType = (int) profiles[i].authType;
2527 dataProfiles[i].type = (int) profiles[i].type;
2528 dataProfiles[i].maxConnsTime = profiles[i].maxConnsTime;
2529 dataProfiles[i].maxConns = profiles[i].maxConns;
2530 dataProfiles[i].waitTime = profiles[i].waitTime;
2531 dataProfiles[i].enabled = BOOL_TO_INT(profiles[i].enabled);
2532 dataProfiles[i].supportedTypesBitmask = profiles[i].supportedApnTypesBitmap;
2533 dataProfiles[i].bearerBitmask = profiles[i].bearerBitmap;
2534 dataProfiles[i].mtu = profiles[i].mtu;
2535 }
2536
2537 s_vendorFunctions->onRequest(RIL_REQUEST_SET_DATA_PROFILE, dataProfilePtrs,
2538 num * sizeof(RIL_DataProfileInfo_v15 *), pRI);
2539
2540 freeSetDataProfileData(num, dataProfiles, dataProfilePtrs, 6,
2541 &RIL_DataProfileInfo_v15::apn, &RIL_DataProfileInfo_v15::protocol,
2542 &RIL_DataProfileInfo_v15::roamingProtocol, &RIL_DataProfileInfo_v15::user,
2543 &RIL_DataProfileInfo_v15::password, &RIL_DataProfileInfo_v15::mvnoMatchData);
2544 }
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002545
2546 return Void();
2547}
2548
2549Return<void> RadioImpl::requestShutdown(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002550#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002551 RLOGD("requestShutdown: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002552#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002553 dispatchVoid(serial, mSlotId, RIL_REQUEST_SHUTDOWN);
2554 return Void();
2555}
2556
2557Return<void> RadioImpl::getRadioCapability(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002558#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002559 RLOGD("getRadioCapability: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002560#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002561 dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_RADIO_CAPABILITY);
2562 return Void();
2563}
2564
2565Return<void> RadioImpl::setRadioCapability(int32_t serial, const RadioCapability& rc) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002566#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002567 RLOGD("setRadioCapability: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002568#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002569 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_SET_RADIO_CAPABILITY);
2570 if (pRI == NULL) {
2571 return Void();
2572 }
2573
Jack Yu8e732d42017-04-14 00:08:06 -07002574 RIL_RadioCapability rilRc = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002575
2576 // TODO : set rilRc.version using HIDL version ?
2577 rilRc.session = rc.session;
2578 rilRc.phase = (int) rc.phase;
2579 rilRc.rat = (int) rc.raf;
2580 rilRc.status = (int) rc.status;
Scott Randolphc7213312017-04-03 14:06:40 -07002581 strncpy(rilRc.logicalModemUuid, rc.logicalModemUuid.c_str(), MAX_UUID_LENGTH);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002582
2583 s_vendorFunctions->onRequest(pRI->pCI->requestNumber, &rilRc, sizeof(rilRc), pRI);
2584
2585 return Void();
2586}
2587
2588Return<void> RadioImpl::startLceService(int32_t serial, int32_t reportInterval, bool pullMode) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002589#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002590 RLOGD("startLceService: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002591#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002592 dispatchInts(serial, mSlotId, RIL_REQUEST_START_LCE, 2, reportInterval,
2593 BOOL_TO_INT(pullMode));
2594 return Void();
2595}
2596
2597Return<void> RadioImpl::stopLceService(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002598#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002599 RLOGD("stopLceService: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002600#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002601 dispatchVoid(serial, mSlotId, RIL_REQUEST_STOP_LCE);
2602 return Void();
2603}
2604
2605Return<void> RadioImpl::pullLceData(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002606#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002607 RLOGD("pullLceData: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002608#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002609 dispatchVoid(serial, mSlotId, RIL_REQUEST_PULL_LCEDATA);
2610 return Void();
2611}
2612
2613Return<void> RadioImpl::getModemActivityInfo(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002614#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002615 RLOGD("getModemActivityInfo: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002616#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002617 dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_ACTIVITY_INFO);
2618 return Void();
2619}
2620
2621Return<void> RadioImpl::setAllowedCarriers(int32_t serial, bool allAllowed,
2622 const CarrierRestrictions& carriers) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002623#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002624 RLOGD("setAllowedCarriers: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002625#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002626 RequestInfo *pRI = android::addRequestToList(serial, mSlotId,
2627 RIL_REQUEST_SET_CARRIER_RESTRICTIONS);
2628 if (pRI == NULL) {
2629 return Void();
2630 }
2631
Jack Yuf68e0da2017-02-07 14:53:09 -08002632 RIL_CarrierRestrictions cr = {};
Jack Yu11ab4042017-02-21 17:08:01 -08002633 RIL_Carrier *allowedCarriers = NULL;
2634 RIL_Carrier *excludedCarriers = NULL;
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002635
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002636 cr.len_allowed_carriers = carriers.allowedCarriers.size();
2637 allowedCarriers = (RIL_Carrier *)calloc(cr.len_allowed_carriers, sizeof(RIL_Carrier));
2638 if (allowedCarriers == NULL) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08002639 RLOGE("setAllowedCarriers: Memory allocation failed for request %s",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002640 requestToString(pRI->pCI->requestNumber));
Jack Yuffc06452017-02-13 11:21:00 -08002641 sendErrorResponse(pRI, RIL_E_NO_MEMORY);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002642 return Void();
2643 }
2644 cr.allowed_carriers = allowedCarriers;
2645
2646 cr.len_excluded_carriers = carriers.excludedCarriers.size();
2647 excludedCarriers = (RIL_Carrier *)calloc(cr.len_excluded_carriers, sizeof(RIL_Carrier));
2648 if (excludedCarriers == NULL) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08002649 RLOGE("setAllowedCarriers: Memory allocation failed for request %s",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002650 requestToString(pRI->pCI->requestNumber));
Jack Yuffc06452017-02-13 11:21:00 -08002651 sendErrorResponse(pRI, RIL_E_NO_MEMORY);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002652#ifdef MEMSET_FREED
2653 memset(allowedCarriers, 0, cr.len_allowed_carriers * sizeof(RIL_Carrier));
2654#endif
2655 free(allowedCarriers);
2656 return Void();
2657 }
2658 cr.excluded_carriers = excludedCarriers;
2659
2660 for (int i = 0; i < cr.len_allowed_carriers; i++) {
Scott Randolphc7213312017-04-03 14:06:40 -07002661 allowedCarriers[i].mcc = carriers.allowedCarriers[i].mcc.c_str();
2662 allowedCarriers[i].mnc = carriers.allowedCarriers[i].mnc.c_str();
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002663 allowedCarriers[i].match_type = (RIL_CarrierMatchType) carriers.allowedCarriers[i].matchType;
Scott Randolphc7213312017-04-03 14:06:40 -07002664 allowedCarriers[i].match_data = carriers.allowedCarriers[i].matchData.c_str();
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002665 }
2666
Amit Mahajan3f510f62017-03-01 10:26:58 -08002667 for (int i = 0; i < cr.len_excluded_carriers; i++) {
Scott Randolphc7213312017-04-03 14:06:40 -07002668 excludedCarriers[i].mcc = carriers.excludedCarriers[i].mcc.c_str();
2669 excludedCarriers[i].mnc = carriers.excludedCarriers[i].mnc.c_str();
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002670 excludedCarriers[i].match_type =
2671 (RIL_CarrierMatchType) carriers.excludedCarriers[i].matchType;
Scott Randolphc7213312017-04-03 14:06:40 -07002672 excludedCarriers[i].match_data = carriers.excludedCarriers[i].matchData.c_str();
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002673 }
2674
2675 s_vendorFunctions->onRequest(pRI->pCI->requestNumber, &cr, sizeof(RIL_CarrierRestrictions), pRI);
2676
2677#ifdef MEMSET_FREED
2678 memset(allowedCarriers, 0, cr.len_allowed_carriers * sizeof(RIL_Carrier));
2679 memset(excludedCarriers, 0, cr.len_excluded_carriers * sizeof(RIL_Carrier));
2680#endif
2681 free(allowedCarriers);
2682 free(excludedCarriers);
2683 return Void();
2684}
2685
2686Return<void> RadioImpl::getAllowedCarriers(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002687#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002688 RLOGD("getAllowedCarriers: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002689#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002690 dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_CARRIER_RESTRICTIONS);
2691 return Void();
2692}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002693
Jack Yu11ab4042017-02-21 17:08:01 -08002694Return<void> RadioImpl::sendDeviceState(int32_t serial, DeviceStateType deviceStateType,
2695 bool state) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002696#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002697 RLOGD("sendDeviceState: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002698#endif
Jack Yu11ab4042017-02-21 17:08:01 -08002699 if (s_vendorFunctions->version < 15) {
2700 if (deviceStateType == DeviceStateType::LOW_DATA_EXPECTED) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08002701 RLOGD("sendDeviceState: calling screen state %d", BOOL_TO_INT(!state));
Jack Yu11ab4042017-02-21 17:08:01 -08002702 dispatchInts(serial, mSlotId, RIL_REQUEST_SCREEN_STATE, 1, BOOL_TO_INT(!state));
2703 } else {
2704 RequestInfo *pRI = android::addRequestToList(serial, mSlotId,
2705 RIL_REQUEST_SEND_DEVICE_STATE);
2706 sendErrorResponse(pRI, RIL_E_REQUEST_NOT_SUPPORTED);
2707 }
2708 return Void();
2709 }
2710 dispatchInts(serial, mSlotId, RIL_REQUEST_SEND_DEVICE_STATE, 2, (int) deviceStateType,
2711 BOOL_TO_INT(state));
2712 return Void();
2713}
2714
2715Return<void> RadioImpl::setIndicationFilter(int32_t serial, int32_t indicationFilter) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002716#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002717 RLOGD("setIndicationFilter: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002718#endif
Jack Yu11ab4042017-02-21 17:08:01 -08002719 if (s_vendorFunctions->version < 15) {
2720 RequestInfo *pRI = android::addRequestToList(serial, mSlotId,
2721 RIL_REQUEST_SET_UNSOLICITED_RESPONSE_FILTER);
2722 sendErrorResponse(pRI, RIL_E_REQUEST_NOT_SUPPORTED);
2723 return Void();
2724 }
2725 dispatchInts(serial, mSlotId, RIL_REQUEST_SET_UNSOLICITED_RESPONSE_FILTER, 1, indicationFilter);
2726 return Void();
2727}
2728
Wileen Chiu718c0bf2017-01-04 11:37:19 -08002729Return<void> RadioImpl::setSimCardPower(int32_t serial, bool powerUp) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002730#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002731 RLOGD("setSimCardPower: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002732#endif
Wileen Chiu718c0bf2017-01-04 11:37:19 -08002733 dispatchInts(serial, mSlotId, RIL_REQUEST_SET_SIM_CARD_POWER, 1, BOOL_TO_INT(powerUp));
2734 return Void();
2735}
2736
Grace Chen797c1c22017-03-23 18:39:48 -07002737Return<void> RadioImpl::setSimCardPower_1_1(int32_t serial,
2738 const ::android::hardware::radio::V1_1::CardPowerState state) {
2739#if VDBG
2740 RLOGD("setSimCardPower_1_1: serial %d state %d", serial, state);
2741#endif
2742 dispatchInts(serial, mSlotId, RIL_REQUEST_SET_SIM_CARD_POWER, 1, state);
2743 return Void();
2744}
2745
Sanket Padawef220dc52017-01-02 23:46:00 -08002746Return<void> RadioImpl::responseAcknowledgement() {
2747 android::releaseWakeLock();
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002748 return Void();
Sanket Padawef220dc52017-01-02 23:46:00 -08002749}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002750
Amit Mahajan439da362017-02-13 17:43:04 -08002751Return<void> OemHookImpl::setResponseFunctions(
2752 const ::android::sp<IOemHookResponse>& oemHookResponseParam,
2753 const ::android::sp<IOemHookIndication>& oemHookIndicationParam) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002754#if VDBG
Amit Mahajan439da362017-02-13 17:43:04 -08002755 RLOGD("OemHookImpl::setResponseFunctions");
Jayachandran C572f2f42017-03-25 14:30:13 -07002756#endif
Amit Mahajan439da362017-02-13 17:43:04 -08002757
2758 pthread_rwlock_t *radioServiceRwlockPtr = radio::getRadioServiceRwlock(mSlotId);
2759 int ret = pthread_rwlock_wrlock(radioServiceRwlockPtr);
2760 assert(ret == 0);
2761
2762 mOemHookResponse = oemHookResponseParam;
2763 mOemHookIndication = oemHookIndicationParam;
Amit Mahajand423d192017-03-16 17:04:01 -07002764 mCounterOemHook[mSlotId]++;
Amit Mahajan439da362017-02-13 17:43:04 -08002765
2766 ret = pthread_rwlock_unlock(radioServiceRwlockPtr);
2767 assert(ret == 0);
2768
2769 return Void();
2770}
2771
2772Return<void> OemHookImpl::sendRequestRaw(int32_t serial, const hidl_vec<uint8_t>& data) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002773#if VDBG
Amit Mahajan439da362017-02-13 17:43:04 -08002774 RLOGD("OemHookImpl::sendRequestRaw: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002775#endif
Amit Mahajan439da362017-02-13 17:43:04 -08002776 dispatchRaw(serial, mSlotId, RIL_REQUEST_OEM_HOOK_RAW, data);
2777 return Void();
2778}
2779
2780Return<void> OemHookImpl::sendRequestStrings(int32_t serial,
2781 const hidl_vec<hidl_string>& data) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002782#if VDBG
Amit Mahajan439da362017-02-13 17:43:04 -08002783 RLOGD("OemHookImpl::sendRequestStrings: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002784#endif
Amit Mahajan439da362017-02-13 17:43:04 -08002785 dispatchStrings(serial, mSlotId, RIL_REQUEST_OEM_HOOK_STRINGS, data);
2786 return Void();
2787}
2788
pkanwarc61837e2017-03-17 12:49:34 -07002789Return<void> RadioImpl::setCarrierInfoForImsiEncryption(int32_t serial,
pkanwarb10761e2017-05-21 10:24:30 -07002790 const ::android::hardware::radio::V1_1::ImsiEncryptionInfo& data) {
pkanwarc61837e2017-03-17 12:49:34 -07002791 RLOGD("setCarrierInfoForImsiEncryption: serial %d", serial);
pkanwarb10761e2017-05-21 10:24:30 -07002792 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_SET_CARRIER_INFO_IMSI_ENCRYPTION);
2793 RIL_CarrierInfoForImsiEncryption imsiEncryption = {};
2794
2795 if (!copyHidlStringToRil(&imsiEncryption.mnc, data.mnc, pRI)) {
2796 return Void();
2797 }
2798 if (!copyHidlStringToRil(&imsiEncryption.mcc, data.mcc, pRI)) {
2799 memsetAndFreeStrings(1, imsiEncryption.mnc);
2800 return Void();
2801 }
2802 if (!copyHidlStringToRil(&imsiEncryption.keyIdentifier, data.keyIdentifier, pRI)) {
2803 memsetAndFreeStrings(2, imsiEncryption.mnc, imsiEncryption.mcc);
2804 return Void();
2805 }
2806 int32_t lSize = data.carrierKey.size();
2807 imsiEncryption.carrierKey = new uint8_t[lSize];
2808 memcpy(imsiEncryption.carrierKey, data.carrierKey.data(), lSize);
2809 imsiEncryption.expirationTime = data.expirationTime;
2810 s_vendorFunctions->onRequest(pRI->pCI->requestNumber, &imsiEncryption, sizeof(RIL_CarrierInfoForImsiEncryption), pRI);
2811 delete(imsiEncryption.carrierKey);
pkanwarc61837e2017-03-17 12:49:34 -07002812 return Void();
2813}
2814
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002815/***************************************************************************************************
2816 * RESPONSE FUNCTIONS
2817 * Functions above are used for requests going from framework to vendor code. The ones below are
2818 * responses for those requests coming back from the vendor code.
2819 **************************************************************************************************/
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002820
Sanket Padawef220dc52017-01-02 23:46:00 -08002821void radio::acknowledgeRequest(int slotId, int serial) {
2822 if (radioService[slotId]->mRadioResponse != NULL) {
Amit Mahajan17249842017-01-19 15:05:45 -08002823 Return<void> retStatus = radioService[slotId]->mRadioResponse->acknowledgeRequest(serial);
2824 radioService[slotId]->checkReturnStatus(retStatus);
Sanket Padawef220dc52017-01-02 23:46:00 -08002825 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08002826 RLOGE("acknowledgeRequest: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawef220dc52017-01-02 23:46:00 -08002827 }
2828}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002829
Sanket Padawef220dc52017-01-02 23:46:00 -08002830void populateResponseInfo(RadioResponseInfo& responseInfo, int serial, int responseType,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002831 RIL_Errno e) {
Sanket Padawef220dc52017-01-02 23:46:00 -08002832 responseInfo.serial = serial;
2833 switch (responseType) {
2834 case RESPONSE_SOLICITED:
2835 responseInfo.type = RadioResponseType::SOLICITED;
2836 break;
2837 case RESPONSE_SOLICITED_ACK_EXP:
2838 responseInfo.type = RadioResponseType::SOLICITED_ACK_EXP;
2839 break;
2840 }
2841 responseInfo.error = (RadioError) e;
2842}
2843
Naveen Kalla346bbc02017-03-16 12:55:55 -07002844int responseIntOrEmpty(RadioResponseInfo& responseInfo, int serial, int responseType, RIL_Errno e,
2845 void *response, size_t responseLen) {
2846 populateResponseInfo(responseInfo, serial, responseType, e);
2847 int ret = -1;
2848
2849 if (response == NULL && responseLen == 0) {
2850 // Earlier RILs did not send a response for some cases although the interface
2851 // expected an integer as response. Do not return error if response is empty. Instead
2852 // Return -1 in those cases to maintain backward compatibility.
2853 } else if (response == NULL || responseLen != sizeof(int)) {
2854 RLOGE("responseIntOrEmpty: Invalid response");
2855 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
2856 } else {
2857 int *p_int = (int *) response;
2858 ret = p_int[0];
2859 }
2860 return ret;
2861}
2862
Sanket Padawef220dc52017-01-02 23:46:00 -08002863int responseInt(RadioResponseInfo& responseInfo, int serial, int responseType, RIL_Errno e,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002864 void *response, size_t responseLen) {
Sanket Padawef220dc52017-01-02 23:46:00 -08002865 populateResponseInfo(responseInfo, serial, responseType, e);
2866 int ret = -1;
2867
2868 if (response == NULL || responseLen != sizeof(int)) {
2869 RLOGE("responseInt: Invalid response");
2870 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
2871 } else {
2872 int *p_int = (int *) response;
2873 ret = p_int[0];
2874 }
2875 return ret;
2876}
2877
Amit Mahajan759786a2017-03-03 17:35:47 -08002878int radio::getIccCardStatusResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002879 int responseType, int serial, RIL_Errno e,
2880 void *response, size_t responseLen) {
Sanket Padawef220dc52017-01-02 23:46:00 -08002881 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08002882 RadioResponseInfo responseInfo = {};
Sanket Padawef220dc52017-01-02 23:46:00 -08002883 populateResponseInfo(responseInfo, serial, responseType, e);
Jack Yuf68e0da2017-02-07 14:53:09 -08002884 CardStatus cardStatus = {};
Sanket Padawef220dc52017-01-02 23:46:00 -08002885 if (response == NULL || responseLen != sizeof(RIL_CardStatus_v6)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08002886 RLOGE("getIccCardStatusResponse: Invalid response");
Sanket Padawef220dc52017-01-02 23:46:00 -08002887 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002888 } else {
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002889 RIL_CardStatus_v6 *p_cur = ((RIL_CardStatus_v6 *) response);
2890 cardStatus.cardState = (CardState) p_cur->card_state;
2891 cardStatus.universalPinState = (PinState) p_cur->universal_pin_state;
2892 cardStatus.gsmUmtsSubscriptionAppIndex = p_cur->gsm_umts_subscription_app_index;
2893 cardStatus.cdmaSubscriptionAppIndex = p_cur->cdma_subscription_app_index;
2894 cardStatus.imsSubscriptionAppIndex = p_cur->ims_subscription_app_index;
2895
2896 RIL_AppStatus *rilAppStatus = p_cur->applications;
2897 cardStatus.applications.resize(p_cur->num_applications);
2898 AppStatus *appStatus = cardStatus.applications.data();
Jayachandran C572f2f42017-03-25 14:30:13 -07002899#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002900 RLOGD("getIccCardStatusResponse: num_applications %d", p_cur->num_applications);
Jayachandran C572f2f42017-03-25 14:30:13 -07002901#endif
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002902 for (int i = 0; i < p_cur->num_applications; i++) {
2903 appStatus[i].appType = (AppType) rilAppStatus[i].app_type;
2904 appStatus[i].appState = (AppState) rilAppStatus[i].app_state;
2905 appStatus[i].persoSubstate = (PersoSubstate) rilAppStatus[i].perso_substate;
2906 appStatus[i].aidPtr = convertCharPtrToHidlString(rilAppStatus[i].aid_ptr);
2907 appStatus[i].appLabelPtr = convertCharPtrToHidlString(
2908 rilAppStatus[i].app_label_ptr);
2909 appStatus[i].pin1Replaced = rilAppStatus[i].pin1_replaced;
2910 appStatus[i].pin1 = (PinState) rilAppStatus[i].pin1;
2911 appStatus[i].pin2 = (PinState) rilAppStatus[i].pin2;
2912 }
2913 }
2914
Amit Mahajan17249842017-01-19 15:05:45 -08002915 Return<void> retStatus = radioService[slotId]->mRadioResponse->
2916 getIccCardStatusResponse(responseInfo, cardStatus);
2917 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002918 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08002919 RLOGE("getIccCardStatusResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawef220dc52017-01-02 23:46:00 -08002920 }
2921
2922 return 0;
2923}
2924
Amit Mahajan759786a2017-03-03 17:35:47 -08002925int radio::supplyIccPinForAppResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002926 int responseType, int serial, RIL_Errno e,
2927 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002928#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002929 RLOGD("supplyIccPinForAppResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002930#endif
Sanket Padawef220dc52017-01-02 23:46:00 -08002931
2932 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08002933 RadioResponseInfo responseInfo = {};
Naveen Kalla346bbc02017-03-16 12:55:55 -07002934 int ret = responseIntOrEmpty(responseInfo, serial, responseType, e, response, responseLen);
Amit Mahajan17249842017-01-19 15:05:45 -08002935 Return<void> retStatus = radioService[slotId]->mRadioResponse->
2936 supplyIccPinForAppResponse(responseInfo, ret);
2937 radioService[slotId]->checkReturnStatus(retStatus);
Sanket Padawef220dc52017-01-02 23:46:00 -08002938 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08002939 RLOGE("supplyIccPinForAppResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawef220dc52017-01-02 23:46:00 -08002940 slotId);
2941 }
2942
2943 return 0;
2944}
2945
Amit Mahajan759786a2017-03-03 17:35:47 -08002946int radio::supplyIccPukForAppResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002947 int responseType, int serial, RIL_Errno e,
2948 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002949#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002950 RLOGD("supplyIccPukForAppResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002951#endif
Sanket Padawef220dc52017-01-02 23:46:00 -08002952
2953 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08002954 RadioResponseInfo responseInfo = {};
Naveen Kalla346bbc02017-03-16 12:55:55 -07002955 int ret = responseIntOrEmpty(responseInfo, serial, responseType, e, response, responseLen);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002956 Return<void> retStatus = radioService[slotId]->mRadioResponse->supplyIccPukForAppResponse(
2957 responseInfo, ret);
Amit Mahajan17249842017-01-19 15:05:45 -08002958 radioService[slotId]->checkReturnStatus(retStatus);
Sanket Padawef220dc52017-01-02 23:46:00 -08002959 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08002960 RLOGE("supplyIccPukForAppResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawef220dc52017-01-02 23:46:00 -08002961 slotId);
2962 }
2963
2964 return 0;
2965}
2966
Amit Mahajan759786a2017-03-03 17:35:47 -08002967int radio::supplyIccPin2ForAppResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002968 int responseType, int serial, RIL_Errno e,
2969 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002970#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002971 RLOGD("supplyIccPin2ForAppResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002972#endif
Sanket Padawef220dc52017-01-02 23:46:00 -08002973
2974 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08002975 RadioResponseInfo responseInfo = {};
Naveen Kalla346bbc02017-03-16 12:55:55 -07002976 int ret = responseIntOrEmpty(responseInfo, serial, responseType, e, response, responseLen);
Amit Mahajan17249842017-01-19 15:05:45 -08002977 Return<void> retStatus = radioService[slotId]->mRadioResponse->
2978 supplyIccPin2ForAppResponse(responseInfo, ret);
2979 radioService[slotId]->checkReturnStatus(retStatus);
Sanket Padawef220dc52017-01-02 23:46:00 -08002980 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08002981 RLOGE("supplyIccPin2ForAppResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawef220dc52017-01-02 23:46:00 -08002982 slotId);
2983 }
2984
2985 return 0;
2986}
2987
Amit Mahajan759786a2017-03-03 17:35:47 -08002988int radio::supplyIccPuk2ForAppResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002989 int responseType, int serial, RIL_Errno e,
2990 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002991#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002992 RLOGD("supplyIccPuk2ForAppResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002993#endif
Sanket Padawef220dc52017-01-02 23:46:00 -08002994
2995 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08002996 RadioResponseInfo responseInfo = {};
Naveen Kalla346bbc02017-03-16 12:55:55 -07002997 int ret = responseIntOrEmpty(responseInfo, serial, responseType, e, response, responseLen);
Amit Mahajan17249842017-01-19 15:05:45 -08002998 Return<void> retStatus = radioService[slotId]->mRadioResponse->
2999 supplyIccPuk2ForAppResponse(responseInfo, ret);
3000 radioService[slotId]->checkReturnStatus(retStatus);
Sanket Padawef220dc52017-01-02 23:46:00 -08003001 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003002 RLOGE("supplyIccPuk2ForAppResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawef220dc52017-01-02 23:46:00 -08003003 slotId);
3004 }
3005
3006 return 0;
3007}
3008
Amit Mahajan759786a2017-03-03 17:35:47 -08003009int radio::changeIccPinForAppResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003010 int responseType, int serial, RIL_Errno e,
3011 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003012#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003013 RLOGD("changeIccPinForAppResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003014#endif
Sanket Padawef220dc52017-01-02 23:46:00 -08003015
3016 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003017 RadioResponseInfo responseInfo = {};
Naveen Kalla346bbc02017-03-16 12:55:55 -07003018 int ret = responseIntOrEmpty(responseInfo, serial, responseType, e, response, responseLen);
Amit Mahajan17249842017-01-19 15:05:45 -08003019 Return<void> retStatus = radioService[slotId]->mRadioResponse->
3020 changeIccPinForAppResponse(responseInfo, ret);
3021 radioService[slotId]->checkReturnStatus(retStatus);
Sanket Padawef220dc52017-01-02 23:46:00 -08003022 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003023 RLOGE("changeIccPinForAppResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawef220dc52017-01-02 23:46:00 -08003024 slotId);
3025 }
3026
3027 return 0;
3028}
3029
Amit Mahajan759786a2017-03-03 17:35:47 -08003030int radio::changeIccPin2ForAppResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003031 int responseType, int serial, RIL_Errno e,
3032 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003033#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003034 RLOGD("changeIccPin2ForAppResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003035#endif
Sanket Padawef220dc52017-01-02 23:46:00 -08003036
3037 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003038 RadioResponseInfo responseInfo = {};
Naveen Kalla346bbc02017-03-16 12:55:55 -07003039 int ret = responseIntOrEmpty(responseInfo, serial, responseType, e, response, responseLen);
Amit Mahajan17249842017-01-19 15:05:45 -08003040 Return<void> retStatus = radioService[slotId]->mRadioResponse->
3041 changeIccPin2ForAppResponse(responseInfo, ret);
3042 radioService[slotId]->checkReturnStatus(retStatus);
Sanket Padawef220dc52017-01-02 23:46:00 -08003043 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003044 RLOGE("changeIccPin2ForAppResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawef220dc52017-01-02 23:46:00 -08003045 slotId);
3046 }
3047
3048 return 0;
3049}
3050
Amit Mahajan759786a2017-03-03 17:35:47 -08003051int radio::supplyNetworkDepersonalizationResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003052 int responseType, int serial, RIL_Errno e,
3053 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003054#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003055 RLOGD("supplyNetworkDepersonalizationResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003056#endif
Sanket Padawef220dc52017-01-02 23:46:00 -08003057
3058 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003059 RadioResponseInfo responseInfo = {};
Naveen Kalla346bbc02017-03-16 12:55:55 -07003060 int ret = responseIntOrEmpty(responseInfo, serial, responseType, e, response, responseLen);
Amit Mahajan17249842017-01-19 15:05:45 -08003061 Return<void> retStatus = radioService[slotId]->mRadioResponse->
3062 supplyNetworkDepersonalizationResponse(responseInfo, ret);
3063 radioService[slotId]->checkReturnStatus(retStatus);
Sanket Padawef220dc52017-01-02 23:46:00 -08003064 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003065 RLOGE("supplyNetworkDepersonalizationResponse: radioService[%d]->mRadioResponse == "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003066 "NULL", slotId);
Sanket Padawef220dc52017-01-02 23:46:00 -08003067 }
3068
3069 return 0;
3070}
3071
Amit Mahajan759786a2017-03-03 17:35:47 -08003072int radio::getCurrentCallsResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003073 int responseType, int serial, RIL_Errno e,
3074 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003075#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003076 RLOGD("getCurrentCallsResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003077#endif
Sanket Padawef220dc52017-01-02 23:46:00 -08003078
3079 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003080 RadioResponseInfo responseInfo = {};
Sanket Padawef220dc52017-01-02 23:46:00 -08003081 populateResponseInfo(responseInfo, serial, responseType, e);
3082
3083 hidl_vec<Call> calls;
3084 if (response == NULL || (responseLen % sizeof(RIL_Call *)) != 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003085 RLOGE("getCurrentCallsResponse: Invalid response");
Amit Mahajan5829a472016-12-28 17:28:07 -08003086 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
Sanket Padawef220dc52017-01-02 23:46:00 -08003087 } else {
3088 int num = responseLen / sizeof(RIL_Call *);
3089 calls.resize(num);
3090
3091 for (int i = 0 ; i < num ; i++) {
3092 RIL_Call *p_cur = ((RIL_Call **) response)[i];
3093 /* each call info */
3094 calls[i].state = (CallState) p_cur->state;
3095 calls[i].index = p_cur->index;
3096 calls[i].toa = p_cur->toa;
3097 calls[i].isMpty = p_cur->isMpty;
3098 calls[i].isMT = p_cur->isMT;
3099 calls[i].als = p_cur->als;
3100 calls[i].isVoice = p_cur->isVoice;
3101 calls[i].isVoicePrivacy = p_cur->isVoicePrivacy;
3102 calls[i].number = convertCharPtrToHidlString(p_cur->number);
3103 calls[i].numberPresentation = (CallPresentation) p_cur->numberPresentation;
3104 calls[i].name = convertCharPtrToHidlString(p_cur->name);
3105 calls[i].namePresentation = (CallPresentation) p_cur->namePresentation;
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003106 if (p_cur->uusInfo != NULL && p_cur->uusInfo->uusData != NULL) {
Sanket Padawef220dc52017-01-02 23:46:00 -08003107 RIL_UUS_Info *uusInfo = p_cur->uusInfo;
3108 calls[i].uusInfo[0].uusType = (UusType) uusInfo->uusType;
3109 calls[i].uusInfo[0].uusDcs = (UusDcs) uusInfo->uusDcs;
3110 // convert uusInfo->uusData to a null-terminated string
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003111 char *nullTermStr = strndup(uusInfo->uusData, uusInfo->uusLength);
3112 calls[i].uusInfo[0].uusData = nullTermStr;
3113 free(nullTermStr);
Sanket Padawef220dc52017-01-02 23:46:00 -08003114 }
3115 }
3116 }
3117
Amit Mahajan17249842017-01-19 15:05:45 -08003118 Return<void> retStatus = radioService[slotId]->mRadioResponse->
3119 getCurrentCallsResponse(responseInfo, calls);
3120 radioService[slotId]->checkReturnStatus(retStatus);
Sanket Padawef220dc52017-01-02 23:46:00 -08003121 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003122 RLOGE("getCurrentCallsResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawef220dc52017-01-02 23:46:00 -08003123 }
3124
3125 return 0;
3126}
3127
Amit Mahajan759786a2017-03-03 17:35:47 -08003128int radio::dialResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003129 int responseType, int serial, RIL_Errno e, void *response,
3130 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003131#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003132 RLOGD("dialResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003133#endif
Sanket Padawef220dc52017-01-02 23:46:00 -08003134
3135 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003136 RadioResponseInfo responseInfo = {};
Sanket Padawef220dc52017-01-02 23:46:00 -08003137 populateResponseInfo(responseInfo, serial, responseType, e);
Amit Mahajan17249842017-01-19 15:05:45 -08003138 Return<void> retStatus = radioService[slotId]->mRadioResponse->dialResponse(responseInfo);
3139 radioService[slotId]->checkReturnStatus(retStatus);
Sanket Padawef220dc52017-01-02 23:46:00 -08003140 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003141 RLOGE("dialResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Amit Mahajancd77a5b2016-08-25 11:19:21 -07003142 }
3143
3144 return 0;
3145}
3146
Amit Mahajan759786a2017-03-03 17:35:47 -08003147int radio::getIMSIForAppResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003148 int responseType, int serial, RIL_Errno e, void *response,
3149 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003150#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003151 RLOGD("getIMSIForAppResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003152#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003153
3154 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003155 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003156 populateResponseInfo(responseInfo, serial, responseType, e);
3157 Return<void> retStatus = radioService[slotId]->mRadioResponse->getIMSIForAppResponse(
3158 responseInfo, convertCharPtrToHidlString((char *) response));
3159 radioService[slotId]->checkReturnStatus(retStatus);
3160 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003161 RLOGE("getIMSIForAppResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003162 slotId);
3163 }
3164
3165 return 0;
3166}
3167
Amit Mahajan759786a2017-03-03 17:35:47 -08003168int radio::hangupConnectionResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003169 int responseType, int serial, RIL_Errno e,
3170 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003171#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003172 RLOGD("hangupConnectionResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003173#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003174
3175 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003176 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003177 populateResponseInfo(responseInfo, serial, responseType, e);
3178 Return<void> retStatus = radioService[slotId]->mRadioResponse->hangupConnectionResponse(
3179 responseInfo);
3180 radioService[slotId]->checkReturnStatus(retStatus);
3181 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003182 RLOGE("hangupConnectionResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003183 slotId);
3184 }
3185
3186 return 0;
3187}
3188
Amit Mahajan759786a2017-03-03 17:35:47 -08003189int radio::hangupWaitingOrBackgroundResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003190 int responseType, int serial, RIL_Errno e,
3191 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003192#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003193 RLOGD("hangupWaitingOrBackgroundResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003194#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003195
3196 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003197 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003198 populateResponseInfo(responseInfo, serial, responseType, e);
3199 Return<void> retStatus =
3200 radioService[slotId]->mRadioResponse->hangupWaitingOrBackgroundResponse(
3201 responseInfo);
3202 radioService[slotId]->checkReturnStatus(retStatus);
3203 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003204 RLOGE("hangupWaitingOrBackgroundResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003205 slotId);
3206 }
3207
3208 return 0;
3209}
3210
Amit Mahajan759786a2017-03-03 17:35:47 -08003211int radio::hangupForegroundResumeBackgroundResponse(int slotId, int responseType, int serial,
3212 RIL_Errno e, void *response,
3213 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003214#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003215 RLOGD("hangupWaitingOrBackgroundResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003216#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003217
3218 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003219 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003220 populateResponseInfo(responseInfo, serial, responseType, e);
3221 Return<void> retStatus =
3222 radioService[slotId]->mRadioResponse->hangupWaitingOrBackgroundResponse(
3223 responseInfo);
3224 radioService[slotId]->checkReturnStatus(retStatus);
3225 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003226 RLOGE("hangupWaitingOrBackgroundResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003227 slotId);
3228 }
3229
3230 return 0;
3231}
3232
Amit Mahajan759786a2017-03-03 17:35:47 -08003233int radio::switchWaitingOrHoldingAndActiveResponse(int slotId, int responseType, int serial,
3234 RIL_Errno e, void *response,
3235 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003236#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003237 RLOGD("switchWaitingOrHoldingAndActiveResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003238#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003239
3240 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003241 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003242 populateResponseInfo(responseInfo, serial, responseType, e);
3243 Return<void> retStatus =
3244 radioService[slotId]->mRadioResponse->switchWaitingOrHoldingAndActiveResponse(
3245 responseInfo);
3246 radioService[slotId]->checkReturnStatus(retStatus);
3247 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003248 RLOGE("switchWaitingOrHoldingAndActiveResponse: radioService[%d]->mRadioResponse "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003249 "== NULL", slotId);
3250 }
3251
3252 return 0;
3253}
3254
Amit Mahajan759786a2017-03-03 17:35:47 -08003255int radio::conferenceResponse(int slotId, int responseType,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003256 int serial, RIL_Errno e, void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003257#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003258 RLOGD("conferenceResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003259#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003260
3261 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003262 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003263 populateResponseInfo(responseInfo, serial, responseType, e);
3264 Return<void> retStatus = radioService[slotId]->mRadioResponse->conferenceResponse(
3265 responseInfo);
3266 radioService[slotId]->checkReturnStatus(retStatus);
3267 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003268 RLOGE("conferenceResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003269 slotId);
3270 }
3271
3272 return 0;
3273}
3274
Amit Mahajan759786a2017-03-03 17:35:47 -08003275int radio::rejectCallResponse(int slotId, int responseType,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003276 int serial, RIL_Errno e, void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003277#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003278 RLOGD("rejectCallResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003279#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003280
3281 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003282 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003283 populateResponseInfo(responseInfo, serial, responseType, e);
3284 Return<void> retStatus = radioService[slotId]->mRadioResponse->rejectCallResponse(
3285 responseInfo);
3286 radioService[slotId]->checkReturnStatus(retStatus);
3287 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003288 RLOGE("rejectCallResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003289 slotId);
3290 }
3291
3292 return 0;
3293}
3294
Amit Mahajan759786a2017-03-03 17:35:47 -08003295int radio::getLastCallFailCauseResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003296 int responseType, int serial, RIL_Errno e, void *response,
3297 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003298#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003299 RLOGD("getLastCallFailCauseResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003300#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003301
3302 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003303 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003304 populateResponseInfo(responseInfo, serial, responseType, e);
Jack Yuf68e0da2017-02-07 14:53:09 -08003305
3306 LastCallFailCauseInfo info = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003307 info.vendorCause = hidl_string();
3308 if (response == NULL) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003309 RLOGE("getCurrentCallsResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003310 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
3311 } else if (responseLen == sizeof(int)) {
3312 int *pInt = (int *) response;
3313 info.causeCode = (LastCallFailCause) pInt[0];
3314 } else if (responseLen == sizeof(RIL_LastCallFailCauseInfo)) {
3315 RIL_LastCallFailCauseInfo *pFailCauseInfo = (RIL_LastCallFailCauseInfo *) response;
3316 info.causeCode = (LastCallFailCause) pFailCauseInfo->cause_code;
3317 info.vendorCause = convertCharPtrToHidlString(pFailCauseInfo->vendor_cause);
3318 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003319 RLOGE("getCurrentCallsResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003320 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
3321 }
3322
3323 Return<void> retStatus = radioService[slotId]->mRadioResponse->getLastCallFailCauseResponse(
3324 responseInfo, info);
3325 radioService[slotId]->checkReturnStatus(retStatus);
3326 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003327 RLOGE("getLastCallFailCauseResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003328 slotId);
3329 }
3330
3331 return 0;
3332}
3333
Amit Mahajan759786a2017-03-03 17:35:47 -08003334int radio::getSignalStrengthResponse(int slotId,
Amit Mahajan3df62912017-02-10 01:35:55 +00003335 int responseType, int serial, RIL_Errno e,
3336 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003337#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003338 RLOGD("getSignalStrengthResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003339#endif
Amit Mahajan3df62912017-02-10 01:35:55 +00003340
3341 if (radioService[slotId]->mRadioResponse != NULL) {
Amit Mahajan3da9ac02017-02-13 13:41:28 -08003342 RadioResponseInfo responseInfo = {};
Amit Mahajan3df62912017-02-10 01:35:55 +00003343 populateResponseInfo(responseInfo, serial, responseType, e);
Amit Mahajan3da9ac02017-02-13 13:41:28 -08003344 SignalStrength signalStrength = {};
Amit Mahajan3df62912017-02-10 01:35:55 +00003345 if (response == NULL || responseLen != sizeof(RIL_SignalStrength_v10)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003346 RLOGE("getSignalStrengthResponse: Invalid response");
Amit Mahajan3df62912017-02-10 01:35:55 +00003347 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
3348 } else {
3349 convertRilSignalStrengthToHal(response, responseLen, signalStrength);
3350 }
3351
3352 Return<void> retStatus = radioService[slotId]->mRadioResponse->getSignalStrengthResponse(
3353 responseInfo, signalStrength);
3354 radioService[slotId]->checkReturnStatus(retStatus);
3355 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003356 RLOGE("getSignalStrengthResponse: radioService[%d]->mRadioResponse == NULL",
Amit Mahajan3df62912017-02-10 01:35:55 +00003357 slotId);
3358 }
3359
3360 return 0;
3361}
3362
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003363RIL_CellInfoType getCellInfoTypeRadioTechnology(char *rat) {
3364 if (rat == NULL) {
3365 return RIL_CELL_INFO_TYPE_NONE;
3366 }
3367
3368 int radioTech = atoi(rat);
3369
3370 switch(radioTech) {
3371
3372 case RADIO_TECH_GPRS:
3373 case RADIO_TECH_EDGE:
3374 case RADIO_TECH_GSM: {
3375 return RIL_CELL_INFO_TYPE_GSM;
3376 }
3377
3378 case RADIO_TECH_UMTS:
3379 case RADIO_TECH_HSDPA:
3380 case RADIO_TECH_HSUPA:
3381 case RADIO_TECH_HSPA:
3382 case RADIO_TECH_HSPAP: {
3383 return RIL_CELL_INFO_TYPE_WCDMA;
3384 }
3385
3386 case RADIO_TECH_IS95A:
3387 case RADIO_TECH_IS95B:
3388 case RADIO_TECH_1xRTT:
3389 case RADIO_TECH_EVDO_0:
3390 case RADIO_TECH_EVDO_A:
3391 case RADIO_TECH_EVDO_B:
3392 case RADIO_TECH_EHRPD: {
3393 return RIL_CELL_INFO_TYPE_CDMA;
3394 }
3395
3396 case RADIO_TECH_LTE:
3397 case RADIO_TECH_LTE_CA: {
3398 return RIL_CELL_INFO_TYPE_LTE;
3399 }
3400
3401 case RADIO_TECH_TD_SCDMA: {
3402 return RIL_CELL_INFO_TYPE_TD_SCDMA;
3403 }
3404
3405 default: {
3406 break;
3407 }
3408 }
3409
3410 return RIL_CELL_INFO_TYPE_NONE;
3411
3412}
3413
3414void fillCellIdentityResponse(CellIdentity &cellIdentity, RIL_CellIdentity_v16 &rilCellIdentity) {
3415
3416 cellIdentity.cellIdentityGsm.resize(0);
3417 cellIdentity.cellIdentityWcdma.resize(0);
3418 cellIdentity.cellIdentityCdma.resize(0);
3419 cellIdentity.cellIdentityTdscdma.resize(0);
3420 cellIdentity.cellIdentityLte.resize(0);
3421 cellIdentity.cellInfoType = (CellInfoType)rilCellIdentity.cellInfoType;
3422 switch(rilCellIdentity.cellInfoType) {
3423
3424 case RIL_CELL_INFO_TYPE_GSM: {
3425 cellIdentity.cellIdentityGsm.resize(1);
3426 cellIdentity.cellIdentityGsm[0].mcc =
3427 std::to_string(rilCellIdentity.cellIdentityGsm.mcc);
3428 cellIdentity.cellIdentityGsm[0].mnc =
3429 std::to_string(rilCellIdentity.cellIdentityGsm.mnc);
3430 cellIdentity.cellIdentityGsm[0].lac = rilCellIdentity.cellIdentityGsm.lac;
3431 cellIdentity.cellIdentityGsm[0].cid = rilCellIdentity.cellIdentityGsm.cid;
3432 cellIdentity.cellIdentityGsm[0].arfcn = rilCellIdentity.cellIdentityGsm.arfcn;
3433 cellIdentity.cellIdentityGsm[0].bsic = rilCellIdentity.cellIdentityGsm.bsic;
3434 break;
3435 }
3436
3437 case RIL_CELL_INFO_TYPE_WCDMA: {
3438 cellIdentity.cellIdentityWcdma.resize(1);
3439 cellIdentity.cellIdentityWcdma[0].mcc =
3440 std::to_string(rilCellIdentity.cellIdentityWcdma.mcc);
3441 cellIdentity.cellIdentityWcdma[0].mnc =
3442 std::to_string(rilCellIdentity.cellIdentityWcdma.mnc);
3443 cellIdentity.cellIdentityWcdma[0].lac = rilCellIdentity.cellIdentityWcdma.lac;
3444 cellIdentity.cellIdentityWcdma[0].cid = rilCellIdentity.cellIdentityWcdma.cid;
3445 cellIdentity.cellIdentityWcdma[0].psc = rilCellIdentity.cellIdentityWcdma.psc;
3446 cellIdentity.cellIdentityWcdma[0].uarfcn = rilCellIdentity.cellIdentityWcdma.uarfcn;
3447 break;
3448 }
3449
3450 case RIL_CELL_INFO_TYPE_CDMA: {
3451 cellIdentity.cellIdentityCdma.resize(1);
3452 cellIdentity.cellIdentityCdma[0].networkId = rilCellIdentity.cellIdentityCdma.networkId;
3453 cellIdentity.cellIdentityCdma[0].systemId = rilCellIdentity.cellIdentityCdma.systemId;
3454 cellIdentity.cellIdentityCdma[0].baseStationId =
3455 rilCellIdentity.cellIdentityCdma.basestationId;
3456 cellIdentity.cellIdentityCdma[0].longitude = rilCellIdentity.cellIdentityCdma.longitude;
3457 cellIdentity.cellIdentityCdma[0].latitude = rilCellIdentity.cellIdentityCdma.latitude;
3458 break;
3459 }
3460
3461 case RIL_CELL_INFO_TYPE_LTE: {
3462 cellIdentity.cellIdentityLte.resize(1);
3463 cellIdentity.cellIdentityLte[0].mcc =
3464 std::to_string(rilCellIdentity.cellIdentityLte.mcc);
3465 cellIdentity.cellIdentityLte[0].mnc =
3466 std::to_string(rilCellIdentity.cellIdentityLte.mnc);
3467 cellIdentity.cellIdentityLte[0].ci = rilCellIdentity.cellIdentityLte.ci;
3468 cellIdentity.cellIdentityLte[0].pci = rilCellIdentity.cellIdentityLte.pci;
3469 cellIdentity.cellIdentityLte[0].tac = rilCellIdentity.cellIdentityLte.tac;
3470 cellIdentity.cellIdentityLte[0].earfcn = rilCellIdentity.cellIdentityLte.earfcn;
3471 break;
3472 }
3473
3474 case RIL_CELL_INFO_TYPE_TD_SCDMA: {
3475 cellIdentity.cellIdentityTdscdma.resize(1);
3476 cellIdentity.cellIdentityTdscdma[0].mcc =
3477 std::to_string(rilCellIdentity.cellIdentityTdscdma.mcc);
3478 cellIdentity.cellIdentityTdscdma[0].mnc =
3479 std::to_string(rilCellIdentity.cellIdentityTdscdma.mnc);
3480 cellIdentity.cellIdentityTdscdma[0].lac = rilCellIdentity.cellIdentityTdscdma.lac;
3481 cellIdentity.cellIdentityTdscdma[0].cid = rilCellIdentity.cellIdentityTdscdma.cid;
3482 cellIdentity.cellIdentityTdscdma[0].cpid = rilCellIdentity.cellIdentityTdscdma.cpid;
3483 break;
3484 }
3485
3486 default: {
3487 break;
3488 }
3489 }
3490}
3491
3492int convertResponseStringEntryToInt(char **response, int index, int numStrings) {
3493 if ((response != NULL) && (numStrings > index) && (response[index] != NULL)) {
3494 return atoi(response[index]);
3495 }
3496
3497 return -1;
3498}
3499
3500void fillCellIdentityFromVoiceRegStateResponseString(CellIdentity &cellIdentity,
3501 int numStrings, char** response) {
3502
3503 RIL_CellIdentity_v16 rilCellIdentity;
Jack Yu8e732d42017-04-14 00:08:06 -07003504 memset(&rilCellIdentity, -1, sizeof(RIL_CellIdentity_v16));
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003505
3506 rilCellIdentity.cellInfoType = getCellInfoTypeRadioTechnology(response[3]);
3507 switch(rilCellIdentity.cellInfoType) {
3508
3509 case RIL_CELL_INFO_TYPE_GSM: {
3510 rilCellIdentity.cellIdentityGsm.lac =
3511 convertResponseStringEntryToInt(response, 1, numStrings);
3512 rilCellIdentity.cellIdentityGsm.cid =
3513 convertResponseStringEntryToInt(response, 2, numStrings);
3514 break;
3515 }
3516
3517 case RIL_CELL_INFO_TYPE_WCDMA: {
3518 rilCellIdentity.cellIdentityWcdma.lac =
3519 convertResponseStringEntryToInt(response, 1, numStrings);
3520 rilCellIdentity.cellIdentityWcdma.cid =
3521 convertResponseStringEntryToInt(response, 2, numStrings);
3522 rilCellIdentity.cellIdentityWcdma.psc =
3523 convertResponseStringEntryToInt(response, 14, numStrings);
3524 break;
3525 }
3526
3527 case RIL_CELL_INFO_TYPE_TD_SCDMA:{
3528 rilCellIdentity.cellIdentityTdscdma.lac =
3529 convertResponseStringEntryToInt(response, 1, numStrings);
3530 rilCellIdentity.cellIdentityTdscdma.cid =
3531 convertResponseStringEntryToInt(response, 2, numStrings);
3532 break;
3533 }
3534
3535 case RIL_CELL_INFO_TYPE_CDMA:{
3536 rilCellIdentity.cellIdentityCdma.basestationId =
3537 convertResponseStringEntryToInt(response, 4, numStrings);
3538 rilCellIdentity.cellIdentityCdma.longitude =
3539 convertResponseStringEntryToInt(response, 5, numStrings);
3540 rilCellIdentity.cellIdentityCdma.latitude =
3541 convertResponseStringEntryToInt(response, 6, numStrings);
3542 rilCellIdentity.cellIdentityCdma.systemId =
3543 convertResponseStringEntryToInt(response, 8, numStrings);
3544 rilCellIdentity.cellIdentityCdma.networkId =
3545 convertResponseStringEntryToInt(response, 9, numStrings);
3546 break;
3547 }
3548
Sooraj Sasindranf28e42a2017-03-06 23:07:22 -08003549 case RIL_CELL_INFO_TYPE_LTE:{
3550 rilCellIdentity.cellIdentityLte.tac =
3551 convertResponseStringEntryToInt(response, 1, numStrings);
3552 rilCellIdentity.cellIdentityLte.ci =
3553 convertResponseStringEntryToInt(response, 2, numStrings);
3554 break;
3555 }
3556
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003557 default: {
3558 break;
3559 }
3560 }
3561
3562 fillCellIdentityResponse(cellIdentity, rilCellIdentity);
3563}
3564
3565void fillCellIdentityFromDataRegStateResponseString(CellIdentity &cellIdentity,
3566 int numStrings, char** response) {
3567
3568 RIL_CellIdentity_v16 rilCellIdentity;
Jack Yu8e732d42017-04-14 00:08:06 -07003569 memset(&rilCellIdentity, -1, sizeof(RIL_CellIdentity_v16));
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003570
3571 rilCellIdentity.cellInfoType = getCellInfoTypeRadioTechnology(response[3]);
3572 switch(rilCellIdentity.cellInfoType) {
3573 case RIL_CELL_INFO_TYPE_GSM: {
3574 rilCellIdentity.cellIdentityGsm.lac =
3575 convertResponseStringEntryToInt(response, 1, numStrings);
3576 rilCellIdentity.cellIdentityGsm.cid =
3577 convertResponseStringEntryToInt(response, 2, numStrings);
3578 break;
3579 }
3580 case RIL_CELL_INFO_TYPE_WCDMA: {
3581 rilCellIdentity.cellIdentityWcdma.lac =
3582 convertResponseStringEntryToInt(response, 1, numStrings);
3583 rilCellIdentity.cellIdentityWcdma.cid =
3584 convertResponseStringEntryToInt(response, 2, numStrings);
3585 break;
3586 }
3587 case RIL_CELL_INFO_TYPE_TD_SCDMA:{
3588 rilCellIdentity.cellIdentityTdscdma.lac =
3589 convertResponseStringEntryToInt(response, 1, numStrings);
3590 rilCellIdentity.cellIdentityTdscdma.cid =
3591 convertResponseStringEntryToInt(response, 2, numStrings);
3592 break;
3593 }
3594 case RIL_CELL_INFO_TYPE_LTE: {
3595 rilCellIdentity.cellIdentityLte.tac =
3596 convertResponseStringEntryToInt(response, 6, numStrings);
3597 rilCellIdentity.cellIdentityLte.pci =
3598 convertResponseStringEntryToInt(response, 7, numStrings);
3599 rilCellIdentity.cellIdentityLte.ci =
3600 convertResponseStringEntryToInt(response, 8, numStrings);
3601 break;
3602 }
3603 default: {
3604 break;
3605 }
3606 }
3607
3608 fillCellIdentityResponse(cellIdentity, rilCellIdentity);
3609}
3610
Amit Mahajan759786a2017-03-03 17:35:47 -08003611int radio::getVoiceRegistrationStateResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003612 int responseType, int serial, RIL_Errno e,
3613 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003614#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003615 RLOGD("getVoiceRegistrationStateResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003616#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003617
3618 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003619 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003620 populateResponseInfo(responseInfo, serial, responseType, e);
3621
Jack Yuf68e0da2017-02-07 14:53:09 -08003622 VoiceRegStateResult voiceRegResponse = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003623 int numStrings = responseLen / sizeof(char *);
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003624 if (response == NULL) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003625 RLOGE("getVoiceRegistrationStateResponse Invalid response: NULL");
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003626 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
3627 } else if (s_vendorFunctions->version <= 14) {
3628 if (numStrings != 15) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003629 RLOGE("getVoiceRegistrationStateResponse Invalid response: NULL");
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003630 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
3631 } else {
3632 char **resp = (char **) response;
3633 voiceRegResponse.regState = (RegState) ATOI_NULL_HANDLED_DEF(resp[0], 4);
3634 voiceRegResponse.rat = ATOI_NULL_HANDLED(resp[3]);
3635 voiceRegResponse.cssSupported = ATOI_NULL_HANDLED_DEF(resp[7], 0);
3636 voiceRegResponse.roamingIndicator = ATOI_NULL_HANDLED(resp[10]);
3637 voiceRegResponse.systemIsInPrl = ATOI_NULL_HANDLED_DEF(resp[11], 0);
3638 voiceRegResponse.defaultRoamingIndicator = ATOI_NULL_HANDLED_DEF(resp[12], 0);
3639 voiceRegResponse.reasonForDenial = ATOI_NULL_HANDLED_DEF(resp[13], 0);
3640 fillCellIdentityFromVoiceRegStateResponseString(voiceRegResponse.cellIdentity,
3641 numStrings, resp);
3642 }
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003643 } else {
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003644 RIL_VoiceRegistrationStateResponse *voiceRegState =
3645 (RIL_VoiceRegistrationStateResponse *)response;
3646
3647 if (responseLen != sizeof(RIL_VoiceRegistrationStateResponse)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003648 RLOGE("getVoiceRegistrationStateResponse Invalid response: NULL");
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003649 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
3650 } else {
3651 voiceRegResponse.regState = (RegState) voiceRegState->regState;
3652 voiceRegResponse.rat = voiceRegState->rat;;
3653 voiceRegResponse.cssSupported = voiceRegState->cssSupported;
3654 voiceRegResponse.roamingIndicator = voiceRegState->roamingIndicator;
3655 voiceRegResponse.systemIsInPrl = voiceRegState->systemIsInPrl;
3656 voiceRegResponse.defaultRoamingIndicator = voiceRegState->defaultRoamingIndicator;
3657 voiceRegResponse.reasonForDenial = voiceRegState->reasonForDenial;
3658 fillCellIdentityResponse(voiceRegResponse.cellIdentity,
3659 voiceRegState->cellIdentity);
3660 }
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003661 }
3662
3663 Return<void> retStatus =
3664 radioService[slotId]->mRadioResponse->getVoiceRegistrationStateResponse(
3665 responseInfo, voiceRegResponse);
3666 radioService[slotId]->checkReturnStatus(retStatus);
3667 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003668 RLOGE("getVoiceRegistrationStateResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003669 slotId);
3670 }
3671
3672 return 0;
3673}
3674
Amit Mahajan759786a2017-03-03 17:35:47 -08003675int radio::getDataRegistrationStateResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003676 int responseType, int serial, RIL_Errno e,
3677 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003678#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003679 RLOGD("getDataRegistrationStateResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003680#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003681
3682 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003683 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003684 populateResponseInfo(responseInfo, serial, responseType, e);
Jack Yuf68e0da2017-02-07 14:53:09 -08003685 DataRegStateResult dataRegResponse = {};
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003686 if (response == NULL) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003687 RLOGE("getDataRegistrationStateResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003688 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003689 } else if (s_vendorFunctions->version <= 14) {
3690 int numStrings = responseLen / sizeof(char *);
3691 if ((numStrings != 6) && (numStrings != 11)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003692 RLOGE("getDataRegistrationStateResponse Invalid response: NULL");
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003693 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
3694 } else {
3695 char **resp = (char **) response;
3696 dataRegResponse.regState = (RegState) ATOI_NULL_HANDLED_DEF(resp[0], 4);
3697 dataRegResponse.rat = ATOI_NULL_HANDLED_DEF(resp[3], 0);
3698 dataRegResponse.reasonDataDenied = ATOI_NULL_HANDLED(resp[4]);
3699 dataRegResponse.maxDataCalls = ATOI_NULL_HANDLED_DEF(resp[5], 1);
3700 fillCellIdentityFromDataRegStateResponseString(dataRegResponse.cellIdentity,
3701 numStrings, resp);
3702 }
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003703 } else {
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003704 RIL_DataRegistrationStateResponse *dataRegState =
3705 (RIL_DataRegistrationStateResponse *)response;
3706
3707 if (responseLen != sizeof(RIL_DataRegistrationStateResponse)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003708 RLOGE("getDataRegistrationStateResponse Invalid response: NULL");
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003709 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
3710 } else {
3711 dataRegResponse.regState = (RegState) dataRegState->regState;
3712 dataRegResponse.rat = dataRegState->rat;;
3713 dataRegResponse.reasonDataDenied = dataRegState->reasonDataDenied;
3714 dataRegResponse.maxDataCalls = dataRegState->maxDataCalls;
3715 fillCellIdentityResponse(dataRegResponse.cellIdentity, dataRegState->cellIdentity);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003716 }
3717 }
3718
3719 Return<void> retStatus =
3720 radioService[slotId]->mRadioResponse->getDataRegistrationStateResponse(responseInfo,
3721 dataRegResponse);
3722 radioService[slotId]->checkReturnStatus(retStatus);
3723 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003724 RLOGE("getDataRegistrationStateResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003725 slotId);
3726 }
3727
3728 return 0;
3729}
3730
Amit Mahajan759786a2017-03-03 17:35:47 -08003731int radio::getOperatorResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003732 int responseType, int serial, RIL_Errno e, void *response,
3733 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003734#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003735 RLOGD("getOperatorResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003736#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003737
3738 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003739 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003740 populateResponseInfo(responseInfo, serial, responseType, e);
3741 hidl_string longName;
3742 hidl_string shortName;
3743 hidl_string numeric;
3744 int numStrings = responseLen / sizeof(char *);
3745 if (response == NULL || numStrings != 3) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003746 RLOGE("getOperatorResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003747 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
3748
3749 } else {
3750 char **resp = (char **) response;
3751 longName = convertCharPtrToHidlString(resp[0]);
3752 shortName = convertCharPtrToHidlString(resp[1]);
3753 numeric = convertCharPtrToHidlString(resp[2]);
3754 }
3755 Return<void> retStatus = radioService[slotId]->mRadioResponse->getOperatorResponse(
3756 responseInfo, longName, shortName, numeric);
3757 radioService[slotId]->checkReturnStatus(retStatus);
3758 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003759 RLOGE("getOperatorResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003760 slotId);
3761 }
3762
3763 return 0;
3764}
3765
Amit Mahajan759786a2017-03-03 17:35:47 -08003766int radio::setRadioPowerResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003767 int responseType, int serial, RIL_Errno e, void *response,
3768 size_t responseLen) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003769 RLOGD("setRadioPowerResponse: serial %d", serial);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003770
3771 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003772 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003773 populateResponseInfo(responseInfo, serial, responseType, e);
3774 Return<void> retStatus = radioService[slotId]->mRadioResponse->setRadioPowerResponse(
3775 responseInfo);
3776 radioService[slotId]->checkReturnStatus(retStatus);
3777 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003778 RLOGE("setRadioPowerResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003779 slotId);
3780 }
3781
3782 return 0;
3783}
3784
Amit Mahajan759786a2017-03-03 17:35:47 -08003785int radio::sendDtmfResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003786 int responseType, int serial, RIL_Errno e, void *response,
3787 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003788#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003789 RLOGD("sendDtmfResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003790#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003791
3792 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003793 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003794 populateResponseInfo(responseInfo, serial, responseType, e);
3795 Return<void> retStatus = radioService[slotId]->mRadioResponse->sendDtmfResponse(
3796 responseInfo);
3797 radioService[slotId]->checkReturnStatus(retStatus);
3798 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003799 RLOGE("sendDtmfResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003800 slotId);
3801 }
3802
3803 return 0;
3804}
3805
3806SendSmsResult makeSendSmsResult(RadioResponseInfo& responseInfo, int serial, int responseType,
3807 RIL_Errno e, void *response, size_t responseLen) {
3808 populateResponseInfo(responseInfo, serial, responseType, e);
Jack Yuf68e0da2017-02-07 14:53:09 -08003809 SendSmsResult result = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003810
3811 if (response == NULL || responseLen != sizeof(RIL_SMS_Response)) {
3812 RLOGE("Invalid response: NULL");
3813 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003814 result.ackPDU = hidl_string();
3815 } else {
3816 RIL_SMS_Response *resp = (RIL_SMS_Response *) response;
3817 result.messageRef = resp->messageRef;
3818 result.ackPDU = convertCharPtrToHidlString(resp->ackPDU);
3819 result.errorCode = resp->errorCode;
3820 }
3821 return result;
3822}
3823
Amit Mahajan759786a2017-03-03 17:35:47 -08003824int radio::sendSmsResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003825 int responseType, int serial, RIL_Errno e, void *response,
3826 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003827#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003828 RLOGD("sendSmsResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003829#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003830
3831 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003832 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003833 SendSmsResult result = makeSendSmsResult(responseInfo, serial, responseType, e, response,
3834 responseLen);
3835
3836 Return<void> retStatus = radioService[slotId]->mRadioResponse->sendSmsResponse(responseInfo,
3837 result);
3838 radioService[slotId]->checkReturnStatus(retStatus);
3839 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003840 RLOGE("sendSmsResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003841 }
3842
3843 return 0;
3844}
3845
Amit Mahajan759786a2017-03-03 17:35:47 -08003846int radio::sendSMSExpectMoreResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003847 int responseType, int serial, RIL_Errno e, void *response,
3848 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003849#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003850 RLOGD("sendSMSExpectMoreResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003851#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003852
3853 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003854 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003855 SendSmsResult result = makeSendSmsResult(responseInfo, serial, responseType, e, response,
3856 responseLen);
3857
3858 Return<void> retStatus = radioService[slotId]->mRadioResponse->sendSMSExpectMoreResponse(
3859 responseInfo, result);
3860 radioService[slotId]->checkReturnStatus(retStatus);
3861 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003862 RLOGE("sendSMSExpectMoreResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003863 }
3864
3865 return 0;
3866}
3867
Amit Mahajan759786a2017-03-03 17:35:47 -08003868int radio::setupDataCallResponse(int slotId,
Amit Mahajan3df62912017-02-10 01:35:55 +00003869 int responseType, int serial, RIL_Errno e, void *response,
3870 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003871#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003872 RLOGD("setupDataCallResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003873#endif
Amit Mahajan3df62912017-02-10 01:35:55 +00003874
3875 if (radioService[slotId]->mRadioResponse != NULL) {
Amit Mahajan3da9ac02017-02-13 13:41:28 -08003876 RadioResponseInfo responseInfo = {};
Amit Mahajan3df62912017-02-10 01:35:55 +00003877 populateResponseInfo(responseInfo, serial, responseType, e);
3878
Amit Mahajan3da9ac02017-02-13 13:41:28 -08003879 SetupDataCallResult result = {};
Amit Mahajan3df62912017-02-10 01:35:55 +00003880 if (response == NULL || responseLen != sizeof(RIL_Data_Call_Response_v11)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003881 RLOGE("setupDataCallResponse: Invalid response");
Amit Mahajan3df62912017-02-10 01:35:55 +00003882 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
Jack Yu5079e182017-02-28 15:21:18 -08003883 result.status = DataCallFailCause::ERROR_UNSPECIFIED;
Amit Mahajan3da9ac02017-02-13 13:41:28 -08003884 result.type = hidl_string();
3885 result.ifname = hidl_string();
3886 result.addresses = hidl_string();
3887 result.dnses = hidl_string();
3888 result.gateways = hidl_string();
3889 result.pcscf = hidl_string();
Amit Mahajan3df62912017-02-10 01:35:55 +00003890 } else {
3891 convertRilDataCallToHal((RIL_Data_Call_Response_v11 *) response, result);
3892 }
3893
3894 Return<void> retStatus = radioService[slotId]->mRadioResponse->setupDataCallResponse(
3895 responseInfo, result);
3896 radioService[slotId]->checkReturnStatus(retStatus);
3897 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003898 RLOGE("setupDataCallResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Amit Mahajan3df62912017-02-10 01:35:55 +00003899 }
3900
3901 return 0;
3902}
3903
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003904IccIoResult responseIccIo(RadioResponseInfo& responseInfo, int serial, int responseType,
3905 RIL_Errno e, void *response, size_t responseLen) {
3906 populateResponseInfo(responseInfo, serial, responseType, e);
Jack Yuf68e0da2017-02-07 14:53:09 -08003907 IccIoResult result = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003908
3909 if (response == NULL || responseLen != sizeof(RIL_SIM_IO_Response)) {
3910 RLOGE("Invalid response: NULL");
3911 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003912 result.simResponse = hidl_string();
3913 } else {
3914 RIL_SIM_IO_Response *resp = (RIL_SIM_IO_Response *) response;
3915 result.sw1 = resp->sw1;
3916 result.sw2 = resp->sw2;
3917 result.simResponse = convertCharPtrToHidlString(resp->simResponse);
3918 }
3919 return result;
3920}
3921
Amit Mahajan759786a2017-03-03 17:35:47 -08003922int radio::iccIOForAppResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003923 int responseType, int serial, RIL_Errno e, void *response,
3924 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003925#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003926 RLOGD("iccIOForAppResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003927#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003928
3929 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003930 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003931 IccIoResult result = responseIccIo(responseInfo, serial, responseType, e, response,
3932 responseLen);
3933
3934 Return<void> retStatus = radioService[slotId]->mRadioResponse->iccIOForAppResponse(
3935 responseInfo, result);
3936 radioService[slotId]->checkReturnStatus(retStatus);
3937 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003938 RLOGE("iccIOForAppResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003939 }
3940
3941 return 0;
3942}
3943
Amit Mahajan759786a2017-03-03 17:35:47 -08003944int radio::sendUssdResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003945 int responseType, int serial, RIL_Errno e, void *response,
3946 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003947#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003948 RLOGD("sendUssdResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003949#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003950
3951 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003952 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003953 populateResponseInfo(responseInfo, serial, responseType, e);
3954 Return<void> retStatus = radioService[slotId]->mRadioResponse->sendUssdResponse(
3955 responseInfo);
3956 radioService[slotId]->checkReturnStatus(retStatus);
3957 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003958 RLOGE("sendUssdResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003959 slotId);
3960 }
3961
3962 return 0;
3963}
3964
Amit Mahajan759786a2017-03-03 17:35:47 -08003965int radio::cancelPendingUssdResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003966 int responseType, int serial, RIL_Errno e, void *response,
3967 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003968#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003969 RLOGD("cancelPendingUssdResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003970#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003971
3972 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003973 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003974 populateResponseInfo(responseInfo, serial, responseType, e);
3975 Return<void> retStatus = radioService[slotId]->mRadioResponse->cancelPendingUssdResponse(
3976 responseInfo);
3977 radioService[slotId]->checkReturnStatus(retStatus);
3978 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003979 RLOGE("cancelPendingUssdResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003980 slotId);
3981 }
3982
3983 return 0;
3984}
3985
Amit Mahajan759786a2017-03-03 17:35:47 -08003986int radio::getClirResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003987 int responseType, int serial, RIL_Errno e, void *response,
3988 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003989#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003990 RLOGD("getClirResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003991#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003992
3993 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003994 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003995 populateResponseInfo(responseInfo, serial, responseType, e);
3996 int n = -1, m = -1;
3997 int numInts = responseLen / sizeof(int);
3998 if (response == NULL || numInts != 2) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003999 RLOGE("getClirResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004000 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
4001 } else {
4002 int *pInt = (int *) response;
4003 n = pInt[0];
4004 m = pInt[1];
4005 }
4006 Return<void> retStatus = radioService[slotId]->mRadioResponse->getClirResponse(responseInfo,
4007 n, m);
4008 radioService[slotId]->checkReturnStatus(retStatus);
4009 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004010 RLOGE("getClirResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004011 }
4012
4013 return 0;
4014}
4015
Amit Mahajan759786a2017-03-03 17:35:47 -08004016int radio::setClirResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004017 int responseType, int serial, RIL_Errno e, void *response,
4018 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004019#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004020 RLOGD("setClirResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004021#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004022
4023 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004024 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004025 populateResponseInfo(responseInfo, serial, responseType, e);
4026 Return<void> retStatus = radioService[slotId]->mRadioResponse->setClirResponse(
4027 responseInfo);
4028 radioService[slotId]->checkReturnStatus(retStatus);
4029 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004030 RLOGE("setClirResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004031 }
4032
4033 return 0;
4034}
4035
Amit Mahajan759786a2017-03-03 17:35:47 -08004036int radio::getCallForwardStatusResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004037 int responseType, int serial, RIL_Errno e,
4038 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004039#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004040 RLOGD("getCallForwardStatusResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004041#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004042
4043 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004044 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004045 populateResponseInfo(responseInfo, serial, responseType, e);
4046 hidl_vec<CallForwardInfo> callForwardInfos;
4047
4048 if (response == NULL || responseLen % sizeof(RIL_CallForwardInfo *) != 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004049 RLOGE("getCallForwardStatusResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004050 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
4051 } else {
4052 int num = responseLen / sizeof(RIL_CallForwardInfo *);
4053 callForwardInfos.resize(num);
4054 for (int i = 0 ; i < num; i++) {
4055 RIL_CallForwardInfo *resp = ((RIL_CallForwardInfo **) response)[i];
4056 callForwardInfos[i].status = (CallForwardInfoStatus) resp->status;
4057 callForwardInfos[i].reason = resp->reason;
4058 callForwardInfos[i].serviceClass = resp->serviceClass;
4059 callForwardInfos[i].toa = resp->toa;
4060 callForwardInfos[i].number = convertCharPtrToHidlString(resp->number);
4061 callForwardInfos[i].timeSeconds = resp->timeSeconds;
4062 }
4063 }
4064
4065 Return<void> retStatus = radioService[slotId]->mRadioResponse->getCallForwardStatusResponse(
4066 responseInfo, callForwardInfos);
4067 radioService[slotId]->checkReturnStatus(retStatus);
4068 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004069 RLOGE("getCallForwardStatusResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004070 slotId);
4071 }
4072
4073 return 0;
4074}
4075
Amit Mahajan759786a2017-03-03 17:35:47 -08004076int radio::setCallForwardResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004077 int responseType, int serial, RIL_Errno e, void *response,
4078 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004079#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004080 RLOGD("setCallForwardResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004081#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004082
4083 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004084 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004085 populateResponseInfo(responseInfo, serial, responseType, e);
4086 Return<void> retStatus = radioService[slotId]->mRadioResponse->setCallForwardResponse(
4087 responseInfo);
4088 radioService[slotId]->checkReturnStatus(retStatus);
4089 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004090 RLOGE("setCallForwardResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004091 }
4092
4093 return 0;
4094}
4095
Amit Mahajan759786a2017-03-03 17:35:47 -08004096int radio::getCallWaitingResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004097 int responseType, int serial, RIL_Errno e, void *response,
4098 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004099#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004100 RLOGD("getCallWaitingResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004101#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004102
4103 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004104 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004105 populateResponseInfo(responseInfo, serial, responseType, e);
4106 bool enable = false;
4107 int serviceClass = -1;
4108 int numInts = responseLen / sizeof(int);
4109 if (response == NULL || numInts != 2) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004110 RLOGE("getCallWaitingResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004111 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
4112 } else {
4113 int *pInt = (int *) response;
4114 enable = pInt[0] == 1 ? true : false;
4115 serviceClass = pInt[1];
4116 }
Sanket Padawe5375bfa2017-03-07 17:21:05 -08004117 Return<void> retStatus = radioService[slotId]->mRadioResponse->getCallWaitingResponse(
4118 responseInfo, enable, serviceClass);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004119 radioService[slotId]->checkReturnStatus(retStatus);
4120 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004121 RLOGE("getCallWaitingResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004122 }
4123
4124 return 0;
4125}
4126
Amit Mahajan759786a2017-03-03 17:35:47 -08004127int radio::setCallWaitingResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004128 int responseType, int serial, RIL_Errno e, void *response,
4129 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004130#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004131 RLOGD("setCallWaitingResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004132#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004133
4134 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004135 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004136 populateResponseInfo(responseInfo, serial, responseType, e);
4137 Return<void> retStatus = radioService[slotId]->mRadioResponse->setCallWaitingResponse(
4138 responseInfo);
4139 radioService[slotId]->checkReturnStatus(retStatus);
4140 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004141 RLOGE("setCallWaitingResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004142 }
4143
4144 return 0;
4145}
4146
Amit Mahajan759786a2017-03-03 17:35:47 -08004147int radio::acknowledgeLastIncomingGsmSmsResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004148 int responseType, int serial, RIL_Errno e,
4149 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004150#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004151 RLOGD("acknowledgeLastIncomingGsmSmsResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004152#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004153
4154 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004155 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004156 populateResponseInfo(responseInfo, serial, responseType, e);
4157 Return<void> retStatus =
4158 radioService[slotId]->mRadioResponse->acknowledgeLastIncomingGsmSmsResponse(
4159 responseInfo);
4160 radioService[slotId]->checkReturnStatus(retStatus);
4161 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004162 RLOGE("acknowledgeLastIncomingGsmSmsResponse: radioService[%d]->mRadioResponse "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004163 "== NULL", slotId);
4164 }
4165
4166 return 0;
4167}
4168
Amit Mahajan759786a2017-03-03 17:35:47 -08004169int radio::acceptCallResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004170 int responseType, int serial, RIL_Errno e,
4171 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004172#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004173 RLOGD("acceptCallResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004174#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004175
4176 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004177 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004178 populateResponseInfo(responseInfo, serial, responseType, e);
4179 Return<void> retStatus = radioService[slotId]->mRadioResponse->acceptCallResponse(
4180 responseInfo);
4181 radioService[slotId]->checkReturnStatus(retStatus);
4182 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004183 RLOGE("acceptCallResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004184 slotId);
4185 }
4186
4187 return 0;
4188}
4189
Amit Mahajan759786a2017-03-03 17:35:47 -08004190int radio::deactivateDataCallResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004191 int responseType, int serial, RIL_Errno e,
4192 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004193#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004194 RLOGD("deactivateDataCallResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004195#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004196
4197 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004198 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004199 populateResponseInfo(responseInfo, serial, responseType, e);
4200 Return<void> retStatus = radioService[slotId]->mRadioResponse->deactivateDataCallResponse(
4201 responseInfo);
4202 radioService[slotId]->checkReturnStatus(retStatus);
4203 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004204 RLOGE("deactivateDataCallResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004205 slotId);
4206 }
4207
4208 return 0;
4209}
4210
Amit Mahajan759786a2017-03-03 17:35:47 -08004211int radio::getFacilityLockForAppResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004212 int responseType, int serial, RIL_Errno e,
4213 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004214#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004215 RLOGD("getFacilityLockForAppResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004216#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004217
4218 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004219 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004220 int ret = responseInt(responseInfo, serial, responseType, e, response, responseLen);
4221 Return<void> retStatus = radioService[slotId]->mRadioResponse->
4222 getFacilityLockForAppResponse(responseInfo, ret);
4223 radioService[slotId]->checkReturnStatus(retStatus);
4224 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004225 RLOGE("getFacilityLockForAppResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004226 slotId);
4227 }
4228
4229 return 0;
4230}
4231
Amit Mahajan759786a2017-03-03 17:35:47 -08004232int radio::setFacilityLockForAppResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004233 int responseType, int serial, RIL_Errno e,
4234 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004235#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004236 RLOGD("setFacilityLockForAppResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004237#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004238
4239 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004240 RadioResponseInfo responseInfo = {};
Naveen Kalla346bbc02017-03-16 12:55:55 -07004241 int ret = responseIntOrEmpty(responseInfo, serial, responseType, e, response, responseLen);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004242 Return<void> retStatus
4243 = radioService[slotId]->mRadioResponse->setFacilityLockForAppResponse(responseInfo,
4244 ret);
4245 radioService[slotId]->checkReturnStatus(retStatus);
4246 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004247 RLOGE("setFacilityLockForAppResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004248 slotId);
4249 }
4250
4251 return 0;
4252}
4253
Amit Mahajan759786a2017-03-03 17:35:47 -08004254int radio::setBarringPasswordResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004255 int responseType, int serial, RIL_Errno e,
4256 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004257#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004258 RLOGD("acceptCallResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004259#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004260
4261 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004262 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004263 populateResponseInfo(responseInfo, serial, responseType, e);
4264 Return<void> retStatus
4265 = radioService[slotId]->mRadioResponse->setBarringPasswordResponse(responseInfo);
4266 radioService[slotId]->checkReturnStatus(retStatus);
4267 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004268 RLOGE("setBarringPasswordResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004269 slotId);
4270 }
4271
4272 return 0;
4273}
4274
Amit Mahajan759786a2017-03-03 17:35:47 -08004275int radio::getNetworkSelectionModeResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004276 int responseType, int serial, RIL_Errno e, void *response,
4277 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004278#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004279 RLOGD("getNetworkSelectionModeResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004280#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004281
4282 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004283 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004284 populateResponseInfo(responseInfo, serial, responseType, e);
4285 bool manual = false;
4286 int serviceClass;
4287 if (response == NULL || responseLen != sizeof(int)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004288 RLOGE("getNetworkSelectionModeResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004289 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
4290 } else {
4291 int *pInt = (int *) response;
4292 manual = pInt[0] == 1 ? true : false;
4293 }
4294 Return<void> retStatus
4295 = radioService[slotId]->mRadioResponse->getNetworkSelectionModeResponse(
4296 responseInfo,
4297 manual);
4298 radioService[slotId]->checkReturnStatus(retStatus);
4299 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004300 RLOGE("getNetworkSelectionModeResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004301 slotId);
4302 }
4303
4304 return 0;
4305}
4306
Amit Mahajan759786a2017-03-03 17:35:47 -08004307int radio::setNetworkSelectionModeAutomaticResponse(int slotId, int responseType, int serial,
4308 RIL_Errno e, void *response,
4309 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004310#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004311 RLOGD("setNetworkSelectionModeAutomaticResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004312#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004313
4314 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004315 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004316 populateResponseInfo(responseInfo, serial, responseType, e);
4317 Return<void> retStatus
4318 = radioService[slotId]->mRadioResponse->setNetworkSelectionModeAutomaticResponse(
4319 responseInfo);
4320 radioService[slotId]->checkReturnStatus(retStatus);
4321 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004322 RLOGE("setNetworkSelectionModeAutomaticResponse: radioService[%d]->mRadioResponse "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004323 "== NULL", slotId);
4324 }
4325
4326 return 0;
4327}
4328
Amit Mahajan759786a2017-03-03 17:35:47 -08004329int radio::setNetworkSelectionModeManualResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004330 int responseType, int serial, RIL_Errno e,
4331 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004332#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004333 RLOGD("setNetworkSelectionModeManualResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004334#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004335
4336 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004337 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004338 populateResponseInfo(responseInfo, serial, responseType, e);
4339 Return<void> retStatus
4340 = radioService[slotId]->mRadioResponse->setNetworkSelectionModeManualResponse(
4341 responseInfo);
4342 radioService[slotId]->checkReturnStatus(retStatus);
4343 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004344 RLOGE("acceptCallResponse: radioService[%d]->setNetworkSelectionModeManualResponse "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004345 "== NULL", slotId);
4346 }
4347
4348 return 0;
4349}
4350
Jack Yuf68e0da2017-02-07 14:53:09 -08004351int convertOperatorStatusToInt(const char *str) {
4352 if (strncmp("unknown", str, 9) == 0) {
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004353 return (int) OperatorStatus::UNKNOWN;
Jack Yuf68e0da2017-02-07 14:53:09 -08004354 } else if (strncmp("available", str, 9) == 0) {
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004355 return (int) OperatorStatus::AVAILABLE;
Jack Yuf68e0da2017-02-07 14:53:09 -08004356 } else if (strncmp("current", str, 9) == 0) {
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004357 return (int) OperatorStatus::CURRENT;
Jack Yuf68e0da2017-02-07 14:53:09 -08004358 } else if (strncmp("forbidden", str, 9) == 0) {
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004359 return (int) OperatorStatus::FORBIDDEN;
4360 } else {
4361 return -1;
4362 }
4363}
4364
Amit Mahajan759786a2017-03-03 17:35:47 -08004365int radio::getAvailableNetworksResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004366 int responseType, int serial, RIL_Errno e, void *response,
4367 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004368#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004369 RLOGD("getAvailableNetworksResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004370#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004371
4372 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004373 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004374 populateResponseInfo(responseInfo, serial, responseType, e);
4375 hidl_vec<OperatorInfo> networks;
4376 if (response == NULL || responseLen % (4 * sizeof(char *))!= 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004377 RLOGE("getAvailableNetworksResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004378 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
4379 } else {
4380 char **resp = (char **) response;
4381 int numStrings = responseLen / sizeof(char *);
4382 networks.resize(numStrings/4);
Jayachandran Ce0d755c2017-03-01 18:26:50 -08004383 for (int i = 0, j = 0; i < numStrings; i = i + 4, j++) {
4384 networks[j].alphaLong = convertCharPtrToHidlString(resp[i]);
4385 networks[j].alphaShort = convertCharPtrToHidlString(resp[i + 1]);
4386 networks[j].operatorNumeric = convertCharPtrToHidlString(resp[i + 2]);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004387 int status = convertOperatorStatusToInt(resp[i + 3]);
4388 if (status == -1) {
4389 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
4390 } else {
Jayachandran Ce0d755c2017-03-01 18:26:50 -08004391 networks[j].status = (OperatorStatus) status;
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004392 }
4393 }
4394 }
4395 Return<void> retStatus
4396 = radioService[slotId]->mRadioResponse->getAvailableNetworksResponse(responseInfo,
4397 networks);
4398 radioService[slotId]->checkReturnStatus(retStatus);
4399 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004400 RLOGE("getAvailableNetworksResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004401 slotId);
4402 }
4403
4404 return 0;
4405}
4406
Amit Mahajan759786a2017-03-03 17:35:47 -08004407int radio::startDtmfResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004408 int responseType, int serial, RIL_Errno e,
4409 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004410#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004411 RLOGD("startDtmfResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004412#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004413
4414 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004415 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004416 populateResponseInfo(responseInfo, serial, responseType, e);
4417 Return<void> retStatus
4418 = radioService[slotId]->mRadioResponse->startDtmfResponse(responseInfo);
4419 radioService[slotId]->checkReturnStatus(retStatus);
4420 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004421 RLOGE("startDtmfResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004422 }
4423
4424 return 0;
4425}
4426
Amit Mahajan759786a2017-03-03 17:35:47 -08004427int radio::stopDtmfResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004428 int responseType, int serial, RIL_Errno e,
4429 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004430#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004431 RLOGD("stopDtmfResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004432#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004433
4434 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004435 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004436 populateResponseInfo(responseInfo, serial, responseType, e);
4437 Return<void> retStatus
4438 = radioService[slotId]->mRadioResponse->stopDtmfResponse(responseInfo);
4439 radioService[slotId]->checkReturnStatus(retStatus);
4440 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004441 RLOGE("stopDtmfResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004442 }
4443
4444 return 0;
4445}
4446
Amit Mahajan759786a2017-03-03 17:35:47 -08004447int radio::getBasebandVersionResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004448 int responseType, int serial, RIL_Errno e,
4449 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004450#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004451 RLOGD("getBasebandVersionResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004452#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004453
4454 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004455 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004456 populateResponseInfo(responseInfo, serial, responseType, e);
4457 Return<void> retStatus
4458 = radioService[slotId]->mRadioResponse->getBasebandVersionResponse(responseInfo,
4459 convertCharPtrToHidlString((char *) response));
4460 radioService[slotId]->checkReturnStatus(retStatus);
4461 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004462 RLOGE("getBasebandVersionResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004463 }
4464
4465 return 0;
4466}
4467
Amit Mahajan759786a2017-03-03 17:35:47 -08004468int radio::separateConnectionResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004469 int responseType, int serial, RIL_Errno e,
4470 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004471#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004472 RLOGD("separateConnectionResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004473#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004474
4475 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004476 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004477 populateResponseInfo(responseInfo, serial, responseType, e);
4478 Return<void> retStatus
4479 = radioService[slotId]->mRadioResponse->separateConnectionResponse(responseInfo);
4480 radioService[slotId]->checkReturnStatus(retStatus);
4481 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004482 RLOGE("separateConnectionResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004483 slotId);
4484 }
4485
4486 return 0;
4487}
4488
Amit Mahajan759786a2017-03-03 17:35:47 -08004489int radio::setMuteResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004490 int responseType, int serial, RIL_Errno e,
4491 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004492#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004493 RLOGD("setMuteResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004494#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004495
4496 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004497 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004498 populateResponseInfo(responseInfo, serial, responseType, e);
4499 Return<void> retStatus
4500 = radioService[slotId]->mRadioResponse->setMuteResponse(responseInfo);
4501 radioService[slotId]->checkReturnStatus(retStatus);
4502 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004503 RLOGE("setMuteResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004504 }
4505
4506 return 0;
4507}
4508
Amit Mahajan759786a2017-03-03 17:35:47 -08004509int radio::getMuteResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004510 int responseType, int serial, RIL_Errno e, void *response,
4511 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004512#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004513 RLOGD("getMuteResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004514#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004515
4516 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004517 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004518 populateResponseInfo(responseInfo, serial, responseType, e);
4519 bool enable = false;
4520 int serviceClass;
4521 if (response == NULL || responseLen != sizeof(int)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004522 RLOGE("getMuteResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004523 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
4524 } else {
4525 int *pInt = (int *) response;
4526 enable = pInt[0] == 1 ? true : false;
4527 }
4528 Return<void> retStatus = radioService[slotId]->mRadioResponse->getMuteResponse(responseInfo,
4529 enable);
4530 radioService[slotId]->checkReturnStatus(retStatus);
4531 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004532 RLOGE("getMuteResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004533 }
4534
4535 return 0;
4536}
4537
Amit Mahajan759786a2017-03-03 17:35:47 -08004538int radio::getClipResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004539 int responseType, int serial, RIL_Errno e,
4540 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004541#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004542 RLOGD("getClipResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004543#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004544
4545 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004546 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004547 int ret = responseInt(responseInfo, serial, responseType, e, response, responseLen);
4548 Return<void> retStatus = radioService[slotId]->mRadioResponse->getClipResponse(responseInfo,
4549 (ClipStatus) ret);
4550 radioService[slotId]->checkReturnStatus(retStatus);
4551 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004552 RLOGE("getClipResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004553 }
4554
4555 return 0;
4556}
4557
Amit Mahajan759786a2017-03-03 17:35:47 -08004558int radio::getDataCallListResponse(int slotId,
Amit Mahajan3df62912017-02-10 01:35:55 +00004559 int responseType, int serial, RIL_Errno e,
4560 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004561#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004562 RLOGD("getDataCallListResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004563#endif
Amit Mahajan3df62912017-02-10 01:35:55 +00004564
4565 if (radioService[slotId]->mRadioResponse != NULL) {
Amit Mahajan3da9ac02017-02-13 13:41:28 -08004566 RadioResponseInfo responseInfo = {};
Amit Mahajan3df62912017-02-10 01:35:55 +00004567 populateResponseInfo(responseInfo, serial, responseType, e);
4568
4569 hidl_vec<SetupDataCallResult> ret;
4570 if (response == NULL || responseLen % sizeof(RIL_Data_Call_Response_v11) != 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004571 RLOGE("getDataCallListResponse: invalid response");
Amit Mahajan3df62912017-02-10 01:35:55 +00004572 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
4573 } else {
4574 convertRilDataCallListToHal(response, responseLen, ret);
4575 }
4576
4577 Return<void> retStatus = radioService[slotId]->mRadioResponse->getDataCallListResponse(
4578 responseInfo, ret);
4579 radioService[slotId]->checkReturnStatus(retStatus);
4580 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004581 RLOGE("getDataCallListResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Amit Mahajan3df62912017-02-10 01:35:55 +00004582 }
4583
4584 return 0;
4585}
4586
Amit Mahajan759786a2017-03-03 17:35:47 -08004587int radio::setSuppServiceNotificationsResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004588 int responseType, int serial, RIL_Errno e,
4589 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004590#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004591 RLOGD("setSuppServiceNotificationsResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004592#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004593
4594 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004595 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004596 populateResponseInfo(responseInfo, serial, responseType, e);
4597 Return<void> retStatus
4598 = radioService[slotId]->mRadioResponse->setSuppServiceNotificationsResponse(
4599 responseInfo);
4600 radioService[slotId]->checkReturnStatus(retStatus);
4601 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004602 RLOGE("setSuppServiceNotificationsResponse: radioService[%d]->mRadioResponse "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004603 "== NULL", slotId);
4604 }
4605
4606 return 0;
4607}
4608
Amit Mahajan759786a2017-03-03 17:35:47 -08004609int radio::deleteSmsOnSimResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004610 int responseType, int serial, RIL_Errno e,
4611 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004612#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004613 RLOGD("deleteSmsOnSimResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004614#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004615
4616 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004617 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004618 populateResponseInfo(responseInfo, serial, responseType, e);
4619 Return<void> retStatus
4620 = radioService[slotId]->mRadioResponse->deleteSmsOnSimResponse(responseInfo);
4621 radioService[slotId]->checkReturnStatus(retStatus);
4622 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004623 RLOGE("deleteSmsOnSimResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004624 }
4625
4626 return 0;
4627}
4628
Amit Mahajan759786a2017-03-03 17:35:47 -08004629int radio::setBandModeResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004630 int responseType, int serial, RIL_Errno e,
4631 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004632#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004633 RLOGD("setBandModeResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004634#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004635
4636 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004637 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004638 populateResponseInfo(responseInfo, serial, responseType, e);
4639 Return<void> retStatus
4640 = radioService[slotId]->mRadioResponse->setBandModeResponse(responseInfo);
4641 radioService[slotId]->checkReturnStatus(retStatus);
4642 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004643 RLOGE("setBandModeResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004644 }
4645
4646 return 0;
4647}
4648
Amit Mahajan759786a2017-03-03 17:35:47 -08004649int radio::writeSmsToSimResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004650 int responseType, int serial, RIL_Errno e,
4651 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004652#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004653 RLOGD("writeSmsToSimResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004654#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004655
4656 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004657 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004658 int ret = responseInt(responseInfo, serial, responseType, e, response, responseLen);
4659 Return<void> retStatus
4660 = radioService[slotId]->mRadioResponse->writeSmsToSimResponse(responseInfo, ret);
4661 radioService[slotId]->checkReturnStatus(retStatus);
4662 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004663 RLOGE("writeSmsToSimResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004664 }
4665
4666 return 0;
4667}
4668
Amit Mahajan759786a2017-03-03 17:35:47 -08004669int radio::getAvailableBandModesResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004670 int responseType, int serial, RIL_Errno e, void *response,
4671 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004672#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004673 RLOGD("getAvailableBandModesResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004674#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004675
4676 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004677 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004678 populateResponseInfo(responseInfo, serial, responseType, e);
4679 hidl_vec<RadioBandMode> modes;
4680 if (response == NULL || responseLen % sizeof(int) != 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004681 RLOGE("getAvailableBandModesResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004682 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
4683 } else {
4684 int *pInt = (int *) response;
4685 int numInts = responseLen / sizeof(int);
4686 modes.resize(numInts);
4687 for (int i = 0; i < numInts; i++) {
4688 modes[i] = (RadioBandMode) pInt[i];
4689 }
4690 }
4691 Return<void> retStatus
4692 = radioService[slotId]->mRadioResponse->getAvailableBandModesResponse(responseInfo,
4693 modes);
4694 radioService[slotId]->checkReturnStatus(retStatus);
4695 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004696 RLOGE("getAvailableBandModesResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004697 slotId);
4698 }
4699
4700 return 0;
4701}
4702
Amit Mahajan759786a2017-03-03 17:35:47 -08004703int radio::sendEnvelopeResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004704 int responseType, int serial, RIL_Errno e,
4705 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004706#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004707 RLOGD("sendEnvelopeResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004708#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004709
4710 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004711 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004712 populateResponseInfo(responseInfo, serial, responseType, e);
4713 Return<void> retStatus
4714 = radioService[slotId]->mRadioResponse->sendEnvelopeResponse(responseInfo,
4715 convertCharPtrToHidlString((char *) response));
4716 radioService[slotId]->checkReturnStatus(retStatus);
4717 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004718 RLOGE("sendEnvelopeResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004719 }
4720
4721 return 0;
4722}
4723
Amit Mahajan759786a2017-03-03 17:35:47 -08004724int radio::sendTerminalResponseToSimResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004725 int responseType, int serial, RIL_Errno e,
4726 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004727#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004728 RLOGD("sendTerminalResponseToSimResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004729#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004730
4731 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004732 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004733 populateResponseInfo(responseInfo, serial, responseType, e);
4734 Return<void> retStatus
4735 = radioService[slotId]->mRadioResponse->sendTerminalResponseToSimResponse(
4736 responseInfo);
4737 radioService[slotId]->checkReturnStatus(retStatus);
4738 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004739 RLOGE("sendTerminalResponseToSimResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004740 slotId);
4741 }
4742
4743 return 0;
4744}
4745
Amit Mahajan759786a2017-03-03 17:35:47 -08004746int radio::handleStkCallSetupRequestFromSimResponse(int slotId,
4747 int responseType, int serial,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004748 RIL_Errno e, void *response,
4749 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004750#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004751 RLOGD("handleStkCallSetupRequestFromSimResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004752#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004753
4754 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004755 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004756 populateResponseInfo(responseInfo, serial, responseType, e);
4757 Return<void> retStatus
4758 = radioService[slotId]->mRadioResponse->handleStkCallSetupRequestFromSimResponse(
4759 responseInfo);
4760 radioService[slotId]->checkReturnStatus(retStatus);
4761 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004762 RLOGE("handleStkCallSetupRequestFromSimResponse: radioService[%d]->mRadioResponse "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004763 "== NULL", slotId);
4764 }
4765
4766 return 0;
4767}
4768
Amit Mahajan759786a2017-03-03 17:35:47 -08004769int radio::explicitCallTransferResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004770 int responseType, int serial, RIL_Errno e,
4771 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004772#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004773 RLOGD("explicitCallTransferResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004774#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004775
4776 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004777 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004778 populateResponseInfo(responseInfo, serial, responseType, e);
4779 Return<void> retStatus
4780 = radioService[slotId]->mRadioResponse->explicitCallTransferResponse(responseInfo);
4781 radioService[slotId]->checkReturnStatus(retStatus);
4782 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004783 RLOGE("explicitCallTransferResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004784 slotId);
4785 }
4786
4787 return 0;
4788}
4789
Amit Mahajan759786a2017-03-03 17:35:47 -08004790int radio::setPreferredNetworkTypeResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004791 int responseType, int serial, RIL_Errno e,
4792 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004793#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004794 RLOGD("setPreferredNetworkTypeResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004795#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004796
4797 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004798 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004799 populateResponseInfo(responseInfo, serial, responseType, e);
4800 Return<void> retStatus
4801 = radioService[slotId]->mRadioResponse->setPreferredNetworkTypeResponse(
4802 responseInfo);
4803 radioService[slotId]->checkReturnStatus(retStatus);
4804 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004805 RLOGE("setPreferredNetworkTypeResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004806 slotId);
4807 }
4808
4809 return 0;
4810}
4811
4812
Amit Mahajan759786a2017-03-03 17:35:47 -08004813int radio::getPreferredNetworkTypeResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004814 int responseType, int serial, RIL_Errno e,
4815 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004816#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004817 RLOGD("getPreferredNetworkTypeResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004818#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004819
4820 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004821 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004822 int ret = responseInt(responseInfo, serial, responseType, e, response, responseLen);
4823 Return<void> retStatus
4824 = radioService[slotId]->mRadioResponse->getPreferredNetworkTypeResponse(
4825 responseInfo, (PreferredNetworkType) ret);
4826 radioService[slotId]->checkReturnStatus(retStatus);
4827 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004828 RLOGE("getPreferredNetworkTypeResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004829 slotId);
4830 }
4831
4832 return 0;
4833}
4834
Amit Mahajan759786a2017-03-03 17:35:47 -08004835int radio::getNeighboringCidsResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004836 int responseType, int serial, RIL_Errno e,
4837 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004838#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004839 RLOGD("getNeighboringCidsResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004840#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004841
4842 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004843 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004844 populateResponseInfo(responseInfo, serial, responseType, e);
4845 hidl_vec<NeighboringCell> cells;
4846
4847 if (response == NULL || responseLen % sizeof(RIL_NeighboringCell *) != 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004848 RLOGE("getNeighboringCidsResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004849 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
4850 } else {
4851 int num = responseLen / sizeof(RIL_NeighboringCell *);
4852 cells.resize(num);
4853 for (int i = 0 ; i < num; i++) {
4854 RIL_NeighboringCell *resp = ((RIL_NeighboringCell **) response)[i];
4855 cells[i].cid = convertCharPtrToHidlString(resp->cid);
4856 cells[i].rssi = resp->rssi;
4857 }
4858 }
4859
4860 Return<void> retStatus
4861 = radioService[slotId]->mRadioResponse->getNeighboringCidsResponse(responseInfo,
4862 cells);
4863 radioService[slotId]->checkReturnStatus(retStatus);
4864 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004865 RLOGE("getNeighboringCidsResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004866 slotId);
4867 }
4868
4869 return 0;
4870}
4871
Amit Mahajan759786a2017-03-03 17:35:47 -08004872int radio::setLocationUpdatesResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004873 int responseType, int serial, RIL_Errno e,
4874 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004875#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004876 RLOGD("setLocationUpdatesResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004877#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004878
4879 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004880 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004881 populateResponseInfo(responseInfo, serial, responseType, e);
4882 Return<void> retStatus
4883 = radioService[slotId]->mRadioResponse->setLocationUpdatesResponse(responseInfo);
4884 radioService[slotId]->checkReturnStatus(retStatus);
4885 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004886 RLOGE("setLocationUpdatesResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004887 slotId);
4888 }
4889
4890 return 0;
4891}
4892
Amit Mahajan759786a2017-03-03 17:35:47 -08004893int radio::setCdmaSubscriptionSourceResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004894 int responseType, int serial, RIL_Errno e,
4895 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004896#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004897 RLOGD("setCdmaSubscriptionSourceResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004898#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004899
4900 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004901 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004902 populateResponseInfo(responseInfo, serial, responseType, e);
4903 Return<void> retStatus
4904 = radioService[slotId]->mRadioResponse->setCdmaSubscriptionSourceResponse(
4905 responseInfo);
4906 radioService[slotId]->checkReturnStatus(retStatus);
4907 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004908 RLOGE("setCdmaSubscriptionSourceResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004909 slotId);
4910 }
4911
4912 return 0;
4913}
4914
Amit Mahajan759786a2017-03-03 17:35:47 -08004915int radio::setCdmaRoamingPreferenceResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004916 int responseType, int serial, RIL_Errno e,
4917 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004918#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004919 RLOGD("setCdmaRoamingPreferenceResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004920#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004921
4922 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004923 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004924 populateResponseInfo(responseInfo, serial, responseType, e);
4925 Return<void> retStatus
4926 = radioService[slotId]->mRadioResponse->setCdmaRoamingPreferenceResponse(
4927 responseInfo);
4928 radioService[slotId]->checkReturnStatus(retStatus);
4929 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004930 RLOGE("setCdmaRoamingPreferenceResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004931 slotId);
4932 }
4933
4934 return 0;
4935}
4936
Amit Mahajan759786a2017-03-03 17:35:47 -08004937int radio::getCdmaRoamingPreferenceResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004938 int responseType, int serial, RIL_Errno e,
4939 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004940#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004941 RLOGD("getCdmaRoamingPreferenceResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004942#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004943
4944 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004945 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004946 int ret = responseInt(responseInfo, serial, responseType, e, response, responseLen);
4947 Return<void> retStatus
4948 = radioService[slotId]->mRadioResponse->getCdmaRoamingPreferenceResponse(
4949 responseInfo, (CdmaRoamingType) ret);
4950 radioService[slotId]->checkReturnStatus(retStatus);
4951 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004952 RLOGE("getCdmaRoamingPreferenceResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004953 slotId);
4954 }
4955
4956 return 0;
4957}
4958
Amit Mahajan759786a2017-03-03 17:35:47 -08004959int radio::setTTYModeResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004960 int responseType, int serial, RIL_Errno e,
4961 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004962#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004963 RLOGD("setTTYModeResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004964#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004965
4966 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004967 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004968 populateResponseInfo(responseInfo, serial, responseType, e);
4969 Return<void> retStatus
4970 = radioService[slotId]->mRadioResponse->setTTYModeResponse(responseInfo);
4971 radioService[slotId]->checkReturnStatus(retStatus);
4972 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004973 RLOGE("setTTYModeResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004974 }
4975
4976 return 0;
4977}
4978
Amit Mahajan759786a2017-03-03 17:35:47 -08004979int radio::getTTYModeResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004980 int responseType, int serial, RIL_Errno e,
4981 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004982#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004983 RLOGD("getTTYModeResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004984#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004985
4986 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004987 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004988 int ret = responseInt(responseInfo, serial, responseType, e, response, responseLen);
4989 Return<void> retStatus
4990 = radioService[slotId]->mRadioResponse->getTTYModeResponse(responseInfo,
4991 (TtyMode) ret);
4992 radioService[slotId]->checkReturnStatus(retStatus);
4993 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004994 RLOGE("getTTYModeResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004995 }
4996
4997 return 0;
4998}
4999
Amit Mahajan759786a2017-03-03 17:35:47 -08005000int radio::setPreferredVoicePrivacyResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005001 int responseType, int serial, RIL_Errno e,
5002 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005003#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005004 RLOGD("setPreferredVoicePrivacyResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005005#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005006
5007 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005008 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005009 populateResponseInfo(responseInfo, serial, responseType, e);
5010 Return<void> retStatus
5011 = radioService[slotId]->mRadioResponse->setPreferredVoicePrivacyResponse(
5012 responseInfo);
5013 radioService[slotId]->checkReturnStatus(retStatus);
5014 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005015 RLOGE("setPreferredVoicePrivacyResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005016 slotId);
5017 }
5018
5019 return 0;
5020}
5021
Amit Mahajan759786a2017-03-03 17:35:47 -08005022int radio::getPreferredVoicePrivacyResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005023 int responseType, int serial, RIL_Errno e,
5024 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005025#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005026 RLOGD("getPreferredVoicePrivacyResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005027#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005028
5029 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005030 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005031 populateResponseInfo(responseInfo, serial, responseType, e);
5032 bool enable = false;
5033 int numInts = responseLen / sizeof(int);
5034 if (response == NULL || numInts != 1) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005035 RLOGE("getPreferredVoicePrivacyResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005036 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
5037 } else {
5038 int *pInt = (int *) response;
5039 enable = pInt[0] == 1 ? true : false;
5040 }
5041 Return<void> retStatus
5042 = radioService[slotId]->mRadioResponse->getPreferredVoicePrivacyResponse(
5043 responseInfo, enable);
5044 radioService[slotId]->checkReturnStatus(retStatus);
5045 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005046 RLOGE("getPreferredVoicePrivacyResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005047 slotId);
5048 }
5049
5050 return 0;
5051}
5052
Amit Mahajan759786a2017-03-03 17:35:47 -08005053int radio::sendCDMAFeatureCodeResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005054 int responseType, int serial, RIL_Errno e,
5055 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005056#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005057 RLOGD("sendCDMAFeatureCodeResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005058#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005059
5060 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005061 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005062 populateResponseInfo(responseInfo, serial, responseType, e);
5063 Return<void> retStatus
5064 = radioService[slotId]->mRadioResponse->sendCDMAFeatureCodeResponse(responseInfo);
5065 radioService[slotId]->checkReturnStatus(retStatus);
5066 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005067 RLOGE("sendCDMAFeatureCodeResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005068 slotId);
5069 }
5070
5071 return 0;
5072}
5073
Amit Mahajan759786a2017-03-03 17:35:47 -08005074int radio::sendBurstDtmfResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005075 int responseType, int serial, RIL_Errno e,
5076 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005077#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005078 RLOGD("sendBurstDtmfResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005079#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005080
5081 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005082 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005083 populateResponseInfo(responseInfo, serial, responseType, e);
5084 Return<void> retStatus
5085 = radioService[slotId]->mRadioResponse->sendBurstDtmfResponse(responseInfo);
5086 radioService[slotId]->checkReturnStatus(retStatus);
5087 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005088 RLOGE("sendBurstDtmfResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005089 }
5090
5091 return 0;
5092}
5093
Amit Mahajan759786a2017-03-03 17:35:47 -08005094int radio::sendCdmaSmsResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005095 int responseType, int serial, RIL_Errno e, void *response,
5096 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005097#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005098 RLOGD("sendCdmaSmsResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005099#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005100
5101 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005102 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005103 SendSmsResult result = makeSendSmsResult(responseInfo, serial, responseType, e, response,
5104 responseLen);
5105
5106 Return<void> retStatus
5107 = radioService[slotId]->mRadioResponse->sendCdmaSmsResponse(responseInfo, result);
5108 radioService[slotId]->checkReturnStatus(retStatus);
5109 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005110 RLOGE("sendCdmaSmsResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005111 }
5112
5113 return 0;
5114}
5115
Amit Mahajan759786a2017-03-03 17:35:47 -08005116int radio::acknowledgeLastIncomingCdmaSmsResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005117 int responseType, int serial, RIL_Errno e,
5118 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005119#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005120 RLOGD("acknowledgeLastIncomingCdmaSmsResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005121#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005122
5123 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005124 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005125 populateResponseInfo(responseInfo, serial, responseType, e);
5126 Return<void> retStatus
5127 = radioService[slotId]->mRadioResponse->acknowledgeLastIncomingCdmaSmsResponse(
5128 responseInfo);
5129 radioService[slotId]->checkReturnStatus(retStatus);
5130 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005131 RLOGE("acknowledgeLastIncomingCdmaSmsResponse: radioService[%d]->mRadioResponse "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005132 "== NULL", slotId);
5133 }
5134
5135 return 0;
5136}
5137
Amit Mahajan759786a2017-03-03 17:35:47 -08005138int radio::getGsmBroadcastConfigResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005139 int responseType, int serial, RIL_Errno e,
5140 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005141#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005142 RLOGD("getGsmBroadcastConfigResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005143#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005144
5145 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005146 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005147 populateResponseInfo(responseInfo, serial, responseType, e);
5148 hidl_vec<GsmBroadcastSmsConfigInfo> configs;
5149
5150 if (response == NULL || responseLen % sizeof(RIL_GSM_BroadcastSmsConfigInfo *) != 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005151 RLOGE("getGsmBroadcastConfigResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005152 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
5153 } else {
5154 int num = responseLen / sizeof(RIL_GSM_BroadcastSmsConfigInfo *);
5155 configs.resize(num);
5156 for (int i = 0 ; i < num; i++) {
5157 RIL_GSM_BroadcastSmsConfigInfo *resp =
5158 ((RIL_GSM_BroadcastSmsConfigInfo **) response)[i];
5159 configs[i].fromServiceId = resp->fromServiceId;
5160 configs[i].toServiceId = resp->toServiceId;
5161 configs[i].fromCodeScheme = resp->fromCodeScheme;
5162 configs[i].toCodeScheme = resp->toCodeScheme;
5163 configs[i].selected = resp->selected == 1 ? true : false;
5164 }
5165 }
5166
5167 Return<void> retStatus
5168 = radioService[slotId]->mRadioResponse->getGsmBroadcastConfigResponse(responseInfo,
5169 configs);
5170 radioService[slotId]->checkReturnStatus(retStatus);
5171 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005172 RLOGE("getGsmBroadcastConfigResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005173 slotId);
5174 }
5175
5176 return 0;
5177}
5178
Amit Mahajan759786a2017-03-03 17:35:47 -08005179int radio::setGsmBroadcastConfigResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005180 int responseType, int serial, RIL_Errno e,
5181 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005182#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005183 RLOGD("setGsmBroadcastConfigResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005184#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005185
5186 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005187 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005188 populateResponseInfo(responseInfo, serial, responseType, e);
5189 Return<void> retStatus
5190 = radioService[slotId]->mRadioResponse->setGsmBroadcastConfigResponse(responseInfo);
5191 radioService[slotId]->checkReturnStatus(retStatus);
5192 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005193 RLOGE("setGsmBroadcastConfigResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005194 slotId);
5195 }
5196
5197 return 0;
5198}
5199
Amit Mahajan759786a2017-03-03 17:35:47 -08005200int radio::setGsmBroadcastActivationResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005201 int responseType, int serial, RIL_Errno e,
5202 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005203#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005204 RLOGD("setGsmBroadcastActivationResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005205#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005206
5207 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005208 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005209 populateResponseInfo(responseInfo, serial, responseType, e);
5210 Return<void> retStatus
5211 = radioService[slotId]->mRadioResponse->setGsmBroadcastActivationResponse(
5212 responseInfo);
5213 radioService[slotId]->checkReturnStatus(retStatus);
5214 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005215 RLOGE("setGsmBroadcastActivationResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005216 slotId);
5217 }
5218
5219 return 0;
5220}
5221
Amit Mahajan759786a2017-03-03 17:35:47 -08005222int radio::getCdmaBroadcastConfigResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005223 int responseType, int serial, RIL_Errno e,
5224 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005225#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005226 RLOGD("getCdmaBroadcastConfigResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005227#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005228
5229 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005230 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005231 populateResponseInfo(responseInfo, serial, responseType, e);
5232 hidl_vec<CdmaBroadcastSmsConfigInfo> configs;
5233
5234 if (response == NULL || responseLen % sizeof(RIL_CDMA_BroadcastSmsConfigInfo *) != 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005235 RLOGE("getCdmaBroadcastConfigResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005236 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
5237 } else {
5238 int num = responseLen / sizeof(RIL_CDMA_BroadcastSmsConfigInfo *);
5239 configs.resize(num);
5240 for (int i = 0 ; i < num; i++) {
5241 RIL_CDMA_BroadcastSmsConfigInfo *resp =
5242 ((RIL_CDMA_BroadcastSmsConfigInfo **) response)[i];
5243 configs[i].serviceCategory = resp->service_category;
5244 configs[i].language = resp->language;
5245 configs[i].selected = resp->selected == 1 ? true : false;
5246 }
5247 }
5248
5249 Return<void> retStatus
5250 = radioService[slotId]->mRadioResponse->getCdmaBroadcastConfigResponse(responseInfo,
5251 configs);
5252 radioService[slotId]->checkReturnStatus(retStatus);
5253 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005254 RLOGE("getCdmaBroadcastConfigResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005255 slotId);
5256 }
5257
5258 return 0;
5259}
5260
Amit Mahajan759786a2017-03-03 17:35:47 -08005261int radio::setCdmaBroadcastConfigResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005262 int responseType, int serial, RIL_Errno e,
5263 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005264#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005265 RLOGD("setCdmaBroadcastConfigResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005266#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005267
5268 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005269 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005270 populateResponseInfo(responseInfo, serial, responseType, e);
5271 Return<void> retStatus
5272 = radioService[slotId]->mRadioResponse->setCdmaBroadcastConfigResponse(
5273 responseInfo);
5274 radioService[slotId]->checkReturnStatus(retStatus);
5275 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005276 RLOGE("setCdmaBroadcastConfigResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005277 slotId);
5278 }
5279
5280 return 0;
5281}
5282
Amit Mahajan759786a2017-03-03 17:35:47 -08005283int radio::setCdmaBroadcastActivationResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005284 int responseType, int serial, RIL_Errno e,
5285 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005286#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005287 RLOGD("setCdmaBroadcastActivationResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005288#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005289
5290 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005291 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005292 populateResponseInfo(responseInfo, serial, responseType, e);
5293 Return<void> retStatus
5294 = radioService[slotId]->mRadioResponse->setCdmaBroadcastActivationResponse(
5295 responseInfo);
5296 radioService[slotId]->checkReturnStatus(retStatus);
5297 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005298 RLOGE("setCdmaBroadcastActivationResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005299 slotId);
5300 }
5301
5302 return 0;
5303}
5304
Amit Mahajan759786a2017-03-03 17:35:47 -08005305int radio::getCDMASubscriptionResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005306 int responseType, int serial, RIL_Errno e, void *response,
5307 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005308#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005309 RLOGD("getCDMASubscriptionResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005310#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005311
5312 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005313 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005314 populateResponseInfo(responseInfo, serial, responseType, e);
5315
5316 int numStrings = responseLen / sizeof(char *);
5317 hidl_string emptyString;
5318 if (response == NULL || numStrings != 5) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005319 RLOGE("getOperatorResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005320 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
5321 Return<void> retStatus
5322 = radioService[slotId]->mRadioResponse->getCDMASubscriptionResponse(
5323 responseInfo, emptyString, emptyString, emptyString, emptyString, emptyString);
5324 radioService[slotId]->checkReturnStatus(retStatus);
5325 } else {
5326 char **resp = (char **) response;
5327 Return<void> retStatus
5328 = radioService[slotId]->mRadioResponse->getCDMASubscriptionResponse(
5329 responseInfo,
5330 convertCharPtrToHidlString(resp[0]),
5331 convertCharPtrToHidlString(resp[1]),
5332 convertCharPtrToHidlString(resp[2]),
5333 convertCharPtrToHidlString(resp[3]),
5334 convertCharPtrToHidlString(resp[4]));
5335 radioService[slotId]->checkReturnStatus(retStatus);
5336 }
5337 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005338 RLOGE("getCDMASubscriptionResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005339 slotId);
5340 }
5341
5342 return 0;
5343}
5344
Amit Mahajan759786a2017-03-03 17:35:47 -08005345int radio::writeSmsToRuimResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005346 int responseType, int serial, RIL_Errno e,
5347 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005348#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005349 RLOGD("writeSmsToRuimResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005350#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005351
5352 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005353 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005354 int ret = responseInt(responseInfo, serial, responseType, e, response, responseLen);
5355 Return<void> retStatus
5356 = radioService[slotId]->mRadioResponse->writeSmsToRuimResponse(responseInfo, ret);
5357 radioService[slotId]->checkReturnStatus(retStatus);
5358 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005359 RLOGE("writeSmsToRuimResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005360 }
5361
5362 return 0;
5363}
5364
Amit Mahajan759786a2017-03-03 17:35:47 -08005365int radio::deleteSmsOnRuimResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005366 int responseType, int serial, RIL_Errno e,
5367 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005368#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005369 RLOGD("deleteSmsOnRuimResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005370#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005371
5372 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005373 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005374 populateResponseInfo(responseInfo, serial, responseType, e);
5375 Return<void> retStatus
5376 = radioService[slotId]->mRadioResponse->deleteSmsOnRuimResponse(responseInfo);
5377 radioService[slotId]->checkReturnStatus(retStatus);
5378 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005379 RLOGE("deleteSmsOnRuimResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005380 }
5381
5382 return 0;
5383}
5384
Amit Mahajan759786a2017-03-03 17:35:47 -08005385int radio::getDeviceIdentityResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005386 int responseType, int serial, RIL_Errno e, void *response,
5387 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005388#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005389 RLOGD("getDeviceIdentityResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005390#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005391
5392 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005393 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005394 populateResponseInfo(responseInfo, serial, responseType, e);
5395
5396 int numStrings = responseLen / sizeof(char *);
5397 hidl_string emptyString;
5398 if (response == NULL || numStrings != 4) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005399 RLOGE("getDeviceIdentityResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005400 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
5401 Return<void> retStatus
5402 = radioService[slotId]->mRadioResponse->getDeviceIdentityResponse(responseInfo,
5403 emptyString, emptyString, emptyString, emptyString);
5404 radioService[slotId]->checkReturnStatus(retStatus);
5405 } else {
5406 char **resp = (char **) response;
5407 Return<void> retStatus
5408 = radioService[slotId]->mRadioResponse->getDeviceIdentityResponse(responseInfo,
5409 convertCharPtrToHidlString(resp[0]),
5410 convertCharPtrToHidlString(resp[1]),
5411 convertCharPtrToHidlString(resp[2]),
5412 convertCharPtrToHidlString(resp[3]));
5413 radioService[slotId]->checkReturnStatus(retStatus);
5414 }
5415 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005416 RLOGE("getDeviceIdentityResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005417 slotId);
5418 }
5419
5420 return 0;
5421}
5422
Amit Mahajan759786a2017-03-03 17:35:47 -08005423int radio::exitEmergencyCallbackModeResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005424 int responseType, int serial, RIL_Errno e,
5425 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005426#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005427 RLOGD("exitEmergencyCallbackModeResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005428#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005429
5430 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005431 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005432 populateResponseInfo(responseInfo, serial, responseType, e);
5433 Return<void> retStatus
5434 = radioService[slotId]->mRadioResponse->exitEmergencyCallbackModeResponse(
5435 responseInfo);
5436 radioService[slotId]->checkReturnStatus(retStatus);
5437 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005438 RLOGE("exitEmergencyCallbackModeResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005439 slotId);
5440 }
5441
5442 return 0;
5443}
5444
Amit Mahajan759786a2017-03-03 17:35:47 -08005445int radio::getSmscAddressResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005446 int responseType, int serial, RIL_Errno e,
5447 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005448#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005449 RLOGD("getSmscAddressResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005450#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005451
5452 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005453 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005454 populateResponseInfo(responseInfo, serial, responseType, e);
5455 Return<void> retStatus
5456 = radioService[slotId]->mRadioResponse->getSmscAddressResponse(responseInfo,
5457 convertCharPtrToHidlString((char *) response));
5458 radioService[slotId]->checkReturnStatus(retStatus);
5459 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005460 RLOGE("getSmscAddressResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005461 }
5462
5463 return 0;
5464}
5465
Amit Mahajan759786a2017-03-03 17:35:47 -08005466int radio::setSmscAddressResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005467 int responseType, int serial, RIL_Errno e,
5468 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005469#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005470 RLOGD("setSmscAddressResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005471#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005472
5473 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005474 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005475 populateResponseInfo(responseInfo, serial, responseType, e);
5476 Return<void> retStatus
5477 = radioService[slotId]->mRadioResponse->setSmscAddressResponse(responseInfo);
5478 radioService[slotId]->checkReturnStatus(retStatus);
5479 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005480 RLOGE("setSmscAddressResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005481 }
5482
5483 return 0;
5484}
5485
Amit Mahajan759786a2017-03-03 17:35:47 -08005486int radio::reportSmsMemoryStatusResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005487 int responseType, int serial, RIL_Errno e,
5488 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005489#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005490 RLOGD("reportSmsMemoryStatusResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005491#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005492
5493 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005494 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005495 populateResponseInfo(responseInfo, serial, responseType, e);
5496 Return<void> retStatus
5497 = radioService[slotId]->mRadioResponse->reportSmsMemoryStatusResponse(responseInfo);
5498 radioService[slotId]->checkReturnStatus(retStatus);
5499 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005500 RLOGE("reportSmsMemoryStatusResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005501 slotId);
5502 }
5503
5504 return 0;
5505}
5506
Amit Mahajan759786a2017-03-03 17:35:47 -08005507int radio::reportStkServiceIsRunningResponse(int slotId,
Amit Mahajan5007ffa2017-01-31 17:14:42 -08005508 int responseType, int serial, RIL_Errno e,
5509 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005510#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005511 RLOGD("reportStkServiceIsRunningResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005512#endif
Amit Mahajan5007ffa2017-01-31 17:14:42 -08005513
5514 if (radioService[slotId]->mRadioResponse != NULL) {
Amit Mahajan3da9ac02017-02-13 13:41:28 -08005515 RadioResponseInfo responseInfo = {};
Amit Mahajan5007ffa2017-01-31 17:14:42 -08005516 populateResponseInfo(responseInfo, serial, responseType, e);
5517 Return<void> retStatus = radioService[slotId]->mRadioResponse->
5518 reportStkServiceIsRunningResponse(responseInfo);
5519 radioService[slotId]->checkReturnStatus(retStatus);
5520 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005521 RLOGE("reportStkServiceIsRunningResponse: radioService[%d]->mRadioResponse == NULL",
Amit Mahajan5007ffa2017-01-31 17:14:42 -08005522 slotId);
5523 }
5524
5525 return 0;
5526}
5527
Amit Mahajan759786a2017-03-03 17:35:47 -08005528int radio::getCdmaSubscriptionSourceResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005529 int responseType, int serial, RIL_Errno e,
5530 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005531#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005532 RLOGD("getCdmaSubscriptionSourceResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005533#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005534
5535 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005536 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005537 int ret = responseInt(responseInfo, serial, responseType, e, response, responseLen);
5538 Return<void> retStatus
5539 = radioService[slotId]->mRadioResponse->getCdmaSubscriptionSourceResponse(
5540 responseInfo, (CdmaSubscriptionSource) ret);
5541 radioService[slotId]->checkReturnStatus(retStatus);
5542 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005543 RLOGE("getCdmaSubscriptionSourceResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005544 slotId);
5545 }
5546
5547 return 0;
5548}
5549
Amit Mahajan759786a2017-03-03 17:35:47 -08005550int radio::requestIsimAuthenticationResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005551 int responseType, int serial, RIL_Errno e,
5552 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005553#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005554 RLOGD("requestIsimAuthenticationResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005555#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005556
5557 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005558 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005559 populateResponseInfo(responseInfo, serial, responseType, e);
5560 Return<void> retStatus
5561 = radioService[slotId]->mRadioResponse->requestIsimAuthenticationResponse(
5562 responseInfo,
5563 convertCharPtrToHidlString((char *) response));
5564 radioService[slotId]->checkReturnStatus(retStatus);
5565 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005566 RLOGE("requestIsimAuthenticationResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005567 slotId);
5568 }
5569
5570 return 0;
5571}
5572
Amit Mahajan759786a2017-03-03 17:35:47 -08005573int radio::acknowledgeIncomingGsmSmsWithPduResponse(int slotId,
5574 int responseType,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005575 int serial, RIL_Errno e, void *response,
5576 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005577#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005578 RLOGD("acknowledgeIncomingGsmSmsWithPduResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005579#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005580
5581 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005582 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005583 populateResponseInfo(responseInfo, serial, responseType, e);
5584 Return<void> retStatus
5585 = radioService[slotId]->mRadioResponse->acknowledgeIncomingGsmSmsWithPduResponse(
5586 responseInfo);
5587 radioService[slotId]->checkReturnStatus(retStatus);
5588 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005589 RLOGE("acknowledgeIncomingGsmSmsWithPduResponse: radioService[%d]->mRadioResponse "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005590 "== NULL", slotId);
5591 }
5592
5593 return 0;
5594}
5595
Amit Mahajan759786a2017-03-03 17:35:47 -08005596int radio::sendEnvelopeWithStatusResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005597 int responseType, int serial, RIL_Errno e, void *response,
5598 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005599#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005600 RLOGD("sendEnvelopeWithStatusResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005601#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005602
5603 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005604 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005605 IccIoResult result = responseIccIo(responseInfo, serial, responseType, e,
5606 response, responseLen);
5607
5608 Return<void> retStatus
5609 = radioService[slotId]->mRadioResponse->sendEnvelopeWithStatusResponse(responseInfo,
5610 result);
5611 radioService[slotId]->checkReturnStatus(retStatus);
5612 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005613 RLOGE("sendEnvelopeWithStatusResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005614 slotId);
5615 }
5616
5617 return 0;
5618}
5619
Amit Mahajan759786a2017-03-03 17:35:47 -08005620int radio::getVoiceRadioTechnologyResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005621 int responseType, int serial, RIL_Errno e,
5622 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005623#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005624 RLOGD("getVoiceRadioTechnologyResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005625#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005626
5627 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005628 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005629 int ret = responseInt(responseInfo, serial, responseType, e, response, responseLen);
5630 Return<void> retStatus
5631 = radioService[slotId]->mRadioResponse->getVoiceRadioTechnologyResponse(
5632 responseInfo, (RadioTechnology) ret);
5633 radioService[slotId]->checkReturnStatus(retStatus);
5634 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005635 RLOGE("getVoiceRadioTechnologyResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005636 slotId);
5637 }
5638
5639 return 0;
5640}
5641
Amit Mahajan759786a2017-03-03 17:35:47 -08005642int radio::getCellInfoListResponse(int slotId,
5643 int responseType,
Amit Mahajan3df62912017-02-10 01:35:55 +00005644 int serial, RIL_Errno e, void *response,
5645 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005646#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005647 RLOGD("getCellInfoListResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005648#endif
Amit Mahajan3df62912017-02-10 01:35:55 +00005649
5650 if (radioService[slotId]->mRadioResponse != NULL) {
Amit Mahajan3da9ac02017-02-13 13:41:28 -08005651 RadioResponseInfo responseInfo = {};
Amit Mahajan3df62912017-02-10 01:35:55 +00005652 populateResponseInfo(responseInfo, serial, responseType, e);
5653
5654 hidl_vec<CellInfo> ret;
5655 if (response == NULL || responseLen % sizeof(RIL_CellInfo_v12) != 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005656 RLOGE("getCellInfoListResponse: Invalid response");
Amit Mahajan3df62912017-02-10 01:35:55 +00005657 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
5658 } else {
5659 convertRilCellInfoListToHal(response, responseLen, ret);
5660 }
5661
5662 Return<void> retStatus = radioService[slotId]->mRadioResponse->getCellInfoListResponse(
5663 responseInfo, ret);
5664 radioService[slotId]->checkReturnStatus(retStatus);
5665 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005666 RLOGE("getCellInfoListResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Amit Mahajan3df62912017-02-10 01:35:55 +00005667 }
5668
5669 return 0;
5670}
5671
Amit Mahajan759786a2017-03-03 17:35:47 -08005672int radio::setCellInfoListRateResponse(int slotId,
5673 int responseType,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005674 int serial, RIL_Errno e, void *response,
5675 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005676#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005677 RLOGD("setCellInfoListRateResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005678#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005679
5680 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005681 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005682 populateResponseInfo(responseInfo, serial, responseType, e);
5683 Return<void> retStatus
5684 = radioService[slotId]->mRadioResponse->setCellInfoListRateResponse(responseInfo);
5685 radioService[slotId]->checkReturnStatus(retStatus);
5686 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005687 RLOGE("setCellInfoListRateResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005688 slotId);
5689 }
5690
5691 return 0;
5692}
5693
Amit Mahajan759786a2017-03-03 17:35:47 -08005694int radio::setInitialAttachApnResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005695 int responseType, int serial, RIL_Errno e,
5696 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005697#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005698 RLOGD("setInitialAttachApnResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005699#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005700
5701 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005702 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005703 populateResponseInfo(responseInfo, serial, responseType, e);
5704 Return<void> retStatus
5705 = radioService[slotId]->mRadioResponse->setInitialAttachApnResponse(responseInfo);
5706 radioService[slotId]->checkReturnStatus(retStatus);
5707 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005708 RLOGE("setInitialAttachApnResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005709 slotId);
5710 }
5711
5712 return 0;
5713}
5714
Amit Mahajan759786a2017-03-03 17:35:47 -08005715int radio::getImsRegistrationStateResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005716 int responseType, int serial, RIL_Errno e,
5717 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005718#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005719 RLOGD("getImsRegistrationStateResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005720#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005721
5722 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005723 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005724 populateResponseInfo(responseInfo, serial, responseType, e);
5725 bool isRegistered = false;
5726 int ratFamily = 0;
5727 int numInts = responseLen / sizeof(int);
5728 if (response == NULL || numInts != 2) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005729 RLOGE("getImsRegistrationStateResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005730 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
5731 } else {
5732 int *pInt = (int *) response;
5733 isRegistered = pInt[0] == 1 ? true : false;
5734 ratFamily = pInt[1];
5735 }
5736 Return<void> retStatus
5737 = radioService[slotId]->mRadioResponse->getImsRegistrationStateResponse(
5738 responseInfo, isRegistered, (RadioTechnologyFamily) ratFamily);
5739 radioService[slotId]->checkReturnStatus(retStatus);
5740 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005741 RLOGE("getImsRegistrationStateResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005742 slotId);
5743 }
5744
5745 return 0;
5746}
5747
Amit Mahajan759786a2017-03-03 17:35:47 -08005748int radio::sendImsSmsResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005749 int responseType, int serial, RIL_Errno e, void *response,
5750 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005751#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005752 RLOGD("sendImsSmsResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005753#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005754
5755 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005756 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005757 SendSmsResult result = makeSendSmsResult(responseInfo, serial, responseType, e, response,
5758 responseLen);
5759
5760 Return<void> retStatus
5761 = radioService[slotId]->mRadioResponse->sendImsSmsResponse(responseInfo, result);
5762 radioService[slotId]->checkReturnStatus(retStatus);
5763 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005764 RLOGE("sendSmsResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005765 }
5766
5767 return 0;
5768}
5769
Amit Mahajan759786a2017-03-03 17:35:47 -08005770int radio::iccTransmitApduBasicChannelResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005771 int responseType, int serial, RIL_Errno e,
5772 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005773#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005774 RLOGD("iccTransmitApduBasicChannelResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005775#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005776
5777 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005778 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005779 IccIoResult result = responseIccIo(responseInfo, serial, responseType, e, response,
5780 responseLen);
5781
5782 Return<void> retStatus
5783 = radioService[slotId]->mRadioResponse->iccTransmitApduBasicChannelResponse(
5784 responseInfo, result);
5785 radioService[slotId]->checkReturnStatus(retStatus);
5786 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005787 RLOGE("iccTransmitApduBasicChannelResponse: radioService[%d]->mRadioResponse "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005788 "== NULL", slotId);
5789 }
5790
5791 return 0;
5792}
5793
Amit Mahajan759786a2017-03-03 17:35:47 -08005794int radio::iccOpenLogicalChannelResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005795 int responseType, int serial, RIL_Errno e, void *response,
5796 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005797#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005798 RLOGD("iccOpenLogicalChannelResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005799#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005800
5801 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005802 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005803 populateResponseInfo(responseInfo, serial, responseType, e);
5804 int channelId = -1;
5805 hidl_vec<int8_t> selectResponse;
5806 int numInts = responseLen / sizeof(int);
5807 if (response == NULL || responseLen % sizeof(int) != 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005808 RLOGE("iccOpenLogicalChannelResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005809 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
5810 } else {
5811 int *pInt = (int *) response;
5812 channelId = pInt[0];
5813 selectResponse.resize(numInts - 1);
5814 for (int i = 1; i < numInts; i++) {
5815 selectResponse[i - 1] = (int8_t) pInt[i];
5816 }
5817 }
5818 Return<void> retStatus
5819 = radioService[slotId]->mRadioResponse->iccOpenLogicalChannelResponse(responseInfo,
5820 channelId, selectResponse);
5821 radioService[slotId]->checkReturnStatus(retStatus);
5822 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005823 RLOGE("iccOpenLogicalChannelResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005824 slotId);
5825 }
5826
5827 return 0;
5828}
5829
Amit Mahajan759786a2017-03-03 17:35:47 -08005830int radio::iccCloseLogicalChannelResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005831 int responseType, int serial, RIL_Errno e,
5832 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005833#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005834 RLOGD("iccCloseLogicalChannelResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005835#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005836
5837 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005838 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005839 populateResponseInfo(responseInfo, serial, responseType, e);
5840 Return<void> retStatus
5841 = radioService[slotId]->mRadioResponse->iccCloseLogicalChannelResponse(
5842 responseInfo);
5843 radioService[slotId]->checkReturnStatus(retStatus);
5844 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005845 RLOGE("iccCloseLogicalChannelResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005846 slotId);
5847 }
5848
5849 return 0;
5850}
5851
Amit Mahajan759786a2017-03-03 17:35:47 -08005852int radio::iccTransmitApduLogicalChannelResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005853 int responseType, int serial, RIL_Errno e,
5854 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005855#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005856 RLOGD("iccTransmitApduLogicalChannelResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005857#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005858
5859 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005860 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005861 IccIoResult result = responseIccIo(responseInfo, serial, responseType, e, response,
5862 responseLen);
5863
5864 Return<void> retStatus
5865 = radioService[slotId]->mRadioResponse->iccTransmitApduLogicalChannelResponse(
5866 responseInfo, result);
5867 radioService[slotId]->checkReturnStatus(retStatus);
5868 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005869 RLOGE("iccTransmitApduLogicalChannelResponse: radioService[%d]->mRadioResponse "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005870 "== NULL", slotId);
5871 }
5872
5873 return 0;
5874}
5875
Amit Mahajan759786a2017-03-03 17:35:47 -08005876int radio::nvReadItemResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005877 int responseType, int serial, RIL_Errno e,
5878 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005879#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005880 RLOGD("nvReadItemResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005881#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005882
5883 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005884 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005885 populateResponseInfo(responseInfo, serial, responseType, e);
5886 Return<void> retStatus = radioService[slotId]->mRadioResponse->nvReadItemResponse(
5887 responseInfo,
5888 convertCharPtrToHidlString((char *) response));
5889 radioService[slotId]->checkReturnStatus(retStatus);
5890 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005891 RLOGE("nvReadItemResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005892 }
5893
5894 return 0;
5895}
5896
Amit Mahajan759786a2017-03-03 17:35:47 -08005897int radio::nvWriteItemResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005898 int responseType, int serial, RIL_Errno e,
5899 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005900#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005901 RLOGD("nvWriteItemResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005902#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005903
5904 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005905 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005906 populateResponseInfo(responseInfo, serial, responseType, e);
5907 Return<void> retStatus
5908 = radioService[slotId]->mRadioResponse->nvWriteItemResponse(responseInfo);
5909 radioService[slotId]->checkReturnStatus(retStatus);
5910 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005911 RLOGE("nvWriteItemResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005912 }
5913
5914 return 0;
5915}
5916
Amit Mahajan759786a2017-03-03 17:35:47 -08005917int radio::nvWriteCdmaPrlResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005918 int responseType, int serial, RIL_Errno e,
5919 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005920#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005921 RLOGD("nvWriteCdmaPrlResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005922#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005923
5924 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005925 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005926 populateResponseInfo(responseInfo, serial, responseType, e);
5927 Return<void> retStatus
5928 = radioService[slotId]->mRadioResponse->nvWriteCdmaPrlResponse(responseInfo);
5929 radioService[slotId]->checkReturnStatus(retStatus);
5930 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005931 RLOGE("nvWriteCdmaPrlResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005932 }
5933
5934 return 0;
5935}
5936
Amit Mahajan759786a2017-03-03 17:35:47 -08005937int radio::nvResetConfigResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005938 int responseType, int serial, RIL_Errno e,
5939 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005940#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005941 RLOGD("nvResetConfigResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005942#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005943
5944 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005945 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005946 populateResponseInfo(responseInfo, serial, responseType, e);
5947 Return<void> retStatus
5948 = radioService[slotId]->mRadioResponse->nvResetConfigResponse(responseInfo);
5949 radioService[slotId]->checkReturnStatus(retStatus);
5950 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005951 RLOGE("nvResetConfigResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005952 }
5953
5954 return 0;
5955}
5956
Amit Mahajan759786a2017-03-03 17:35:47 -08005957int radio::setUiccSubscriptionResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005958 int responseType, int serial, RIL_Errno e,
5959 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005960#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005961 RLOGD("setUiccSubscriptionResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005962#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005963
5964 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005965 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005966 populateResponseInfo(responseInfo, serial, responseType, e);
5967 Return<void> retStatus
5968 = radioService[slotId]->mRadioResponse->setUiccSubscriptionResponse(responseInfo);
5969 radioService[slotId]->checkReturnStatus(retStatus);
5970 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005971 RLOGE("setUiccSubscriptionResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005972 slotId);
5973 }
5974
5975 return 0;
5976}
5977
Amit Mahajan759786a2017-03-03 17:35:47 -08005978int radio::setDataAllowedResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005979 int responseType, int serial, RIL_Errno e,
5980 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005981#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005982 RLOGD("setDataAllowedResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005983#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005984
5985 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005986 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005987 populateResponseInfo(responseInfo, serial, responseType, e);
5988 Return<void> retStatus
5989 = radioService[slotId]->mRadioResponse->setDataAllowedResponse(responseInfo);
5990 radioService[slotId]->checkReturnStatus(retStatus);
5991 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005992 RLOGE("setDataAllowedResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005993 }
5994
5995 return 0;
5996}
5997
Amit Mahajan759786a2017-03-03 17:35:47 -08005998int radio::getHardwareConfigResponse(int slotId,
Amit Mahajan3df62912017-02-10 01:35:55 +00005999 int responseType, int serial, RIL_Errno e,
6000 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006001#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006002 RLOGD("getHardwareConfigResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006003#endif
Amit Mahajan3df62912017-02-10 01:35:55 +00006004
6005 if (radioService[slotId]->mRadioResponse != NULL) {
Amit Mahajan3da9ac02017-02-13 13:41:28 -08006006 RadioResponseInfo responseInfo = {};
Amit Mahajan3df62912017-02-10 01:35:55 +00006007 populateResponseInfo(responseInfo, serial, responseType, e);
6008
6009 hidl_vec<HardwareConfig> result;
6010 if (response == NULL || responseLen % sizeof(RIL_HardwareConfig) != 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006011 RLOGE("hardwareConfigChangedInd: invalid response");
Amit Mahajan3df62912017-02-10 01:35:55 +00006012 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
6013 } else {
6014 convertRilHardwareConfigListToHal(response, responseLen, result);
6015 }
6016
6017 Return<void> retStatus = radioService[slotId]->mRadioResponse->getHardwareConfigResponse(
6018 responseInfo, result);
6019 radioService[slotId]->checkReturnStatus(retStatus);
6020 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006021 RLOGE("getHardwareConfigResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Amit Mahajan3df62912017-02-10 01:35:55 +00006022 }
6023
6024 return 0;
6025}
6026
Amit Mahajan759786a2017-03-03 17:35:47 -08006027int radio::requestIccSimAuthenticationResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006028 int responseType, int serial, RIL_Errno e,
6029 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006030#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006031 RLOGD("requestIccSimAuthenticationResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006032#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006033
6034 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08006035 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006036 IccIoResult result = responseIccIo(responseInfo, serial, responseType, e, response,
6037 responseLen);
6038
6039 Return<void> retStatus
6040 = radioService[slotId]->mRadioResponse->requestIccSimAuthenticationResponse(
6041 responseInfo, result);
6042 radioService[slotId]->checkReturnStatus(retStatus);
6043 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006044 RLOGE("requestIccSimAuthenticationResponse: radioService[%d]->mRadioResponse "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006045 "== NULL", slotId);
6046 }
6047
6048 return 0;
6049}
6050
Amit Mahajan759786a2017-03-03 17:35:47 -08006051int radio::setDataProfileResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006052 int responseType, int serial, RIL_Errno e,
6053 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006054#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006055 RLOGD("setDataProfileResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006056#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006057
6058 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08006059 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006060 populateResponseInfo(responseInfo, serial, responseType, e);
6061 Return<void> retStatus
6062 = radioService[slotId]->mRadioResponse->setDataProfileResponse(responseInfo);
6063 radioService[slotId]->checkReturnStatus(retStatus);
6064 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006065 RLOGE("setDataProfileResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006066 }
6067
6068 return 0;
6069}
6070
Amit Mahajan759786a2017-03-03 17:35:47 -08006071int radio::requestShutdownResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006072 int responseType, int serial, RIL_Errno e,
6073 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006074#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006075 RLOGD("requestShutdownResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006076#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006077
6078 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08006079 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006080 populateResponseInfo(responseInfo, serial, responseType, e);
6081 Return<void> retStatus
6082 = radioService[slotId]->mRadioResponse->requestShutdownResponse(responseInfo);
6083 radioService[slotId]->checkReturnStatus(retStatus);
6084 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006085 RLOGE("requestShutdownResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006086 }
6087
6088 return 0;
6089}
6090
Amit Mahajan3df62912017-02-10 01:35:55 +00006091void responseRadioCapability(RadioResponseInfo& responseInfo, int serial,
6092 int responseType, RIL_Errno e, void *response, size_t responseLen, RadioCapability& rc) {
6093 populateResponseInfo(responseInfo, serial, responseType, e);
6094
Amit Mahajan1fbff082017-02-24 11:24:39 -08006095 if (response == NULL || responseLen != sizeof(RIL_RadioCapability)) {
Amit Mahajan3df62912017-02-10 01:35:55 +00006096 RLOGE("responseRadioCapability: Invalid response");
6097 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
Amit Mahajan3da9ac02017-02-13 13:41:28 -08006098 rc.logicalModemUuid = hidl_string();
Amit Mahajan3df62912017-02-10 01:35:55 +00006099 } else {
6100 convertRilRadioCapabilityToHal(response, responseLen, rc);
6101 }
6102}
6103
Amit Mahajan759786a2017-03-03 17:35:47 -08006104int radio::getRadioCapabilityResponse(int slotId,
Amit Mahajan3df62912017-02-10 01:35:55 +00006105 int responseType, int serial, RIL_Errno e,
6106 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006107#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006108 RLOGD("getRadioCapabilityResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006109#endif
Amit Mahajan3df62912017-02-10 01:35:55 +00006110
6111 if (radioService[slotId]->mRadioResponse != NULL) {
Amit Mahajan3da9ac02017-02-13 13:41:28 -08006112 RadioResponseInfo responseInfo = {};
6113 RadioCapability result = {};
Amit Mahajan3df62912017-02-10 01:35:55 +00006114 responseRadioCapability(responseInfo, serial, responseType, e, response, responseLen,
6115 result);
6116 Return<void> retStatus = radioService[slotId]->mRadioResponse->getRadioCapabilityResponse(
6117 responseInfo, result);
6118 radioService[slotId]->checkReturnStatus(retStatus);
6119 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006120 RLOGE("getRadioCapabilityResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Amit Mahajan3df62912017-02-10 01:35:55 +00006121 }
6122
6123 return 0;
6124}
6125
Amit Mahajan759786a2017-03-03 17:35:47 -08006126int radio::setRadioCapabilityResponse(int slotId,
Amit Mahajan3df62912017-02-10 01:35:55 +00006127 int responseType, int serial, RIL_Errno e,
6128 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006129#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006130 RLOGD("setRadioCapabilityResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006131#endif
Amit Mahajan3df62912017-02-10 01:35:55 +00006132
6133 if (radioService[slotId]->mRadioResponse != NULL) {
Amit Mahajan3da9ac02017-02-13 13:41:28 -08006134 RadioResponseInfo responseInfo = {};
6135 RadioCapability result = {};
Amit Mahajan3df62912017-02-10 01:35:55 +00006136 responseRadioCapability(responseInfo, serial, responseType, e, response, responseLen,
6137 result);
6138 Return<void> retStatus = radioService[slotId]->mRadioResponse->setRadioCapabilityResponse(
6139 responseInfo, result);
6140 radioService[slotId]->checkReturnStatus(retStatus);
6141 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006142 RLOGE("setRadioCapabilityResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Amit Mahajan3df62912017-02-10 01:35:55 +00006143 }
6144
6145 return 0;
6146}
6147
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006148LceStatusInfo responseLceStatusInfo(RadioResponseInfo& responseInfo, int serial, int responseType,
6149 RIL_Errno e, void *response, size_t responseLen) {
6150 populateResponseInfo(responseInfo, serial, responseType, e);
Jack Yuf68e0da2017-02-07 14:53:09 -08006151 LceStatusInfo result = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006152
6153 if (response == NULL || responseLen != sizeof(RIL_LceStatusInfo)) {
6154 RLOGE("Invalid response: NULL");
6155 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006156 } else {
6157 RIL_LceStatusInfo *resp = (RIL_LceStatusInfo *) response;
6158 result.lceStatus = (LceStatus) resp->lce_status;
6159 result.actualIntervalMs = (uint8_t) resp->actual_interval_ms;
6160 }
6161 return result;
6162}
6163
Amit Mahajan759786a2017-03-03 17:35:47 -08006164int radio::startLceServiceResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006165 int responseType, int serial, RIL_Errno e,
6166 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006167#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006168 RLOGD("startLceServiceResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006169#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006170
6171 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08006172 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006173 LceStatusInfo result = responseLceStatusInfo(responseInfo, serial, responseType, e,
6174 response, responseLen);
6175
6176 Return<void> retStatus
6177 = radioService[slotId]->mRadioResponse->startLceServiceResponse(responseInfo,
6178 result);
6179 radioService[slotId]->checkReturnStatus(retStatus);
6180 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006181 RLOGE("startLceServiceResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006182 }
6183
6184 return 0;
6185}
6186
Amit Mahajan759786a2017-03-03 17:35:47 -08006187int radio::stopLceServiceResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006188 int responseType, int serial, RIL_Errno e,
6189 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006190#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006191 RLOGD("stopLceServiceResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006192#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006193
6194 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08006195 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006196 LceStatusInfo result = responseLceStatusInfo(responseInfo, serial, responseType, e,
6197 response, responseLen);
6198
6199 Return<void> retStatus
6200 = radioService[slotId]->mRadioResponse->stopLceServiceResponse(responseInfo,
6201 result);
6202 radioService[slotId]->checkReturnStatus(retStatus);
6203 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006204 RLOGE("stopLceServiceResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006205 }
6206
6207 return 0;
6208}
6209
Amit Mahajan759786a2017-03-03 17:35:47 -08006210int radio::pullLceDataResponse(int slotId,
Amit Mahajan3df62912017-02-10 01:35:55 +00006211 int responseType, int serial, RIL_Errno e,
6212 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006213#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006214 RLOGD("pullLceDataResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006215#endif
Amit Mahajan3df62912017-02-10 01:35:55 +00006216
6217 if (radioService[slotId]->mRadioResponse != NULL) {
Amit Mahajan3da9ac02017-02-13 13:41:28 -08006218 RadioResponseInfo responseInfo = {};
Amit Mahajan3df62912017-02-10 01:35:55 +00006219 populateResponseInfo(responseInfo, serial, responseType, e);
6220
Amit Mahajan3da9ac02017-02-13 13:41:28 -08006221 LceDataInfo result = {};
Amit Mahajan3df62912017-02-10 01:35:55 +00006222 if (response == NULL || responseLen != sizeof(RIL_LceDataInfo)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006223 RLOGE("pullLceDataResponse: Invalid response");
Amit Mahajan3df62912017-02-10 01:35:55 +00006224 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
Amit Mahajan3df62912017-02-10 01:35:55 +00006225 } else {
6226 convertRilLceDataInfoToHal(response, responseLen, result);
6227 }
6228
6229 Return<void> retStatus = radioService[slotId]->mRadioResponse->pullLceDataResponse(
6230 responseInfo, result);
6231 radioService[slotId]->checkReturnStatus(retStatus);
6232 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006233 RLOGE("pullLceDataResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Amit Mahajan3df62912017-02-10 01:35:55 +00006234 }
6235
6236 return 0;
6237}
6238
Amit Mahajan759786a2017-03-03 17:35:47 -08006239int radio::getModemActivityInfoResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006240 int responseType, int serial, RIL_Errno e,
6241 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006242#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006243 RLOGD("getModemActivityInfoResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006244#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006245
6246 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08006247 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006248 populateResponseInfo(responseInfo, serial, responseType, e);
6249 ActivityStatsInfo info;
6250 if (response == NULL || responseLen != sizeof(RIL_ActivityStatsInfo)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006251 RLOGE("getModemActivityInfoResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006252 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006253 } else {
6254 RIL_ActivityStatsInfo *resp = (RIL_ActivityStatsInfo *)response;
6255 info.sleepModeTimeMs = resp->sleep_mode_time_ms;
6256 info.idleModeTimeMs = resp->idle_mode_time_ms;
6257 for(int i = 0; i < RIL_NUM_TX_POWER_LEVELS; i++) {
6258 info.txmModetimeMs[i] = resp->tx_mode_time_ms[i];
6259 }
6260 info.rxModeTimeMs = resp->rx_mode_time_ms;
6261 }
6262
6263 Return<void> retStatus
6264 = radioService[slotId]->mRadioResponse->getModemActivityInfoResponse(responseInfo,
6265 info);
6266 radioService[slotId]->checkReturnStatus(retStatus);
6267 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006268 RLOGE("getModemActivityInfoResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006269 slotId);
6270 }
6271
6272 return 0;
6273}
6274
Amit Mahajan759786a2017-03-03 17:35:47 -08006275int radio::setAllowedCarriersResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006276 int responseType, int serial, RIL_Errno e,
6277 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006278#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006279 RLOGD("setAllowedCarriersResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006280#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006281
6282 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08006283 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006284 int ret = responseInt(responseInfo, serial, responseType, e, response, responseLen);
6285 Return<void> retStatus
6286 = radioService[slotId]->mRadioResponse->setAllowedCarriersResponse(responseInfo,
6287 ret);
6288 radioService[slotId]->checkReturnStatus(retStatus);
6289 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006290 RLOGE("setAllowedCarriersResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006291 slotId);
6292 }
6293
6294 return 0;
6295}
6296
Amit Mahajan759786a2017-03-03 17:35:47 -08006297int radio::getAllowedCarriersResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006298 int responseType, int serial, RIL_Errno e,
6299 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006300#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006301 RLOGD("getAllowedCarriersResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006302#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006303
6304 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08006305 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006306 populateResponseInfo(responseInfo, serial, responseType, e);
Jack Yuf68e0da2017-02-07 14:53:09 -08006307 CarrierRestrictions carrierInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006308 bool allAllowed = true;
Jayachandran C70f7d2e2017-04-28 00:57:13 -07006309 if (response == NULL) {
6310#if VDBG
6311 RLOGD("getAllowedCarriersResponse response is NULL: all allowed");
6312#endif
6313 carrierInfo.allowedCarriers.resize(0);
6314 carrierInfo.excludedCarriers.resize(0);
6315 } else if (responseLen != sizeof(RIL_CarrierRestrictions)) {
6316 RLOGE("getAllowedCarriersResponse Invalid response");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006317 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
6318 } else {
6319 RIL_CarrierRestrictions *pCr = (RIL_CarrierRestrictions *)response;
6320 if (pCr->len_allowed_carriers > 0 || pCr->len_excluded_carriers > 0) {
6321 allAllowed = false;
6322 }
6323
6324 carrierInfo.allowedCarriers.resize(pCr->len_allowed_carriers);
6325 for(int i = 0; i < pCr->len_allowed_carriers; i++) {
6326 RIL_Carrier *carrier = pCr->allowed_carriers + i;
6327 carrierInfo.allowedCarriers[i].mcc = convertCharPtrToHidlString(carrier->mcc);
6328 carrierInfo.allowedCarriers[i].mnc = convertCharPtrToHidlString(carrier->mnc);
6329 carrierInfo.allowedCarriers[i].matchType = (CarrierMatchType) carrier->match_type;
6330 carrierInfo.allowedCarriers[i].matchData =
6331 convertCharPtrToHidlString(carrier->match_data);
6332 }
6333
6334 carrierInfo.excludedCarriers.resize(pCr->len_excluded_carriers);
6335 for(int i = 0; i < pCr->len_excluded_carriers; i++) {
6336 RIL_Carrier *carrier = pCr->excluded_carriers + i;
6337 carrierInfo.excludedCarriers[i].mcc = convertCharPtrToHidlString(carrier->mcc);
6338 carrierInfo.excludedCarriers[i].mnc = convertCharPtrToHidlString(carrier->mnc);
6339 carrierInfo.excludedCarriers[i].matchType = (CarrierMatchType) carrier->match_type;
6340 carrierInfo.excludedCarriers[i].matchData =
6341 convertCharPtrToHidlString(carrier->match_data);
6342 }
6343 }
6344
6345 Return<void> retStatus
6346 = radioService[slotId]->mRadioResponse->getAllowedCarriersResponse(responseInfo,
6347 allAllowed, carrierInfo);
6348 radioService[slotId]->checkReturnStatus(retStatus);
6349 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006350 RLOGE("getAllowedCarriersResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006351 slotId);
6352 }
6353
6354 return 0;
6355}
6356
Amit Mahajan759786a2017-03-03 17:35:47 -08006357int radio::sendDeviceStateResponse(int slotId,
Jack Yu11ab4042017-02-21 17:08:01 -08006358 int responseType, int serial, RIL_Errno e,
6359 void *response, size_t responselen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006360#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006361 RLOGD("sendDeviceStateResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006362#endif
Jack Yu11ab4042017-02-21 17:08:01 -08006363
6364 if (radioService[slotId]->mRadioResponse != NULL) {
6365 RadioResponseInfo responseInfo = {};
6366 populateResponseInfo(responseInfo, serial, responseType, e);
6367 Return<void> retStatus
6368 = radioService[slotId]->mRadioResponse->sendDeviceStateResponse(responseInfo);
6369 radioService[slotId]->checkReturnStatus(retStatus);
6370 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006371 RLOGE("sendDeviceStateResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Jack Yu11ab4042017-02-21 17:08:01 -08006372 }
6373
6374 return 0;
6375}
6376
pkanwarc61837e2017-03-17 12:49:34 -07006377int radio::setCarrierInfoForImsiEncryptionResponse(int slotId,
6378 int responseType, int serial, RIL_Errno e,
6379 void *response, size_t responseLen) {
6380 RLOGD("setCarrierInfoForImsiEncryptionResponse: serial %d", serial);
6381 if (radioService[slotId]->mRadioResponse != NULL) {
6382 RadioResponseInfo responseInfo = {};
6383 populateResponseInfo(responseInfo, serial, responseType, e);
6384 Return<sp<::android::hardware::radio::V1_1::IRadioResponse>> ret =
6385 ::android::hardware::radio::V1_1::IRadioResponse::castFrom(
6386 radioService[slotId]->mRadioResponse);
6387 if (ret.isOk()) {
6388 sp<::android::hardware::radio::V1_1::IRadioResponse> radioResponseV1_1 = ret;
6389 Return<void> retStatus
6390 = radioResponseV1_1->setCarrierInfoForImsiEncryptionResponse(responseInfo);
6391 radioService[slotId]->checkReturnStatus(retStatus);
6392 } else {
6393 RLOGE("setCarrierInfoForImsiEncryptionResponse: ret.isOk() == false for "
6394 "radioService[%d]" , slotId);
6395 }
6396 } else {
6397 RLOGE("setCarrierInfoForImsiEncryptionResponse: radioService[%d]->mRadioResponse == NULL",
6398 slotId);
6399 }
6400 return 0;
6401}
6402
Amit Mahajan759786a2017-03-03 17:35:47 -08006403int radio::setIndicationFilterResponse(int slotId,
Jack Yu11ab4042017-02-21 17:08:01 -08006404 int responseType, int serial, RIL_Errno e,
6405 void *response, size_t responselen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006406#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006407 RLOGD("setIndicationFilterResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006408#endif
Jack Yu11ab4042017-02-21 17:08:01 -08006409
6410 if (radioService[slotId]->mRadioResponse != NULL) {
6411 RadioResponseInfo responseInfo = {};
6412 populateResponseInfo(responseInfo, serial, responseType, e);
6413 Return<void> retStatus
6414 = radioService[slotId]->mRadioResponse->setIndicationFilterResponse(responseInfo);
6415 radioService[slotId]->checkReturnStatus(retStatus);
6416 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006417 RLOGE("setIndicationFilterResponse: radioService[%d]->mRadioResponse == NULL",
Jack Yu11ab4042017-02-21 17:08:01 -08006418 slotId);
6419 }
6420
6421 return 0;
6422}
6423
Amit Mahajan759786a2017-03-03 17:35:47 -08006424int radio::setSimCardPowerResponse(int slotId,
Wileen Chiu718c0bf2017-01-04 11:37:19 -08006425 int responseType, int serial, RIL_Errno e,
6426 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006427#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006428 RLOGD("setSimCardPowerResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006429#endif
Wileen Chiu718c0bf2017-01-04 11:37:19 -08006430
6431 if (radioService[slotId]->mRadioResponse != NULL) {
6432 RadioResponseInfo responseInfo = {};
6433 populateResponseInfo(responseInfo, serial, responseType, e);
Grace Chen797c1c22017-03-23 18:39:48 -07006434 Return<sp<::android::hardware::radio::V1_1::IRadioResponse>> ret =
6435 ::android::hardware::radio::V1_1::IRadioResponse::castFrom(
6436 radioService[slotId]->mRadioResponse);
6437 if (ret.isOk()) {
6438 sp<::android::hardware::radio::V1_1::IRadioResponse> radioResponseV1_1 = ret;
6439 Return<void> retStatus
6440 = radioResponseV1_1->setSimCardPowerResponse_1_1(responseInfo);
6441 radioService[slotId]->checkReturnStatus(retStatus);
6442 } else {
6443 RLOGD("setSimCardPowerResponse: ret.isOK() == false for radioService[%d]",
6444 slotId);
6445 Return<void> retStatus
6446 = radioService[slotId]->mRadioResponse->setSimCardPowerResponse(responseInfo);
6447 radioService[slotId]->checkReturnStatus(retStatus);
6448 }
Wileen Chiu718c0bf2017-01-04 11:37:19 -08006449 } else {
Grace Chen797c1c22017-03-23 18:39:48 -07006450 RLOGE("setSimCardPowerResponse: radioService[%d]->mRadioResponse == NULL",
6451 slotId);
Wileen Chiu718c0bf2017-01-04 11:37:19 -08006452 }
Wileen Chiu718c0bf2017-01-04 11:37:19 -08006453 return 0;
6454}
6455
yinxu8688abd2017-05-22 11:26:45 -07006456int radio::startNetworkScanResponse(int slotId, int responseType, int serial, RIL_Errno e,
6457 void *response, size_t responseLen) {
6458#if VDBG
6459 RLOGD("startNetworkScanResponse: serial %d", serial);
6460#endif
6461
6462 if (radioService[slotId]->mRadioResponse != NULL) {
6463 RadioResponseInfo responseInfo = {};
6464 populateResponseInfo(responseInfo, serial, responseType, e);
6465 Return<sp<::android::hardware::radio::V1_1::IRadioResponse>> ret =
6466 ::android::hardware::radio::V1_1::IRadioResponse::castFrom(
6467 radioService[slotId]->mRadioResponse);
6468 if (ret.isOk()) {
6469 sp<::android::hardware::radio::V1_1::IRadioResponse> radioResponseV1_1 = ret;
6470 Return<void> retStatus = radioResponseV1_1->startNetworkScanResponse(responseInfo);
6471 radioService[slotId]->checkReturnStatus(retStatus);
6472 } else {
6473 RLOGD("startNetworkScanResponse: ret.isOK() == false for radioService[%d]", slotId);
6474 }
6475 } else {
6476 RLOGE("startNetworkScanResponse: radioService[%d]->mRadioResponse == NULL", slotId);
6477 }
6478
6479 return 0;
6480}
6481
6482int radio::stopNetworkScanResponse(int slotId, int responseType, int serial, RIL_Errno e,
6483 void *response, size_t responseLen) {
6484#if VDBG
6485 RLOGD("stopNetworkScanResponse: serial %d", serial);
6486#endif
6487
6488 if (radioService[slotId]->mRadioResponse != NULL) {
6489 RadioResponseInfo responseInfo = {};
6490 populateResponseInfo(responseInfo, serial, responseType, e);
6491 Return<sp<::android::hardware::radio::V1_1::IRadioResponse>> ret =
6492 ::android::hardware::radio::V1_1::IRadioResponse::castFrom(
6493 radioService[slotId]->mRadioResponse);
6494 if (ret.isOk()) {
6495 sp<::android::hardware::radio::V1_1::IRadioResponse> radioResponseV1_1 = ret;
6496 Return<void> retStatus = radioResponseV1_1->stopNetworkScanResponse(responseInfo);
6497 radioService[slotId]->checkReturnStatus(retStatus);
6498 } else {
6499 RLOGD("stopNetworkScanResponse: ret.isOK() == false for radioService[%d]", slotId);
6500 }
6501 } else {
6502 RLOGE("stopNetworkScanResponse: radioService[%d]->mRadioResponse == NULL", slotId);
6503 }
6504
6505 return 0;
6506}
6507
Amit Mahajan759786a2017-03-03 17:35:47 -08006508int radio::sendRequestRawResponse(int slotId,
Amit Mahajan439da362017-02-13 17:43:04 -08006509 int responseType, int serial, RIL_Errno e,
6510 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006511#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006512 RLOGD("sendRequestRawResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006513#endif
Amit Mahajan439da362017-02-13 17:43:04 -08006514
6515 if (oemHookService[slotId]->mOemHookResponse != NULL) {
6516 RadioResponseInfo responseInfo = {};
6517 populateResponseInfo(responseInfo, serial, responseType, e);
6518 hidl_vec<uint8_t> data;
6519
6520 if (response == NULL) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006521 RLOGE("sendRequestRawResponse: Invalid response");
Amit Mahajan439da362017-02-13 17:43:04 -08006522 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
6523 } else {
6524 data.setToExternal((uint8_t *) response, responseLen);
6525 }
6526 Return<void> retStatus = oemHookService[slotId]->mOemHookResponse->
6527 sendRequestRawResponse(responseInfo, data);
Amit Mahajand423d192017-03-16 17:04:01 -07006528 checkReturnStatus(slotId, retStatus, false);
Amit Mahajan439da362017-02-13 17:43:04 -08006529 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006530 RLOGE("sendRequestRawResponse: oemHookService[%d]->mOemHookResponse == NULL",
Amit Mahajan439da362017-02-13 17:43:04 -08006531 slotId);
6532 }
6533
6534 return 0;
6535}
6536
Amit Mahajan759786a2017-03-03 17:35:47 -08006537int radio::sendRequestStringsResponse(int slotId,
Amit Mahajan439da362017-02-13 17:43:04 -08006538 int responseType, int serial, RIL_Errno e,
6539 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006540#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006541 RLOGD("sendRequestStringsResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006542#endif
Amit Mahajan439da362017-02-13 17:43:04 -08006543
6544 if (oemHookService[slotId]->mOemHookResponse != NULL) {
6545 RadioResponseInfo responseInfo = {};
6546 populateResponseInfo(responseInfo, serial, responseType, e);
6547 hidl_vec<hidl_string> data;
6548
6549 if (response == NULL || responseLen % sizeof(char *) != 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006550 RLOGE("sendRequestStringsResponse Invalid response: NULL");
Amit Mahajan439da362017-02-13 17:43:04 -08006551 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
6552 } else {
6553 char **resp = (char **) response;
6554 int numStrings = responseLen / sizeof(char *);
6555 data.resize(numStrings);
6556 for (int i = 0; i < numStrings; i++) {
6557 data[i] = convertCharPtrToHidlString(resp[i]);
6558 }
6559 }
6560 Return<void> retStatus
6561 = oemHookService[slotId]->mOemHookResponse->sendRequestStringsResponse(
6562 responseInfo, data);
Amit Mahajand423d192017-03-16 17:04:01 -07006563 checkReturnStatus(slotId, retStatus, false);
Amit Mahajan439da362017-02-13 17:43:04 -08006564 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006565 RLOGE("sendRequestStringsResponse: oemHookService[%d]->mOemHookResponse == "
Amit Mahajan439da362017-02-13 17:43:04 -08006566 "NULL", slotId);
6567 }
6568
6569 return 0;
6570}
6571
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006572// Radio Indication functions
6573
Amit Mahajan5829a472016-12-28 17:28:07 -08006574RadioIndicationType convertIntToRadioIndicationType(int indicationType) {
6575 return indicationType == RESPONSE_UNSOLICITED ? (RadioIndicationType::UNSOLICITED) :
6576 (RadioIndicationType::UNSOLICITED_ACK_EXP);
6577}
6578
Amit Mahajan759786a2017-03-03 17:35:47 -08006579int radio::radioStateChangedInd(int slotId,
Amit Mahajan1f652692017-03-01 12:08:46 -08006580 int indicationType, int token, RIL_Errno e, void *response,
6581 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08006582 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan1f652692017-03-01 12:08:46 -08006583 RadioState radioState = (RadioState) s_vendorFunctions->onStateRequest();
Amit Mahajan111ddca2017-03-03 12:05:13 -08006584 RLOGD("radioStateChangedInd: radioState %d", radioState);
Amit Mahajan17249842017-01-19 15:05:45 -08006585 Return<void> retStatus = radioService[slotId]->mRadioIndication->radioStateChanged(
Amit Mahajan1f652692017-03-01 12:08:46 -08006586 convertIntToRadioIndicationType(indicationType), radioState);
Amit Mahajan17249842017-01-19 15:05:45 -08006587 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajancd77a5b2016-08-25 11:19:21 -07006588 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006589 RLOGE("radioStateChangedInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajancd77a5b2016-08-25 11:19:21 -07006590 }
Amit Mahajan1f652692017-03-01 12:08:46 -08006591
6592 return 0;
Amit Mahajancd77a5b2016-08-25 11:19:21 -07006593}
6594
Amit Mahajan759786a2017-03-03 17:35:47 -08006595int radio::callStateChangedInd(int slotId,
Amit Mahajan5829a472016-12-28 17:28:07 -08006596 int indicationType, int token, RIL_Errno e, void *response,
6597 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08006598 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006599#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006600 RLOGD("callStateChangedInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07006601#endif
Amit Mahajan17249842017-01-19 15:05:45 -08006602 Return<void> retStatus = radioService[slotId]->mRadioIndication->callStateChanged(
Amit Mahajan5829a472016-12-28 17:28:07 -08006603 convertIntToRadioIndicationType(indicationType));
Amit Mahajan17249842017-01-19 15:05:45 -08006604 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08006605 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006606 RLOGE("callStateChangedInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08006607 }
6608
6609 return 0;
6610}
6611
Amit Mahajan759786a2017-03-03 17:35:47 -08006612int radio::networkStateChangedInd(int slotId,
Amit Mahajan1f652692017-03-01 12:08:46 -08006613 int indicationType, int token, RIL_Errno e, void *response,
6614 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08006615 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006616#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006617 RLOGD("networkStateChangedInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07006618#endif
Jack Yu06181bb2017-01-10 12:10:41 -08006619 Return<void> retStatus = radioService[slotId]->mRadioIndication->networkStateChanged(
Amit Mahajan5829a472016-12-28 17:28:07 -08006620 convertIntToRadioIndicationType(indicationType));
Amit Mahajan17249842017-01-19 15:05:45 -08006621 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08006622 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006623 RLOGE("networkStateChangedInd: radioService[%d]->mRadioIndication == NULL",
Amit Mahajan2fa9e632017-01-06 16:55:33 -08006624 slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08006625 }
6626
6627 return 0;
6628}
6629
6630uint8_t hexCharToInt(uint8_t c) {
6631 if (c >= '0' && c <= '9') return (c - '0');
6632 if (c >= 'A' && c <= 'F') return (c - 'A' + 10);
6633 if (c >= 'a' && c <= 'f') return (c - 'a' + 10);
6634
6635 return INVALID_HEX_CHAR;
6636}
6637
6638uint8_t * convertHexStringToBytes(void *response, size_t responseLen) {
6639 if (responseLen % 2 != 0) {
6640 return NULL;
6641 }
6642
6643 uint8_t *bytes = (uint8_t *)calloc(responseLen/2, sizeof(uint8_t));
6644 if (bytes == NULL) {
6645 RLOGE("convertHexStringToBytes: cannot allocate memory for bytes string");
6646 return NULL;
6647 }
6648 uint8_t *hexString = (uint8_t *)response;
6649
Wei Wang100ac9b2017-02-03 14:18:07 -08006650 for (size_t i = 0; i < responseLen; i += 2) {
Amit Mahajan5829a472016-12-28 17:28:07 -08006651 uint8_t hexChar1 = hexCharToInt(hexString[i]);
6652 uint8_t hexChar2 = hexCharToInt(hexString[i + 1]);
6653
6654 if (hexChar1 == INVALID_HEX_CHAR || hexChar2 == INVALID_HEX_CHAR) {
6655 RLOGE("convertHexStringToBytes: invalid hex char %d %d",
6656 hexString[i], hexString[i + 1]);
6657 free(bytes);
6658 return NULL;
6659 }
6660 bytes[i/2] = ((hexChar1 << 4) | hexChar2);
6661 }
6662
6663 return bytes;
6664}
6665
Amit Mahajan759786a2017-03-03 17:35:47 -08006666int radio::newSmsInd(int slotId, int indicationType,
Amit Mahajan5829a472016-12-28 17:28:07 -08006667 int token, RIL_Errno e, void *response, size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08006668 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan5829a472016-12-28 17:28:07 -08006669 if (response == NULL || responseLen == 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006670 RLOGE("newSmsInd: invalid response");
Amit Mahajan5829a472016-12-28 17:28:07 -08006671 return 0;
6672 }
6673
6674 uint8_t *bytes = convertHexStringToBytes(response, responseLen);
6675 if (bytes == NULL) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006676 RLOGE("newSmsInd: convertHexStringToBytes failed");
Amit Mahajan5829a472016-12-28 17:28:07 -08006677 return 0;
6678 }
6679
6680 hidl_vec<uint8_t> pdu;
6681 pdu.setToExternal(bytes, responseLen/2);
Jayachandran C572f2f42017-03-25 14:30:13 -07006682#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006683 RLOGD("newSmsInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07006684#endif
Amit Mahajan17249842017-01-19 15:05:45 -08006685 Return<void> retStatus = radioService[slotId]->mRadioIndication->newSms(
Amit Mahajan5829a472016-12-28 17:28:07 -08006686 convertIntToRadioIndicationType(indicationType), pdu);
Amit Mahajan17249842017-01-19 15:05:45 -08006687 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08006688 free(bytes);
6689 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006690 RLOGE("newSmsInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08006691 }
6692
6693 return 0;
6694}
6695
Amit Mahajan759786a2017-03-03 17:35:47 -08006696int radio::newSmsStatusReportInd(int slotId,
Amit Mahajan5829a472016-12-28 17:28:07 -08006697 int indicationType, int token, RIL_Errno e, void *response,
6698 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08006699 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan5829a472016-12-28 17:28:07 -08006700 if (response == NULL || responseLen == 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006701 RLOGE("newSmsStatusReportInd: invalid response");
Amit Mahajan5829a472016-12-28 17:28:07 -08006702 return 0;
6703 }
6704
6705 uint8_t *bytes = convertHexStringToBytes(response, responseLen);
6706 if (bytes == NULL) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006707 RLOGE("newSmsStatusReportInd: convertHexStringToBytes failed");
Amit Mahajan5829a472016-12-28 17:28:07 -08006708 return 0;
6709 }
6710
6711 hidl_vec<uint8_t> pdu;
6712 pdu.setToExternal(bytes, responseLen/2);
Jayachandran C572f2f42017-03-25 14:30:13 -07006713#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006714 RLOGD("newSmsStatusReportInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07006715#endif
Amit Mahajan17249842017-01-19 15:05:45 -08006716 Return<void> retStatus = radioService[slotId]->mRadioIndication->newSmsStatusReport(
Amit Mahajan5829a472016-12-28 17:28:07 -08006717 convertIntToRadioIndicationType(indicationType), pdu);
Amit Mahajan17249842017-01-19 15:05:45 -08006718 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08006719 free(bytes);
6720 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006721 RLOGE("newSmsStatusReportInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08006722 }
6723
6724 return 0;
6725}
6726
Amit Mahajan759786a2017-03-03 17:35:47 -08006727int radio::newSmsOnSimInd(int slotId, int indicationType,
Amit Mahajan5829a472016-12-28 17:28:07 -08006728 int token, RIL_Errno e, void *response, size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08006729 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan5829a472016-12-28 17:28:07 -08006730 if (response == NULL || responseLen != sizeof(int)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006731 RLOGE("newSmsOnSimInd: invalid response");
Amit Mahajan5829a472016-12-28 17:28:07 -08006732 return 0;
6733 }
6734 int32_t recordNumber = ((int32_t *) response)[0];
Jayachandran C572f2f42017-03-25 14:30:13 -07006735#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006736 RLOGD("newSmsOnSimInd: slotIndex %d", recordNumber);
Jayachandran C572f2f42017-03-25 14:30:13 -07006737#endif
Amit Mahajan17249842017-01-19 15:05:45 -08006738 Return<void> retStatus = radioService[slotId]->mRadioIndication->newSmsOnSim(
Amit Mahajan5829a472016-12-28 17:28:07 -08006739 convertIntToRadioIndicationType(indicationType), recordNumber);
Amit Mahajan17249842017-01-19 15:05:45 -08006740 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08006741 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006742 RLOGE("newSmsOnSimInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08006743 }
6744
6745 return 0;
6746}
6747
Amit Mahajan759786a2017-03-03 17:35:47 -08006748int radio::onUssdInd(int slotId, int indicationType,
Amit Mahajan5829a472016-12-28 17:28:07 -08006749 int token, RIL_Errno e, void *response, size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08006750 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan5829a472016-12-28 17:28:07 -08006751 if (response == NULL || responseLen != 2 * sizeof(char *)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006752 RLOGE("onUssdInd: invalid response");
Amit Mahajan5829a472016-12-28 17:28:07 -08006753 return 0;
6754 }
6755 char **strings = (char **) response;
6756 char *mode = strings[0];
6757 hidl_string msg = convertCharPtrToHidlString(strings[1]);
6758 UssdModeType modeType = (UssdModeType) atoi(mode);
Jayachandran C572f2f42017-03-25 14:30:13 -07006759#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006760 RLOGD("onUssdInd: mode %s", mode);
Jayachandran C572f2f42017-03-25 14:30:13 -07006761#endif
Amit Mahajan17249842017-01-19 15:05:45 -08006762 Return<void> retStatus = radioService[slotId]->mRadioIndication->onUssd(
Amit Mahajan5829a472016-12-28 17:28:07 -08006763 convertIntToRadioIndicationType(indicationType), modeType, msg);
Amit Mahajan17249842017-01-19 15:05:45 -08006764 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08006765 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006766 RLOGE("onUssdInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08006767 }
6768
6769 return 0;
6770}
6771
Amit Mahajan759786a2017-03-03 17:35:47 -08006772int radio::nitzTimeReceivedInd(int slotId,
Amit Mahajan5829a472016-12-28 17:28:07 -08006773 int indicationType, int token, RIL_Errno e, void *response,
6774 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08006775 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan5829a472016-12-28 17:28:07 -08006776 if (response == NULL || responseLen == 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006777 RLOGE("nitzTimeReceivedInd: invalid response");
Amit Mahajan5829a472016-12-28 17:28:07 -08006778 return 0;
6779 }
6780 hidl_string nitzTime = convertCharPtrToHidlString((char *) response);
6781 int64_t timeReceived = android::elapsedRealtime();
Jayachandran C572f2f42017-03-25 14:30:13 -07006782#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006783 RLOGD("nitzTimeReceivedInd: nitzTime %s receivedTime %" PRId64, nitzTime.c_str(),
Amit Mahajan2fa9e632017-01-06 16:55:33 -08006784 timeReceived);
Jayachandran C572f2f42017-03-25 14:30:13 -07006785#endif
Amit Mahajan17249842017-01-19 15:05:45 -08006786 Return<void> retStatus = radioService[slotId]->mRadioIndication->nitzTimeReceived(
Amit Mahajan5829a472016-12-28 17:28:07 -08006787 convertIntToRadioIndicationType(indicationType), nitzTime, timeReceived);
Amit Mahajan17249842017-01-19 15:05:45 -08006788 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08006789 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006790 RLOGE("nitzTimeReceivedInd: radioService[%d]->mRadioIndication == NULL", slotId);
Weilun Dud2c30932017-02-09 12:32:42 -08006791 return -1;
Amit Mahajan5829a472016-12-28 17:28:07 -08006792 }
6793
6794 return 0;
6795}
6796
Amit Mahajan2fa9e632017-01-06 16:55:33 -08006797void convertRilSignalStrengthToHal(void *response, size_t responseLen,
6798 SignalStrength& signalStrength) {
6799 RIL_SignalStrength_v10 *rilSignalStrength = (RIL_SignalStrength_v10 *) response;
6800
6801 // Fixup LTE for backwards compatibility
6802 // signalStrength: -1 -> 99
6803 if (rilSignalStrength->LTE_SignalStrength.signalStrength == -1) {
6804 rilSignalStrength->LTE_SignalStrength.signalStrength = 99;
6805 }
6806 // rsrp: -1 -> INT_MAX all other negative value to positive.
6807 // So remap here
6808 if (rilSignalStrength->LTE_SignalStrength.rsrp == -1) {
6809 rilSignalStrength->LTE_SignalStrength.rsrp = INT_MAX;
6810 } else if (rilSignalStrength->LTE_SignalStrength.rsrp < -1) {
6811 rilSignalStrength->LTE_SignalStrength.rsrp = -rilSignalStrength->LTE_SignalStrength.rsrp;
6812 }
6813 // rsrq: -1 -> INT_MAX
6814 if (rilSignalStrength->LTE_SignalStrength.rsrq == -1) {
6815 rilSignalStrength->LTE_SignalStrength.rsrq = INT_MAX;
6816 }
6817 // Not remapping rssnr is already using INT_MAX
6818 // cqi: -1 -> INT_MAX
6819 if (rilSignalStrength->LTE_SignalStrength.cqi == -1) {
6820 rilSignalStrength->LTE_SignalStrength.cqi = INT_MAX;
6821 }
6822
6823 signalStrength.gw.signalStrength = rilSignalStrength->GW_SignalStrength.signalStrength;
6824 signalStrength.gw.bitErrorRate = rilSignalStrength->GW_SignalStrength.bitErrorRate;
6825 signalStrength.cdma.dbm = rilSignalStrength->CDMA_SignalStrength.dbm;
6826 signalStrength.cdma.ecio = rilSignalStrength->CDMA_SignalStrength.ecio;
6827 signalStrength.evdo.dbm = rilSignalStrength->EVDO_SignalStrength.dbm;
6828 signalStrength.evdo.ecio = rilSignalStrength->EVDO_SignalStrength.ecio;
6829 signalStrength.evdo.signalNoiseRatio =
6830 rilSignalStrength->EVDO_SignalStrength.signalNoiseRatio;
6831 signalStrength.lte.signalStrength = rilSignalStrength->LTE_SignalStrength.signalStrength;
6832 signalStrength.lte.rsrp = rilSignalStrength->LTE_SignalStrength.rsrp;
6833 signalStrength.lte.rsrq = rilSignalStrength->LTE_SignalStrength.rsrq;
6834 signalStrength.lte.rssnr = rilSignalStrength->LTE_SignalStrength.rssnr;
6835 signalStrength.lte.cqi = rilSignalStrength->LTE_SignalStrength.cqi;
6836 signalStrength.lte.timingAdvance = rilSignalStrength->LTE_SignalStrength.timingAdvance;
6837 signalStrength.tdScdma.rscp = rilSignalStrength->TD_SCDMA_SignalStrength.rscp;
6838}
6839
Amit Mahajan759786a2017-03-03 17:35:47 -08006840int radio::currentSignalStrengthInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08006841 int indicationType, int token, RIL_Errno e,
6842 void *response, size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08006843 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan2fa9e632017-01-06 16:55:33 -08006844 if (response == NULL || responseLen != sizeof(RIL_SignalStrength_v10)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006845 RLOGE("currentSignalStrengthInd: invalid response");
Amit Mahajan2fa9e632017-01-06 16:55:33 -08006846 return 0;
6847 }
6848
Jack Yuf68e0da2017-02-07 14:53:09 -08006849 SignalStrength signalStrength = {};
Amit Mahajan2fa9e632017-01-06 16:55:33 -08006850 convertRilSignalStrengthToHal(response, responseLen, signalStrength);
6851
Jayachandran C572f2f42017-03-25 14:30:13 -07006852#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006853 RLOGD("currentSignalStrengthInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07006854#endif
Amit Mahajan17249842017-01-19 15:05:45 -08006855 Return<void> retStatus = radioService[slotId]->mRadioIndication->currentSignalStrength(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08006856 convertIntToRadioIndicationType(indicationType), signalStrength);
Amit Mahajan17249842017-01-19 15:05:45 -08006857 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08006858 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006859 RLOGE("currentSignalStrengthInd: radioService[%d]->mRadioIndication == NULL",
Amit Mahajan2fa9e632017-01-06 16:55:33 -08006860 slotId);
6861 }
6862
6863 return 0;
6864}
6865
Amit Mahajan5829a472016-12-28 17:28:07 -08006866void convertRilDataCallToHal(RIL_Data_Call_Response_v11 *dcResponse,
6867 SetupDataCallResult& dcResult) {
Jack Yu5079e182017-02-28 15:21:18 -08006868 dcResult.status = (DataCallFailCause) dcResponse->status;
Amit Mahajan5829a472016-12-28 17:28:07 -08006869 dcResult.suggestedRetryTime = dcResponse->suggestedRetryTime;
6870 dcResult.cid = dcResponse->cid;
6871 dcResult.active = dcResponse->active;
6872 dcResult.type = convertCharPtrToHidlString(dcResponse->type);
6873 dcResult.ifname = convertCharPtrToHidlString(dcResponse->ifname);
6874 dcResult.addresses = convertCharPtrToHidlString(dcResponse->addresses);
6875 dcResult.dnses = convertCharPtrToHidlString(dcResponse->dnses);
6876 dcResult.gateways = convertCharPtrToHidlString(dcResponse->gateways);
6877 dcResult.pcscf = convertCharPtrToHidlString(dcResponse->pcscf);
6878 dcResult.mtu = dcResponse->mtu;
6879}
6880
6881void convertRilDataCallListToHal(void *response, size_t responseLen,
6882 hidl_vec<SetupDataCallResult>& dcResultList) {
6883 int num = responseLen / sizeof(RIL_Data_Call_Response_v11);
6884
6885 RIL_Data_Call_Response_v11 *dcResponse = (RIL_Data_Call_Response_v11 *) response;
6886 dcResultList.resize(num);
6887 for (int i = 0; i < num; i++) {
6888 convertRilDataCallToHal(&dcResponse[i], dcResultList[i]);
6889 }
6890}
6891
Amit Mahajan759786a2017-03-03 17:35:47 -08006892int radio::dataCallListChangedInd(int slotId,
Amit Mahajan5829a472016-12-28 17:28:07 -08006893 int indicationType, int token, RIL_Errno e, void *response,
6894 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08006895 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan5829a472016-12-28 17:28:07 -08006896 if (response == NULL || responseLen % sizeof(RIL_Data_Call_Response_v11) != 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006897 RLOGE("dataCallListChangedInd: invalid response");
Amit Mahajan5829a472016-12-28 17:28:07 -08006898 return 0;
6899 }
6900 hidl_vec<SetupDataCallResult> dcList;
6901 convertRilDataCallListToHal(response, responseLen, dcList);
Jayachandran C572f2f42017-03-25 14:30:13 -07006902#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006903 RLOGD("dataCallListChangedInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07006904#endif
Amit Mahajan17249842017-01-19 15:05:45 -08006905 Return<void> retStatus = radioService[slotId]->mRadioIndication->dataCallListChanged(
Amit Mahajan5829a472016-12-28 17:28:07 -08006906 convertIntToRadioIndicationType(indicationType), dcList);
Amit Mahajan17249842017-01-19 15:05:45 -08006907 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08006908 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006909 RLOGE("dataCallListChangedInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08006910 }
6911
6912 return 0;
6913}
6914
Amit Mahajan759786a2017-03-03 17:35:47 -08006915int radio::suppSvcNotifyInd(int slotId, int indicationType,
Amit Mahajan5829a472016-12-28 17:28:07 -08006916 int token, RIL_Errno e, void *response, size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08006917 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan5829a472016-12-28 17:28:07 -08006918 if (response == NULL || responseLen != sizeof(RIL_SuppSvcNotification)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006919 RLOGE("suppSvcNotifyInd: invalid response");
Amit Mahajan5829a472016-12-28 17:28:07 -08006920 return 0;
6921 }
6922
Jack Yuf68e0da2017-02-07 14:53:09 -08006923 SuppSvcNotification suppSvc = {};
Amit Mahajan5829a472016-12-28 17:28:07 -08006924 RIL_SuppSvcNotification *ssn = (RIL_SuppSvcNotification *) response;
6925 suppSvc.isMT = ssn->notificationType;
6926 suppSvc.code = ssn->code;
6927 suppSvc.index = ssn->index;
6928 suppSvc.type = ssn->type;
6929 suppSvc.number = convertCharPtrToHidlString(ssn->number);
6930
Jayachandran C572f2f42017-03-25 14:30:13 -07006931#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006932 RLOGD("suppSvcNotifyInd: isMT %d code %d index %d type %d",
Amit Mahajan5829a472016-12-28 17:28:07 -08006933 suppSvc.isMT, suppSvc.code, suppSvc.index, suppSvc.type);
Jayachandran C572f2f42017-03-25 14:30:13 -07006934#endif
Amit Mahajan17249842017-01-19 15:05:45 -08006935 Return<void> retStatus = radioService[slotId]->mRadioIndication->suppSvcNotify(
Amit Mahajan5829a472016-12-28 17:28:07 -08006936 convertIntToRadioIndicationType(indicationType), suppSvc);
Amit Mahajan17249842017-01-19 15:05:45 -08006937 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08006938 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006939 RLOGE("suppSvcNotifyInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08006940 }
6941
6942 return 0;
6943}
6944
Amit Mahajan759786a2017-03-03 17:35:47 -08006945int radio::stkSessionEndInd(int slotId, int indicationType,
Amit Mahajan5829a472016-12-28 17:28:07 -08006946 int token, RIL_Errno e, void *response, size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08006947 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006948#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006949 RLOGD("stkSessionEndInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07006950#endif
Amit Mahajan17249842017-01-19 15:05:45 -08006951 Return<void> retStatus = radioService[slotId]->mRadioIndication->stkSessionEnd(
Amit Mahajan5829a472016-12-28 17:28:07 -08006952 convertIntToRadioIndicationType(indicationType));
Amit Mahajan17249842017-01-19 15:05:45 -08006953 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08006954 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006955 RLOGE("stkSessionEndInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08006956 }
6957
6958 return 0;
6959}
6960
Amit Mahajan759786a2017-03-03 17:35:47 -08006961int radio::stkProactiveCommandInd(int slotId,
Amit Mahajan5829a472016-12-28 17:28:07 -08006962 int indicationType, int token, RIL_Errno e, void *response,
6963 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08006964 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan5829a472016-12-28 17:28:07 -08006965 if (response == NULL || responseLen == 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006966 RLOGE("stkProactiveCommandInd: invalid response");
Amit Mahajan5829a472016-12-28 17:28:07 -08006967 return 0;
6968 }
Jayachandran C572f2f42017-03-25 14:30:13 -07006969#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006970 RLOGD("stkProactiveCommandInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07006971#endif
Amit Mahajan17249842017-01-19 15:05:45 -08006972 Return<void> retStatus = radioService[slotId]->mRadioIndication->stkProactiveCommand(
Amit Mahajan5829a472016-12-28 17:28:07 -08006973 convertIntToRadioIndicationType(indicationType),
6974 convertCharPtrToHidlString((char *) response));
Amit Mahajan17249842017-01-19 15:05:45 -08006975 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08006976 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006977 RLOGE("stkProactiveCommandInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08006978 }
6979
6980 return 0;
6981}
6982
Amit Mahajan759786a2017-03-03 17:35:47 -08006983int radio::stkEventNotifyInd(int slotId, int indicationType,
Amit Mahajan5829a472016-12-28 17:28:07 -08006984 int token, RIL_Errno e, void *response, size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08006985 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan5829a472016-12-28 17:28:07 -08006986 if (response == NULL || responseLen == 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006987 RLOGE("stkEventNotifyInd: invalid response");
Amit Mahajan5829a472016-12-28 17:28:07 -08006988 return 0;
6989 }
Jayachandran C572f2f42017-03-25 14:30:13 -07006990#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006991 RLOGD("stkEventNotifyInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07006992#endif
Amit Mahajan17249842017-01-19 15:05:45 -08006993 Return<void> retStatus = radioService[slotId]->mRadioIndication->stkEventNotify(
Amit Mahajan5829a472016-12-28 17:28:07 -08006994 convertIntToRadioIndicationType(indicationType),
6995 convertCharPtrToHidlString((char *) response));
Amit Mahajan17249842017-01-19 15:05:45 -08006996 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08006997 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006998 RLOGE("stkEventNotifyInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08006999 }
7000
7001 return 0;
7002}
7003
Amit Mahajan759786a2017-03-03 17:35:47 -08007004int radio::stkCallSetupInd(int slotId, int indicationType,
Amit Mahajan5829a472016-12-28 17:28:07 -08007005 int token, RIL_Errno e, void *response, size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007006 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan5829a472016-12-28 17:28:07 -08007007 if (response == NULL || responseLen != sizeof(int)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007008 RLOGE("stkCallSetupInd: invalid response");
Amit Mahajan5829a472016-12-28 17:28:07 -08007009 return 0;
7010 }
7011 int32_t timeout = ((int32_t *) response)[0];
Jayachandran C572f2f42017-03-25 14:30:13 -07007012#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007013 RLOGD("stkCallSetupInd: timeout %d", timeout);
Jayachandran C572f2f42017-03-25 14:30:13 -07007014#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007015 Return<void> retStatus = radioService[slotId]->mRadioIndication->stkCallSetup(
Amit Mahajan5829a472016-12-28 17:28:07 -08007016 convertIntToRadioIndicationType(indicationType), timeout);
Amit Mahajan17249842017-01-19 15:05:45 -08007017 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08007018 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007019 RLOGE("stkCallSetupInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08007020 }
7021
7022 return 0;
7023}
7024
Amit Mahajan759786a2017-03-03 17:35:47 -08007025int radio::simSmsStorageFullInd(int slotId,
Amit Mahajan5829a472016-12-28 17:28:07 -08007026 int indicationType, int token, RIL_Errno e, void *response,
7027 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007028 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Jayachandran C572f2f42017-03-25 14:30:13 -07007029#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007030 RLOGD("simSmsStorageFullInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07007031#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007032 Return<void> retStatus = radioService[slotId]->mRadioIndication->simSmsStorageFull(
Amit Mahajan5829a472016-12-28 17:28:07 -08007033 convertIntToRadioIndicationType(indicationType));
Amit Mahajan17249842017-01-19 15:05:45 -08007034 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08007035 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007036 RLOGE("simSmsStorageFullInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08007037 }
7038
7039 return 0;
7040}
7041
Amit Mahajan759786a2017-03-03 17:35:47 -08007042int radio::simRefreshInd(int slotId, int indicationType,
Amit Mahajan5829a472016-12-28 17:28:07 -08007043 int token, RIL_Errno e, void *response, size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007044 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan5829a472016-12-28 17:28:07 -08007045 if (response == NULL || responseLen != sizeof(RIL_SimRefreshResponse_v7)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007046 RLOGE("simRefreshInd: invalid response");
Amit Mahajan5829a472016-12-28 17:28:07 -08007047 return 0;
7048 }
7049
Jack Yuf68e0da2017-02-07 14:53:09 -08007050 SimRefreshResult refreshResult = {};
Amit Mahajan5829a472016-12-28 17:28:07 -08007051 RIL_SimRefreshResponse_v7 *simRefreshResponse = ((RIL_SimRefreshResponse_v7 *) response);
7052 refreshResult.type =
7053 (android::hardware::radio::V1_0::SimRefreshType) simRefreshResponse->result;
7054 refreshResult.efId = simRefreshResponse->ef_id;
7055 refreshResult.aid = convertCharPtrToHidlString(simRefreshResponse->aid);
7056
Jayachandran C572f2f42017-03-25 14:30:13 -07007057#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007058 RLOGD("simRefreshInd: type %d efId %d", refreshResult.type, refreshResult.efId);
Jayachandran C572f2f42017-03-25 14:30:13 -07007059#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007060 Return<void> retStatus = radioService[slotId]->mRadioIndication->simRefresh(
Amit Mahajan5829a472016-12-28 17:28:07 -08007061 convertIntToRadioIndicationType(indicationType), refreshResult);
Amit Mahajan17249842017-01-19 15:05:45 -08007062 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08007063 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007064 RLOGE("simRefreshInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08007065 }
7066
7067 return 0;
7068}
7069
7070void convertRilCdmaSignalInfoRecordToHal(RIL_CDMA_SignalInfoRecord *signalInfoRecord,
7071 CdmaSignalInfoRecord& record) {
7072 record.isPresent = signalInfoRecord->isPresent;
7073 record.signalType = signalInfoRecord->signalType;
7074 record.alertPitch = signalInfoRecord->alertPitch;
7075 record.signal = signalInfoRecord->signal;
7076}
7077
Amit Mahajan759786a2017-03-03 17:35:47 -08007078int radio::callRingInd(int slotId, int indicationType,
Amit Mahajan5829a472016-12-28 17:28:07 -08007079 int token, RIL_Errno e, void *response, size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007080 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan5829a472016-12-28 17:28:07 -08007081 bool isGsm;
Jack Yuf68e0da2017-02-07 14:53:09 -08007082 CdmaSignalInfoRecord record = {};
Amit Mahajan5829a472016-12-28 17:28:07 -08007083 if (response == NULL || responseLen == 0) {
7084 isGsm = true;
7085 } else {
7086 isGsm = false;
7087 if (responseLen != sizeof (RIL_CDMA_SignalInfoRecord)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007088 RLOGE("callRingInd: invalid response");
Amit Mahajan5829a472016-12-28 17:28:07 -08007089 return 0;
7090 }
7091 convertRilCdmaSignalInfoRecordToHal((RIL_CDMA_SignalInfoRecord *) response, record);
7092 }
7093
Jayachandran C572f2f42017-03-25 14:30:13 -07007094#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007095 RLOGD("callRingInd: isGsm %d", isGsm);
Jayachandran C572f2f42017-03-25 14:30:13 -07007096#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007097 Return<void> retStatus = radioService[slotId]->mRadioIndication->callRing(
Amit Mahajan5829a472016-12-28 17:28:07 -08007098 convertIntToRadioIndicationType(indicationType), isGsm, record);
Amit Mahajan17249842017-01-19 15:05:45 -08007099 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08007100 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007101 RLOGE("callRingInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08007102 }
7103
7104 return 0;
7105}
7106
Amit Mahajan759786a2017-03-03 17:35:47 -08007107int radio::simStatusChangedInd(int slotId,
Amit Mahajan5829a472016-12-28 17:28:07 -08007108 int indicationType, int token, RIL_Errno e, void *response,
7109 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007110 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Jayachandran C572f2f42017-03-25 14:30:13 -07007111#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007112 RLOGD("simStatusChangedInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07007113#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007114 Return<void> retStatus = radioService[slotId]->mRadioIndication->simStatusChanged(
Amit Mahajan5829a472016-12-28 17:28:07 -08007115 convertIntToRadioIndicationType(indicationType));
Amit Mahajan17249842017-01-19 15:05:45 -08007116 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08007117 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007118 RLOGE("simStatusChangedInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08007119 }
7120
7121 return 0;
7122}
7123
Amit Mahajan759786a2017-03-03 17:35:47 -08007124int radio::cdmaNewSmsInd(int slotId, int indicationType,
Amit Mahajan5829a472016-12-28 17:28:07 -08007125 int token, RIL_Errno e, void *response, size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007126 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan5829a472016-12-28 17:28:07 -08007127 if (response == NULL || responseLen != sizeof(RIL_CDMA_SMS_Message)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007128 RLOGE("cdmaNewSmsInd: invalid response");
Amit Mahajan5829a472016-12-28 17:28:07 -08007129 return 0;
7130 }
7131
Jack Yuf68e0da2017-02-07 14:53:09 -08007132 CdmaSmsMessage msg = {};
Amit Mahajan5829a472016-12-28 17:28:07 -08007133 RIL_CDMA_SMS_Message *rilMsg = (RIL_CDMA_SMS_Message *) response;
7134 msg.teleserviceId = rilMsg->uTeleserviceID;
7135 msg.isServicePresent = rilMsg->bIsServicePresent;
7136 msg.serviceCategory = rilMsg->uServicecategory;
7137 msg.address.digitMode =
7138 (android::hardware::radio::V1_0::CdmaSmsDigitMode) rilMsg->sAddress.digit_mode;
7139 msg.address.numberMode =
7140 (android::hardware::radio::V1_0::CdmaSmsNumberMode) rilMsg->sAddress.number_mode;
7141 msg.address.numberType =
7142 (android::hardware::radio::V1_0::CdmaSmsNumberType) rilMsg->sAddress.number_type;
7143 msg.address.numberPlan =
7144 (android::hardware::radio::V1_0::CdmaSmsNumberPlan) rilMsg->sAddress.number_plan;
7145
7146 int digitLimit = MIN((rilMsg->sAddress.number_of_digits), RIL_CDMA_SMS_ADDRESS_MAX);
7147 msg.address.digits.setToExternal(rilMsg->sAddress.digits, digitLimit);
7148
7149 msg.subAddress.subaddressType = (android::hardware::radio::V1_0::CdmaSmsSubaddressType)
7150 rilMsg->sSubAddress.subaddressType;
7151 msg.subAddress.odd = rilMsg->sSubAddress.odd;
7152
7153 digitLimit= MIN((rilMsg->sSubAddress.number_of_digits), RIL_CDMA_SMS_SUBADDRESS_MAX);
7154 msg.subAddress.digits.setToExternal(rilMsg->sSubAddress.digits, digitLimit);
7155
7156 digitLimit = MIN((rilMsg->uBearerDataLen), RIL_CDMA_SMS_BEARER_DATA_MAX);
7157 msg.bearerData.setToExternal(rilMsg->aBearerData, digitLimit);
7158
Jayachandran C572f2f42017-03-25 14:30:13 -07007159#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007160 RLOGD("cdmaNewSmsInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07007161#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007162 Return<void> retStatus = radioService[slotId]->mRadioIndication->cdmaNewSms(
Amit Mahajan5829a472016-12-28 17:28:07 -08007163 convertIntToRadioIndicationType(indicationType), msg);
Amit Mahajan17249842017-01-19 15:05:45 -08007164 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08007165 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007166 RLOGE("cdmaNewSmsInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08007167 }
7168
7169 return 0;
7170}
7171
Amit Mahajan759786a2017-03-03 17:35:47 -08007172int radio::newBroadcastSmsInd(int slotId,
Amit Mahajan1955c742016-12-29 07:07:54 -08007173 int indicationType, int token, RIL_Errno e, void *response,
7174 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007175 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan1955c742016-12-29 07:07:54 -08007176 if (response == NULL || responseLen == 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007177 RLOGE("newBroadcastSmsInd: invalid response");
Amit Mahajan1955c742016-12-29 07:07:54 -08007178 return 0;
7179 }
7180
7181 hidl_vec<uint8_t> data;
7182 data.setToExternal((uint8_t *) response, responseLen);
Jayachandran C572f2f42017-03-25 14:30:13 -07007183#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007184 RLOGD("newBroadcastSmsInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07007185#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007186 Return<void> retStatus = radioService[slotId]->mRadioIndication->newBroadcastSms(
Amit Mahajan1955c742016-12-29 07:07:54 -08007187 convertIntToRadioIndicationType(indicationType), data);
Amit Mahajan17249842017-01-19 15:05:45 -08007188 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan1955c742016-12-29 07:07:54 -08007189 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007190 RLOGE("newBroadcastSmsInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan1955c742016-12-29 07:07:54 -08007191 }
7192
7193 return 0;
7194}
7195
Amit Mahajan759786a2017-03-03 17:35:47 -08007196int radio::cdmaRuimSmsStorageFullInd(int slotId,
Amit Mahajan1955c742016-12-29 07:07:54 -08007197 int indicationType, int token, RIL_Errno e, void *response,
7198 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007199 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Jayachandran C572f2f42017-03-25 14:30:13 -07007200#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007201 RLOGD("cdmaRuimSmsStorageFullInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07007202#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007203 Return<void> retStatus = radioService[slotId]->mRadioIndication->cdmaRuimSmsStorageFull(
Amit Mahajan1955c742016-12-29 07:07:54 -08007204 convertIntToRadioIndicationType(indicationType));
Amit Mahajan17249842017-01-19 15:05:45 -08007205 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan1955c742016-12-29 07:07:54 -08007206 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007207 RLOGE("cdmaRuimSmsStorageFullInd: radioService[%d]->mRadioIndication == NULL",
Amit Mahajan1955c742016-12-29 07:07:54 -08007208 slotId);
7209 }
7210
7211 return 0;
7212}
7213
Amit Mahajan759786a2017-03-03 17:35:47 -08007214int radio::restrictedStateChangedInd(int slotId,
Amit Mahajan1955c742016-12-29 07:07:54 -08007215 int indicationType, int token, RIL_Errno e, void *response,
7216 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007217 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan1955c742016-12-29 07:07:54 -08007218 if (response == NULL || responseLen != sizeof(int)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007219 RLOGE("restrictedStateChangedInd: invalid response");
Amit Mahajan1955c742016-12-29 07:07:54 -08007220 return 0;
7221 }
7222 int32_t state = ((int32_t *) response)[0];
Jayachandran C572f2f42017-03-25 14:30:13 -07007223#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007224 RLOGD("restrictedStateChangedInd: state %d", state);
Jayachandran C572f2f42017-03-25 14:30:13 -07007225#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007226 Return<void> retStatus = radioService[slotId]->mRadioIndication->restrictedStateChanged(
Amit Mahajan1955c742016-12-29 07:07:54 -08007227 convertIntToRadioIndicationType(indicationType), (PhoneRestrictedState) state);
Amit Mahajan17249842017-01-19 15:05:45 -08007228 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan1955c742016-12-29 07:07:54 -08007229 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007230 RLOGE("restrictedStateChangedInd: radioService[%d]->mRadioIndication == NULL",
Amit Mahajan1955c742016-12-29 07:07:54 -08007231 slotId);
7232 }
7233
7234 return 0;
7235}
7236
Amit Mahajan759786a2017-03-03 17:35:47 -08007237int radio::enterEmergencyCallbackModeInd(int slotId,
Amit Mahajan1955c742016-12-29 07:07:54 -08007238 int indicationType, int token, RIL_Errno e, void *response,
7239 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007240 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Jayachandran C572f2f42017-03-25 14:30:13 -07007241#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007242 RLOGD("enterEmergencyCallbackModeInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07007243#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007244 Return<void> retStatus = radioService[slotId]->mRadioIndication->enterEmergencyCallbackMode(
Amit Mahajan1955c742016-12-29 07:07:54 -08007245 convertIntToRadioIndicationType(indicationType));
Amit Mahajan17249842017-01-19 15:05:45 -08007246 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan1955c742016-12-29 07:07:54 -08007247 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007248 RLOGE("enterEmergencyCallbackModeInd: radioService[%d]->mRadioIndication == NULL",
Amit Mahajan1955c742016-12-29 07:07:54 -08007249 slotId);
7250 }
7251
7252 return 0;
7253}
7254
Amit Mahajan759786a2017-03-03 17:35:47 -08007255int radio::cdmaCallWaitingInd(int slotId,
Amit Mahajan1955c742016-12-29 07:07:54 -08007256 int indicationType, int token, RIL_Errno e, void *response,
7257 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007258 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan1955c742016-12-29 07:07:54 -08007259 if (response == NULL || responseLen != sizeof(RIL_CDMA_CallWaiting_v6)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007260 RLOGE("cdmaCallWaitingInd: invalid response");
Amit Mahajan1955c742016-12-29 07:07:54 -08007261 return 0;
7262 }
7263
Jack Yuf68e0da2017-02-07 14:53:09 -08007264 CdmaCallWaiting callWaitingRecord = {};
Amit Mahajan1955c742016-12-29 07:07:54 -08007265 RIL_CDMA_CallWaiting_v6 *callWaitingRil = ((RIL_CDMA_CallWaiting_v6 *) response);
7266 callWaitingRecord.number = convertCharPtrToHidlString(callWaitingRil->number);
7267 callWaitingRecord.numberPresentation =
7268 (CdmaCallWaitingNumberPresentation) callWaitingRil->numberPresentation;
7269 callWaitingRecord.name = convertCharPtrToHidlString(callWaitingRil->name);
7270 convertRilCdmaSignalInfoRecordToHal(&callWaitingRil->signalInfoRecord,
7271 callWaitingRecord.signalInfoRecord);
7272 callWaitingRecord.numberType = (CdmaCallWaitingNumberType) callWaitingRil->number_type;
7273 callWaitingRecord.numberPlan = (CdmaCallWaitingNumberPlan) callWaitingRil->number_plan;
7274
Jayachandran C572f2f42017-03-25 14:30:13 -07007275#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007276 RLOGD("cdmaCallWaitingInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07007277#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007278 Return<void> retStatus = radioService[slotId]->mRadioIndication->cdmaCallWaiting(
Amit Mahajan1955c742016-12-29 07:07:54 -08007279 convertIntToRadioIndicationType(indicationType), callWaitingRecord);
Amit Mahajan17249842017-01-19 15:05:45 -08007280 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan1955c742016-12-29 07:07:54 -08007281 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007282 RLOGE("cdmaCallWaitingInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan1955c742016-12-29 07:07:54 -08007283 }
7284
7285 return 0;
7286}
7287
Amit Mahajan759786a2017-03-03 17:35:47 -08007288int radio::cdmaOtaProvisionStatusInd(int slotId,
Amit Mahajan1955c742016-12-29 07:07:54 -08007289 int indicationType, int token, RIL_Errno e, void *response,
7290 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007291 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan1955c742016-12-29 07:07:54 -08007292 if (response == NULL || responseLen != sizeof(int)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007293 RLOGE("cdmaOtaProvisionStatusInd: invalid response");
Amit Mahajan1955c742016-12-29 07:07:54 -08007294 return 0;
7295 }
7296 int32_t status = ((int32_t *) response)[0];
Jayachandran C572f2f42017-03-25 14:30:13 -07007297#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007298 RLOGD("cdmaOtaProvisionStatusInd: status %d", status);
Jayachandran C572f2f42017-03-25 14:30:13 -07007299#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007300 Return<void> retStatus = radioService[slotId]->mRadioIndication->cdmaOtaProvisionStatus(
Amit Mahajan1955c742016-12-29 07:07:54 -08007301 convertIntToRadioIndicationType(indicationType), (CdmaOtaProvisionStatus) status);
Amit Mahajan17249842017-01-19 15:05:45 -08007302 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan1955c742016-12-29 07:07:54 -08007303 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007304 RLOGE("cdmaOtaProvisionStatusInd: radioService[%d]->mRadioIndication == NULL",
Amit Mahajan1955c742016-12-29 07:07:54 -08007305 slotId);
7306 }
7307
7308 return 0;
7309}
7310
Amit Mahajan759786a2017-03-03 17:35:47 -08007311int radio::cdmaInfoRecInd(int slotId,
Amit Mahajan1955c742016-12-29 07:07:54 -08007312 int indicationType, int token, RIL_Errno e, void *response,
7313 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007314 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan1955c742016-12-29 07:07:54 -08007315 if (response == NULL || responseLen != sizeof(RIL_CDMA_InformationRecords)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007316 RLOGE("cdmaInfoRecInd: invalid response");
Amit Mahajan1955c742016-12-29 07:07:54 -08007317 return 0;
7318 }
7319
Jack Yuf68e0da2017-02-07 14:53:09 -08007320 CdmaInformationRecords records = {};
Amit Mahajan1955c742016-12-29 07:07:54 -08007321 RIL_CDMA_InformationRecords *recordsRil = (RIL_CDMA_InformationRecords *) response;
7322
7323 char* string8 = NULL;
7324 int num = MIN(recordsRil->numberOfInfoRecs, RIL_CDMA_MAX_NUMBER_OF_INFO_RECS);
7325 if (recordsRil->numberOfInfoRecs > RIL_CDMA_MAX_NUMBER_OF_INFO_RECS) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007326 RLOGE("cdmaInfoRecInd: received %d recs which is more than %d, dropping "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08007327 "additional ones", recordsRil->numberOfInfoRecs,
Amit Mahajan1955c742016-12-29 07:07:54 -08007328 RIL_CDMA_MAX_NUMBER_OF_INFO_RECS);
7329 }
7330 records.infoRec.resize(num);
7331 for (int i = 0 ; i < num ; i++) {
7332 CdmaInformationRecord *record = &records.infoRec[i];
7333 RIL_CDMA_InformationRecord *infoRec = &recordsRil->infoRec[i];
7334 record->name = (CdmaInfoRecName) infoRec->name;
Sanket Padawe378ccdd2017-01-24 14:11:12 -08007335 // All vectors should be size 0 except one which will be size 1. Set everything to
7336 // size 0 initially.
7337 record->display.resize(0);
7338 record->number.resize(0);
7339 record->signal.resize(0);
7340 record->redir.resize(0);
7341 record->lineCtrl.resize(0);
7342 record->clir.resize(0);
7343 record->audioCtrl.resize(0);
Amit Mahajan1955c742016-12-29 07:07:54 -08007344 switch (infoRec->name) {
7345 case RIL_CDMA_DISPLAY_INFO_REC:
7346 case RIL_CDMA_EXTENDED_DISPLAY_INFO_REC: {
7347 if (infoRec->rec.display.alpha_len > CDMA_ALPHA_INFO_BUFFER_LENGTH) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007348 RLOGE("cdmaInfoRecInd: invalid display info response length %d "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08007349 "expected not more than %d", (int) infoRec->rec.display.alpha_len,
Amit Mahajan1955c742016-12-29 07:07:54 -08007350 CDMA_ALPHA_INFO_BUFFER_LENGTH);
7351 return 0;
7352 }
7353 string8 = (char*) malloc((infoRec->rec.display.alpha_len + 1) * sizeof(char));
7354 if (string8 == NULL) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007355 RLOGE("cdmaInfoRecInd: Memory allocation failed for "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08007356 "responseCdmaInformationRecords");
Amit Mahajan1955c742016-12-29 07:07:54 -08007357 return 0;
7358 }
7359 memcpy(string8, infoRec->rec.display.alpha_buf, infoRec->rec.display.alpha_len);
7360 string8[(int)infoRec->rec.display.alpha_len] = '\0';
7361
7362 record->display.resize(1);
7363 record->display[0].alphaBuf = string8;
7364 free(string8);
7365 string8 = NULL;
7366 break;
7367 }
7368
7369 case RIL_CDMA_CALLED_PARTY_NUMBER_INFO_REC:
7370 case RIL_CDMA_CALLING_PARTY_NUMBER_INFO_REC:
7371 case RIL_CDMA_CONNECTED_NUMBER_INFO_REC: {
7372 if (infoRec->rec.number.len > CDMA_NUMBER_INFO_BUFFER_LENGTH) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007373 RLOGE("cdmaInfoRecInd: invalid display info response length %d "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08007374 "expected not more than %d", (int) infoRec->rec.number.len,
Amit Mahajan1955c742016-12-29 07:07:54 -08007375 CDMA_NUMBER_INFO_BUFFER_LENGTH);
7376 return 0;
7377 }
7378 string8 = (char*) malloc((infoRec->rec.number.len + 1) * sizeof(char));
7379 if (string8 == NULL) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007380 RLOGE("cdmaInfoRecInd: Memory allocation failed for "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08007381 "responseCdmaInformationRecords");
Amit Mahajan1955c742016-12-29 07:07:54 -08007382 return 0;
7383 }
7384 memcpy(string8, infoRec->rec.number.buf, infoRec->rec.number.len);
7385 string8[(int)infoRec->rec.number.len] = '\0';
7386
7387 record->number.resize(1);
7388 record->number[0].number = string8;
7389 free(string8);
7390 string8 = NULL;
7391 record->number[0].numberType = infoRec->rec.number.number_type;
7392 record->number[0].numberPlan = infoRec->rec.number.number_plan;
7393 record->number[0].pi = infoRec->rec.number.pi;
7394 record->number[0].si = infoRec->rec.number.si;
7395 break;
7396 }
7397
7398 case RIL_CDMA_SIGNAL_INFO_REC: {
7399 record->signal.resize(1);
7400 record->signal[0].isPresent = infoRec->rec.signal.isPresent;
7401 record->signal[0].signalType = infoRec->rec.signal.signalType;
7402 record->signal[0].alertPitch = infoRec->rec.signal.alertPitch;
7403 record->signal[0].signal = infoRec->rec.signal.signal;
7404 break;
7405 }
7406
7407 case RIL_CDMA_REDIRECTING_NUMBER_INFO_REC: {
7408 if (infoRec->rec.redir.redirectingNumber.len >
7409 CDMA_NUMBER_INFO_BUFFER_LENGTH) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007410 RLOGE("cdmaInfoRecInd: invalid display info response length %d "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08007411 "expected not more than %d\n",
Amit Mahajan1955c742016-12-29 07:07:54 -08007412 (int)infoRec->rec.redir.redirectingNumber.len,
7413 CDMA_NUMBER_INFO_BUFFER_LENGTH);
7414 return 0;
7415 }
7416 string8 = (char*) malloc((infoRec->rec.redir.redirectingNumber.len + 1) *
7417 sizeof(char));
7418 if (string8 == NULL) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007419 RLOGE("cdmaInfoRecInd: Memory allocation failed for "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08007420 "responseCdmaInformationRecords");
Amit Mahajan1955c742016-12-29 07:07:54 -08007421 return 0;
7422 }
7423 memcpy(string8, infoRec->rec.redir.redirectingNumber.buf,
7424 infoRec->rec.redir.redirectingNumber.len);
7425 string8[(int)infoRec->rec.redir.redirectingNumber.len] = '\0';
7426
7427 record->redir.resize(1);
7428 record->redir[0].redirectingNumber.number = string8;
7429 free(string8);
7430 string8 = NULL;
7431 record->redir[0].redirectingNumber.numberType =
7432 infoRec->rec.redir.redirectingNumber.number_type;
7433 record->redir[0].redirectingNumber.numberPlan =
7434 infoRec->rec.redir.redirectingNumber.number_plan;
7435 record->redir[0].redirectingNumber.pi = infoRec->rec.redir.redirectingNumber.pi;
7436 record->redir[0].redirectingNumber.si = infoRec->rec.redir.redirectingNumber.si;
7437 record->redir[0].redirectingReason =
7438 (CdmaRedirectingReason) infoRec->rec.redir.redirectingReason;
7439 break;
7440 }
7441
7442 case RIL_CDMA_LINE_CONTROL_INFO_REC: {
7443 record->lineCtrl.resize(1);
7444 record->lineCtrl[0].lineCtrlPolarityIncluded =
7445 infoRec->rec.lineCtrl.lineCtrlPolarityIncluded;
7446 record->lineCtrl[0].lineCtrlToggle = infoRec->rec.lineCtrl.lineCtrlToggle;
7447 record->lineCtrl[0].lineCtrlReverse = infoRec->rec.lineCtrl.lineCtrlReverse;
7448 record->lineCtrl[0].lineCtrlPowerDenial =
7449 infoRec->rec.lineCtrl.lineCtrlPowerDenial;
7450 break;
7451 }
7452
7453 case RIL_CDMA_T53_CLIR_INFO_REC: {
7454 record->clir.resize(1);
7455 record->clir[0].cause = infoRec->rec.clir.cause;
7456 break;
7457 }
7458
7459 case RIL_CDMA_T53_AUDIO_CONTROL_INFO_REC: {
7460 record->audioCtrl.resize(1);
7461 record->audioCtrl[0].upLink = infoRec->rec.audioCtrl.upLink;
7462 record->audioCtrl[0].downLink = infoRec->rec.audioCtrl.downLink;
7463 break;
7464 }
7465
7466 case RIL_CDMA_T53_RELEASE_INFO_REC:
Amit Mahajan111ddca2017-03-03 12:05:13 -08007467 RLOGE("cdmaInfoRecInd: RIL_CDMA_T53_RELEASE_INFO_REC: INVALID");
Amit Mahajan1955c742016-12-29 07:07:54 -08007468 return 0;
7469
7470 default:
Amit Mahajan111ddca2017-03-03 12:05:13 -08007471 RLOGE("cdmaInfoRecInd: Incorrect name value");
Amit Mahajan1955c742016-12-29 07:07:54 -08007472 return 0;
7473 }
7474 }
7475
Jayachandran C572f2f42017-03-25 14:30:13 -07007476#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007477 RLOGD("cdmaInfoRecInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07007478#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007479 Return<void> retStatus = radioService[slotId]->mRadioIndication->cdmaInfoRec(
Amit Mahajan1955c742016-12-29 07:07:54 -08007480 convertIntToRadioIndicationType(indicationType), records);
Amit Mahajan17249842017-01-19 15:05:45 -08007481 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan1955c742016-12-29 07:07:54 -08007482 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007483 RLOGE("cdmaInfoRecInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan1955c742016-12-29 07:07:54 -08007484 }
7485
7486 return 0;
7487}
7488
Amit Mahajan759786a2017-03-03 17:35:47 -08007489int radio::indicateRingbackToneInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007490 int indicationType, int token, RIL_Errno e, void *response,
7491 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007492 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007493 if (response == NULL || responseLen != sizeof(int)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007494 RLOGE("indicateRingbackToneInd: invalid response");
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007495 return 0;
7496 }
7497 bool start = ((int32_t *) response)[0];
Jayachandran C572f2f42017-03-25 14:30:13 -07007498#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007499 RLOGD("indicateRingbackToneInd: start %d", start);
Jayachandran C572f2f42017-03-25 14:30:13 -07007500#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007501 Return<void> retStatus = radioService[slotId]->mRadioIndication->indicateRingbackTone(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007502 convertIntToRadioIndicationType(indicationType), start);
Amit Mahajan17249842017-01-19 15:05:45 -08007503 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007504 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007505 RLOGE("indicateRingbackToneInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007506 }
7507
7508 return 0;
7509}
7510
Amit Mahajan759786a2017-03-03 17:35:47 -08007511int radio::resendIncallMuteInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007512 int indicationType, int token, RIL_Errno e, void *response,
7513 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007514 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Jayachandran C572f2f42017-03-25 14:30:13 -07007515#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007516 RLOGD("resendIncallMuteInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07007517#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007518 Return<void> retStatus = radioService[slotId]->mRadioIndication->resendIncallMute(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007519 convertIntToRadioIndicationType(indicationType));
Amit Mahajan17249842017-01-19 15:05:45 -08007520 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007521 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007522 RLOGE("resendIncallMuteInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007523 }
7524
7525 return 0;
7526}
7527
Amit Mahajan759786a2017-03-03 17:35:47 -08007528int radio::cdmaSubscriptionSourceChangedInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007529 int indicationType, int token, RIL_Errno e,
7530 void *response, size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007531 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007532 if (response == NULL || responseLen != sizeof(int)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007533 RLOGE("cdmaSubscriptionSourceChangedInd: invalid response");
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007534 return 0;
7535 }
7536 int32_t cdmaSource = ((int32_t *) response)[0];
Jayachandran C572f2f42017-03-25 14:30:13 -07007537#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007538 RLOGD("cdmaSubscriptionSourceChangedInd: cdmaSource %d", cdmaSource);
Jayachandran C572f2f42017-03-25 14:30:13 -07007539#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007540 Return<void> retStatus = radioService[slotId]->mRadioIndication->
7541 cdmaSubscriptionSourceChanged(convertIntToRadioIndicationType(indicationType),
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007542 (CdmaSubscriptionSource) cdmaSource);
Amit Mahajan17249842017-01-19 15:05:45 -08007543 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007544 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007545 RLOGE("cdmaSubscriptionSourceChangedInd: radioService[%d]->mRadioIndication == NULL",
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007546 slotId);
7547 }
7548
7549 return 0;
7550}
7551
Amit Mahajan759786a2017-03-03 17:35:47 -08007552int radio::cdmaPrlChangedInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007553 int indicationType, int token, RIL_Errno e, void *response,
7554 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007555 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007556 if (response == NULL || responseLen != sizeof(int)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007557 RLOGE("cdmaPrlChangedInd: invalid response");
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007558 return 0;
7559 }
7560 int32_t version = ((int32_t *) response)[0];
Jayachandran C572f2f42017-03-25 14:30:13 -07007561#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007562 RLOGD("cdmaPrlChangedInd: version %d", version);
Jayachandran C572f2f42017-03-25 14:30:13 -07007563#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007564 Return<void> retStatus = radioService[slotId]->mRadioIndication->cdmaPrlChanged(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007565 convertIntToRadioIndicationType(indicationType), version);
Amit Mahajan17249842017-01-19 15:05:45 -08007566 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007567 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007568 RLOGE("cdmaPrlChangedInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007569 }
7570
7571 return 0;
7572}
7573
Amit Mahajan759786a2017-03-03 17:35:47 -08007574int radio::exitEmergencyCallbackModeInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007575 int indicationType, int token, RIL_Errno e, void *response,
7576 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007577 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Jayachandran C572f2f42017-03-25 14:30:13 -07007578#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007579 RLOGD("exitEmergencyCallbackModeInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07007580#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007581 Return<void> retStatus = radioService[slotId]->mRadioIndication->exitEmergencyCallbackMode(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007582 convertIntToRadioIndicationType(indicationType));
Amit Mahajan17249842017-01-19 15:05:45 -08007583 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007584 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007585 RLOGE("exitEmergencyCallbackModeInd: radioService[%d]->mRadioIndication == NULL",
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007586 slotId);
7587 }
7588
7589 return 0;
7590}
7591
Amit Mahajan759786a2017-03-03 17:35:47 -08007592int radio::rilConnectedInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007593 int indicationType, int token, RIL_Errno e, void *response,
7594 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007595 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007596 RLOGD("rilConnectedInd");
Amit Mahajan17249842017-01-19 15:05:45 -08007597 Return<void> retStatus = radioService[slotId]->mRadioIndication->rilConnected(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007598 convertIntToRadioIndicationType(indicationType));
Amit Mahajan17249842017-01-19 15:05:45 -08007599 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007600 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007601 RLOGE("rilConnectedInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007602 }
7603
7604 return 0;
7605}
7606
Amit Mahajan759786a2017-03-03 17:35:47 -08007607int radio::voiceRadioTechChangedInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007608 int indicationType, int token, RIL_Errno e, void *response,
7609 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007610 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007611 if (response == NULL || responseLen != sizeof(int)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007612 RLOGE("voiceRadioTechChangedInd: invalid response");
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007613 return 0;
7614 }
7615 int32_t rat = ((int32_t *) response)[0];
Jayachandran C572f2f42017-03-25 14:30:13 -07007616#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007617 RLOGD("voiceRadioTechChangedInd: rat %d", rat);
Jayachandran C572f2f42017-03-25 14:30:13 -07007618#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007619 Return<void> retStatus = radioService[slotId]->mRadioIndication->voiceRadioTechChanged(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007620 convertIntToRadioIndicationType(indicationType), (RadioTechnology) rat);
Amit Mahajan17249842017-01-19 15:05:45 -08007621 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007622 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007623 RLOGE("voiceRadioTechChangedInd: radioService[%d]->mRadioIndication == NULL",
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007624 slotId);
7625 }
7626
7627 return 0;
7628}
7629
7630void convertRilCellInfoListToHal(void *response, size_t responseLen, hidl_vec<CellInfo>& records) {
7631 int num = responseLen / sizeof(RIL_CellInfo_v12);
7632 records.resize(num);
7633
7634 RIL_CellInfo_v12 *rillCellInfo = (RIL_CellInfo_v12 *) response;
7635 for (int i = 0; i < num; i++) {
7636 records[i].cellInfoType = (CellInfoType) rillCellInfo->cellInfoType;
7637 records[i].registered = rillCellInfo->registered;
7638 records[i].timeStampType = (TimeStampType) rillCellInfo->timeStampType;
7639 records[i].timeStamp = rillCellInfo->timeStamp;
Sanket Padawe378ccdd2017-01-24 14:11:12 -08007640 // All vectors should be size 0 except one which will be size 1. Set everything to
7641 // size 0 initially.
7642 records[i].gsm.resize(0);
7643 records[i].wcdma.resize(0);
7644 records[i].cdma.resize(0);
7645 records[i].lte.resize(0);
7646 records[i].tdscdma.resize(0);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007647 switch(rillCellInfo->cellInfoType) {
7648 case RIL_CELL_INFO_TYPE_GSM: {
7649 records[i].gsm.resize(1);
7650 CellInfoGsm *cellInfoGsm = &records[i].gsm[0];
7651 cellInfoGsm->cellIdentityGsm.mcc =
7652 std::to_string(rillCellInfo->CellInfo.gsm.cellIdentityGsm.mcc);
7653 cellInfoGsm->cellIdentityGsm.mnc =
7654 std::to_string(rillCellInfo->CellInfo.gsm.cellIdentityGsm.mnc);
7655 cellInfoGsm->cellIdentityGsm.lac =
7656 rillCellInfo->CellInfo.gsm.cellIdentityGsm.lac;
7657 cellInfoGsm->cellIdentityGsm.cid =
7658 rillCellInfo->CellInfo.gsm.cellIdentityGsm.cid;
7659 cellInfoGsm->cellIdentityGsm.arfcn =
7660 rillCellInfo->CellInfo.gsm.cellIdentityGsm.arfcn;
7661 cellInfoGsm->cellIdentityGsm.bsic =
7662 rillCellInfo->CellInfo.gsm.cellIdentityGsm.bsic;
7663 cellInfoGsm->signalStrengthGsm.signalStrength =
7664 rillCellInfo->CellInfo.gsm.signalStrengthGsm.signalStrength;
7665 cellInfoGsm->signalStrengthGsm.bitErrorRate =
7666 rillCellInfo->CellInfo.gsm.signalStrengthGsm.bitErrorRate;
7667 cellInfoGsm->signalStrengthGsm.timingAdvance =
7668 rillCellInfo->CellInfo.gsm.signalStrengthGsm.timingAdvance;
7669 break;
7670 }
7671
7672 case RIL_CELL_INFO_TYPE_WCDMA: {
7673 records[i].wcdma.resize(1);
7674 CellInfoWcdma *cellInfoWcdma = &records[i].wcdma[0];
7675 cellInfoWcdma->cellIdentityWcdma.mcc =
7676 std::to_string(rillCellInfo->CellInfo.wcdma.cellIdentityWcdma.mcc);
7677 cellInfoWcdma->cellIdentityWcdma.mnc =
7678 std::to_string(rillCellInfo->CellInfo.wcdma.cellIdentityWcdma.mnc);
7679 cellInfoWcdma->cellIdentityWcdma.lac =
7680 rillCellInfo->CellInfo.wcdma.cellIdentityWcdma.lac;
7681 cellInfoWcdma->cellIdentityWcdma.cid =
7682 rillCellInfo->CellInfo.wcdma.cellIdentityWcdma.cid;
7683 cellInfoWcdma->cellIdentityWcdma.psc =
7684 rillCellInfo->CellInfo.wcdma.cellIdentityWcdma.psc;
7685 cellInfoWcdma->cellIdentityWcdma.uarfcn =
7686 rillCellInfo->CellInfo.wcdma.cellIdentityWcdma.uarfcn;
7687 cellInfoWcdma->signalStrengthWcdma.signalStrength =
7688 rillCellInfo->CellInfo.wcdma.signalStrengthWcdma.signalStrength;
7689 cellInfoWcdma->signalStrengthWcdma.bitErrorRate =
7690 rillCellInfo->CellInfo.wcdma.signalStrengthWcdma.bitErrorRate;
7691 break;
7692 }
7693
7694 case RIL_CELL_INFO_TYPE_CDMA: {
7695 records[i].cdma.resize(1);
7696 CellInfoCdma *cellInfoCdma = &records[i].cdma[0];
7697 cellInfoCdma->cellIdentityCdma.networkId =
7698 rillCellInfo->CellInfo.cdma.cellIdentityCdma.networkId;
7699 cellInfoCdma->cellIdentityCdma.systemId =
7700 rillCellInfo->CellInfo.cdma.cellIdentityCdma.systemId;
7701 cellInfoCdma->cellIdentityCdma.baseStationId =
7702 rillCellInfo->CellInfo.cdma.cellIdentityCdma.basestationId;
7703 cellInfoCdma->cellIdentityCdma.longitude =
7704 rillCellInfo->CellInfo.cdma.cellIdentityCdma.longitude;
7705 cellInfoCdma->cellIdentityCdma.latitude =
7706 rillCellInfo->CellInfo.cdma.cellIdentityCdma.latitude;
7707 cellInfoCdma->signalStrengthCdma.dbm =
7708 rillCellInfo->CellInfo.cdma.signalStrengthCdma.dbm;
7709 cellInfoCdma->signalStrengthCdma.ecio =
7710 rillCellInfo->CellInfo.cdma.signalStrengthCdma.ecio;
7711 cellInfoCdma->signalStrengthEvdo.dbm =
7712 rillCellInfo->CellInfo.cdma.signalStrengthEvdo.dbm;
7713 cellInfoCdma->signalStrengthEvdo.ecio =
7714 rillCellInfo->CellInfo.cdma.signalStrengthEvdo.ecio;
7715 cellInfoCdma->signalStrengthEvdo.signalNoiseRatio =
7716 rillCellInfo->CellInfo.cdma.signalStrengthEvdo.signalNoiseRatio;
7717 break;
7718 }
7719
7720 case RIL_CELL_INFO_TYPE_LTE: {
7721 records[i].lte.resize(1);
7722 CellInfoLte *cellInfoLte = &records[i].lte[0];
7723 cellInfoLte->cellIdentityLte.mcc =
7724 std::to_string(rillCellInfo->CellInfo.lte.cellIdentityLte.mcc);
7725 cellInfoLte->cellIdentityLte.mnc =
7726 std::to_string(rillCellInfo->CellInfo.lte.cellIdentityLte.mnc);
7727 cellInfoLte->cellIdentityLte.ci =
7728 rillCellInfo->CellInfo.lte.cellIdentityLte.ci;
7729 cellInfoLte->cellIdentityLte.pci =
7730 rillCellInfo->CellInfo.lte.cellIdentityLte.pci;
7731 cellInfoLte->cellIdentityLte.tac =
7732 rillCellInfo->CellInfo.lte.cellIdentityLte.tac;
7733 cellInfoLte->cellIdentityLte.earfcn =
7734 rillCellInfo->CellInfo.lte.cellIdentityLte.earfcn;
7735 cellInfoLte->signalStrengthLte.signalStrength =
7736 rillCellInfo->CellInfo.lte.signalStrengthLte.signalStrength;
7737 cellInfoLte->signalStrengthLte.rsrp =
7738 rillCellInfo->CellInfo.lte.signalStrengthLte.rsrp;
7739 cellInfoLte->signalStrengthLte.rsrq =
7740 rillCellInfo->CellInfo.lte.signalStrengthLte.rsrq;
7741 cellInfoLte->signalStrengthLte.rssnr =
7742 rillCellInfo->CellInfo.lte.signalStrengthLte.rssnr;
7743 cellInfoLte->signalStrengthLte.cqi =
7744 rillCellInfo->CellInfo.lte.signalStrengthLte.cqi;
7745 cellInfoLte->signalStrengthLte.timingAdvance =
7746 rillCellInfo->CellInfo.lte.signalStrengthLte.timingAdvance;
7747 break;
7748 }
7749
7750 case RIL_CELL_INFO_TYPE_TD_SCDMA: {
7751 records[i].tdscdma.resize(1);
7752 CellInfoTdscdma *cellInfoTdscdma = &records[i].tdscdma[0];
7753 cellInfoTdscdma->cellIdentityTdscdma.mcc =
7754 std::to_string(rillCellInfo->CellInfo.tdscdma.cellIdentityTdscdma.mcc);
7755 cellInfoTdscdma->cellIdentityTdscdma.mnc =
7756 std::to_string(rillCellInfo->CellInfo.tdscdma.cellIdentityTdscdma.mnc);
7757 cellInfoTdscdma->cellIdentityTdscdma.lac =
7758 rillCellInfo->CellInfo.tdscdma.cellIdentityTdscdma.lac;
7759 cellInfoTdscdma->cellIdentityTdscdma.cid =
7760 rillCellInfo->CellInfo.tdscdma.cellIdentityTdscdma.cid;
7761 cellInfoTdscdma->cellIdentityTdscdma.cpid =
7762 rillCellInfo->CellInfo.tdscdma.cellIdentityTdscdma.cpid;
7763 cellInfoTdscdma->signalStrengthTdscdma.rscp =
7764 rillCellInfo->CellInfo.tdscdma.signalStrengthTdscdma.rscp;
7765 break;
7766 }
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08007767 default: {
7768 break;
7769 }
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007770 }
7771 rillCellInfo += 1;
7772 }
7773}
7774
Amit Mahajan759786a2017-03-03 17:35:47 -08007775int radio::cellInfoListInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007776 int indicationType, int token, RIL_Errno e, void *response,
7777 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007778 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007779 if (response == NULL || responseLen % sizeof(RIL_CellInfo_v12) != 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007780 RLOGE("cellInfoListInd: invalid response");
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007781 return 0;
7782 }
7783
7784 hidl_vec<CellInfo> records;
7785 convertRilCellInfoListToHal(response, responseLen, records);
7786
Jayachandran C572f2f42017-03-25 14:30:13 -07007787#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007788 RLOGD("cellInfoListInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07007789#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007790 Return<void> retStatus = radioService[slotId]->mRadioIndication->cellInfoList(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007791 convertIntToRadioIndicationType(indicationType), records);
Amit Mahajan17249842017-01-19 15:05:45 -08007792 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007793 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007794 RLOGE("cellInfoListInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007795 }
7796
7797 return 0;
7798}
7799
Amit Mahajan759786a2017-03-03 17:35:47 -08007800int radio::imsNetworkStateChangedInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007801 int indicationType, int token, RIL_Errno e, void *response,
7802 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007803 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Jayachandran C572f2f42017-03-25 14:30:13 -07007804#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007805 RLOGD("imsNetworkStateChangedInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07007806#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007807 Return<void> retStatus = radioService[slotId]->mRadioIndication->imsNetworkStateChanged(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007808 convertIntToRadioIndicationType(indicationType));
Amit Mahajan17249842017-01-19 15:05:45 -08007809 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007810 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007811 RLOGE("imsNetworkStateChangedInd: radioService[%d]->mRadioIndication == NULL",
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007812 slotId);
7813 }
7814
7815 return 0;
7816}
7817
Amit Mahajan759786a2017-03-03 17:35:47 -08007818int radio::subscriptionStatusChangedInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007819 int indicationType, int token, RIL_Errno e, void *response,
7820 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007821 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007822 if (response == NULL || responseLen != sizeof(int)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007823 RLOGE("subscriptionStatusChangedInd: invalid response");
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007824 return 0;
7825 }
7826 bool activate = ((int32_t *) response)[0];
Jayachandran C572f2f42017-03-25 14:30:13 -07007827#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007828 RLOGD("subscriptionStatusChangedInd: activate %d", activate);
Jayachandran C572f2f42017-03-25 14:30:13 -07007829#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007830 Return<void> retStatus = radioService[slotId]->mRadioIndication->subscriptionStatusChanged(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007831 convertIntToRadioIndicationType(indicationType), activate);
Amit Mahajan17249842017-01-19 15:05:45 -08007832 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007833 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007834 RLOGE("subscriptionStatusChangedInd: radioService[%d]->mRadioIndication == NULL",
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007835 slotId);
7836 }
7837
7838 return 0;
7839}
7840
Amit Mahajan759786a2017-03-03 17:35:47 -08007841int radio::srvccStateNotifyInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007842 int indicationType, int token, RIL_Errno e, void *response,
7843 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007844 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007845 if (response == NULL || responseLen != sizeof(int)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007846 RLOGE("srvccStateNotifyInd: invalid response");
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007847 return 0;
7848 }
7849 int32_t state = ((int32_t *) response)[0];
Jayachandran C572f2f42017-03-25 14:30:13 -07007850#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007851 RLOGD("srvccStateNotifyInd: rat %d", state);
Jayachandran C572f2f42017-03-25 14:30:13 -07007852#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007853 Return<void> retStatus = radioService[slotId]->mRadioIndication->srvccStateNotify(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007854 convertIntToRadioIndicationType(indicationType), (SrvccState) state);
Amit Mahajan17249842017-01-19 15:05:45 -08007855 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007856 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007857 RLOGE("srvccStateNotifyInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007858 }
7859
7860 return 0;
7861}
7862
7863void convertRilHardwareConfigListToHal(void *response, size_t responseLen,
7864 hidl_vec<HardwareConfig>& records) {
7865 int num = responseLen / sizeof(RIL_HardwareConfig);
7866 records.resize(num);
7867
7868 RIL_HardwareConfig *rilHardwareConfig = (RIL_HardwareConfig *) response;
7869 for (int i = 0; i < num; i++) {
7870 records[i].type = (HardwareConfigType) rilHardwareConfig[i].type;
7871 records[i].uuid = convertCharPtrToHidlString(rilHardwareConfig[i].uuid);
7872 records[i].state = (HardwareConfigState) rilHardwareConfig[i].state;
7873 switch (rilHardwareConfig[i].type) {
7874 case RIL_HARDWARE_CONFIG_MODEM: {
7875 records[i].modem.resize(1);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08007876 records[i].sim.resize(0);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007877 HardwareConfigModem *hwConfigModem = &records[i].modem[0];
7878 hwConfigModem->rat = rilHardwareConfig[i].cfg.modem.rat;
7879 hwConfigModem->maxVoice = rilHardwareConfig[i].cfg.modem.maxVoice;
7880 hwConfigModem->maxData = rilHardwareConfig[i].cfg.modem.maxData;
7881 hwConfigModem->maxStandby = rilHardwareConfig[i].cfg.modem.maxStandby;
7882 break;
7883 }
7884
7885 case RIL_HARDWARE_CONFIG_SIM: {
7886 records[i].sim.resize(1);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08007887 records[i].modem.resize(0);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007888 records[i].sim[0].modemUuid =
7889 convertCharPtrToHidlString(rilHardwareConfig[i].cfg.sim.modemUuid);
7890 break;
7891 }
7892 }
7893 }
7894}
7895
Amit Mahajan759786a2017-03-03 17:35:47 -08007896int radio::hardwareConfigChangedInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007897 int indicationType, int token, RIL_Errno e, void *response,
7898 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007899 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007900 if (response == NULL || responseLen % sizeof(RIL_HardwareConfig) != 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007901 RLOGE("hardwareConfigChangedInd: invalid response");
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007902 return 0;
7903 }
7904
7905 hidl_vec<HardwareConfig> configs;
7906 convertRilHardwareConfigListToHal(response, responseLen, configs);
7907
Jayachandran C572f2f42017-03-25 14:30:13 -07007908#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007909 RLOGD("hardwareConfigChangedInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07007910#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007911 Return<void> retStatus = radioService[slotId]->mRadioIndication->hardwareConfigChanged(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007912 convertIntToRadioIndicationType(indicationType), configs);
Amit Mahajan17249842017-01-19 15:05:45 -08007913 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007914 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007915 RLOGE("hardwareConfigChangedInd: radioService[%d]->mRadioIndication == NULL",
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007916 slotId);
7917 }
7918
7919 return 0;
7920}
7921
7922void convertRilRadioCapabilityToHal(void *response, size_t responseLen, RadioCapability& rc) {
7923 RIL_RadioCapability *rilRadioCapability = (RIL_RadioCapability *) response;
7924 rc.session = rilRadioCapability->session;
7925 rc.phase = (android::hardware::radio::V1_0::RadioCapabilityPhase) rilRadioCapability->phase;
7926 rc.raf = rilRadioCapability->rat;
7927 rc.logicalModemUuid = convertCharPtrToHidlString(rilRadioCapability->logicalModemUuid);
7928 rc.status = (android::hardware::radio::V1_0::RadioCapabilityStatus) rilRadioCapability->status;
7929}
7930
Amit Mahajan759786a2017-03-03 17:35:47 -08007931int radio::radioCapabilityIndicationInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007932 int indicationType, int token, RIL_Errno e, void *response,
7933 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007934 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007935 if (response == NULL || responseLen != sizeof(RIL_RadioCapability)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007936 RLOGE("radioCapabilityIndicationInd: invalid response");
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007937 return 0;
7938 }
7939
Jack Yuf68e0da2017-02-07 14:53:09 -08007940 RadioCapability rc = {};
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007941 convertRilRadioCapabilityToHal(response, responseLen, rc);
7942
Jayachandran C572f2f42017-03-25 14:30:13 -07007943#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007944 RLOGD("radioCapabilityIndicationInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07007945#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007946 Return<void> retStatus = radioService[slotId]->mRadioIndication->radioCapabilityIndication(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007947 convertIntToRadioIndicationType(indicationType), rc);
Amit Mahajan17249842017-01-19 15:05:45 -08007948 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007949 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007950 RLOGE("radioCapabilityIndicationInd: radioService[%d]->mRadioIndication == NULL",
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007951 slotId);
7952 }
7953
7954 return 0;
7955}
7956
7957bool isServiceTypeCfQuery(RIL_SsServiceType serType, RIL_SsRequestType reqType) {
7958 if ((reqType == SS_INTERROGATION) &&
7959 (serType == SS_CFU ||
7960 serType == SS_CF_BUSY ||
7961 serType == SS_CF_NO_REPLY ||
7962 serType == SS_CF_NOT_REACHABLE ||
7963 serType == SS_CF_ALL ||
7964 serType == SS_CF_ALL_CONDITIONAL)) {
7965 return true;
7966 }
7967 return false;
7968}
7969
Amit Mahajan759786a2017-03-03 17:35:47 -08007970int radio::onSupplementaryServiceIndicationInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007971 int indicationType, int token, RIL_Errno e,
7972 void *response, size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007973 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007974 if (response == NULL || responseLen != sizeof(RIL_StkCcUnsolSsResponse)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007975 RLOGE("onSupplementaryServiceIndicationInd: invalid response");
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007976 return 0;
7977 }
7978
7979 RIL_StkCcUnsolSsResponse *rilSsResponse = (RIL_StkCcUnsolSsResponse *) response;
Jack Yuf68e0da2017-02-07 14:53:09 -08007980 StkCcUnsolSsResult ss = {};
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007981 ss.serviceType = (SsServiceType) rilSsResponse->serviceType;
7982 ss.requestType = (SsRequestType) rilSsResponse->requestType;
7983 ss.teleserviceType = (SsTeleserviceType) rilSsResponse->teleserviceType;
7984 ss.serviceClass = rilSsResponse->serviceClass;
7985 ss.result = (RadioError) rilSsResponse->result;
7986
7987 if (isServiceTypeCfQuery(rilSsResponse->serviceType, rilSsResponse->requestType)) {
Jayachandran C572f2f42017-03-25 14:30:13 -07007988#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007989 RLOGD("onSupplementaryServiceIndicationInd CF type, num of Cf elements %d",
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007990 rilSsResponse->cfData.numValidIndexes);
Jayachandran C572f2f42017-03-25 14:30:13 -07007991#endif
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007992 if (rilSsResponse->cfData.numValidIndexes > NUM_SERVICE_CLASSES) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007993 RLOGE("onSupplementaryServiceIndicationInd numValidIndexes is greater than "
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007994 "max value %d, truncating it to max value", NUM_SERVICE_CLASSES);
7995 rilSsResponse->cfData.numValidIndexes = NUM_SERVICE_CLASSES;
7996 }
7997
7998 ss.cfData.resize(1);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08007999 ss.ssInfo.resize(0);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008000
8001 /* number of call info's */
8002 ss.cfData[0].cfInfo.resize(rilSsResponse->cfData.numValidIndexes);
8003
8004 for (int i = 0; i < rilSsResponse->cfData.numValidIndexes; i++) {
8005 RIL_CallForwardInfo cf = rilSsResponse->cfData.cfInfo[i];
8006 CallForwardInfo *cfInfo = &ss.cfData[0].cfInfo[i];
8007
8008 cfInfo->status = (CallForwardInfoStatus) cf.status;
8009 cfInfo->reason = cf.reason;
8010 cfInfo->serviceClass = cf.serviceClass;
8011 cfInfo->toa = cf.toa;
8012 cfInfo->number = convertCharPtrToHidlString(cf.number);
8013 cfInfo->timeSeconds = cf.timeSeconds;
Jayachandran C572f2f42017-03-25 14:30:13 -07008014#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08008015 RLOGD("onSupplementaryServiceIndicationInd: "
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008016 "Data: %d,reason=%d,cls=%d,toa=%d,num=%s,tout=%d],", cf.status,
8017 cf.reason, cf.serviceClass, cf.toa, (char*)cf.number, cf.timeSeconds);
Jayachandran C572f2f42017-03-25 14:30:13 -07008018#endif
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008019 }
8020 } else {
8021 ss.ssInfo.resize(1);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08008022 ss.cfData.resize(0);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008023
8024 /* each int */
8025 ss.ssInfo[0].ssInfo.resize(SS_INFO_MAX);
8026 for (int i = 0; i < SS_INFO_MAX; i++) {
Jayachandran C572f2f42017-03-25 14:30:13 -07008027#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08008028 RLOGD("onSupplementaryServiceIndicationInd: Data: %d",
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008029 rilSsResponse->ssInfo[i]);
Jayachandran C572f2f42017-03-25 14:30:13 -07008030#endif
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008031 ss.ssInfo[0].ssInfo[i] = rilSsResponse->ssInfo[i];
8032 }
8033 }
8034
Jayachandran C572f2f42017-03-25 14:30:13 -07008035#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08008036 RLOGD("onSupplementaryServiceIndicationInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07008037#endif
Amit Mahajan17249842017-01-19 15:05:45 -08008038 Return<void> retStatus = radioService[slotId]->mRadioIndication->
8039 onSupplementaryServiceIndication(convertIntToRadioIndicationType(indicationType),
8040 ss);
8041 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008042 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008043 RLOGE("onSupplementaryServiceIndicationInd: "
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008044 "radioService[%d]->mRadioIndication == NULL", slotId);
8045 }
8046
8047 return 0;
8048}
8049
Amit Mahajan759786a2017-03-03 17:35:47 -08008050int radio::stkCallControlAlphaNotifyInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008051 int indicationType, int token, RIL_Errno e, void *response,
8052 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08008053 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008054 if (response == NULL || responseLen == 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008055 RLOGE("stkCallControlAlphaNotifyInd: invalid response");
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008056 return 0;
8057 }
Jayachandran C572f2f42017-03-25 14:30:13 -07008058#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08008059 RLOGD("stkCallControlAlphaNotifyInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07008060#endif
Amit Mahajan17249842017-01-19 15:05:45 -08008061 Return<void> retStatus = radioService[slotId]->mRadioIndication->stkCallControlAlphaNotify(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008062 convertIntToRadioIndicationType(indicationType),
8063 convertCharPtrToHidlString((char *) response));
Amit Mahajan17249842017-01-19 15:05:45 -08008064 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008065 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008066 RLOGE("stkCallControlAlphaNotifyInd: radioService[%d]->mRadioIndication == NULL",
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008067 slotId);
8068 }
8069
8070 return 0;
8071}
8072
8073void convertRilLceDataInfoToHal(void *response, size_t responseLen, LceDataInfo& lce) {
8074 RIL_LceDataInfo *rilLceDataInfo = (RIL_LceDataInfo *)response;
8075 lce.lastHopCapacityKbps = rilLceDataInfo->last_hop_capacity_kbps;
8076 lce.confidenceLevel = rilLceDataInfo->confidence_level;
8077 lce.lceSuspended = rilLceDataInfo->lce_suspended;
8078}
8079
Amit Mahajan759786a2017-03-03 17:35:47 -08008080int radio::lceDataInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008081 int indicationType, int token, RIL_Errno e, void *response,
8082 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08008083 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008084 if (response == NULL || responseLen != sizeof(RIL_LceDataInfo)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008085 RLOGE("lceDataInd: invalid response");
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008086 return 0;
8087 }
8088
Jack Yuf68e0da2017-02-07 14:53:09 -08008089 LceDataInfo lce = {};
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008090 convertRilLceDataInfoToHal(response, responseLen, lce);
Jayachandran C572f2f42017-03-25 14:30:13 -07008091#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08008092 RLOGD("lceDataInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07008093#endif
Amit Mahajan17249842017-01-19 15:05:45 -08008094 Return<void> retStatus = radioService[slotId]->mRadioIndication->lceData(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008095 convertIntToRadioIndicationType(indicationType), lce);
Amit Mahajan17249842017-01-19 15:05:45 -08008096 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008097 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008098 RLOGE("lceDataInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008099 }
8100
8101 return 0;
8102}
8103
Amit Mahajan759786a2017-03-03 17:35:47 -08008104int radio::pcoDataInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008105 int indicationType, int token, RIL_Errno e, void *response,
8106 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08008107 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008108 if (response == NULL || responseLen != sizeof(RIL_PCO_Data)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008109 RLOGE("pcoDataInd: invalid response");
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008110 return 0;
8111 }
8112
Jack Yuf68e0da2017-02-07 14:53:09 -08008113 PcoDataInfo pco = {};
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008114 RIL_PCO_Data *rilPcoData = (RIL_PCO_Data *)response;
8115 pco.cid = rilPcoData->cid;
8116 pco.bearerProto = convertCharPtrToHidlString(rilPcoData->bearer_proto);
8117 pco.pcoId = rilPcoData->pco_id;
8118 pco.contents.setToExternal((uint8_t *) rilPcoData->contents, rilPcoData->contents_length);
8119
Jayachandran C572f2f42017-03-25 14:30:13 -07008120#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08008121 RLOGD("pcoDataInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07008122#endif
Amit Mahajan17249842017-01-19 15:05:45 -08008123 Return<void> retStatus = radioService[slotId]->mRadioIndication->pcoData(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008124 convertIntToRadioIndicationType(indicationType), pco);
Amit Mahajan17249842017-01-19 15:05:45 -08008125 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008126 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008127 RLOGE("pcoDataInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008128 }
8129
8130 return 0;
8131}
8132
Amit Mahajan759786a2017-03-03 17:35:47 -08008133int radio::modemResetInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008134 int indicationType, int token, RIL_Errno e, void *response,
8135 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08008136 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008137 if (response == NULL || responseLen == 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008138 RLOGE("modemResetInd: invalid response");
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008139 return 0;
8140 }
Jayachandran C572f2f42017-03-25 14:30:13 -07008141#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08008142 RLOGD("modemResetInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07008143#endif
Amit Mahajan17249842017-01-19 15:05:45 -08008144 Return<void> retStatus = radioService[slotId]->mRadioIndication->modemReset(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008145 convertIntToRadioIndicationType(indicationType),
8146 convertCharPtrToHidlString((char *) response));
Amit Mahajan17249842017-01-19 15:05:45 -08008147 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008148 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008149 RLOGE("modemResetInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008150 }
8151
8152 return 0;
8153}
8154
yinxu584379e2017-05-03 15:15:19 -07008155int radio::networkScanResultInd(int slotId,
8156 int indicationType, int token, RIL_Errno e, void *response,
yinxu8688abd2017-05-22 11:26:45 -07008157 size_t responseLen) {
yinxu584379e2017-05-03 15:15:19 -07008158#if VDBG
8159 RLOGD("networkScanResultInd");
8160#endif
yinxu8688abd2017-05-22 11:26:45 -07008161 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
8162 if (response == NULL || responseLen == 0) {
8163 RLOGE("networkScanResultInd: invalid response");
8164 return 0;
8165 }
8166 RLOGD("networkScanResultInd");
8167
8168#if VDBG
8169 RLOGD("networkScanResultInd");
8170#endif
8171
8172 Return<sp<::android::hardware::radio::V1_1::IRadioIndication>> ret =
8173 ::android::hardware::radio::V1_1::IRadioIndication::castFrom(
8174 radioService[slotId]->mRadioIndication);
8175 if (ret.isOk()) {
8176 RIL_NetworkScanResult *networkScanResult = (RIL_NetworkScanResult *) response;
8177
8178 ::android::hardware::radio::V1_1::NetworkScanResult result;
8179 result.status =
8180 (::android::hardware::radio::V1_1::ScanStatus) networkScanResult->status;
8181 result.error = (RadioError) e;
8182 convertRilCellInfoListToHal(
8183 networkScanResult->network_infos,
8184 networkScanResult->network_infos_length * sizeof(RIL_CellInfo_v12),
8185 result.networkInfos);
8186
8187 sp<::android::hardware::radio::V1_1::IRadioIndication> radioIndicationV1_1 = ret;
8188 Return<void> retStatus = radioIndicationV1_1->networkScanResult(
8189 convertIntToRadioIndicationType(indicationType), result);
8190 radioService[slotId]->checkReturnStatus(retStatus);
8191 } else {
8192 RLOGE("networkScanResultInd: ret.isOk() == false for radioService[%d]", slotId);
8193 }
8194 } else {
8195 RLOGE("networkScanResultInd: radioService[%d]->mRadioIndication == NULL", slotId);
8196 }
yinxu584379e2017-05-03 15:15:19 -07008197 return 0;
8198}
8199
pkanwarc61837e2017-03-17 12:49:34 -07008200int radio::carrierInfoForImsiEncryption(int slotId,
8201 int indicationType, int token, RIL_Errno e, void *response,
8202 size_t responseLen) {
8203 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
8204 if (response == NULL || responseLen == 0) {
8205 RLOGE("carrierInfoForImsiEncryption: invalid response");
8206 return 0;
8207 }
8208 RLOGD("carrierInfoForImsiEncryption");
8209 Return<sp<::android::hardware::radio::V1_1::IRadioIndication>> ret =
8210 ::android::hardware::radio::V1_1::IRadioIndication::castFrom(
8211 radioService[slotId]->mRadioIndication);
8212 if (ret.isOk()) {
8213 sp<::android::hardware::radio::V1_1::IRadioIndication> radioIndicationV1_1 = ret;
8214 Return<void> retStatus = radioIndicationV1_1->carrierInfoForImsiEncryption(
8215 convertIntToRadioIndicationType(indicationType));
8216 radioService[slotId]->checkReturnStatus(retStatus);
8217 } else {
8218 RLOGE("carrierInfoForImsiEncryptionResponse: ret.isOk() == false for radioService[%d]",
8219 slotId);
8220 }
8221 } else {
8222 RLOGE("carrierInfoForImsiEncryption: radioService[%d]->mRadioIndication == NULL", slotId);
8223 }
8224
8225 return 0;
8226}
8227
Amit Mahajan759786a2017-03-03 17:35:47 -08008228int radio::oemHookRawInd(int slotId,
Amit Mahajan439da362017-02-13 17:43:04 -08008229 int indicationType, int token, RIL_Errno e, void *response,
8230 size_t responseLen) {
8231 if (oemHookService[slotId] != NULL && oemHookService[slotId]->mOemHookIndication != NULL) {
8232 if (response == NULL || responseLen == 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008233 RLOGE("oemHookRawInd: invalid response");
Amit Mahajan439da362017-02-13 17:43:04 -08008234 return 0;
8235 }
8236
8237 hidl_vec<uint8_t> data;
8238 data.setToExternal((uint8_t *) response, responseLen);
Jayachandran C572f2f42017-03-25 14:30:13 -07008239#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08008240 RLOGD("oemHookRawInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07008241#endif
Amit Mahajan439da362017-02-13 17:43:04 -08008242 Return<void> retStatus = oemHookService[slotId]->mOemHookIndication->oemHookRaw(
8243 convertIntToRadioIndicationType(indicationType), data);
Amit Mahajand423d192017-03-16 17:04:01 -07008244 checkReturnStatus(slotId, retStatus, false);
Amit Mahajan439da362017-02-13 17:43:04 -08008245 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008246 RLOGE("oemHookRawInd: oemHookService[%d]->mOemHookIndication == NULL", slotId);
Amit Mahajan439da362017-02-13 17:43:04 -08008247 }
8248
8249 return 0;
8250}
8251
Amit Mahajancd77a5b2016-08-25 11:19:21 -07008252void radio::registerService(RIL_RadioFunctions *callbacks, CommandInfo *commands) {
8253 using namespace android::hardware;
8254 int simCount = 1;
Amit Mahajan439da362017-02-13 17:43:04 -08008255 const char *serviceNames[] = {
Amit Mahajan7955c432017-03-28 11:17:55 -07008256 android::RIL_getServiceName()
Amit Mahajancd77a5b2016-08-25 11:19:21 -07008257 #if (SIM_COUNT >= 2)
Amit Mahajan7955c432017-03-28 11:17:55 -07008258 , RIL2_SERVICE_NAME
Amit Mahajancd77a5b2016-08-25 11:19:21 -07008259 #if (SIM_COUNT >= 3)
Amit Mahajan7955c432017-03-28 11:17:55 -07008260 , RIL3_SERVICE_NAME
Amit Mahajancd77a5b2016-08-25 11:19:21 -07008261 #if (SIM_COUNT >= 4)
Amit Mahajan7955c432017-03-28 11:17:55 -07008262 , RIL4_SERVICE_NAME
Amit Mahajan439da362017-02-13 17:43:04 -08008263 #endif
8264 #endif
8265 #endif
8266 };
8267
Amit Mahajancd77a5b2016-08-25 11:19:21 -07008268 #if (SIM_COUNT >= 2)
8269 simCount = SIM_COUNT;
8270 #endif
8271
8272 configureRpcThreadpool(1, true /* callerWillJoin */);
8273 for (int i = 0; i < simCount; i++) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08008274 pthread_rwlock_t *radioServiceRwlockPtr = getRadioServiceRwlock(i);
8275 int ret = pthread_rwlock_wrlock(radioServiceRwlockPtr);
8276 assert(ret == 0);
8277
Amit Mahajancd77a5b2016-08-25 11:19:21 -07008278 radioService[i] = new RadioImpl;
Sanket Padawef220dc52017-01-02 23:46:00 -08008279 radioService[i]->mSlotId = i;
Amit Mahajan439da362017-02-13 17:43:04 -08008280 oemHookService[i] = new OemHookImpl;
8281 oemHookService[i]->mSlotId = i;
pkanwarc61837e2017-03-17 12:49:34 -07008282 RLOGD("registerService: starting android::hardware::radio::V1_1::IRadio %s",
8283 serviceNames[i]);
Amit Mahajancd77a5b2016-08-25 11:19:21 -07008284 android::status_t status = radioService[i]->registerAsService(serviceNames[i]);
Amit Mahajan7955c432017-03-28 11:17:55 -07008285 status = oemHookService[i]->registerAsService(serviceNames[i]);
Amit Mahajan932e08e2017-01-24 05:45:02 -08008286
8287 ret = pthread_rwlock_unlock(radioServiceRwlockPtr);
8288 assert(ret == 0);
Amit Mahajancd77a5b2016-08-25 11:19:21 -07008289 }
8290
Sanket Padawe378ccdd2017-01-24 14:11:12 -08008291 s_vendorFunctions = callbacks;
Amit Mahajancd77a5b2016-08-25 11:19:21 -07008292 s_commands = commands;
8293}
8294
8295void rilc_thread_pool() {
8296 joinRpcThreadpool();
Amit Mahajan932e08e2017-01-24 05:45:02 -08008297}
8298
8299pthread_rwlock_t * radio::getRadioServiceRwlock(int slotId) {
8300 pthread_rwlock_t *radioServiceRwlockPtr = &radioServiceRwlock;
8301
8302 #if (SIM_COUNT >= 2)
8303 if (slotId == 2) radioServiceRwlockPtr = &radioServiceRwlock2;
8304 #if (SIM_COUNT >= 3)
8305 if (slotId == 3) radioServiceRwlockPtr = &radioServiceRwlock3;
8306 #if (SIM_COUNT >= 4)
8307 if (slotId == 4) radioServiceRwlockPtr = &radioServiceRwlock4;
8308 #endif
8309 #endif
8310 #endif
8311
8312 return radioServiceRwlockPtr;
Sanket Padawe0de29d12017-02-10 13:19:47 -08008313}