blob: 61f21d8fce245ebdbb92328ec1bf72916acc437d [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,
437 const ::android::hardware::hidl_vec<uint8_t>& carrierKey,
438 const hidl_string& keyIdentifier);
439
Amit Mahajan17249842017-01-19 15:05:45 -0800440 void checkReturnStatus(Return<void>& ret);
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700441};
442
Amit Mahajan439da362017-02-13 17:43:04 -0800443struct OemHookImpl : public IOemHook {
444 int32_t mSlotId;
445 sp<IOemHookResponse> mOemHookResponse;
446 sp<IOemHookIndication> mOemHookIndication;
447
448 Return<void> setResponseFunctions(
449 const ::android::sp<IOemHookResponse>& oemHookResponse,
450 const ::android::sp<IOemHookIndication>& oemHookIndication);
451
452 Return<void> sendRequestRaw(int32_t serial,
453 const ::android::hardware::hidl_vec<uint8_t>& data);
454
455 Return<void> sendRequestStrings(int32_t serial,
456 const ::android::hardware::hidl_vec<::android::hardware::hidl_string>& data);
457};
458
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800459void memsetAndFreeStrings(int numPointers, ...) {
460 va_list ap;
461 va_start(ap, numPointers);
462 for (int i = 0; i < numPointers; i++) {
463 char *ptr = va_arg(ap, char *);
464 if (ptr) {
465#ifdef MEMSET_FREED
Jack Yub4295a42017-04-14 12:51:49 -0700466#define MAX_STRING_LENGTH 4096
467 memset(ptr, 0, strnlen(ptr, MAX_STRING_LENGTH));
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800468#endif
469 free(ptr);
470 }
471 }
472 va_end(ap);
473}
474
Jack Yuffc06452017-02-13 11:21:00 -0800475void sendErrorResponse(RequestInfo *pRI, RIL_Errno err) {
Amit Mahajan759786a2017-03-03 17:35:47 -0800476 pRI->pCI->responseFunction((int) pRI->socket_id,
Jack Yuffc06452017-02-13 11:21:00 -0800477 (int) RadioResponseType::SOLICITED, pRI->token, err, NULL, 0);
478}
479
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800480/**
Jack Yuf68e0da2017-02-07 14:53:09 -0800481 * Copies over src to dest. If memory allocation fails, responseFunction() is called for the
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800482 * request with error RIL_E_NO_MEMORY.
483 * Returns true on success, and false on failure.
484 */
Jack Yuf68e0da2017-02-07 14:53:09 -0800485bool copyHidlStringToRil(char **dest, const hidl_string &src, RequestInfo *pRI) {
486 size_t len = src.size();
487 if (len == 0) {
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800488 *dest = NULL;
489 return true;
490 }
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800491 *dest = (char *) calloc(len + 1, sizeof(char));
492 if (*dest == NULL) {
493 RLOGE("Memory allocation failed for request %s", requestToString(pRI->pCI->requestNumber));
Jack Yuffc06452017-02-13 11:21:00 -0800494 sendErrorResponse(pRI, RIL_E_NO_MEMORY);
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800495 return false;
496 }
Scott Randolphc7213312017-04-03 14:06:40 -0700497 strncpy(*dest, src.c_str(), len + 1);
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800498 return true;
499}
500
501hidl_string convertCharPtrToHidlString(const char *ptr) {
502 hidl_string ret;
503 if (ptr != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -0800504 // TODO: replace this with strnlen
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800505 ret.setToExternal(ptr, strlen(ptr));
506 }
507 return ret;
508}
509
510bool dispatchVoid(int serial, int slotId, int request) {
511 RequestInfo *pRI = android::addRequestToList(serial, slotId, request);
512 if (pRI == NULL) {
513 return false;
514 }
515 s_vendorFunctions->onRequest(request, NULL, 0, pRI);
516 return true;
517}
518
519bool dispatchString(int serial, int slotId, int request, const char * str) {
520 RequestInfo *pRI = android::addRequestToList(serial, slotId, request);
521 if (pRI == NULL) {
522 return false;
523 }
524
525 char *pString;
526 if (!copyHidlStringToRil(&pString, str, pRI)) {
527 return false;
528 }
529
530 s_vendorFunctions->onRequest(request, pString, sizeof(char *), pRI);
531
532 memsetAndFreeStrings(1, pString);
533 return true;
534}
535
536bool dispatchStrings(int serial, int slotId, int request, int countStrings, ...) {
537 RequestInfo *pRI = android::addRequestToList(serial, slotId, request);
538 if (pRI == NULL) {
539 return false;
540 }
541
Sanket Padawef220dc52017-01-02 23:46:00 -0800542 char **pStrings;
Sanket Padawef220dc52017-01-02 23:46:00 -0800543 pStrings = (char **)calloc(countStrings, sizeof(char *));
544 if (pStrings == NULL) {
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800545 RLOGE("Memory allocation failed for request %s", requestToString(request));
Jack Yuffc06452017-02-13 11:21:00 -0800546 sendErrorResponse(pRI, RIL_E_NO_MEMORY);
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800547 return false;
Sanket Padawef220dc52017-01-02 23:46:00 -0800548 }
549 va_list ap;
550 va_start(ap, countStrings);
551 for (int i = 0; i < countStrings; i++) {
552 const char* str = va_arg(ap, const char *);
Jack Yuc13645e2017-04-13 20:55:03 -0700553 if (!copyHidlStringToRil(&pStrings[i], hidl_string(str), pRI)) {
Sanket Padawef220dc52017-01-02 23:46:00 -0800554 va_end(ap);
Sanket Padawef220dc52017-01-02 23:46:00 -0800555 for (int j = 0; j < i; j++) {
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800556 memsetAndFreeStrings(1, pStrings[j]);
Sanket Padawef220dc52017-01-02 23:46:00 -0800557 }
558 free(pStrings);
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800559 return false;
Sanket Padawef220dc52017-01-02 23:46:00 -0800560 }
Sanket Padawef220dc52017-01-02 23:46:00 -0800561 }
562 va_end(ap);
563
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800564 s_vendorFunctions->onRequest(request, pStrings, countStrings * sizeof(char *), pRI);
Sanket Padawef220dc52017-01-02 23:46:00 -0800565
566 if (pStrings != NULL) {
567 for (int i = 0 ; i < countStrings ; i++) {
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800568 memsetAndFreeStrings(1, pStrings[i]);
Sanket Padawef220dc52017-01-02 23:46:00 -0800569 }
570
571#ifdef MEMSET_FREED
572 memset(pStrings, 0, countStrings * sizeof(char *));
573#endif
574 free(pStrings);
575 }
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800576 return true;
577}
578
579bool dispatchStrings(int serial, int slotId, int request, const hidl_vec<hidl_string>& data) {
580 RequestInfo *pRI = android::addRequestToList(serial, slotId, request);
581 if (pRI == NULL) {
582 return false;
583 }
584
585 int countStrings = data.size();
586 char **pStrings;
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800587 pStrings = (char **)calloc(countStrings, sizeof(char *));
588 if (pStrings == NULL) {
589 RLOGE("Memory allocation failed for request %s", requestToString(request));
Jack Yuffc06452017-02-13 11:21:00 -0800590 sendErrorResponse(pRI, RIL_E_NO_MEMORY);
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800591 return false;
592 }
593
594 for (int i = 0; i < countStrings; i++) {
Jack Yuf68e0da2017-02-07 14:53:09 -0800595 if (!copyHidlStringToRil(&pStrings[i], data[i], pRI)) {
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800596 for (int j = 0; j < i; j++) {
597 memsetAndFreeStrings(1, pStrings[j]);
598 }
599 free(pStrings);
600 return false;
601 }
602 }
603
604 s_vendorFunctions->onRequest(request, pStrings, countStrings * sizeof(char *), pRI);
605
606 if (pStrings != NULL) {
607 for (int i = 0 ; i < countStrings ; i++) {
608 memsetAndFreeStrings(1, pStrings[i]);
609 }
610
611#ifdef MEMSET_FREED
612 memset(pStrings, 0, countStrings * sizeof(char *));
613#endif
614 free(pStrings);
615 }
616 return true;
617}
618
619bool dispatchInts(int serial, int slotId, int request, int countInts, ...) {
620 RequestInfo *pRI = android::addRequestToList(serial, slotId, request);
621 if (pRI == NULL) {
622 return false;
623 }
624
Jack Yuffc06452017-02-13 11:21:00 -0800625 int *pInts = (int *)calloc(countInts, sizeof(int));
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800626
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800627 if (pInts == NULL) {
628 RLOGE("Memory allocation failed for request %s", requestToString(request));
Jack Yuffc06452017-02-13 11:21:00 -0800629 sendErrorResponse(pRI, RIL_E_NO_MEMORY);
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800630 return false;
631 }
632 va_list ap;
633 va_start(ap, countInts);
634 for (int i = 0; i < countInts; i++) {
635 pInts[i] = va_arg(ap, int);
636 }
637 va_end(ap);
638
639 s_vendorFunctions->onRequest(request, pInts, countInts * sizeof(int), pRI);
640
641 if (pInts != NULL) {
642#ifdef MEMSET_FREED
643 memset(pInts, 0, countInts * sizeof(int));
644#endif
645 free(pInts);
646 }
647 return true;
648}
649
650bool dispatchCallForwardStatus(int serial, int slotId, int request,
651 const CallForwardInfo& callInfo) {
652 RequestInfo *pRI = android::addRequestToList(serial, slotId, request);
653 if (pRI == NULL) {
654 return false;
655 }
656
657 RIL_CallForwardInfo cf;
658 cf.status = (int) callInfo.status;
659 cf.reason = callInfo.reason;
660 cf.serviceClass = callInfo.serviceClass;
661 cf.toa = callInfo.toa;
662 cf.timeSeconds = callInfo.timeSeconds;
663
664 if (!copyHidlStringToRil(&cf.number, callInfo.number, pRI)) {
665 return false;
666 }
667
668 s_vendorFunctions->onRequest(request, &cf, sizeof(cf), pRI);
669
670 memsetAndFreeStrings(1, cf.number);
671
672 return true;
673}
674
675bool dispatchRaw(int serial, int slotId, int request, const hidl_vec<uint8_t>& rawBytes) {
676 RequestInfo *pRI = android::addRequestToList(serial, slotId, request);
677 if (pRI == NULL) {
678 return false;
679 }
680
681 const uint8_t *uData = rawBytes.data();
682
683 s_vendorFunctions->onRequest(request, (void *) uData, rawBytes.size(), pRI);
684
685 return true;
686}
687
688bool dispatchIccApdu(int serial, int slotId, int request, const SimApdu& message) {
689 RequestInfo *pRI = android::addRequestToList(serial, slotId, request);
690 if (pRI == NULL) {
691 return false;
692 }
693
Jack Yu8e732d42017-04-14 00:08:06 -0700694 RIL_SIM_APDU apdu = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800695
696 apdu.sessionid = message.sessionId;
697 apdu.cla = message.cla;
698 apdu.instruction = message.instruction;
699 apdu.p1 = message.p1;
700 apdu.p2 = message.p2;
701 apdu.p3 = message.p3;
702
703 if (!copyHidlStringToRil(&apdu.data, message.data, pRI)) {
704 return false;
705 }
706
707 s_vendorFunctions->onRequest(request, &apdu, sizeof(apdu), pRI);
708
709 memsetAndFreeStrings(1, apdu.data);
710
711 return true;
Sanket Padawef220dc52017-01-02 23:46:00 -0800712}
713
Amit Mahajand423d192017-03-16 17:04:01 -0700714void checkReturnStatus(int32_t slotId, Return<void>& ret, bool isRadioService) {
Amit Mahajan17249842017-01-19 15:05:45 -0800715 if (ret.isOk() == false) {
Amit Mahajan439da362017-02-13 17:43:04 -0800716 RLOGE("checkReturnStatus: unable to call response/indication callback");
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800717 // Remote process hosting the callbacks must be dead. Reset the callback objects;
Amit Mahajan17249842017-01-19 15:05:45 -0800718 // there's no other recovery to be done here. When the client process is back up, it will
719 // call setResponseFunctions()
Amit Mahajan932e08e2017-01-24 05:45:02 -0800720
721 // Caller should already hold rdlock, release that first
722 // note the current counter to avoid overwriting updates made by another thread before
723 // write lock is acquired.
Amit Mahajand423d192017-03-16 17:04:01 -0700724 int counter = isRadioService ? mCounterRadio[slotId] : mCounterOemHook[slotId];
Amit Mahajan439da362017-02-13 17:43:04 -0800725 pthread_rwlock_t *radioServiceRwlockPtr = radio::getRadioServiceRwlock(slotId);
Amit Mahajan932e08e2017-01-24 05:45:02 -0800726 int ret = pthread_rwlock_unlock(radioServiceRwlockPtr);
727 assert(ret == 0);
728
729 // acquire wrlock
730 ret = pthread_rwlock_wrlock(radioServiceRwlockPtr);
731 assert(ret == 0);
732
733 // make sure the counter value has not changed
Amit Mahajand423d192017-03-16 17:04:01 -0700734 if (counter == (isRadioService ? mCounterRadio[slotId] : mCounterOemHook[slotId])) {
735 if (isRadioService) {
736 radioService[slotId]->mRadioResponse = NULL;
737 radioService[slotId]->mRadioIndication = NULL;
738 } else {
739 oemHookService[slotId]->mOemHookResponse = NULL;
740 oemHookService[slotId]->mOemHookIndication = NULL;
741 }
742 isRadioService ? mCounterRadio[slotId]++ : mCounterOemHook[slotId]++;
Amit Mahajan932e08e2017-01-24 05:45:02 -0800743 } else {
Amit Mahajan439da362017-02-13 17:43:04 -0800744 RLOGE("checkReturnStatus: not resetting responseFunctions as they likely "
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800745 "got updated on another thread");
Amit Mahajan932e08e2017-01-24 05:45:02 -0800746 }
747
748 // release wrlock
749 ret = pthread_rwlock_unlock(radioServiceRwlockPtr);
750 assert(ret == 0);
751
752 // Reacquire rdlock
753 ret = pthread_rwlock_rdlock(radioServiceRwlockPtr);
754 assert(ret == 0);
Amit Mahajan17249842017-01-19 15:05:45 -0800755 }
756}
757
Amit Mahajan439da362017-02-13 17:43:04 -0800758void RadioImpl::checkReturnStatus(Return<void>& ret) {
Amit Mahajand423d192017-03-16 17:04:01 -0700759 ::checkReturnStatus(mSlotId, ret, true);
Amit Mahajan439da362017-02-13 17:43:04 -0800760}
761
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700762Return<void> RadioImpl::setResponseFunctions(
763 const ::android::sp<IRadioResponse>& radioResponseParam,
764 const ::android::sp<IRadioIndication>& radioIndicationParam) {
Amit Mahajan111ddca2017-03-03 12:05:13 -0800765 RLOGD("setResponseFunctions");
Amit Mahajan932e08e2017-01-24 05:45:02 -0800766
767 pthread_rwlock_t *radioServiceRwlockPtr = radio::getRadioServiceRwlock(mSlotId);
768 int ret = pthread_rwlock_wrlock(radioServiceRwlockPtr);
769 assert(ret == 0);
770
Sanket Padawef220dc52017-01-02 23:46:00 -0800771 mRadioResponse = radioResponseParam;
772 mRadioIndication = radioIndicationParam;
Amit Mahajand423d192017-03-16 17:04:01 -0700773 mCounterRadio[mSlotId]++;
Amit Mahajan932e08e2017-01-24 05:45:02 -0800774
775 ret = pthread_rwlock_unlock(radioServiceRwlockPtr);
776 assert(ret == 0);
777
Amit Mahajan60482fd2017-03-14 16:39:27 -0700778 // client is connected. Send initial indications.
779 android::onNewCommandConnect((RIL_SOCKET_ID) mSlotId);
780
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800781 return Void();
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700782}
783
784Return<void> RadioImpl::getIccCardStatus(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -0700785#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -0800786 RLOGD("getIccCardStatus: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -0700787#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800788 dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_SIM_STATUS);
789 return Void();
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700790}
791
Sanket Padawef220dc52017-01-02 23:46:00 -0800792Return<void> RadioImpl::supplyIccPinForApp(int32_t serial, const hidl_string& pin,
793 const hidl_string& aid) {
Jayachandran C572f2f42017-03-25 14:30:13 -0700794#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -0800795 RLOGD("supplyIccPinForApp: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -0700796#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800797 dispatchStrings(serial, mSlotId, RIL_REQUEST_ENTER_SIM_PIN,
Scott Randolphc7213312017-04-03 14:06:40 -0700798 2, pin.c_str(), aid.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800799 return Void();
Sanket Padawef220dc52017-01-02 23:46:00 -0800800}
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700801
Sanket Padawef220dc52017-01-02 23:46:00 -0800802Return<void> RadioImpl::supplyIccPukForApp(int32_t serial, const hidl_string& puk,
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800803 const hidl_string& pin, const hidl_string& aid) {
Jayachandran C572f2f42017-03-25 14:30:13 -0700804#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -0800805 RLOGD("supplyIccPukForApp: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -0700806#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800807 dispatchStrings(serial, mSlotId, RIL_REQUEST_ENTER_SIM_PUK,
Scott Randolphc7213312017-04-03 14:06:40 -0700808 3, puk.c_str(), pin.c_str(), aid.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800809 return Void();
Sanket Padawef220dc52017-01-02 23:46:00 -0800810}
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700811
Sanket Padawef220dc52017-01-02 23:46:00 -0800812Return<void> RadioImpl::supplyIccPin2ForApp(int32_t serial, const hidl_string& pin2,
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800813 const hidl_string& aid) {
Jayachandran C572f2f42017-03-25 14:30:13 -0700814#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -0800815 RLOGD("supplyIccPin2ForApp: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -0700816#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800817 dispatchStrings(serial, mSlotId, RIL_REQUEST_ENTER_SIM_PIN2,
Scott Randolphc7213312017-04-03 14:06:40 -0700818 2, pin2.c_str(), aid.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800819 return Void();
Sanket Padawef220dc52017-01-02 23:46:00 -0800820}
821
822Return<void> RadioImpl::supplyIccPuk2ForApp(int32_t serial, const hidl_string& puk2,
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800823 const hidl_string& pin2, const hidl_string& aid) {
Jayachandran C572f2f42017-03-25 14:30:13 -0700824#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -0800825 RLOGD("supplyIccPuk2ForApp: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -0700826#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800827 dispatchStrings(serial, mSlotId, RIL_REQUEST_ENTER_SIM_PUK2,
Scott Randolphc7213312017-04-03 14:06:40 -0700828 3, puk2.c_str(), pin2.c_str(), aid.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800829 return Void();
Sanket Padawef220dc52017-01-02 23:46:00 -0800830}
831
832Return<void> RadioImpl::changeIccPinForApp(int32_t serial, const hidl_string& oldPin,
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800833 const hidl_string& newPin, const hidl_string& aid) {
Jayachandran C572f2f42017-03-25 14:30:13 -0700834#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -0800835 RLOGD("changeIccPinForApp: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -0700836#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800837 dispatchStrings(serial, mSlotId, RIL_REQUEST_CHANGE_SIM_PIN,
Scott Randolphc7213312017-04-03 14:06:40 -0700838 3, oldPin.c_str(), newPin.c_str(), aid.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800839 return Void();
Sanket Padawef220dc52017-01-02 23:46:00 -0800840}
841
842Return<void> RadioImpl::changeIccPin2ForApp(int32_t serial, const hidl_string& oldPin2,
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800843 const hidl_string& newPin2, const hidl_string& aid) {
Jayachandran C572f2f42017-03-25 14:30:13 -0700844#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -0800845 RLOGD("changeIccPin2ForApp: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -0700846#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800847 dispatchStrings(serial, mSlotId, RIL_REQUEST_CHANGE_SIM_PIN2,
Scott Randolphc7213312017-04-03 14:06:40 -0700848 3, oldPin2.c_str(), newPin2.c_str(), aid.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800849 return Void();
Sanket Padawef220dc52017-01-02 23:46:00 -0800850}
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700851
852Return<void> RadioImpl::supplyNetworkDepersonalization(int32_t serial,
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800853 const hidl_string& netPin) {
Jayachandran C572f2f42017-03-25 14:30:13 -0700854#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -0800855 RLOGD("supplyNetworkDepersonalization: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -0700856#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800857 dispatchStrings(serial, mSlotId, RIL_REQUEST_ENTER_NETWORK_DEPERSONALIZATION,
Scott Randolphc7213312017-04-03 14:06:40 -0700858 1, netPin.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800859 return Void();
Sanket Padawef220dc52017-01-02 23:46:00 -0800860}
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700861
Sanket Padawef220dc52017-01-02 23:46:00 -0800862Return<void> RadioImpl::getCurrentCalls(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -0700863#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -0800864 RLOGD("getCurrentCalls: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -0700865#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800866 dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_CURRENT_CALLS);
867 return Void();
Sanket Padawef220dc52017-01-02 23:46:00 -0800868}
869
870Return<void> RadioImpl::dial(int32_t serial, const Dial& dialInfo) {
Jayachandran C572f2f42017-03-25 14:30:13 -0700871#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -0800872 RLOGD("dial: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -0700873#endif
Sanket Padawef220dc52017-01-02 23:46:00 -0800874 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_DIAL);
875 if (pRI == NULL) {
876 return Void();
877 }
Jack Yuf68e0da2017-02-07 14:53:09 -0800878 RIL_Dial dial = {};
879 RIL_UUS_Info uusInfo = {};
Sanket Padawef220dc52017-01-02 23:46:00 -0800880 int32_t sizeOfDial = sizeof(dial);
881
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800882 if (!copyHidlStringToRil(&dial.address, dialInfo.address, pRI)) {
Sanket Padawef220dc52017-01-02 23:46:00 -0800883 return Void();
884 }
Jack Yuf68e0da2017-02-07 14:53:09 -0800885 dial.clir = (int) dialInfo.clir;
Sanket Padawef220dc52017-01-02 23:46:00 -0800886
Sanket Padawef220dc52017-01-02 23:46:00 -0800887 if (dialInfo.uusInfo.size() != 0) {
Sanket Padawef220dc52017-01-02 23:46:00 -0800888 uusInfo.uusType = (RIL_UUS_Type) dialInfo.uusInfo[0].uusType;
889 uusInfo.uusDcs = (RIL_UUS_DCS) dialInfo.uusInfo[0].uusDcs;
890
891 if (dialInfo.uusInfo[0].uusData.size() == 0) {
892 uusInfo.uusData = NULL;
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800893 uusInfo.uusLength = 0;
Sanket Padawef220dc52017-01-02 23:46:00 -0800894 } else {
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800895 if (!copyHidlStringToRil(&uusInfo.uusData, dialInfo.uusInfo[0].uusData, pRI)) {
896 memsetAndFreeStrings(1, dial.address);
Sanket Padawef220dc52017-01-02 23:46:00 -0800897 return Void();
898 }
Jack Yuf68e0da2017-02-07 14:53:09 -0800899 uusInfo.uusLength = dialInfo.uusInfo[0].uusData.size();
Sanket Padawef220dc52017-01-02 23:46:00 -0800900 }
901
Sanket Padawef220dc52017-01-02 23:46:00 -0800902 dial.uusInfo = &uusInfo;
903 }
904
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800905 s_vendorFunctions->onRequest(RIL_REQUEST_DIAL, &dial, sizeOfDial, pRI);
Sanket Padawef220dc52017-01-02 23:46:00 -0800906
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800907 memsetAndFreeStrings(2, dial.address, uusInfo.uusData);
Sanket Padawef220dc52017-01-02 23:46:00 -0800908
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800909 return Void();
Sanket Padawef220dc52017-01-02 23:46:00 -0800910}
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700911
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800912Return<void> RadioImpl::getImsiForApp(int32_t serial, const hidl_string& aid) {
Jayachandran C572f2f42017-03-25 14:30:13 -0700913#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -0800914 RLOGD("getImsiForApp: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -0700915#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800916 dispatchStrings(serial, mSlotId, RIL_REQUEST_GET_IMSI,
Scott Randolphc7213312017-04-03 14:06:40 -0700917 1, aid.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800918 return Void();
919}
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700920
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800921Return<void> RadioImpl::hangup(int32_t serial, int32_t gsmIndex) {
Jayachandran C572f2f42017-03-25 14:30:13 -0700922#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -0800923 RLOGD("hangup: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -0700924#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800925 dispatchInts(serial, mSlotId, RIL_REQUEST_HANGUP, 1, gsmIndex);
926 return Void();
927}
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700928
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800929Return<void> RadioImpl::hangupWaitingOrBackground(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -0700930#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -0800931 RLOGD("hangupWaitingOrBackground: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -0700932#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800933 dispatchVoid(serial, mSlotId, RIL_REQUEST_HANGUP_WAITING_OR_BACKGROUND);
934 return Void();
935}
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700936
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800937Return<void> RadioImpl::hangupForegroundResumeBackground(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -0700938#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -0800939 RLOGD("hangupForegroundResumeBackground: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -0700940#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800941 dispatchVoid(serial, mSlotId, RIL_REQUEST_HANGUP_FOREGROUND_RESUME_BACKGROUND);
942 return Void();
943}
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700944
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800945Return<void> RadioImpl::switchWaitingOrHoldingAndActive(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -0700946#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -0800947 RLOGD("switchWaitingOrHoldingAndActive: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -0700948#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800949 dispatchVoid(serial, mSlotId, RIL_REQUEST_SWITCH_WAITING_OR_HOLDING_AND_ACTIVE);
950 return Void();
951}
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700952
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800953Return<void> RadioImpl::conference(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -0700954#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -0800955 RLOGD("conference: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -0700956#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800957 dispatchVoid(serial, mSlotId, RIL_REQUEST_CONFERENCE);
958 return Void();
959}
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700960
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800961Return<void> RadioImpl::rejectCall(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -0700962#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -0800963 RLOGD("rejectCall: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -0700964#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800965 dispatchVoid(serial, mSlotId, RIL_REQUEST_UDUB);
966 return Void();
967}
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700968
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800969Return<void> RadioImpl::getLastCallFailCause(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -0700970#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -0800971 RLOGD("getLastCallFailCause: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -0700972#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800973 dispatchVoid(serial, mSlotId, RIL_REQUEST_LAST_CALL_FAIL_CAUSE);
974 return Void();
975}
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700976
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800977Return<void> RadioImpl::getSignalStrength(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -0700978#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -0800979 RLOGD("getSignalStrength: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -0700980#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800981 dispatchVoid(serial, mSlotId, RIL_REQUEST_SIGNAL_STRENGTH);
982 return Void();
983}
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700984
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800985Return<void> RadioImpl::getVoiceRegistrationState(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -0700986#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -0800987 RLOGD("getVoiceRegistrationState: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -0700988#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800989 dispatchVoid(serial, mSlotId, RIL_REQUEST_VOICE_REGISTRATION_STATE);
990 return Void();
991}
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700992
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800993Return<void> RadioImpl::getDataRegistrationState(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -0700994#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -0800995 RLOGD("getDataRegistrationState: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -0700996#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800997 dispatchVoid(serial, mSlotId, RIL_REQUEST_DATA_REGISTRATION_STATE);
998 return Void();
999}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001000
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001001Return<void> RadioImpl::getOperator(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001002#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001003 RLOGD("getOperator: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001004#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001005 dispatchVoid(serial, mSlotId, RIL_REQUEST_OPERATOR);
1006 return Void();
1007}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001008
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001009Return<void> RadioImpl::setRadioPower(int32_t serial, bool on) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08001010 RLOGD("setRadioPower: serial %d on %d", serial, on);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001011 dispatchInts(serial, mSlotId, RIL_REQUEST_RADIO_POWER, 1, BOOL_TO_INT(on));
1012 return Void();
1013}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001014
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001015Return<void> RadioImpl::sendDtmf(int32_t serial, const hidl_string& s) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001016#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001017 RLOGD("sendDtmf: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001018#endif
Scott Randolphc7213312017-04-03 14:06:40 -07001019 dispatchString(serial, mSlotId, RIL_REQUEST_DTMF, s.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001020 return Void();
1021}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001022
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001023Return<void> RadioImpl::sendSms(int32_t serial, const GsmSmsMessage& message) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001024#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001025 RLOGD("sendSms: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001026#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001027 dispatchStrings(serial, mSlotId, RIL_REQUEST_SEND_SMS,
Scott Randolphc7213312017-04-03 14:06:40 -07001028 2, message.smscPdu.c_str(), message.pdu.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001029 return Void();
1030}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001031
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001032Return<void> RadioImpl::sendSMSExpectMore(int32_t serial, const GsmSmsMessage& message) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001033#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001034 RLOGD("sendSMSExpectMore: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001035#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001036 dispatchStrings(serial, mSlotId, RIL_REQUEST_SEND_SMS_EXPECT_MORE,
Scott Randolphc7213312017-04-03 14:06:40 -07001037 2, message.smscPdu.c_str(), message.pdu.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001038 return Void();
1039}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001040
Jack Yuc13645e2017-04-13 20:55:03 -07001041static bool convertMvnoTypeToString(MvnoType type, char *&str) {
Jack Yuffc06452017-02-13 11:21:00 -08001042 switch (type) {
Jack Yuc13645e2017-04-13 20:55:03 -07001043 case MvnoType::IMSI:
1044 str = (char *)"imsi";
1045 return true;
1046 case MvnoType::GID:
1047 str = (char *)"gid";
1048 return true;
1049 case MvnoType::SPN:
1050 str = (char *)"spn";
1051 return true;
1052 case MvnoType::NONE:
1053 str = (char *)"";
1054 return true;
Jack Yuffc06452017-02-13 11:21:00 -08001055 }
Jack Yuc13645e2017-04-13 20:55:03 -07001056 return false;
Jack Yuffc06452017-02-13 11:21:00 -08001057}
1058
1059Return<void> RadioImpl::setupDataCall(int32_t serial, RadioTechnology radioTechnology,
1060 const DataProfileInfo& dataProfileInfo, bool modemCognitive,
1061 bool roamingAllowed, bool isRoaming) {
1062
Jayachandran C572f2f42017-03-25 14:30:13 -07001063#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001064 RLOGD("setupDataCall: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001065#endif
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001066
Jack Yuffc06452017-02-13 11:21:00 -08001067 if (s_vendorFunctions->version >= 4 && s_vendorFunctions->version <= 14) {
1068 const hidl_string &protocol =
1069 (isRoaming ? dataProfileInfo.roamingProtocol : dataProfileInfo.protocol);
1070 dispatchStrings(serial, mSlotId, RIL_REQUEST_SETUP_DATA_CALL, 7,
1071 std::to_string((int) radioTechnology + 2).c_str(),
1072 std::to_string((int) dataProfileInfo.profileId).c_str(),
1073 dataProfileInfo.apn.c_str(),
1074 dataProfileInfo.user.c_str(),
1075 dataProfileInfo.password.c_str(),
1076 std::to_string((int) dataProfileInfo.authType).c_str(),
1077 protocol.c_str());
1078 } else if (s_vendorFunctions->version >= 15) {
Jack Yuc13645e2017-04-13 20:55:03 -07001079 char *mvnoTypeStr = NULL;
1080 if (!convertMvnoTypeToString(dataProfileInfo.mvnoType, mvnoTypeStr)) {
Jack Yuffc06452017-02-13 11:21:00 -08001081 RequestInfo *pRI = android::addRequestToList(serial, mSlotId,
1082 RIL_REQUEST_SETUP_DATA_CALL);
1083 if (pRI != NULL) {
1084 sendErrorResponse(pRI, RIL_E_INVALID_ARGUMENTS);
1085 }
1086 return Void();
1087 }
1088 dispatchStrings(serial, mSlotId, RIL_REQUEST_SETUP_DATA_CALL, 15,
1089 std::to_string((int) radioTechnology + 2).c_str(),
1090 std::to_string((int) dataProfileInfo.profileId).c_str(),
1091 dataProfileInfo.apn.c_str(),
1092 dataProfileInfo.user.c_str(),
1093 dataProfileInfo.password.c_str(),
1094 std::to_string((int) dataProfileInfo.authType).c_str(),
1095 dataProfileInfo.protocol.c_str(),
1096 dataProfileInfo.roamingProtocol.c_str(),
1097 std::to_string(dataProfileInfo.supportedApnTypesBitmap).c_str(),
1098 std::to_string(dataProfileInfo.bearerBitmap).c_str(),
Jack Yuc13645e2017-04-13 20:55:03 -07001099 modemCognitive ? "1" : "0",
Jack Yuffc06452017-02-13 11:21:00 -08001100 std::to_string(dataProfileInfo.mtu).c_str(),
1101 mvnoTypeStr,
1102 dataProfileInfo.mvnoMatchData.c_str(),
Jack Yuc13645e2017-04-13 20:55:03 -07001103 roamingAllowed ? "1" : "0");
Jack Yuffc06452017-02-13 11:21:00 -08001104 } else {
1105 RLOGE("Unsupported RIL version %d, min version expected 4", s_vendorFunctions->version);
1106 RequestInfo *pRI = android::addRequestToList(serial, mSlotId,
1107 RIL_REQUEST_SETUP_DATA_CALL);
1108 if (pRI != NULL) {
1109 sendErrorResponse(pRI, RIL_E_REQUEST_NOT_SUPPORTED);
1110 }
1111 }
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001112 return Void();
1113}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001114
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001115Return<void> RadioImpl::iccIOForApp(int32_t serial, const IccIo& iccIo) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001116#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001117 RLOGD("iccIOForApp: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001118#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001119 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_SIM_IO);
1120 if (pRI == NULL) {
1121 return Void();
1122 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001123
Jack Yu8e732d42017-04-14 00:08:06 -07001124 RIL_SIM_IO_v6 rilIccIo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001125 rilIccIo.command = iccIo.command;
1126 rilIccIo.fileid = iccIo.fileId;
1127 if (!copyHidlStringToRil(&rilIccIo.path, iccIo.path, pRI)) {
1128 return Void();
1129 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001130
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001131 rilIccIo.p1 = iccIo.p1;
1132 rilIccIo.p2 = iccIo.p2;
1133 rilIccIo.p3 = iccIo.p3;
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001134
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001135 if (!copyHidlStringToRil(&rilIccIo.data, iccIo.data, pRI)) {
1136 memsetAndFreeStrings(1, rilIccIo.path);
1137 return Void();
1138 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001139
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001140 if (!copyHidlStringToRil(&rilIccIo.pin2, iccIo.pin2, pRI)) {
1141 memsetAndFreeStrings(2, rilIccIo.path, rilIccIo.data);
1142 return Void();
1143 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001144
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001145 if (!copyHidlStringToRil(&rilIccIo.aidPtr, iccIo.aid, pRI)) {
1146 memsetAndFreeStrings(3, rilIccIo.path, rilIccIo.data, rilIccIo.pin2);
1147 return Void();
1148 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001149
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001150 s_vendorFunctions->onRequest(RIL_REQUEST_SIM_IO, &rilIccIo, sizeof(rilIccIo), pRI);
1151
1152 memsetAndFreeStrings(4, rilIccIo.path, rilIccIo.data, rilIccIo.pin2, rilIccIo.aidPtr);
1153
1154 return Void();
1155}
1156
1157Return<void> RadioImpl::sendUssd(int32_t serial, const hidl_string& ussd) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001158#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001159 RLOGD("sendUssd: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001160#endif
Scott Randolphc7213312017-04-03 14:06:40 -07001161 dispatchString(serial, mSlotId, RIL_REQUEST_SEND_USSD, ussd.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001162 return Void();
1163}
1164
1165Return<void> RadioImpl::cancelPendingUssd(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001166#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001167 RLOGD("cancelPendingUssd: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001168#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001169 dispatchVoid(serial, mSlotId, RIL_REQUEST_CANCEL_USSD);
1170 return Void();
1171}
1172
1173Return<void> RadioImpl::getClir(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001174#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001175 RLOGD("getClir: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001176#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001177 dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_CLIR);
1178 return Void();
1179}
1180
1181Return<void> RadioImpl::setClir(int32_t serial, int32_t status) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001182#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001183 RLOGD("setClir: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001184#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001185 dispatchInts(serial, mSlotId, RIL_REQUEST_SET_CLIR, 1, status);
1186 return Void();
1187}
1188
1189Return<void> RadioImpl::getCallForwardStatus(int32_t serial, const CallForwardInfo& callInfo) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001190#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001191 RLOGD("getCallForwardStatus: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001192#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001193 dispatchCallForwardStatus(serial, mSlotId, RIL_REQUEST_QUERY_CALL_FORWARD_STATUS,
1194 callInfo);
1195 return Void();
1196}
1197
1198Return<void> RadioImpl::setCallForward(int32_t serial, const CallForwardInfo& callInfo) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001199#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001200 RLOGD("setCallForward: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001201#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001202 dispatchCallForwardStatus(serial, mSlotId, RIL_REQUEST_SET_CALL_FORWARD,
1203 callInfo);
1204 return Void();
1205}
1206
1207Return<void> RadioImpl::getCallWaiting(int32_t serial, int32_t serviceClass) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001208#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001209 RLOGD("getCallWaiting: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001210#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001211 dispatchInts(serial, mSlotId, RIL_REQUEST_QUERY_CALL_WAITING, 1, serviceClass);
1212 return Void();
1213}
1214
1215Return<void> RadioImpl::setCallWaiting(int32_t serial, bool enable, int32_t serviceClass) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001216#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001217 RLOGD("setCallWaiting: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001218#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001219 dispatchInts(serial, mSlotId, RIL_REQUEST_SET_CALL_WAITING, 2, BOOL_TO_INT(enable),
1220 serviceClass);
1221 return Void();
1222}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001223
1224Return<void> RadioImpl::acknowledgeLastIncomingGsmSms(int32_t serial,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001225 bool success, SmsAcknowledgeFailCause cause) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001226#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001227 RLOGD("acknowledgeLastIncomingGsmSms: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001228#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001229 dispatchInts(serial, mSlotId, RIL_REQUEST_SMS_ACKNOWLEDGE, 2, BOOL_TO_INT(success),
1230 cause);
1231 return Void();
1232}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001233
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001234Return<void> RadioImpl::acceptCall(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001235#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001236 RLOGD("acceptCall: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001237#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001238 dispatchVoid(serial, mSlotId, RIL_REQUEST_ANSWER);
1239 return Void();
1240}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001241
1242Return<void> RadioImpl::deactivateDataCall(int32_t serial,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001243 int32_t cid, bool reasonRadioShutDown) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001244#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001245 RLOGD("deactivateDataCall: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001246#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001247 dispatchStrings(serial, mSlotId, RIL_REQUEST_DEACTIVATE_DATA_CALL,
Scott Randolphc7213312017-04-03 14:06:40 -07001248 2, (std::to_string(cid)).c_str(), reasonRadioShutDown ? "1" : "0");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001249 return Void();
1250}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001251
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001252Return<void> RadioImpl::getFacilityLockForApp(int32_t serial, const hidl_string& facility,
1253 const hidl_string& password, int32_t serviceClass,
1254 const hidl_string& appId) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001255#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001256 RLOGD("getFacilityLockForApp: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001257#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001258 dispatchStrings(serial, mSlotId, RIL_REQUEST_QUERY_FACILITY_LOCK,
Scott Randolphc7213312017-04-03 14:06:40 -07001259 4, facility.c_str(), password.c_str(),
1260 (std::to_string(serviceClass)).c_str(), appId.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001261 return Void();
1262}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001263
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001264Return<void> RadioImpl::setFacilityLockForApp(int32_t serial, const hidl_string& facility,
1265 bool lockState, const hidl_string& password,
1266 int32_t serviceClass, const hidl_string& appId) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001267#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001268 RLOGD("setFacilityLockForApp: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001269#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001270 dispatchStrings(serial, mSlotId, RIL_REQUEST_SET_FACILITY_LOCK,
Scott Randolphc7213312017-04-03 14:06:40 -07001271 5, facility.c_str(), lockState ? "1" : "0", password.c_str(),
1272 (std::to_string(serviceClass)).c_str(), appId.c_str() );
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001273 return Void();
1274}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001275
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001276Return<void> RadioImpl::setBarringPassword(int32_t serial, const hidl_string& facility,
1277 const hidl_string& oldPassword,
1278 const hidl_string& newPassword) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001279#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001280 RLOGD("setBarringPassword: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001281#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001282 dispatchStrings(serial, mSlotId, RIL_REQUEST_CHANGE_BARRING_PASSWORD,
Scott Randolphc7213312017-04-03 14:06:40 -07001283 2, oldPassword.c_str(), newPassword.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001284 return Void();
1285}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001286
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001287Return<void> RadioImpl::getNetworkSelectionMode(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001288#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001289 RLOGD("getNetworkSelectionMode: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001290#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001291 dispatchVoid(serial, mSlotId, RIL_REQUEST_QUERY_NETWORK_SELECTION_MODE);
1292 return Void();
1293}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001294
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001295Return<void> RadioImpl::setNetworkSelectionModeAutomatic(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001296#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001297 RLOGD("setNetworkSelectionModeAutomatic: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001298#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001299 dispatchVoid(serial, mSlotId, RIL_REQUEST_SET_NETWORK_SELECTION_AUTOMATIC);
1300 return Void();
1301}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001302
1303Return<void> RadioImpl::setNetworkSelectionModeManual(int32_t serial,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001304 const hidl_string& operatorNumeric) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001305#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001306 RLOGD("setNetworkSelectionModeManual: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001307#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001308 dispatchString(serial, mSlotId, RIL_REQUEST_SET_NETWORK_SELECTION_MANUAL,
Scott Randolphc7213312017-04-03 14:06:40 -07001309 operatorNumeric.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001310 return Void();
1311}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001312
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001313Return<void> RadioImpl::getAvailableNetworks(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001314#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001315 RLOGD("getAvailableNetworks: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001316#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001317 dispatchVoid(serial, mSlotId, RIL_REQUEST_QUERY_AVAILABLE_NETWORKS);
1318 return Void();
1319}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001320
yinxu584379e2017-05-03 15:15:19 -07001321Return<void> RadioImpl::startNetworkScan(int32_t serial, const NetworkScanRequest& request) {
1322#if VDBG
1323 RLOGD("startNetworkScan: serial %d", serial);
1324#endif
yinxu8688abd2017-05-22 11:26:45 -07001325
1326 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_START_NETWORK_SCAN);
1327 if (pRI == NULL) {
1328 return Void();
1329 }
1330
1331 if (request.specifiers.size() > MAX_RADIO_ACCESS_NETWORKS) {
1332 sendErrorResponse(pRI, RIL_E_INVALID_ARGUMENTS);
1333 return Void();
1334 }
1335
1336 RIL_NetworkScanRequest scan_request = {};
1337
1338 scan_request.type = (RIL_ScanType) request.type;
1339 scan_request.interval = request.interval;
1340 scan_request.specifiers_length = request.specifiers.size();
1341 for (size_t i = 0; i < request.specifiers.size(); ++i) {
1342 if (request.specifiers[i].geranBands.size() > MAX_BANDS ||
1343 request.specifiers[i].utranBands.size() > MAX_BANDS ||
1344 request.specifiers[i].eutranBands.size() > MAX_BANDS ||
1345 request.specifiers[i].channels.size() > MAX_CHANNELS) {
1346 sendErrorResponse(pRI, RIL_E_INVALID_ARGUMENTS);
1347 return Void();
1348 }
1349 const ::android::hardware::radio::V1_1::RadioAccessSpecifier& ras_from =
1350 request.specifiers[i];
1351 RIL_RadioAccessSpecifier& ras_to = scan_request.specifiers[i];
1352
1353 ras_to.radio_access_network = (RIL_RadioAccessNetworks) ras_from.radioAccessNetwork;
1354 ras_to.channels_length = ras_from.channels.size();
1355
1356 std::copy(ras_from.channels.begin(), ras_from.channels.end(), ras_to.channels);
1357 const std::vector<uint32_t> * bands = nullptr;
1358 switch (request.specifiers[i].radioAccessNetwork) {
1359 case ::android::hardware::radio::V1_1::RadioAccessNetworks::GERAN:
1360 ras_to.bands_length = ras_from.geranBands.size();
1361 bands = (std::vector<uint32_t> *) &ras_from.geranBands;
1362 break;
1363 case ::android::hardware::radio::V1_1::RadioAccessNetworks::UTRAN:
1364 ras_to.bands_length = ras_from.utranBands.size();
1365 bands = (std::vector<uint32_t> *) &ras_from.utranBands;
1366 break;
1367 case ::android::hardware::radio::V1_1::RadioAccessNetworks::EUTRAN:
1368 ras_to.bands_length = ras_from.eutranBands.size();
1369 bands = (std::vector<uint32_t> *) &ras_from.eutranBands;
1370 break;
1371 default:
1372 sendErrorResponse(pRI, RIL_E_INVALID_ARGUMENTS);
1373 return Void();
1374 }
1375 // safe to copy to geran_bands because it's a union member
1376 std::memcpy(&ras_to.bands.geran_bands, bands, ras_to.bands_length * sizeof(uint32_t));
1377 }
1378
1379 s_vendorFunctions->onRequest(
1380 RIL_REQUEST_START_NETWORK_SCAN, &scan_request, sizeof(scan_request), pRI);
1381
yinxu584379e2017-05-03 15:15:19 -07001382 return Void();
1383}
1384
1385Return<void> RadioImpl::stopNetworkScan(int32_t serial) {
1386#if VDBG
1387 RLOGD("stopNetworkScan: serial %d", serial);
1388#endif
yinxu584379e2017-05-03 15:15:19 -07001389 dispatchVoid(serial, mSlotId, RIL_REQUEST_STOP_NETWORK_SCAN);
1390 return Void();
1391}
1392
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001393Return<void> RadioImpl::startDtmf(int32_t serial, const hidl_string& s) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001394#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001395 RLOGD("startDtmf: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001396#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001397 dispatchString(serial, mSlotId, RIL_REQUEST_DTMF_START,
Scott Randolphc7213312017-04-03 14:06:40 -07001398 s.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001399 return Void();
1400}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001401
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001402Return<void> RadioImpl::stopDtmf(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001403#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001404 RLOGD("stopDtmf: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001405#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001406 dispatchVoid(serial, mSlotId, RIL_REQUEST_DTMF_STOP);
1407 return Void();
1408}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001409
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001410Return<void> RadioImpl::getBasebandVersion(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001411#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001412 RLOGD("getBasebandVersion: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001413#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001414 dispatchVoid(serial, mSlotId, RIL_REQUEST_BASEBAND_VERSION);
1415 return Void();
1416}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001417
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001418Return<void> RadioImpl::separateConnection(int32_t serial, int32_t gsmIndex) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001419#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001420 RLOGD("separateConnection: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001421#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001422 dispatchInts(serial, mSlotId, RIL_REQUEST_SEPARATE_CONNECTION, 1, gsmIndex);
1423 return Void();
1424}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001425
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001426Return<void> RadioImpl::setMute(int32_t serial, bool enable) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001427#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001428 RLOGD("setMute: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001429#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001430 dispatchInts(serial, mSlotId, RIL_REQUEST_SET_MUTE, 1, BOOL_TO_INT(enable));
1431 return Void();
1432}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001433
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001434Return<void> RadioImpl::getMute(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001435#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001436 RLOGD("getMute: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001437#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001438 dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_MUTE);
1439 return Void();
1440}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001441
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001442Return<void> RadioImpl::getClip(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001443#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001444 RLOGD("getClip: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001445#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001446 dispatchVoid(serial, mSlotId, RIL_REQUEST_QUERY_CLIP);
1447 return Void();
1448}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001449
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001450Return<void> RadioImpl::getDataCallList(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001451#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001452 RLOGD("getDataCallList: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001453#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001454 dispatchVoid(serial, mSlotId, RIL_REQUEST_DATA_CALL_LIST);
1455 return Void();
1456}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001457
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001458Return<void> RadioImpl::setSuppServiceNotifications(int32_t serial, bool enable) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001459#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001460 RLOGD("setSuppServiceNotifications: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001461#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001462 dispatchInts(serial, mSlotId, RIL_REQUEST_SET_SUPP_SVC_NOTIFICATION, 1,
1463 BOOL_TO_INT(enable));
1464 return Void();
1465}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001466
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001467Return<void> RadioImpl::writeSmsToSim(int32_t serial, const SmsWriteArgs& smsWriteArgs) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001468#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001469 RLOGD("writeSmsToSim: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001470#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001471 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_WRITE_SMS_TO_SIM);
1472 if (pRI == NULL) {
1473 return Void();
1474 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001475
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001476 RIL_SMS_WriteArgs args;
1477 args.status = (int) smsWriteArgs.status;
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001478
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001479 int len;
1480 if (!copyHidlStringToRil(&args.pdu, smsWriteArgs.pdu, pRI)) {
1481 return Void();
1482 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001483
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001484 if (!copyHidlStringToRil(&args.smsc, smsWriteArgs.smsc, pRI)) {
1485 memsetAndFreeStrings(1, args.pdu);
1486 return Void();
1487 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001488
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001489 s_vendorFunctions->onRequest(RIL_REQUEST_WRITE_SMS_TO_SIM, &args, sizeof(args), pRI);
1490
1491 memsetAndFreeStrings(2, args.smsc, args.pdu);
1492
1493 return Void();
1494}
1495
1496Return<void> RadioImpl::deleteSmsOnSim(int32_t serial, int32_t index) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001497#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001498 RLOGD("deleteSmsOnSim: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001499#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001500 dispatchInts(serial, mSlotId, RIL_REQUEST_DELETE_SMS_ON_SIM, 1, index);
1501 return Void();
1502}
1503
1504Return<void> RadioImpl::setBandMode(int32_t serial, RadioBandMode mode) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001505#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001506 RLOGD("setBandMode: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001507#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001508 dispatchInts(serial, mSlotId, RIL_REQUEST_SET_BAND_MODE, 1, mode);
1509 return Void();
1510}
1511
1512Return<void> RadioImpl::getAvailableBandModes(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001513#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001514 RLOGD("getAvailableBandModes: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001515#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001516 dispatchVoid(serial, mSlotId, RIL_REQUEST_QUERY_AVAILABLE_BAND_MODE);
1517 return Void();
1518}
1519
1520Return<void> RadioImpl::sendEnvelope(int32_t serial, const hidl_string& command) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001521#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001522 RLOGD("sendEnvelope: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001523#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001524 dispatchString(serial, mSlotId, RIL_REQUEST_STK_SEND_ENVELOPE_COMMAND,
Scott Randolphc7213312017-04-03 14:06:40 -07001525 command.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001526 return Void();
1527}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001528
1529Return<void> RadioImpl::sendTerminalResponseToSim(int32_t serial,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001530 const hidl_string& commandResponse) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001531#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001532 RLOGD("sendTerminalResponseToSim: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001533#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001534 dispatchString(serial, mSlotId, RIL_REQUEST_STK_SEND_TERMINAL_RESPONSE,
Scott Randolphc7213312017-04-03 14:06:40 -07001535 commandResponse.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001536 return Void();
1537}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001538
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001539Return<void> RadioImpl::handleStkCallSetupRequestFromSim(int32_t serial, bool accept) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001540#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001541 RLOGD("handleStkCallSetupRequestFromSim: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001542#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001543 dispatchInts(serial, mSlotId, RIL_REQUEST_STK_HANDLE_CALL_SETUP_REQUESTED_FROM_SIM,
1544 1, BOOL_TO_INT(accept));
1545 return Void();
1546}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001547
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001548Return<void> RadioImpl::explicitCallTransfer(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001549#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001550 RLOGD("explicitCallTransfer: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001551#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001552 dispatchVoid(serial, mSlotId, RIL_REQUEST_EXPLICIT_CALL_TRANSFER);
1553 return Void();
1554}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001555
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001556Return<void> RadioImpl::setPreferredNetworkType(int32_t serial, PreferredNetworkType nwType) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001557#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001558 RLOGD("setPreferredNetworkType: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001559#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001560 dispatchInts(serial, mSlotId, RIL_REQUEST_SET_PREFERRED_NETWORK_TYPE, 1, nwType);
1561 return Void();
1562}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001563
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001564Return<void> RadioImpl::getPreferredNetworkType(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001565#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001566 RLOGD("getPreferredNetworkType: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001567#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001568 dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_PREFERRED_NETWORK_TYPE);
1569 return Void();
1570}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001571
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001572Return<void> RadioImpl::getNeighboringCids(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001573#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001574 RLOGD("getNeighboringCids: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001575#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001576 dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_NEIGHBORING_CELL_IDS);
1577 return Void();
1578}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001579
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001580Return<void> RadioImpl::setLocationUpdates(int32_t serial, bool enable) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001581#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001582 RLOGD("setLocationUpdates: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001583#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001584 dispatchInts(serial, mSlotId, RIL_REQUEST_SET_LOCATION_UPDATES, 1, BOOL_TO_INT(enable));
1585 return Void();
1586}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001587
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001588Return<void> RadioImpl::setCdmaSubscriptionSource(int32_t serial, CdmaSubscriptionSource cdmaSub) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001589#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001590 RLOGD("setCdmaSubscriptionSource: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001591#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001592 dispatchInts(serial, mSlotId, RIL_REQUEST_CDMA_SET_SUBSCRIPTION_SOURCE, 1, cdmaSub);
1593 return Void();
1594}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001595
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001596Return<void> RadioImpl::setCdmaRoamingPreference(int32_t serial, CdmaRoamingType type) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001597#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001598 RLOGD("setCdmaRoamingPreference: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001599#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001600 dispatchInts(serial, mSlotId, RIL_REQUEST_CDMA_SET_ROAMING_PREFERENCE, 1, type);
1601 return Void();
1602}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001603
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001604Return<void> RadioImpl::getCdmaRoamingPreference(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001605#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001606 RLOGD("getCdmaRoamingPreference: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001607#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001608 dispatchVoid(serial, mSlotId, RIL_REQUEST_CDMA_QUERY_ROAMING_PREFERENCE);
1609 return Void();
1610}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001611
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001612Return<void> RadioImpl::setTTYMode(int32_t serial, TtyMode mode) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001613#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001614 RLOGD("setTTYMode: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001615#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001616 dispatchInts(serial, mSlotId, RIL_REQUEST_SET_TTY_MODE, 1, mode);
1617 return Void();
1618}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001619
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001620Return<void> RadioImpl::getTTYMode(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001621#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001622 RLOGD("getTTYMode: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001623#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001624 dispatchVoid(serial, mSlotId, RIL_REQUEST_QUERY_TTY_MODE);
1625 return Void();
1626}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001627
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001628Return<void> RadioImpl::setPreferredVoicePrivacy(int32_t serial, bool enable) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001629#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001630 RLOGD("setPreferredVoicePrivacy: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001631#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001632 dispatchInts(serial, mSlotId, RIL_REQUEST_CDMA_SET_PREFERRED_VOICE_PRIVACY_MODE,
1633 1, BOOL_TO_INT(enable));
1634 return Void();
1635}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001636
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001637Return<void> RadioImpl::getPreferredVoicePrivacy(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001638#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001639 RLOGD("getPreferredVoicePrivacy: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001640#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001641 dispatchVoid(serial, mSlotId, RIL_REQUEST_CDMA_QUERY_PREFERRED_VOICE_PRIVACY_MODE);
1642 return Void();
1643}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001644
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001645Return<void> RadioImpl::sendCDMAFeatureCode(int32_t serial, const hidl_string& featureCode) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001646#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001647 RLOGD("sendCDMAFeatureCode: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001648#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001649 dispatchString(serial, mSlotId, RIL_REQUEST_CDMA_FLASH,
Scott Randolphc7213312017-04-03 14:06:40 -07001650 featureCode.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001651 return Void();
1652}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001653
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001654Return<void> RadioImpl::sendBurstDtmf(int32_t serial, const hidl_string& dtmf, int32_t on,
1655 int32_t off) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001656#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001657 RLOGD("sendBurstDtmf: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001658#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001659 dispatchStrings(serial, mSlotId, RIL_REQUEST_CDMA_BURST_DTMF,
Scott Randolphc7213312017-04-03 14:06:40 -07001660 3, dtmf.c_str(), (std::to_string(on)).c_str(),
1661 (std::to_string(off)).c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001662 return Void();
1663}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001664
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001665void constructCdmaSms(RIL_CDMA_SMS_Message &rcsm, const CdmaSmsMessage& sms) {
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001666 rcsm.uTeleserviceID = sms.teleserviceId;
1667 rcsm.bIsServicePresent = BOOL_TO_INT(sms.isServicePresent);
1668 rcsm.uServicecategory = sms.serviceCategory;
1669 rcsm.sAddress.digit_mode = (RIL_CDMA_SMS_DigitMode) sms.address.digitMode;
1670 rcsm.sAddress.number_mode = (RIL_CDMA_SMS_NumberMode) sms.address.numberMode;
1671 rcsm.sAddress.number_type = (RIL_CDMA_SMS_NumberType) sms.address.numberType;
1672 rcsm.sAddress.number_plan = (RIL_CDMA_SMS_NumberPlan) sms.address.numberPlan;
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001673
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001674 rcsm.sAddress.number_of_digits = sms.address.digits.size();
1675 int digitLimit= MIN((rcsm.sAddress.number_of_digits), RIL_CDMA_SMS_ADDRESS_MAX);
1676 for (int i = 0; i < digitLimit; i++) {
1677 rcsm.sAddress.digits[i] = sms.address.digits[i];
1678 }
1679
1680 rcsm.sSubAddress.subaddressType = (RIL_CDMA_SMS_SubaddressType) sms.subAddress.subaddressType;
1681 rcsm.sSubAddress.odd = BOOL_TO_INT(sms.subAddress.odd);
1682
1683 rcsm.sSubAddress.number_of_digits = sms.subAddress.digits.size();
1684 digitLimit= MIN((rcsm.sSubAddress.number_of_digits), RIL_CDMA_SMS_SUBADDRESS_MAX);
1685 for (int i = 0; i < digitLimit; i++) {
1686 rcsm.sSubAddress.digits[i] = sms.subAddress.digits[i];
1687 }
1688
1689 rcsm.uBearerDataLen = sms.bearerData.size();
1690 digitLimit= MIN((rcsm.uBearerDataLen), RIL_CDMA_SMS_BEARER_DATA_MAX);
1691 for (int i = 0; i < digitLimit; i++) {
1692 rcsm.aBearerData[i] = sms.bearerData[i];
1693 }
1694}
1695
1696Return<void> RadioImpl::sendCdmaSms(int32_t serial, const CdmaSmsMessage& sms) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001697#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001698 RLOGD("sendCdmaSms: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001699#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001700 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_CDMA_SEND_SMS);
1701 if (pRI == NULL) {
1702 return Void();
1703 }
1704
Jack Yu8e732d42017-04-14 00:08:06 -07001705 RIL_CDMA_SMS_Message rcsm = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001706 constructCdmaSms(rcsm, sms);
1707
1708 s_vendorFunctions->onRequest(pRI->pCI->requestNumber, &rcsm, sizeof(rcsm), pRI);
1709 return Void();
1710}
1711
1712Return<void> RadioImpl::acknowledgeLastIncomingCdmaSms(int32_t serial, const CdmaSmsAck& smsAck) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001713#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001714 RLOGD("acknowledgeLastIncomingCdmaSms: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001715#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001716 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_CDMA_SMS_ACKNOWLEDGE);
1717 if (pRI == NULL) {
1718 return Void();
1719 }
1720
Jack Yuf68e0da2017-02-07 14:53:09 -08001721 RIL_CDMA_SMS_Ack rcsa = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001722
1723 rcsa.uErrorClass = (RIL_CDMA_SMS_ErrorClass) smsAck.errorClass;
1724 rcsa.uSMSCauseCode = smsAck.smsCauseCode;
1725
1726 s_vendorFunctions->onRequest(pRI->pCI->requestNumber, &rcsa, sizeof(rcsa), pRI);
1727 return Void();
1728}
1729
1730Return<void> RadioImpl::getGsmBroadcastConfig(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001731#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001732 RLOGD("getGsmBroadcastConfig: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001733#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001734 dispatchVoid(serial, mSlotId, RIL_REQUEST_GSM_GET_BROADCAST_SMS_CONFIG);
1735 return Void();
1736}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001737
1738Return<void> RadioImpl::setGsmBroadcastConfig(int32_t serial,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001739 const hidl_vec<GsmBroadcastSmsConfigInfo>&
1740 configInfo) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001741#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001742 RLOGD("setGsmBroadcastConfig: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001743#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001744 RequestInfo *pRI = android::addRequestToList(serial, mSlotId,
1745 RIL_REQUEST_GSM_SET_BROADCAST_SMS_CONFIG);
1746 if (pRI == NULL) {
1747 return Void();
1748 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001749
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001750 int num = configInfo.size();
1751 RIL_GSM_BroadcastSmsConfigInfo gsmBci[num];
1752 RIL_GSM_BroadcastSmsConfigInfo *gsmBciPtrs[num];
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001753
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001754 for (int i = 0 ; i < num ; i++ ) {
1755 gsmBciPtrs[i] = &gsmBci[i];
1756 gsmBci[i].fromServiceId = configInfo[i].fromServiceId;
1757 gsmBci[i].toServiceId = configInfo[i].toServiceId;
1758 gsmBci[i].fromCodeScheme = configInfo[i].fromCodeScheme;
1759 gsmBci[i].toCodeScheme = configInfo[i].toCodeScheme;
1760 gsmBci[i].selected = BOOL_TO_INT(configInfo[i].selected);
1761 }
1762
1763 s_vendorFunctions->onRequest(pRI->pCI->requestNumber, gsmBciPtrs,
1764 num * sizeof(RIL_GSM_BroadcastSmsConfigInfo *), pRI);
1765 return Void();
1766}
1767
1768Return<void> RadioImpl::setGsmBroadcastActivation(int32_t serial, bool activate) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001769#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001770 RLOGD("setGsmBroadcastActivation: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001771#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001772 dispatchInts(serial, mSlotId, RIL_REQUEST_GSM_SMS_BROADCAST_ACTIVATION,
Sanket Padawe0de29d12017-02-10 13:19:47 -08001773 1, BOOL_TO_INT(!activate));
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001774 return Void();
1775}
1776
1777Return<void> RadioImpl::getCdmaBroadcastConfig(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001778#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001779 RLOGD("getCdmaBroadcastConfig: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001780#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001781 dispatchVoid(serial, mSlotId, RIL_REQUEST_CDMA_GET_BROADCAST_SMS_CONFIG);
1782 return Void();
1783}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001784
1785Return<void> RadioImpl::setCdmaBroadcastConfig(int32_t serial,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001786 const hidl_vec<CdmaBroadcastSmsConfigInfo>&
1787 configInfo) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001788#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001789 RLOGD("setCdmaBroadcastConfig: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001790#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001791 RequestInfo *pRI = android::addRequestToList(serial, mSlotId,
1792 RIL_REQUEST_CDMA_SET_BROADCAST_SMS_CONFIG);
1793 if (pRI == NULL) {
1794 return Void();
1795 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001796
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001797 int num = configInfo.size();
1798 RIL_CDMA_BroadcastSmsConfigInfo cdmaBci[num];
1799 RIL_CDMA_BroadcastSmsConfigInfo *cdmaBciPtrs[num];
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001800
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001801 for (int i = 0 ; i < num ; i++ ) {
1802 cdmaBciPtrs[i] = &cdmaBci[i];
1803 cdmaBci[i].service_category = configInfo[i].serviceCategory;
1804 cdmaBci[i].language = configInfo[i].language;
1805 cdmaBci[i].selected = BOOL_TO_INT(configInfo[i].selected);
1806 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001807
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001808 s_vendorFunctions->onRequest(pRI->pCI->requestNumber, cdmaBciPtrs,
1809 num * sizeof(RIL_CDMA_BroadcastSmsConfigInfo *), pRI);
1810 return Void();
1811}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001812
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001813Return<void> RadioImpl::setCdmaBroadcastActivation(int32_t serial, bool activate) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001814#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001815 RLOGD("setCdmaBroadcastActivation: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001816#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001817 dispatchInts(serial, mSlotId, RIL_REQUEST_CDMA_SMS_BROADCAST_ACTIVATION,
Sanket Padawe0de29d12017-02-10 13:19:47 -08001818 1, BOOL_TO_INT(!activate));
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001819 return Void();
1820}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001821
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001822Return<void> RadioImpl::getCDMASubscription(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001823#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001824 RLOGD("getCDMASubscription: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001825#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001826 dispatchVoid(serial, mSlotId, RIL_REQUEST_CDMA_SUBSCRIPTION);
1827 return Void();
1828}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001829
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001830Return<void> RadioImpl::writeSmsToRuim(int32_t serial, const CdmaSmsWriteArgs& cdmaSms) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001831#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001832 RLOGD("writeSmsToRuim: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001833#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001834 RequestInfo *pRI = android::addRequestToList(serial, mSlotId,
1835 RIL_REQUEST_CDMA_WRITE_SMS_TO_RUIM);
1836 if (pRI == NULL) {
1837 return Void();
1838 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001839
Jack Yuf68e0da2017-02-07 14:53:09 -08001840 RIL_CDMA_SMS_WriteArgs rcsw = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001841 rcsw.status = (int) cdmaSms.status;
1842 constructCdmaSms(rcsw.message, cdmaSms.message);
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001843
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001844 s_vendorFunctions->onRequest(pRI->pCI->requestNumber, &rcsw, sizeof(rcsw), pRI);
1845 return Void();
1846}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001847
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001848Return<void> RadioImpl::deleteSmsOnRuim(int32_t serial, int32_t index) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001849#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001850 RLOGD("deleteSmsOnRuim: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001851#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001852 dispatchInts(serial, mSlotId, RIL_REQUEST_CDMA_DELETE_SMS_ON_RUIM, 1, index);
1853 return Void();
1854}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001855
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001856Return<void> RadioImpl::getDeviceIdentity(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001857#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001858 RLOGD("getDeviceIdentity: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001859#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001860 dispatchVoid(serial, mSlotId, RIL_REQUEST_DEVICE_IDENTITY);
1861 return Void();
1862}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001863
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001864Return<void> RadioImpl::exitEmergencyCallbackMode(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001865#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001866 RLOGD("exitEmergencyCallbackMode: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001867#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001868 dispatchVoid(serial, mSlotId, RIL_REQUEST_EXIT_EMERGENCY_CALLBACK_MODE);
1869 return Void();
1870}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001871
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001872Return<void> RadioImpl::getSmscAddress(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001873#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001874 RLOGD("getSmscAddress: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001875#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001876 dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_SMSC_ADDRESS);
1877 return Void();
1878}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001879
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001880Return<void> RadioImpl::setSmscAddress(int32_t serial, const hidl_string& smsc) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001881#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001882 RLOGD("setSmscAddress: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001883#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001884 dispatchString(serial, mSlotId, RIL_REQUEST_SET_SMSC_ADDRESS,
Scott Randolphc7213312017-04-03 14:06:40 -07001885 smsc.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001886 return Void();
1887}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001888
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001889Return<void> RadioImpl::reportSmsMemoryStatus(int32_t serial, bool available) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001890#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001891 RLOGD("reportSmsMemoryStatus: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001892#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001893 dispatchInts(serial, mSlotId, RIL_REQUEST_REPORT_SMS_MEMORY_STATUS, 1,
1894 BOOL_TO_INT(available));
1895 return Void();
1896}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001897
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001898Return<void> RadioImpl::reportStkServiceIsRunning(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001899#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001900 RLOGD("reportStkServiceIsRunning: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001901#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001902 dispatchVoid(serial, mSlotId, RIL_REQUEST_REPORT_STK_SERVICE_IS_RUNNING);
1903 return Void();
1904}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001905
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001906Return<void> RadioImpl::getCdmaSubscriptionSource(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001907#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001908 RLOGD("getCdmaSubscriptionSource: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001909#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001910 dispatchVoid(serial, mSlotId, RIL_REQUEST_CDMA_GET_SUBSCRIPTION_SOURCE);
1911 return Void();
1912}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001913
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001914Return<void> RadioImpl::requestIsimAuthentication(int32_t serial, const hidl_string& challenge) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001915#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001916 RLOGD("requestIsimAuthentication: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001917#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001918 dispatchString(serial, mSlotId, RIL_REQUEST_ISIM_AUTHENTICATION,
Scott Randolphc7213312017-04-03 14:06:40 -07001919 challenge.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001920 return Void();
1921}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001922
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001923Return<void> RadioImpl::acknowledgeIncomingGsmSmsWithPdu(int32_t serial, bool success,
1924 const hidl_string& ackPdu) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001925#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001926 RLOGD("acknowledgeIncomingGsmSmsWithPdu: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001927#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001928 dispatchStrings(serial, mSlotId, RIL_REQUEST_ACKNOWLEDGE_INCOMING_GSM_SMS_WITH_PDU,
Scott Randolphc7213312017-04-03 14:06:40 -07001929 2, success ? "1" : "0", ackPdu.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001930 return Void();
1931}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001932
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001933Return<void> RadioImpl::sendEnvelopeWithStatus(int32_t serial, const hidl_string& contents) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001934#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001935 RLOGD("sendEnvelopeWithStatus: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001936#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001937 dispatchString(serial, mSlotId, RIL_REQUEST_STK_SEND_ENVELOPE_WITH_STATUS,
Scott Randolphc7213312017-04-03 14:06:40 -07001938 contents.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001939 return Void();
1940}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001941
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001942Return<void> RadioImpl::getVoiceRadioTechnology(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001943#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001944 RLOGD("getVoiceRadioTechnology: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001945#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001946 dispatchVoid(serial, mSlotId, RIL_REQUEST_VOICE_RADIO_TECH);
1947 return Void();
1948}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001949
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001950Return<void> RadioImpl::getCellInfoList(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001951#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001952 RLOGD("getCellInfoList: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001953#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001954 dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_CELL_INFO_LIST);
1955 return Void();
1956}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001957
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001958Return<void> RadioImpl::setCellInfoListRate(int32_t serial, int32_t rate) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001959#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001960 RLOGD("setCellInfoListRate: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001961#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001962 dispatchInts(serial, mSlotId, RIL_REQUEST_SET_UNSOL_CELL_INFO_LIST_RATE, 1, rate);
1963 return Void();
1964}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001965
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001966Return<void> RadioImpl::setInitialAttachApn(int32_t serial, const DataProfileInfo& dataProfileInfo,
Jack Yuffc06452017-02-13 11:21:00 -08001967 bool modemCognitive, bool isRoaming) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001968#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001969 RLOGD("setInitialAttachApn: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001970#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001971 RequestInfo *pRI = android::addRequestToList(serial, mSlotId,
1972 RIL_REQUEST_SET_INITIAL_ATTACH_APN);
1973 if (pRI == NULL) {
1974 return Void();
1975 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001976
Jack Yuffc06452017-02-13 11:21:00 -08001977 if (s_vendorFunctions->version <= 14) {
1978 RIL_InitialAttachApn iaa = {};
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001979
Jack Yuffc06452017-02-13 11:21:00 -08001980 if (!copyHidlStringToRil(&iaa.apn, dataProfileInfo.apn, pRI)) {
1981 return Void();
1982 }
1983
1984 const hidl_string &protocol =
1985 (isRoaming ? dataProfileInfo.roamingProtocol : dataProfileInfo.protocol);
1986
1987 if (!copyHidlStringToRil(&iaa.protocol, protocol, pRI)) {
Jack Yu8e732d42017-04-14 00:08:06 -07001988 memsetAndFreeStrings(1, iaa.apn);
Jack Yuffc06452017-02-13 11:21:00 -08001989 return Void();
1990 }
1991 iaa.authtype = (int) dataProfileInfo.authType;
1992 if (!copyHidlStringToRil(&iaa.username, dataProfileInfo.user, pRI)) {
Jack Yu8e732d42017-04-14 00:08:06 -07001993 memsetAndFreeStrings(2, iaa.apn, iaa.protocol);
Jack Yuffc06452017-02-13 11:21:00 -08001994 return Void();
1995 }
1996 if (!copyHidlStringToRil(&iaa.password, dataProfileInfo.password, pRI)) {
Jack Yu8e732d42017-04-14 00:08:06 -07001997 memsetAndFreeStrings(3, iaa.apn, iaa.protocol, iaa.username);
Jack Yuffc06452017-02-13 11:21:00 -08001998 return Void();
1999 }
2000
2001 s_vendorFunctions->onRequest(RIL_REQUEST_SET_INITIAL_ATTACH_APN, &iaa, sizeof(iaa), pRI);
2002
2003 memsetAndFreeStrings(4, iaa.apn, iaa.protocol, iaa.username, iaa.password);
2004 } else {
2005 RIL_InitialAttachApn_v15 iaa = {};
2006
2007 if (!copyHidlStringToRil(&iaa.apn, dataProfileInfo.apn, pRI)) {
2008 return Void();
2009 }
2010 if (!copyHidlStringToRil(&iaa.protocol, dataProfileInfo.protocol, pRI)) {
Jack Yu8e732d42017-04-14 00:08:06 -07002011 memsetAndFreeStrings(1, iaa.apn);
Jack Yuffc06452017-02-13 11:21:00 -08002012 return Void();
2013 }
2014 if (!copyHidlStringToRil(&iaa.roamingProtocol, dataProfileInfo.roamingProtocol, pRI)) {
Jack Yu8e732d42017-04-14 00:08:06 -07002015 memsetAndFreeStrings(2, iaa.apn, iaa.protocol);
Jack Yuffc06452017-02-13 11:21:00 -08002016 return Void();
2017 }
2018 iaa.authtype = (int) dataProfileInfo.authType;
2019 if (!copyHidlStringToRil(&iaa.username, dataProfileInfo.user, pRI)) {
Jack Yu8e732d42017-04-14 00:08:06 -07002020 memsetAndFreeStrings(3, iaa.apn, iaa.protocol, iaa.roamingProtocol);
Jack Yuffc06452017-02-13 11:21:00 -08002021 return Void();
2022 }
2023 if (!copyHidlStringToRil(&iaa.password, dataProfileInfo.password, pRI)) {
Jack Yu8e732d42017-04-14 00:08:06 -07002024 memsetAndFreeStrings(4, iaa.apn, iaa.protocol, iaa.roamingProtocol, iaa.username);
Jack Yuffc06452017-02-13 11:21:00 -08002025 return Void();
2026 }
2027 iaa.supportedTypesBitmask = dataProfileInfo.supportedApnTypesBitmap;
2028 iaa.bearerBitmask = dataProfileInfo.bearerBitmap;
2029 iaa.modemCognitive = BOOL_TO_INT(modemCognitive);
2030 iaa.mtu = dataProfileInfo.mtu;
2031
Jack Yuc13645e2017-04-13 20:55:03 -07002032 if (!convertMvnoTypeToString(dataProfileInfo.mvnoType, iaa.mvnoType)) {
Jack Yuffc06452017-02-13 11:21:00 -08002033 sendErrorResponse(pRI, RIL_E_INVALID_ARGUMENTS);
Jack Yu8e732d42017-04-14 00:08:06 -07002034 memsetAndFreeStrings(5, iaa.apn, iaa.protocol, iaa.roamingProtocol, iaa.username,
2035 iaa.password);
Jack Yuffc06452017-02-13 11:21:00 -08002036 return Void();
2037 }
2038
2039 if (!copyHidlStringToRil(&iaa.mvnoMatchData, dataProfileInfo.mvnoMatchData, pRI)) {
Jack Yu8e732d42017-04-14 00:08:06 -07002040 memsetAndFreeStrings(5, iaa.apn, iaa.protocol, iaa.roamingProtocol, iaa.username,
2041 iaa.password);
Jack Yuffc06452017-02-13 11:21:00 -08002042 return Void();
2043 }
2044
2045 s_vendorFunctions->onRequest(RIL_REQUEST_SET_INITIAL_ATTACH_APN, &iaa, sizeof(iaa), pRI);
2046
2047 memsetAndFreeStrings(6, iaa.apn, iaa.protocol, iaa.roamingProtocol, iaa.username,
2048 iaa.password, iaa.mvnoMatchData);
2049 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002050
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002051 return Void();
2052}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002053
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002054Return<void> RadioImpl::getImsRegistrationState(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002055#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002056 RLOGD("getImsRegistrationState: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002057#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002058 dispatchVoid(serial, mSlotId, RIL_REQUEST_IMS_REGISTRATION_STATE);
2059 return Void();
2060}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002061
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002062bool dispatchImsGsmSms(const ImsSmsMessage& message, RequestInfo *pRI) {
Jack Yuf68e0da2017-02-07 14:53:09 -08002063 RIL_IMS_SMS_Message rism = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002064 char **pStrings;
2065 int countStrings = 2;
2066 int dataLen = sizeof(char *) * countStrings;
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002067
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002068 rism.tech = RADIO_TECH_3GPP;
2069 rism.retry = BOOL_TO_INT(message.retry);
2070 rism.messageRef = message.messageRef;
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002071
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002072 if (message.gsmMessage.size() != 1) {
2073 RLOGE("dispatchImsGsmSms: Invalid len %s", requestToString(pRI->pCI->requestNumber));
Jack Yuffc06452017-02-13 11:21:00 -08002074 sendErrorResponse(pRI, RIL_E_INVALID_ARGUMENTS);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002075 return false;
2076 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002077
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002078 pStrings = (char **)calloc(countStrings, sizeof(char *));
2079 if (pStrings == NULL) {
2080 RLOGE("dispatchImsGsmSms: Memory allocation failed for request %s",
2081 requestToString(pRI->pCI->requestNumber));
Jack Yuffc06452017-02-13 11:21:00 -08002082 sendErrorResponse(pRI, RIL_E_NO_MEMORY);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002083 return false;
2084 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002085
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002086 if (!copyHidlStringToRil(&pStrings[0], message.gsmMessage[0].smscPdu, pRI)) {
2087#ifdef MEMSET_FREED
Jack Yub4295a42017-04-14 12:51:49 -07002088 memset(pStrings, 0, dataLen);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002089#endif
2090 free(pStrings);
2091 return false;
2092 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002093
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002094 if (!copyHidlStringToRil(&pStrings[1], message.gsmMessage[0].pdu, pRI)) {
2095 memsetAndFreeStrings(1, pStrings[0]);
2096#ifdef MEMSET_FREED
Jack Yub4295a42017-04-14 12:51:49 -07002097 memset(pStrings, 0, dataLen);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002098#endif
2099 free(pStrings);
2100 return false;
2101 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002102
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002103 rism.message.gsmMessage = pStrings;
2104 s_vendorFunctions->onRequest(pRI->pCI->requestNumber, &rism, sizeof(RIL_RadioTechnologyFamily) +
2105 sizeof(uint8_t) + sizeof(int32_t) + dataLen, pRI);
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002106
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002107 for (int i = 0 ; i < countStrings ; i++) {
2108 memsetAndFreeStrings(1, pStrings[i]);
2109 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002110
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002111#ifdef MEMSET_FREED
Jack Yub4295a42017-04-14 12:51:49 -07002112 memset(pStrings, 0, dataLen);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002113#endif
2114 free(pStrings);
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002115
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002116 return true;
2117}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002118
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002119bool dispatchImsCdmaSms(const ImsSmsMessage& message, RequestInfo *pRI) {
Jack Yu8e732d42017-04-14 00:08:06 -07002120 RIL_IMS_SMS_Message rism = {};
2121 RIL_CDMA_SMS_Message rcsm = {};
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002122
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002123 if (message.cdmaMessage.size() != 1) {
2124 RLOGE("dispatchImsCdmaSms: Invalid len %s", requestToString(pRI->pCI->requestNumber));
Jack Yuffc06452017-02-13 11:21:00 -08002125 sendErrorResponse(pRI, RIL_E_INVALID_ARGUMENTS);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002126 return false;
2127 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002128
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002129 rism.tech = RADIO_TECH_3GPP2;
2130 rism.retry = BOOL_TO_INT(message.retry);
2131 rism.messageRef = message.messageRef;
2132 rism.message.cdmaMessage = &rcsm;
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002133
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002134 constructCdmaSms(rcsm, message.cdmaMessage[0]);
2135
2136 s_vendorFunctions->onRequest(pRI->pCI->requestNumber, &rism, sizeof(RIL_RadioTechnologyFamily) +
2137 sizeof(uint8_t) + sizeof(int32_t) + sizeof(rcsm), pRI);
2138
2139 return true;
2140}
2141
2142Return<void> RadioImpl::sendImsSms(int32_t serial, const ImsSmsMessage& message) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002143#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002144 RLOGD("sendImsSms: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002145#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002146 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_IMS_SEND_SMS);
2147 if (pRI == NULL) {
2148 return Void();
2149 }
2150
2151 RIL_RadioTechnologyFamily format = (RIL_RadioTechnologyFamily) message.tech;
2152
2153 if (RADIO_TECH_3GPP == format) {
2154 dispatchImsGsmSms(message, pRI);
2155 } else if (RADIO_TECH_3GPP2 == format) {
2156 dispatchImsCdmaSms(message, pRI);
2157 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08002158 RLOGE("sendImsSms: Invalid radio tech %s",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002159 requestToString(pRI->pCI->requestNumber));
Jack Yuffc06452017-02-13 11:21:00 -08002160 sendErrorResponse(pRI, RIL_E_INVALID_ARGUMENTS);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002161 }
2162 return Void();
2163}
2164
2165Return<void> RadioImpl::iccTransmitApduBasicChannel(int32_t serial, const SimApdu& message) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002166#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002167 RLOGD("iccTransmitApduBasicChannel: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002168#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002169 dispatchIccApdu(serial, mSlotId, RIL_REQUEST_SIM_TRANSMIT_APDU_BASIC, message);
2170 return Void();
2171}
2172
Wileen Chiu410b7562015-11-23 14:25:22 -08002173Return<void> RadioImpl::iccOpenLogicalChannel(int32_t serial, const hidl_string& aid, int32_t p2) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002174#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002175 RLOGD("iccOpenLogicalChannel: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002176#endif
Wileen Chiu410b7562015-11-23 14:25:22 -08002177 if (s_vendorFunctions->version < 15) {
2178 dispatchString(serial, mSlotId, RIL_REQUEST_SIM_OPEN_CHANNEL, aid.c_str());
2179 } else {
2180 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_SIM_OPEN_CHANNEL);
2181 if (pRI == NULL) {
2182 return Void();
2183 }
2184
Jack Yu8e732d42017-04-14 00:08:06 -07002185 RIL_OpenChannelParams params = {};
Wileen Chiu410b7562015-11-23 14:25:22 -08002186
2187 params.p2 = p2;
2188
2189 if (!copyHidlStringToRil(&params.aidPtr, aid, pRI)) {
2190 return Void();
2191 }
2192
2193 s_vendorFunctions->onRequest(pRI->pCI->requestNumber, &params, sizeof(params), pRI);
2194
2195 memsetAndFreeStrings(1, params.aidPtr);
2196 }
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002197 return Void();
2198}
2199
2200Return<void> RadioImpl::iccCloseLogicalChannel(int32_t serial, int32_t channelId) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002201#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002202 RLOGD("iccCloseLogicalChannel: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002203#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002204 dispatchInts(serial, mSlotId, RIL_REQUEST_SIM_CLOSE_CHANNEL, 1, channelId);
2205 return Void();
2206}
2207
2208Return<void> RadioImpl::iccTransmitApduLogicalChannel(int32_t serial, const SimApdu& message) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002209#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002210 RLOGD("iccTransmitApduLogicalChannel: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002211#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002212 dispatchIccApdu(serial, mSlotId, RIL_REQUEST_SIM_TRANSMIT_APDU_CHANNEL, message);
2213 return Void();
2214}
2215
2216Return<void> RadioImpl::nvReadItem(int32_t serial, NvItem itemId) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002217#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002218 RLOGD("nvReadItem: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002219#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002220 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_NV_READ_ITEM);
2221 if (pRI == NULL) {
2222 return Void();
2223 }
2224
Jack Yu8e732d42017-04-14 00:08:06 -07002225 RIL_NV_ReadItem nvri = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002226 nvri.itemID = (RIL_NV_Item) itemId;
2227
2228 s_vendorFunctions->onRequest(pRI->pCI->requestNumber, &nvri, sizeof(nvri), pRI);
2229 return Void();
2230}
2231
2232Return<void> RadioImpl::nvWriteItem(int32_t serial, const NvWriteItem& item) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002233#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002234 RLOGD("nvWriteItem: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002235#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002236 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_NV_WRITE_ITEM);
2237 if (pRI == NULL) {
2238 return Void();
2239 }
2240
Jack Yu8e732d42017-04-14 00:08:06 -07002241 RIL_NV_WriteItem nvwi = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002242
2243 nvwi.itemID = (RIL_NV_Item) item.itemId;
2244
2245 if (!copyHidlStringToRil(&nvwi.value, item.value, pRI)) {
2246 return Void();
2247 }
2248
2249 s_vendorFunctions->onRequest(pRI->pCI->requestNumber, &nvwi, sizeof(nvwi), pRI);
2250
2251 memsetAndFreeStrings(1, nvwi.value);
2252 return Void();
2253}
2254
2255Return<void> RadioImpl::nvWriteCdmaPrl(int32_t serial, const hidl_vec<uint8_t>& prl) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002256#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002257 RLOGD("nvWriteCdmaPrl: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002258#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002259 dispatchRaw(serial, mSlotId, RIL_REQUEST_NV_WRITE_CDMA_PRL, prl);
2260 return Void();
2261}
2262
2263Return<void> RadioImpl::nvResetConfig(int32_t serial, ResetNvType resetType) {
Jayachandran C32763f02017-04-30 10:21:14 -07002264 int rilResetType = -1;
Jayachandran C572f2f42017-03-25 14:30:13 -07002265#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002266 RLOGD("nvResetConfig: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002267#endif
Jayachandran C32763f02017-04-30 10:21:14 -07002268 /* Convert ResetNvType to RIL.h values
2269 * RIL_REQUEST_NV_RESET_CONFIG
2270 * 1 - reload all NV items
2271 * 2 - erase NV reset (SCRTN)
2272 * 3 - factory reset (RTN)
2273 */
2274 switch(resetType) {
2275 case ResetNvType::RELOAD:
2276 rilResetType = 1;
2277 break;
2278 case ResetNvType::ERASE:
2279 rilResetType = 2;
2280 break;
2281 case ResetNvType::FACTORY_RESET:
2282 rilResetType = 3;
2283 break;
2284 }
2285 dispatchInts(serial, mSlotId, RIL_REQUEST_NV_RESET_CONFIG, 1, rilResetType);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002286 return Void();
2287}
2288
2289Return<void> RadioImpl::setUiccSubscription(int32_t serial, const SelectUiccSub& uiccSub) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002290#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002291 RLOGD("setUiccSubscription: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002292#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002293 RequestInfo *pRI = android::addRequestToList(serial, mSlotId,
2294 RIL_REQUEST_SET_UICC_SUBSCRIPTION);
2295 if (pRI == NULL) {
2296 return Void();
2297 }
2298
Jack Yuf68e0da2017-02-07 14:53:09 -08002299 RIL_SelectUiccSub rilUiccSub = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002300
2301 rilUiccSub.slot = uiccSub.slot;
2302 rilUiccSub.app_index = uiccSub.appIndex;
2303 rilUiccSub.sub_type = (RIL_SubscriptionType) uiccSub.subType;
2304 rilUiccSub.act_status = (RIL_UiccSubActStatus) uiccSub.actStatus;
2305
2306 s_vendorFunctions->onRequest(pRI->pCI->requestNumber, &rilUiccSub, sizeof(rilUiccSub), pRI);
2307 return Void();
2308}
2309
2310Return<void> RadioImpl::setDataAllowed(int32_t serial, bool allow) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002311#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002312 RLOGD("setDataAllowed: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002313#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002314 dispatchInts(serial, mSlotId, RIL_REQUEST_ALLOW_DATA, 1, BOOL_TO_INT(allow));
2315 return Void();
2316}
2317
2318Return<void> RadioImpl::getHardwareConfig(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002319#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002320 RLOGD("getHardwareConfig: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002321#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002322 dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_HARDWARE_CONFIG);
2323 return Void();
2324}
2325
2326Return<void> RadioImpl::requestIccSimAuthentication(int32_t serial, int32_t authContext,
2327 const hidl_string& authData, const hidl_string& aid) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002328#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002329 RLOGD("requestIccSimAuthentication: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002330#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002331 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_SIM_AUTHENTICATION);
2332 if (pRI == NULL) {
2333 return Void();
2334 }
2335
Jack Yu8e732d42017-04-14 00:08:06 -07002336 RIL_SimAuthentication pf = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002337
2338 pf.authContext = authContext;
2339
2340 int len;
2341 if (!copyHidlStringToRil(&pf.authData, authData, pRI)) {
2342 return Void();
2343 }
2344
2345 if (!copyHidlStringToRil(&pf.aid, aid, pRI)) {
2346 memsetAndFreeStrings(1, pf.authData);
2347 return Void();
2348 }
2349
2350 s_vendorFunctions->onRequest(pRI->pCI->requestNumber, &pf, sizeof(pf), pRI);
2351
2352 memsetAndFreeStrings(2, pf.authData, pf.aid);
2353 return Void();
2354}
2355
2356/**
Jack Yuffc06452017-02-13 11:21:00 -08002357 * @param numProfiles number of data profile
2358 * @param dataProfiles the pointer to the actual data profiles. The acceptable type is
2359 RIL_DataProfileInfo or RIL_DataProfileInfo_v15.
2360 * @param dataProfilePtrs the pointer to the pointers that point to each data profile structure
2361 * @param numfields number of string-type member in the data profile structure
2362 * @param ... the variadic parameters are pointers to each string-type member
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002363 **/
Jack Yuffc06452017-02-13 11:21:00 -08002364template <typename T>
2365void freeSetDataProfileData(int numProfiles, T *dataProfiles, T **dataProfilePtrs,
2366 int numfields, ...) {
2367 va_list args;
2368 va_start(args, numfields);
2369
2370 // Iterate through each string-type field that need to be free.
2371 for (int i = 0; i < numfields; i++) {
2372 // Iterate through each data profile and free that specific string-type field.
2373 // The type 'char *T::*' is a type of pointer to a 'char *' member inside T structure.
2374 char *T::*ptr = va_arg(args, char *T::*);
2375 for (int j = 0; j < numProfiles; j++) {
2376 memsetAndFreeStrings(1, dataProfiles[j].*ptr);
2377 }
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002378 }
2379
Jack Yuffc06452017-02-13 11:21:00 -08002380 va_end(args);
2381
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002382#ifdef MEMSET_FREED
Jack Yuffc06452017-02-13 11:21:00 -08002383 memset(dataProfiles, 0, numProfiles * sizeof(T));
2384 memset(dataProfilePtrs, 0, numProfiles * sizeof(T *));
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002385#endif
2386 free(dataProfiles);
2387 free(dataProfilePtrs);
2388}
2389
Jack Yuffc06452017-02-13 11:21:00 -08002390Return<void> RadioImpl::setDataProfile(int32_t serial, const hidl_vec<DataProfileInfo>& profiles,
2391 bool isRoaming) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002392#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002393 RLOGD("setDataProfile: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002394#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002395 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_SET_DATA_PROFILE);
2396 if (pRI == NULL) {
2397 return Void();
2398 }
2399
Jack Yuffc06452017-02-13 11:21:00 -08002400 size_t num = profiles.size();
2401 bool success = false;
2402
2403 if (s_vendorFunctions->version <= 14) {
2404
2405 RIL_DataProfileInfo *dataProfiles =
2406 (RIL_DataProfileInfo *) calloc(num, sizeof(RIL_DataProfileInfo));
2407
2408 if (dataProfiles == NULL) {
2409 RLOGE("Memory allocation failed for request %s",
2410 requestToString(pRI->pCI->requestNumber));
2411 sendErrorResponse(pRI, RIL_E_NO_MEMORY);
2412 return Void();
2413 }
2414
2415 RIL_DataProfileInfo **dataProfilePtrs =
2416 (RIL_DataProfileInfo **) calloc(num, sizeof(RIL_DataProfileInfo *));
2417 if (dataProfilePtrs == NULL) {
2418 RLOGE("Memory allocation failed for request %s",
2419 requestToString(pRI->pCI->requestNumber));
2420 free(dataProfiles);
2421 sendErrorResponse(pRI, RIL_E_NO_MEMORY);
2422 return Void();
2423 }
2424
2425 for (size_t i = 0; i < num; i++) {
2426 dataProfilePtrs[i] = &dataProfiles[i];
2427
2428 success = copyHidlStringToRil(&dataProfiles[i].apn, profiles[i].apn, pRI);
2429
2430 const hidl_string &protocol =
2431 (isRoaming ? profiles[i].roamingProtocol : profiles[i].protocol);
2432
2433 if (success && !copyHidlStringToRil(&dataProfiles[i].protocol, protocol, pRI)) {
2434 success = false;
2435 }
2436
2437 if (success && !copyHidlStringToRil(&dataProfiles[i].user, profiles[i].user, pRI)) {
2438 success = false;
2439 }
2440 if (success && !copyHidlStringToRil(&dataProfiles[i].password, profiles[i].password,
2441 pRI)) {
2442 success = false;
2443 }
2444
2445 if (!success) {
2446 freeSetDataProfileData(num, dataProfiles, dataProfilePtrs, 4,
2447 &RIL_DataProfileInfo::apn, &RIL_DataProfileInfo::protocol,
2448 &RIL_DataProfileInfo::user, &RIL_DataProfileInfo::password);
2449 return Void();
2450 }
2451
2452 dataProfiles[i].profileId = (RIL_DataProfile) profiles[i].profileId;
2453 dataProfiles[i].authType = (int) profiles[i].authType;
2454 dataProfiles[i].type = (int) profiles[i].type;
2455 dataProfiles[i].maxConnsTime = profiles[i].maxConnsTime;
2456 dataProfiles[i].maxConns = profiles[i].maxConns;
2457 dataProfiles[i].waitTime = profiles[i].waitTime;
2458 dataProfiles[i].enabled = BOOL_TO_INT(profiles[i].enabled);
2459 }
2460
2461 s_vendorFunctions->onRequest(RIL_REQUEST_SET_DATA_PROFILE, dataProfilePtrs,
2462 num * sizeof(RIL_DataProfileInfo *), pRI);
2463
2464 freeSetDataProfileData(num, dataProfiles, dataProfilePtrs, 4,
2465 &RIL_DataProfileInfo::apn, &RIL_DataProfileInfo::protocol,
2466 &RIL_DataProfileInfo::user, &RIL_DataProfileInfo::password);
2467 } else {
2468 RIL_DataProfileInfo_v15 *dataProfiles =
2469 (RIL_DataProfileInfo_v15 *) calloc(num, sizeof(RIL_DataProfileInfo_v15));
2470
2471 if (dataProfiles == NULL) {
2472 RLOGE("Memory allocation failed for request %s",
2473 requestToString(pRI->pCI->requestNumber));
2474 sendErrorResponse(pRI, RIL_E_NO_MEMORY);
2475 return Void();
2476 }
2477
2478 RIL_DataProfileInfo_v15 **dataProfilePtrs =
2479 (RIL_DataProfileInfo_v15 **) calloc(num, sizeof(RIL_DataProfileInfo_v15 *));
2480 if (dataProfilePtrs == NULL) {
2481 RLOGE("Memory allocation failed for request %s",
2482 requestToString(pRI->pCI->requestNumber));
2483 free(dataProfiles);
2484 sendErrorResponse(pRI, RIL_E_NO_MEMORY);
2485 return Void();
2486 }
2487
2488 for (size_t i = 0; i < num; i++) {
2489 dataProfilePtrs[i] = &dataProfiles[i];
2490
2491 success = copyHidlStringToRil(&dataProfiles[i].apn, profiles[i].apn, pRI);
2492 if (success && !copyHidlStringToRil(&dataProfiles[i].protocol, profiles[i].protocol,
2493 pRI)) {
2494 success = false;
2495 }
2496 if (success && !copyHidlStringToRil(&dataProfiles[i].roamingProtocol,
2497 profiles[i].roamingProtocol, pRI)) {
2498 success = false;
2499 }
2500 if (success && !copyHidlStringToRil(&dataProfiles[i].user, profiles[i].user, pRI)) {
2501 success = false;
2502 }
2503 if (success && !copyHidlStringToRil(&dataProfiles[i].password, profiles[i].password,
2504 pRI)) {
2505 success = false;
2506 }
2507
2508 if (success && !copyHidlStringToRil(&dataProfiles[i].mvnoMatchData,
2509 profiles[i].mvnoMatchData, pRI)) {
2510 success = false;
2511 }
2512
Jack Yuc13645e2017-04-13 20:55:03 -07002513 if (success && !convertMvnoTypeToString(profiles[i].mvnoType,
2514 dataProfiles[i].mvnoType)) {
2515 sendErrorResponse(pRI, RIL_E_INVALID_ARGUMENTS);
2516 success = false;
Jack Yuffc06452017-02-13 11:21:00 -08002517 }
2518
2519 if (!success) {
2520 freeSetDataProfileData(num, dataProfiles, dataProfilePtrs, 6,
2521 &RIL_DataProfileInfo_v15::apn, &RIL_DataProfileInfo_v15::protocol,
2522 &RIL_DataProfileInfo_v15::roamingProtocol, &RIL_DataProfileInfo_v15::user,
2523 &RIL_DataProfileInfo_v15::password, &RIL_DataProfileInfo_v15::mvnoMatchData);
2524 return Void();
2525 }
2526
2527 dataProfiles[i].profileId = (RIL_DataProfile) profiles[i].profileId;
2528 dataProfiles[i].authType = (int) profiles[i].authType;
2529 dataProfiles[i].type = (int) profiles[i].type;
2530 dataProfiles[i].maxConnsTime = profiles[i].maxConnsTime;
2531 dataProfiles[i].maxConns = profiles[i].maxConns;
2532 dataProfiles[i].waitTime = profiles[i].waitTime;
2533 dataProfiles[i].enabled = BOOL_TO_INT(profiles[i].enabled);
2534 dataProfiles[i].supportedTypesBitmask = profiles[i].supportedApnTypesBitmap;
2535 dataProfiles[i].bearerBitmask = profiles[i].bearerBitmap;
2536 dataProfiles[i].mtu = profiles[i].mtu;
2537 }
2538
2539 s_vendorFunctions->onRequest(RIL_REQUEST_SET_DATA_PROFILE, dataProfilePtrs,
2540 num * sizeof(RIL_DataProfileInfo_v15 *), pRI);
2541
2542 freeSetDataProfileData(num, dataProfiles, dataProfilePtrs, 6,
2543 &RIL_DataProfileInfo_v15::apn, &RIL_DataProfileInfo_v15::protocol,
2544 &RIL_DataProfileInfo_v15::roamingProtocol, &RIL_DataProfileInfo_v15::user,
2545 &RIL_DataProfileInfo_v15::password, &RIL_DataProfileInfo_v15::mvnoMatchData);
2546 }
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002547
2548 return Void();
2549}
2550
2551Return<void> RadioImpl::requestShutdown(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002552#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002553 RLOGD("requestShutdown: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002554#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002555 dispatchVoid(serial, mSlotId, RIL_REQUEST_SHUTDOWN);
2556 return Void();
2557}
2558
2559Return<void> RadioImpl::getRadioCapability(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002560#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002561 RLOGD("getRadioCapability: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002562#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002563 dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_RADIO_CAPABILITY);
2564 return Void();
2565}
2566
2567Return<void> RadioImpl::setRadioCapability(int32_t serial, const RadioCapability& rc) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002568#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002569 RLOGD("setRadioCapability: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002570#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002571 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_SET_RADIO_CAPABILITY);
2572 if (pRI == NULL) {
2573 return Void();
2574 }
2575
Jack Yu8e732d42017-04-14 00:08:06 -07002576 RIL_RadioCapability rilRc = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002577
2578 // TODO : set rilRc.version using HIDL version ?
2579 rilRc.session = rc.session;
2580 rilRc.phase = (int) rc.phase;
2581 rilRc.rat = (int) rc.raf;
2582 rilRc.status = (int) rc.status;
Scott Randolphc7213312017-04-03 14:06:40 -07002583 strncpy(rilRc.logicalModemUuid, rc.logicalModemUuid.c_str(), MAX_UUID_LENGTH);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002584
2585 s_vendorFunctions->onRequest(pRI->pCI->requestNumber, &rilRc, sizeof(rilRc), pRI);
2586
2587 return Void();
2588}
2589
2590Return<void> RadioImpl::startLceService(int32_t serial, int32_t reportInterval, bool pullMode) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002591#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002592 RLOGD("startLceService: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002593#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002594 dispatchInts(serial, mSlotId, RIL_REQUEST_START_LCE, 2, reportInterval,
2595 BOOL_TO_INT(pullMode));
2596 return Void();
2597}
2598
2599Return<void> RadioImpl::stopLceService(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002600#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002601 RLOGD("stopLceService: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002602#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002603 dispatchVoid(serial, mSlotId, RIL_REQUEST_STOP_LCE);
2604 return Void();
2605}
2606
2607Return<void> RadioImpl::pullLceData(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002608#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002609 RLOGD("pullLceData: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002610#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002611 dispatchVoid(serial, mSlotId, RIL_REQUEST_PULL_LCEDATA);
2612 return Void();
2613}
2614
2615Return<void> RadioImpl::getModemActivityInfo(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002616#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002617 RLOGD("getModemActivityInfo: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002618#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002619 dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_ACTIVITY_INFO);
2620 return Void();
2621}
2622
2623Return<void> RadioImpl::setAllowedCarriers(int32_t serial, bool allAllowed,
2624 const CarrierRestrictions& carriers) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002625#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002626 RLOGD("setAllowedCarriers: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002627#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002628 RequestInfo *pRI = android::addRequestToList(serial, mSlotId,
2629 RIL_REQUEST_SET_CARRIER_RESTRICTIONS);
2630 if (pRI == NULL) {
2631 return Void();
2632 }
2633
Jack Yuf68e0da2017-02-07 14:53:09 -08002634 RIL_CarrierRestrictions cr = {};
Jack Yu11ab4042017-02-21 17:08:01 -08002635 RIL_Carrier *allowedCarriers = NULL;
2636 RIL_Carrier *excludedCarriers = NULL;
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002637
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002638 cr.len_allowed_carriers = carriers.allowedCarriers.size();
2639 allowedCarriers = (RIL_Carrier *)calloc(cr.len_allowed_carriers, sizeof(RIL_Carrier));
2640 if (allowedCarriers == NULL) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08002641 RLOGE("setAllowedCarriers: Memory allocation failed for request %s",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002642 requestToString(pRI->pCI->requestNumber));
Jack Yuffc06452017-02-13 11:21:00 -08002643 sendErrorResponse(pRI, RIL_E_NO_MEMORY);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002644 return Void();
2645 }
2646 cr.allowed_carriers = allowedCarriers;
2647
2648 cr.len_excluded_carriers = carriers.excludedCarriers.size();
2649 excludedCarriers = (RIL_Carrier *)calloc(cr.len_excluded_carriers, sizeof(RIL_Carrier));
2650 if (excludedCarriers == NULL) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08002651 RLOGE("setAllowedCarriers: Memory allocation failed for request %s",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002652 requestToString(pRI->pCI->requestNumber));
Jack Yuffc06452017-02-13 11:21:00 -08002653 sendErrorResponse(pRI, RIL_E_NO_MEMORY);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002654#ifdef MEMSET_FREED
2655 memset(allowedCarriers, 0, cr.len_allowed_carriers * sizeof(RIL_Carrier));
2656#endif
2657 free(allowedCarriers);
2658 return Void();
2659 }
2660 cr.excluded_carriers = excludedCarriers;
2661
2662 for (int i = 0; i < cr.len_allowed_carriers; i++) {
Scott Randolphc7213312017-04-03 14:06:40 -07002663 allowedCarriers[i].mcc = carriers.allowedCarriers[i].mcc.c_str();
2664 allowedCarriers[i].mnc = carriers.allowedCarriers[i].mnc.c_str();
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002665 allowedCarriers[i].match_type = (RIL_CarrierMatchType) carriers.allowedCarriers[i].matchType;
Scott Randolphc7213312017-04-03 14:06:40 -07002666 allowedCarriers[i].match_data = carriers.allowedCarriers[i].matchData.c_str();
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002667 }
2668
Amit Mahajan3f510f62017-03-01 10:26:58 -08002669 for (int i = 0; i < cr.len_excluded_carriers; i++) {
Scott Randolphc7213312017-04-03 14:06:40 -07002670 excludedCarriers[i].mcc = carriers.excludedCarriers[i].mcc.c_str();
2671 excludedCarriers[i].mnc = carriers.excludedCarriers[i].mnc.c_str();
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002672 excludedCarriers[i].match_type =
2673 (RIL_CarrierMatchType) carriers.excludedCarriers[i].matchType;
Scott Randolphc7213312017-04-03 14:06:40 -07002674 excludedCarriers[i].match_data = carriers.excludedCarriers[i].matchData.c_str();
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002675 }
2676
2677 s_vendorFunctions->onRequest(pRI->pCI->requestNumber, &cr, sizeof(RIL_CarrierRestrictions), pRI);
2678
2679#ifdef MEMSET_FREED
2680 memset(allowedCarriers, 0, cr.len_allowed_carriers * sizeof(RIL_Carrier));
2681 memset(excludedCarriers, 0, cr.len_excluded_carriers * sizeof(RIL_Carrier));
2682#endif
2683 free(allowedCarriers);
2684 free(excludedCarriers);
2685 return Void();
2686}
2687
2688Return<void> RadioImpl::getAllowedCarriers(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002689#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002690 RLOGD("getAllowedCarriers: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002691#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002692 dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_CARRIER_RESTRICTIONS);
2693 return Void();
2694}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002695
Jack Yu11ab4042017-02-21 17:08:01 -08002696Return<void> RadioImpl::sendDeviceState(int32_t serial, DeviceStateType deviceStateType,
2697 bool state) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002698#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002699 RLOGD("sendDeviceState: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002700#endif
Jack Yu11ab4042017-02-21 17:08:01 -08002701 if (s_vendorFunctions->version < 15) {
2702 if (deviceStateType == DeviceStateType::LOW_DATA_EXPECTED) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08002703 RLOGD("sendDeviceState: calling screen state %d", BOOL_TO_INT(!state));
Jack Yu11ab4042017-02-21 17:08:01 -08002704 dispatchInts(serial, mSlotId, RIL_REQUEST_SCREEN_STATE, 1, BOOL_TO_INT(!state));
2705 } else {
2706 RequestInfo *pRI = android::addRequestToList(serial, mSlotId,
2707 RIL_REQUEST_SEND_DEVICE_STATE);
2708 sendErrorResponse(pRI, RIL_E_REQUEST_NOT_SUPPORTED);
2709 }
2710 return Void();
2711 }
2712 dispatchInts(serial, mSlotId, RIL_REQUEST_SEND_DEVICE_STATE, 2, (int) deviceStateType,
2713 BOOL_TO_INT(state));
2714 return Void();
2715}
2716
2717Return<void> RadioImpl::setIndicationFilter(int32_t serial, int32_t indicationFilter) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002718#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002719 RLOGD("setIndicationFilter: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002720#endif
Jack Yu11ab4042017-02-21 17:08:01 -08002721 if (s_vendorFunctions->version < 15) {
2722 RequestInfo *pRI = android::addRequestToList(serial, mSlotId,
2723 RIL_REQUEST_SET_UNSOLICITED_RESPONSE_FILTER);
2724 sendErrorResponse(pRI, RIL_E_REQUEST_NOT_SUPPORTED);
2725 return Void();
2726 }
2727 dispatchInts(serial, mSlotId, RIL_REQUEST_SET_UNSOLICITED_RESPONSE_FILTER, 1, indicationFilter);
2728 return Void();
2729}
2730
Wileen Chiu718c0bf2017-01-04 11:37:19 -08002731Return<void> RadioImpl::setSimCardPower(int32_t serial, bool powerUp) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002732#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002733 RLOGD("setSimCardPower: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002734#endif
Wileen Chiu718c0bf2017-01-04 11:37:19 -08002735 dispatchInts(serial, mSlotId, RIL_REQUEST_SET_SIM_CARD_POWER, 1, BOOL_TO_INT(powerUp));
2736 return Void();
2737}
2738
Grace Chen797c1c22017-03-23 18:39:48 -07002739Return<void> RadioImpl::setSimCardPower_1_1(int32_t serial,
2740 const ::android::hardware::radio::V1_1::CardPowerState state) {
2741#if VDBG
2742 RLOGD("setSimCardPower_1_1: serial %d state %d", serial, state);
2743#endif
2744 dispatchInts(serial, mSlotId, RIL_REQUEST_SET_SIM_CARD_POWER, 1, state);
2745 return Void();
2746}
2747
Sanket Padawef220dc52017-01-02 23:46:00 -08002748Return<void> RadioImpl::responseAcknowledgement() {
2749 android::releaseWakeLock();
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002750 return Void();
Sanket Padawef220dc52017-01-02 23:46:00 -08002751}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002752
Amit Mahajan439da362017-02-13 17:43:04 -08002753Return<void> OemHookImpl::setResponseFunctions(
2754 const ::android::sp<IOemHookResponse>& oemHookResponseParam,
2755 const ::android::sp<IOemHookIndication>& oemHookIndicationParam) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002756#if VDBG
Amit Mahajan439da362017-02-13 17:43:04 -08002757 RLOGD("OemHookImpl::setResponseFunctions");
Jayachandran C572f2f42017-03-25 14:30:13 -07002758#endif
Amit Mahajan439da362017-02-13 17:43:04 -08002759
2760 pthread_rwlock_t *radioServiceRwlockPtr = radio::getRadioServiceRwlock(mSlotId);
2761 int ret = pthread_rwlock_wrlock(radioServiceRwlockPtr);
2762 assert(ret == 0);
2763
2764 mOemHookResponse = oemHookResponseParam;
2765 mOemHookIndication = oemHookIndicationParam;
Amit Mahajand423d192017-03-16 17:04:01 -07002766 mCounterOemHook[mSlotId]++;
Amit Mahajan439da362017-02-13 17:43:04 -08002767
2768 ret = pthread_rwlock_unlock(radioServiceRwlockPtr);
2769 assert(ret == 0);
2770
2771 return Void();
2772}
2773
2774Return<void> OemHookImpl::sendRequestRaw(int32_t serial, const hidl_vec<uint8_t>& data) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002775#if VDBG
Amit Mahajan439da362017-02-13 17:43:04 -08002776 RLOGD("OemHookImpl::sendRequestRaw: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002777#endif
Amit Mahajan439da362017-02-13 17:43:04 -08002778 dispatchRaw(serial, mSlotId, RIL_REQUEST_OEM_HOOK_RAW, data);
2779 return Void();
2780}
2781
2782Return<void> OemHookImpl::sendRequestStrings(int32_t serial,
2783 const hidl_vec<hidl_string>& data) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002784#if VDBG
Amit Mahajan439da362017-02-13 17:43:04 -08002785 RLOGD("OemHookImpl::sendRequestStrings: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002786#endif
Amit Mahajan439da362017-02-13 17:43:04 -08002787 dispatchStrings(serial, mSlotId, RIL_REQUEST_OEM_HOOK_STRINGS, data);
2788 return Void();
2789}
2790
pkanwarc61837e2017-03-17 12:49:34 -07002791Return<void> RadioImpl::setCarrierInfoForImsiEncryption(int32_t serial,
2792 const ::android::hardware::hidl_vec<uint8_t>& carrierKey,
2793 const hidl_string& keyIdentifier) {
2794 RLOGD("setCarrierInfoForImsiEncryption: serial %d", serial);
2795 dispatchRaw(serial, mSlotId, RIL_REQUEST_SET_CARRIER_INFO_IMSI_ENCRYPTION, carrierKey);
2796 return Void();
2797}
2798
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002799/***************************************************************************************************
2800 * RESPONSE FUNCTIONS
2801 * Functions above are used for requests going from framework to vendor code. The ones below are
2802 * responses for those requests coming back from the vendor code.
2803 **************************************************************************************************/
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002804
Sanket Padawef220dc52017-01-02 23:46:00 -08002805void radio::acknowledgeRequest(int slotId, int serial) {
2806 if (radioService[slotId]->mRadioResponse != NULL) {
Amit Mahajan17249842017-01-19 15:05:45 -08002807 Return<void> retStatus = radioService[slotId]->mRadioResponse->acknowledgeRequest(serial);
2808 radioService[slotId]->checkReturnStatus(retStatus);
Sanket Padawef220dc52017-01-02 23:46:00 -08002809 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08002810 RLOGE("acknowledgeRequest: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawef220dc52017-01-02 23:46:00 -08002811 }
2812}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002813
Sanket Padawef220dc52017-01-02 23:46:00 -08002814void populateResponseInfo(RadioResponseInfo& responseInfo, int serial, int responseType,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002815 RIL_Errno e) {
Sanket Padawef220dc52017-01-02 23:46:00 -08002816 responseInfo.serial = serial;
2817 switch (responseType) {
2818 case RESPONSE_SOLICITED:
2819 responseInfo.type = RadioResponseType::SOLICITED;
2820 break;
2821 case RESPONSE_SOLICITED_ACK_EXP:
2822 responseInfo.type = RadioResponseType::SOLICITED_ACK_EXP;
2823 break;
2824 }
2825 responseInfo.error = (RadioError) e;
2826}
2827
Naveen Kalla346bbc02017-03-16 12:55:55 -07002828int responseIntOrEmpty(RadioResponseInfo& responseInfo, int serial, int responseType, RIL_Errno e,
2829 void *response, size_t responseLen) {
2830 populateResponseInfo(responseInfo, serial, responseType, e);
2831 int ret = -1;
2832
2833 if (response == NULL && responseLen == 0) {
2834 // Earlier RILs did not send a response for some cases although the interface
2835 // expected an integer as response. Do not return error if response is empty. Instead
2836 // Return -1 in those cases to maintain backward compatibility.
2837 } else if (response == NULL || responseLen != sizeof(int)) {
2838 RLOGE("responseIntOrEmpty: Invalid response");
2839 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
2840 } else {
2841 int *p_int = (int *) response;
2842 ret = p_int[0];
2843 }
2844 return ret;
2845}
2846
Sanket Padawef220dc52017-01-02 23:46:00 -08002847int responseInt(RadioResponseInfo& responseInfo, int serial, int responseType, RIL_Errno e,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002848 void *response, size_t responseLen) {
Sanket Padawef220dc52017-01-02 23:46:00 -08002849 populateResponseInfo(responseInfo, serial, responseType, e);
2850 int ret = -1;
2851
2852 if (response == NULL || responseLen != sizeof(int)) {
2853 RLOGE("responseInt: Invalid response");
2854 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
2855 } else {
2856 int *p_int = (int *) response;
2857 ret = p_int[0];
2858 }
2859 return ret;
2860}
2861
Amit Mahajan759786a2017-03-03 17:35:47 -08002862int radio::getIccCardStatusResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002863 int responseType, int serial, RIL_Errno e,
2864 void *response, size_t responseLen) {
Sanket Padawef220dc52017-01-02 23:46:00 -08002865 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08002866 RadioResponseInfo responseInfo = {};
Sanket Padawef220dc52017-01-02 23:46:00 -08002867 populateResponseInfo(responseInfo, serial, responseType, e);
Jack Yuf68e0da2017-02-07 14:53:09 -08002868 CardStatus cardStatus = {};
Nathan Harold402dc022017-06-08 16:41:52 -07002869 RIL_CardStatus_v6 *p_cur = ((RIL_CardStatus_v6 *) response);
2870 if (response == NULL || responseLen != sizeof(RIL_CardStatus_v6)
2871 || p_cur->gsm_umts_subscription_app_index >= p_cur->num_applications
2872 || p_cur->cdma_subscription_app_index >= p_cur->num_applications
2873 || p_cur->ims_subscription_app_index >= p_cur->num_applications) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08002874 RLOGE("getIccCardStatusResponse: Invalid response");
Sanket Padawef220dc52017-01-02 23:46:00 -08002875 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002876 } else {
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002877 cardStatus.cardState = (CardState) p_cur->card_state;
2878 cardStatus.universalPinState = (PinState) p_cur->universal_pin_state;
2879 cardStatus.gsmUmtsSubscriptionAppIndex = p_cur->gsm_umts_subscription_app_index;
2880 cardStatus.cdmaSubscriptionAppIndex = p_cur->cdma_subscription_app_index;
2881 cardStatus.imsSubscriptionAppIndex = p_cur->ims_subscription_app_index;
2882
2883 RIL_AppStatus *rilAppStatus = p_cur->applications;
2884 cardStatus.applications.resize(p_cur->num_applications);
2885 AppStatus *appStatus = cardStatus.applications.data();
Jayachandran C572f2f42017-03-25 14:30:13 -07002886#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002887 RLOGD("getIccCardStatusResponse: num_applications %d", p_cur->num_applications);
Jayachandran C572f2f42017-03-25 14:30:13 -07002888#endif
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002889 for (int i = 0; i < p_cur->num_applications; i++) {
2890 appStatus[i].appType = (AppType) rilAppStatus[i].app_type;
2891 appStatus[i].appState = (AppState) rilAppStatus[i].app_state;
2892 appStatus[i].persoSubstate = (PersoSubstate) rilAppStatus[i].perso_substate;
2893 appStatus[i].aidPtr = convertCharPtrToHidlString(rilAppStatus[i].aid_ptr);
2894 appStatus[i].appLabelPtr = convertCharPtrToHidlString(
2895 rilAppStatus[i].app_label_ptr);
2896 appStatus[i].pin1Replaced = rilAppStatus[i].pin1_replaced;
2897 appStatus[i].pin1 = (PinState) rilAppStatus[i].pin1;
2898 appStatus[i].pin2 = (PinState) rilAppStatus[i].pin2;
2899 }
2900 }
2901
Amit Mahajan17249842017-01-19 15:05:45 -08002902 Return<void> retStatus = radioService[slotId]->mRadioResponse->
2903 getIccCardStatusResponse(responseInfo, cardStatus);
2904 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002905 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08002906 RLOGE("getIccCardStatusResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawef220dc52017-01-02 23:46:00 -08002907 }
2908
2909 return 0;
2910}
2911
Amit Mahajan759786a2017-03-03 17:35:47 -08002912int radio::supplyIccPinForAppResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002913 int responseType, int serial, RIL_Errno e,
2914 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002915#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002916 RLOGD("supplyIccPinForAppResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002917#endif
Sanket Padawef220dc52017-01-02 23:46:00 -08002918
2919 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08002920 RadioResponseInfo responseInfo = {};
Naveen Kalla346bbc02017-03-16 12:55:55 -07002921 int ret = responseIntOrEmpty(responseInfo, serial, responseType, e, response, responseLen);
Amit Mahajan17249842017-01-19 15:05:45 -08002922 Return<void> retStatus = radioService[slotId]->mRadioResponse->
2923 supplyIccPinForAppResponse(responseInfo, ret);
2924 radioService[slotId]->checkReturnStatus(retStatus);
Sanket Padawef220dc52017-01-02 23:46:00 -08002925 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08002926 RLOGE("supplyIccPinForAppResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawef220dc52017-01-02 23:46:00 -08002927 slotId);
2928 }
2929
2930 return 0;
2931}
2932
Amit Mahajan759786a2017-03-03 17:35:47 -08002933int radio::supplyIccPukForAppResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002934 int responseType, int serial, RIL_Errno e,
2935 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002936#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002937 RLOGD("supplyIccPukForAppResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002938#endif
Sanket Padawef220dc52017-01-02 23:46:00 -08002939
2940 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08002941 RadioResponseInfo responseInfo = {};
Naveen Kalla346bbc02017-03-16 12:55:55 -07002942 int ret = responseIntOrEmpty(responseInfo, serial, responseType, e, response, responseLen);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002943 Return<void> retStatus = radioService[slotId]->mRadioResponse->supplyIccPukForAppResponse(
2944 responseInfo, ret);
Amit Mahajan17249842017-01-19 15:05:45 -08002945 radioService[slotId]->checkReturnStatus(retStatus);
Sanket Padawef220dc52017-01-02 23:46:00 -08002946 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08002947 RLOGE("supplyIccPukForAppResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawef220dc52017-01-02 23:46:00 -08002948 slotId);
2949 }
2950
2951 return 0;
2952}
2953
Amit Mahajan759786a2017-03-03 17:35:47 -08002954int radio::supplyIccPin2ForAppResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002955 int responseType, int serial, RIL_Errno e,
2956 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002957#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002958 RLOGD("supplyIccPin2ForAppResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002959#endif
Sanket Padawef220dc52017-01-02 23:46:00 -08002960
2961 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08002962 RadioResponseInfo responseInfo = {};
Naveen Kalla346bbc02017-03-16 12:55:55 -07002963 int ret = responseIntOrEmpty(responseInfo, serial, responseType, e, response, responseLen);
Amit Mahajan17249842017-01-19 15:05:45 -08002964 Return<void> retStatus = radioService[slotId]->mRadioResponse->
2965 supplyIccPin2ForAppResponse(responseInfo, ret);
2966 radioService[slotId]->checkReturnStatus(retStatus);
Sanket Padawef220dc52017-01-02 23:46:00 -08002967 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08002968 RLOGE("supplyIccPin2ForAppResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawef220dc52017-01-02 23:46:00 -08002969 slotId);
2970 }
2971
2972 return 0;
2973}
2974
Amit Mahajan759786a2017-03-03 17:35:47 -08002975int radio::supplyIccPuk2ForAppResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002976 int responseType, int serial, RIL_Errno e,
2977 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002978#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002979 RLOGD("supplyIccPuk2ForAppResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002980#endif
Sanket Padawef220dc52017-01-02 23:46:00 -08002981
2982 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08002983 RadioResponseInfo responseInfo = {};
Naveen Kalla346bbc02017-03-16 12:55:55 -07002984 int ret = responseIntOrEmpty(responseInfo, serial, responseType, e, response, responseLen);
Amit Mahajan17249842017-01-19 15:05:45 -08002985 Return<void> retStatus = radioService[slotId]->mRadioResponse->
2986 supplyIccPuk2ForAppResponse(responseInfo, ret);
2987 radioService[slotId]->checkReturnStatus(retStatus);
Sanket Padawef220dc52017-01-02 23:46:00 -08002988 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08002989 RLOGE("supplyIccPuk2ForAppResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawef220dc52017-01-02 23:46:00 -08002990 slotId);
2991 }
2992
2993 return 0;
2994}
2995
Amit Mahajan759786a2017-03-03 17:35:47 -08002996int radio::changeIccPinForAppResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002997 int responseType, int serial, RIL_Errno e,
2998 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002999#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003000 RLOGD("changeIccPinForAppResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003001#endif
Sanket Padawef220dc52017-01-02 23:46:00 -08003002
3003 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003004 RadioResponseInfo responseInfo = {};
Naveen Kalla346bbc02017-03-16 12:55:55 -07003005 int ret = responseIntOrEmpty(responseInfo, serial, responseType, e, response, responseLen);
Amit Mahajan17249842017-01-19 15:05:45 -08003006 Return<void> retStatus = radioService[slotId]->mRadioResponse->
3007 changeIccPinForAppResponse(responseInfo, ret);
3008 radioService[slotId]->checkReturnStatus(retStatus);
Sanket Padawef220dc52017-01-02 23:46:00 -08003009 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003010 RLOGE("changeIccPinForAppResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawef220dc52017-01-02 23:46:00 -08003011 slotId);
3012 }
3013
3014 return 0;
3015}
3016
Amit Mahajan759786a2017-03-03 17:35:47 -08003017int radio::changeIccPin2ForAppResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003018 int responseType, int serial, RIL_Errno e,
3019 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003020#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003021 RLOGD("changeIccPin2ForAppResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003022#endif
Sanket Padawef220dc52017-01-02 23:46:00 -08003023
3024 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003025 RadioResponseInfo responseInfo = {};
Naveen Kalla346bbc02017-03-16 12:55:55 -07003026 int ret = responseIntOrEmpty(responseInfo, serial, responseType, e, response, responseLen);
Amit Mahajan17249842017-01-19 15:05:45 -08003027 Return<void> retStatus = radioService[slotId]->mRadioResponse->
3028 changeIccPin2ForAppResponse(responseInfo, ret);
3029 radioService[slotId]->checkReturnStatus(retStatus);
Sanket Padawef220dc52017-01-02 23:46:00 -08003030 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003031 RLOGE("changeIccPin2ForAppResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawef220dc52017-01-02 23:46:00 -08003032 slotId);
3033 }
3034
3035 return 0;
3036}
3037
Amit Mahajan759786a2017-03-03 17:35:47 -08003038int radio::supplyNetworkDepersonalizationResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003039 int responseType, int serial, RIL_Errno e,
3040 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003041#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003042 RLOGD("supplyNetworkDepersonalizationResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003043#endif
Sanket Padawef220dc52017-01-02 23:46:00 -08003044
3045 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003046 RadioResponseInfo responseInfo = {};
Naveen Kalla346bbc02017-03-16 12:55:55 -07003047 int ret = responseIntOrEmpty(responseInfo, serial, responseType, e, response, responseLen);
Amit Mahajan17249842017-01-19 15:05:45 -08003048 Return<void> retStatus = radioService[slotId]->mRadioResponse->
3049 supplyNetworkDepersonalizationResponse(responseInfo, ret);
3050 radioService[slotId]->checkReturnStatus(retStatus);
Sanket Padawef220dc52017-01-02 23:46:00 -08003051 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003052 RLOGE("supplyNetworkDepersonalizationResponse: radioService[%d]->mRadioResponse == "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003053 "NULL", slotId);
Sanket Padawef220dc52017-01-02 23:46:00 -08003054 }
3055
3056 return 0;
3057}
3058
Amit Mahajan759786a2017-03-03 17:35:47 -08003059int radio::getCurrentCallsResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003060 int responseType, int serial, RIL_Errno e,
3061 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003062#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003063 RLOGD("getCurrentCallsResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003064#endif
Sanket Padawef220dc52017-01-02 23:46:00 -08003065
3066 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003067 RadioResponseInfo responseInfo = {};
Sanket Padawef220dc52017-01-02 23:46:00 -08003068 populateResponseInfo(responseInfo, serial, responseType, e);
3069
3070 hidl_vec<Call> calls;
3071 if (response == NULL || (responseLen % sizeof(RIL_Call *)) != 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003072 RLOGE("getCurrentCallsResponse: Invalid response");
Amit Mahajan5829a472016-12-28 17:28:07 -08003073 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
Sanket Padawef220dc52017-01-02 23:46:00 -08003074 } else {
3075 int num = responseLen / sizeof(RIL_Call *);
3076 calls.resize(num);
3077
3078 for (int i = 0 ; i < num ; i++) {
3079 RIL_Call *p_cur = ((RIL_Call **) response)[i];
3080 /* each call info */
3081 calls[i].state = (CallState) p_cur->state;
3082 calls[i].index = p_cur->index;
3083 calls[i].toa = p_cur->toa;
3084 calls[i].isMpty = p_cur->isMpty;
3085 calls[i].isMT = p_cur->isMT;
3086 calls[i].als = p_cur->als;
3087 calls[i].isVoice = p_cur->isVoice;
3088 calls[i].isVoicePrivacy = p_cur->isVoicePrivacy;
3089 calls[i].number = convertCharPtrToHidlString(p_cur->number);
3090 calls[i].numberPresentation = (CallPresentation) p_cur->numberPresentation;
3091 calls[i].name = convertCharPtrToHidlString(p_cur->name);
3092 calls[i].namePresentation = (CallPresentation) p_cur->namePresentation;
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003093 if (p_cur->uusInfo != NULL && p_cur->uusInfo->uusData != NULL) {
Sanket Padawef220dc52017-01-02 23:46:00 -08003094 RIL_UUS_Info *uusInfo = p_cur->uusInfo;
3095 calls[i].uusInfo[0].uusType = (UusType) uusInfo->uusType;
3096 calls[i].uusInfo[0].uusDcs = (UusDcs) uusInfo->uusDcs;
3097 // convert uusInfo->uusData to a null-terminated string
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003098 char *nullTermStr = strndup(uusInfo->uusData, uusInfo->uusLength);
3099 calls[i].uusInfo[0].uusData = nullTermStr;
3100 free(nullTermStr);
Sanket Padawef220dc52017-01-02 23:46:00 -08003101 }
3102 }
3103 }
3104
Amit Mahajan17249842017-01-19 15:05:45 -08003105 Return<void> retStatus = radioService[slotId]->mRadioResponse->
3106 getCurrentCallsResponse(responseInfo, calls);
3107 radioService[slotId]->checkReturnStatus(retStatus);
Sanket Padawef220dc52017-01-02 23:46:00 -08003108 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003109 RLOGE("getCurrentCallsResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawef220dc52017-01-02 23:46:00 -08003110 }
3111
3112 return 0;
3113}
3114
Amit Mahajan759786a2017-03-03 17:35:47 -08003115int radio::dialResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003116 int responseType, int serial, RIL_Errno e, void *response,
3117 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003118#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003119 RLOGD("dialResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003120#endif
Sanket Padawef220dc52017-01-02 23:46:00 -08003121
3122 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003123 RadioResponseInfo responseInfo = {};
Sanket Padawef220dc52017-01-02 23:46:00 -08003124 populateResponseInfo(responseInfo, serial, responseType, e);
Amit Mahajan17249842017-01-19 15:05:45 -08003125 Return<void> retStatus = radioService[slotId]->mRadioResponse->dialResponse(responseInfo);
3126 radioService[slotId]->checkReturnStatus(retStatus);
Sanket Padawef220dc52017-01-02 23:46:00 -08003127 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003128 RLOGE("dialResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Amit Mahajancd77a5b2016-08-25 11:19:21 -07003129 }
3130
3131 return 0;
3132}
3133
Amit Mahajan759786a2017-03-03 17:35:47 -08003134int radio::getIMSIForAppResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003135 int responseType, int serial, RIL_Errno e, void *response,
3136 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003137#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003138 RLOGD("getIMSIForAppResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003139#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003140
3141 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003142 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003143 populateResponseInfo(responseInfo, serial, responseType, e);
3144 Return<void> retStatus = radioService[slotId]->mRadioResponse->getIMSIForAppResponse(
3145 responseInfo, convertCharPtrToHidlString((char *) response));
3146 radioService[slotId]->checkReturnStatus(retStatus);
3147 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003148 RLOGE("getIMSIForAppResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003149 slotId);
3150 }
3151
3152 return 0;
3153}
3154
Amit Mahajan759786a2017-03-03 17:35:47 -08003155int radio::hangupConnectionResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003156 int responseType, int serial, RIL_Errno e,
3157 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003158#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003159 RLOGD("hangupConnectionResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003160#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003161
3162 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003163 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003164 populateResponseInfo(responseInfo, serial, responseType, e);
3165 Return<void> retStatus = radioService[slotId]->mRadioResponse->hangupConnectionResponse(
3166 responseInfo);
3167 radioService[slotId]->checkReturnStatus(retStatus);
3168 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003169 RLOGE("hangupConnectionResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003170 slotId);
3171 }
3172
3173 return 0;
3174}
3175
Amit Mahajan759786a2017-03-03 17:35:47 -08003176int radio::hangupWaitingOrBackgroundResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003177 int responseType, int serial, RIL_Errno e,
3178 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003179#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003180 RLOGD("hangupWaitingOrBackgroundResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003181#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003182
3183 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003184 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003185 populateResponseInfo(responseInfo, serial, responseType, e);
3186 Return<void> retStatus =
3187 radioService[slotId]->mRadioResponse->hangupWaitingOrBackgroundResponse(
3188 responseInfo);
3189 radioService[slotId]->checkReturnStatus(retStatus);
3190 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003191 RLOGE("hangupWaitingOrBackgroundResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003192 slotId);
3193 }
3194
3195 return 0;
3196}
3197
Amit Mahajan759786a2017-03-03 17:35:47 -08003198int radio::hangupForegroundResumeBackgroundResponse(int slotId, int responseType, int serial,
3199 RIL_Errno e, void *response,
3200 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003201#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003202 RLOGD("hangupWaitingOrBackgroundResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003203#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003204
3205 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003206 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003207 populateResponseInfo(responseInfo, serial, responseType, e);
3208 Return<void> retStatus =
3209 radioService[slotId]->mRadioResponse->hangupWaitingOrBackgroundResponse(
3210 responseInfo);
3211 radioService[slotId]->checkReturnStatus(retStatus);
3212 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003213 RLOGE("hangupWaitingOrBackgroundResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003214 slotId);
3215 }
3216
3217 return 0;
3218}
3219
Amit Mahajan759786a2017-03-03 17:35:47 -08003220int radio::switchWaitingOrHoldingAndActiveResponse(int slotId, int responseType, int serial,
3221 RIL_Errno e, void *response,
3222 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003223#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003224 RLOGD("switchWaitingOrHoldingAndActiveResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003225#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003226
3227 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003228 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003229 populateResponseInfo(responseInfo, serial, responseType, e);
3230 Return<void> retStatus =
3231 radioService[slotId]->mRadioResponse->switchWaitingOrHoldingAndActiveResponse(
3232 responseInfo);
3233 radioService[slotId]->checkReturnStatus(retStatus);
3234 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003235 RLOGE("switchWaitingOrHoldingAndActiveResponse: radioService[%d]->mRadioResponse "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003236 "== NULL", slotId);
3237 }
3238
3239 return 0;
3240}
3241
Amit Mahajan759786a2017-03-03 17:35:47 -08003242int radio::conferenceResponse(int slotId, int responseType,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003243 int serial, RIL_Errno e, void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003244#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003245 RLOGD("conferenceResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003246#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003247
3248 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003249 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003250 populateResponseInfo(responseInfo, serial, responseType, e);
3251 Return<void> retStatus = radioService[slotId]->mRadioResponse->conferenceResponse(
3252 responseInfo);
3253 radioService[slotId]->checkReturnStatus(retStatus);
3254 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003255 RLOGE("conferenceResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003256 slotId);
3257 }
3258
3259 return 0;
3260}
3261
Amit Mahajan759786a2017-03-03 17:35:47 -08003262int radio::rejectCallResponse(int slotId, int responseType,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003263 int serial, RIL_Errno e, void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003264#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003265 RLOGD("rejectCallResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003266#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003267
3268 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003269 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003270 populateResponseInfo(responseInfo, serial, responseType, e);
3271 Return<void> retStatus = radioService[slotId]->mRadioResponse->rejectCallResponse(
3272 responseInfo);
3273 radioService[slotId]->checkReturnStatus(retStatus);
3274 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003275 RLOGE("rejectCallResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003276 slotId);
3277 }
3278
3279 return 0;
3280}
3281
Amit Mahajan759786a2017-03-03 17:35:47 -08003282int radio::getLastCallFailCauseResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003283 int responseType, int serial, RIL_Errno e, void *response,
3284 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003285#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003286 RLOGD("getLastCallFailCauseResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003287#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003288
3289 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003290 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003291 populateResponseInfo(responseInfo, serial, responseType, e);
Jack Yuf68e0da2017-02-07 14:53:09 -08003292
3293 LastCallFailCauseInfo info = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003294 info.vendorCause = hidl_string();
3295 if (response == NULL) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003296 RLOGE("getCurrentCallsResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003297 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
3298 } else if (responseLen == sizeof(int)) {
3299 int *pInt = (int *) response;
3300 info.causeCode = (LastCallFailCause) pInt[0];
3301 } else if (responseLen == sizeof(RIL_LastCallFailCauseInfo)) {
3302 RIL_LastCallFailCauseInfo *pFailCauseInfo = (RIL_LastCallFailCauseInfo *) response;
3303 info.causeCode = (LastCallFailCause) pFailCauseInfo->cause_code;
3304 info.vendorCause = convertCharPtrToHidlString(pFailCauseInfo->vendor_cause);
3305 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003306 RLOGE("getCurrentCallsResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003307 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
3308 }
3309
3310 Return<void> retStatus = radioService[slotId]->mRadioResponse->getLastCallFailCauseResponse(
3311 responseInfo, info);
3312 radioService[slotId]->checkReturnStatus(retStatus);
3313 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003314 RLOGE("getLastCallFailCauseResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003315 slotId);
3316 }
3317
3318 return 0;
3319}
3320
Amit Mahajan759786a2017-03-03 17:35:47 -08003321int radio::getSignalStrengthResponse(int slotId,
Amit Mahajan3df62912017-02-10 01:35:55 +00003322 int responseType, int serial, RIL_Errno e,
3323 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003324#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003325 RLOGD("getSignalStrengthResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003326#endif
Amit Mahajan3df62912017-02-10 01:35:55 +00003327
3328 if (radioService[slotId]->mRadioResponse != NULL) {
Amit Mahajan3da9ac02017-02-13 13:41:28 -08003329 RadioResponseInfo responseInfo = {};
Amit Mahajan3df62912017-02-10 01:35:55 +00003330 populateResponseInfo(responseInfo, serial, responseType, e);
Amit Mahajan3da9ac02017-02-13 13:41:28 -08003331 SignalStrength signalStrength = {};
Amit Mahajan3df62912017-02-10 01:35:55 +00003332 if (response == NULL || responseLen != sizeof(RIL_SignalStrength_v10)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003333 RLOGE("getSignalStrengthResponse: Invalid response");
Amit Mahajan3df62912017-02-10 01:35:55 +00003334 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
3335 } else {
3336 convertRilSignalStrengthToHal(response, responseLen, signalStrength);
3337 }
3338
3339 Return<void> retStatus = radioService[slotId]->mRadioResponse->getSignalStrengthResponse(
3340 responseInfo, signalStrength);
3341 radioService[slotId]->checkReturnStatus(retStatus);
3342 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003343 RLOGE("getSignalStrengthResponse: radioService[%d]->mRadioResponse == NULL",
Amit Mahajan3df62912017-02-10 01:35:55 +00003344 slotId);
3345 }
3346
3347 return 0;
3348}
3349
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003350RIL_CellInfoType getCellInfoTypeRadioTechnology(char *rat) {
3351 if (rat == NULL) {
3352 return RIL_CELL_INFO_TYPE_NONE;
3353 }
3354
3355 int radioTech = atoi(rat);
3356
3357 switch(radioTech) {
3358
3359 case RADIO_TECH_GPRS:
3360 case RADIO_TECH_EDGE:
3361 case RADIO_TECH_GSM: {
3362 return RIL_CELL_INFO_TYPE_GSM;
3363 }
3364
3365 case RADIO_TECH_UMTS:
3366 case RADIO_TECH_HSDPA:
3367 case RADIO_TECH_HSUPA:
3368 case RADIO_TECH_HSPA:
3369 case RADIO_TECH_HSPAP: {
3370 return RIL_CELL_INFO_TYPE_WCDMA;
3371 }
3372
3373 case RADIO_TECH_IS95A:
3374 case RADIO_TECH_IS95B:
3375 case RADIO_TECH_1xRTT:
3376 case RADIO_TECH_EVDO_0:
3377 case RADIO_TECH_EVDO_A:
3378 case RADIO_TECH_EVDO_B:
3379 case RADIO_TECH_EHRPD: {
3380 return RIL_CELL_INFO_TYPE_CDMA;
3381 }
3382
3383 case RADIO_TECH_LTE:
3384 case RADIO_TECH_LTE_CA: {
3385 return RIL_CELL_INFO_TYPE_LTE;
3386 }
3387
3388 case RADIO_TECH_TD_SCDMA: {
3389 return RIL_CELL_INFO_TYPE_TD_SCDMA;
3390 }
3391
3392 default: {
3393 break;
3394 }
3395 }
3396
3397 return RIL_CELL_INFO_TYPE_NONE;
3398
3399}
3400
3401void fillCellIdentityResponse(CellIdentity &cellIdentity, RIL_CellIdentity_v16 &rilCellIdentity) {
3402
3403 cellIdentity.cellIdentityGsm.resize(0);
3404 cellIdentity.cellIdentityWcdma.resize(0);
3405 cellIdentity.cellIdentityCdma.resize(0);
3406 cellIdentity.cellIdentityTdscdma.resize(0);
3407 cellIdentity.cellIdentityLte.resize(0);
3408 cellIdentity.cellInfoType = (CellInfoType)rilCellIdentity.cellInfoType;
3409 switch(rilCellIdentity.cellInfoType) {
3410
3411 case RIL_CELL_INFO_TYPE_GSM: {
3412 cellIdentity.cellIdentityGsm.resize(1);
3413 cellIdentity.cellIdentityGsm[0].mcc =
3414 std::to_string(rilCellIdentity.cellIdentityGsm.mcc);
3415 cellIdentity.cellIdentityGsm[0].mnc =
3416 std::to_string(rilCellIdentity.cellIdentityGsm.mnc);
3417 cellIdentity.cellIdentityGsm[0].lac = rilCellIdentity.cellIdentityGsm.lac;
3418 cellIdentity.cellIdentityGsm[0].cid = rilCellIdentity.cellIdentityGsm.cid;
3419 cellIdentity.cellIdentityGsm[0].arfcn = rilCellIdentity.cellIdentityGsm.arfcn;
3420 cellIdentity.cellIdentityGsm[0].bsic = rilCellIdentity.cellIdentityGsm.bsic;
3421 break;
3422 }
3423
3424 case RIL_CELL_INFO_TYPE_WCDMA: {
3425 cellIdentity.cellIdentityWcdma.resize(1);
3426 cellIdentity.cellIdentityWcdma[0].mcc =
3427 std::to_string(rilCellIdentity.cellIdentityWcdma.mcc);
3428 cellIdentity.cellIdentityWcdma[0].mnc =
3429 std::to_string(rilCellIdentity.cellIdentityWcdma.mnc);
3430 cellIdentity.cellIdentityWcdma[0].lac = rilCellIdentity.cellIdentityWcdma.lac;
3431 cellIdentity.cellIdentityWcdma[0].cid = rilCellIdentity.cellIdentityWcdma.cid;
3432 cellIdentity.cellIdentityWcdma[0].psc = rilCellIdentity.cellIdentityWcdma.psc;
3433 cellIdentity.cellIdentityWcdma[0].uarfcn = rilCellIdentity.cellIdentityWcdma.uarfcn;
3434 break;
3435 }
3436
3437 case RIL_CELL_INFO_TYPE_CDMA: {
3438 cellIdentity.cellIdentityCdma.resize(1);
3439 cellIdentity.cellIdentityCdma[0].networkId = rilCellIdentity.cellIdentityCdma.networkId;
3440 cellIdentity.cellIdentityCdma[0].systemId = rilCellIdentity.cellIdentityCdma.systemId;
3441 cellIdentity.cellIdentityCdma[0].baseStationId =
3442 rilCellIdentity.cellIdentityCdma.basestationId;
3443 cellIdentity.cellIdentityCdma[0].longitude = rilCellIdentity.cellIdentityCdma.longitude;
3444 cellIdentity.cellIdentityCdma[0].latitude = rilCellIdentity.cellIdentityCdma.latitude;
3445 break;
3446 }
3447
3448 case RIL_CELL_INFO_TYPE_LTE: {
3449 cellIdentity.cellIdentityLte.resize(1);
3450 cellIdentity.cellIdentityLte[0].mcc =
3451 std::to_string(rilCellIdentity.cellIdentityLte.mcc);
3452 cellIdentity.cellIdentityLte[0].mnc =
3453 std::to_string(rilCellIdentity.cellIdentityLte.mnc);
3454 cellIdentity.cellIdentityLte[0].ci = rilCellIdentity.cellIdentityLte.ci;
3455 cellIdentity.cellIdentityLte[0].pci = rilCellIdentity.cellIdentityLte.pci;
3456 cellIdentity.cellIdentityLte[0].tac = rilCellIdentity.cellIdentityLte.tac;
3457 cellIdentity.cellIdentityLte[0].earfcn = rilCellIdentity.cellIdentityLte.earfcn;
3458 break;
3459 }
3460
3461 case RIL_CELL_INFO_TYPE_TD_SCDMA: {
3462 cellIdentity.cellIdentityTdscdma.resize(1);
3463 cellIdentity.cellIdentityTdscdma[0].mcc =
3464 std::to_string(rilCellIdentity.cellIdentityTdscdma.mcc);
3465 cellIdentity.cellIdentityTdscdma[0].mnc =
3466 std::to_string(rilCellIdentity.cellIdentityTdscdma.mnc);
3467 cellIdentity.cellIdentityTdscdma[0].lac = rilCellIdentity.cellIdentityTdscdma.lac;
3468 cellIdentity.cellIdentityTdscdma[0].cid = rilCellIdentity.cellIdentityTdscdma.cid;
3469 cellIdentity.cellIdentityTdscdma[0].cpid = rilCellIdentity.cellIdentityTdscdma.cpid;
3470 break;
3471 }
3472
3473 default: {
3474 break;
3475 }
3476 }
3477}
3478
3479int convertResponseStringEntryToInt(char **response, int index, int numStrings) {
3480 if ((response != NULL) && (numStrings > index) && (response[index] != NULL)) {
3481 return atoi(response[index]);
3482 }
3483
3484 return -1;
3485}
3486
3487void fillCellIdentityFromVoiceRegStateResponseString(CellIdentity &cellIdentity,
3488 int numStrings, char** response) {
3489
3490 RIL_CellIdentity_v16 rilCellIdentity;
Jack Yu8e732d42017-04-14 00:08:06 -07003491 memset(&rilCellIdentity, -1, sizeof(RIL_CellIdentity_v16));
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003492
3493 rilCellIdentity.cellInfoType = getCellInfoTypeRadioTechnology(response[3]);
3494 switch(rilCellIdentity.cellInfoType) {
3495
3496 case RIL_CELL_INFO_TYPE_GSM: {
3497 rilCellIdentity.cellIdentityGsm.lac =
3498 convertResponseStringEntryToInt(response, 1, numStrings);
3499 rilCellIdentity.cellIdentityGsm.cid =
3500 convertResponseStringEntryToInt(response, 2, numStrings);
3501 break;
3502 }
3503
3504 case RIL_CELL_INFO_TYPE_WCDMA: {
3505 rilCellIdentity.cellIdentityWcdma.lac =
3506 convertResponseStringEntryToInt(response, 1, numStrings);
3507 rilCellIdentity.cellIdentityWcdma.cid =
3508 convertResponseStringEntryToInt(response, 2, numStrings);
3509 rilCellIdentity.cellIdentityWcdma.psc =
3510 convertResponseStringEntryToInt(response, 14, numStrings);
3511 break;
3512 }
3513
3514 case RIL_CELL_INFO_TYPE_TD_SCDMA:{
3515 rilCellIdentity.cellIdentityTdscdma.lac =
3516 convertResponseStringEntryToInt(response, 1, numStrings);
3517 rilCellIdentity.cellIdentityTdscdma.cid =
3518 convertResponseStringEntryToInt(response, 2, numStrings);
3519 break;
3520 }
3521
3522 case RIL_CELL_INFO_TYPE_CDMA:{
3523 rilCellIdentity.cellIdentityCdma.basestationId =
3524 convertResponseStringEntryToInt(response, 4, numStrings);
3525 rilCellIdentity.cellIdentityCdma.longitude =
3526 convertResponseStringEntryToInt(response, 5, numStrings);
3527 rilCellIdentity.cellIdentityCdma.latitude =
3528 convertResponseStringEntryToInt(response, 6, numStrings);
3529 rilCellIdentity.cellIdentityCdma.systemId =
3530 convertResponseStringEntryToInt(response, 8, numStrings);
3531 rilCellIdentity.cellIdentityCdma.networkId =
3532 convertResponseStringEntryToInt(response, 9, numStrings);
3533 break;
3534 }
3535
Sooraj Sasindranf28e42a2017-03-06 23:07:22 -08003536 case RIL_CELL_INFO_TYPE_LTE:{
3537 rilCellIdentity.cellIdentityLte.tac =
3538 convertResponseStringEntryToInt(response, 1, numStrings);
3539 rilCellIdentity.cellIdentityLte.ci =
3540 convertResponseStringEntryToInt(response, 2, numStrings);
3541 break;
3542 }
3543
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003544 default: {
3545 break;
3546 }
3547 }
3548
3549 fillCellIdentityResponse(cellIdentity, rilCellIdentity);
3550}
3551
3552void fillCellIdentityFromDataRegStateResponseString(CellIdentity &cellIdentity,
3553 int numStrings, char** response) {
3554
3555 RIL_CellIdentity_v16 rilCellIdentity;
Jack Yu8e732d42017-04-14 00:08:06 -07003556 memset(&rilCellIdentity, -1, sizeof(RIL_CellIdentity_v16));
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003557
3558 rilCellIdentity.cellInfoType = getCellInfoTypeRadioTechnology(response[3]);
3559 switch(rilCellIdentity.cellInfoType) {
3560 case RIL_CELL_INFO_TYPE_GSM: {
3561 rilCellIdentity.cellIdentityGsm.lac =
3562 convertResponseStringEntryToInt(response, 1, numStrings);
3563 rilCellIdentity.cellIdentityGsm.cid =
3564 convertResponseStringEntryToInt(response, 2, numStrings);
3565 break;
3566 }
3567 case RIL_CELL_INFO_TYPE_WCDMA: {
3568 rilCellIdentity.cellIdentityWcdma.lac =
3569 convertResponseStringEntryToInt(response, 1, numStrings);
3570 rilCellIdentity.cellIdentityWcdma.cid =
3571 convertResponseStringEntryToInt(response, 2, numStrings);
3572 break;
3573 }
3574 case RIL_CELL_INFO_TYPE_TD_SCDMA:{
3575 rilCellIdentity.cellIdentityTdscdma.lac =
3576 convertResponseStringEntryToInt(response, 1, numStrings);
3577 rilCellIdentity.cellIdentityTdscdma.cid =
3578 convertResponseStringEntryToInt(response, 2, numStrings);
3579 break;
3580 }
3581 case RIL_CELL_INFO_TYPE_LTE: {
3582 rilCellIdentity.cellIdentityLte.tac =
3583 convertResponseStringEntryToInt(response, 6, numStrings);
3584 rilCellIdentity.cellIdentityLte.pci =
3585 convertResponseStringEntryToInt(response, 7, numStrings);
3586 rilCellIdentity.cellIdentityLte.ci =
3587 convertResponseStringEntryToInt(response, 8, numStrings);
3588 break;
3589 }
3590 default: {
3591 break;
3592 }
3593 }
3594
3595 fillCellIdentityResponse(cellIdentity, rilCellIdentity);
3596}
3597
Amit Mahajan759786a2017-03-03 17:35:47 -08003598int radio::getVoiceRegistrationStateResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003599 int responseType, int serial, RIL_Errno e,
3600 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003601#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003602 RLOGD("getVoiceRegistrationStateResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003603#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003604
3605 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003606 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003607 populateResponseInfo(responseInfo, serial, responseType, e);
3608
Jack Yuf68e0da2017-02-07 14:53:09 -08003609 VoiceRegStateResult voiceRegResponse = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003610 int numStrings = responseLen / sizeof(char *);
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003611 if (response == NULL) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003612 RLOGE("getVoiceRegistrationStateResponse Invalid response: NULL");
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003613 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
3614 } else if (s_vendorFunctions->version <= 14) {
3615 if (numStrings != 15) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003616 RLOGE("getVoiceRegistrationStateResponse Invalid response: NULL");
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003617 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
3618 } else {
3619 char **resp = (char **) response;
3620 voiceRegResponse.regState = (RegState) ATOI_NULL_HANDLED_DEF(resp[0], 4);
3621 voiceRegResponse.rat = ATOI_NULL_HANDLED(resp[3]);
3622 voiceRegResponse.cssSupported = ATOI_NULL_HANDLED_DEF(resp[7], 0);
3623 voiceRegResponse.roamingIndicator = ATOI_NULL_HANDLED(resp[10]);
3624 voiceRegResponse.systemIsInPrl = ATOI_NULL_HANDLED_DEF(resp[11], 0);
3625 voiceRegResponse.defaultRoamingIndicator = ATOI_NULL_HANDLED_DEF(resp[12], 0);
3626 voiceRegResponse.reasonForDenial = ATOI_NULL_HANDLED_DEF(resp[13], 0);
3627 fillCellIdentityFromVoiceRegStateResponseString(voiceRegResponse.cellIdentity,
3628 numStrings, resp);
3629 }
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003630 } else {
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003631 RIL_VoiceRegistrationStateResponse *voiceRegState =
3632 (RIL_VoiceRegistrationStateResponse *)response;
3633
3634 if (responseLen != sizeof(RIL_VoiceRegistrationStateResponse)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003635 RLOGE("getVoiceRegistrationStateResponse Invalid response: NULL");
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003636 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
3637 } else {
3638 voiceRegResponse.regState = (RegState) voiceRegState->regState;
3639 voiceRegResponse.rat = voiceRegState->rat;;
3640 voiceRegResponse.cssSupported = voiceRegState->cssSupported;
3641 voiceRegResponse.roamingIndicator = voiceRegState->roamingIndicator;
3642 voiceRegResponse.systemIsInPrl = voiceRegState->systemIsInPrl;
3643 voiceRegResponse.defaultRoamingIndicator = voiceRegState->defaultRoamingIndicator;
3644 voiceRegResponse.reasonForDenial = voiceRegState->reasonForDenial;
3645 fillCellIdentityResponse(voiceRegResponse.cellIdentity,
3646 voiceRegState->cellIdentity);
3647 }
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003648 }
3649
3650 Return<void> retStatus =
3651 radioService[slotId]->mRadioResponse->getVoiceRegistrationStateResponse(
3652 responseInfo, voiceRegResponse);
3653 radioService[slotId]->checkReturnStatus(retStatus);
3654 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003655 RLOGE("getVoiceRegistrationStateResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003656 slotId);
3657 }
3658
3659 return 0;
3660}
3661
Amit Mahajan759786a2017-03-03 17:35:47 -08003662int radio::getDataRegistrationStateResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003663 int responseType, int serial, RIL_Errno e,
3664 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003665#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003666 RLOGD("getDataRegistrationStateResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003667#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003668
3669 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003670 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003671 populateResponseInfo(responseInfo, serial, responseType, e);
Jack Yuf68e0da2017-02-07 14:53:09 -08003672 DataRegStateResult dataRegResponse = {};
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003673 if (response == NULL) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003674 RLOGE("getDataRegistrationStateResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003675 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003676 } else if (s_vendorFunctions->version <= 14) {
3677 int numStrings = responseLen / sizeof(char *);
3678 if ((numStrings != 6) && (numStrings != 11)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003679 RLOGE("getDataRegistrationStateResponse Invalid response: NULL");
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003680 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
3681 } else {
3682 char **resp = (char **) response;
3683 dataRegResponse.regState = (RegState) ATOI_NULL_HANDLED_DEF(resp[0], 4);
3684 dataRegResponse.rat = ATOI_NULL_HANDLED_DEF(resp[3], 0);
3685 dataRegResponse.reasonDataDenied = ATOI_NULL_HANDLED(resp[4]);
3686 dataRegResponse.maxDataCalls = ATOI_NULL_HANDLED_DEF(resp[5], 1);
3687 fillCellIdentityFromDataRegStateResponseString(dataRegResponse.cellIdentity,
3688 numStrings, resp);
3689 }
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003690 } else {
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003691 RIL_DataRegistrationStateResponse *dataRegState =
3692 (RIL_DataRegistrationStateResponse *)response;
3693
3694 if (responseLen != sizeof(RIL_DataRegistrationStateResponse)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003695 RLOGE("getDataRegistrationStateResponse Invalid response: NULL");
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003696 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
3697 } else {
3698 dataRegResponse.regState = (RegState) dataRegState->regState;
3699 dataRegResponse.rat = dataRegState->rat;;
3700 dataRegResponse.reasonDataDenied = dataRegState->reasonDataDenied;
3701 dataRegResponse.maxDataCalls = dataRegState->maxDataCalls;
3702 fillCellIdentityResponse(dataRegResponse.cellIdentity, dataRegState->cellIdentity);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003703 }
3704 }
3705
3706 Return<void> retStatus =
3707 radioService[slotId]->mRadioResponse->getDataRegistrationStateResponse(responseInfo,
3708 dataRegResponse);
3709 radioService[slotId]->checkReturnStatus(retStatus);
3710 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003711 RLOGE("getDataRegistrationStateResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003712 slotId);
3713 }
3714
3715 return 0;
3716}
3717
Amit Mahajan759786a2017-03-03 17:35:47 -08003718int radio::getOperatorResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003719 int responseType, int serial, RIL_Errno e, void *response,
3720 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003721#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003722 RLOGD("getOperatorResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003723#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003724
3725 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003726 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003727 populateResponseInfo(responseInfo, serial, responseType, e);
3728 hidl_string longName;
3729 hidl_string shortName;
3730 hidl_string numeric;
3731 int numStrings = responseLen / sizeof(char *);
3732 if (response == NULL || numStrings != 3) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003733 RLOGE("getOperatorResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003734 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
3735
3736 } else {
3737 char **resp = (char **) response;
3738 longName = convertCharPtrToHidlString(resp[0]);
3739 shortName = convertCharPtrToHidlString(resp[1]);
3740 numeric = convertCharPtrToHidlString(resp[2]);
3741 }
3742 Return<void> retStatus = radioService[slotId]->mRadioResponse->getOperatorResponse(
3743 responseInfo, longName, shortName, numeric);
3744 radioService[slotId]->checkReturnStatus(retStatus);
3745 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003746 RLOGE("getOperatorResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003747 slotId);
3748 }
3749
3750 return 0;
3751}
3752
Amit Mahajan759786a2017-03-03 17:35:47 -08003753int radio::setRadioPowerResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003754 int responseType, int serial, RIL_Errno e, void *response,
3755 size_t responseLen) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003756 RLOGD("setRadioPowerResponse: serial %d", serial);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003757
3758 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003759 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003760 populateResponseInfo(responseInfo, serial, responseType, e);
3761 Return<void> retStatus = radioService[slotId]->mRadioResponse->setRadioPowerResponse(
3762 responseInfo);
3763 radioService[slotId]->checkReturnStatus(retStatus);
3764 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003765 RLOGE("setRadioPowerResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003766 slotId);
3767 }
3768
3769 return 0;
3770}
3771
Amit Mahajan759786a2017-03-03 17:35:47 -08003772int radio::sendDtmfResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003773 int responseType, int serial, RIL_Errno e, void *response,
3774 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003775#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003776 RLOGD("sendDtmfResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003777#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003778
3779 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003780 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003781 populateResponseInfo(responseInfo, serial, responseType, e);
3782 Return<void> retStatus = radioService[slotId]->mRadioResponse->sendDtmfResponse(
3783 responseInfo);
3784 radioService[slotId]->checkReturnStatus(retStatus);
3785 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003786 RLOGE("sendDtmfResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003787 slotId);
3788 }
3789
3790 return 0;
3791}
3792
3793SendSmsResult makeSendSmsResult(RadioResponseInfo& responseInfo, int serial, int responseType,
3794 RIL_Errno e, void *response, size_t responseLen) {
3795 populateResponseInfo(responseInfo, serial, responseType, e);
Jack Yuf68e0da2017-02-07 14:53:09 -08003796 SendSmsResult result = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003797
3798 if (response == NULL || responseLen != sizeof(RIL_SMS_Response)) {
3799 RLOGE("Invalid response: NULL");
3800 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003801 result.ackPDU = hidl_string();
3802 } else {
3803 RIL_SMS_Response *resp = (RIL_SMS_Response *) response;
3804 result.messageRef = resp->messageRef;
3805 result.ackPDU = convertCharPtrToHidlString(resp->ackPDU);
3806 result.errorCode = resp->errorCode;
3807 }
3808 return result;
3809}
3810
Amit Mahajan759786a2017-03-03 17:35:47 -08003811int radio::sendSmsResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003812 int responseType, int serial, RIL_Errno e, void *response,
3813 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003814#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003815 RLOGD("sendSmsResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003816#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003817
3818 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003819 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003820 SendSmsResult result = makeSendSmsResult(responseInfo, serial, responseType, e, response,
3821 responseLen);
3822
3823 Return<void> retStatus = radioService[slotId]->mRadioResponse->sendSmsResponse(responseInfo,
3824 result);
3825 radioService[slotId]->checkReturnStatus(retStatus);
3826 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003827 RLOGE("sendSmsResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003828 }
3829
3830 return 0;
3831}
3832
Amit Mahajan759786a2017-03-03 17:35:47 -08003833int radio::sendSMSExpectMoreResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003834 int responseType, int serial, RIL_Errno e, void *response,
3835 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003836#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003837 RLOGD("sendSMSExpectMoreResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003838#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003839
3840 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003841 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003842 SendSmsResult result = makeSendSmsResult(responseInfo, serial, responseType, e, response,
3843 responseLen);
3844
3845 Return<void> retStatus = radioService[slotId]->mRadioResponse->sendSMSExpectMoreResponse(
3846 responseInfo, result);
3847 radioService[slotId]->checkReturnStatus(retStatus);
3848 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003849 RLOGE("sendSMSExpectMoreResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003850 }
3851
3852 return 0;
3853}
3854
Amit Mahajan759786a2017-03-03 17:35:47 -08003855int radio::setupDataCallResponse(int slotId,
Amit Mahajan3df62912017-02-10 01:35:55 +00003856 int responseType, int serial, RIL_Errno e, void *response,
3857 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003858#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003859 RLOGD("setupDataCallResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003860#endif
Amit Mahajan3df62912017-02-10 01:35:55 +00003861
3862 if (radioService[slotId]->mRadioResponse != NULL) {
Amit Mahajan3da9ac02017-02-13 13:41:28 -08003863 RadioResponseInfo responseInfo = {};
Amit Mahajan3df62912017-02-10 01:35:55 +00003864 populateResponseInfo(responseInfo, serial, responseType, e);
3865
Amit Mahajan3da9ac02017-02-13 13:41:28 -08003866 SetupDataCallResult result = {};
Amit Mahajan3df62912017-02-10 01:35:55 +00003867 if (response == NULL || responseLen != sizeof(RIL_Data_Call_Response_v11)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003868 RLOGE("setupDataCallResponse: Invalid response");
Amit Mahajan3df62912017-02-10 01:35:55 +00003869 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
Jack Yu5079e182017-02-28 15:21:18 -08003870 result.status = DataCallFailCause::ERROR_UNSPECIFIED;
Amit Mahajan3da9ac02017-02-13 13:41:28 -08003871 result.type = hidl_string();
3872 result.ifname = hidl_string();
3873 result.addresses = hidl_string();
3874 result.dnses = hidl_string();
3875 result.gateways = hidl_string();
3876 result.pcscf = hidl_string();
Amit Mahajan3df62912017-02-10 01:35:55 +00003877 } else {
3878 convertRilDataCallToHal((RIL_Data_Call_Response_v11 *) response, result);
3879 }
3880
3881 Return<void> retStatus = radioService[slotId]->mRadioResponse->setupDataCallResponse(
3882 responseInfo, result);
3883 radioService[slotId]->checkReturnStatus(retStatus);
3884 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003885 RLOGE("setupDataCallResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Amit Mahajan3df62912017-02-10 01:35:55 +00003886 }
3887
3888 return 0;
3889}
3890
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003891IccIoResult responseIccIo(RadioResponseInfo& responseInfo, int serial, int responseType,
3892 RIL_Errno e, void *response, size_t responseLen) {
3893 populateResponseInfo(responseInfo, serial, responseType, e);
Jack Yuf68e0da2017-02-07 14:53:09 -08003894 IccIoResult result = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003895
3896 if (response == NULL || responseLen != sizeof(RIL_SIM_IO_Response)) {
3897 RLOGE("Invalid response: NULL");
3898 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003899 result.simResponse = hidl_string();
3900 } else {
3901 RIL_SIM_IO_Response *resp = (RIL_SIM_IO_Response *) response;
3902 result.sw1 = resp->sw1;
3903 result.sw2 = resp->sw2;
3904 result.simResponse = convertCharPtrToHidlString(resp->simResponse);
3905 }
3906 return result;
3907}
3908
Amit Mahajan759786a2017-03-03 17:35:47 -08003909int radio::iccIOForAppResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003910 int responseType, int serial, RIL_Errno e, void *response,
3911 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003912#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003913 RLOGD("iccIOForAppResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003914#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003915
3916 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003917 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003918 IccIoResult result = responseIccIo(responseInfo, serial, responseType, e, response,
3919 responseLen);
3920
3921 Return<void> retStatus = radioService[slotId]->mRadioResponse->iccIOForAppResponse(
3922 responseInfo, result);
3923 radioService[slotId]->checkReturnStatus(retStatus);
3924 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003925 RLOGE("iccIOForAppResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003926 }
3927
3928 return 0;
3929}
3930
Amit Mahajan759786a2017-03-03 17:35:47 -08003931int radio::sendUssdResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003932 int responseType, int serial, RIL_Errno e, void *response,
3933 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003934#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003935 RLOGD("sendUssdResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003936#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003937
3938 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003939 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003940 populateResponseInfo(responseInfo, serial, responseType, e);
3941 Return<void> retStatus = radioService[slotId]->mRadioResponse->sendUssdResponse(
3942 responseInfo);
3943 radioService[slotId]->checkReturnStatus(retStatus);
3944 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003945 RLOGE("sendUssdResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003946 slotId);
3947 }
3948
3949 return 0;
3950}
3951
Amit Mahajan759786a2017-03-03 17:35:47 -08003952int radio::cancelPendingUssdResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003953 int responseType, int serial, RIL_Errno e, void *response,
3954 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003955#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003956 RLOGD("cancelPendingUssdResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003957#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003958
3959 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003960 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003961 populateResponseInfo(responseInfo, serial, responseType, e);
3962 Return<void> retStatus = radioService[slotId]->mRadioResponse->cancelPendingUssdResponse(
3963 responseInfo);
3964 radioService[slotId]->checkReturnStatus(retStatus);
3965 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003966 RLOGE("cancelPendingUssdResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003967 slotId);
3968 }
3969
3970 return 0;
3971}
3972
Amit Mahajan759786a2017-03-03 17:35:47 -08003973int radio::getClirResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003974 int responseType, int serial, RIL_Errno e, void *response,
3975 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003976#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003977 RLOGD("getClirResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003978#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003979
3980 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003981 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003982 populateResponseInfo(responseInfo, serial, responseType, e);
3983 int n = -1, m = -1;
3984 int numInts = responseLen / sizeof(int);
3985 if (response == NULL || numInts != 2) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003986 RLOGE("getClirResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003987 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
3988 } else {
3989 int *pInt = (int *) response;
3990 n = pInt[0];
3991 m = pInt[1];
3992 }
3993 Return<void> retStatus = radioService[slotId]->mRadioResponse->getClirResponse(responseInfo,
3994 n, m);
3995 radioService[slotId]->checkReturnStatus(retStatus);
3996 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003997 RLOGE("getClirResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003998 }
3999
4000 return 0;
4001}
4002
Amit Mahajan759786a2017-03-03 17:35:47 -08004003int radio::setClirResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004004 int responseType, int serial, RIL_Errno e, void *response,
4005 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004006#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004007 RLOGD("setClirResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004008#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004009
4010 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004011 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004012 populateResponseInfo(responseInfo, serial, responseType, e);
4013 Return<void> retStatus = radioService[slotId]->mRadioResponse->setClirResponse(
4014 responseInfo);
4015 radioService[slotId]->checkReturnStatus(retStatus);
4016 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004017 RLOGE("setClirResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004018 }
4019
4020 return 0;
4021}
4022
Amit Mahajan759786a2017-03-03 17:35:47 -08004023int radio::getCallForwardStatusResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004024 int responseType, int serial, RIL_Errno e,
4025 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004026#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004027 RLOGD("getCallForwardStatusResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004028#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004029
4030 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004031 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004032 populateResponseInfo(responseInfo, serial, responseType, e);
4033 hidl_vec<CallForwardInfo> callForwardInfos;
4034
4035 if (response == NULL || responseLen % sizeof(RIL_CallForwardInfo *) != 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004036 RLOGE("getCallForwardStatusResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004037 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
4038 } else {
4039 int num = responseLen / sizeof(RIL_CallForwardInfo *);
4040 callForwardInfos.resize(num);
4041 for (int i = 0 ; i < num; i++) {
4042 RIL_CallForwardInfo *resp = ((RIL_CallForwardInfo **) response)[i];
4043 callForwardInfos[i].status = (CallForwardInfoStatus) resp->status;
4044 callForwardInfos[i].reason = resp->reason;
4045 callForwardInfos[i].serviceClass = resp->serviceClass;
4046 callForwardInfos[i].toa = resp->toa;
4047 callForwardInfos[i].number = convertCharPtrToHidlString(resp->number);
4048 callForwardInfos[i].timeSeconds = resp->timeSeconds;
4049 }
4050 }
4051
4052 Return<void> retStatus = radioService[slotId]->mRadioResponse->getCallForwardStatusResponse(
4053 responseInfo, callForwardInfos);
4054 radioService[slotId]->checkReturnStatus(retStatus);
4055 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004056 RLOGE("getCallForwardStatusResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004057 slotId);
4058 }
4059
4060 return 0;
4061}
4062
Amit Mahajan759786a2017-03-03 17:35:47 -08004063int radio::setCallForwardResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004064 int responseType, int serial, RIL_Errno e, void *response,
4065 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004066#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004067 RLOGD("setCallForwardResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004068#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004069
4070 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004071 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004072 populateResponseInfo(responseInfo, serial, responseType, e);
4073 Return<void> retStatus = radioService[slotId]->mRadioResponse->setCallForwardResponse(
4074 responseInfo);
4075 radioService[slotId]->checkReturnStatus(retStatus);
4076 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004077 RLOGE("setCallForwardResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004078 }
4079
4080 return 0;
4081}
4082
Amit Mahajan759786a2017-03-03 17:35:47 -08004083int radio::getCallWaitingResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004084 int responseType, int serial, RIL_Errno e, void *response,
4085 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004086#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004087 RLOGD("getCallWaitingResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004088#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004089
4090 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004091 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004092 populateResponseInfo(responseInfo, serial, responseType, e);
4093 bool enable = false;
4094 int serviceClass = -1;
4095 int numInts = responseLen / sizeof(int);
4096 if (response == NULL || numInts != 2) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004097 RLOGE("getCallWaitingResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004098 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
4099 } else {
4100 int *pInt = (int *) response;
4101 enable = pInt[0] == 1 ? true : false;
4102 serviceClass = pInt[1];
4103 }
Sanket Padawe5375bfa2017-03-07 17:21:05 -08004104 Return<void> retStatus = radioService[slotId]->mRadioResponse->getCallWaitingResponse(
4105 responseInfo, enable, serviceClass);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004106 radioService[slotId]->checkReturnStatus(retStatus);
4107 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004108 RLOGE("getCallWaitingResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004109 }
4110
4111 return 0;
4112}
4113
Amit Mahajan759786a2017-03-03 17:35:47 -08004114int radio::setCallWaitingResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004115 int responseType, int serial, RIL_Errno e, void *response,
4116 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004117#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004118 RLOGD("setCallWaitingResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004119#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004120
4121 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004122 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004123 populateResponseInfo(responseInfo, serial, responseType, e);
4124 Return<void> retStatus = radioService[slotId]->mRadioResponse->setCallWaitingResponse(
4125 responseInfo);
4126 radioService[slotId]->checkReturnStatus(retStatus);
4127 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004128 RLOGE("setCallWaitingResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004129 }
4130
4131 return 0;
4132}
4133
Amit Mahajan759786a2017-03-03 17:35:47 -08004134int radio::acknowledgeLastIncomingGsmSmsResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004135 int responseType, int serial, RIL_Errno e,
4136 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004137#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004138 RLOGD("acknowledgeLastIncomingGsmSmsResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004139#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004140
4141 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004142 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004143 populateResponseInfo(responseInfo, serial, responseType, e);
4144 Return<void> retStatus =
4145 radioService[slotId]->mRadioResponse->acknowledgeLastIncomingGsmSmsResponse(
4146 responseInfo);
4147 radioService[slotId]->checkReturnStatus(retStatus);
4148 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004149 RLOGE("acknowledgeLastIncomingGsmSmsResponse: radioService[%d]->mRadioResponse "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004150 "== NULL", slotId);
4151 }
4152
4153 return 0;
4154}
4155
Amit Mahajan759786a2017-03-03 17:35:47 -08004156int radio::acceptCallResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004157 int responseType, int serial, RIL_Errno e,
4158 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004159#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004160 RLOGD("acceptCallResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004161#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004162
4163 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004164 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004165 populateResponseInfo(responseInfo, serial, responseType, e);
4166 Return<void> retStatus = radioService[slotId]->mRadioResponse->acceptCallResponse(
4167 responseInfo);
4168 radioService[slotId]->checkReturnStatus(retStatus);
4169 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004170 RLOGE("acceptCallResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004171 slotId);
4172 }
4173
4174 return 0;
4175}
4176
Amit Mahajan759786a2017-03-03 17:35:47 -08004177int radio::deactivateDataCallResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004178 int responseType, int serial, RIL_Errno e,
4179 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004180#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004181 RLOGD("deactivateDataCallResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004182#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004183
4184 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004185 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004186 populateResponseInfo(responseInfo, serial, responseType, e);
4187 Return<void> retStatus = radioService[slotId]->mRadioResponse->deactivateDataCallResponse(
4188 responseInfo);
4189 radioService[slotId]->checkReturnStatus(retStatus);
4190 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004191 RLOGE("deactivateDataCallResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004192 slotId);
4193 }
4194
4195 return 0;
4196}
4197
Amit Mahajan759786a2017-03-03 17:35:47 -08004198int radio::getFacilityLockForAppResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004199 int responseType, int serial, RIL_Errno e,
4200 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004201#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004202 RLOGD("getFacilityLockForAppResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004203#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004204
4205 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004206 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004207 int ret = responseInt(responseInfo, serial, responseType, e, response, responseLen);
4208 Return<void> retStatus = radioService[slotId]->mRadioResponse->
4209 getFacilityLockForAppResponse(responseInfo, ret);
4210 radioService[slotId]->checkReturnStatus(retStatus);
4211 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004212 RLOGE("getFacilityLockForAppResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004213 slotId);
4214 }
4215
4216 return 0;
4217}
4218
Amit Mahajan759786a2017-03-03 17:35:47 -08004219int radio::setFacilityLockForAppResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004220 int responseType, int serial, RIL_Errno e,
4221 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004222#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004223 RLOGD("setFacilityLockForAppResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004224#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004225
4226 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004227 RadioResponseInfo responseInfo = {};
Naveen Kalla346bbc02017-03-16 12:55:55 -07004228 int ret = responseIntOrEmpty(responseInfo, serial, responseType, e, response, responseLen);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004229 Return<void> retStatus
4230 = radioService[slotId]->mRadioResponse->setFacilityLockForAppResponse(responseInfo,
4231 ret);
4232 radioService[slotId]->checkReturnStatus(retStatus);
4233 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004234 RLOGE("setFacilityLockForAppResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004235 slotId);
4236 }
4237
4238 return 0;
4239}
4240
Amit Mahajan759786a2017-03-03 17:35:47 -08004241int radio::setBarringPasswordResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004242 int responseType, int serial, RIL_Errno e,
4243 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004244#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004245 RLOGD("acceptCallResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004246#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004247
4248 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004249 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004250 populateResponseInfo(responseInfo, serial, responseType, e);
4251 Return<void> retStatus
4252 = radioService[slotId]->mRadioResponse->setBarringPasswordResponse(responseInfo);
4253 radioService[slotId]->checkReturnStatus(retStatus);
4254 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004255 RLOGE("setBarringPasswordResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004256 slotId);
4257 }
4258
4259 return 0;
4260}
4261
Amit Mahajan759786a2017-03-03 17:35:47 -08004262int radio::getNetworkSelectionModeResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004263 int responseType, int serial, RIL_Errno e, void *response,
4264 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004265#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004266 RLOGD("getNetworkSelectionModeResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004267#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004268
4269 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004270 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004271 populateResponseInfo(responseInfo, serial, responseType, e);
4272 bool manual = false;
4273 int serviceClass;
4274 if (response == NULL || responseLen != sizeof(int)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004275 RLOGE("getNetworkSelectionModeResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004276 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
4277 } else {
4278 int *pInt = (int *) response;
4279 manual = pInt[0] == 1 ? true : false;
4280 }
4281 Return<void> retStatus
4282 = radioService[slotId]->mRadioResponse->getNetworkSelectionModeResponse(
4283 responseInfo,
4284 manual);
4285 radioService[slotId]->checkReturnStatus(retStatus);
4286 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004287 RLOGE("getNetworkSelectionModeResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004288 slotId);
4289 }
4290
4291 return 0;
4292}
4293
Amit Mahajan759786a2017-03-03 17:35:47 -08004294int radio::setNetworkSelectionModeAutomaticResponse(int slotId, int responseType, int serial,
4295 RIL_Errno e, void *response,
4296 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004297#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004298 RLOGD("setNetworkSelectionModeAutomaticResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004299#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004300
4301 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004302 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004303 populateResponseInfo(responseInfo, serial, responseType, e);
4304 Return<void> retStatus
4305 = radioService[slotId]->mRadioResponse->setNetworkSelectionModeAutomaticResponse(
4306 responseInfo);
4307 radioService[slotId]->checkReturnStatus(retStatus);
4308 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004309 RLOGE("setNetworkSelectionModeAutomaticResponse: radioService[%d]->mRadioResponse "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004310 "== NULL", slotId);
4311 }
4312
4313 return 0;
4314}
4315
Amit Mahajan759786a2017-03-03 17:35:47 -08004316int radio::setNetworkSelectionModeManualResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004317 int responseType, int serial, RIL_Errno e,
4318 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004319#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004320 RLOGD("setNetworkSelectionModeManualResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004321#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004322
4323 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004324 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004325 populateResponseInfo(responseInfo, serial, responseType, e);
4326 Return<void> retStatus
4327 = radioService[slotId]->mRadioResponse->setNetworkSelectionModeManualResponse(
4328 responseInfo);
4329 radioService[slotId]->checkReturnStatus(retStatus);
4330 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004331 RLOGE("acceptCallResponse: radioService[%d]->setNetworkSelectionModeManualResponse "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004332 "== NULL", slotId);
4333 }
4334
4335 return 0;
4336}
4337
Jack Yuf68e0da2017-02-07 14:53:09 -08004338int convertOperatorStatusToInt(const char *str) {
4339 if (strncmp("unknown", str, 9) == 0) {
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004340 return (int) OperatorStatus::UNKNOWN;
Jack Yuf68e0da2017-02-07 14:53:09 -08004341 } else if (strncmp("available", str, 9) == 0) {
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004342 return (int) OperatorStatus::AVAILABLE;
Jack Yuf68e0da2017-02-07 14:53:09 -08004343 } else if (strncmp("current", str, 9) == 0) {
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004344 return (int) OperatorStatus::CURRENT;
Jack Yuf68e0da2017-02-07 14:53:09 -08004345 } else if (strncmp("forbidden", str, 9) == 0) {
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004346 return (int) OperatorStatus::FORBIDDEN;
4347 } else {
4348 return -1;
4349 }
4350}
4351
Amit Mahajan759786a2017-03-03 17:35:47 -08004352int radio::getAvailableNetworksResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004353 int responseType, int serial, RIL_Errno e, void *response,
4354 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004355#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004356 RLOGD("getAvailableNetworksResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004357#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004358
4359 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004360 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004361 populateResponseInfo(responseInfo, serial, responseType, e);
4362 hidl_vec<OperatorInfo> networks;
4363 if (response == NULL || responseLen % (4 * sizeof(char *))!= 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004364 RLOGE("getAvailableNetworksResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004365 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
4366 } else {
4367 char **resp = (char **) response;
4368 int numStrings = responseLen / sizeof(char *);
4369 networks.resize(numStrings/4);
Jayachandran Ce0d755c2017-03-01 18:26:50 -08004370 for (int i = 0, j = 0; i < numStrings; i = i + 4, j++) {
4371 networks[j].alphaLong = convertCharPtrToHidlString(resp[i]);
4372 networks[j].alphaShort = convertCharPtrToHidlString(resp[i + 1]);
4373 networks[j].operatorNumeric = convertCharPtrToHidlString(resp[i + 2]);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004374 int status = convertOperatorStatusToInt(resp[i + 3]);
4375 if (status == -1) {
4376 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
4377 } else {
Jayachandran Ce0d755c2017-03-01 18:26:50 -08004378 networks[j].status = (OperatorStatus) status;
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004379 }
4380 }
4381 }
4382 Return<void> retStatus
4383 = radioService[slotId]->mRadioResponse->getAvailableNetworksResponse(responseInfo,
4384 networks);
4385 radioService[slotId]->checkReturnStatus(retStatus);
4386 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004387 RLOGE("getAvailableNetworksResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004388 slotId);
4389 }
4390
4391 return 0;
4392}
4393
Amit Mahajan759786a2017-03-03 17:35:47 -08004394int radio::startDtmfResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004395 int responseType, int serial, RIL_Errno e,
4396 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004397#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004398 RLOGD("startDtmfResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004399#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004400
4401 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004402 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004403 populateResponseInfo(responseInfo, serial, responseType, e);
4404 Return<void> retStatus
4405 = radioService[slotId]->mRadioResponse->startDtmfResponse(responseInfo);
4406 radioService[slotId]->checkReturnStatus(retStatus);
4407 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004408 RLOGE("startDtmfResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004409 }
4410
4411 return 0;
4412}
4413
Amit Mahajan759786a2017-03-03 17:35:47 -08004414int radio::stopDtmfResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004415 int responseType, int serial, RIL_Errno e,
4416 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004417#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004418 RLOGD("stopDtmfResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004419#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004420
4421 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004422 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004423 populateResponseInfo(responseInfo, serial, responseType, e);
4424 Return<void> retStatus
4425 = radioService[slotId]->mRadioResponse->stopDtmfResponse(responseInfo);
4426 radioService[slotId]->checkReturnStatus(retStatus);
4427 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004428 RLOGE("stopDtmfResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004429 }
4430
4431 return 0;
4432}
4433
Amit Mahajan759786a2017-03-03 17:35:47 -08004434int radio::getBasebandVersionResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004435 int responseType, int serial, RIL_Errno e,
4436 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004437#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004438 RLOGD("getBasebandVersionResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004439#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004440
4441 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004442 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004443 populateResponseInfo(responseInfo, serial, responseType, e);
4444 Return<void> retStatus
4445 = radioService[slotId]->mRadioResponse->getBasebandVersionResponse(responseInfo,
4446 convertCharPtrToHidlString((char *) response));
4447 radioService[slotId]->checkReturnStatus(retStatus);
4448 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004449 RLOGE("getBasebandVersionResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004450 }
4451
4452 return 0;
4453}
4454
Amit Mahajan759786a2017-03-03 17:35:47 -08004455int radio::separateConnectionResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004456 int responseType, int serial, RIL_Errno e,
4457 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004458#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004459 RLOGD("separateConnectionResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004460#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004461
4462 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004463 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004464 populateResponseInfo(responseInfo, serial, responseType, e);
4465 Return<void> retStatus
4466 = radioService[slotId]->mRadioResponse->separateConnectionResponse(responseInfo);
4467 radioService[slotId]->checkReturnStatus(retStatus);
4468 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004469 RLOGE("separateConnectionResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004470 slotId);
4471 }
4472
4473 return 0;
4474}
4475
Amit Mahajan759786a2017-03-03 17:35:47 -08004476int radio::setMuteResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004477 int responseType, int serial, RIL_Errno e,
4478 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004479#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004480 RLOGD("setMuteResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004481#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004482
4483 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004484 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004485 populateResponseInfo(responseInfo, serial, responseType, e);
4486 Return<void> retStatus
4487 = radioService[slotId]->mRadioResponse->setMuteResponse(responseInfo);
4488 radioService[slotId]->checkReturnStatus(retStatus);
4489 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004490 RLOGE("setMuteResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004491 }
4492
4493 return 0;
4494}
4495
Amit Mahajan759786a2017-03-03 17:35:47 -08004496int radio::getMuteResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004497 int responseType, int serial, RIL_Errno e, void *response,
4498 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004499#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004500 RLOGD("getMuteResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004501#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004502
4503 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004504 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004505 populateResponseInfo(responseInfo, serial, responseType, e);
4506 bool enable = false;
4507 int serviceClass;
4508 if (response == NULL || responseLen != sizeof(int)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004509 RLOGE("getMuteResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004510 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
4511 } else {
4512 int *pInt = (int *) response;
4513 enable = pInt[0] == 1 ? true : false;
4514 }
4515 Return<void> retStatus = radioService[slotId]->mRadioResponse->getMuteResponse(responseInfo,
4516 enable);
4517 radioService[slotId]->checkReturnStatus(retStatus);
4518 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004519 RLOGE("getMuteResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004520 }
4521
4522 return 0;
4523}
4524
Amit Mahajan759786a2017-03-03 17:35:47 -08004525int radio::getClipResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004526 int responseType, int serial, RIL_Errno e,
4527 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004528#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004529 RLOGD("getClipResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004530#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004531
4532 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004533 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004534 int ret = responseInt(responseInfo, serial, responseType, e, response, responseLen);
4535 Return<void> retStatus = radioService[slotId]->mRadioResponse->getClipResponse(responseInfo,
4536 (ClipStatus) ret);
4537 radioService[slotId]->checkReturnStatus(retStatus);
4538 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004539 RLOGE("getClipResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004540 }
4541
4542 return 0;
4543}
4544
Amit Mahajan759786a2017-03-03 17:35:47 -08004545int radio::getDataCallListResponse(int slotId,
Amit Mahajan3df62912017-02-10 01:35:55 +00004546 int responseType, int serial, RIL_Errno e,
4547 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004548#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004549 RLOGD("getDataCallListResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004550#endif
Amit Mahajan3df62912017-02-10 01:35:55 +00004551
4552 if (radioService[slotId]->mRadioResponse != NULL) {
Amit Mahajan3da9ac02017-02-13 13:41:28 -08004553 RadioResponseInfo responseInfo = {};
Amit Mahajan3df62912017-02-10 01:35:55 +00004554 populateResponseInfo(responseInfo, serial, responseType, e);
4555
4556 hidl_vec<SetupDataCallResult> ret;
4557 if (response == NULL || responseLen % sizeof(RIL_Data_Call_Response_v11) != 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004558 RLOGE("getDataCallListResponse: invalid response");
Amit Mahajan3df62912017-02-10 01:35:55 +00004559 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
4560 } else {
4561 convertRilDataCallListToHal(response, responseLen, ret);
4562 }
4563
4564 Return<void> retStatus = radioService[slotId]->mRadioResponse->getDataCallListResponse(
4565 responseInfo, ret);
4566 radioService[slotId]->checkReturnStatus(retStatus);
4567 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004568 RLOGE("getDataCallListResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Amit Mahajan3df62912017-02-10 01:35:55 +00004569 }
4570
4571 return 0;
4572}
4573
Amit Mahajan759786a2017-03-03 17:35:47 -08004574int radio::setSuppServiceNotificationsResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004575 int responseType, int serial, RIL_Errno e,
4576 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004577#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004578 RLOGD("setSuppServiceNotificationsResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004579#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004580
4581 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004582 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004583 populateResponseInfo(responseInfo, serial, responseType, e);
4584 Return<void> retStatus
4585 = radioService[slotId]->mRadioResponse->setSuppServiceNotificationsResponse(
4586 responseInfo);
4587 radioService[slotId]->checkReturnStatus(retStatus);
4588 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004589 RLOGE("setSuppServiceNotificationsResponse: radioService[%d]->mRadioResponse "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004590 "== NULL", slotId);
4591 }
4592
4593 return 0;
4594}
4595
Amit Mahajan759786a2017-03-03 17:35:47 -08004596int radio::deleteSmsOnSimResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004597 int responseType, int serial, RIL_Errno e,
4598 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004599#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004600 RLOGD("deleteSmsOnSimResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004601#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004602
4603 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004604 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004605 populateResponseInfo(responseInfo, serial, responseType, e);
4606 Return<void> retStatus
4607 = radioService[slotId]->mRadioResponse->deleteSmsOnSimResponse(responseInfo);
4608 radioService[slotId]->checkReturnStatus(retStatus);
4609 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004610 RLOGE("deleteSmsOnSimResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004611 }
4612
4613 return 0;
4614}
4615
Amit Mahajan759786a2017-03-03 17:35:47 -08004616int radio::setBandModeResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004617 int responseType, int serial, RIL_Errno e,
4618 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004619#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004620 RLOGD("setBandModeResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004621#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004622
4623 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004624 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004625 populateResponseInfo(responseInfo, serial, responseType, e);
4626 Return<void> retStatus
4627 = radioService[slotId]->mRadioResponse->setBandModeResponse(responseInfo);
4628 radioService[slotId]->checkReturnStatus(retStatus);
4629 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004630 RLOGE("setBandModeResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004631 }
4632
4633 return 0;
4634}
4635
Amit Mahajan759786a2017-03-03 17:35:47 -08004636int radio::writeSmsToSimResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004637 int responseType, int serial, RIL_Errno e,
4638 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004639#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004640 RLOGD("writeSmsToSimResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004641#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004642
4643 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004644 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004645 int ret = responseInt(responseInfo, serial, responseType, e, response, responseLen);
4646 Return<void> retStatus
4647 = radioService[slotId]->mRadioResponse->writeSmsToSimResponse(responseInfo, ret);
4648 radioService[slotId]->checkReturnStatus(retStatus);
4649 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004650 RLOGE("writeSmsToSimResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004651 }
4652
4653 return 0;
4654}
4655
Amit Mahajan759786a2017-03-03 17:35:47 -08004656int radio::getAvailableBandModesResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004657 int responseType, int serial, RIL_Errno e, void *response,
4658 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004659#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004660 RLOGD("getAvailableBandModesResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004661#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004662
4663 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004664 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004665 populateResponseInfo(responseInfo, serial, responseType, e);
4666 hidl_vec<RadioBandMode> modes;
4667 if (response == NULL || responseLen % sizeof(int) != 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004668 RLOGE("getAvailableBandModesResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004669 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
4670 } else {
4671 int *pInt = (int *) response;
4672 int numInts = responseLen / sizeof(int);
4673 modes.resize(numInts);
4674 for (int i = 0; i < numInts; i++) {
4675 modes[i] = (RadioBandMode) pInt[i];
4676 }
4677 }
4678 Return<void> retStatus
4679 = radioService[slotId]->mRadioResponse->getAvailableBandModesResponse(responseInfo,
4680 modes);
4681 radioService[slotId]->checkReturnStatus(retStatus);
4682 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004683 RLOGE("getAvailableBandModesResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004684 slotId);
4685 }
4686
4687 return 0;
4688}
4689
Amit Mahajan759786a2017-03-03 17:35:47 -08004690int radio::sendEnvelopeResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004691 int responseType, int serial, RIL_Errno e,
4692 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004693#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004694 RLOGD("sendEnvelopeResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004695#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004696
4697 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004698 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004699 populateResponseInfo(responseInfo, serial, responseType, e);
4700 Return<void> retStatus
4701 = radioService[slotId]->mRadioResponse->sendEnvelopeResponse(responseInfo,
4702 convertCharPtrToHidlString((char *) response));
4703 radioService[slotId]->checkReturnStatus(retStatus);
4704 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004705 RLOGE("sendEnvelopeResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004706 }
4707
4708 return 0;
4709}
4710
Amit Mahajan759786a2017-03-03 17:35:47 -08004711int radio::sendTerminalResponseToSimResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004712 int responseType, int serial, RIL_Errno e,
4713 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004714#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004715 RLOGD("sendTerminalResponseToSimResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004716#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004717
4718 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004719 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004720 populateResponseInfo(responseInfo, serial, responseType, e);
4721 Return<void> retStatus
4722 = radioService[slotId]->mRadioResponse->sendTerminalResponseToSimResponse(
4723 responseInfo);
4724 radioService[slotId]->checkReturnStatus(retStatus);
4725 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004726 RLOGE("sendTerminalResponseToSimResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004727 slotId);
4728 }
4729
4730 return 0;
4731}
4732
Amit Mahajan759786a2017-03-03 17:35:47 -08004733int radio::handleStkCallSetupRequestFromSimResponse(int slotId,
4734 int responseType, int serial,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004735 RIL_Errno e, void *response,
4736 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004737#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004738 RLOGD("handleStkCallSetupRequestFromSimResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004739#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004740
4741 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004742 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004743 populateResponseInfo(responseInfo, serial, responseType, e);
4744 Return<void> retStatus
4745 = radioService[slotId]->mRadioResponse->handleStkCallSetupRequestFromSimResponse(
4746 responseInfo);
4747 radioService[slotId]->checkReturnStatus(retStatus);
4748 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004749 RLOGE("handleStkCallSetupRequestFromSimResponse: radioService[%d]->mRadioResponse "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004750 "== NULL", slotId);
4751 }
4752
4753 return 0;
4754}
4755
Amit Mahajan759786a2017-03-03 17:35:47 -08004756int radio::explicitCallTransferResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004757 int responseType, int serial, RIL_Errno e,
4758 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004759#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004760 RLOGD("explicitCallTransferResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004761#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004762
4763 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004764 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004765 populateResponseInfo(responseInfo, serial, responseType, e);
4766 Return<void> retStatus
4767 = radioService[slotId]->mRadioResponse->explicitCallTransferResponse(responseInfo);
4768 radioService[slotId]->checkReturnStatus(retStatus);
4769 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004770 RLOGE("explicitCallTransferResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004771 slotId);
4772 }
4773
4774 return 0;
4775}
4776
Amit Mahajan759786a2017-03-03 17:35:47 -08004777int radio::setPreferredNetworkTypeResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004778 int responseType, int serial, RIL_Errno e,
4779 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004780#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004781 RLOGD("setPreferredNetworkTypeResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004782#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004783
4784 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004785 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004786 populateResponseInfo(responseInfo, serial, responseType, e);
4787 Return<void> retStatus
4788 = radioService[slotId]->mRadioResponse->setPreferredNetworkTypeResponse(
4789 responseInfo);
4790 radioService[slotId]->checkReturnStatus(retStatus);
4791 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004792 RLOGE("setPreferredNetworkTypeResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004793 slotId);
4794 }
4795
4796 return 0;
4797}
4798
4799
Amit Mahajan759786a2017-03-03 17:35:47 -08004800int radio::getPreferredNetworkTypeResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004801 int responseType, int serial, RIL_Errno e,
4802 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004803#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004804 RLOGD("getPreferredNetworkTypeResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004805#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004806
4807 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004808 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004809 int ret = responseInt(responseInfo, serial, responseType, e, response, responseLen);
4810 Return<void> retStatus
4811 = radioService[slotId]->mRadioResponse->getPreferredNetworkTypeResponse(
4812 responseInfo, (PreferredNetworkType) ret);
4813 radioService[slotId]->checkReturnStatus(retStatus);
4814 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004815 RLOGE("getPreferredNetworkTypeResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004816 slotId);
4817 }
4818
4819 return 0;
4820}
4821
Amit Mahajan759786a2017-03-03 17:35:47 -08004822int radio::getNeighboringCidsResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004823 int responseType, int serial, RIL_Errno e,
4824 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004825#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004826 RLOGD("getNeighboringCidsResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004827#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004828
4829 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004830 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004831 populateResponseInfo(responseInfo, serial, responseType, e);
4832 hidl_vec<NeighboringCell> cells;
4833
4834 if (response == NULL || responseLen % sizeof(RIL_NeighboringCell *) != 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004835 RLOGE("getNeighboringCidsResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004836 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
4837 } else {
4838 int num = responseLen / sizeof(RIL_NeighboringCell *);
4839 cells.resize(num);
4840 for (int i = 0 ; i < num; i++) {
4841 RIL_NeighboringCell *resp = ((RIL_NeighboringCell **) response)[i];
4842 cells[i].cid = convertCharPtrToHidlString(resp->cid);
4843 cells[i].rssi = resp->rssi;
4844 }
4845 }
4846
4847 Return<void> retStatus
4848 = radioService[slotId]->mRadioResponse->getNeighboringCidsResponse(responseInfo,
4849 cells);
4850 radioService[slotId]->checkReturnStatus(retStatus);
4851 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004852 RLOGE("getNeighboringCidsResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004853 slotId);
4854 }
4855
4856 return 0;
4857}
4858
Amit Mahajan759786a2017-03-03 17:35:47 -08004859int radio::setLocationUpdatesResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004860 int responseType, int serial, RIL_Errno e,
4861 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004862#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004863 RLOGD("setLocationUpdatesResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004864#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004865
4866 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004867 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004868 populateResponseInfo(responseInfo, serial, responseType, e);
4869 Return<void> retStatus
4870 = radioService[slotId]->mRadioResponse->setLocationUpdatesResponse(responseInfo);
4871 radioService[slotId]->checkReturnStatus(retStatus);
4872 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004873 RLOGE("setLocationUpdatesResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004874 slotId);
4875 }
4876
4877 return 0;
4878}
4879
Amit Mahajan759786a2017-03-03 17:35:47 -08004880int radio::setCdmaSubscriptionSourceResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004881 int responseType, int serial, RIL_Errno e,
4882 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004883#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004884 RLOGD("setCdmaSubscriptionSourceResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004885#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004886
4887 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004888 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004889 populateResponseInfo(responseInfo, serial, responseType, e);
4890 Return<void> retStatus
4891 = radioService[slotId]->mRadioResponse->setCdmaSubscriptionSourceResponse(
4892 responseInfo);
4893 radioService[slotId]->checkReturnStatus(retStatus);
4894 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004895 RLOGE("setCdmaSubscriptionSourceResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004896 slotId);
4897 }
4898
4899 return 0;
4900}
4901
Amit Mahajan759786a2017-03-03 17:35:47 -08004902int radio::setCdmaRoamingPreferenceResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004903 int responseType, int serial, RIL_Errno e,
4904 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004905#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004906 RLOGD("setCdmaRoamingPreferenceResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004907#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004908
4909 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004910 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004911 populateResponseInfo(responseInfo, serial, responseType, e);
4912 Return<void> retStatus
4913 = radioService[slotId]->mRadioResponse->setCdmaRoamingPreferenceResponse(
4914 responseInfo);
4915 radioService[slotId]->checkReturnStatus(retStatus);
4916 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004917 RLOGE("setCdmaRoamingPreferenceResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004918 slotId);
4919 }
4920
4921 return 0;
4922}
4923
Amit Mahajan759786a2017-03-03 17:35:47 -08004924int radio::getCdmaRoamingPreferenceResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004925 int responseType, int serial, RIL_Errno e,
4926 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004927#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004928 RLOGD("getCdmaRoamingPreferenceResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004929#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004930
4931 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004932 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004933 int ret = responseInt(responseInfo, serial, responseType, e, response, responseLen);
4934 Return<void> retStatus
4935 = radioService[slotId]->mRadioResponse->getCdmaRoamingPreferenceResponse(
4936 responseInfo, (CdmaRoamingType) ret);
4937 radioService[slotId]->checkReturnStatus(retStatus);
4938 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004939 RLOGE("getCdmaRoamingPreferenceResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004940 slotId);
4941 }
4942
4943 return 0;
4944}
4945
Amit Mahajan759786a2017-03-03 17:35:47 -08004946int radio::setTTYModeResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004947 int responseType, int serial, RIL_Errno e,
4948 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004949#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004950 RLOGD("setTTYModeResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004951#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004952
4953 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004954 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004955 populateResponseInfo(responseInfo, serial, responseType, e);
4956 Return<void> retStatus
4957 = radioService[slotId]->mRadioResponse->setTTYModeResponse(responseInfo);
4958 radioService[slotId]->checkReturnStatus(retStatus);
4959 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004960 RLOGE("setTTYModeResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004961 }
4962
4963 return 0;
4964}
4965
Amit Mahajan759786a2017-03-03 17:35:47 -08004966int radio::getTTYModeResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004967 int responseType, int serial, RIL_Errno e,
4968 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004969#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004970 RLOGD("getTTYModeResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004971#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004972
4973 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004974 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004975 int ret = responseInt(responseInfo, serial, responseType, e, response, responseLen);
4976 Return<void> retStatus
4977 = radioService[slotId]->mRadioResponse->getTTYModeResponse(responseInfo,
4978 (TtyMode) ret);
4979 radioService[slotId]->checkReturnStatus(retStatus);
4980 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004981 RLOGE("getTTYModeResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004982 }
4983
4984 return 0;
4985}
4986
Amit Mahajan759786a2017-03-03 17:35:47 -08004987int radio::setPreferredVoicePrivacyResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004988 int responseType, int serial, RIL_Errno e,
4989 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004990#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004991 RLOGD("setPreferredVoicePrivacyResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004992#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004993
4994 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004995 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004996 populateResponseInfo(responseInfo, serial, responseType, e);
4997 Return<void> retStatus
4998 = radioService[slotId]->mRadioResponse->setPreferredVoicePrivacyResponse(
4999 responseInfo);
5000 radioService[slotId]->checkReturnStatus(retStatus);
5001 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005002 RLOGE("setPreferredVoicePrivacyResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005003 slotId);
5004 }
5005
5006 return 0;
5007}
5008
Amit Mahajan759786a2017-03-03 17:35:47 -08005009int radio::getPreferredVoicePrivacyResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005010 int responseType, int serial, RIL_Errno e,
5011 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005012#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005013 RLOGD("getPreferredVoicePrivacyResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005014#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005015
5016 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005017 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005018 populateResponseInfo(responseInfo, serial, responseType, e);
5019 bool enable = false;
5020 int numInts = responseLen / sizeof(int);
5021 if (response == NULL || numInts != 1) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005022 RLOGE("getPreferredVoicePrivacyResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005023 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
5024 } else {
5025 int *pInt = (int *) response;
5026 enable = pInt[0] == 1 ? true : false;
5027 }
5028 Return<void> retStatus
5029 = radioService[slotId]->mRadioResponse->getPreferredVoicePrivacyResponse(
5030 responseInfo, enable);
5031 radioService[slotId]->checkReturnStatus(retStatus);
5032 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005033 RLOGE("getPreferredVoicePrivacyResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005034 slotId);
5035 }
5036
5037 return 0;
5038}
5039
Amit Mahajan759786a2017-03-03 17:35:47 -08005040int radio::sendCDMAFeatureCodeResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005041 int responseType, int serial, RIL_Errno e,
5042 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005043#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005044 RLOGD("sendCDMAFeatureCodeResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005045#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005046
5047 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005048 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005049 populateResponseInfo(responseInfo, serial, responseType, e);
5050 Return<void> retStatus
5051 = radioService[slotId]->mRadioResponse->sendCDMAFeatureCodeResponse(responseInfo);
5052 radioService[slotId]->checkReturnStatus(retStatus);
5053 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005054 RLOGE("sendCDMAFeatureCodeResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005055 slotId);
5056 }
5057
5058 return 0;
5059}
5060
Amit Mahajan759786a2017-03-03 17:35:47 -08005061int radio::sendBurstDtmfResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005062 int responseType, int serial, RIL_Errno e,
5063 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005064#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005065 RLOGD("sendBurstDtmfResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005066#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005067
5068 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005069 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005070 populateResponseInfo(responseInfo, serial, responseType, e);
5071 Return<void> retStatus
5072 = radioService[slotId]->mRadioResponse->sendBurstDtmfResponse(responseInfo);
5073 radioService[slotId]->checkReturnStatus(retStatus);
5074 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005075 RLOGE("sendBurstDtmfResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005076 }
5077
5078 return 0;
5079}
5080
Amit Mahajan759786a2017-03-03 17:35:47 -08005081int radio::sendCdmaSmsResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005082 int responseType, int serial, RIL_Errno e, void *response,
5083 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005084#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005085 RLOGD("sendCdmaSmsResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005086#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005087
5088 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005089 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005090 SendSmsResult result = makeSendSmsResult(responseInfo, serial, responseType, e, response,
5091 responseLen);
5092
5093 Return<void> retStatus
5094 = radioService[slotId]->mRadioResponse->sendCdmaSmsResponse(responseInfo, result);
5095 radioService[slotId]->checkReturnStatus(retStatus);
5096 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005097 RLOGE("sendCdmaSmsResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005098 }
5099
5100 return 0;
5101}
5102
Amit Mahajan759786a2017-03-03 17:35:47 -08005103int radio::acknowledgeLastIncomingCdmaSmsResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005104 int responseType, int serial, RIL_Errno e,
5105 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005106#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005107 RLOGD("acknowledgeLastIncomingCdmaSmsResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005108#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005109
5110 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005111 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005112 populateResponseInfo(responseInfo, serial, responseType, e);
5113 Return<void> retStatus
5114 = radioService[slotId]->mRadioResponse->acknowledgeLastIncomingCdmaSmsResponse(
5115 responseInfo);
5116 radioService[slotId]->checkReturnStatus(retStatus);
5117 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005118 RLOGE("acknowledgeLastIncomingCdmaSmsResponse: radioService[%d]->mRadioResponse "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005119 "== NULL", slotId);
5120 }
5121
5122 return 0;
5123}
5124
Amit Mahajan759786a2017-03-03 17:35:47 -08005125int radio::getGsmBroadcastConfigResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005126 int responseType, int serial, RIL_Errno e,
5127 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005128#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005129 RLOGD("getGsmBroadcastConfigResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005130#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005131
5132 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005133 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005134 populateResponseInfo(responseInfo, serial, responseType, e);
5135 hidl_vec<GsmBroadcastSmsConfigInfo> configs;
5136
5137 if (response == NULL || responseLen % sizeof(RIL_GSM_BroadcastSmsConfigInfo *) != 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005138 RLOGE("getGsmBroadcastConfigResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005139 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
5140 } else {
5141 int num = responseLen / sizeof(RIL_GSM_BroadcastSmsConfigInfo *);
5142 configs.resize(num);
5143 for (int i = 0 ; i < num; i++) {
5144 RIL_GSM_BroadcastSmsConfigInfo *resp =
5145 ((RIL_GSM_BroadcastSmsConfigInfo **) response)[i];
5146 configs[i].fromServiceId = resp->fromServiceId;
5147 configs[i].toServiceId = resp->toServiceId;
5148 configs[i].fromCodeScheme = resp->fromCodeScheme;
5149 configs[i].toCodeScheme = resp->toCodeScheme;
5150 configs[i].selected = resp->selected == 1 ? true : false;
5151 }
5152 }
5153
5154 Return<void> retStatus
5155 = radioService[slotId]->mRadioResponse->getGsmBroadcastConfigResponse(responseInfo,
5156 configs);
5157 radioService[slotId]->checkReturnStatus(retStatus);
5158 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005159 RLOGE("getGsmBroadcastConfigResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005160 slotId);
5161 }
5162
5163 return 0;
5164}
5165
Amit Mahajan759786a2017-03-03 17:35:47 -08005166int radio::setGsmBroadcastConfigResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005167 int responseType, int serial, RIL_Errno e,
5168 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005169#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005170 RLOGD("setGsmBroadcastConfigResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005171#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005172
5173 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005174 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005175 populateResponseInfo(responseInfo, serial, responseType, e);
5176 Return<void> retStatus
5177 = radioService[slotId]->mRadioResponse->setGsmBroadcastConfigResponse(responseInfo);
5178 radioService[slotId]->checkReturnStatus(retStatus);
5179 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005180 RLOGE("setGsmBroadcastConfigResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005181 slotId);
5182 }
5183
5184 return 0;
5185}
5186
Amit Mahajan759786a2017-03-03 17:35:47 -08005187int radio::setGsmBroadcastActivationResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005188 int responseType, int serial, RIL_Errno e,
5189 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005190#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005191 RLOGD("setGsmBroadcastActivationResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005192#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005193
5194 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005195 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005196 populateResponseInfo(responseInfo, serial, responseType, e);
5197 Return<void> retStatus
5198 = radioService[slotId]->mRadioResponse->setGsmBroadcastActivationResponse(
5199 responseInfo);
5200 radioService[slotId]->checkReturnStatus(retStatus);
5201 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005202 RLOGE("setGsmBroadcastActivationResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005203 slotId);
5204 }
5205
5206 return 0;
5207}
5208
Amit Mahajan759786a2017-03-03 17:35:47 -08005209int radio::getCdmaBroadcastConfigResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005210 int responseType, int serial, RIL_Errno e,
5211 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005212#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005213 RLOGD("getCdmaBroadcastConfigResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005214#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005215
5216 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005217 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005218 populateResponseInfo(responseInfo, serial, responseType, e);
5219 hidl_vec<CdmaBroadcastSmsConfigInfo> configs;
5220
5221 if (response == NULL || responseLen % sizeof(RIL_CDMA_BroadcastSmsConfigInfo *) != 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005222 RLOGE("getCdmaBroadcastConfigResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005223 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
5224 } else {
5225 int num = responseLen / sizeof(RIL_CDMA_BroadcastSmsConfigInfo *);
5226 configs.resize(num);
5227 for (int i = 0 ; i < num; i++) {
5228 RIL_CDMA_BroadcastSmsConfigInfo *resp =
5229 ((RIL_CDMA_BroadcastSmsConfigInfo **) response)[i];
5230 configs[i].serviceCategory = resp->service_category;
5231 configs[i].language = resp->language;
5232 configs[i].selected = resp->selected == 1 ? true : false;
5233 }
5234 }
5235
5236 Return<void> retStatus
5237 = radioService[slotId]->mRadioResponse->getCdmaBroadcastConfigResponse(responseInfo,
5238 configs);
5239 radioService[slotId]->checkReturnStatus(retStatus);
5240 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005241 RLOGE("getCdmaBroadcastConfigResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005242 slotId);
5243 }
5244
5245 return 0;
5246}
5247
Amit Mahajan759786a2017-03-03 17:35:47 -08005248int radio::setCdmaBroadcastConfigResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005249 int responseType, int serial, RIL_Errno e,
5250 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005251#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005252 RLOGD("setCdmaBroadcastConfigResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005253#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005254
5255 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005256 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005257 populateResponseInfo(responseInfo, serial, responseType, e);
5258 Return<void> retStatus
5259 = radioService[slotId]->mRadioResponse->setCdmaBroadcastConfigResponse(
5260 responseInfo);
5261 radioService[slotId]->checkReturnStatus(retStatus);
5262 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005263 RLOGE("setCdmaBroadcastConfigResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005264 slotId);
5265 }
5266
5267 return 0;
5268}
5269
Amit Mahajan759786a2017-03-03 17:35:47 -08005270int radio::setCdmaBroadcastActivationResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005271 int responseType, int serial, RIL_Errno e,
5272 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005273#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005274 RLOGD("setCdmaBroadcastActivationResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005275#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005276
5277 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005278 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005279 populateResponseInfo(responseInfo, serial, responseType, e);
5280 Return<void> retStatus
5281 = radioService[slotId]->mRadioResponse->setCdmaBroadcastActivationResponse(
5282 responseInfo);
5283 radioService[slotId]->checkReturnStatus(retStatus);
5284 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005285 RLOGE("setCdmaBroadcastActivationResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005286 slotId);
5287 }
5288
5289 return 0;
5290}
5291
Amit Mahajan759786a2017-03-03 17:35:47 -08005292int radio::getCDMASubscriptionResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005293 int responseType, int serial, RIL_Errno e, void *response,
5294 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005295#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005296 RLOGD("getCDMASubscriptionResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005297#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005298
5299 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005300 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005301 populateResponseInfo(responseInfo, serial, responseType, e);
5302
5303 int numStrings = responseLen / sizeof(char *);
5304 hidl_string emptyString;
5305 if (response == NULL || numStrings != 5) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005306 RLOGE("getOperatorResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005307 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
5308 Return<void> retStatus
5309 = radioService[slotId]->mRadioResponse->getCDMASubscriptionResponse(
5310 responseInfo, emptyString, emptyString, emptyString, emptyString, emptyString);
5311 radioService[slotId]->checkReturnStatus(retStatus);
5312 } else {
5313 char **resp = (char **) response;
5314 Return<void> retStatus
5315 = radioService[slotId]->mRadioResponse->getCDMASubscriptionResponse(
5316 responseInfo,
5317 convertCharPtrToHidlString(resp[0]),
5318 convertCharPtrToHidlString(resp[1]),
5319 convertCharPtrToHidlString(resp[2]),
5320 convertCharPtrToHidlString(resp[3]),
5321 convertCharPtrToHidlString(resp[4]));
5322 radioService[slotId]->checkReturnStatus(retStatus);
5323 }
5324 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005325 RLOGE("getCDMASubscriptionResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005326 slotId);
5327 }
5328
5329 return 0;
5330}
5331
Amit Mahajan759786a2017-03-03 17:35:47 -08005332int radio::writeSmsToRuimResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005333 int responseType, int serial, RIL_Errno e,
5334 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005335#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005336 RLOGD("writeSmsToRuimResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005337#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005338
5339 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005340 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005341 int ret = responseInt(responseInfo, serial, responseType, e, response, responseLen);
5342 Return<void> retStatus
5343 = radioService[slotId]->mRadioResponse->writeSmsToRuimResponse(responseInfo, ret);
5344 radioService[slotId]->checkReturnStatus(retStatus);
5345 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005346 RLOGE("writeSmsToRuimResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005347 }
5348
5349 return 0;
5350}
5351
Amit Mahajan759786a2017-03-03 17:35:47 -08005352int radio::deleteSmsOnRuimResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005353 int responseType, int serial, RIL_Errno e,
5354 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005355#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005356 RLOGD("deleteSmsOnRuimResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005357#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005358
5359 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005360 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005361 populateResponseInfo(responseInfo, serial, responseType, e);
5362 Return<void> retStatus
5363 = radioService[slotId]->mRadioResponse->deleteSmsOnRuimResponse(responseInfo);
5364 radioService[slotId]->checkReturnStatus(retStatus);
5365 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005366 RLOGE("deleteSmsOnRuimResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005367 }
5368
5369 return 0;
5370}
5371
Amit Mahajan759786a2017-03-03 17:35:47 -08005372int radio::getDeviceIdentityResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005373 int responseType, int serial, RIL_Errno e, void *response,
5374 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005375#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005376 RLOGD("getDeviceIdentityResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005377#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005378
5379 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005380 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005381 populateResponseInfo(responseInfo, serial, responseType, e);
5382
5383 int numStrings = responseLen / sizeof(char *);
5384 hidl_string emptyString;
5385 if (response == NULL || numStrings != 4) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005386 RLOGE("getDeviceIdentityResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005387 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
5388 Return<void> retStatus
5389 = radioService[slotId]->mRadioResponse->getDeviceIdentityResponse(responseInfo,
5390 emptyString, emptyString, emptyString, emptyString);
5391 radioService[slotId]->checkReturnStatus(retStatus);
5392 } else {
5393 char **resp = (char **) response;
5394 Return<void> retStatus
5395 = radioService[slotId]->mRadioResponse->getDeviceIdentityResponse(responseInfo,
5396 convertCharPtrToHidlString(resp[0]),
5397 convertCharPtrToHidlString(resp[1]),
5398 convertCharPtrToHidlString(resp[2]),
5399 convertCharPtrToHidlString(resp[3]));
5400 radioService[slotId]->checkReturnStatus(retStatus);
5401 }
5402 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005403 RLOGE("getDeviceIdentityResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005404 slotId);
5405 }
5406
5407 return 0;
5408}
5409
Amit Mahajan759786a2017-03-03 17:35:47 -08005410int radio::exitEmergencyCallbackModeResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005411 int responseType, int serial, RIL_Errno e,
5412 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005413#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005414 RLOGD("exitEmergencyCallbackModeResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005415#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005416
5417 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005418 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005419 populateResponseInfo(responseInfo, serial, responseType, e);
5420 Return<void> retStatus
5421 = radioService[slotId]->mRadioResponse->exitEmergencyCallbackModeResponse(
5422 responseInfo);
5423 radioService[slotId]->checkReturnStatus(retStatus);
5424 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005425 RLOGE("exitEmergencyCallbackModeResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005426 slotId);
5427 }
5428
5429 return 0;
5430}
5431
Amit Mahajan759786a2017-03-03 17:35:47 -08005432int radio::getSmscAddressResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005433 int responseType, int serial, RIL_Errno e,
5434 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005435#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005436 RLOGD("getSmscAddressResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005437#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005438
5439 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005440 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005441 populateResponseInfo(responseInfo, serial, responseType, e);
5442 Return<void> retStatus
5443 = radioService[slotId]->mRadioResponse->getSmscAddressResponse(responseInfo,
5444 convertCharPtrToHidlString((char *) response));
5445 radioService[slotId]->checkReturnStatus(retStatus);
5446 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005447 RLOGE("getSmscAddressResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005448 }
5449
5450 return 0;
5451}
5452
Amit Mahajan759786a2017-03-03 17:35:47 -08005453int radio::setSmscAddressResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005454 int responseType, int serial, RIL_Errno e,
5455 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005456#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005457 RLOGD("setSmscAddressResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005458#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005459
5460 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005461 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005462 populateResponseInfo(responseInfo, serial, responseType, e);
5463 Return<void> retStatus
5464 = radioService[slotId]->mRadioResponse->setSmscAddressResponse(responseInfo);
5465 radioService[slotId]->checkReturnStatus(retStatus);
5466 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005467 RLOGE("setSmscAddressResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005468 }
5469
5470 return 0;
5471}
5472
Amit Mahajan759786a2017-03-03 17:35:47 -08005473int radio::reportSmsMemoryStatusResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005474 int responseType, int serial, RIL_Errno e,
5475 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005476#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005477 RLOGD("reportSmsMemoryStatusResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005478#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005479
5480 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005481 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005482 populateResponseInfo(responseInfo, serial, responseType, e);
5483 Return<void> retStatus
5484 = radioService[slotId]->mRadioResponse->reportSmsMemoryStatusResponse(responseInfo);
5485 radioService[slotId]->checkReturnStatus(retStatus);
5486 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005487 RLOGE("reportSmsMemoryStatusResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005488 slotId);
5489 }
5490
5491 return 0;
5492}
5493
Amit Mahajan759786a2017-03-03 17:35:47 -08005494int radio::reportStkServiceIsRunningResponse(int slotId,
Amit Mahajan5007ffa2017-01-31 17:14:42 -08005495 int responseType, int serial, RIL_Errno e,
5496 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005497#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005498 RLOGD("reportStkServiceIsRunningResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005499#endif
Amit Mahajan5007ffa2017-01-31 17:14:42 -08005500
5501 if (radioService[slotId]->mRadioResponse != NULL) {
Amit Mahajan3da9ac02017-02-13 13:41:28 -08005502 RadioResponseInfo responseInfo = {};
Amit Mahajan5007ffa2017-01-31 17:14:42 -08005503 populateResponseInfo(responseInfo, serial, responseType, e);
5504 Return<void> retStatus = radioService[slotId]->mRadioResponse->
5505 reportStkServiceIsRunningResponse(responseInfo);
5506 radioService[slotId]->checkReturnStatus(retStatus);
5507 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005508 RLOGE("reportStkServiceIsRunningResponse: radioService[%d]->mRadioResponse == NULL",
Amit Mahajan5007ffa2017-01-31 17:14:42 -08005509 slotId);
5510 }
5511
5512 return 0;
5513}
5514
Amit Mahajan759786a2017-03-03 17:35:47 -08005515int radio::getCdmaSubscriptionSourceResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005516 int responseType, int serial, RIL_Errno e,
5517 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005518#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005519 RLOGD("getCdmaSubscriptionSourceResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005520#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005521
5522 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005523 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005524 int ret = responseInt(responseInfo, serial, responseType, e, response, responseLen);
5525 Return<void> retStatus
5526 = radioService[slotId]->mRadioResponse->getCdmaSubscriptionSourceResponse(
5527 responseInfo, (CdmaSubscriptionSource) ret);
5528 radioService[slotId]->checkReturnStatus(retStatus);
5529 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005530 RLOGE("getCdmaSubscriptionSourceResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005531 slotId);
5532 }
5533
5534 return 0;
5535}
5536
Amit Mahajan759786a2017-03-03 17:35:47 -08005537int radio::requestIsimAuthenticationResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005538 int responseType, int serial, RIL_Errno e,
5539 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005540#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005541 RLOGD("requestIsimAuthenticationResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005542#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005543
5544 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005545 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005546 populateResponseInfo(responseInfo, serial, responseType, e);
5547 Return<void> retStatus
5548 = radioService[slotId]->mRadioResponse->requestIsimAuthenticationResponse(
5549 responseInfo,
5550 convertCharPtrToHidlString((char *) response));
5551 radioService[slotId]->checkReturnStatus(retStatus);
5552 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005553 RLOGE("requestIsimAuthenticationResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005554 slotId);
5555 }
5556
5557 return 0;
5558}
5559
Amit Mahajan759786a2017-03-03 17:35:47 -08005560int radio::acknowledgeIncomingGsmSmsWithPduResponse(int slotId,
5561 int responseType,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005562 int serial, RIL_Errno e, void *response,
5563 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005564#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005565 RLOGD("acknowledgeIncomingGsmSmsWithPduResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005566#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005567
5568 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005569 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005570 populateResponseInfo(responseInfo, serial, responseType, e);
5571 Return<void> retStatus
5572 = radioService[slotId]->mRadioResponse->acknowledgeIncomingGsmSmsWithPduResponse(
5573 responseInfo);
5574 radioService[slotId]->checkReturnStatus(retStatus);
5575 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005576 RLOGE("acknowledgeIncomingGsmSmsWithPduResponse: radioService[%d]->mRadioResponse "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005577 "== NULL", slotId);
5578 }
5579
5580 return 0;
5581}
5582
Amit Mahajan759786a2017-03-03 17:35:47 -08005583int radio::sendEnvelopeWithStatusResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005584 int responseType, int serial, RIL_Errno e, void *response,
5585 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005586#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005587 RLOGD("sendEnvelopeWithStatusResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005588#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005589
5590 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005591 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005592 IccIoResult result = responseIccIo(responseInfo, serial, responseType, e,
5593 response, responseLen);
5594
5595 Return<void> retStatus
5596 = radioService[slotId]->mRadioResponse->sendEnvelopeWithStatusResponse(responseInfo,
5597 result);
5598 radioService[slotId]->checkReturnStatus(retStatus);
5599 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005600 RLOGE("sendEnvelopeWithStatusResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005601 slotId);
5602 }
5603
5604 return 0;
5605}
5606
Amit Mahajan759786a2017-03-03 17:35:47 -08005607int radio::getVoiceRadioTechnologyResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005608 int responseType, int serial, RIL_Errno e,
5609 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005610#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005611 RLOGD("getVoiceRadioTechnologyResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005612#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005613
5614 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005615 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005616 int ret = responseInt(responseInfo, serial, responseType, e, response, responseLen);
5617 Return<void> retStatus
5618 = radioService[slotId]->mRadioResponse->getVoiceRadioTechnologyResponse(
5619 responseInfo, (RadioTechnology) ret);
5620 radioService[slotId]->checkReturnStatus(retStatus);
5621 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005622 RLOGE("getVoiceRadioTechnologyResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005623 slotId);
5624 }
5625
5626 return 0;
5627}
5628
Amit Mahajan759786a2017-03-03 17:35:47 -08005629int radio::getCellInfoListResponse(int slotId,
5630 int responseType,
Amit Mahajan3df62912017-02-10 01:35:55 +00005631 int serial, RIL_Errno e, void *response,
5632 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005633#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005634 RLOGD("getCellInfoListResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005635#endif
Amit Mahajan3df62912017-02-10 01:35:55 +00005636
5637 if (radioService[slotId]->mRadioResponse != NULL) {
Amit Mahajan3da9ac02017-02-13 13:41:28 -08005638 RadioResponseInfo responseInfo = {};
Amit Mahajan3df62912017-02-10 01:35:55 +00005639 populateResponseInfo(responseInfo, serial, responseType, e);
5640
5641 hidl_vec<CellInfo> ret;
5642 if (response == NULL || responseLen % sizeof(RIL_CellInfo_v12) != 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005643 RLOGE("getCellInfoListResponse: Invalid response");
Amit Mahajan3df62912017-02-10 01:35:55 +00005644 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
5645 } else {
5646 convertRilCellInfoListToHal(response, responseLen, ret);
5647 }
5648
5649 Return<void> retStatus = radioService[slotId]->mRadioResponse->getCellInfoListResponse(
5650 responseInfo, ret);
5651 radioService[slotId]->checkReturnStatus(retStatus);
5652 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005653 RLOGE("getCellInfoListResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Amit Mahajan3df62912017-02-10 01:35:55 +00005654 }
5655
5656 return 0;
5657}
5658
Amit Mahajan759786a2017-03-03 17:35:47 -08005659int radio::setCellInfoListRateResponse(int slotId,
5660 int responseType,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005661 int serial, RIL_Errno e, void *response,
5662 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005663#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005664 RLOGD("setCellInfoListRateResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005665#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005666
5667 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005668 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005669 populateResponseInfo(responseInfo, serial, responseType, e);
5670 Return<void> retStatus
5671 = radioService[slotId]->mRadioResponse->setCellInfoListRateResponse(responseInfo);
5672 radioService[slotId]->checkReturnStatus(retStatus);
5673 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005674 RLOGE("setCellInfoListRateResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005675 slotId);
5676 }
5677
5678 return 0;
5679}
5680
Amit Mahajan759786a2017-03-03 17:35:47 -08005681int radio::setInitialAttachApnResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005682 int responseType, int serial, RIL_Errno e,
5683 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005684#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005685 RLOGD("setInitialAttachApnResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005686#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005687
5688 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005689 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005690 populateResponseInfo(responseInfo, serial, responseType, e);
5691 Return<void> retStatus
5692 = radioService[slotId]->mRadioResponse->setInitialAttachApnResponse(responseInfo);
5693 radioService[slotId]->checkReturnStatus(retStatus);
5694 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005695 RLOGE("setInitialAttachApnResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005696 slotId);
5697 }
5698
5699 return 0;
5700}
5701
Amit Mahajan759786a2017-03-03 17:35:47 -08005702int radio::getImsRegistrationStateResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005703 int responseType, int serial, RIL_Errno e,
5704 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005705#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005706 RLOGD("getImsRegistrationStateResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005707#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005708
5709 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005710 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005711 populateResponseInfo(responseInfo, serial, responseType, e);
5712 bool isRegistered = false;
5713 int ratFamily = 0;
5714 int numInts = responseLen / sizeof(int);
5715 if (response == NULL || numInts != 2) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005716 RLOGE("getImsRegistrationStateResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005717 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
5718 } else {
5719 int *pInt = (int *) response;
5720 isRegistered = pInt[0] == 1 ? true : false;
5721 ratFamily = pInt[1];
5722 }
5723 Return<void> retStatus
5724 = radioService[slotId]->mRadioResponse->getImsRegistrationStateResponse(
5725 responseInfo, isRegistered, (RadioTechnologyFamily) ratFamily);
5726 radioService[slotId]->checkReturnStatus(retStatus);
5727 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005728 RLOGE("getImsRegistrationStateResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005729 slotId);
5730 }
5731
5732 return 0;
5733}
5734
Amit Mahajan759786a2017-03-03 17:35:47 -08005735int radio::sendImsSmsResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005736 int responseType, int serial, RIL_Errno e, void *response,
5737 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005738#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005739 RLOGD("sendImsSmsResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005740#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005741
5742 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005743 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005744 SendSmsResult result = makeSendSmsResult(responseInfo, serial, responseType, e, response,
5745 responseLen);
5746
5747 Return<void> retStatus
5748 = radioService[slotId]->mRadioResponse->sendImsSmsResponse(responseInfo, result);
5749 radioService[slotId]->checkReturnStatus(retStatus);
5750 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005751 RLOGE("sendSmsResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005752 }
5753
5754 return 0;
5755}
5756
Amit Mahajan759786a2017-03-03 17:35:47 -08005757int radio::iccTransmitApduBasicChannelResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005758 int responseType, int serial, RIL_Errno e,
5759 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005760#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005761 RLOGD("iccTransmitApduBasicChannelResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005762#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005763
5764 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005765 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005766 IccIoResult result = responseIccIo(responseInfo, serial, responseType, e, response,
5767 responseLen);
5768
5769 Return<void> retStatus
5770 = radioService[slotId]->mRadioResponse->iccTransmitApduBasicChannelResponse(
5771 responseInfo, result);
5772 radioService[slotId]->checkReturnStatus(retStatus);
5773 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005774 RLOGE("iccTransmitApduBasicChannelResponse: radioService[%d]->mRadioResponse "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005775 "== NULL", slotId);
5776 }
5777
5778 return 0;
5779}
5780
Amit Mahajan759786a2017-03-03 17:35:47 -08005781int radio::iccOpenLogicalChannelResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005782 int responseType, int serial, RIL_Errno e, void *response,
5783 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005784#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005785 RLOGD("iccOpenLogicalChannelResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005786#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005787
5788 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005789 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005790 populateResponseInfo(responseInfo, serial, responseType, e);
5791 int channelId = -1;
5792 hidl_vec<int8_t> selectResponse;
5793 int numInts = responseLen / sizeof(int);
5794 if (response == NULL || responseLen % sizeof(int) != 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005795 RLOGE("iccOpenLogicalChannelResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005796 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
5797 } else {
5798 int *pInt = (int *) response;
5799 channelId = pInt[0];
5800 selectResponse.resize(numInts - 1);
5801 for (int i = 1; i < numInts; i++) {
5802 selectResponse[i - 1] = (int8_t) pInt[i];
5803 }
5804 }
5805 Return<void> retStatus
5806 = radioService[slotId]->mRadioResponse->iccOpenLogicalChannelResponse(responseInfo,
5807 channelId, selectResponse);
5808 radioService[slotId]->checkReturnStatus(retStatus);
5809 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005810 RLOGE("iccOpenLogicalChannelResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005811 slotId);
5812 }
5813
5814 return 0;
5815}
5816
Amit Mahajan759786a2017-03-03 17:35:47 -08005817int radio::iccCloseLogicalChannelResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005818 int responseType, int serial, RIL_Errno e,
5819 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005820#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005821 RLOGD("iccCloseLogicalChannelResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005822#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005823
5824 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005825 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005826 populateResponseInfo(responseInfo, serial, responseType, e);
5827 Return<void> retStatus
5828 = radioService[slotId]->mRadioResponse->iccCloseLogicalChannelResponse(
5829 responseInfo);
5830 radioService[slotId]->checkReturnStatus(retStatus);
5831 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005832 RLOGE("iccCloseLogicalChannelResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005833 slotId);
5834 }
5835
5836 return 0;
5837}
5838
Amit Mahajan759786a2017-03-03 17:35:47 -08005839int radio::iccTransmitApduLogicalChannelResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005840 int responseType, int serial, RIL_Errno e,
5841 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005842#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005843 RLOGD("iccTransmitApduLogicalChannelResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005844#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005845
5846 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005847 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005848 IccIoResult result = responseIccIo(responseInfo, serial, responseType, e, response,
5849 responseLen);
5850
5851 Return<void> retStatus
5852 = radioService[slotId]->mRadioResponse->iccTransmitApduLogicalChannelResponse(
5853 responseInfo, result);
5854 radioService[slotId]->checkReturnStatus(retStatus);
5855 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005856 RLOGE("iccTransmitApduLogicalChannelResponse: radioService[%d]->mRadioResponse "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005857 "== NULL", slotId);
5858 }
5859
5860 return 0;
5861}
5862
Amit Mahajan759786a2017-03-03 17:35:47 -08005863int radio::nvReadItemResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005864 int responseType, int serial, RIL_Errno e,
5865 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005866#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005867 RLOGD("nvReadItemResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005868#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005869
5870 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005871 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005872 populateResponseInfo(responseInfo, serial, responseType, e);
5873 Return<void> retStatus = radioService[slotId]->mRadioResponse->nvReadItemResponse(
5874 responseInfo,
5875 convertCharPtrToHidlString((char *) response));
5876 radioService[slotId]->checkReturnStatus(retStatus);
5877 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005878 RLOGE("nvReadItemResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005879 }
5880
5881 return 0;
5882}
5883
Amit Mahajan759786a2017-03-03 17:35:47 -08005884int radio::nvWriteItemResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005885 int responseType, int serial, RIL_Errno e,
5886 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005887#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005888 RLOGD("nvWriteItemResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005889#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005890
5891 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005892 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005893 populateResponseInfo(responseInfo, serial, responseType, e);
5894 Return<void> retStatus
5895 = radioService[slotId]->mRadioResponse->nvWriteItemResponse(responseInfo);
5896 radioService[slotId]->checkReturnStatus(retStatus);
5897 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005898 RLOGE("nvWriteItemResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005899 }
5900
5901 return 0;
5902}
5903
Amit Mahajan759786a2017-03-03 17:35:47 -08005904int radio::nvWriteCdmaPrlResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005905 int responseType, int serial, RIL_Errno e,
5906 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005907#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005908 RLOGD("nvWriteCdmaPrlResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005909#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005910
5911 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005912 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005913 populateResponseInfo(responseInfo, serial, responseType, e);
5914 Return<void> retStatus
5915 = radioService[slotId]->mRadioResponse->nvWriteCdmaPrlResponse(responseInfo);
5916 radioService[slotId]->checkReturnStatus(retStatus);
5917 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005918 RLOGE("nvWriteCdmaPrlResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005919 }
5920
5921 return 0;
5922}
5923
Amit Mahajan759786a2017-03-03 17:35:47 -08005924int radio::nvResetConfigResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005925 int responseType, int serial, RIL_Errno e,
5926 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005927#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005928 RLOGD("nvResetConfigResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005929#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005930
5931 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005932 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005933 populateResponseInfo(responseInfo, serial, responseType, e);
5934 Return<void> retStatus
5935 = radioService[slotId]->mRadioResponse->nvResetConfigResponse(responseInfo);
5936 radioService[slotId]->checkReturnStatus(retStatus);
5937 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005938 RLOGE("nvResetConfigResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005939 }
5940
5941 return 0;
5942}
5943
Amit Mahajan759786a2017-03-03 17:35:47 -08005944int radio::setUiccSubscriptionResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005945 int responseType, int serial, RIL_Errno e,
5946 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005947#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005948 RLOGD("setUiccSubscriptionResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005949#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005950
5951 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005952 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005953 populateResponseInfo(responseInfo, serial, responseType, e);
5954 Return<void> retStatus
5955 = radioService[slotId]->mRadioResponse->setUiccSubscriptionResponse(responseInfo);
5956 radioService[slotId]->checkReturnStatus(retStatus);
5957 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005958 RLOGE("setUiccSubscriptionResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005959 slotId);
5960 }
5961
5962 return 0;
5963}
5964
Amit Mahajan759786a2017-03-03 17:35:47 -08005965int radio::setDataAllowedResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005966 int responseType, int serial, RIL_Errno e,
5967 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005968#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005969 RLOGD("setDataAllowedResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005970#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005971
5972 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005973 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005974 populateResponseInfo(responseInfo, serial, responseType, e);
5975 Return<void> retStatus
5976 = radioService[slotId]->mRadioResponse->setDataAllowedResponse(responseInfo);
5977 radioService[slotId]->checkReturnStatus(retStatus);
5978 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005979 RLOGE("setDataAllowedResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005980 }
5981
5982 return 0;
5983}
5984
Amit Mahajan759786a2017-03-03 17:35:47 -08005985int radio::getHardwareConfigResponse(int slotId,
Amit Mahajan3df62912017-02-10 01:35:55 +00005986 int responseType, int serial, RIL_Errno e,
5987 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005988#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005989 RLOGD("getHardwareConfigResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005990#endif
Amit Mahajan3df62912017-02-10 01:35:55 +00005991
5992 if (radioService[slotId]->mRadioResponse != NULL) {
Amit Mahajan3da9ac02017-02-13 13:41:28 -08005993 RadioResponseInfo responseInfo = {};
Amit Mahajan3df62912017-02-10 01:35:55 +00005994 populateResponseInfo(responseInfo, serial, responseType, e);
5995
5996 hidl_vec<HardwareConfig> result;
5997 if (response == NULL || responseLen % sizeof(RIL_HardwareConfig) != 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005998 RLOGE("hardwareConfigChangedInd: invalid response");
Amit Mahajan3df62912017-02-10 01:35:55 +00005999 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
6000 } else {
6001 convertRilHardwareConfigListToHal(response, responseLen, result);
6002 }
6003
6004 Return<void> retStatus = radioService[slotId]->mRadioResponse->getHardwareConfigResponse(
6005 responseInfo, result);
6006 radioService[slotId]->checkReturnStatus(retStatus);
6007 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006008 RLOGE("getHardwareConfigResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Amit Mahajan3df62912017-02-10 01:35:55 +00006009 }
6010
6011 return 0;
6012}
6013
Amit Mahajan759786a2017-03-03 17:35:47 -08006014int radio::requestIccSimAuthenticationResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006015 int responseType, int serial, RIL_Errno e,
6016 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006017#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006018 RLOGD("requestIccSimAuthenticationResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006019#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006020
6021 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08006022 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006023 IccIoResult result = responseIccIo(responseInfo, serial, responseType, e, response,
6024 responseLen);
6025
6026 Return<void> retStatus
6027 = radioService[slotId]->mRadioResponse->requestIccSimAuthenticationResponse(
6028 responseInfo, result);
6029 radioService[slotId]->checkReturnStatus(retStatus);
6030 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006031 RLOGE("requestIccSimAuthenticationResponse: radioService[%d]->mRadioResponse "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006032 "== NULL", slotId);
6033 }
6034
6035 return 0;
6036}
6037
Amit Mahajan759786a2017-03-03 17:35:47 -08006038int radio::setDataProfileResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006039 int responseType, int serial, RIL_Errno e,
6040 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006041#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006042 RLOGD("setDataProfileResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006043#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006044
6045 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08006046 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006047 populateResponseInfo(responseInfo, serial, responseType, e);
6048 Return<void> retStatus
6049 = radioService[slotId]->mRadioResponse->setDataProfileResponse(responseInfo);
6050 radioService[slotId]->checkReturnStatus(retStatus);
6051 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006052 RLOGE("setDataProfileResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006053 }
6054
6055 return 0;
6056}
6057
Amit Mahajan759786a2017-03-03 17:35:47 -08006058int radio::requestShutdownResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006059 int responseType, int serial, RIL_Errno e,
6060 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006061#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006062 RLOGD("requestShutdownResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006063#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006064
6065 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08006066 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006067 populateResponseInfo(responseInfo, serial, responseType, e);
6068 Return<void> retStatus
6069 = radioService[slotId]->mRadioResponse->requestShutdownResponse(responseInfo);
6070 radioService[slotId]->checkReturnStatus(retStatus);
6071 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006072 RLOGE("requestShutdownResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006073 }
6074
6075 return 0;
6076}
6077
Amit Mahajan3df62912017-02-10 01:35:55 +00006078void responseRadioCapability(RadioResponseInfo& responseInfo, int serial,
6079 int responseType, RIL_Errno e, void *response, size_t responseLen, RadioCapability& rc) {
6080 populateResponseInfo(responseInfo, serial, responseType, e);
6081
Amit Mahajan1fbff082017-02-24 11:24:39 -08006082 if (response == NULL || responseLen != sizeof(RIL_RadioCapability)) {
Amit Mahajan3df62912017-02-10 01:35:55 +00006083 RLOGE("responseRadioCapability: Invalid response");
6084 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
Amit Mahajan3da9ac02017-02-13 13:41:28 -08006085 rc.logicalModemUuid = hidl_string();
Amit Mahajan3df62912017-02-10 01:35:55 +00006086 } else {
6087 convertRilRadioCapabilityToHal(response, responseLen, rc);
6088 }
6089}
6090
Amit Mahajan759786a2017-03-03 17:35:47 -08006091int radio::getRadioCapabilityResponse(int slotId,
Amit Mahajan3df62912017-02-10 01:35:55 +00006092 int responseType, int serial, RIL_Errno e,
6093 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006094#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006095 RLOGD("getRadioCapabilityResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006096#endif
Amit Mahajan3df62912017-02-10 01:35:55 +00006097
6098 if (radioService[slotId]->mRadioResponse != NULL) {
Amit Mahajan3da9ac02017-02-13 13:41:28 -08006099 RadioResponseInfo responseInfo = {};
6100 RadioCapability result = {};
Amit Mahajan3df62912017-02-10 01:35:55 +00006101 responseRadioCapability(responseInfo, serial, responseType, e, response, responseLen,
6102 result);
6103 Return<void> retStatus = radioService[slotId]->mRadioResponse->getRadioCapabilityResponse(
6104 responseInfo, result);
6105 radioService[slotId]->checkReturnStatus(retStatus);
6106 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006107 RLOGE("getRadioCapabilityResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Amit Mahajan3df62912017-02-10 01:35:55 +00006108 }
6109
6110 return 0;
6111}
6112
Amit Mahajan759786a2017-03-03 17:35:47 -08006113int radio::setRadioCapabilityResponse(int slotId,
Amit Mahajan3df62912017-02-10 01:35:55 +00006114 int responseType, int serial, RIL_Errno e,
6115 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006116#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006117 RLOGD("setRadioCapabilityResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006118#endif
Amit Mahajan3df62912017-02-10 01:35:55 +00006119
6120 if (radioService[slotId]->mRadioResponse != NULL) {
Amit Mahajan3da9ac02017-02-13 13:41:28 -08006121 RadioResponseInfo responseInfo = {};
6122 RadioCapability result = {};
Amit Mahajan3df62912017-02-10 01:35:55 +00006123 responseRadioCapability(responseInfo, serial, responseType, e, response, responseLen,
6124 result);
6125 Return<void> retStatus = radioService[slotId]->mRadioResponse->setRadioCapabilityResponse(
6126 responseInfo, result);
6127 radioService[slotId]->checkReturnStatus(retStatus);
6128 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006129 RLOGE("setRadioCapabilityResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Amit Mahajan3df62912017-02-10 01:35:55 +00006130 }
6131
6132 return 0;
6133}
6134
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006135LceStatusInfo responseLceStatusInfo(RadioResponseInfo& responseInfo, int serial, int responseType,
6136 RIL_Errno e, void *response, size_t responseLen) {
6137 populateResponseInfo(responseInfo, serial, responseType, e);
Jack Yuf68e0da2017-02-07 14:53:09 -08006138 LceStatusInfo result = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006139
6140 if (response == NULL || responseLen != sizeof(RIL_LceStatusInfo)) {
6141 RLOGE("Invalid response: NULL");
6142 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006143 } else {
6144 RIL_LceStatusInfo *resp = (RIL_LceStatusInfo *) response;
6145 result.lceStatus = (LceStatus) resp->lce_status;
6146 result.actualIntervalMs = (uint8_t) resp->actual_interval_ms;
6147 }
6148 return result;
6149}
6150
Amit Mahajan759786a2017-03-03 17:35:47 -08006151int radio::startLceServiceResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006152 int responseType, int serial, RIL_Errno e,
6153 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006154#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006155 RLOGD("startLceServiceResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006156#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006157
6158 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08006159 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006160 LceStatusInfo result = responseLceStatusInfo(responseInfo, serial, responseType, e,
6161 response, responseLen);
6162
6163 Return<void> retStatus
6164 = radioService[slotId]->mRadioResponse->startLceServiceResponse(responseInfo,
6165 result);
6166 radioService[slotId]->checkReturnStatus(retStatus);
6167 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006168 RLOGE("startLceServiceResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006169 }
6170
6171 return 0;
6172}
6173
Amit Mahajan759786a2017-03-03 17:35:47 -08006174int radio::stopLceServiceResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006175 int responseType, int serial, RIL_Errno e,
6176 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006177#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006178 RLOGD("stopLceServiceResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006179#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006180
6181 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08006182 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006183 LceStatusInfo result = responseLceStatusInfo(responseInfo, serial, responseType, e,
6184 response, responseLen);
6185
6186 Return<void> retStatus
6187 = radioService[slotId]->mRadioResponse->stopLceServiceResponse(responseInfo,
6188 result);
6189 radioService[slotId]->checkReturnStatus(retStatus);
6190 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006191 RLOGE("stopLceServiceResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006192 }
6193
6194 return 0;
6195}
6196
Amit Mahajan759786a2017-03-03 17:35:47 -08006197int radio::pullLceDataResponse(int slotId,
Amit Mahajan3df62912017-02-10 01:35:55 +00006198 int responseType, int serial, RIL_Errno e,
6199 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006200#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006201 RLOGD("pullLceDataResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006202#endif
Amit Mahajan3df62912017-02-10 01:35:55 +00006203
6204 if (radioService[slotId]->mRadioResponse != NULL) {
Amit Mahajan3da9ac02017-02-13 13:41:28 -08006205 RadioResponseInfo responseInfo = {};
Amit Mahajan3df62912017-02-10 01:35:55 +00006206 populateResponseInfo(responseInfo, serial, responseType, e);
6207
Amit Mahajan3da9ac02017-02-13 13:41:28 -08006208 LceDataInfo result = {};
Amit Mahajan3df62912017-02-10 01:35:55 +00006209 if (response == NULL || responseLen != sizeof(RIL_LceDataInfo)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006210 RLOGE("pullLceDataResponse: Invalid response");
Amit Mahajan3df62912017-02-10 01:35:55 +00006211 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
Amit Mahajan3df62912017-02-10 01:35:55 +00006212 } else {
6213 convertRilLceDataInfoToHal(response, responseLen, result);
6214 }
6215
6216 Return<void> retStatus = radioService[slotId]->mRadioResponse->pullLceDataResponse(
6217 responseInfo, result);
6218 radioService[slotId]->checkReturnStatus(retStatus);
6219 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006220 RLOGE("pullLceDataResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Amit Mahajan3df62912017-02-10 01:35:55 +00006221 }
6222
6223 return 0;
6224}
6225
Amit Mahajan759786a2017-03-03 17:35:47 -08006226int radio::getModemActivityInfoResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006227 int responseType, int serial, RIL_Errno e,
6228 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006229#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006230 RLOGD("getModemActivityInfoResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006231#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006232
6233 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08006234 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006235 populateResponseInfo(responseInfo, serial, responseType, e);
6236 ActivityStatsInfo info;
6237 if (response == NULL || responseLen != sizeof(RIL_ActivityStatsInfo)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006238 RLOGE("getModemActivityInfoResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006239 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006240 } else {
6241 RIL_ActivityStatsInfo *resp = (RIL_ActivityStatsInfo *)response;
6242 info.sleepModeTimeMs = resp->sleep_mode_time_ms;
6243 info.idleModeTimeMs = resp->idle_mode_time_ms;
6244 for(int i = 0; i < RIL_NUM_TX_POWER_LEVELS; i++) {
6245 info.txmModetimeMs[i] = resp->tx_mode_time_ms[i];
6246 }
6247 info.rxModeTimeMs = resp->rx_mode_time_ms;
6248 }
6249
6250 Return<void> retStatus
6251 = radioService[slotId]->mRadioResponse->getModemActivityInfoResponse(responseInfo,
6252 info);
6253 radioService[slotId]->checkReturnStatus(retStatus);
6254 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006255 RLOGE("getModemActivityInfoResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006256 slotId);
6257 }
6258
6259 return 0;
6260}
6261
Amit Mahajan759786a2017-03-03 17:35:47 -08006262int radio::setAllowedCarriersResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006263 int responseType, int serial, RIL_Errno e,
6264 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006265#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006266 RLOGD("setAllowedCarriersResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006267#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006268
6269 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08006270 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006271 int ret = responseInt(responseInfo, serial, responseType, e, response, responseLen);
6272 Return<void> retStatus
6273 = radioService[slotId]->mRadioResponse->setAllowedCarriersResponse(responseInfo,
6274 ret);
6275 radioService[slotId]->checkReturnStatus(retStatus);
6276 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006277 RLOGE("setAllowedCarriersResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006278 slotId);
6279 }
6280
6281 return 0;
6282}
6283
Amit Mahajan759786a2017-03-03 17:35:47 -08006284int radio::getAllowedCarriersResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006285 int responseType, int serial, RIL_Errno e,
6286 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006287#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006288 RLOGD("getAllowedCarriersResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006289#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006290
6291 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08006292 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006293 populateResponseInfo(responseInfo, serial, responseType, e);
Jack Yuf68e0da2017-02-07 14:53:09 -08006294 CarrierRestrictions carrierInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006295 bool allAllowed = true;
Jayachandran C70f7d2e2017-04-28 00:57:13 -07006296 if (response == NULL) {
6297#if VDBG
6298 RLOGD("getAllowedCarriersResponse response is NULL: all allowed");
6299#endif
6300 carrierInfo.allowedCarriers.resize(0);
6301 carrierInfo.excludedCarriers.resize(0);
6302 } else if (responseLen != sizeof(RIL_CarrierRestrictions)) {
6303 RLOGE("getAllowedCarriersResponse Invalid response");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006304 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
6305 } else {
6306 RIL_CarrierRestrictions *pCr = (RIL_CarrierRestrictions *)response;
6307 if (pCr->len_allowed_carriers > 0 || pCr->len_excluded_carriers > 0) {
6308 allAllowed = false;
6309 }
6310
6311 carrierInfo.allowedCarriers.resize(pCr->len_allowed_carriers);
6312 for(int i = 0; i < pCr->len_allowed_carriers; i++) {
6313 RIL_Carrier *carrier = pCr->allowed_carriers + i;
6314 carrierInfo.allowedCarriers[i].mcc = convertCharPtrToHidlString(carrier->mcc);
6315 carrierInfo.allowedCarriers[i].mnc = convertCharPtrToHidlString(carrier->mnc);
6316 carrierInfo.allowedCarriers[i].matchType = (CarrierMatchType) carrier->match_type;
6317 carrierInfo.allowedCarriers[i].matchData =
6318 convertCharPtrToHidlString(carrier->match_data);
6319 }
6320
6321 carrierInfo.excludedCarriers.resize(pCr->len_excluded_carriers);
6322 for(int i = 0; i < pCr->len_excluded_carriers; i++) {
6323 RIL_Carrier *carrier = pCr->excluded_carriers + i;
6324 carrierInfo.excludedCarriers[i].mcc = convertCharPtrToHidlString(carrier->mcc);
6325 carrierInfo.excludedCarriers[i].mnc = convertCharPtrToHidlString(carrier->mnc);
6326 carrierInfo.excludedCarriers[i].matchType = (CarrierMatchType) carrier->match_type;
6327 carrierInfo.excludedCarriers[i].matchData =
6328 convertCharPtrToHidlString(carrier->match_data);
6329 }
6330 }
6331
6332 Return<void> retStatus
6333 = radioService[slotId]->mRadioResponse->getAllowedCarriersResponse(responseInfo,
6334 allAllowed, carrierInfo);
6335 radioService[slotId]->checkReturnStatus(retStatus);
6336 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006337 RLOGE("getAllowedCarriersResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006338 slotId);
6339 }
6340
6341 return 0;
6342}
6343
Amit Mahajan759786a2017-03-03 17:35:47 -08006344int radio::sendDeviceStateResponse(int slotId,
Jack Yu11ab4042017-02-21 17:08:01 -08006345 int responseType, int serial, RIL_Errno e,
6346 void *response, size_t responselen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006347#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006348 RLOGD("sendDeviceStateResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006349#endif
Jack Yu11ab4042017-02-21 17:08:01 -08006350
6351 if (radioService[slotId]->mRadioResponse != NULL) {
6352 RadioResponseInfo responseInfo = {};
6353 populateResponseInfo(responseInfo, serial, responseType, e);
6354 Return<void> retStatus
6355 = radioService[slotId]->mRadioResponse->sendDeviceStateResponse(responseInfo);
6356 radioService[slotId]->checkReturnStatus(retStatus);
6357 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006358 RLOGE("sendDeviceStateResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Jack Yu11ab4042017-02-21 17:08:01 -08006359 }
6360
6361 return 0;
6362}
6363
pkanwarc61837e2017-03-17 12:49:34 -07006364int radio::setCarrierInfoForImsiEncryptionResponse(int slotId,
6365 int responseType, int serial, RIL_Errno e,
6366 void *response, size_t responseLen) {
6367 RLOGD("setCarrierInfoForImsiEncryptionResponse: serial %d", serial);
6368 if (radioService[slotId]->mRadioResponse != NULL) {
6369 RadioResponseInfo responseInfo = {};
6370 populateResponseInfo(responseInfo, serial, responseType, e);
6371 Return<sp<::android::hardware::radio::V1_1::IRadioResponse>> ret =
6372 ::android::hardware::radio::V1_1::IRadioResponse::castFrom(
6373 radioService[slotId]->mRadioResponse);
6374 if (ret.isOk()) {
6375 sp<::android::hardware::radio::V1_1::IRadioResponse> radioResponseV1_1 = ret;
6376 Return<void> retStatus
6377 = radioResponseV1_1->setCarrierInfoForImsiEncryptionResponse(responseInfo);
6378 radioService[slotId]->checkReturnStatus(retStatus);
6379 } else {
6380 RLOGE("setCarrierInfoForImsiEncryptionResponse: ret.isOk() == false for "
6381 "radioService[%d]" , slotId);
6382 }
6383 } else {
6384 RLOGE("setCarrierInfoForImsiEncryptionResponse: radioService[%d]->mRadioResponse == NULL",
6385 slotId);
6386 }
6387 return 0;
6388}
6389
Amit Mahajan759786a2017-03-03 17:35:47 -08006390int radio::setIndicationFilterResponse(int slotId,
Jack Yu11ab4042017-02-21 17:08:01 -08006391 int responseType, int serial, RIL_Errno e,
6392 void *response, size_t responselen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006393#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006394 RLOGD("setIndicationFilterResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006395#endif
Jack Yu11ab4042017-02-21 17:08:01 -08006396
6397 if (radioService[slotId]->mRadioResponse != NULL) {
6398 RadioResponseInfo responseInfo = {};
6399 populateResponseInfo(responseInfo, serial, responseType, e);
6400 Return<void> retStatus
6401 = radioService[slotId]->mRadioResponse->setIndicationFilterResponse(responseInfo);
6402 radioService[slotId]->checkReturnStatus(retStatus);
6403 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006404 RLOGE("setIndicationFilterResponse: radioService[%d]->mRadioResponse == NULL",
Jack Yu11ab4042017-02-21 17:08:01 -08006405 slotId);
6406 }
6407
6408 return 0;
6409}
6410
Amit Mahajan759786a2017-03-03 17:35:47 -08006411int radio::setSimCardPowerResponse(int slotId,
Wileen Chiu718c0bf2017-01-04 11:37:19 -08006412 int responseType, int serial, RIL_Errno e,
6413 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006414#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006415 RLOGD("setSimCardPowerResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006416#endif
Wileen Chiu718c0bf2017-01-04 11:37:19 -08006417
6418 if (radioService[slotId]->mRadioResponse != NULL) {
6419 RadioResponseInfo responseInfo = {};
6420 populateResponseInfo(responseInfo, serial, responseType, e);
Grace Chen797c1c22017-03-23 18:39:48 -07006421 Return<sp<::android::hardware::radio::V1_1::IRadioResponse>> ret =
6422 ::android::hardware::radio::V1_1::IRadioResponse::castFrom(
6423 radioService[slotId]->mRadioResponse);
6424 if (ret.isOk()) {
6425 sp<::android::hardware::radio::V1_1::IRadioResponse> radioResponseV1_1 = ret;
6426 Return<void> retStatus
6427 = radioResponseV1_1->setSimCardPowerResponse_1_1(responseInfo);
6428 radioService[slotId]->checkReturnStatus(retStatus);
6429 } else {
6430 RLOGD("setSimCardPowerResponse: ret.isOK() == false for radioService[%d]",
6431 slotId);
6432 Return<void> retStatus
6433 = radioService[slotId]->mRadioResponse->setSimCardPowerResponse(responseInfo);
6434 radioService[slotId]->checkReturnStatus(retStatus);
6435 }
Wileen Chiu718c0bf2017-01-04 11:37:19 -08006436 } else {
Grace Chen797c1c22017-03-23 18:39:48 -07006437 RLOGE("setSimCardPowerResponse: radioService[%d]->mRadioResponse == NULL",
6438 slotId);
Wileen Chiu718c0bf2017-01-04 11:37:19 -08006439 }
Wileen Chiu718c0bf2017-01-04 11:37:19 -08006440 return 0;
6441}
6442
yinxu8688abd2017-05-22 11:26:45 -07006443int radio::startNetworkScanResponse(int slotId, int responseType, int serial, RIL_Errno e,
6444 void *response, size_t responseLen) {
6445#if VDBG
6446 RLOGD("startNetworkScanResponse: serial %d", serial);
6447#endif
6448
6449 if (radioService[slotId]->mRadioResponse != NULL) {
6450 RadioResponseInfo responseInfo = {};
6451 populateResponseInfo(responseInfo, serial, responseType, e);
6452 Return<sp<::android::hardware::radio::V1_1::IRadioResponse>> ret =
6453 ::android::hardware::radio::V1_1::IRadioResponse::castFrom(
6454 radioService[slotId]->mRadioResponse);
6455 if (ret.isOk()) {
6456 sp<::android::hardware::radio::V1_1::IRadioResponse> radioResponseV1_1 = ret;
6457 Return<void> retStatus = radioResponseV1_1->startNetworkScanResponse(responseInfo);
6458 radioService[slotId]->checkReturnStatus(retStatus);
6459 } else {
6460 RLOGD("startNetworkScanResponse: ret.isOK() == false for radioService[%d]", slotId);
6461 }
6462 } else {
6463 RLOGE("startNetworkScanResponse: radioService[%d]->mRadioResponse == NULL", slotId);
6464 }
6465
6466 return 0;
6467}
6468
6469int radio::stopNetworkScanResponse(int slotId, int responseType, int serial, RIL_Errno e,
6470 void *response, size_t responseLen) {
6471#if VDBG
6472 RLOGD("stopNetworkScanResponse: serial %d", serial);
6473#endif
6474
6475 if (radioService[slotId]->mRadioResponse != NULL) {
6476 RadioResponseInfo responseInfo = {};
6477 populateResponseInfo(responseInfo, serial, responseType, e);
6478 Return<sp<::android::hardware::radio::V1_1::IRadioResponse>> ret =
6479 ::android::hardware::radio::V1_1::IRadioResponse::castFrom(
6480 radioService[slotId]->mRadioResponse);
6481 if (ret.isOk()) {
6482 sp<::android::hardware::radio::V1_1::IRadioResponse> radioResponseV1_1 = ret;
6483 Return<void> retStatus = radioResponseV1_1->stopNetworkScanResponse(responseInfo);
6484 radioService[slotId]->checkReturnStatus(retStatus);
6485 } else {
6486 RLOGD("stopNetworkScanResponse: ret.isOK() == false for radioService[%d]", slotId);
6487 }
6488 } else {
6489 RLOGE("stopNetworkScanResponse: radioService[%d]->mRadioResponse == NULL", slotId);
6490 }
6491
6492 return 0;
6493}
6494
Amit Mahajan759786a2017-03-03 17:35:47 -08006495int radio::sendRequestRawResponse(int slotId,
Amit Mahajan439da362017-02-13 17:43:04 -08006496 int responseType, int serial, RIL_Errno e,
6497 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006498#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006499 RLOGD("sendRequestRawResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006500#endif
Amit Mahajan439da362017-02-13 17:43:04 -08006501
6502 if (oemHookService[slotId]->mOemHookResponse != NULL) {
6503 RadioResponseInfo responseInfo = {};
6504 populateResponseInfo(responseInfo, serial, responseType, e);
6505 hidl_vec<uint8_t> data;
6506
6507 if (response == NULL) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006508 RLOGE("sendRequestRawResponse: Invalid response");
Amit Mahajan439da362017-02-13 17:43:04 -08006509 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
6510 } else {
6511 data.setToExternal((uint8_t *) response, responseLen);
6512 }
6513 Return<void> retStatus = oemHookService[slotId]->mOemHookResponse->
6514 sendRequestRawResponse(responseInfo, data);
Amit Mahajand423d192017-03-16 17:04:01 -07006515 checkReturnStatus(slotId, retStatus, false);
Amit Mahajan439da362017-02-13 17:43:04 -08006516 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006517 RLOGE("sendRequestRawResponse: oemHookService[%d]->mOemHookResponse == NULL",
Amit Mahajan439da362017-02-13 17:43:04 -08006518 slotId);
6519 }
6520
6521 return 0;
6522}
6523
Amit Mahajan759786a2017-03-03 17:35:47 -08006524int radio::sendRequestStringsResponse(int slotId,
Amit Mahajan439da362017-02-13 17:43:04 -08006525 int responseType, int serial, RIL_Errno e,
6526 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006527#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006528 RLOGD("sendRequestStringsResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006529#endif
Amit Mahajan439da362017-02-13 17:43:04 -08006530
6531 if (oemHookService[slotId]->mOemHookResponse != NULL) {
6532 RadioResponseInfo responseInfo = {};
6533 populateResponseInfo(responseInfo, serial, responseType, e);
6534 hidl_vec<hidl_string> data;
6535
6536 if (response == NULL || responseLen % sizeof(char *) != 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006537 RLOGE("sendRequestStringsResponse Invalid response: NULL");
Amit Mahajan439da362017-02-13 17:43:04 -08006538 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
6539 } else {
6540 char **resp = (char **) response;
6541 int numStrings = responseLen / sizeof(char *);
6542 data.resize(numStrings);
6543 for (int i = 0; i < numStrings; i++) {
6544 data[i] = convertCharPtrToHidlString(resp[i]);
6545 }
6546 }
6547 Return<void> retStatus
6548 = oemHookService[slotId]->mOemHookResponse->sendRequestStringsResponse(
6549 responseInfo, data);
Amit Mahajand423d192017-03-16 17:04:01 -07006550 checkReturnStatus(slotId, retStatus, false);
Amit Mahajan439da362017-02-13 17:43:04 -08006551 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006552 RLOGE("sendRequestStringsResponse: oemHookService[%d]->mOemHookResponse == "
Amit Mahajan439da362017-02-13 17:43:04 -08006553 "NULL", slotId);
6554 }
6555
6556 return 0;
6557}
6558
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006559// Radio Indication functions
6560
Amit Mahajan5829a472016-12-28 17:28:07 -08006561RadioIndicationType convertIntToRadioIndicationType(int indicationType) {
6562 return indicationType == RESPONSE_UNSOLICITED ? (RadioIndicationType::UNSOLICITED) :
6563 (RadioIndicationType::UNSOLICITED_ACK_EXP);
6564}
6565
Amit Mahajan759786a2017-03-03 17:35:47 -08006566int radio::radioStateChangedInd(int slotId,
Amit Mahajan1f652692017-03-01 12:08:46 -08006567 int indicationType, int token, RIL_Errno e, void *response,
6568 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08006569 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan1f652692017-03-01 12:08:46 -08006570 RadioState radioState = (RadioState) s_vendorFunctions->onStateRequest();
Amit Mahajan111ddca2017-03-03 12:05:13 -08006571 RLOGD("radioStateChangedInd: radioState %d", radioState);
Amit Mahajan17249842017-01-19 15:05:45 -08006572 Return<void> retStatus = radioService[slotId]->mRadioIndication->radioStateChanged(
Amit Mahajan1f652692017-03-01 12:08:46 -08006573 convertIntToRadioIndicationType(indicationType), radioState);
Amit Mahajan17249842017-01-19 15:05:45 -08006574 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajancd77a5b2016-08-25 11:19:21 -07006575 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006576 RLOGE("radioStateChangedInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajancd77a5b2016-08-25 11:19:21 -07006577 }
Amit Mahajan1f652692017-03-01 12:08:46 -08006578
6579 return 0;
Amit Mahajancd77a5b2016-08-25 11:19:21 -07006580}
6581
Amit Mahajan759786a2017-03-03 17:35:47 -08006582int radio::callStateChangedInd(int slotId,
Amit Mahajan5829a472016-12-28 17:28:07 -08006583 int indicationType, int token, RIL_Errno e, void *response,
6584 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08006585 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006586#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006587 RLOGD("callStateChangedInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07006588#endif
Amit Mahajan17249842017-01-19 15:05:45 -08006589 Return<void> retStatus = radioService[slotId]->mRadioIndication->callStateChanged(
Amit Mahajan5829a472016-12-28 17:28:07 -08006590 convertIntToRadioIndicationType(indicationType));
Amit Mahajan17249842017-01-19 15:05:45 -08006591 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08006592 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006593 RLOGE("callStateChangedInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08006594 }
6595
6596 return 0;
6597}
6598
Amit Mahajan759786a2017-03-03 17:35:47 -08006599int radio::networkStateChangedInd(int slotId,
Amit Mahajan1f652692017-03-01 12:08:46 -08006600 int indicationType, int token, RIL_Errno e, void *response,
6601 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08006602 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006603#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006604 RLOGD("networkStateChangedInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07006605#endif
Jack Yu06181bb2017-01-10 12:10:41 -08006606 Return<void> retStatus = radioService[slotId]->mRadioIndication->networkStateChanged(
Amit Mahajan5829a472016-12-28 17:28:07 -08006607 convertIntToRadioIndicationType(indicationType));
Amit Mahajan17249842017-01-19 15:05:45 -08006608 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08006609 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006610 RLOGE("networkStateChangedInd: radioService[%d]->mRadioIndication == NULL",
Amit Mahajan2fa9e632017-01-06 16:55:33 -08006611 slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08006612 }
6613
6614 return 0;
6615}
6616
6617uint8_t hexCharToInt(uint8_t c) {
6618 if (c >= '0' && c <= '9') return (c - '0');
6619 if (c >= 'A' && c <= 'F') return (c - 'A' + 10);
6620 if (c >= 'a' && c <= 'f') return (c - 'a' + 10);
6621
6622 return INVALID_HEX_CHAR;
6623}
6624
6625uint8_t * convertHexStringToBytes(void *response, size_t responseLen) {
6626 if (responseLen % 2 != 0) {
6627 return NULL;
6628 }
6629
6630 uint8_t *bytes = (uint8_t *)calloc(responseLen/2, sizeof(uint8_t));
6631 if (bytes == NULL) {
6632 RLOGE("convertHexStringToBytes: cannot allocate memory for bytes string");
6633 return NULL;
6634 }
6635 uint8_t *hexString = (uint8_t *)response;
6636
Wei Wang100ac9b2017-02-03 14:18:07 -08006637 for (size_t i = 0; i < responseLen; i += 2) {
Amit Mahajan5829a472016-12-28 17:28:07 -08006638 uint8_t hexChar1 = hexCharToInt(hexString[i]);
6639 uint8_t hexChar2 = hexCharToInt(hexString[i + 1]);
6640
6641 if (hexChar1 == INVALID_HEX_CHAR || hexChar2 == INVALID_HEX_CHAR) {
6642 RLOGE("convertHexStringToBytes: invalid hex char %d %d",
6643 hexString[i], hexString[i + 1]);
6644 free(bytes);
6645 return NULL;
6646 }
6647 bytes[i/2] = ((hexChar1 << 4) | hexChar2);
6648 }
6649
6650 return bytes;
6651}
6652
Amit Mahajan759786a2017-03-03 17:35:47 -08006653int radio::newSmsInd(int slotId, int indicationType,
Amit Mahajan5829a472016-12-28 17:28:07 -08006654 int token, RIL_Errno e, void *response, size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08006655 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan5829a472016-12-28 17:28:07 -08006656 if (response == NULL || responseLen == 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006657 RLOGE("newSmsInd: invalid response");
Amit Mahajan5829a472016-12-28 17:28:07 -08006658 return 0;
6659 }
6660
6661 uint8_t *bytes = convertHexStringToBytes(response, responseLen);
6662 if (bytes == NULL) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006663 RLOGE("newSmsInd: convertHexStringToBytes failed");
Amit Mahajan5829a472016-12-28 17:28:07 -08006664 return 0;
6665 }
6666
6667 hidl_vec<uint8_t> pdu;
6668 pdu.setToExternal(bytes, responseLen/2);
Jayachandran C572f2f42017-03-25 14:30:13 -07006669#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006670 RLOGD("newSmsInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07006671#endif
Amit Mahajan17249842017-01-19 15:05:45 -08006672 Return<void> retStatus = radioService[slotId]->mRadioIndication->newSms(
Amit Mahajan5829a472016-12-28 17:28:07 -08006673 convertIntToRadioIndicationType(indicationType), pdu);
Amit Mahajan17249842017-01-19 15:05:45 -08006674 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08006675 free(bytes);
6676 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006677 RLOGE("newSmsInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08006678 }
6679
6680 return 0;
6681}
6682
Amit Mahajan759786a2017-03-03 17:35:47 -08006683int radio::newSmsStatusReportInd(int slotId,
Amit Mahajan5829a472016-12-28 17:28:07 -08006684 int indicationType, int token, RIL_Errno e, void *response,
6685 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08006686 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan5829a472016-12-28 17:28:07 -08006687 if (response == NULL || responseLen == 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006688 RLOGE("newSmsStatusReportInd: invalid response");
Amit Mahajan5829a472016-12-28 17:28:07 -08006689 return 0;
6690 }
6691
6692 uint8_t *bytes = convertHexStringToBytes(response, responseLen);
6693 if (bytes == NULL) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006694 RLOGE("newSmsStatusReportInd: convertHexStringToBytes failed");
Amit Mahajan5829a472016-12-28 17:28:07 -08006695 return 0;
6696 }
6697
6698 hidl_vec<uint8_t> pdu;
6699 pdu.setToExternal(bytes, responseLen/2);
Jayachandran C572f2f42017-03-25 14:30:13 -07006700#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006701 RLOGD("newSmsStatusReportInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07006702#endif
Amit Mahajan17249842017-01-19 15:05:45 -08006703 Return<void> retStatus = radioService[slotId]->mRadioIndication->newSmsStatusReport(
Amit Mahajan5829a472016-12-28 17:28:07 -08006704 convertIntToRadioIndicationType(indicationType), pdu);
Amit Mahajan17249842017-01-19 15:05:45 -08006705 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08006706 free(bytes);
6707 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006708 RLOGE("newSmsStatusReportInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08006709 }
6710
6711 return 0;
6712}
6713
Amit Mahajan759786a2017-03-03 17:35:47 -08006714int radio::newSmsOnSimInd(int slotId, int indicationType,
Amit Mahajan5829a472016-12-28 17:28:07 -08006715 int token, RIL_Errno e, void *response, size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08006716 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan5829a472016-12-28 17:28:07 -08006717 if (response == NULL || responseLen != sizeof(int)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006718 RLOGE("newSmsOnSimInd: invalid response");
Amit Mahajan5829a472016-12-28 17:28:07 -08006719 return 0;
6720 }
6721 int32_t recordNumber = ((int32_t *) response)[0];
Jayachandran C572f2f42017-03-25 14:30:13 -07006722#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006723 RLOGD("newSmsOnSimInd: slotIndex %d", recordNumber);
Jayachandran C572f2f42017-03-25 14:30:13 -07006724#endif
Amit Mahajan17249842017-01-19 15:05:45 -08006725 Return<void> retStatus = radioService[slotId]->mRadioIndication->newSmsOnSim(
Amit Mahajan5829a472016-12-28 17:28:07 -08006726 convertIntToRadioIndicationType(indicationType), recordNumber);
Amit Mahajan17249842017-01-19 15:05:45 -08006727 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08006728 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006729 RLOGE("newSmsOnSimInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08006730 }
6731
6732 return 0;
6733}
6734
Amit Mahajan759786a2017-03-03 17:35:47 -08006735int radio::onUssdInd(int slotId, int indicationType,
Amit Mahajan5829a472016-12-28 17:28:07 -08006736 int token, RIL_Errno e, void *response, size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08006737 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan5829a472016-12-28 17:28:07 -08006738 if (response == NULL || responseLen != 2 * sizeof(char *)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006739 RLOGE("onUssdInd: invalid response");
Amit Mahajan5829a472016-12-28 17:28:07 -08006740 return 0;
6741 }
6742 char **strings = (char **) response;
6743 char *mode = strings[0];
6744 hidl_string msg = convertCharPtrToHidlString(strings[1]);
6745 UssdModeType modeType = (UssdModeType) atoi(mode);
Jayachandran C572f2f42017-03-25 14:30:13 -07006746#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006747 RLOGD("onUssdInd: mode %s", mode);
Jayachandran C572f2f42017-03-25 14:30:13 -07006748#endif
Amit Mahajan17249842017-01-19 15:05:45 -08006749 Return<void> retStatus = radioService[slotId]->mRadioIndication->onUssd(
Amit Mahajan5829a472016-12-28 17:28:07 -08006750 convertIntToRadioIndicationType(indicationType), modeType, msg);
Amit Mahajan17249842017-01-19 15:05:45 -08006751 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08006752 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006753 RLOGE("onUssdInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08006754 }
6755
6756 return 0;
6757}
6758
Amit Mahajan759786a2017-03-03 17:35:47 -08006759int radio::nitzTimeReceivedInd(int slotId,
Amit Mahajan5829a472016-12-28 17:28:07 -08006760 int indicationType, int token, RIL_Errno e, void *response,
6761 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08006762 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan5829a472016-12-28 17:28:07 -08006763 if (response == NULL || responseLen == 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006764 RLOGE("nitzTimeReceivedInd: invalid response");
Amit Mahajan5829a472016-12-28 17:28:07 -08006765 return 0;
6766 }
6767 hidl_string nitzTime = convertCharPtrToHidlString((char *) response);
6768 int64_t timeReceived = android::elapsedRealtime();
Jayachandran C572f2f42017-03-25 14:30:13 -07006769#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006770 RLOGD("nitzTimeReceivedInd: nitzTime %s receivedTime %" PRId64, nitzTime.c_str(),
Amit Mahajan2fa9e632017-01-06 16:55:33 -08006771 timeReceived);
Jayachandran C572f2f42017-03-25 14:30:13 -07006772#endif
Amit Mahajan17249842017-01-19 15:05:45 -08006773 Return<void> retStatus = radioService[slotId]->mRadioIndication->nitzTimeReceived(
Amit Mahajan5829a472016-12-28 17:28:07 -08006774 convertIntToRadioIndicationType(indicationType), nitzTime, timeReceived);
Amit Mahajan17249842017-01-19 15:05:45 -08006775 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08006776 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006777 RLOGE("nitzTimeReceivedInd: radioService[%d]->mRadioIndication == NULL", slotId);
Weilun Dud2c30932017-02-09 12:32:42 -08006778 return -1;
Amit Mahajan5829a472016-12-28 17:28:07 -08006779 }
6780
6781 return 0;
6782}
6783
Amit Mahajan2fa9e632017-01-06 16:55:33 -08006784void convertRilSignalStrengthToHal(void *response, size_t responseLen,
6785 SignalStrength& signalStrength) {
6786 RIL_SignalStrength_v10 *rilSignalStrength = (RIL_SignalStrength_v10 *) response;
6787
6788 // Fixup LTE for backwards compatibility
6789 // signalStrength: -1 -> 99
6790 if (rilSignalStrength->LTE_SignalStrength.signalStrength == -1) {
6791 rilSignalStrength->LTE_SignalStrength.signalStrength = 99;
6792 }
6793 // rsrp: -1 -> INT_MAX all other negative value to positive.
6794 // So remap here
6795 if (rilSignalStrength->LTE_SignalStrength.rsrp == -1) {
6796 rilSignalStrength->LTE_SignalStrength.rsrp = INT_MAX;
6797 } else if (rilSignalStrength->LTE_SignalStrength.rsrp < -1) {
6798 rilSignalStrength->LTE_SignalStrength.rsrp = -rilSignalStrength->LTE_SignalStrength.rsrp;
6799 }
6800 // rsrq: -1 -> INT_MAX
6801 if (rilSignalStrength->LTE_SignalStrength.rsrq == -1) {
6802 rilSignalStrength->LTE_SignalStrength.rsrq = INT_MAX;
6803 }
6804 // Not remapping rssnr is already using INT_MAX
6805 // cqi: -1 -> INT_MAX
6806 if (rilSignalStrength->LTE_SignalStrength.cqi == -1) {
6807 rilSignalStrength->LTE_SignalStrength.cqi = INT_MAX;
6808 }
6809
6810 signalStrength.gw.signalStrength = rilSignalStrength->GW_SignalStrength.signalStrength;
6811 signalStrength.gw.bitErrorRate = rilSignalStrength->GW_SignalStrength.bitErrorRate;
6812 signalStrength.cdma.dbm = rilSignalStrength->CDMA_SignalStrength.dbm;
6813 signalStrength.cdma.ecio = rilSignalStrength->CDMA_SignalStrength.ecio;
6814 signalStrength.evdo.dbm = rilSignalStrength->EVDO_SignalStrength.dbm;
6815 signalStrength.evdo.ecio = rilSignalStrength->EVDO_SignalStrength.ecio;
6816 signalStrength.evdo.signalNoiseRatio =
6817 rilSignalStrength->EVDO_SignalStrength.signalNoiseRatio;
6818 signalStrength.lte.signalStrength = rilSignalStrength->LTE_SignalStrength.signalStrength;
6819 signalStrength.lte.rsrp = rilSignalStrength->LTE_SignalStrength.rsrp;
6820 signalStrength.lte.rsrq = rilSignalStrength->LTE_SignalStrength.rsrq;
6821 signalStrength.lte.rssnr = rilSignalStrength->LTE_SignalStrength.rssnr;
6822 signalStrength.lte.cqi = rilSignalStrength->LTE_SignalStrength.cqi;
6823 signalStrength.lte.timingAdvance = rilSignalStrength->LTE_SignalStrength.timingAdvance;
6824 signalStrength.tdScdma.rscp = rilSignalStrength->TD_SCDMA_SignalStrength.rscp;
6825}
6826
Amit Mahajan759786a2017-03-03 17:35:47 -08006827int radio::currentSignalStrengthInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08006828 int indicationType, int token, RIL_Errno e,
6829 void *response, size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08006830 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan2fa9e632017-01-06 16:55:33 -08006831 if (response == NULL || responseLen != sizeof(RIL_SignalStrength_v10)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006832 RLOGE("currentSignalStrengthInd: invalid response");
Amit Mahajan2fa9e632017-01-06 16:55:33 -08006833 return 0;
6834 }
6835
Jack Yuf68e0da2017-02-07 14:53:09 -08006836 SignalStrength signalStrength = {};
Amit Mahajan2fa9e632017-01-06 16:55:33 -08006837 convertRilSignalStrengthToHal(response, responseLen, signalStrength);
6838
Jayachandran C572f2f42017-03-25 14:30:13 -07006839#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006840 RLOGD("currentSignalStrengthInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07006841#endif
Amit Mahajan17249842017-01-19 15:05:45 -08006842 Return<void> retStatus = radioService[slotId]->mRadioIndication->currentSignalStrength(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08006843 convertIntToRadioIndicationType(indicationType), signalStrength);
Amit Mahajan17249842017-01-19 15:05:45 -08006844 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08006845 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006846 RLOGE("currentSignalStrengthInd: radioService[%d]->mRadioIndication == NULL",
Amit Mahajan2fa9e632017-01-06 16:55:33 -08006847 slotId);
6848 }
6849
6850 return 0;
6851}
6852
Amit Mahajan5829a472016-12-28 17:28:07 -08006853void convertRilDataCallToHal(RIL_Data_Call_Response_v11 *dcResponse,
6854 SetupDataCallResult& dcResult) {
Jack Yu5079e182017-02-28 15:21:18 -08006855 dcResult.status = (DataCallFailCause) dcResponse->status;
Amit Mahajan5829a472016-12-28 17:28:07 -08006856 dcResult.suggestedRetryTime = dcResponse->suggestedRetryTime;
6857 dcResult.cid = dcResponse->cid;
6858 dcResult.active = dcResponse->active;
6859 dcResult.type = convertCharPtrToHidlString(dcResponse->type);
6860 dcResult.ifname = convertCharPtrToHidlString(dcResponse->ifname);
6861 dcResult.addresses = convertCharPtrToHidlString(dcResponse->addresses);
6862 dcResult.dnses = convertCharPtrToHidlString(dcResponse->dnses);
6863 dcResult.gateways = convertCharPtrToHidlString(dcResponse->gateways);
6864 dcResult.pcscf = convertCharPtrToHidlString(dcResponse->pcscf);
6865 dcResult.mtu = dcResponse->mtu;
6866}
6867
6868void convertRilDataCallListToHal(void *response, size_t responseLen,
6869 hidl_vec<SetupDataCallResult>& dcResultList) {
6870 int num = responseLen / sizeof(RIL_Data_Call_Response_v11);
6871
6872 RIL_Data_Call_Response_v11 *dcResponse = (RIL_Data_Call_Response_v11 *) response;
6873 dcResultList.resize(num);
6874 for (int i = 0; i < num; i++) {
6875 convertRilDataCallToHal(&dcResponse[i], dcResultList[i]);
6876 }
6877}
6878
Amit Mahajan759786a2017-03-03 17:35:47 -08006879int radio::dataCallListChangedInd(int slotId,
Amit Mahajan5829a472016-12-28 17:28:07 -08006880 int indicationType, int token, RIL_Errno e, void *response,
6881 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08006882 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan5829a472016-12-28 17:28:07 -08006883 if (response == NULL || responseLen % sizeof(RIL_Data_Call_Response_v11) != 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006884 RLOGE("dataCallListChangedInd: invalid response");
Amit Mahajan5829a472016-12-28 17:28:07 -08006885 return 0;
6886 }
6887 hidl_vec<SetupDataCallResult> dcList;
6888 convertRilDataCallListToHal(response, responseLen, dcList);
Jayachandran C572f2f42017-03-25 14:30:13 -07006889#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006890 RLOGD("dataCallListChangedInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07006891#endif
Amit Mahajan17249842017-01-19 15:05:45 -08006892 Return<void> retStatus = radioService[slotId]->mRadioIndication->dataCallListChanged(
Amit Mahajan5829a472016-12-28 17:28:07 -08006893 convertIntToRadioIndicationType(indicationType), dcList);
Amit Mahajan17249842017-01-19 15:05:45 -08006894 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08006895 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006896 RLOGE("dataCallListChangedInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08006897 }
6898
6899 return 0;
6900}
6901
Amit Mahajan759786a2017-03-03 17:35:47 -08006902int radio::suppSvcNotifyInd(int slotId, int indicationType,
Amit Mahajan5829a472016-12-28 17:28:07 -08006903 int token, RIL_Errno e, void *response, size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08006904 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan5829a472016-12-28 17:28:07 -08006905 if (response == NULL || responseLen != sizeof(RIL_SuppSvcNotification)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006906 RLOGE("suppSvcNotifyInd: invalid response");
Amit Mahajan5829a472016-12-28 17:28:07 -08006907 return 0;
6908 }
6909
Jack Yuf68e0da2017-02-07 14:53:09 -08006910 SuppSvcNotification suppSvc = {};
Amit Mahajan5829a472016-12-28 17:28:07 -08006911 RIL_SuppSvcNotification *ssn = (RIL_SuppSvcNotification *) response;
6912 suppSvc.isMT = ssn->notificationType;
6913 suppSvc.code = ssn->code;
6914 suppSvc.index = ssn->index;
6915 suppSvc.type = ssn->type;
6916 suppSvc.number = convertCharPtrToHidlString(ssn->number);
6917
Jayachandran C572f2f42017-03-25 14:30:13 -07006918#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006919 RLOGD("suppSvcNotifyInd: isMT %d code %d index %d type %d",
Amit Mahajan5829a472016-12-28 17:28:07 -08006920 suppSvc.isMT, suppSvc.code, suppSvc.index, suppSvc.type);
Jayachandran C572f2f42017-03-25 14:30:13 -07006921#endif
Amit Mahajan17249842017-01-19 15:05:45 -08006922 Return<void> retStatus = radioService[slotId]->mRadioIndication->suppSvcNotify(
Amit Mahajan5829a472016-12-28 17:28:07 -08006923 convertIntToRadioIndicationType(indicationType), suppSvc);
Amit Mahajan17249842017-01-19 15:05:45 -08006924 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08006925 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006926 RLOGE("suppSvcNotifyInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08006927 }
6928
6929 return 0;
6930}
6931
Amit Mahajan759786a2017-03-03 17:35:47 -08006932int radio::stkSessionEndInd(int slotId, int indicationType,
Amit Mahajan5829a472016-12-28 17:28:07 -08006933 int token, RIL_Errno e, void *response, size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08006934 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006935#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006936 RLOGD("stkSessionEndInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07006937#endif
Amit Mahajan17249842017-01-19 15:05:45 -08006938 Return<void> retStatus = radioService[slotId]->mRadioIndication->stkSessionEnd(
Amit Mahajan5829a472016-12-28 17:28:07 -08006939 convertIntToRadioIndicationType(indicationType));
Amit Mahajan17249842017-01-19 15:05:45 -08006940 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08006941 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006942 RLOGE("stkSessionEndInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08006943 }
6944
6945 return 0;
6946}
6947
Amit Mahajan759786a2017-03-03 17:35:47 -08006948int radio::stkProactiveCommandInd(int slotId,
Amit Mahajan5829a472016-12-28 17:28:07 -08006949 int indicationType, int token, RIL_Errno e, void *response,
6950 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08006951 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan5829a472016-12-28 17:28:07 -08006952 if (response == NULL || responseLen == 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006953 RLOGE("stkProactiveCommandInd: invalid response");
Amit Mahajan5829a472016-12-28 17:28:07 -08006954 return 0;
6955 }
Jayachandran C572f2f42017-03-25 14:30:13 -07006956#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006957 RLOGD("stkProactiveCommandInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07006958#endif
Amit Mahajan17249842017-01-19 15:05:45 -08006959 Return<void> retStatus = radioService[slotId]->mRadioIndication->stkProactiveCommand(
Amit Mahajan5829a472016-12-28 17:28:07 -08006960 convertIntToRadioIndicationType(indicationType),
6961 convertCharPtrToHidlString((char *) response));
Amit Mahajan17249842017-01-19 15:05:45 -08006962 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08006963 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006964 RLOGE("stkProactiveCommandInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08006965 }
6966
6967 return 0;
6968}
6969
Amit Mahajan759786a2017-03-03 17:35:47 -08006970int radio::stkEventNotifyInd(int slotId, int indicationType,
Amit Mahajan5829a472016-12-28 17:28:07 -08006971 int token, RIL_Errno e, void *response, size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08006972 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan5829a472016-12-28 17:28:07 -08006973 if (response == NULL || responseLen == 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006974 RLOGE("stkEventNotifyInd: invalid response");
Amit Mahajan5829a472016-12-28 17:28:07 -08006975 return 0;
6976 }
Jayachandran C572f2f42017-03-25 14:30:13 -07006977#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006978 RLOGD("stkEventNotifyInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07006979#endif
Amit Mahajan17249842017-01-19 15:05:45 -08006980 Return<void> retStatus = radioService[slotId]->mRadioIndication->stkEventNotify(
Amit Mahajan5829a472016-12-28 17:28:07 -08006981 convertIntToRadioIndicationType(indicationType),
6982 convertCharPtrToHidlString((char *) response));
Amit Mahajan17249842017-01-19 15:05:45 -08006983 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08006984 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006985 RLOGE("stkEventNotifyInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08006986 }
6987
6988 return 0;
6989}
6990
Amit Mahajan759786a2017-03-03 17:35:47 -08006991int radio::stkCallSetupInd(int slotId, int indicationType,
Amit Mahajan5829a472016-12-28 17:28:07 -08006992 int token, RIL_Errno e, void *response, size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08006993 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan5829a472016-12-28 17:28:07 -08006994 if (response == NULL || responseLen != sizeof(int)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006995 RLOGE("stkCallSetupInd: invalid response");
Amit Mahajan5829a472016-12-28 17:28:07 -08006996 return 0;
6997 }
6998 int32_t timeout = ((int32_t *) response)[0];
Jayachandran C572f2f42017-03-25 14:30:13 -07006999#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007000 RLOGD("stkCallSetupInd: timeout %d", timeout);
Jayachandran C572f2f42017-03-25 14:30:13 -07007001#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007002 Return<void> retStatus = radioService[slotId]->mRadioIndication->stkCallSetup(
Amit Mahajan5829a472016-12-28 17:28:07 -08007003 convertIntToRadioIndicationType(indicationType), timeout);
Amit Mahajan17249842017-01-19 15:05:45 -08007004 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08007005 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007006 RLOGE("stkCallSetupInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08007007 }
7008
7009 return 0;
7010}
7011
Amit Mahajan759786a2017-03-03 17:35:47 -08007012int radio::simSmsStorageFullInd(int slotId,
Amit Mahajan5829a472016-12-28 17:28:07 -08007013 int indicationType, int token, RIL_Errno e, void *response,
7014 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007015 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Jayachandran C572f2f42017-03-25 14:30:13 -07007016#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007017 RLOGD("simSmsStorageFullInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07007018#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007019 Return<void> retStatus = radioService[slotId]->mRadioIndication->simSmsStorageFull(
Amit Mahajan5829a472016-12-28 17:28:07 -08007020 convertIntToRadioIndicationType(indicationType));
Amit Mahajan17249842017-01-19 15:05:45 -08007021 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08007022 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007023 RLOGE("simSmsStorageFullInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08007024 }
7025
7026 return 0;
7027}
7028
Amit Mahajan759786a2017-03-03 17:35:47 -08007029int radio::simRefreshInd(int slotId, int indicationType,
Amit Mahajan5829a472016-12-28 17:28:07 -08007030 int token, RIL_Errno e, void *response, size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007031 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan5829a472016-12-28 17:28:07 -08007032 if (response == NULL || responseLen != sizeof(RIL_SimRefreshResponse_v7)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007033 RLOGE("simRefreshInd: invalid response");
Amit Mahajan5829a472016-12-28 17:28:07 -08007034 return 0;
7035 }
7036
Jack Yuf68e0da2017-02-07 14:53:09 -08007037 SimRefreshResult refreshResult = {};
Amit Mahajan5829a472016-12-28 17:28:07 -08007038 RIL_SimRefreshResponse_v7 *simRefreshResponse = ((RIL_SimRefreshResponse_v7 *) response);
7039 refreshResult.type =
7040 (android::hardware::radio::V1_0::SimRefreshType) simRefreshResponse->result;
7041 refreshResult.efId = simRefreshResponse->ef_id;
7042 refreshResult.aid = convertCharPtrToHidlString(simRefreshResponse->aid);
7043
Jayachandran C572f2f42017-03-25 14:30:13 -07007044#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007045 RLOGD("simRefreshInd: type %d efId %d", refreshResult.type, refreshResult.efId);
Jayachandran C572f2f42017-03-25 14:30:13 -07007046#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007047 Return<void> retStatus = radioService[slotId]->mRadioIndication->simRefresh(
Amit Mahajan5829a472016-12-28 17:28:07 -08007048 convertIntToRadioIndicationType(indicationType), refreshResult);
Amit Mahajan17249842017-01-19 15:05:45 -08007049 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08007050 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007051 RLOGE("simRefreshInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08007052 }
7053
7054 return 0;
7055}
7056
7057void convertRilCdmaSignalInfoRecordToHal(RIL_CDMA_SignalInfoRecord *signalInfoRecord,
7058 CdmaSignalInfoRecord& record) {
7059 record.isPresent = signalInfoRecord->isPresent;
7060 record.signalType = signalInfoRecord->signalType;
7061 record.alertPitch = signalInfoRecord->alertPitch;
7062 record.signal = signalInfoRecord->signal;
7063}
7064
Amit Mahajan759786a2017-03-03 17:35:47 -08007065int radio::callRingInd(int slotId, int indicationType,
Amit Mahajan5829a472016-12-28 17:28:07 -08007066 int token, RIL_Errno e, void *response, size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007067 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan5829a472016-12-28 17:28:07 -08007068 bool isGsm;
Jack Yuf68e0da2017-02-07 14:53:09 -08007069 CdmaSignalInfoRecord record = {};
Amit Mahajan5829a472016-12-28 17:28:07 -08007070 if (response == NULL || responseLen == 0) {
7071 isGsm = true;
7072 } else {
7073 isGsm = false;
7074 if (responseLen != sizeof (RIL_CDMA_SignalInfoRecord)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007075 RLOGE("callRingInd: invalid response");
Amit Mahajan5829a472016-12-28 17:28:07 -08007076 return 0;
7077 }
7078 convertRilCdmaSignalInfoRecordToHal((RIL_CDMA_SignalInfoRecord *) response, record);
7079 }
7080
Jayachandran C572f2f42017-03-25 14:30:13 -07007081#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007082 RLOGD("callRingInd: isGsm %d", isGsm);
Jayachandran C572f2f42017-03-25 14:30:13 -07007083#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007084 Return<void> retStatus = radioService[slotId]->mRadioIndication->callRing(
Amit Mahajan5829a472016-12-28 17:28:07 -08007085 convertIntToRadioIndicationType(indicationType), isGsm, record);
Amit Mahajan17249842017-01-19 15:05:45 -08007086 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08007087 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007088 RLOGE("callRingInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08007089 }
7090
7091 return 0;
7092}
7093
Amit Mahajan759786a2017-03-03 17:35:47 -08007094int radio::simStatusChangedInd(int slotId,
Amit Mahajan5829a472016-12-28 17:28:07 -08007095 int indicationType, int token, RIL_Errno e, void *response,
7096 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007097 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Jayachandran C572f2f42017-03-25 14:30:13 -07007098#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007099 RLOGD("simStatusChangedInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07007100#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007101 Return<void> retStatus = radioService[slotId]->mRadioIndication->simStatusChanged(
Amit Mahajan5829a472016-12-28 17:28:07 -08007102 convertIntToRadioIndicationType(indicationType));
Amit Mahajan17249842017-01-19 15:05:45 -08007103 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08007104 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007105 RLOGE("simStatusChangedInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08007106 }
7107
7108 return 0;
7109}
7110
Amit Mahajan759786a2017-03-03 17:35:47 -08007111int radio::cdmaNewSmsInd(int slotId, int indicationType,
Amit Mahajan5829a472016-12-28 17:28:07 -08007112 int token, RIL_Errno e, void *response, size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007113 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan5829a472016-12-28 17:28:07 -08007114 if (response == NULL || responseLen != sizeof(RIL_CDMA_SMS_Message)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007115 RLOGE("cdmaNewSmsInd: invalid response");
Amit Mahajan5829a472016-12-28 17:28:07 -08007116 return 0;
7117 }
7118
Jack Yuf68e0da2017-02-07 14:53:09 -08007119 CdmaSmsMessage msg = {};
Amit Mahajan5829a472016-12-28 17:28:07 -08007120 RIL_CDMA_SMS_Message *rilMsg = (RIL_CDMA_SMS_Message *) response;
7121 msg.teleserviceId = rilMsg->uTeleserviceID;
7122 msg.isServicePresent = rilMsg->bIsServicePresent;
7123 msg.serviceCategory = rilMsg->uServicecategory;
7124 msg.address.digitMode =
7125 (android::hardware::radio::V1_0::CdmaSmsDigitMode) rilMsg->sAddress.digit_mode;
7126 msg.address.numberMode =
7127 (android::hardware::radio::V1_0::CdmaSmsNumberMode) rilMsg->sAddress.number_mode;
7128 msg.address.numberType =
7129 (android::hardware::radio::V1_0::CdmaSmsNumberType) rilMsg->sAddress.number_type;
7130 msg.address.numberPlan =
7131 (android::hardware::radio::V1_0::CdmaSmsNumberPlan) rilMsg->sAddress.number_plan;
7132
7133 int digitLimit = MIN((rilMsg->sAddress.number_of_digits), RIL_CDMA_SMS_ADDRESS_MAX);
7134 msg.address.digits.setToExternal(rilMsg->sAddress.digits, digitLimit);
7135
7136 msg.subAddress.subaddressType = (android::hardware::radio::V1_0::CdmaSmsSubaddressType)
7137 rilMsg->sSubAddress.subaddressType;
7138 msg.subAddress.odd = rilMsg->sSubAddress.odd;
7139
7140 digitLimit= MIN((rilMsg->sSubAddress.number_of_digits), RIL_CDMA_SMS_SUBADDRESS_MAX);
7141 msg.subAddress.digits.setToExternal(rilMsg->sSubAddress.digits, digitLimit);
7142
7143 digitLimit = MIN((rilMsg->uBearerDataLen), RIL_CDMA_SMS_BEARER_DATA_MAX);
7144 msg.bearerData.setToExternal(rilMsg->aBearerData, digitLimit);
7145
Jayachandran C572f2f42017-03-25 14:30:13 -07007146#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007147 RLOGD("cdmaNewSmsInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07007148#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007149 Return<void> retStatus = radioService[slotId]->mRadioIndication->cdmaNewSms(
Amit Mahajan5829a472016-12-28 17:28:07 -08007150 convertIntToRadioIndicationType(indicationType), msg);
Amit Mahajan17249842017-01-19 15:05:45 -08007151 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08007152 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007153 RLOGE("cdmaNewSmsInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08007154 }
7155
7156 return 0;
7157}
7158
Amit Mahajan759786a2017-03-03 17:35:47 -08007159int radio::newBroadcastSmsInd(int slotId,
Amit Mahajan1955c742016-12-29 07:07:54 -08007160 int indicationType, int token, RIL_Errno e, void *response,
7161 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007162 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan1955c742016-12-29 07:07:54 -08007163 if (response == NULL || responseLen == 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007164 RLOGE("newBroadcastSmsInd: invalid response");
Amit Mahajan1955c742016-12-29 07:07:54 -08007165 return 0;
7166 }
7167
7168 hidl_vec<uint8_t> data;
7169 data.setToExternal((uint8_t *) response, responseLen);
Jayachandran C572f2f42017-03-25 14:30:13 -07007170#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007171 RLOGD("newBroadcastSmsInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07007172#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007173 Return<void> retStatus = radioService[slotId]->mRadioIndication->newBroadcastSms(
Amit Mahajan1955c742016-12-29 07:07:54 -08007174 convertIntToRadioIndicationType(indicationType), data);
Amit Mahajan17249842017-01-19 15:05:45 -08007175 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan1955c742016-12-29 07:07:54 -08007176 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007177 RLOGE("newBroadcastSmsInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan1955c742016-12-29 07:07:54 -08007178 }
7179
7180 return 0;
7181}
7182
Amit Mahajan759786a2017-03-03 17:35:47 -08007183int radio::cdmaRuimSmsStorageFullInd(int slotId,
Amit Mahajan1955c742016-12-29 07:07:54 -08007184 int indicationType, int token, RIL_Errno e, void *response,
7185 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007186 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Jayachandran C572f2f42017-03-25 14:30:13 -07007187#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007188 RLOGD("cdmaRuimSmsStorageFullInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07007189#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007190 Return<void> retStatus = radioService[slotId]->mRadioIndication->cdmaRuimSmsStorageFull(
Amit Mahajan1955c742016-12-29 07:07:54 -08007191 convertIntToRadioIndicationType(indicationType));
Amit Mahajan17249842017-01-19 15:05:45 -08007192 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan1955c742016-12-29 07:07:54 -08007193 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007194 RLOGE("cdmaRuimSmsStorageFullInd: radioService[%d]->mRadioIndication == NULL",
Amit Mahajan1955c742016-12-29 07:07:54 -08007195 slotId);
7196 }
7197
7198 return 0;
7199}
7200
Amit Mahajan759786a2017-03-03 17:35:47 -08007201int radio::restrictedStateChangedInd(int slotId,
Amit Mahajan1955c742016-12-29 07:07:54 -08007202 int indicationType, int token, RIL_Errno e, void *response,
7203 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007204 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan1955c742016-12-29 07:07:54 -08007205 if (response == NULL || responseLen != sizeof(int)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007206 RLOGE("restrictedStateChangedInd: invalid response");
Amit Mahajan1955c742016-12-29 07:07:54 -08007207 return 0;
7208 }
7209 int32_t state = ((int32_t *) response)[0];
Jayachandran C572f2f42017-03-25 14:30:13 -07007210#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007211 RLOGD("restrictedStateChangedInd: state %d", state);
Jayachandran C572f2f42017-03-25 14:30:13 -07007212#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007213 Return<void> retStatus = radioService[slotId]->mRadioIndication->restrictedStateChanged(
Amit Mahajan1955c742016-12-29 07:07:54 -08007214 convertIntToRadioIndicationType(indicationType), (PhoneRestrictedState) state);
Amit Mahajan17249842017-01-19 15:05:45 -08007215 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan1955c742016-12-29 07:07:54 -08007216 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007217 RLOGE("restrictedStateChangedInd: radioService[%d]->mRadioIndication == NULL",
Amit Mahajan1955c742016-12-29 07:07:54 -08007218 slotId);
7219 }
7220
7221 return 0;
7222}
7223
Amit Mahajan759786a2017-03-03 17:35:47 -08007224int radio::enterEmergencyCallbackModeInd(int slotId,
Amit Mahajan1955c742016-12-29 07:07:54 -08007225 int indicationType, int token, RIL_Errno e, void *response,
7226 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007227 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Jayachandran C572f2f42017-03-25 14:30:13 -07007228#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007229 RLOGD("enterEmergencyCallbackModeInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07007230#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007231 Return<void> retStatus = radioService[slotId]->mRadioIndication->enterEmergencyCallbackMode(
Amit Mahajan1955c742016-12-29 07:07:54 -08007232 convertIntToRadioIndicationType(indicationType));
Amit Mahajan17249842017-01-19 15:05:45 -08007233 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan1955c742016-12-29 07:07:54 -08007234 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007235 RLOGE("enterEmergencyCallbackModeInd: radioService[%d]->mRadioIndication == NULL",
Amit Mahajan1955c742016-12-29 07:07:54 -08007236 slotId);
7237 }
7238
7239 return 0;
7240}
7241
Amit Mahajan759786a2017-03-03 17:35:47 -08007242int radio::cdmaCallWaitingInd(int slotId,
Amit Mahajan1955c742016-12-29 07:07:54 -08007243 int indicationType, int token, RIL_Errno e, void *response,
7244 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007245 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan1955c742016-12-29 07:07:54 -08007246 if (response == NULL || responseLen != sizeof(RIL_CDMA_CallWaiting_v6)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007247 RLOGE("cdmaCallWaitingInd: invalid response");
Amit Mahajan1955c742016-12-29 07:07:54 -08007248 return 0;
7249 }
7250
Jack Yuf68e0da2017-02-07 14:53:09 -08007251 CdmaCallWaiting callWaitingRecord = {};
Amit Mahajan1955c742016-12-29 07:07:54 -08007252 RIL_CDMA_CallWaiting_v6 *callWaitingRil = ((RIL_CDMA_CallWaiting_v6 *) response);
7253 callWaitingRecord.number = convertCharPtrToHidlString(callWaitingRil->number);
7254 callWaitingRecord.numberPresentation =
7255 (CdmaCallWaitingNumberPresentation) callWaitingRil->numberPresentation;
7256 callWaitingRecord.name = convertCharPtrToHidlString(callWaitingRil->name);
7257 convertRilCdmaSignalInfoRecordToHal(&callWaitingRil->signalInfoRecord,
7258 callWaitingRecord.signalInfoRecord);
7259 callWaitingRecord.numberType = (CdmaCallWaitingNumberType) callWaitingRil->number_type;
7260 callWaitingRecord.numberPlan = (CdmaCallWaitingNumberPlan) callWaitingRil->number_plan;
7261
Jayachandran C572f2f42017-03-25 14:30:13 -07007262#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007263 RLOGD("cdmaCallWaitingInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07007264#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007265 Return<void> retStatus = radioService[slotId]->mRadioIndication->cdmaCallWaiting(
Amit Mahajan1955c742016-12-29 07:07:54 -08007266 convertIntToRadioIndicationType(indicationType), callWaitingRecord);
Amit Mahajan17249842017-01-19 15:05:45 -08007267 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan1955c742016-12-29 07:07:54 -08007268 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007269 RLOGE("cdmaCallWaitingInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan1955c742016-12-29 07:07:54 -08007270 }
7271
7272 return 0;
7273}
7274
Amit Mahajan759786a2017-03-03 17:35:47 -08007275int radio::cdmaOtaProvisionStatusInd(int slotId,
Amit Mahajan1955c742016-12-29 07:07:54 -08007276 int indicationType, int token, RIL_Errno e, void *response,
7277 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007278 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan1955c742016-12-29 07:07:54 -08007279 if (response == NULL || responseLen != sizeof(int)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007280 RLOGE("cdmaOtaProvisionStatusInd: invalid response");
Amit Mahajan1955c742016-12-29 07:07:54 -08007281 return 0;
7282 }
7283 int32_t status = ((int32_t *) response)[0];
Jayachandran C572f2f42017-03-25 14:30:13 -07007284#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007285 RLOGD("cdmaOtaProvisionStatusInd: status %d", status);
Jayachandran C572f2f42017-03-25 14:30:13 -07007286#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007287 Return<void> retStatus = radioService[slotId]->mRadioIndication->cdmaOtaProvisionStatus(
Amit Mahajan1955c742016-12-29 07:07:54 -08007288 convertIntToRadioIndicationType(indicationType), (CdmaOtaProvisionStatus) status);
Amit Mahajan17249842017-01-19 15:05:45 -08007289 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan1955c742016-12-29 07:07:54 -08007290 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007291 RLOGE("cdmaOtaProvisionStatusInd: radioService[%d]->mRadioIndication == NULL",
Amit Mahajan1955c742016-12-29 07:07:54 -08007292 slotId);
7293 }
7294
7295 return 0;
7296}
7297
Amit Mahajan759786a2017-03-03 17:35:47 -08007298int radio::cdmaInfoRecInd(int slotId,
Amit Mahajan1955c742016-12-29 07:07:54 -08007299 int indicationType, int token, RIL_Errno e, void *response,
7300 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007301 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan1955c742016-12-29 07:07:54 -08007302 if (response == NULL || responseLen != sizeof(RIL_CDMA_InformationRecords)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007303 RLOGE("cdmaInfoRecInd: invalid response");
Amit Mahajan1955c742016-12-29 07:07:54 -08007304 return 0;
7305 }
7306
Jack Yuf68e0da2017-02-07 14:53:09 -08007307 CdmaInformationRecords records = {};
Amit Mahajan1955c742016-12-29 07:07:54 -08007308 RIL_CDMA_InformationRecords *recordsRil = (RIL_CDMA_InformationRecords *) response;
7309
7310 char* string8 = NULL;
7311 int num = MIN(recordsRil->numberOfInfoRecs, RIL_CDMA_MAX_NUMBER_OF_INFO_RECS);
7312 if (recordsRil->numberOfInfoRecs > RIL_CDMA_MAX_NUMBER_OF_INFO_RECS) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007313 RLOGE("cdmaInfoRecInd: received %d recs which is more than %d, dropping "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08007314 "additional ones", recordsRil->numberOfInfoRecs,
Amit Mahajan1955c742016-12-29 07:07:54 -08007315 RIL_CDMA_MAX_NUMBER_OF_INFO_RECS);
7316 }
7317 records.infoRec.resize(num);
7318 for (int i = 0 ; i < num ; i++) {
7319 CdmaInformationRecord *record = &records.infoRec[i];
7320 RIL_CDMA_InformationRecord *infoRec = &recordsRil->infoRec[i];
7321 record->name = (CdmaInfoRecName) infoRec->name;
Sanket Padawe378ccdd2017-01-24 14:11:12 -08007322 // All vectors should be size 0 except one which will be size 1. Set everything to
7323 // size 0 initially.
7324 record->display.resize(0);
7325 record->number.resize(0);
7326 record->signal.resize(0);
7327 record->redir.resize(0);
7328 record->lineCtrl.resize(0);
7329 record->clir.resize(0);
7330 record->audioCtrl.resize(0);
Amit Mahajan1955c742016-12-29 07:07:54 -08007331 switch (infoRec->name) {
7332 case RIL_CDMA_DISPLAY_INFO_REC:
7333 case RIL_CDMA_EXTENDED_DISPLAY_INFO_REC: {
7334 if (infoRec->rec.display.alpha_len > CDMA_ALPHA_INFO_BUFFER_LENGTH) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007335 RLOGE("cdmaInfoRecInd: invalid display info response length %d "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08007336 "expected not more than %d", (int) infoRec->rec.display.alpha_len,
Amit Mahajan1955c742016-12-29 07:07:54 -08007337 CDMA_ALPHA_INFO_BUFFER_LENGTH);
7338 return 0;
7339 }
7340 string8 = (char*) malloc((infoRec->rec.display.alpha_len + 1) * sizeof(char));
7341 if (string8 == NULL) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007342 RLOGE("cdmaInfoRecInd: Memory allocation failed for "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08007343 "responseCdmaInformationRecords");
Amit Mahajan1955c742016-12-29 07:07:54 -08007344 return 0;
7345 }
7346 memcpy(string8, infoRec->rec.display.alpha_buf, infoRec->rec.display.alpha_len);
7347 string8[(int)infoRec->rec.display.alpha_len] = '\0';
7348
7349 record->display.resize(1);
7350 record->display[0].alphaBuf = string8;
7351 free(string8);
7352 string8 = NULL;
7353 break;
7354 }
7355
7356 case RIL_CDMA_CALLED_PARTY_NUMBER_INFO_REC:
7357 case RIL_CDMA_CALLING_PARTY_NUMBER_INFO_REC:
7358 case RIL_CDMA_CONNECTED_NUMBER_INFO_REC: {
7359 if (infoRec->rec.number.len > CDMA_NUMBER_INFO_BUFFER_LENGTH) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007360 RLOGE("cdmaInfoRecInd: invalid display info response length %d "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08007361 "expected not more than %d", (int) infoRec->rec.number.len,
Amit Mahajan1955c742016-12-29 07:07:54 -08007362 CDMA_NUMBER_INFO_BUFFER_LENGTH);
7363 return 0;
7364 }
7365 string8 = (char*) malloc((infoRec->rec.number.len + 1) * sizeof(char));
7366 if (string8 == NULL) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007367 RLOGE("cdmaInfoRecInd: Memory allocation failed for "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08007368 "responseCdmaInformationRecords");
Amit Mahajan1955c742016-12-29 07:07:54 -08007369 return 0;
7370 }
7371 memcpy(string8, infoRec->rec.number.buf, infoRec->rec.number.len);
7372 string8[(int)infoRec->rec.number.len] = '\0';
7373
7374 record->number.resize(1);
7375 record->number[0].number = string8;
7376 free(string8);
7377 string8 = NULL;
7378 record->number[0].numberType = infoRec->rec.number.number_type;
7379 record->number[0].numberPlan = infoRec->rec.number.number_plan;
7380 record->number[0].pi = infoRec->rec.number.pi;
7381 record->number[0].si = infoRec->rec.number.si;
7382 break;
7383 }
7384
7385 case RIL_CDMA_SIGNAL_INFO_REC: {
7386 record->signal.resize(1);
7387 record->signal[0].isPresent = infoRec->rec.signal.isPresent;
7388 record->signal[0].signalType = infoRec->rec.signal.signalType;
7389 record->signal[0].alertPitch = infoRec->rec.signal.alertPitch;
7390 record->signal[0].signal = infoRec->rec.signal.signal;
7391 break;
7392 }
7393
7394 case RIL_CDMA_REDIRECTING_NUMBER_INFO_REC: {
7395 if (infoRec->rec.redir.redirectingNumber.len >
7396 CDMA_NUMBER_INFO_BUFFER_LENGTH) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007397 RLOGE("cdmaInfoRecInd: invalid display info response length %d "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08007398 "expected not more than %d\n",
Amit Mahajan1955c742016-12-29 07:07:54 -08007399 (int)infoRec->rec.redir.redirectingNumber.len,
7400 CDMA_NUMBER_INFO_BUFFER_LENGTH);
7401 return 0;
7402 }
7403 string8 = (char*) malloc((infoRec->rec.redir.redirectingNumber.len + 1) *
7404 sizeof(char));
7405 if (string8 == NULL) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007406 RLOGE("cdmaInfoRecInd: Memory allocation failed for "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08007407 "responseCdmaInformationRecords");
Amit Mahajan1955c742016-12-29 07:07:54 -08007408 return 0;
7409 }
7410 memcpy(string8, infoRec->rec.redir.redirectingNumber.buf,
7411 infoRec->rec.redir.redirectingNumber.len);
7412 string8[(int)infoRec->rec.redir.redirectingNumber.len] = '\0';
7413
7414 record->redir.resize(1);
7415 record->redir[0].redirectingNumber.number = string8;
7416 free(string8);
7417 string8 = NULL;
7418 record->redir[0].redirectingNumber.numberType =
7419 infoRec->rec.redir.redirectingNumber.number_type;
7420 record->redir[0].redirectingNumber.numberPlan =
7421 infoRec->rec.redir.redirectingNumber.number_plan;
7422 record->redir[0].redirectingNumber.pi = infoRec->rec.redir.redirectingNumber.pi;
7423 record->redir[0].redirectingNumber.si = infoRec->rec.redir.redirectingNumber.si;
7424 record->redir[0].redirectingReason =
7425 (CdmaRedirectingReason) infoRec->rec.redir.redirectingReason;
7426 break;
7427 }
7428
7429 case RIL_CDMA_LINE_CONTROL_INFO_REC: {
7430 record->lineCtrl.resize(1);
7431 record->lineCtrl[0].lineCtrlPolarityIncluded =
7432 infoRec->rec.lineCtrl.lineCtrlPolarityIncluded;
7433 record->lineCtrl[0].lineCtrlToggle = infoRec->rec.lineCtrl.lineCtrlToggle;
7434 record->lineCtrl[0].lineCtrlReverse = infoRec->rec.lineCtrl.lineCtrlReverse;
7435 record->lineCtrl[0].lineCtrlPowerDenial =
7436 infoRec->rec.lineCtrl.lineCtrlPowerDenial;
7437 break;
7438 }
7439
7440 case RIL_CDMA_T53_CLIR_INFO_REC: {
7441 record->clir.resize(1);
7442 record->clir[0].cause = infoRec->rec.clir.cause;
7443 break;
7444 }
7445
7446 case RIL_CDMA_T53_AUDIO_CONTROL_INFO_REC: {
7447 record->audioCtrl.resize(1);
7448 record->audioCtrl[0].upLink = infoRec->rec.audioCtrl.upLink;
7449 record->audioCtrl[0].downLink = infoRec->rec.audioCtrl.downLink;
7450 break;
7451 }
7452
7453 case RIL_CDMA_T53_RELEASE_INFO_REC:
Amit Mahajan111ddca2017-03-03 12:05:13 -08007454 RLOGE("cdmaInfoRecInd: RIL_CDMA_T53_RELEASE_INFO_REC: INVALID");
Amit Mahajan1955c742016-12-29 07:07:54 -08007455 return 0;
7456
7457 default:
Amit Mahajan111ddca2017-03-03 12:05:13 -08007458 RLOGE("cdmaInfoRecInd: Incorrect name value");
Amit Mahajan1955c742016-12-29 07:07:54 -08007459 return 0;
7460 }
7461 }
7462
Jayachandran C572f2f42017-03-25 14:30:13 -07007463#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007464 RLOGD("cdmaInfoRecInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07007465#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007466 Return<void> retStatus = radioService[slotId]->mRadioIndication->cdmaInfoRec(
Amit Mahajan1955c742016-12-29 07:07:54 -08007467 convertIntToRadioIndicationType(indicationType), records);
Amit Mahajan17249842017-01-19 15:05:45 -08007468 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan1955c742016-12-29 07:07:54 -08007469 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007470 RLOGE("cdmaInfoRecInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan1955c742016-12-29 07:07:54 -08007471 }
7472
7473 return 0;
7474}
7475
Amit Mahajan759786a2017-03-03 17:35:47 -08007476int radio::indicateRingbackToneInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007477 int indicationType, int token, RIL_Errno e, void *response,
7478 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007479 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007480 if (response == NULL || responseLen != sizeof(int)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007481 RLOGE("indicateRingbackToneInd: invalid response");
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007482 return 0;
7483 }
7484 bool start = ((int32_t *) response)[0];
Jayachandran C572f2f42017-03-25 14:30:13 -07007485#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007486 RLOGD("indicateRingbackToneInd: start %d", start);
Jayachandran C572f2f42017-03-25 14:30:13 -07007487#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007488 Return<void> retStatus = radioService[slotId]->mRadioIndication->indicateRingbackTone(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007489 convertIntToRadioIndicationType(indicationType), start);
Amit Mahajan17249842017-01-19 15:05:45 -08007490 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007491 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007492 RLOGE("indicateRingbackToneInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007493 }
7494
7495 return 0;
7496}
7497
Amit Mahajan759786a2017-03-03 17:35:47 -08007498int radio::resendIncallMuteInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007499 int indicationType, int token, RIL_Errno e, void *response,
7500 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007501 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Jayachandran C572f2f42017-03-25 14:30:13 -07007502#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007503 RLOGD("resendIncallMuteInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07007504#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007505 Return<void> retStatus = radioService[slotId]->mRadioIndication->resendIncallMute(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007506 convertIntToRadioIndicationType(indicationType));
Amit Mahajan17249842017-01-19 15:05:45 -08007507 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007508 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007509 RLOGE("resendIncallMuteInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007510 }
7511
7512 return 0;
7513}
7514
Amit Mahajan759786a2017-03-03 17:35:47 -08007515int radio::cdmaSubscriptionSourceChangedInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007516 int indicationType, int token, RIL_Errno e,
7517 void *response, size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007518 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007519 if (response == NULL || responseLen != sizeof(int)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007520 RLOGE("cdmaSubscriptionSourceChangedInd: invalid response");
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007521 return 0;
7522 }
7523 int32_t cdmaSource = ((int32_t *) response)[0];
Jayachandran C572f2f42017-03-25 14:30:13 -07007524#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007525 RLOGD("cdmaSubscriptionSourceChangedInd: cdmaSource %d", cdmaSource);
Jayachandran C572f2f42017-03-25 14:30:13 -07007526#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007527 Return<void> retStatus = radioService[slotId]->mRadioIndication->
7528 cdmaSubscriptionSourceChanged(convertIntToRadioIndicationType(indicationType),
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007529 (CdmaSubscriptionSource) cdmaSource);
Amit Mahajan17249842017-01-19 15:05:45 -08007530 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007531 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007532 RLOGE("cdmaSubscriptionSourceChangedInd: radioService[%d]->mRadioIndication == NULL",
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007533 slotId);
7534 }
7535
7536 return 0;
7537}
7538
Amit Mahajan759786a2017-03-03 17:35:47 -08007539int radio::cdmaPrlChangedInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007540 int indicationType, int token, RIL_Errno e, void *response,
7541 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007542 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007543 if (response == NULL || responseLen != sizeof(int)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007544 RLOGE("cdmaPrlChangedInd: invalid response");
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007545 return 0;
7546 }
7547 int32_t version = ((int32_t *) response)[0];
Jayachandran C572f2f42017-03-25 14:30:13 -07007548#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007549 RLOGD("cdmaPrlChangedInd: version %d", version);
Jayachandran C572f2f42017-03-25 14:30:13 -07007550#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007551 Return<void> retStatus = radioService[slotId]->mRadioIndication->cdmaPrlChanged(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007552 convertIntToRadioIndicationType(indicationType), version);
Amit Mahajan17249842017-01-19 15:05:45 -08007553 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007554 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007555 RLOGE("cdmaPrlChangedInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007556 }
7557
7558 return 0;
7559}
7560
Amit Mahajan759786a2017-03-03 17:35:47 -08007561int radio::exitEmergencyCallbackModeInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007562 int indicationType, int token, RIL_Errno e, void *response,
7563 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007564 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Jayachandran C572f2f42017-03-25 14:30:13 -07007565#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007566 RLOGD("exitEmergencyCallbackModeInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07007567#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007568 Return<void> retStatus = radioService[slotId]->mRadioIndication->exitEmergencyCallbackMode(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007569 convertIntToRadioIndicationType(indicationType));
Amit Mahajan17249842017-01-19 15:05:45 -08007570 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007571 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007572 RLOGE("exitEmergencyCallbackModeInd: radioService[%d]->mRadioIndication == NULL",
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007573 slotId);
7574 }
7575
7576 return 0;
7577}
7578
Amit Mahajan759786a2017-03-03 17:35:47 -08007579int radio::rilConnectedInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007580 int indicationType, int token, RIL_Errno e, void *response,
7581 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007582 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007583 RLOGD("rilConnectedInd");
Amit Mahajan17249842017-01-19 15:05:45 -08007584 Return<void> retStatus = radioService[slotId]->mRadioIndication->rilConnected(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007585 convertIntToRadioIndicationType(indicationType));
Amit Mahajan17249842017-01-19 15:05:45 -08007586 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007587 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007588 RLOGE("rilConnectedInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007589 }
7590
7591 return 0;
7592}
7593
Amit Mahajan759786a2017-03-03 17:35:47 -08007594int radio::voiceRadioTechChangedInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007595 int indicationType, int token, RIL_Errno e, void *response,
7596 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007597 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007598 if (response == NULL || responseLen != sizeof(int)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007599 RLOGE("voiceRadioTechChangedInd: invalid response");
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007600 return 0;
7601 }
7602 int32_t rat = ((int32_t *) response)[0];
Jayachandran C572f2f42017-03-25 14:30:13 -07007603#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007604 RLOGD("voiceRadioTechChangedInd: rat %d", rat);
Jayachandran C572f2f42017-03-25 14:30:13 -07007605#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007606 Return<void> retStatus = radioService[slotId]->mRadioIndication->voiceRadioTechChanged(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007607 convertIntToRadioIndicationType(indicationType), (RadioTechnology) rat);
Amit Mahajan17249842017-01-19 15:05:45 -08007608 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007609 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007610 RLOGE("voiceRadioTechChangedInd: radioService[%d]->mRadioIndication == NULL",
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007611 slotId);
7612 }
7613
7614 return 0;
7615}
7616
7617void convertRilCellInfoListToHal(void *response, size_t responseLen, hidl_vec<CellInfo>& records) {
7618 int num = responseLen / sizeof(RIL_CellInfo_v12);
7619 records.resize(num);
7620
7621 RIL_CellInfo_v12 *rillCellInfo = (RIL_CellInfo_v12 *) response;
7622 for (int i = 0; i < num; i++) {
7623 records[i].cellInfoType = (CellInfoType) rillCellInfo->cellInfoType;
7624 records[i].registered = rillCellInfo->registered;
7625 records[i].timeStampType = (TimeStampType) rillCellInfo->timeStampType;
7626 records[i].timeStamp = rillCellInfo->timeStamp;
Sanket Padawe378ccdd2017-01-24 14:11:12 -08007627 // All vectors should be size 0 except one which will be size 1. Set everything to
7628 // size 0 initially.
7629 records[i].gsm.resize(0);
7630 records[i].wcdma.resize(0);
7631 records[i].cdma.resize(0);
7632 records[i].lte.resize(0);
7633 records[i].tdscdma.resize(0);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007634 switch(rillCellInfo->cellInfoType) {
7635 case RIL_CELL_INFO_TYPE_GSM: {
7636 records[i].gsm.resize(1);
7637 CellInfoGsm *cellInfoGsm = &records[i].gsm[0];
7638 cellInfoGsm->cellIdentityGsm.mcc =
7639 std::to_string(rillCellInfo->CellInfo.gsm.cellIdentityGsm.mcc);
7640 cellInfoGsm->cellIdentityGsm.mnc =
7641 std::to_string(rillCellInfo->CellInfo.gsm.cellIdentityGsm.mnc);
7642 cellInfoGsm->cellIdentityGsm.lac =
7643 rillCellInfo->CellInfo.gsm.cellIdentityGsm.lac;
7644 cellInfoGsm->cellIdentityGsm.cid =
7645 rillCellInfo->CellInfo.gsm.cellIdentityGsm.cid;
7646 cellInfoGsm->cellIdentityGsm.arfcn =
7647 rillCellInfo->CellInfo.gsm.cellIdentityGsm.arfcn;
7648 cellInfoGsm->cellIdentityGsm.bsic =
7649 rillCellInfo->CellInfo.gsm.cellIdentityGsm.bsic;
7650 cellInfoGsm->signalStrengthGsm.signalStrength =
7651 rillCellInfo->CellInfo.gsm.signalStrengthGsm.signalStrength;
7652 cellInfoGsm->signalStrengthGsm.bitErrorRate =
7653 rillCellInfo->CellInfo.gsm.signalStrengthGsm.bitErrorRate;
7654 cellInfoGsm->signalStrengthGsm.timingAdvance =
7655 rillCellInfo->CellInfo.gsm.signalStrengthGsm.timingAdvance;
7656 break;
7657 }
7658
7659 case RIL_CELL_INFO_TYPE_WCDMA: {
7660 records[i].wcdma.resize(1);
7661 CellInfoWcdma *cellInfoWcdma = &records[i].wcdma[0];
7662 cellInfoWcdma->cellIdentityWcdma.mcc =
7663 std::to_string(rillCellInfo->CellInfo.wcdma.cellIdentityWcdma.mcc);
7664 cellInfoWcdma->cellIdentityWcdma.mnc =
7665 std::to_string(rillCellInfo->CellInfo.wcdma.cellIdentityWcdma.mnc);
7666 cellInfoWcdma->cellIdentityWcdma.lac =
7667 rillCellInfo->CellInfo.wcdma.cellIdentityWcdma.lac;
7668 cellInfoWcdma->cellIdentityWcdma.cid =
7669 rillCellInfo->CellInfo.wcdma.cellIdentityWcdma.cid;
7670 cellInfoWcdma->cellIdentityWcdma.psc =
7671 rillCellInfo->CellInfo.wcdma.cellIdentityWcdma.psc;
7672 cellInfoWcdma->cellIdentityWcdma.uarfcn =
7673 rillCellInfo->CellInfo.wcdma.cellIdentityWcdma.uarfcn;
7674 cellInfoWcdma->signalStrengthWcdma.signalStrength =
7675 rillCellInfo->CellInfo.wcdma.signalStrengthWcdma.signalStrength;
7676 cellInfoWcdma->signalStrengthWcdma.bitErrorRate =
7677 rillCellInfo->CellInfo.wcdma.signalStrengthWcdma.bitErrorRate;
7678 break;
7679 }
7680
7681 case RIL_CELL_INFO_TYPE_CDMA: {
7682 records[i].cdma.resize(1);
7683 CellInfoCdma *cellInfoCdma = &records[i].cdma[0];
7684 cellInfoCdma->cellIdentityCdma.networkId =
7685 rillCellInfo->CellInfo.cdma.cellIdentityCdma.networkId;
7686 cellInfoCdma->cellIdentityCdma.systemId =
7687 rillCellInfo->CellInfo.cdma.cellIdentityCdma.systemId;
7688 cellInfoCdma->cellIdentityCdma.baseStationId =
7689 rillCellInfo->CellInfo.cdma.cellIdentityCdma.basestationId;
7690 cellInfoCdma->cellIdentityCdma.longitude =
7691 rillCellInfo->CellInfo.cdma.cellIdentityCdma.longitude;
7692 cellInfoCdma->cellIdentityCdma.latitude =
7693 rillCellInfo->CellInfo.cdma.cellIdentityCdma.latitude;
7694 cellInfoCdma->signalStrengthCdma.dbm =
7695 rillCellInfo->CellInfo.cdma.signalStrengthCdma.dbm;
7696 cellInfoCdma->signalStrengthCdma.ecio =
7697 rillCellInfo->CellInfo.cdma.signalStrengthCdma.ecio;
7698 cellInfoCdma->signalStrengthEvdo.dbm =
7699 rillCellInfo->CellInfo.cdma.signalStrengthEvdo.dbm;
7700 cellInfoCdma->signalStrengthEvdo.ecio =
7701 rillCellInfo->CellInfo.cdma.signalStrengthEvdo.ecio;
7702 cellInfoCdma->signalStrengthEvdo.signalNoiseRatio =
7703 rillCellInfo->CellInfo.cdma.signalStrengthEvdo.signalNoiseRatio;
7704 break;
7705 }
7706
7707 case RIL_CELL_INFO_TYPE_LTE: {
7708 records[i].lte.resize(1);
7709 CellInfoLte *cellInfoLte = &records[i].lte[0];
7710 cellInfoLte->cellIdentityLte.mcc =
7711 std::to_string(rillCellInfo->CellInfo.lte.cellIdentityLte.mcc);
7712 cellInfoLte->cellIdentityLte.mnc =
7713 std::to_string(rillCellInfo->CellInfo.lte.cellIdentityLte.mnc);
7714 cellInfoLte->cellIdentityLte.ci =
7715 rillCellInfo->CellInfo.lte.cellIdentityLte.ci;
7716 cellInfoLte->cellIdentityLte.pci =
7717 rillCellInfo->CellInfo.lte.cellIdentityLte.pci;
7718 cellInfoLte->cellIdentityLte.tac =
7719 rillCellInfo->CellInfo.lte.cellIdentityLte.tac;
7720 cellInfoLte->cellIdentityLte.earfcn =
7721 rillCellInfo->CellInfo.lte.cellIdentityLte.earfcn;
7722 cellInfoLte->signalStrengthLte.signalStrength =
7723 rillCellInfo->CellInfo.lte.signalStrengthLte.signalStrength;
7724 cellInfoLte->signalStrengthLte.rsrp =
7725 rillCellInfo->CellInfo.lte.signalStrengthLte.rsrp;
7726 cellInfoLte->signalStrengthLte.rsrq =
7727 rillCellInfo->CellInfo.lte.signalStrengthLte.rsrq;
7728 cellInfoLte->signalStrengthLte.rssnr =
7729 rillCellInfo->CellInfo.lte.signalStrengthLte.rssnr;
7730 cellInfoLte->signalStrengthLte.cqi =
7731 rillCellInfo->CellInfo.lte.signalStrengthLte.cqi;
7732 cellInfoLte->signalStrengthLte.timingAdvance =
7733 rillCellInfo->CellInfo.lte.signalStrengthLte.timingAdvance;
7734 break;
7735 }
7736
7737 case RIL_CELL_INFO_TYPE_TD_SCDMA: {
7738 records[i].tdscdma.resize(1);
7739 CellInfoTdscdma *cellInfoTdscdma = &records[i].tdscdma[0];
7740 cellInfoTdscdma->cellIdentityTdscdma.mcc =
7741 std::to_string(rillCellInfo->CellInfo.tdscdma.cellIdentityTdscdma.mcc);
7742 cellInfoTdscdma->cellIdentityTdscdma.mnc =
7743 std::to_string(rillCellInfo->CellInfo.tdscdma.cellIdentityTdscdma.mnc);
7744 cellInfoTdscdma->cellIdentityTdscdma.lac =
7745 rillCellInfo->CellInfo.tdscdma.cellIdentityTdscdma.lac;
7746 cellInfoTdscdma->cellIdentityTdscdma.cid =
7747 rillCellInfo->CellInfo.tdscdma.cellIdentityTdscdma.cid;
7748 cellInfoTdscdma->cellIdentityTdscdma.cpid =
7749 rillCellInfo->CellInfo.tdscdma.cellIdentityTdscdma.cpid;
7750 cellInfoTdscdma->signalStrengthTdscdma.rscp =
7751 rillCellInfo->CellInfo.tdscdma.signalStrengthTdscdma.rscp;
7752 break;
7753 }
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08007754 default: {
7755 break;
7756 }
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007757 }
7758 rillCellInfo += 1;
7759 }
7760}
7761
Amit Mahajan759786a2017-03-03 17:35:47 -08007762int radio::cellInfoListInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007763 int indicationType, int token, RIL_Errno e, void *response,
7764 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007765 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007766 if (response == NULL || responseLen % sizeof(RIL_CellInfo_v12) != 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007767 RLOGE("cellInfoListInd: invalid response");
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007768 return 0;
7769 }
7770
7771 hidl_vec<CellInfo> records;
7772 convertRilCellInfoListToHal(response, responseLen, records);
7773
Jayachandran C572f2f42017-03-25 14:30:13 -07007774#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007775 RLOGD("cellInfoListInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07007776#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007777 Return<void> retStatus = radioService[slotId]->mRadioIndication->cellInfoList(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007778 convertIntToRadioIndicationType(indicationType), records);
Amit Mahajan17249842017-01-19 15:05:45 -08007779 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007780 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007781 RLOGE("cellInfoListInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007782 }
7783
7784 return 0;
7785}
7786
Amit Mahajan759786a2017-03-03 17:35:47 -08007787int radio::imsNetworkStateChangedInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007788 int indicationType, int token, RIL_Errno e, void *response,
7789 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007790 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Jayachandran C572f2f42017-03-25 14:30:13 -07007791#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007792 RLOGD("imsNetworkStateChangedInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07007793#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007794 Return<void> retStatus = radioService[slotId]->mRadioIndication->imsNetworkStateChanged(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007795 convertIntToRadioIndicationType(indicationType));
Amit Mahajan17249842017-01-19 15:05:45 -08007796 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007797 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007798 RLOGE("imsNetworkStateChangedInd: radioService[%d]->mRadioIndication == NULL",
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007799 slotId);
7800 }
7801
7802 return 0;
7803}
7804
Amit Mahajan759786a2017-03-03 17:35:47 -08007805int radio::subscriptionStatusChangedInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007806 int indicationType, int token, RIL_Errno e, void *response,
7807 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007808 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007809 if (response == NULL || responseLen != sizeof(int)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007810 RLOGE("subscriptionStatusChangedInd: invalid response");
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007811 return 0;
7812 }
7813 bool activate = ((int32_t *) response)[0];
Jayachandran C572f2f42017-03-25 14:30:13 -07007814#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007815 RLOGD("subscriptionStatusChangedInd: activate %d", activate);
Jayachandran C572f2f42017-03-25 14:30:13 -07007816#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007817 Return<void> retStatus = radioService[slotId]->mRadioIndication->subscriptionStatusChanged(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007818 convertIntToRadioIndicationType(indicationType), activate);
Amit Mahajan17249842017-01-19 15:05:45 -08007819 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007820 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007821 RLOGE("subscriptionStatusChangedInd: radioService[%d]->mRadioIndication == NULL",
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007822 slotId);
7823 }
7824
7825 return 0;
7826}
7827
Amit Mahajan759786a2017-03-03 17:35:47 -08007828int radio::srvccStateNotifyInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007829 int indicationType, int token, RIL_Errno e, void *response,
7830 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007831 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007832 if (response == NULL || responseLen != sizeof(int)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007833 RLOGE("srvccStateNotifyInd: invalid response");
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007834 return 0;
7835 }
7836 int32_t state = ((int32_t *) response)[0];
Jayachandran C572f2f42017-03-25 14:30:13 -07007837#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007838 RLOGD("srvccStateNotifyInd: rat %d", state);
Jayachandran C572f2f42017-03-25 14:30:13 -07007839#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007840 Return<void> retStatus = radioService[slotId]->mRadioIndication->srvccStateNotify(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007841 convertIntToRadioIndicationType(indicationType), (SrvccState) state);
Amit Mahajan17249842017-01-19 15:05:45 -08007842 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007843 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007844 RLOGE("srvccStateNotifyInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007845 }
7846
7847 return 0;
7848}
7849
7850void convertRilHardwareConfigListToHal(void *response, size_t responseLen,
7851 hidl_vec<HardwareConfig>& records) {
7852 int num = responseLen / sizeof(RIL_HardwareConfig);
7853 records.resize(num);
7854
7855 RIL_HardwareConfig *rilHardwareConfig = (RIL_HardwareConfig *) response;
7856 for (int i = 0; i < num; i++) {
7857 records[i].type = (HardwareConfigType) rilHardwareConfig[i].type;
7858 records[i].uuid = convertCharPtrToHidlString(rilHardwareConfig[i].uuid);
7859 records[i].state = (HardwareConfigState) rilHardwareConfig[i].state;
7860 switch (rilHardwareConfig[i].type) {
7861 case RIL_HARDWARE_CONFIG_MODEM: {
7862 records[i].modem.resize(1);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08007863 records[i].sim.resize(0);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007864 HardwareConfigModem *hwConfigModem = &records[i].modem[0];
7865 hwConfigModem->rat = rilHardwareConfig[i].cfg.modem.rat;
7866 hwConfigModem->maxVoice = rilHardwareConfig[i].cfg.modem.maxVoice;
7867 hwConfigModem->maxData = rilHardwareConfig[i].cfg.modem.maxData;
7868 hwConfigModem->maxStandby = rilHardwareConfig[i].cfg.modem.maxStandby;
7869 break;
7870 }
7871
7872 case RIL_HARDWARE_CONFIG_SIM: {
7873 records[i].sim.resize(1);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08007874 records[i].modem.resize(0);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007875 records[i].sim[0].modemUuid =
7876 convertCharPtrToHidlString(rilHardwareConfig[i].cfg.sim.modemUuid);
7877 break;
7878 }
7879 }
7880 }
7881}
7882
Amit Mahajan759786a2017-03-03 17:35:47 -08007883int radio::hardwareConfigChangedInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007884 int indicationType, int token, RIL_Errno e, void *response,
7885 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007886 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007887 if (response == NULL || responseLen % sizeof(RIL_HardwareConfig) != 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007888 RLOGE("hardwareConfigChangedInd: invalid response");
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007889 return 0;
7890 }
7891
7892 hidl_vec<HardwareConfig> configs;
7893 convertRilHardwareConfigListToHal(response, responseLen, configs);
7894
Jayachandran C572f2f42017-03-25 14:30:13 -07007895#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007896 RLOGD("hardwareConfigChangedInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07007897#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007898 Return<void> retStatus = radioService[slotId]->mRadioIndication->hardwareConfigChanged(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007899 convertIntToRadioIndicationType(indicationType), configs);
Amit Mahajan17249842017-01-19 15:05:45 -08007900 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007901 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007902 RLOGE("hardwareConfigChangedInd: radioService[%d]->mRadioIndication == NULL",
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007903 slotId);
7904 }
7905
7906 return 0;
7907}
7908
7909void convertRilRadioCapabilityToHal(void *response, size_t responseLen, RadioCapability& rc) {
7910 RIL_RadioCapability *rilRadioCapability = (RIL_RadioCapability *) response;
7911 rc.session = rilRadioCapability->session;
7912 rc.phase = (android::hardware::radio::V1_0::RadioCapabilityPhase) rilRadioCapability->phase;
7913 rc.raf = rilRadioCapability->rat;
7914 rc.logicalModemUuid = convertCharPtrToHidlString(rilRadioCapability->logicalModemUuid);
7915 rc.status = (android::hardware::radio::V1_0::RadioCapabilityStatus) rilRadioCapability->status;
7916}
7917
Amit Mahajan759786a2017-03-03 17:35:47 -08007918int radio::radioCapabilityIndicationInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007919 int indicationType, int token, RIL_Errno e, void *response,
7920 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007921 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007922 if (response == NULL || responseLen != sizeof(RIL_RadioCapability)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007923 RLOGE("radioCapabilityIndicationInd: invalid response");
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007924 return 0;
7925 }
7926
Jack Yuf68e0da2017-02-07 14:53:09 -08007927 RadioCapability rc = {};
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007928 convertRilRadioCapabilityToHal(response, responseLen, rc);
7929
Jayachandran C572f2f42017-03-25 14:30:13 -07007930#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007931 RLOGD("radioCapabilityIndicationInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07007932#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007933 Return<void> retStatus = radioService[slotId]->mRadioIndication->radioCapabilityIndication(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007934 convertIntToRadioIndicationType(indicationType), rc);
Amit Mahajan17249842017-01-19 15:05:45 -08007935 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007936 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007937 RLOGE("radioCapabilityIndicationInd: radioService[%d]->mRadioIndication == NULL",
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007938 slotId);
7939 }
7940
7941 return 0;
7942}
7943
7944bool isServiceTypeCfQuery(RIL_SsServiceType serType, RIL_SsRequestType reqType) {
7945 if ((reqType == SS_INTERROGATION) &&
7946 (serType == SS_CFU ||
7947 serType == SS_CF_BUSY ||
7948 serType == SS_CF_NO_REPLY ||
7949 serType == SS_CF_NOT_REACHABLE ||
7950 serType == SS_CF_ALL ||
7951 serType == SS_CF_ALL_CONDITIONAL)) {
7952 return true;
7953 }
7954 return false;
7955}
7956
Amit Mahajan759786a2017-03-03 17:35:47 -08007957int radio::onSupplementaryServiceIndicationInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007958 int indicationType, int token, RIL_Errno e,
7959 void *response, size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007960 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007961 if (response == NULL || responseLen != sizeof(RIL_StkCcUnsolSsResponse)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007962 RLOGE("onSupplementaryServiceIndicationInd: invalid response");
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007963 return 0;
7964 }
7965
7966 RIL_StkCcUnsolSsResponse *rilSsResponse = (RIL_StkCcUnsolSsResponse *) response;
Jack Yuf68e0da2017-02-07 14:53:09 -08007967 StkCcUnsolSsResult ss = {};
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007968 ss.serviceType = (SsServiceType) rilSsResponse->serviceType;
7969 ss.requestType = (SsRequestType) rilSsResponse->requestType;
7970 ss.teleserviceType = (SsTeleserviceType) rilSsResponse->teleserviceType;
7971 ss.serviceClass = rilSsResponse->serviceClass;
7972 ss.result = (RadioError) rilSsResponse->result;
7973
7974 if (isServiceTypeCfQuery(rilSsResponse->serviceType, rilSsResponse->requestType)) {
Jayachandran C572f2f42017-03-25 14:30:13 -07007975#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007976 RLOGD("onSupplementaryServiceIndicationInd CF type, num of Cf elements %d",
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007977 rilSsResponse->cfData.numValidIndexes);
Jayachandran C572f2f42017-03-25 14:30:13 -07007978#endif
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007979 if (rilSsResponse->cfData.numValidIndexes > NUM_SERVICE_CLASSES) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007980 RLOGE("onSupplementaryServiceIndicationInd numValidIndexes is greater than "
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007981 "max value %d, truncating it to max value", NUM_SERVICE_CLASSES);
7982 rilSsResponse->cfData.numValidIndexes = NUM_SERVICE_CLASSES;
7983 }
7984
7985 ss.cfData.resize(1);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08007986 ss.ssInfo.resize(0);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007987
7988 /* number of call info's */
7989 ss.cfData[0].cfInfo.resize(rilSsResponse->cfData.numValidIndexes);
7990
7991 for (int i = 0; i < rilSsResponse->cfData.numValidIndexes; i++) {
7992 RIL_CallForwardInfo cf = rilSsResponse->cfData.cfInfo[i];
7993 CallForwardInfo *cfInfo = &ss.cfData[0].cfInfo[i];
7994
7995 cfInfo->status = (CallForwardInfoStatus) cf.status;
7996 cfInfo->reason = cf.reason;
7997 cfInfo->serviceClass = cf.serviceClass;
7998 cfInfo->toa = cf.toa;
7999 cfInfo->number = convertCharPtrToHidlString(cf.number);
8000 cfInfo->timeSeconds = cf.timeSeconds;
Jayachandran C572f2f42017-03-25 14:30:13 -07008001#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08008002 RLOGD("onSupplementaryServiceIndicationInd: "
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008003 "Data: %d,reason=%d,cls=%d,toa=%d,num=%s,tout=%d],", cf.status,
8004 cf.reason, cf.serviceClass, cf.toa, (char*)cf.number, cf.timeSeconds);
Jayachandran C572f2f42017-03-25 14:30:13 -07008005#endif
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008006 }
8007 } else {
8008 ss.ssInfo.resize(1);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08008009 ss.cfData.resize(0);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008010
8011 /* each int */
8012 ss.ssInfo[0].ssInfo.resize(SS_INFO_MAX);
8013 for (int i = 0; i < SS_INFO_MAX; i++) {
Jayachandran C572f2f42017-03-25 14:30:13 -07008014#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08008015 RLOGD("onSupplementaryServiceIndicationInd: Data: %d",
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008016 rilSsResponse->ssInfo[i]);
Jayachandran C572f2f42017-03-25 14:30:13 -07008017#endif
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008018 ss.ssInfo[0].ssInfo[i] = rilSsResponse->ssInfo[i];
8019 }
8020 }
8021
Jayachandran C572f2f42017-03-25 14:30:13 -07008022#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08008023 RLOGD("onSupplementaryServiceIndicationInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07008024#endif
Amit Mahajan17249842017-01-19 15:05:45 -08008025 Return<void> retStatus = radioService[slotId]->mRadioIndication->
8026 onSupplementaryServiceIndication(convertIntToRadioIndicationType(indicationType),
8027 ss);
8028 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008029 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008030 RLOGE("onSupplementaryServiceIndicationInd: "
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008031 "radioService[%d]->mRadioIndication == NULL", slotId);
8032 }
8033
8034 return 0;
8035}
8036
Amit Mahajan759786a2017-03-03 17:35:47 -08008037int radio::stkCallControlAlphaNotifyInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008038 int indicationType, int token, RIL_Errno e, void *response,
8039 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08008040 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008041 if (response == NULL || responseLen == 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008042 RLOGE("stkCallControlAlphaNotifyInd: invalid response");
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008043 return 0;
8044 }
Jayachandran C572f2f42017-03-25 14:30:13 -07008045#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08008046 RLOGD("stkCallControlAlphaNotifyInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07008047#endif
Amit Mahajan17249842017-01-19 15:05:45 -08008048 Return<void> retStatus = radioService[slotId]->mRadioIndication->stkCallControlAlphaNotify(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008049 convertIntToRadioIndicationType(indicationType),
8050 convertCharPtrToHidlString((char *) response));
Amit Mahajan17249842017-01-19 15:05:45 -08008051 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008052 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008053 RLOGE("stkCallControlAlphaNotifyInd: radioService[%d]->mRadioIndication == NULL",
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008054 slotId);
8055 }
8056
8057 return 0;
8058}
8059
8060void convertRilLceDataInfoToHal(void *response, size_t responseLen, LceDataInfo& lce) {
8061 RIL_LceDataInfo *rilLceDataInfo = (RIL_LceDataInfo *)response;
8062 lce.lastHopCapacityKbps = rilLceDataInfo->last_hop_capacity_kbps;
8063 lce.confidenceLevel = rilLceDataInfo->confidence_level;
8064 lce.lceSuspended = rilLceDataInfo->lce_suspended;
8065}
8066
Amit Mahajan759786a2017-03-03 17:35:47 -08008067int radio::lceDataInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008068 int indicationType, int token, RIL_Errno e, void *response,
8069 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08008070 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008071 if (response == NULL || responseLen != sizeof(RIL_LceDataInfo)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008072 RLOGE("lceDataInd: invalid response");
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008073 return 0;
8074 }
8075
Jack Yuf68e0da2017-02-07 14:53:09 -08008076 LceDataInfo lce = {};
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008077 convertRilLceDataInfoToHal(response, responseLen, lce);
Jayachandran C572f2f42017-03-25 14:30:13 -07008078#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08008079 RLOGD("lceDataInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07008080#endif
Amit Mahajan17249842017-01-19 15:05:45 -08008081 Return<void> retStatus = radioService[slotId]->mRadioIndication->lceData(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008082 convertIntToRadioIndicationType(indicationType), lce);
Amit Mahajan17249842017-01-19 15:05:45 -08008083 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008084 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008085 RLOGE("lceDataInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008086 }
8087
8088 return 0;
8089}
8090
Amit Mahajan759786a2017-03-03 17:35:47 -08008091int radio::pcoDataInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008092 int indicationType, int token, RIL_Errno e, void *response,
8093 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08008094 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008095 if (response == NULL || responseLen != sizeof(RIL_PCO_Data)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008096 RLOGE("pcoDataInd: invalid response");
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008097 return 0;
8098 }
8099
Jack Yuf68e0da2017-02-07 14:53:09 -08008100 PcoDataInfo pco = {};
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008101 RIL_PCO_Data *rilPcoData = (RIL_PCO_Data *)response;
8102 pco.cid = rilPcoData->cid;
8103 pco.bearerProto = convertCharPtrToHidlString(rilPcoData->bearer_proto);
8104 pco.pcoId = rilPcoData->pco_id;
8105 pco.contents.setToExternal((uint8_t *) rilPcoData->contents, rilPcoData->contents_length);
8106
Jayachandran C572f2f42017-03-25 14:30:13 -07008107#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08008108 RLOGD("pcoDataInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07008109#endif
Amit Mahajan17249842017-01-19 15:05:45 -08008110 Return<void> retStatus = radioService[slotId]->mRadioIndication->pcoData(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008111 convertIntToRadioIndicationType(indicationType), pco);
Amit Mahajan17249842017-01-19 15:05:45 -08008112 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008113 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008114 RLOGE("pcoDataInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008115 }
8116
8117 return 0;
8118}
8119
Amit Mahajan759786a2017-03-03 17:35:47 -08008120int radio::modemResetInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008121 int indicationType, int token, RIL_Errno e, void *response,
8122 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08008123 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008124 if (response == NULL || responseLen == 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008125 RLOGE("modemResetInd: invalid response");
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008126 return 0;
8127 }
Jayachandran C572f2f42017-03-25 14:30:13 -07008128#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08008129 RLOGD("modemResetInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07008130#endif
Amit Mahajan17249842017-01-19 15:05:45 -08008131 Return<void> retStatus = radioService[slotId]->mRadioIndication->modemReset(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008132 convertIntToRadioIndicationType(indicationType),
8133 convertCharPtrToHidlString((char *) response));
Amit Mahajan17249842017-01-19 15:05:45 -08008134 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008135 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008136 RLOGE("modemResetInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008137 }
8138
8139 return 0;
8140}
8141
yinxu584379e2017-05-03 15:15:19 -07008142int radio::networkScanResultInd(int slotId,
8143 int indicationType, int token, RIL_Errno e, void *response,
yinxu8688abd2017-05-22 11:26:45 -07008144 size_t responseLen) {
yinxu584379e2017-05-03 15:15:19 -07008145#if VDBG
8146 RLOGD("networkScanResultInd");
8147#endif
yinxu8688abd2017-05-22 11:26:45 -07008148 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
8149 if (response == NULL || responseLen == 0) {
8150 RLOGE("networkScanResultInd: invalid response");
8151 return 0;
8152 }
8153 RLOGD("networkScanResultInd");
8154
8155#if VDBG
8156 RLOGD("networkScanResultInd");
8157#endif
8158
8159 Return<sp<::android::hardware::radio::V1_1::IRadioIndication>> ret =
8160 ::android::hardware::radio::V1_1::IRadioIndication::castFrom(
8161 radioService[slotId]->mRadioIndication);
8162 if (ret.isOk()) {
8163 RIL_NetworkScanResult *networkScanResult = (RIL_NetworkScanResult *) response;
8164
8165 ::android::hardware::radio::V1_1::NetworkScanResult result;
8166 result.status =
8167 (::android::hardware::radio::V1_1::ScanStatus) networkScanResult->status;
8168 result.error = (RadioError) e;
8169 convertRilCellInfoListToHal(
8170 networkScanResult->network_infos,
8171 networkScanResult->network_infos_length * sizeof(RIL_CellInfo_v12),
8172 result.networkInfos);
8173
8174 sp<::android::hardware::radio::V1_1::IRadioIndication> radioIndicationV1_1 = ret;
8175 Return<void> retStatus = radioIndicationV1_1->networkScanResult(
8176 convertIntToRadioIndicationType(indicationType), result);
8177 radioService[slotId]->checkReturnStatus(retStatus);
8178 } else {
8179 RLOGE("networkScanResultInd: ret.isOk() == false for radioService[%d]", slotId);
8180 }
8181 } else {
8182 RLOGE("networkScanResultInd: radioService[%d]->mRadioIndication == NULL", slotId);
8183 }
yinxu584379e2017-05-03 15:15:19 -07008184 return 0;
8185}
8186
pkanwarc61837e2017-03-17 12:49:34 -07008187int radio::carrierInfoForImsiEncryption(int slotId,
8188 int indicationType, int token, RIL_Errno e, void *response,
8189 size_t responseLen) {
8190 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
8191 if (response == NULL || responseLen == 0) {
8192 RLOGE("carrierInfoForImsiEncryption: invalid response");
8193 return 0;
8194 }
8195 RLOGD("carrierInfoForImsiEncryption");
8196 Return<sp<::android::hardware::radio::V1_1::IRadioIndication>> ret =
8197 ::android::hardware::radio::V1_1::IRadioIndication::castFrom(
8198 radioService[slotId]->mRadioIndication);
8199 if (ret.isOk()) {
8200 sp<::android::hardware::radio::V1_1::IRadioIndication> radioIndicationV1_1 = ret;
8201 Return<void> retStatus = radioIndicationV1_1->carrierInfoForImsiEncryption(
8202 convertIntToRadioIndicationType(indicationType));
8203 radioService[slotId]->checkReturnStatus(retStatus);
8204 } else {
8205 RLOGE("carrierInfoForImsiEncryptionResponse: ret.isOk() == false for radioService[%d]",
8206 slotId);
8207 }
8208 } else {
8209 RLOGE("carrierInfoForImsiEncryption: radioService[%d]->mRadioIndication == NULL", slotId);
8210 }
8211
8212 return 0;
8213}
8214
Amit Mahajan759786a2017-03-03 17:35:47 -08008215int radio::oemHookRawInd(int slotId,
Amit Mahajan439da362017-02-13 17:43:04 -08008216 int indicationType, int token, RIL_Errno e, void *response,
8217 size_t responseLen) {
8218 if (oemHookService[slotId] != NULL && oemHookService[slotId]->mOemHookIndication != NULL) {
8219 if (response == NULL || responseLen == 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008220 RLOGE("oemHookRawInd: invalid response");
Amit Mahajan439da362017-02-13 17:43:04 -08008221 return 0;
8222 }
8223
8224 hidl_vec<uint8_t> data;
8225 data.setToExternal((uint8_t *) response, responseLen);
Jayachandran C572f2f42017-03-25 14:30:13 -07008226#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08008227 RLOGD("oemHookRawInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07008228#endif
Amit Mahajan439da362017-02-13 17:43:04 -08008229 Return<void> retStatus = oemHookService[slotId]->mOemHookIndication->oemHookRaw(
8230 convertIntToRadioIndicationType(indicationType), data);
Amit Mahajand423d192017-03-16 17:04:01 -07008231 checkReturnStatus(slotId, retStatus, false);
Amit Mahajan439da362017-02-13 17:43:04 -08008232 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008233 RLOGE("oemHookRawInd: oemHookService[%d]->mOemHookIndication == NULL", slotId);
Amit Mahajan439da362017-02-13 17:43:04 -08008234 }
8235
8236 return 0;
8237}
8238
Amit Mahajancd77a5b2016-08-25 11:19:21 -07008239void radio::registerService(RIL_RadioFunctions *callbacks, CommandInfo *commands) {
8240 using namespace android::hardware;
8241 int simCount = 1;
Amit Mahajan439da362017-02-13 17:43:04 -08008242 const char *serviceNames[] = {
Amit Mahajan7955c432017-03-28 11:17:55 -07008243 android::RIL_getServiceName()
Amit Mahajancd77a5b2016-08-25 11:19:21 -07008244 #if (SIM_COUNT >= 2)
Amit Mahajan7955c432017-03-28 11:17:55 -07008245 , RIL2_SERVICE_NAME
Amit Mahajancd77a5b2016-08-25 11:19:21 -07008246 #if (SIM_COUNT >= 3)
Amit Mahajan7955c432017-03-28 11:17:55 -07008247 , RIL3_SERVICE_NAME
Amit Mahajancd77a5b2016-08-25 11:19:21 -07008248 #if (SIM_COUNT >= 4)
Amit Mahajan7955c432017-03-28 11:17:55 -07008249 , RIL4_SERVICE_NAME
Amit Mahajan439da362017-02-13 17:43:04 -08008250 #endif
8251 #endif
8252 #endif
8253 };
8254
Amit Mahajancd77a5b2016-08-25 11:19:21 -07008255 #if (SIM_COUNT >= 2)
8256 simCount = SIM_COUNT;
8257 #endif
8258
8259 configureRpcThreadpool(1, true /* callerWillJoin */);
8260 for (int i = 0; i < simCount; i++) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08008261 pthread_rwlock_t *radioServiceRwlockPtr = getRadioServiceRwlock(i);
8262 int ret = pthread_rwlock_wrlock(radioServiceRwlockPtr);
8263 assert(ret == 0);
8264
Amit Mahajancd77a5b2016-08-25 11:19:21 -07008265 radioService[i] = new RadioImpl;
Sanket Padawef220dc52017-01-02 23:46:00 -08008266 radioService[i]->mSlotId = i;
Amit Mahajan439da362017-02-13 17:43:04 -08008267 oemHookService[i] = new OemHookImpl;
8268 oemHookService[i]->mSlotId = i;
pkanwarc61837e2017-03-17 12:49:34 -07008269 RLOGD("registerService: starting android::hardware::radio::V1_1::IRadio %s",
8270 serviceNames[i]);
Amit Mahajancd77a5b2016-08-25 11:19:21 -07008271 android::status_t status = radioService[i]->registerAsService(serviceNames[i]);
Amit Mahajan7955c432017-03-28 11:17:55 -07008272 status = oemHookService[i]->registerAsService(serviceNames[i]);
Amit Mahajan932e08e2017-01-24 05:45:02 -08008273
8274 ret = pthread_rwlock_unlock(radioServiceRwlockPtr);
8275 assert(ret == 0);
Amit Mahajancd77a5b2016-08-25 11:19:21 -07008276 }
8277
Sanket Padawe378ccdd2017-01-24 14:11:12 -08008278 s_vendorFunctions = callbacks;
Amit Mahajancd77a5b2016-08-25 11:19:21 -07008279 s_commands = commands;
8280}
8281
8282void rilc_thread_pool() {
8283 joinRpcThreadpool();
Amit Mahajan932e08e2017-01-24 05:45:02 -08008284}
8285
8286pthread_rwlock_t * radio::getRadioServiceRwlock(int slotId) {
8287 pthread_rwlock_t *radioServiceRwlockPtr = &radioServiceRwlock;
8288
8289 #if (SIM_COUNT >= 2)
8290 if (slotId == 2) radioServiceRwlockPtr = &radioServiceRwlock2;
8291 #if (SIM_COUNT >= 3)
8292 if (slotId == 3) radioServiceRwlockPtr = &radioServiceRwlock3;
8293 #if (SIM_COUNT >= 4)
8294 if (slotId == 4) radioServiceRwlockPtr = &radioServiceRwlock4;
8295 #endif
8296 #endif
8297 #endif
8298
8299 return radioServiceRwlockPtr;
Sanket Padawe0de29d12017-02-10 13:19:47 -08008300}