blob: 443225a41c75b85feaf6b775b103dcadff5a412d [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;
Nathan Harold6942b212017-05-25 16:10:35 -070044using ::android::hardware::radio::V1_1::KeepaliveRequest;
Amit Mahajancd77a5b2016-08-25 11:19:21 -070045using ::android::hardware::Void;
46using android::CommandInfo;
47using android::RequestInfo;
48using android::requestToString;
49using android::sp;
50
Sanket Padawe378ccdd2017-01-24 14:11:12 -080051#define BOOL_TO_INT(x) (x ? 1 : 0)
52#define ATOI_NULL_HANDLED(x) (x ? atoi(x) : -1)
53#define ATOI_NULL_HANDLED_DEF(x, defaultVal) (x ? atoi(x) : defaultVal)
54
55RIL_RadioFunctions *s_vendorFunctions = NULL;
Amit Mahajancd77a5b2016-08-25 11:19:21 -070056static CommandInfo *s_commands;
57
58struct RadioImpl;
Amit Mahajan439da362017-02-13 17:43:04 -080059struct OemHookImpl;
Amit Mahajancd77a5b2016-08-25 11:19:21 -070060
61#if (SIM_COUNT >= 2)
62sp<RadioImpl> radioService[SIM_COUNT];
Amit Mahajan439da362017-02-13 17:43:04 -080063sp<OemHookImpl> oemHookService[SIM_COUNT];
64// counter used for synchronization. It is incremented every time response callbacks are updated.
Amit Mahajand423d192017-03-16 17:04:01 -070065volatile int32_t mCounterRadio[SIM_COUNT];
66volatile int32_t mCounterOemHook[SIM_COUNT];
Amit Mahajancd77a5b2016-08-25 11:19:21 -070067#else
68sp<RadioImpl> radioService[1];
Amit Mahajan439da362017-02-13 17:43:04 -080069sp<OemHookImpl> oemHookService[1];
70// counter used for synchronization. It is incremented every time response callbacks are updated.
Amit Mahajand423d192017-03-16 17:04:01 -070071volatile int32_t mCounterRadio[1];
72volatile int32_t mCounterOemHook[1];
Amit Mahajancd77a5b2016-08-25 11:19:21 -070073#endif
74
Amit Mahajan932e08e2017-01-24 05:45:02 -080075static pthread_rwlock_t radioServiceRwlock = PTHREAD_RWLOCK_INITIALIZER;
76
77#if (SIM_COUNT >= 2)
78static pthread_rwlock_t radioServiceRwlock2 = PTHREAD_RWLOCK_INITIALIZER;
79#if (SIM_COUNT >= 3)
80static pthread_rwlock_t radioServiceRwlock3 = PTHREAD_RWLOCK_INITIALIZER;
81#if (SIM_COUNT >= 4)
82static pthread_rwlock_t radioServiceRwlock4 = PTHREAD_RWLOCK_INITIALIZER;
83#endif
84#endif
85#endif
86
Amit Mahajan3df62912017-02-10 01:35:55 +000087void convertRilHardwareConfigListToHal(void *response, size_t responseLen,
88 hidl_vec<HardwareConfig>& records);
89
90void convertRilRadioCapabilityToHal(void *response, size_t responseLen, RadioCapability& rc);
91
92void convertRilLceDataInfoToHal(void *response, size_t responseLen, LceDataInfo& lce);
93
94void convertRilSignalStrengthToHal(void *response, size_t responseLen,
95 SignalStrength& signalStrength);
96
97void convertRilDataCallToHal(RIL_Data_Call_Response_v11 *dcResponse,
98 SetupDataCallResult& dcResult);
99
100void convertRilDataCallListToHal(void *response, size_t responseLen,
101 hidl_vec<SetupDataCallResult>& dcResultList);
102
103void convertRilCellInfoListToHal(void *response, size_t responseLen, hidl_vec<CellInfo>& records);
104
pkanwarc61837e2017-03-17 12:49:34 -0700105struct RadioImpl : public ::android::hardware::radio::V1_1::IRadio {
Sanket Padawef220dc52017-01-02 23:46:00 -0800106 int32_t mSlotId;
107 sp<IRadioResponse> mRadioResponse;
108 sp<IRadioIndication> mRadioIndication;
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700109
110 Return<void> setResponseFunctions(
111 const ::android::sp<IRadioResponse>& radioResponse,
112 const ::android::sp<IRadioIndication>& radioIndication);
113
114 Return<void> getIccCardStatus(int32_t serial);
115
Sanket Padawef220dc52017-01-02 23:46:00 -0800116 Return<void> supplyIccPinForApp(int32_t serial, const hidl_string& pin,
117 const hidl_string& aid);
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700118
Sanket Padawef220dc52017-01-02 23:46:00 -0800119 Return<void> supplyIccPukForApp(int32_t serial, const hidl_string& puk,
120 const hidl_string& pin, const hidl_string& aid);
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700121
122 Return<void> supplyIccPin2ForApp(int32_t serial,
Sanket Padawef220dc52017-01-02 23:46:00 -0800123 const hidl_string& pin2,
124 const hidl_string& aid);
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700125
Sanket Padawef220dc52017-01-02 23:46:00 -0800126 Return<void> supplyIccPuk2ForApp(int32_t serial, const hidl_string& puk2,
127 const hidl_string& pin2, const hidl_string& aid);
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700128
Sanket Padawef220dc52017-01-02 23:46:00 -0800129 Return<void> changeIccPinForApp(int32_t serial, const hidl_string& oldPin,
130 const hidl_string& newPin, const hidl_string& aid);
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700131
Sanket Padawef220dc52017-01-02 23:46:00 -0800132 Return<void> changeIccPin2ForApp(int32_t serial, const hidl_string& oldPin2,
133 const hidl_string& newPin2, const hidl_string& aid);
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700134
Sanket Padawef220dc52017-01-02 23:46:00 -0800135 Return<void> supplyNetworkDepersonalization(int32_t serial, const hidl_string& netPin);
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700136
137 Return<void> getCurrentCalls(int32_t serial);
138
Sanket Padawef220dc52017-01-02 23:46:00 -0800139 Return<void> dial(int32_t serial, const Dial& dialInfo);
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700140
141 Return<void> getImsiForApp(int32_t serial,
142 const ::android::hardware::hidl_string& aid);
143
144 Return<void> hangup(int32_t serial, int32_t gsmIndex);
145
146 Return<void> hangupWaitingOrBackground(int32_t serial);
147
148 Return<void> hangupForegroundResumeBackground(int32_t serial);
149
150 Return<void> switchWaitingOrHoldingAndActive(int32_t serial);
151
152 Return<void> conference(int32_t serial);
153
154 Return<void> rejectCall(int32_t serial);
155
156 Return<void> getLastCallFailCause(int32_t serial);
157
158 Return<void> getSignalStrength(int32_t serial);
159
160 Return<void> getVoiceRegistrationState(int32_t serial);
161
162 Return<void> getDataRegistrationState(int32_t serial);
163
164 Return<void> getOperator(int32_t serial);
165
166 Return<void> setRadioPower(int32_t serial, bool on);
167
168 Return<void> sendDtmf(int32_t serial,
169 const ::android::hardware::hidl_string& s);
170
171 Return<void> sendSms(int32_t serial, const GsmSmsMessage& message);
172
173 Return<void> sendSMSExpectMore(int32_t serial, const GsmSmsMessage& message);
174
175 Return<void> setupDataCall(int32_t serial,
Jack Yu06181bb2017-01-10 12:10:41 -0800176 RadioTechnology radioTechnology,
177 const DataProfileInfo& profileInfo,
178 bool modemCognitive,
Jack Yuffc06452017-02-13 11:21:00 -0800179 bool roamingAllowed,
180 bool isRoaming);
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700181
182 Return<void> iccIOForApp(int32_t serial,
183 const IccIo& iccIo);
184
185 Return<void> sendUssd(int32_t serial,
186 const ::android::hardware::hidl_string& ussd);
187
188 Return<void> cancelPendingUssd(int32_t serial);
189
190 Return<void> getClir(int32_t serial);
191
192 Return<void> setClir(int32_t serial, int32_t status);
193
194 Return<void> getCallForwardStatus(int32_t serial,
195 const CallForwardInfo& callInfo);
196
197 Return<void> setCallForward(int32_t serial,
198 const CallForwardInfo& callInfo);
199
200 Return<void> getCallWaiting(int32_t serial, int32_t serviceClass);
201
202 Return<void> setCallWaiting(int32_t serial, bool enable, int32_t serviceClass);
203
204 Return<void> acknowledgeLastIncomingGsmSms(int32_t serial,
205 bool success, SmsAcknowledgeFailCause cause);
206
207 Return<void> acceptCall(int32_t serial);
208
209 Return<void> deactivateDataCall(int32_t serial,
210 int32_t cid, bool reasonRadioShutDown);
211
212 Return<void> getFacilityLockForApp(int32_t serial,
213 const ::android::hardware::hidl_string& facility,
214 const ::android::hardware::hidl_string& password,
215 int32_t serviceClass,
216 const ::android::hardware::hidl_string& appId);
217
218 Return<void> setFacilityLockForApp(int32_t serial,
219 const ::android::hardware::hidl_string& facility,
220 bool lockState,
221 const ::android::hardware::hidl_string& password,
222 int32_t serviceClass,
223 const ::android::hardware::hidl_string& appId);
224
225 Return<void> setBarringPassword(int32_t serial,
226 const ::android::hardware::hidl_string& facility,
227 const ::android::hardware::hidl_string& oldPassword,
228 const ::android::hardware::hidl_string& newPassword);
229
230 Return<void> getNetworkSelectionMode(int32_t serial);
231
232 Return<void> setNetworkSelectionModeAutomatic(int32_t serial);
233
234 Return<void> setNetworkSelectionModeManual(int32_t serial,
235 const ::android::hardware::hidl_string& operatorNumeric);
236
237 Return<void> getAvailableNetworks(int32_t serial);
238
yinxu584379e2017-05-03 15:15:19 -0700239 Return<void> startNetworkScan(int32_t serial, const NetworkScanRequest& request);
240
241 Return<void> stopNetworkScan(int32_t serial);
242
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700243 Return<void> startDtmf(int32_t serial,
244 const ::android::hardware::hidl_string& s);
245
246 Return<void> stopDtmf(int32_t serial);
247
248 Return<void> getBasebandVersion(int32_t serial);
249
250 Return<void> separateConnection(int32_t serial, int32_t gsmIndex);
251
252 Return<void> setMute(int32_t serial, bool enable);
253
254 Return<void> getMute(int32_t serial);
255
256 Return<void> getClip(int32_t serial);
257
258 Return<void> getDataCallList(int32_t serial);
259
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700260 Return<void> setSuppServiceNotifications(int32_t serial, bool enable);
261
262 Return<void> writeSmsToSim(int32_t serial,
263 const SmsWriteArgs& smsWriteArgs);
264
265 Return<void> deleteSmsOnSim(int32_t serial, int32_t index);
266
267 Return<void> setBandMode(int32_t serial, RadioBandMode mode);
268
269 Return<void> getAvailableBandModes(int32_t serial);
270
271 Return<void> sendEnvelope(int32_t serial,
272 const ::android::hardware::hidl_string& command);
273
274 Return<void> sendTerminalResponseToSim(int32_t serial,
275 const ::android::hardware::hidl_string& commandResponse);
276
277 Return<void> handleStkCallSetupRequestFromSim(int32_t serial, bool accept);
278
279 Return<void> explicitCallTransfer(int32_t serial);
280
281 Return<void> setPreferredNetworkType(int32_t serial, PreferredNetworkType nwType);
282
283 Return<void> getPreferredNetworkType(int32_t serial);
284
285 Return<void> getNeighboringCids(int32_t serial);
286
287 Return<void> setLocationUpdates(int32_t serial, bool enable);
288
289 Return<void> setCdmaSubscriptionSource(int32_t serial,
290 CdmaSubscriptionSource cdmaSub);
291
292 Return<void> setCdmaRoamingPreference(int32_t serial, CdmaRoamingType type);
293
294 Return<void> getCdmaRoamingPreference(int32_t serial);
295
296 Return<void> setTTYMode(int32_t serial, TtyMode mode);
297
298 Return<void> getTTYMode(int32_t serial);
299
300 Return<void> setPreferredVoicePrivacy(int32_t serial, bool enable);
301
302 Return<void> getPreferredVoicePrivacy(int32_t serial);
303
304 Return<void> sendCDMAFeatureCode(int32_t serial,
305 const ::android::hardware::hidl_string& featureCode);
306
307 Return<void> sendBurstDtmf(int32_t serial,
308 const ::android::hardware::hidl_string& dtmf,
309 int32_t on,
310 int32_t off);
311
312 Return<void> sendCdmaSms(int32_t serial, const CdmaSmsMessage& sms);
313
314 Return<void> acknowledgeLastIncomingCdmaSms(int32_t serial,
315 const CdmaSmsAck& smsAck);
316
317 Return<void> getGsmBroadcastConfig(int32_t serial);
318
319 Return<void> setGsmBroadcastConfig(int32_t serial,
320 const hidl_vec<GsmBroadcastSmsConfigInfo>& configInfo);
321
322 Return<void> setGsmBroadcastActivation(int32_t serial, bool activate);
323
324 Return<void> getCdmaBroadcastConfig(int32_t serial);
325
326 Return<void> setCdmaBroadcastConfig(int32_t serial,
327 const hidl_vec<CdmaBroadcastSmsConfigInfo>& configInfo);
328
329 Return<void> setCdmaBroadcastActivation(int32_t serial, bool activate);
330
331 Return<void> getCDMASubscription(int32_t serial);
332
333 Return<void> writeSmsToRuim(int32_t serial, const CdmaSmsWriteArgs& cdmaSms);
334
335 Return<void> deleteSmsOnRuim(int32_t serial, int32_t index);
336
337 Return<void> getDeviceIdentity(int32_t serial);
338
339 Return<void> exitEmergencyCallbackMode(int32_t serial);
340
341 Return<void> getSmscAddress(int32_t serial);
342
343 Return<void> setSmscAddress(int32_t serial,
344 const ::android::hardware::hidl_string& smsc);
345
346 Return<void> reportSmsMemoryStatus(int32_t serial, bool available);
347
348 Return<void> reportStkServiceIsRunning(int32_t serial);
349
350 Return<void> getCdmaSubscriptionSource(int32_t serial);
351
352 Return<void> requestIsimAuthentication(int32_t serial,
353 const ::android::hardware::hidl_string& challenge);
354
355 Return<void> acknowledgeIncomingGsmSmsWithPdu(int32_t serial,
356 bool success,
357 const ::android::hardware::hidl_string& ackPdu);
358
359 Return<void> sendEnvelopeWithStatus(int32_t serial,
360 const ::android::hardware::hidl_string& contents);
361
362 Return<void> getVoiceRadioTechnology(int32_t serial);
363
364 Return<void> getCellInfoList(int32_t serial);
365
366 Return<void> setCellInfoListRate(int32_t serial, int32_t rate);
367
Jack Yu06181bb2017-01-10 12:10:41 -0800368 Return<void> setInitialAttachApn(int32_t serial, const DataProfileInfo& dataProfileInfo,
Jack Yuffc06452017-02-13 11:21:00 -0800369 bool modemCognitive, bool isRoaming);
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700370
371 Return<void> getImsRegistrationState(int32_t serial);
372
373 Return<void> sendImsSms(int32_t serial, const ImsSmsMessage& message);
374
375 Return<void> iccTransmitApduBasicChannel(int32_t serial, const SimApdu& message);
376
377 Return<void> iccOpenLogicalChannel(int32_t serial,
Wileen Chiu410b7562015-11-23 14:25:22 -0800378 const ::android::hardware::hidl_string& aid, int32_t p2);
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700379
380 Return<void> iccCloseLogicalChannel(int32_t serial, int32_t channelId);
381
382 Return<void> iccTransmitApduLogicalChannel(int32_t serial, const SimApdu& message);
383
384 Return<void> nvReadItem(int32_t serial, NvItem itemId);
385
386 Return<void> nvWriteItem(int32_t serial, const NvWriteItem& item);
387
388 Return<void> nvWriteCdmaPrl(int32_t serial,
389 const ::android::hardware::hidl_vec<uint8_t>& prl);
390
391 Return<void> nvResetConfig(int32_t serial, ResetNvType resetType);
392
393 Return<void> setUiccSubscription(int32_t serial, const SelectUiccSub& uiccSub);
394
395 Return<void> setDataAllowed(int32_t serial, bool allow);
396
397 Return<void> getHardwareConfig(int32_t serial);
398
399 Return<void> requestIccSimAuthentication(int32_t serial,
400 int32_t authContext,
401 const ::android::hardware::hidl_string& authData,
402 const ::android::hardware::hidl_string& aid);
403
404 Return<void> setDataProfile(int32_t serial,
Jack Yuffc06452017-02-13 11:21:00 -0800405 const ::android::hardware::hidl_vec<DataProfileInfo>& profiles, bool isRoaming);
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700406
407 Return<void> requestShutdown(int32_t serial);
408
409 Return<void> getRadioCapability(int32_t serial);
410
411 Return<void> setRadioCapability(int32_t serial, const RadioCapability& rc);
412
413 Return<void> startLceService(int32_t serial, int32_t reportInterval, bool pullMode);
414
415 Return<void> stopLceService(int32_t serial);
416
417 Return<void> pullLceData(int32_t serial);
418
419 Return<void> getModemActivityInfo(int32_t serial);
420
421 Return<void> setAllowedCarriers(int32_t serial,
422 bool allAllowed,
423 const CarrierRestrictions& carriers);
424
425 Return<void> getAllowedCarriers(int32_t serial);
426
Jack Yu06181bb2017-01-10 12:10:41 -0800427 Return<void> sendDeviceState(int32_t serial, DeviceStateType deviceStateType, bool state);
428
429 Return<void> setIndicationFilter(int32_t serial, int32_t indicationFilter);
430
Nathan Harold6942b212017-05-25 16:10:35 -0700431 Return<void> startKeepalive(int32_t serial, const KeepaliveRequest& keepalive);
432
433 Return<void> stopKeepalive(int32_t serial, int32_t sessionHandle);
434
Wileen Chiu718c0bf2017-01-04 11:37:19 -0800435 Return<void> setSimCardPower(int32_t serial, bool powerUp);
Grace Chen797c1c22017-03-23 18:39:48 -0700436 Return<void> setSimCardPower_1_1(int32_t serial,
437 const ::android::hardware::radio::V1_1::CardPowerState state);
Wileen Chiu718c0bf2017-01-04 11:37:19 -0800438
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700439 Return<void> responseAcknowledgement();
Amit Mahajan17249842017-01-19 15:05:45 -0800440
pkanwarc61837e2017-03-17 12:49:34 -0700441 Return<void> setCarrierInfoForImsiEncryption(int32_t serial,
pkanwarb10761e2017-05-21 10:24:30 -0700442 const ::android::hardware::radio::V1_1::ImsiEncryptionInfo& message);
pkanwarc61837e2017-03-17 12:49:34 -0700443
Amit Mahajan17249842017-01-19 15:05:45 -0800444 void checkReturnStatus(Return<void>& ret);
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700445};
446
Amit Mahajan439da362017-02-13 17:43:04 -0800447struct OemHookImpl : public IOemHook {
448 int32_t mSlotId;
449 sp<IOemHookResponse> mOemHookResponse;
450 sp<IOemHookIndication> mOemHookIndication;
451
452 Return<void> setResponseFunctions(
453 const ::android::sp<IOemHookResponse>& oemHookResponse,
454 const ::android::sp<IOemHookIndication>& oemHookIndication);
455
456 Return<void> sendRequestRaw(int32_t serial,
457 const ::android::hardware::hidl_vec<uint8_t>& data);
458
459 Return<void> sendRequestStrings(int32_t serial,
460 const ::android::hardware::hidl_vec<::android::hardware::hidl_string>& data);
461};
462
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800463void memsetAndFreeStrings(int numPointers, ...) {
464 va_list ap;
465 va_start(ap, numPointers);
466 for (int i = 0; i < numPointers; i++) {
467 char *ptr = va_arg(ap, char *);
468 if (ptr) {
469#ifdef MEMSET_FREED
Jack Yub4295a42017-04-14 12:51:49 -0700470#define MAX_STRING_LENGTH 4096
471 memset(ptr, 0, strnlen(ptr, MAX_STRING_LENGTH));
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800472#endif
473 free(ptr);
474 }
475 }
476 va_end(ap);
477}
478
Jack Yuffc06452017-02-13 11:21:00 -0800479void sendErrorResponse(RequestInfo *pRI, RIL_Errno err) {
Amit Mahajan759786a2017-03-03 17:35:47 -0800480 pRI->pCI->responseFunction((int) pRI->socket_id,
Jack Yuffc06452017-02-13 11:21:00 -0800481 (int) RadioResponseType::SOLICITED, pRI->token, err, NULL, 0);
482}
483
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800484/**
Jack Yuf68e0da2017-02-07 14:53:09 -0800485 * Copies over src to dest. If memory allocation fails, responseFunction() is called for the
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800486 * request with error RIL_E_NO_MEMORY.
487 * Returns true on success, and false on failure.
488 */
Jack Yuf68e0da2017-02-07 14:53:09 -0800489bool copyHidlStringToRil(char **dest, const hidl_string &src, RequestInfo *pRI) {
490 size_t len = src.size();
491 if (len == 0) {
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800492 *dest = NULL;
493 return true;
494 }
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800495 *dest = (char *) calloc(len + 1, sizeof(char));
496 if (*dest == NULL) {
497 RLOGE("Memory allocation failed for request %s", requestToString(pRI->pCI->requestNumber));
Jack Yuffc06452017-02-13 11:21:00 -0800498 sendErrorResponse(pRI, RIL_E_NO_MEMORY);
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800499 return false;
500 }
Scott Randolphc7213312017-04-03 14:06:40 -0700501 strncpy(*dest, src.c_str(), len + 1);
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800502 return true;
503}
504
505hidl_string convertCharPtrToHidlString(const char *ptr) {
506 hidl_string ret;
507 if (ptr != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -0800508 // TODO: replace this with strnlen
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800509 ret.setToExternal(ptr, strlen(ptr));
510 }
511 return ret;
512}
513
514bool dispatchVoid(int serial, int slotId, int request) {
515 RequestInfo *pRI = android::addRequestToList(serial, slotId, request);
516 if (pRI == NULL) {
517 return false;
518 }
519 s_vendorFunctions->onRequest(request, NULL, 0, pRI);
520 return true;
521}
522
523bool dispatchString(int serial, int slotId, int request, const char * str) {
524 RequestInfo *pRI = android::addRequestToList(serial, slotId, request);
525 if (pRI == NULL) {
526 return false;
527 }
528
529 char *pString;
530 if (!copyHidlStringToRil(&pString, str, pRI)) {
531 return false;
532 }
533
534 s_vendorFunctions->onRequest(request, pString, sizeof(char *), pRI);
535
536 memsetAndFreeStrings(1, pString);
537 return true;
538}
539
540bool dispatchStrings(int serial, int slotId, int request, int countStrings, ...) {
541 RequestInfo *pRI = android::addRequestToList(serial, slotId, request);
542 if (pRI == NULL) {
543 return false;
544 }
545
Sanket Padawef220dc52017-01-02 23:46:00 -0800546 char **pStrings;
Sanket Padawef220dc52017-01-02 23:46:00 -0800547 pStrings = (char **)calloc(countStrings, sizeof(char *));
548 if (pStrings == NULL) {
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800549 RLOGE("Memory allocation failed for request %s", requestToString(request));
Jack Yuffc06452017-02-13 11:21:00 -0800550 sendErrorResponse(pRI, RIL_E_NO_MEMORY);
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800551 return false;
Sanket Padawef220dc52017-01-02 23:46:00 -0800552 }
553 va_list ap;
554 va_start(ap, countStrings);
555 for (int i = 0; i < countStrings; i++) {
556 const char* str = va_arg(ap, const char *);
Jack Yuc13645e2017-04-13 20:55:03 -0700557 if (!copyHidlStringToRil(&pStrings[i], hidl_string(str), pRI)) {
Sanket Padawef220dc52017-01-02 23:46:00 -0800558 va_end(ap);
Sanket Padawef220dc52017-01-02 23:46:00 -0800559 for (int j = 0; j < i; j++) {
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800560 memsetAndFreeStrings(1, pStrings[j]);
Sanket Padawef220dc52017-01-02 23:46:00 -0800561 }
562 free(pStrings);
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800563 return false;
Sanket Padawef220dc52017-01-02 23:46:00 -0800564 }
Sanket Padawef220dc52017-01-02 23:46:00 -0800565 }
566 va_end(ap);
567
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800568 s_vendorFunctions->onRequest(request, pStrings, countStrings * sizeof(char *), pRI);
Sanket Padawef220dc52017-01-02 23:46:00 -0800569
570 if (pStrings != NULL) {
571 for (int i = 0 ; i < countStrings ; i++) {
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800572 memsetAndFreeStrings(1, pStrings[i]);
Sanket Padawef220dc52017-01-02 23:46:00 -0800573 }
574
575#ifdef MEMSET_FREED
576 memset(pStrings, 0, countStrings * sizeof(char *));
577#endif
578 free(pStrings);
579 }
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800580 return true;
581}
582
583bool dispatchStrings(int serial, int slotId, int request, const hidl_vec<hidl_string>& data) {
584 RequestInfo *pRI = android::addRequestToList(serial, slotId, request);
585 if (pRI == NULL) {
586 return false;
587 }
588
589 int countStrings = data.size();
590 char **pStrings;
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800591 pStrings = (char **)calloc(countStrings, sizeof(char *));
592 if (pStrings == NULL) {
593 RLOGE("Memory allocation failed for request %s", requestToString(request));
Jack Yuffc06452017-02-13 11:21:00 -0800594 sendErrorResponse(pRI, RIL_E_NO_MEMORY);
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800595 return false;
596 }
597
598 for (int i = 0; i < countStrings; i++) {
Jack Yuf68e0da2017-02-07 14:53:09 -0800599 if (!copyHidlStringToRil(&pStrings[i], data[i], pRI)) {
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800600 for (int j = 0; j < i; j++) {
601 memsetAndFreeStrings(1, pStrings[j]);
602 }
603 free(pStrings);
604 return false;
605 }
606 }
607
608 s_vendorFunctions->onRequest(request, pStrings, countStrings * sizeof(char *), pRI);
609
610 if (pStrings != NULL) {
611 for (int i = 0 ; i < countStrings ; i++) {
612 memsetAndFreeStrings(1, pStrings[i]);
613 }
614
615#ifdef MEMSET_FREED
616 memset(pStrings, 0, countStrings * sizeof(char *));
617#endif
618 free(pStrings);
619 }
620 return true;
621}
622
623bool dispatchInts(int serial, int slotId, int request, int countInts, ...) {
624 RequestInfo *pRI = android::addRequestToList(serial, slotId, request);
625 if (pRI == NULL) {
626 return false;
627 }
628
Jack Yuffc06452017-02-13 11:21:00 -0800629 int *pInts = (int *)calloc(countInts, sizeof(int));
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800630
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800631 if (pInts == NULL) {
632 RLOGE("Memory allocation failed for request %s", requestToString(request));
Jack Yuffc06452017-02-13 11:21:00 -0800633 sendErrorResponse(pRI, RIL_E_NO_MEMORY);
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800634 return false;
635 }
636 va_list ap;
637 va_start(ap, countInts);
638 for (int i = 0; i < countInts; i++) {
639 pInts[i] = va_arg(ap, int);
640 }
641 va_end(ap);
642
643 s_vendorFunctions->onRequest(request, pInts, countInts * sizeof(int), pRI);
644
645 if (pInts != NULL) {
646#ifdef MEMSET_FREED
647 memset(pInts, 0, countInts * sizeof(int));
648#endif
649 free(pInts);
650 }
651 return true;
652}
653
654bool dispatchCallForwardStatus(int serial, int slotId, int request,
655 const CallForwardInfo& callInfo) {
656 RequestInfo *pRI = android::addRequestToList(serial, slotId, request);
657 if (pRI == NULL) {
658 return false;
659 }
660
661 RIL_CallForwardInfo cf;
662 cf.status = (int) callInfo.status;
663 cf.reason = callInfo.reason;
664 cf.serviceClass = callInfo.serviceClass;
665 cf.toa = callInfo.toa;
666 cf.timeSeconds = callInfo.timeSeconds;
667
668 if (!copyHidlStringToRil(&cf.number, callInfo.number, pRI)) {
669 return false;
670 }
671
672 s_vendorFunctions->onRequest(request, &cf, sizeof(cf), pRI);
673
674 memsetAndFreeStrings(1, cf.number);
675
676 return true;
677}
678
679bool dispatchRaw(int serial, int slotId, int request, const hidl_vec<uint8_t>& rawBytes) {
680 RequestInfo *pRI = android::addRequestToList(serial, slotId, request);
681 if (pRI == NULL) {
682 return false;
683 }
684
685 const uint8_t *uData = rawBytes.data();
686
687 s_vendorFunctions->onRequest(request, (void *) uData, rawBytes.size(), pRI);
688
689 return true;
690}
691
692bool dispatchIccApdu(int serial, int slotId, int request, const SimApdu& message) {
693 RequestInfo *pRI = android::addRequestToList(serial, slotId, request);
694 if (pRI == NULL) {
695 return false;
696 }
697
Jack Yu8e732d42017-04-14 00:08:06 -0700698 RIL_SIM_APDU apdu = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800699
700 apdu.sessionid = message.sessionId;
701 apdu.cla = message.cla;
702 apdu.instruction = message.instruction;
703 apdu.p1 = message.p1;
704 apdu.p2 = message.p2;
705 apdu.p3 = message.p3;
706
707 if (!copyHidlStringToRil(&apdu.data, message.data, pRI)) {
708 return false;
709 }
710
711 s_vendorFunctions->onRequest(request, &apdu, sizeof(apdu), pRI);
712
713 memsetAndFreeStrings(1, apdu.data);
714
715 return true;
Sanket Padawef220dc52017-01-02 23:46:00 -0800716}
717
Amit Mahajand423d192017-03-16 17:04:01 -0700718void checkReturnStatus(int32_t slotId, Return<void>& ret, bool isRadioService) {
Amit Mahajan17249842017-01-19 15:05:45 -0800719 if (ret.isOk() == false) {
Amit Mahajan439da362017-02-13 17:43:04 -0800720 RLOGE("checkReturnStatus: unable to call response/indication callback");
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800721 // Remote process hosting the callbacks must be dead. Reset the callback objects;
Amit Mahajan17249842017-01-19 15:05:45 -0800722 // there's no other recovery to be done here. When the client process is back up, it will
723 // call setResponseFunctions()
Amit Mahajan932e08e2017-01-24 05:45:02 -0800724
725 // Caller should already hold rdlock, release that first
726 // note the current counter to avoid overwriting updates made by another thread before
727 // write lock is acquired.
Amit Mahajand423d192017-03-16 17:04:01 -0700728 int counter = isRadioService ? mCounterRadio[slotId] : mCounterOemHook[slotId];
Amit Mahajan439da362017-02-13 17:43:04 -0800729 pthread_rwlock_t *radioServiceRwlockPtr = radio::getRadioServiceRwlock(slotId);
Amit Mahajan932e08e2017-01-24 05:45:02 -0800730 int ret = pthread_rwlock_unlock(radioServiceRwlockPtr);
731 assert(ret == 0);
732
733 // acquire wrlock
734 ret = pthread_rwlock_wrlock(radioServiceRwlockPtr);
735 assert(ret == 0);
736
737 // make sure the counter value has not changed
Amit Mahajand423d192017-03-16 17:04:01 -0700738 if (counter == (isRadioService ? mCounterRadio[slotId] : mCounterOemHook[slotId])) {
739 if (isRadioService) {
740 radioService[slotId]->mRadioResponse = NULL;
741 radioService[slotId]->mRadioIndication = NULL;
742 } else {
743 oemHookService[slotId]->mOemHookResponse = NULL;
744 oemHookService[slotId]->mOemHookIndication = NULL;
745 }
746 isRadioService ? mCounterRadio[slotId]++ : mCounterOemHook[slotId]++;
Amit Mahajan932e08e2017-01-24 05:45:02 -0800747 } else {
Amit Mahajan439da362017-02-13 17:43:04 -0800748 RLOGE("checkReturnStatus: not resetting responseFunctions as they likely "
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800749 "got updated on another thread");
Amit Mahajan932e08e2017-01-24 05:45:02 -0800750 }
751
752 // release wrlock
753 ret = pthread_rwlock_unlock(radioServiceRwlockPtr);
754 assert(ret == 0);
755
756 // Reacquire rdlock
757 ret = pthread_rwlock_rdlock(radioServiceRwlockPtr);
758 assert(ret == 0);
Amit Mahajan17249842017-01-19 15:05:45 -0800759 }
760}
761
Amit Mahajan439da362017-02-13 17:43:04 -0800762void RadioImpl::checkReturnStatus(Return<void>& ret) {
Amit Mahajand423d192017-03-16 17:04:01 -0700763 ::checkReturnStatus(mSlotId, ret, true);
Amit Mahajan439da362017-02-13 17:43:04 -0800764}
765
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700766Return<void> RadioImpl::setResponseFunctions(
767 const ::android::sp<IRadioResponse>& radioResponseParam,
768 const ::android::sp<IRadioIndication>& radioIndicationParam) {
Amit Mahajan111ddca2017-03-03 12:05:13 -0800769 RLOGD("setResponseFunctions");
Amit Mahajan932e08e2017-01-24 05:45:02 -0800770
771 pthread_rwlock_t *radioServiceRwlockPtr = radio::getRadioServiceRwlock(mSlotId);
772 int ret = pthread_rwlock_wrlock(radioServiceRwlockPtr);
773 assert(ret == 0);
774
Sanket Padawef220dc52017-01-02 23:46:00 -0800775 mRadioResponse = radioResponseParam;
776 mRadioIndication = radioIndicationParam;
Amit Mahajand423d192017-03-16 17:04:01 -0700777 mCounterRadio[mSlotId]++;
Amit Mahajan932e08e2017-01-24 05:45:02 -0800778
779 ret = pthread_rwlock_unlock(radioServiceRwlockPtr);
780 assert(ret == 0);
781
Amit Mahajan60482fd2017-03-14 16:39:27 -0700782 // client is connected. Send initial indications.
783 android::onNewCommandConnect((RIL_SOCKET_ID) mSlotId);
784
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800785 return Void();
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700786}
787
788Return<void> RadioImpl::getIccCardStatus(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -0700789#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -0800790 RLOGD("getIccCardStatus: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -0700791#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800792 dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_SIM_STATUS);
793 return Void();
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700794}
795
Sanket Padawef220dc52017-01-02 23:46:00 -0800796Return<void> RadioImpl::supplyIccPinForApp(int32_t serial, const hidl_string& pin,
797 const hidl_string& aid) {
Jayachandran C572f2f42017-03-25 14:30:13 -0700798#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -0800799 RLOGD("supplyIccPinForApp: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -0700800#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800801 dispatchStrings(serial, mSlotId, RIL_REQUEST_ENTER_SIM_PIN,
Scott Randolphc7213312017-04-03 14:06:40 -0700802 2, pin.c_str(), aid.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800803 return Void();
Sanket Padawef220dc52017-01-02 23:46:00 -0800804}
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700805
Sanket Padawef220dc52017-01-02 23:46:00 -0800806Return<void> RadioImpl::supplyIccPukForApp(int32_t serial, const hidl_string& puk,
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800807 const hidl_string& pin, const hidl_string& aid) {
Jayachandran C572f2f42017-03-25 14:30:13 -0700808#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -0800809 RLOGD("supplyIccPukForApp: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -0700810#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800811 dispatchStrings(serial, mSlotId, RIL_REQUEST_ENTER_SIM_PUK,
Scott Randolphc7213312017-04-03 14:06:40 -0700812 3, puk.c_str(), pin.c_str(), aid.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800813 return Void();
Sanket Padawef220dc52017-01-02 23:46:00 -0800814}
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700815
Sanket Padawef220dc52017-01-02 23:46:00 -0800816Return<void> RadioImpl::supplyIccPin2ForApp(int32_t serial, const hidl_string& pin2,
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800817 const hidl_string& aid) {
Jayachandran C572f2f42017-03-25 14:30:13 -0700818#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -0800819 RLOGD("supplyIccPin2ForApp: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -0700820#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800821 dispatchStrings(serial, mSlotId, RIL_REQUEST_ENTER_SIM_PIN2,
Scott Randolphc7213312017-04-03 14:06:40 -0700822 2, pin2.c_str(), aid.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800823 return Void();
Sanket Padawef220dc52017-01-02 23:46:00 -0800824}
825
826Return<void> RadioImpl::supplyIccPuk2ForApp(int32_t serial, const hidl_string& puk2,
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800827 const hidl_string& pin2, const hidl_string& aid) {
Jayachandran C572f2f42017-03-25 14:30:13 -0700828#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -0800829 RLOGD("supplyIccPuk2ForApp: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -0700830#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800831 dispatchStrings(serial, mSlotId, RIL_REQUEST_ENTER_SIM_PUK2,
Scott Randolphc7213312017-04-03 14:06:40 -0700832 3, puk2.c_str(), pin2.c_str(), aid.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800833 return Void();
Sanket Padawef220dc52017-01-02 23:46:00 -0800834}
835
836Return<void> RadioImpl::changeIccPinForApp(int32_t serial, const hidl_string& oldPin,
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800837 const hidl_string& newPin, const hidl_string& aid) {
Jayachandran C572f2f42017-03-25 14:30:13 -0700838#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -0800839 RLOGD("changeIccPinForApp: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -0700840#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800841 dispatchStrings(serial, mSlotId, RIL_REQUEST_CHANGE_SIM_PIN,
Scott Randolphc7213312017-04-03 14:06:40 -0700842 3, oldPin.c_str(), newPin.c_str(), aid.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800843 return Void();
Sanket Padawef220dc52017-01-02 23:46:00 -0800844}
845
846Return<void> RadioImpl::changeIccPin2ForApp(int32_t serial, const hidl_string& oldPin2,
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800847 const hidl_string& newPin2, const hidl_string& aid) {
Jayachandran C572f2f42017-03-25 14:30:13 -0700848#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -0800849 RLOGD("changeIccPin2ForApp: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -0700850#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800851 dispatchStrings(serial, mSlotId, RIL_REQUEST_CHANGE_SIM_PIN2,
Scott Randolphc7213312017-04-03 14:06:40 -0700852 3, oldPin2.c_str(), newPin2.c_str(), aid.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800853 return Void();
Sanket Padawef220dc52017-01-02 23:46:00 -0800854}
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700855
856Return<void> RadioImpl::supplyNetworkDepersonalization(int32_t serial,
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800857 const hidl_string& netPin) {
Jayachandran C572f2f42017-03-25 14:30:13 -0700858#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -0800859 RLOGD("supplyNetworkDepersonalization: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -0700860#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800861 dispatchStrings(serial, mSlotId, RIL_REQUEST_ENTER_NETWORK_DEPERSONALIZATION,
Scott Randolphc7213312017-04-03 14:06:40 -0700862 1, netPin.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800863 return Void();
Sanket Padawef220dc52017-01-02 23:46:00 -0800864}
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700865
Sanket Padawef220dc52017-01-02 23:46:00 -0800866Return<void> RadioImpl::getCurrentCalls(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -0700867#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -0800868 RLOGD("getCurrentCalls: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -0700869#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800870 dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_CURRENT_CALLS);
871 return Void();
Sanket Padawef220dc52017-01-02 23:46:00 -0800872}
873
874Return<void> RadioImpl::dial(int32_t serial, const Dial& dialInfo) {
Jayachandran C572f2f42017-03-25 14:30:13 -0700875#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -0800876 RLOGD("dial: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -0700877#endif
Sanket Padawef220dc52017-01-02 23:46:00 -0800878 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_DIAL);
879 if (pRI == NULL) {
880 return Void();
881 }
Jack Yuf68e0da2017-02-07 14:53:09 -0800882 RIL_Dial dial = {};
883 RIL_UUS_Info uusInfo = {};
Sanket Padawef220dc52017-01-02 23:46:00 -0800884 int32_t sizeOfDial = sizeof(dial);
885
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800886 if (!copyHidlStringToRil(&dial.address, dialInfo.address, pRI)) {
Sanket Padawef220dc52017-01-02 23:46:00 -0800887 return Void();
888 }
Jack Yuf68e0da2017-02-07 14:53:09 -0800889 dial.clir = (int) dialInfo.clir;
Sanket Padawef220dc52017-01-02 23:46:00 -0800890
Sanket Padawef220dc52017-01-02 23:46:00 -0800891 if (dialInfo.uusInfo.size() != 0) {
Sanket Padawef220dc52017-01-02 23:46:00 -0800892 uusInfo.uusType = (RIL_UUS_Type) dialInfo.uusInfo[0].uusType;
893 uusInfo.uusDcs = (RIL_UUS_DCS) dialInfo.uusInfo[0].uusDcs;
894
895 if (dialInfo.uusInfo[0].uusData.size() == 0) {
896 uusInfo.uusData = NULL;
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800897 uusInfo.uusLength = 0;
Sanket Padawef220dc52017-01-02 23:46:00 -0800898 } else {
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800899 if (!copyHidlStringToRil(&uusInfo.uusData, dialInfo.uusInfo[0].uusData, pRI)) {
900 memsetAndFreeStrings(1, dial.address);
Sanket Padawef220dc52017-01-02 23:46:00 -0800901 return Void();
902 }
Jack Yuf68e0da2017-02-07 14:53:09 -0800903 uusInfo.uusLength = dialInfo.uusInfo[0].uusData.size();
Sanket Padawef220dc52017-01-02 23:46:00 -0800904 }
905
Sanket Padawef220dc52017-01-02 23:46:00 -0800906 dial.uusInfo = &uusInfo;
907 }
908
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800909 s_vendorFunctions->onRequest(RIL_REQUEST_DIAL, &dial, sizeOfDial, pRI);
Sanket Padawef220dc52017-01-02 23:46:00 -0800910
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800911 memsetAndFreeStrings(2, dial.address, uusInfo.uusData);
Sanket Padawef220dc52017-01-02 23:46:00 -0800912
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800913 return Void();
Sanket Padawef220dc52017-01-02 23:46:00 -0800914}
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700915
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800916Return<void> RadioImpl::getImsiForApp(int32_t serial, const hidl_string& aid) {
Jayachandran C572f2f42017-03-25 14:30:13 -0700917#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -0800918 RLOGD("getImsiForApp: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -0700919#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800920 dispatchStrings(serial, mSlotId, RIL_REQUEST_GET_IMSI,
Scott Randolphc7213312017-04-03 14:06:40 -0700921 1, aid.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800922 return Void();
923}
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700924
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800925Return<void> RadioImpl::hangup(int32_t serial, int32_t gsmIndex) {
Jayachandran C572f2f42017-03-25 14:30:13 -0700926#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -0800927 RLOGD("hangup: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -0700928#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800929 dispatchInts(serial, mSlotId, RIL_REQUEST_HANGUP, 1, gsmIndex);
930 return Void();
931}
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700932
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800933Return<void> RadioImpl::hangupWaitingOrBackground(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -0700934#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -0800935 RLOGD("hangupWaitingOrBackground: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -0700936#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800937 dispatchVoid(serial, mSlotId, RIL_REQUEST_HANGUP_WAITING_OR_BACKGROUND);
938 return Void();
939}
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700940
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800941Return<void> RadioImpl::hangupForegroundResumeBackground(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -0700942#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -0800943 RLOGD("hangupForegroundResumeBackground: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -0700944#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800945 dispatchVoid(serial, mSlotId, RIL_REQUEST_HANGUP_FOREGROUND_RESUME_BACKGROUND);
946 return Void();
947}
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700948
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800949Return<void> RadioImpl::switchWaitingOrHoldingAndActive(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -0700950#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -0800951 RLOGD("switchWaitingOrHoldingAndActive: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -0700952#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800953 dispatchVoid(serial, mSlotId, RIL_REQUEST_SWITCH_WAITING_OR_HOLDING_AND_ACTIVE);
954 return Void();
955}
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700956
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800957Return<void> RadioImpl::conference(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -0700958#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -0800959 RLOGD("conference: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -0700960#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800961 dispatchVoid(serial, mSlotId, RIL_REQUEST_CONFERENCE);
962 return Void();
963}
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700964
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800965Return<void> RadioImpl::rejectCall(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -0700966#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -0800967 RLOGD("rejectCall: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -0700968#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800969 dispatchVoid(serial, mSlotId, RIL_REQUEST_UDUB);
970 return Void();
971}
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700972
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800973Return<void> RadioImpl::getLastCallFailCause(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -0700974#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -0800975 RLOGD("getLastCallFailCause: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -0700976#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800977 dispatchVoid(serial, mSlotId, RIL_REQUEST_LAST_CALL_FAIL_CAUSE);
978 return Void();
979}
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700980
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800981Return<void> RadioImpl::getSignalStrength(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -0700982#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -0800983 RLOGD("getSignalStrength: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -0700984#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800985 dispatchVoid(serial, mSlotId, RIL_REQUEST_SIGNAL_STRENGTH);
986 return Void();
987}
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700988
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800989Return<void> RadioImpl::getVoiceRegistrationState(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -0700990#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -0800991 RLOGD("getVoiceRegistrationState: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -0700992#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800993 dispatchVoid(serial, mSlotId, RIL_REQUEST_VOICE_REGISTRATION_STATE);
994 return Void();
995}
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700996
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800997Return<void> RadioImpl::getDataRegistrationState(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -0700998#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -0800999 RLOGD("getDataRegistrationState: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001000#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001001 dispatchVoid(serial, mSlotId, RIL_REQUEST_DATA_REGISTRATION_STATE);
1002 return Void();
1003}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001004
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001005Return<void> RadioImpl::getOperator(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001006#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001007 RLOGD("getOperator: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001008#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001009 dispatchVoid(serial, mSlotId, RIL_REQUEST_OPERATOR);
1010 return Void();
1011}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001012
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001013Return<void> RadioImpl::setRadioPower(int32_t serial, bool on) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08001014 RLOGD("setRadioPower: serial %d on %d", serial, on);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001015 dispatchInts(serial, mSlotId, RIL_REQUEST_RADIO_POWER, 1, BOOL_TO_INT(on));
1016 return Void();
1017}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001018
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001019Return<void> RadioImpl::sendDtmf(int32_t serial, const hidl_string& s) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001020#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001021 RLOGD("sendDtmf: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001022#endif
Scott Randolphc7213312017-04-03 14:06:40 -07001023 dispatchString(serial, mSlotId, RIL_REQUEST_DTMF, s.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001024 return Void();
1025}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001026
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001027Return<void> RadioImpl::sendSms(int32_t serial, const GsmSmsMessage& message) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001028#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001029 RLOGD("sendSms: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001030#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001031 dispatchStrings(serial, mSlotId, RIL_REQUEST_SEND_SMS,
Scott Randolphc7213312017-04-03 14:06:40 -07001032 2, message.smscPdu.c_str(), message.pdu.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001033 return Void();
1034}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001035
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001036Return<void> RadioImpl::sendSMSExpectMore(int32_t serial, const GsmSmsMessage& message) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001037#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001038 RLOGD("sendSMSExpectMore: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001039#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001040 dispatchStrings(serial, mSlotId, RIL_REQUEST_SEND_SMS_EXPECT_MORE,
Scott Randolphc7213312017-04-03 14:06:40 -07001041 2, message.smscPdu.c_str(), message.pdu.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001042 return Void();
1043}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001044
Jack Yuc13645e2017-04-13 20:55:03 -07001045static bool convertMvnoTypeToString(MvnoType type, char *&str) {
Jack Yuffc06452017-02-13 11:21:00 -08001046 switch (type) {
Jack Yuc13645e2017-04-13 20:55:03 -07001047 case MvnoType::IMSI:
1048 str = (char *)"imsi";
1049 return true;
1050 case MvnoType::GID:
1051 str = (char *)"gid";
1052 return true;
1053 case MvnoType::SPN:
1054 str = (char *)"spn";
1055 return true;
1056 case MvnoType::NONE:
1057 str = (char *)"";
1058 return true;
Jack Yuffc06452017-02-13 11:21:00 -08001059 }
Jack Yuc13645e2017-04-13 20:55:03 -07001060 return false;
Jack Yuffc06452017-02-13 11:21:00 -08001061}
1062
1063Return<void> RadioImpl::setupDataCall(int32_t serial, RadioTechnology radioTechnology,
1064 const DataProfileInfo& dataProfileInfo, bool modemCognitive,
1065 bool roamingAllowed, bool isRoaming) {
1066
Jayachandran C572f2f42017-03-25 14:30:13 -07001067#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001068 RLOGD("setupDataCall: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001069#endif
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001070
Jack Yuffc06452017-02-13 11:21:00 -08001071 if (s_vendorFunctions->version >= 4 && s_vendorFunctions->version <= 14) {
1072 const hidl_string &protocol =
1073 (isRoaming ? dataProfileInfo.roamingProtocol : dataProfileInfo.protocol);
1074 dispatchStrings(serial, mSlotId, RIL_REQUEST_SETUP_DATA_CALL, 7,
1075 std::to_string((int) radioTechnology + 2).c_str(),
1076 std::to_string((int) dataProfileInfo.profileId).c_str(),
1077 dataProfileInfo.apn.c_str(),
1078 dataProfileInfo.user.c_str(),
1079 dataProfileInfo.password.c_str(),
1080 std::to_string((int) dataProfileInfo.authType).c_str(),
1081 protocol.c_str());
1082 } else if (s_vendorFunctions->version >= 15) {
Jack Yuc13645e2017-04-13 20:55:03 -07001083 char *mvnoTypeStr = NULL;
1084 if (!convertMvnoTypeToString(dataProfileInfo.mvnoType, mvnoTypeStr)) {
Jack Yuffc06452017-02-13 11:21:00 -08001085 RequestInfo *pRI = android::addRequestToList(serial, mSlotId,
1086 RIL_REQUEST_SETUP_DATA_CALL);
1087 if (pRI != NULL) {
1088 sendErrorResponse(pRI, RIL_E_INVALID_ARGUMENTS);
1089 }
1090 return Void();
1091 }
1092 dispatchStrings(serial, mSlotId, RIL_REQUEST_SETUP_DATA_CALL, 15,
1093 std::to_string((int) radioTechnology + 2).c_str(),
1094 std::to_string((int) dataProfileInfo.profileId).c_str(),
1095 dataProfileInfo.apn.c_str(),
1096 dataProfileInfo.user.c_str(),
1097 dataProfileInfo.password.c_str(),
1098 std::to_string((int) dataProfileInfo.authType).c_str(),
1099 dataProfileInfo.protocol.c_str(),
1100 dataProfileInfo.roamingProtocol.c_str(),
1101 std::to_string(dataProfileInfo.supportedApnTypesBitmap).c_str(),
1102 std::to_string(dataProfileInfo.bearerBitmap).c_str(),
Jack Yuc13645e2017-04-13 20:55:03 -07001103 modemCognitive ? "1" : "0",
Jack Yuffc06452017-02-13 11:21:00 -08001104 std::to_string(dataProfileInfo.mtu).c_str(),
1105 mvnoTypeStr,
1106 dataProfileInfo.mvnoMatchData.c_str(),
Jack Yuc13645e2017-04-13 20:55:03 -07001107 roamingAllowed ? "1" : "0");
Jack Yuffc06452017-02-13 11:21:00 -08001108 } else {
1109 RLOGE("Unsupported RIL version %d, min version expected 4", s_vendorFunctions->version);
1110 RequestInfo *pRI = android::addRequestToList(serial, mSlotId,
1111 RIL_REQUEST_SETUP_DATA_CALL);
1112 if (pRI != NULL) {
1113 sendErrorResponse(pRI, RIL_E_REQUEST_NOT_SUPPORTED);
1114 }
1115 }
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001116 return Void();
1117}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001118
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001119Return<void> RadioImpl::iccIOForApp(int32_t serial, const IccIo& iccIo) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001120#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001121 RLOGD("iccIOForApp: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001122#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001123 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_SIM_IO);
1124 if (pRI == NULL) {
1125 return Void();
1126 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001127
Jack Yu8e732d42017-04-14 00:08:06 -07001128 RIL_SIM_IO_v6 rilIccIo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001129 rilIccIo.command = iccIo.command;
1130 rilIccIo.fileid = iccIo.fileId;
1131 if (!copyHidlStringToRil(&rilIccIo.path, iccIo.path, pRI)) {
1132 return Void();
1133 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001134
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001135 rilIccIo.p1 = iccIo.p1;
1136 rilIccIo.p2 = iccIo.p2;
1137 rilIccIo.p3 = iccIo.p3;
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001138
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001139 if (!copyHidlStringToRil(&rilIccIo.data, iccIo.data, pRI)) {
1140 memsetAndFreeStrings(1, rilIccIo.path);
1141 return Void();
1142 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001143
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001144 if (!copyHidlStringToRil(&rilIccIo.pin2, iccIo.pin2, pRI)) {
1145 memsetAndFreeStrings(2, rilIccIo.path, rilIccIo.data);
1146 return Void();
1147 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001148
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001149 if (!copyHidlStringToRil(&rilIccIo.aidPtr, iccIo.aid, pRI)) {
1150 memsetAndFreeStrings(3, rilIccIo.path, rilIccIo.data, rilIccIo.pin2);
1151 return Void();
1152 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001153
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001154 s_vendorFunctions->onRequest(RIL_REQUEST_SIM_IO, &rilIccIo, sizeof(rilIccIo), pRI);
1155
1156 memsetAndFreeStrings(4, rilIccIo.path, rilIccIo.data, rilIccIo.pin2, rilIccIo.aidPtr);
1157
1158 return Void();
1159}
1160
1161Return<void> RadioImpl::sendUssd(int32_t serial, const hidl_string& ussd) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001162#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001163 RLOGD("sendUssd: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001164#endif
Scott Randolphc7213312017-04-03 14:06:40 -07001165 dispatchString(serial, mSlotId, RIL_REQUEST_SEND_USSD, ussd.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001166 return Void();
1167}
1168
1169Return<void> RadioImpl::cancelPendingUssd(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001170#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001171 RLOGD("cancelPendingUssd: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001172#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001173 dispatchVoid(serial, mSlotId, RIL_REQUEST_CANCEL_USSD);
1174 return Void();
1175}
1176
1177Return<void> RadioImpl::getClir(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001178#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001179 RLOGD("getClir: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001180#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001181 dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_CLIR);
1182 return Void();
1183}
1184
1185Return<void> RadioImpl::setClir(int32_t serial, int32_t status) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001186#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001187 RLOGD("setClir: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001188#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001189 dispatchInts(serial, mSlotId, RIL_REQUEST_SET_CLIR, 1, status);
1190 return Void();
1191}
1192
1193Return<void> RadioImpl::getCallForwardStatus(int32_t serial, const CallForwardInfo& callInfo) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001194#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001195 RLOGD("getCallForwardStatus: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001196#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001197 dispatchCallForwardStatus(serial, mSlotId, RIL_REQUEST_QUERY_CALL_FORWARD_STATUS,
1198 callInfo);
1199 return Void();
1200}
1201
1202Return<void> RadioImpl::setCallForward(int32_t serial, const CallForwardInfo& callInfo) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001203#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001204 RLOGD("setCallForward: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001205#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001206 dispatchCallForwardStatus(serial, mSlotId, RIL_REQUEST_SET_CALL_FORWARD,
1207 callInfo);
1208 return Void();
1209}
1210
1211Return<void> RadioImpl::getCallWaiting(int32_t serial, int32_t serviceClass) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001212#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001213 RLOGD("getCallWaiting: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001214#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001215 dispatchInts(serial, mSlotId, RIL_REQUEST_QUERY_CALL_WAITING, 1, serviceClass);
1216 return Void();
1217}
1218
1219Return<void> RadioImpl::setCallWaiting(int32_t serial, bool enable, int32_t serviceClass) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001220#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001221 RLOGD("setCallWaiting: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001222#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001223 dispatchInts(serial, mSlotId, RIL_REQUEST_SET_CALL_WAITING, 2, BOOL_TO_INT(enable),
1224 serviceClass);
1225 return Void();
1226}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001227
1228Return<void> RadioImpl::acknowledgeLastIncomingGsmSms(int32_t serial,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001229 bool success, SmsAcknowledgeFailCause cause) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001230#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001231 RLOGD("acknowledgeLastIncomingGsmSms: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001232#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001233 dispatchInts(serial, mSlotId, RIL_REQUEST_SMS_ACKNOWLEDGE, 2, BOOL_TO_INT(success),
1234 cause);
1235 return Void();
1236}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001237
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001238Return<void> RadioImpl::acceptCall(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001239#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001240 RLOGD("acceptCall: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001241#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001242 dispatchVoid(serial, mSlotId, RIL_REQUEST_ANSWER);
1243 return Void();
1244}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001245
1246Return<void> RadioImpl::deactivateDataCall(int32_t serial,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001247 int32_t cid, bool reasonRadioShutDown) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001248#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001249 RLOGD("deactivateDataCall: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001250#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001251 dispatchStrings(serial, mSlotId, RIL_REQUEST_DEACTIVATE_DATA_CALL,
Scott Randolphc7213312017-04-03 14:06:40 -07001252 2, (std::to_string(cid)).c_str(), reasonRadioShutDown ? "1" : "0");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001253 return Void();
1254}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001255
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001256Return<void> RadioImpl::getFacilityLockForApp(int32_t serial, const hidl_string& facility,
1257 const hidl_string& password, int32_t serviceClass,
1258 const hidl_string& appId) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001259#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001260 RLOGD("getFacilityLockForApp: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001261#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001262 dispatchStrings(serial, mSlotId, RIL_REQUEST_QUERY_FACILITY_LOCK,
Scott Randolphc7213312017-04-03 14:06:40 -07001263 4, facility.c_str(), password.c_str(),
1264 (std::to_string(serviceClass)).c_str(), appId.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001265 return Void();
1266}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001267
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001268Return<void> RadioImpl::setFacilityLockForApp(int32_t serial, const hidl_string& facility,
1269 bool lockState, const hidl_string& password,
1270 int32_t serviceClass, const hidl_string& appId) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001271#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001272 RLOGD("setFacilityLockForApp: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001273#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001274 dispatchStrings(serial, mSlotId, RIL_REQUEST_SET_FACILITY_LOCK,
Scott Randolphc7213312017-04-03 14:06:40 -07001275 5, facility.c_str(), lockState ? "1" : "0", password.c_str(),
1276 (std::to_string(serviceClass)).c_str(), appId.c_str() );
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001277 return Void();
1278}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001279
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001280Return<void> RadioImpl::setBarringPassword(int32_t serial, const hidl_string& facility,
1281 const hidl_string& oldPassword,
1282 const hidl_string& newPassword) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001283#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001284 RLOGD("setBarringPassword: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001285#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001286 dispatchStrings(serial, mSlotId, RIL_REQUEST_CHANGE_BARRING_PASSWORD,
Scott Randolphc7213312017-04-03 14:06:40 -07001287 2, oldPassword.c_str(), newPassword.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001288 return Void();
1289}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001290
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001291Return<void> RadioImpl::getNetworkSelectionMode(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001292#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001293 RLOGD("getNetworkSelectionMode: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001294#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001295 dispatchVoid(serial, mSlotId, RIL_REQUEST_QUERY_NETWORK_SELECTION_MODE);
1296 return Void();
1297}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001298
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001299Return<void> RadioImpl::setNetworkSelectionModeAutomatic(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001300#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001301 RLOGD("setNetworkSelectionModeAutomatic: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001302#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001303 dispatchVoid(serial, mSlotId, RIL_REQUEST_SET_NETWORK_SELECTION_AUTOMATIC);
1304 return Void();
1305}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001306
1307Return<void> RadioImpl::setNetworkSelectionModeManual(int32_t serial,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001308 const hidl_string& operatorNumeric) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001309#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001310 RLOGD("setNetworkSelectionModeManual: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001311#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001312 dispatchString(serial, mSlotId, RIL_REQUEST_SET_NETWORK_SELECTION_MANUAL,
Scott Randolphc7213312017-04-03 14:06:40 -07001313 operatorNumeric.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001314 return Void();
1315}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001316
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001317Return<void> RadioImpl::getAvailableNetworks(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001318#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001319 RLOGD("getAvailableNetworks: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001320#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001321 dispatchVoid(serial, mSlotId, RIL_REQUEST_QUERY_AVAILABLE_NETWORKS);
1322 return Void();
1323}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001324
yinxu584379e2017-05-03 15:15:19 -07001325Return<void> RadioImpl::startNetworkScan(int32_t serial, const NetworkScanRequest& request) {
1326#if VDBG
1327 RLOGD("startNetworkScan: serial %d", serial);
1328#endif
yinxu8688abd2017-05-22 11:26:45 -07001329
1330 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_START_NETWORK_SCAN);
1331 if (pRI == NULL) {
1332 return Void();
1333 }
1334
1335 if (request.specifiers.size() > MAX_RADIO_ACCESS_NETWORKS) {
1336 sendErrorResponse(pRI, RIL_E_INVALID_ARGUMENTS);
1337 return Void();
1338 }
1339
1340 RIL_NetworkScanRequest scan_request = {};
1341
1342 scan_request.type = (RIL_ScanType) request.type;
1343 scan_request.interval = request.interval;
1344 scan_request.specifiers_length = request.specifiers.size();
1345 for (size_t i = 0; i < request.specifiers.size(); ++i) {
1346 if (request.specifiers[i].geranBands.size() > MAX_BANDS ||
1347 request.specifiers[i].utranBands.size() > MAX_BANDS ||
1348 request.specifiers[i].eutranBands.size() > MAX_BANDS ||
1349 request.specifiers[i].channels.size() > MAX_CHANNELS) {
1350 sendErrorResponse(pRI, RIL_E_INVALID_ARGUMENTS);
1351 return Void();
1352 }
1353 const ::android::hardware::radio::V1_1::RadioAccessSpecifier& ras_from =
1354 request.specifiers[i];
1355 RIL_RadioAccessSpecifier& ras_to = scan_request.specifiers[i];
1356
1357 ras_to.radio_access_network = (RIL_RadioAccessNetworks) ras_from.radioAccessNetwork;
1358 ras_to.channels_length = ras_from.channels.size();
1359
1360 std::copy(ras_from.channels.begin(), ras_from.channels.end(), ras_to.channels);
1361 const std::vector<uint32_t> * bands = nullptr;
1362 switch (request.specifiers[i].radioAccessNetwork) {
1363 case ::android::hardware::radio::V1_1::RadioAccessNetworks::GERAN:
1364 ras_to.bands_length = ras_from.geranBands.size();
1365 bands = (std::vector<uint32_t> *) &ras_from.geranBands;
1366 break;
1367 case ::android::hardware::radio::V1_1::RadioAccessNetworks::UTRAN:
1368 ras_to.bands_length = ras_from.utranBands.size();
1369 bands = (std::vector<uint32_t> *) &ras_from.utranBands;
1370 break;
1371 case ::android::hardware::radio::V1_1::RadioAccessNetworks::EUTRAN:
1372 ras_to.bands_length = ras_from.eutranBands.size();
1373 bands = (std::vector<uint32_t> *) &ras_from.eutranBands;
1374 break;
1375 default:
1376 sendErrorResponse(pRI, RIL_E_INVALID_ARGUMENTS);
1377 return Void();
1378 }
1379 // safe to copy to geran_bands because it's a union member
yinxudab31662017-06-22 17:10:59 -07001380 for (size_t idx = 0; idx < ras_to.bands_length; ++idx) {
1381 ras_to.bands.geran_bands[idx] = (RIL_GeranBands) (*bands)[idx];
1382 }
yinxu8688abd2017-05-22 11:26:45 -07001383 }
1384
1385 s_vendorFunctions->onRequest(
1386 RIL_REQUEST_START_NETWORK_SCAN, &scan_request, sizeof(scan_request), pRI);
1387
yinxu584379e2017-05-03 15:15:19 -07001388 return Void();
1389}
1390
1391Return<void> RadioImpl::stopNetworkScan(int32_t serial) {
1392#if VDBG
1393 RLOGD("stopNetworkScan: serial %d", serial);
1394#endif
yinxu584379e2017-05-03 15:15:19 -07001395 dispatchVoid(serial, mSlotId, RIL_REQUEST_STOP_NETWORK_SCAN);
1396 return Void();
1397}
1398
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001399Return<void> RadioImpl::startDtmf(int32_t serial, const hidl_string& s) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001400#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001401 RLOGD("startDtmf: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001402#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001403 dispatchString(serial, mSlotId, RIL_REQUEST_DTMF_START,
Scott Randolphc7213312017-04-03 14:06:40 -07001404 s.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001405 return Void();
1406}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001407
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001408Return<void> RadioImpl::stopDtmf(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001409#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001410 RLOGD("stopDtmf: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001411#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001412 dispatchVoid(serial, mSlotId, RIL_REQUEST_DTMF_STOP);
1413 return Void();
1414}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001415
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001416Return<void> RadioImpl::getBasebandVersion(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001417#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001418 RLOGD("getBasebandVersion: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001419#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001420 dispatchVoid(serial, mSlotId, RIL_REQUEST_BASEBAND_VERSION);
1421 return Void();
1422}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001423
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001424Return<void> RadioImpl::separateConnection(int32_t serial, int32_t gsmIndex) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001425#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001426 RLOGD("separateConnection: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001427#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001428 dispatchInts(serial, mSlotId, RIL_REQUEST_SEPARATE_CONNECTION, 1, gsmIndex);
1429 return Void();
1430}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001431
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001432Return<void> RadioImpl::setMute(int32_t serial, bool enable) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001433#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001434 RLOGD("setMute: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001435#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001436 dispatchInts(serial, mSlotId, RIL_REQUEST_SET_MUTE, 1, BOOL_TO_INT(enable));
1437 return Void();
1438}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001439
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001440Return<void> RadioImpl::getMute(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001441#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001442 RLOGD("getMute: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001443#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001444 dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_MUTE);
1445 return Void();
1446}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001447
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001448Return<void> RadioImpl::getClip(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001449#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001450 RLOGD("getClip: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001451#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001452 dispatchVoid(serial, mSlotId, RIL_REQUEST_QUERY_CLIP);
1453 return Void();
1454}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001455
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001456Return<void> RadioImpl::getDataCallList(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001457#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001458 RLOGD("getDataCallList: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001459#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001460 dispatchVoid(serial, mSlotId, RIL_REQUEST_DATA_CALL_LIST);
1461 return Void();
1462}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001463
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001464Return<void> RadioImpl::setSuppServiceNotifications(int32_t serial, bool enable) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001465#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001466 RLOGD("setSuppServiceNotifications: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001467#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001468 dispatchInts(serial, mSlotId, RIL_REQUEST_SET_SUPP_SVC_NOTIFICATION, 1,
1469 BOOL_TO_INT(enable));
1470 return Void();
1471}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001472
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001473Return<void> RadioImpl::writeSmsToSim(int32_t serial, const SmsWriteArgs& smsWriteArgs) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001474#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001475 RLOGD("writeSmsToSim: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001476#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001477 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_WRITE_SMS_TO_SIM);
1478 if (pRI == NULL) {
1479 return Void();
1480 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001481
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001482 RIL_SMS_WriteArgs args;
1483 args.status = (int) smsWriteArgs.status;
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001484
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001485 int len;
1486 if (!copyHidlStringToRil(&args.pdu, smsWriteArgs.pdu, pRI)) {
1487 return Void();
1488 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001489
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001490 if (!copyHidlStringToRil(&args.smsc, smsWriteArgs.smsc, pRI)) {
1491 memsetAndFreeStrings(1, args.pdu);
1492 return Void();
1493 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001494
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001495 s_vendorFunctions->onRequest(RIL_REQUEST_WRITE_SMS_TO_SIM, &args, sizeof(args), pRI);
1496
1497 memsetAndFreeStrings(2, args.smsc, args.pdu);
1498
1499 return Void();
1500}
1501
1502Return<void> RadioImpl::deleteSmsOnSim(int32_t serial, int32_t index) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001503#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001504 RLOGD("deleteSmsOnSim: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001505#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001506 dispatchInts(serial, mSlotId, RIL_REQUEST_DELETE_SMS_ON_SIM, 1, index);
1507 return Void();
1508}
1509
1510Return<void> RadioImpl::setBandMode(int32_t serial, RadioBandMode mode) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001511#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001512 RLOGD("setBandMode: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001513#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001514 dispatchInts(serial, mSlotId, RIL_REQUEST_SET_BAND_MODE, 1, mode);
1515 return Void();
1516}
1517
1518Return<void> RadioImpl::getAvailableBandModes(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001519#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001520 RLOGD("getAvailableBandModes: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001521#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001522 dispatchVoid(serial, mSlotId, RIL_REQUEST_QUERY_AVAILABLE_BAND_MODE);
1523 return Void();
1524}
1525
1526Return<void> RadioImpl::sendEnvelope(int32_t serial, const hidl_string& command) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001527#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001528 RLOGD("sendEnvelope: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001529#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001530 dispatchString(serial, mSlotId, RIL_REQUEST_STK_SEND_ENVELOPE_COMMAND,
Scott Randolphc7213312017-04-03 14:06:40 -07001531 command.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001532 return Void();
1533}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001534
1535Return<void> RadioImpl::sendTerminalResponseToSim(int32_t serial,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001536 const hidl_string& commandResponse) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001537#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001538 RLOGD("sendTerminalResponseToSim: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001539#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001540 dispatchString(serial, mSlotId, RIL_REQUEST_STK_SEND_TERMINAL_RESPONSE,
Scott Randolphc7213312017-04-03 14:06:40 -07001541 commandResponse.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001542 return Void();
1543}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001544
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001545Return<void> RadioImpl::handleStkCallSetupRequestFromSim(int32_t serial, bool accept) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001546#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001547 RLOGD("handleStkCallSetupRequestFromSim: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001548#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001549 dispatchInts(serial, mSlotId, RIL_REQUEST_STK_HANDLE_CALL_SETUP_REQUESTED_FROM_SIM,
1550 1, BOOL_TO_INT(accept));
1551 return Void();
1552}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001553
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001554Return<void> RadioImpl::explicitCallTransfer(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001555#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001556 RLOGD("explicitCallTransfer: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001557#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001558 dispatchVoid(serial, mSlotId, RIL_REQUEST_EXPLICIT_CALL_TRANSFER);
1559 return Void();
1560}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001561
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001562Return<void> RadioImpl::setPreferredNetworkType(int32_t serial, PreferredNetworkType nwType) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001563#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001564 RLOGD("setPreferredNetworkType: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001565#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001566 dispatchInts(serial, mSlotId, RIL_REQUEST_SET_PREFERRED_NETWORK_TYPE, 1, nwType);
1567 return Void();
1568}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001569
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001570Return<void> RadioImpl::getPreferredNetworkType(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001571#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001572 RLOGD("getPreferredNetworkType: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001573#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001574 dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_PREFERRED_NETWORK_TYPE);
1575 return Void();
1576}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001577
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001578Return<void> RadioImpl::getNeighboringCids(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001579#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001580 RLOGD("getNeighboringCids: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001581#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001582 dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_NEIGHBORING_CELL_IDS);
1583 return Void();
1584}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001585
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001586Return<void> RadioImpl::setLocationUpdates(int32_t serial, bool enable) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001587#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001588 RLOGD("setLocationUpdates: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001589#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001590 dispatchInts(serial, mSlotId, RIL_REQUEST_SET_LOCATION_UPDATES, 1, BOOL_TO_INT(enable));
1591 return Void();
1592}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001593
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001594Return<void> RadioImpl::setCdmaSubscriptionSource(int32_t serial, CdmaSubscriptionSource cdmaSub) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001595#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001596 RLOGD("setCdmaSubscriptionSource: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001597#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001598 dispatchInts(serial, mSlotId, RIL_REQUEST_CDMA_SET_SUBSCRIPTION_SOURCE, 1, cdmaSub);
1599 return Void();
1600}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001601
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001602Return<void> RadioImpl::setCdmaRoamingPreference(int32_t serial, CdmaRoamingType type) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001603#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001604 RLOGD("setCdmaRoamingPreference: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001605#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001606 dispatchInts(serial, mSlotId, RIL_REQUEST_CDMA_SET_ROAMING_PREFERENCE, 1, type);
1607 return Void();
1608}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001609
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001610Return<void> RadioImpl::getCdmaRoamingPreference(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001611#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001612 RLOGD("getCdmaRoamingPreference: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001613#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001614 dispatchVoid(serial, mSlotId, RIL_REQUEST_CDMA_QUERY_ROAMING_PREFERENCE);
1615 return Void();
1616}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001617
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001618Return<void> RadioImpl::setTTYMode(int32_t serial, TtyMode mode) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001619#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001620 RLOGD("setTTYMode: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001621#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001622 dispatchInts(serial, mSlotId, RIL_REQUEST_SET_TTY_MODE, 1, mode);
1623 return Void();
1624}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001625
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001626Return<void> RadioImpl::getTTYMode(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001627#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001628 RLOGD("getTTYMode: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001629#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001630 dispatchVoid(serial, mSlotId, RIL_REQUEST_QUERY_TTY_MODE);
1631 return Void();
1632}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001633
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001634Return<void> RadioImpl::setPreferredVoicePrivacy(int32_t serial, bool enable) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001635#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001636 RLOGD("setPreferredVoicePrivacy: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001637#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001638 dispatchInts(serial, mSlotId, RIL_REQUEST_CDMA_SET_PREFERRED_VOICE_PRIVACY_MODE,
1639 1, BOOL_TO_INT(enable));
1640 return Void();
1641}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001642
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001643Return<void> RadioImpl::getPreferredVoicePrivacy(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001644#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001645 RLOGD("getPreferredVoicePrivacy: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001646#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001647 dispatchVoid(serial, mSlotId, RIL_REQUEST_CDMA_QUERY_PREFERRED_VOICE_PRIVACY_MODE);
1648 return Void();
1649}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001650
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001651Return<void> RadioImpl::sendCDMAFeatureCode(int32_t serial, const hidl_string& featureCode) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001652#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001653 RLOGD("sendCDMAFeatureCode: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001654#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001655 dispatchString(serial, mSlotId, RIL_REQUEST_CDMA_FLASH,
Scott Randolphc7213312017-04-03 14:06:40 -07001656 featureCode.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001657 return Void();
1658}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001659
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001660Return<void> RadioImpl::sendBurstDtmf(int32_t serial, const hidl_string& dtmf, int32_t on,
1661 int32_t off) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001662#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001663 RLOGD("sendBurstDtmf: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001664#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001665 dispatchStrings(serial, mSlotId, RIL_REQUEST_CDMA_BURST_DTMF,
Scott Randolphc7213312017-04-03 14:06:40 -07001666 3, dtmf.c_str(), (std::to_string(on)).c_str(),
1667 (std::to_string(off)).c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001668 return Void();
1669}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001670
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001671void constructCdmaSms(RIL_CDMA_SMS_Message &rcsm, const CdmaSmsMessage& sms) {
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001672 rcsm.uTeleserviceID = sms.teleserviceId;
1673 rcsm.bIsServicePresent = BOOL_TO_INT(sms.isServicePresent);
1674 rcsm.uServicecategory = sms.serviceCategory;
1675 rcsm.sAddress.digit_mode = (RIL_CDMA_SMS_DigitMode) sms.address.digitMode;
1676 rcsm.sAddress.number_mode = (RIL_CDMA_SMS_NumberMode) sms.address.numberMode;
1677 rcsm.sAddress.number_type = (RIL_CDMA_SMS_NumberType) sms.address.numberType;
1678 rcsm.sAddress.number_plan = (RIL_CDMA_SMS_NumberPlan) sms.address.numberPlan;
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001679
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001680 rcsm.sAddress.number_of_digits = sms.address.digits.size();
1681 int digitLimit= MIN((rcsm.sAddress.number_of_digits), RIL_CDMA_SMS_ADDRESS_MAX);
1682 for (int i = 0; i < digitLimit; i++) {
1683 rcsm.sAddress.digits[i] = sms.address.digits[i];
1684 }
1685
1686 rcsm.sSubAddress.subaddressType = (RIL_CDMA_SMS_SubaddressType) sms.subAddress.subaddressType;
1687 rcsm.sSubAddress.odd = BOOL_TO_INT(sms.subAddress.odd);
1688
1689 rcsm.sSubAddress.number_of_digits = sms.subAddress.digits.size();
1690 digitLimit= MIN((rcsm.sSubAddress.number_of_digits), RIL_CDMA_SMS_SUBADDRESS_MAX);
1691 for (int i = 0; i < digitLimit; i++) {
1692 rcsm.sSubAddress.digits[i] = sms.subAddress.digits[i];
1693 }
1694
1695 rcsm.uBearerDataLen = sms.bearerData.size();
1696 digitLimit= MIN((rcsm.uBearerDataLen), RIL_CDMA_SMS_BEARER_DATA_MAX);
1697 for (int i = 0; i < digitLimit; i++) {
1698 rcsm.aBearerData[i] = sms.bearerData[i];
1699 }
1700}
1701
1702Return<void> RadioImpl::sendCdmaSms(int32_t serial, const CdmaSmsMessage& sms) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001703#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001704 RLOGD("sendCdmaSms: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001705#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001706 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_CDMA_SEND_SMS);
1707 if (pRI == NULL) {
1708 return Void();
1709 }
1710
Jack Yu8e732d42017-04-14 00:08:06 -07001711 RIL_CDMA_SMS_Message rcsm = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001712 constructCdmaSms(rcsm, sms);
1713
1714 s_vendorFunctions->onRequest(pRI->pCI->requestNumber, &rcsm, sizeof(rcsm), pRI);
1715 return Void();
1716}
1717
1718Return<void> RadioImpl::acknowledgeLastIncomingCdmaSms(int32_t serial, const CdmaSmsAck& smsAck) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001719#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001720 RLOGD("acknowledgeLastIncomingCdmaSms: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001721#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001722 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_CDMA_SMS_ACKNOWLEDGE);
1723 if (pRI == NULL) {
1724 return Void();
1725 }
1726
Jack Yuf68e0da2017-02-07 14:53:09 -08001727 RIL_CDMA_SMS_Ack rcsa = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001728
1729 rcsa.uErrorClass = (RIL_CDMA_SMS_ErrorClass) smsAck.errorClass;
1730 rcsa.uSMSCauseCode = smsAck.smsCauseCode;
1731
1732 s_vendorFunctions->onRequest(pRI->pCI->requestNumber, &rcsa, sizeof(rcsa), pRI);
1733 return Void();
1734}
1735
1736Return<void> RadioImpl::getGsmBroadcastConfig(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001737#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001738 RLOGD("getGsmBroadcastConfig: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001739#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001740 dispatchVoid(serial, mSlotId, RIL_REQUEST_GSM_GET_BROADCAST_SMS_CONFIG);
1741 return Void();
1742}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001743
1744Return<void> RadioImpl::setGsmBroadcastConfig(int32_t serial,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001745 const hidl_vec<GsmBroadcastSmsConfigInfo>&
1746 configInfo) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001747#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001748 RLOGD("setGsmBroadcastConfig: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001749#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001750 RequestInfo *pRI = android::addRequestToList(serial, mSlotId,
1751 RIL_REQUEST_GSM_SET_BROADCAST_SMS_CONFIG);
1752 if (pRI == NULL) {
1753 return Void();
1754 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001755
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001756 int num = configInfo.size();
1757 RIL_GSM_BroadcastSmsConfigInfo gsmBci[num];
1758 RIL_GSM_BroadcastSmsConfigInfo *gsmBciPtrs[num];
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001759
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001760 for (int i = 0 ; i < num ; i++ ) {
1761 gsmBciPtrs[i] = &gsmBci[i];
1762 gsmBci[i].fromServiceId = configInfo[i].fromServiceId;
1763 gsmBci[i].toServiceId = configInfo[i].toServiceId;
1764 gsmBci[i].fromCodeScheme = configInfo[i].fromCodeScheme;
1765 gsmBci[i].toCodeScheme = configInfo[i].toCodeScheme;
1766 gsmBci[i].selected = BOOL_TO_INT(configInfo[i].selected);
1767 }
1768
1769 s_vendorFunctions->onRequest(pRI->pCI->requestNumber, gsmBciPtrs,
1770 num * sizeof(RIL_GSM_BroadcastSmsConfigInfo *), pRI);
1771 return Void();
1772}
1773
1774Return<void> RadioImpl::setGsmBroadcastActivation(int32_t serial, bool activate) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001775#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001776 RLOGD("setGsmBroadcastActivation: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001777#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001778 dispatchInts(serial, mSlotId, RIL_REQUEST_GSM_SMS_BROADCAST_ACTIVATION,
Sanket Padawe0de29d12017-02-10 13:19:47 -08001779 1, BOOL_TO_INT(!activate));
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001780 return Void();
1781}
1782
1783Return<void> RadioImpl::getCdmaBroadcastConfig(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001784#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001785 RLOGD("getCdmaBroadcastConfig: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001786#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001787 dispatchVoid(serial, mSlotId, RIL_REQUEST_CDMA_GET_BROADCAST_SMS_CONFIG);
1788 return Void();
1789}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001790
1791Return<void> RadioImpl::setCdmaBroadcastConfig(int32_t serial,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001792 const hidl_vec<CdmaBroadcastSmsConfigInfo>&
1793 configInfo) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001794#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001795 RLOGD("setCdmaBroadcastConfig: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001796#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001797 RequestInfo *pRI = android::addRequestToList(serial, mSlotId,
1798 RIL_REQUEST_CDMA_SET_BROADCAST_SMS_CONFIG);
1799 if (pRI == NULL) {
1800 return Void();
1801 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001802
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001803 int num = configInfo.size();
1804 RIL_CDMA_BroadcastSmsConfigInfo cdmaBci[num];
1805 RIL_CDMA_BroadcastSmsConfigInfo *cdmaBciPtrs[num];
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001806
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001807 for (int i = 0 ; i < num ; i++ ) {
1808 cdmaBciPtrs[i] = &cdmaBci[i];
1809 cdmaBci[i].service_category = configInfo[i].serviceCategory;
1810 cdmaBci[i].language = configInfo[i].language;
1811 cdmaBci[i].selected = BOOL_TO_INT(configInfo[i].selected);
1812 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001813
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001814 s_vendorFunctions->onRequest(pRI->pCI->requestNumber, cdmaBciPtrs,
1815 num * sizeof(RIL_CDMA_BroadcastSmsConfigInfo *), pRI);
1816 return Void();
1817}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001818
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001819Return<void> RadioImpl::setCdmaBroadcastActivation(int32_t serial, bool activate) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001820#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001821 RLOGD("setCdmaBroadcastActivation: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001822#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001823 dispatchInts(serial, mSlotId, RIL_REQUEST_CDMA_SMS_BROADCAST_ACTIVATION,
Sanket Padawe0de29d12017-02-10 13:19:47 -08001824 1, BOOL_TO_INT(!activate));
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001825 return Void();
1826}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001827
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001828Return<void> RadioImpl::getCDMASubscription(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001829#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001830 RLOGD("getCDMASubscription: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001831#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001832 dispatchVoid(serial, mSlotId, RIL_REQUEST_CDMA_SUBSCRIPTION);
1833 return Void();
1834}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001835
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001836Return<void> RadioImpl::writeSmsToRuim(int32_t serial, const CdmaSmsWriteArgs& cdmaSms) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001837#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001838 RLOGD("writeSmsToRuim: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001839#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001840 RequestInfo *pRI = android::addRequestToList(serial, mSlotId,
1841 RIL_REQUEST_CDMA_WRITE_SMS_TO_RUIM);
1842 if (pRI == NULL) {
1843 return Void();
1844 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001845
Jack Yuf68e0da2017-02-07 14:53:09 -08001846 RIL_CDMA_SMS_WriteArgs rcsw = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001847 rcsw.status = (int) cdmaSms.status;
1848 constructCdmaSms(rcsw.message, cdmaSms.message);
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001849
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001850 s_vendorFunctions->onRequest(pRI->pCI->requestNumber, &rcsw, sizeof(rcsw), pRI);
1851 return Void();
1852}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001853
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001854Return<void> RadioImpl::deleteSmsOnRuim(int32_t serial, int32_t index) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001855#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001856 RLOGD("deleteSmsOnRuim: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001857#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001858 dispatchInts(serial, mSlotId, RIL_REQUEST_CDMA_DELETE_SMS_ON_RUIM, 1, index);
1859 return Void();
1860}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001861
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001862Return<void> RadioImpl::getDeviceIdentity(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001863#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001864 RLOGD("getDeviceIdentity: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001865#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001866 dispatchVoid(serial, mSlotId, RIL_REQUEST_DEVICE_IDENTITY);
1867 return Void();
1868}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001869
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001870Return<void> RadioImpl::exitEmergencyCallbackMode(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001871#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001872 RLOGD("exitEmergencyCallbackMode: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001873#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001874 dispatchVoid(serial, mSlotId, RIL_REQUEST_EXIT_EMERGENCY_CALLBACK_MODE);
1875 return Void();
1876}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001877
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001878Return<void> RadioImpl::getSmscAddress(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001879#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001880 RLOGD("getSmscAddress: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001881#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001882 dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_SMSC_ADDRESS);
1883 return Void();
1884}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001885
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001886Return<void> RadioImpl::setSmscAddress(int32_t serial, const hidl_string& smsc) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001887#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001888 RLOGD("setSmscAddress: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001889#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001890 dispatchString(serial, mSlotId, RIL_REQUEST_SET_SMSC_ADDRESS,
Scott Randolphc7213312017-04-03 14:06:40 -07001891 smsc.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001892 return Void();
1893}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001894
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001895Return<void> RadioImpl::reportSmsMemoryStatus(int32_t serial, bool available) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001896#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001897 RLOGD("reportSmsMemoryStatus: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001898#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001899 dispatchInts(serial, mSlotId, RIL_REQUEST_REPORT_SMS_MEMORY_STATUS, 1,
1900 BOOL_TO_INT(available));
1901 return Void();
1902}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001903
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001904Return<void> RadioImpl::reportStkServiceIsRunning(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001905#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001906 RLOGD("reportStkServiceIsRunning: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001907#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001908 dispatchVoid(serial, mSlotId, RIL_REQUEST_REPORT_STK_SERVICE_IS_RUNNING);
1909 return Void();
1910}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001911
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001912Return<void> RadioImpl::getCdmaSubscriptionSource(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001913#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001914 RLOGD("getCdmaSubscriptionSource: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001915#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001916 dispatchVoid(serial, mSlotId, RIL_REQUEST_CDMA_GET_SUBSCRIPTION_SOURCE);
1917 return Void();
1918}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001919
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001920Return<void> RadioImpl::requestIsimAuthentication(int32_t serial, const hidl_string& challenge) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001921#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001922 RLOGD("requestIsimAuthentication: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001923#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001924 dispatchString(serial, mSlotId, RIL_REQUEST_ISIM_AUTHENTICATION,
Scott Randolphc7213312017-04-03 14:06:40 -07001925 challenge.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001926 return Void();
1927}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001928
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001929Return<void> RadioImpl::acknowledgeIncomingGsmSmsWithPdu(int32_t serial, bool success,
1930 const hidl_string& ackPdu) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001931#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001932 RLOGD("acknowledgeIncomingGsmSmsWithPdu: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001933#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001934 dispatchStrings(serial, mSlotId, RIL_REQUEST_ACKNOWLEDGE_INCOMING_GSM_SMS_WITH_PDU,
Scott Randolphc7213312017-04-03 14:06:40 -07001935 2, success ? "1" : "0", ackPdu.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001936 return Void();
1937}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001938
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001939Return<void> RadioImpl::sendEnvelopeWithStatus(int32_t serial, const hidl_string& contents) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001940#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001941 RLOGD("sendEnvelopeWithStatus: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001942#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001943 dispatchString(serial, mSlotId, RIL_REQUEST_STK_SEND_ENVELOPE_WITH_STATUS,
Scott Randolphc7213312017-04-03 14:06:40 -07001944 contents.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001945 return Void();
1946}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001947
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001948Return<void> RadioImpl::getVoiceRadioTechnology(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001949#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001950 RLOGD("getVoiceRadioTechnology: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001951#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001952 dispatchVoid(serial, mSlotId, RIL_REQUEST_VOICE_RADIO_TECH);
1953 return Void();
1954}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001955
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001956Return<void> RadioImpl::getCellInfoList(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001957#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001958 RLOGD("getCellInfoList: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001959#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001960 dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_CELL_INFO_LIST);
1961 return Void();
1962}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001963
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001964Return<void> RadioImpl::setCellInfoListRate(int32_t serial, int32_t rate) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001965#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001966 RLOGD("setCellInfoListRate: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001967#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001968 dispatchInts(serial, mSlotId, RIL_REQUEST_SET_UNSOL_CELL_INFO_LIST_RATE, 1, rate);
1969 return Void();
1970}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001971
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001972Return<void> RadioImpl::setInitialAttachApn(int32_t serial, const DataProfileInfo& dataProfileInfo,
Jack Yuffc06452017-02-13 11:21:00 -08001973 bool modemCognitive, bool isRoaming) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001974#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001975 RLOGD("setInitialAttachApn: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001976#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001977 RequestInfo *pRI = android::addRequestToList(serial, mSlotId,
1978 RIL_REQUEST_SET_INITIAL_ATTACH_APN);
1979 if (pRI == NULL) {
1980 return Void();
1981 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001982
Jack Yuffc06452017-02-13 11:21:00 -08001983 if (s_vendorFunctions->version <= 14) {
1984 RIL_InitialAttachApn iaa = {};
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001985
Jack Yuffc06452017-02-13 11:21:00 -08001986 if (!copyHidlStringToRil(&iaa.apn, dataProfileInfo.apn, pRI)) {
1987 return Void();
1988 }
1989
1990 const hidl_string &protocol =
1991 (isRoaming ? dataProfileInfo.roamingProtocol : dataProfileInfo.protocol);
1992
1993 if (!copyHidlStringToRil(&iaa.protocol, protocol, pRI)) {
Jack Yu8e732d42017-04-14 00:08:06 -07001994 memsetAndFreeStrings(1, iaa.apn);
Jack Yuffc06452017-02-13 11:21:00 -08001995 return Void();
1996 }
1997 iaa.authtype = (int) dataProfileInfo.authType;
1998 if (!copyHidlStringToRil(&iaa.username, dataProfileInfo.user, pRI)) {
Jack Yu8e732d42017-04-14 00:08:06 -07001999 memsetAndFreeStrings(2, iaa.apn, iaa.protocol);
Jack Yuffc06452017-02-13 11:21:00 -08002000 return Void();
2001 }
2002 if (!copyHidlStringToRil(&iaa.password, dataProfileInfo.password, pRI)) {
Jack Yu8e732d42017-04-14 00:08:06 -07002003 memsetAndFreeStrings(3, iaa.apn, iaa.protocol, iaa.username);
Jack Yuffc06452017-02-13 11:21:00 -08002004 return Void();
2005 }
2006
2007 s_vendorFunctions->onRequest(RIL_REQUEST_SET_INITIAL_ATTACH_APN, &iaa, sizeof(iaa), pRI);
2008
2009 memsetAndFreeStrings(4, iaa.apn, iaa.protocol, iaa.username, iaa.password);
2010 } else {
2011 RIL_InitialAttachApn_v15 iaa = {};
2012
2013 if (!copyHidlStringToRil(&iaa.apn, dataProfileInfo.apn, pRI)) {
2014 return Void();
2015 }
2016 if (!copyHidlStringToRil(&iaa.protocol, dataProfileInfo.protocol, pRI)) {
Jack Yu8e732d42017-04-14 00:08:06 -07002017 memsetAndFreeStrings(1, iaa.apn);
Jack Yuffc06452017-02-13 11:21:00 -08002018 return Void();
2019 }
2020 if (!copyHidlStringToRil(&iaa.roamingProtocol, dataProfileInfo.roamingProtocol, pRI)) {
Jack Yu8e732d42017-04-14 00:08:06 -07002021 memsetAndFreeStrings(2, iaa.apn, iaa.protocol);
Jack Yuffc06452017-02-13 11:21:00 -08002022 return Void();
2023 }
2024 iaa.authtype = (int) dataProfileInfo.authType;
2025 if (!copyHidlStringToRil(&iaa.username, dataProfileInfo.user, pRI)) {
Jack Yu8e732d42017-04-14 00:08:06 -07002026 memsetAndFreeStrings(3, iaa.apn, iaa.protocol, iaa.roamingProtocol);
Jack Yuffc06452017-02-13 11:21:00 -08002027 return Void();
2028 }
2029 if (!copyHidlStringToRil(&iaa.password, dataProfileInfo.password, pRI)) {
Jack Yu8e732d42017-04-14 00:08:06 -07002030 memsetAndFreeStrings(4, iaa.apn, iaa.protocol, iaa.roamingProtocol, iaa.username);
Jack Yuffc06452017-02-13 11:21:00 -08002031 return Void();
2032 }
2033 iaa.supportedTypesBitmask = dataProfileInfo.supportedApnTypesBitmap;
2034 iaa.bearerBitmask = dataProfileInfo.bearerBitmap;
2035 iaa.modemCognitive = BOOL_TO_INT(modemCognitive);
2036 iaa.mtu = dataProfileInfo.mtu;
2037
Jack Yuc13645e2017-04-13 20:55:03 -07002038 if (!convertMvnoTypeToString(dataProfileInfo.mvnoType, iaa.mvnoType)) {
Jack Yuffc06452017-02-13 11:21:00 -08002039 sendErrorResponse(pRI, RIL_E_INVALID_ARGUMENTS);
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 if (!copyHidlStringToRil(&iaa.mvnoMatchData, dataProfileInfo.mvnoMatchData, pRI)) {
Jack Yu8e732d42017-04-14 00:08:06 -07002046 memsetAndFreeStrings(5, iaa.apn, iaa.protocol, iaa.roamingProtocol, iaa.username,
2047 iaa.password);
Jack Yuffc06452017-02-13 11:21:00 -08002048 return Void();
2049 }
2050
2051 s_vendorFunctions->onRequest(RIL_REQUEST_SET_INITIAL_ATTACH_APN, &iaa, sizeof(iaa), pRI);
2052
2053 memsetAndFreeStrings(6, iaa.apn, iaa.protocol, iaa.roamingProtocol, iaa.username,
2054 iaa.password, iaa.mvnoMatchData);
2055 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002056
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002057 return Void();
2058}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002059
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002060Return<void> RadioImpl::getImsRegistrationState(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002061#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002062 RLOGD("getImsRegistrationState: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002063#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002064 dispatchVoid(serial, mSlotId, RIL_REQUEST_IMS_REGISTRATION_STATE);
2065 return Void();
2066}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002067
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002068bool dispatchImsGsmSms(const ImsSmsMessage& message, RequestInfo *pRI) {
Jack Yuf68e0da2017-02-07 14:53:09 -08002069 RIL_IMS_SMS_Message rism = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002070 char **pStrings;
2071 int countStrings = 2;
2072 int dataLen = sizeof(char *) * countStrings;
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002073
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002074 rism.tech = RADIO_TECH_3GPP;
2075 rism.retry = BOOL_TO_INT(message.retry);
2076 rism.messageRef = message.messageRef;
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002077
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002078 if (message.gsmMessage.size() != 1) {
2079 RLOGE("dispatchImsGsmSms: Invalid len %s", requestToString(pRI->pCI->requestNumber));
Jack Yuffc06452017-02-13 11:21:00 -08002080 sendErrorResponse(pRI, RIL_E_INVALID_ARGUMENTS);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002081 return false;
2082 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002083
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002084 pStrings = (char **)calloc(countStrings, sizeof(char *));
2085 if (pStrings == NULL) {
2086 RLOGE("dispatchImsGsmSms: Memory allocation failed for request %s",
2087 requestToString(pRI->pCI->requestNumber));
Jack Yuffc06452017-02-13 11:21:00 -08002088 sendErrorResponse(pRI, RIL_E_NO_MEMORY);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002089 return false;
2090 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002091
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002092 if (!copyHidlStringToRil(&pStrings[0], message.gsmMessage[0].smscPdu, pRI)) {
2093#ifdef MEMSET_FREED
Jack Yub4295a42017-04-14 12:51:49 -07002094 memset(pStrings, 0, dataLen);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002095#endif
2096 free(pStrings);
2097 return false;
2098 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002099
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002100 if (!copyHidlStringToRil(&pStrings[1], message.gsmMessage[0].pdu, pRI)) {
2101 memsetAndFreeStrings(1, pStrings[0]);
2102#ifdef MEMSET_FREED
Jack Yub4295a42017-04-14 12:51:49 -07002103 memset(pStrings, 0, dataLen);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002104#endif
2105 free(pStrings);
2106 return false;
2107 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002108
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002109 rism.message.gsmMessage = pStrings;
2110 s_vendorFunctions->onRequest(pRI->pCI->requestNumber, &rism, sizeof(RIL_RadioTechnologyFamily) +
2111 sizeof(uint8_t) + sizeof(int32_t) + dataLen, pRI);
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002112
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002113 for (int i = 0 ; i < countStrings ; i++) {
2114 memsetAndFreeStrings(1, pStrings[i]);
2115 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002116
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002117#ifdef MEMSET_FREED
Jack Yub4295a42017-04-14 12:51:49 -07002118 memset(pStrings, 0, dataLen);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002119#endif
2120 free(pStrings);
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002121
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002122 return true;
2123}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002124
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002125bool dispatchImsCdmaSms(const ImsSmsMessage& message, RequestInfo *pRI) {
Jack Yu8e732d42017-04-14 00:08:06 -07002126 RIL_IMS_SMS_Message rism = {};
2127 RIL_CDMA_SMS_Message rcsm = {};
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002128
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002129 if (message.cdmaMessage.size() != 1) {
2130 RLOGE("dispatchImsCdmaSms: Invalid len %s", requestToString(pRI->pCI->requestNumber));
Jack Yuffc06452017-02-13 11:21:00 -08002131 sendErrorResponse(pRI, RIL_E_INVALID_ARGUMENTS);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002132 return false;
2133 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002134
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002135 rism.tech = RADIO_TECH_3GPP2;
2136 rism.retry = BOOL_TO_INT(message.retry);
2137 rism.messageRef = message.messageRef;
2138 rism.message.cdmaMessage = &rcsm;
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002139
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002140 constructCdmaSms(rcsm, message.cdmaMessage[0]);
2141
2142 s_vendorFunctions->onRequest(pRI->pCI->requestNumber, &rism, sizeof(RIL_RadioTechnologyFamily) +
2143 sizeof(uint8_t) + sizeof(int32_t) + sizeof(rcsm), pRI);
2144
2145 return true;
2146}
2147
2148Return<void> RadioImpl::sendImsSms(int32_t serial, const ImsSmsMessage& message) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002149#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002150 RLOGD("sendImsSms: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002151#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002152 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_IMS_SEND_SMS);
2153 if (pRI == NULL) {
2154 return Void();
2155 }
2156
2157 RIL_RadioTechnologyFamily format = (RIL_RadioTechnologyFamily) message.tech;
2158
2159 if (RADIO_TECH_3GPP == format) {
2160 dispatchImsGsmSms(message, pRI);
2161 } else if (RADIO_TECH_3GPP2 == format) {
2162 dispatchImsCdmaSms(message, pRI);
2163 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08002164 RLOGE("sendImsSms: Invalid radio tech %s",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002165 requestToString(pRI->pCI->requestNumber));
Jack Yuffc06452017-02-13 11:21:00 -08002166 sendErrorResponse(pRI, RIL_E_INVALID_ARGUMENTS);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002167 }
2168 return Void();
2169}
2170
2171Return<void> RadioImpl::iccTransmitApduBasicChannel(int32_t serial, const SimApdu& message) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002172#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002173 RLOGD("iccTransmitApduBasicChannel: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002174#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002175 dispatchIccApdu(serial, mSlotId, RIL_REQUEST_SIM_TRANSMIT_APDU_BASIC, message);
2176 return Void();
2177}
2178
Wileen Chiu410b7562015-11-23 14:25:22 -08002179Return<void> RadioImpl::iccOpenLogicalChannel(int32_t serial, const hidl_string& aid, int32_t p2) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002180#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002181 RLOGD("iccOpenLogicalChannel: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002182#endif
Wileen Chiu410b7562015-11-23 14:25:22 -08002183 if (s_vendorFunctions->version < 15) {
2184 dispatchString(serial, mSlotId, RIL_REQUEST_SIM_OPEN_CHANNEL, aid.c_str());
2185 } else {
2186 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_SIM_OPEN_CHANNEL);
2187 if (pRI == NULL) {
2188 return Void();
2189 }
2190
Jack Yu8e732d42017-04-14 00:08:06 -07002191 RIL_OpenChannelParams params = {};
Wileen Chiu410b7562015-11-23 14:25:22 -08002192
2193 params.p2 = p2;
2194
2195 if (!copyHidlStringToRil(&params.aidPtr, aid, pRI)) {
2196 return Void();
2197 }
2198
2199 s_vendorFunctions->onRequest(pRI->pCI->requestNumber, &params, sizeof(params), pRI);
2200
2201 memsetAndFreeStrings(1, params.aidPtr);
2202 }
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002203 return Void();
2204}
2205
2206Return<void> RadioImpl::iccCloseLogicalChannel(int32_t serial, int32_t channelId) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002207#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002208 RLOGD("iccCloseLogicalChannel: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002209#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002210 dispatchInts(serial, mSlotId, RIL_REQUEST_SIM_CLOSE_CHANNEL, 1, channelId);
2211 return Void();
2212}
2213
2214Return<void> RadioImpl::iccTransmitApduLogicalChannel(int32_t serial, const SimApdu& message) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002215#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002216 RLOGD("iccTransmitApduLogicalChannel: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002217#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002218 dispatchIccApdu(serial, mSlotId, RIL_REQUEST_SIM_TRANSMIT_APDU_CHANNEL, message);
2219 return Void();
2220}
2221
2222Return<void> RadioImpl::nvReadItem(int32_t serial, NvItem itemId) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002223#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002224 RLOGD("nvReadItem: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002225#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002226 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_NV_READ_ITEM);
2227 if (pRI == NULL) {
2228 return Void();
2229 }
2230
Jack Yu8e732d42017-04-14 00:08:06 -07002231 RIL_NV_ReadItem nvri = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002232 nvri.itemID = (RIL_NV_Item) itemId;
2233
2234 s_vendorFunctions->onRequest(pRI->pCI->requestNumber, &nvri, sizeof(nvri), pRI);
2235 return Void();
2236}
2237
2238Return<void> RadioImpl::nvWriteItem(int32_t serial, const NvWriteItem& item) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002239#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002240 RLOGD("nvWriteItem: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002241#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002242 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_NV_WRITE_ITEM);
2243 if (pRI == NULL) {
2244 return Void();
2245 }
2246
Jack Yu8e732d42017-04-14 00:08:06 -07002247 RIL_NV_WriteItem nvwi = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002248
2249 nvwi.itemID = (RIL_NV_Item) item.itemId;
2250
2251 if (!copyHidlStringToRil(&nvwi.value, item.value, pRI)) {
2252 return Void();
2253 }
2254
2255 s_vendorFunctions->onRequest(pRI->pCI->requestNumber, &nvwi, sizeof(nvwi), pRI);
2256
2257 memsetAndFreeStrings(1, nvwi.value);
2258 return Void();
2259}
2260
2261Return<void> RadioImpl::nvWriteCdmaPrl(int32_t serial, const hidl_vec<uint8_t>& prl) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002262#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002263 RLOGD("nvWriteCdmaPrl: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002264#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002265 dispatchRaw(serial, mSlotId, RIL_REQUEST_NV_WRITE_CDMA_PRL, prl);
2266 return Void();
2267}
2268
2269Return<void> RadioImpl::nvResetConfig(int32_t serial, ResetNvType resetType) {
Jayachandran C32763f02017-04-30 10:21:14 -07002270 int rilResetType = -1;
Jayachandran C572f2f42017-03-25 14:30:13 -07002271#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002272 RLOGD("nvResetConfig: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002273#endif
Jayachandran C32763f02017-04-30 10:21:14 -07002274 /* Convert ResetNvType to RIL.h values
2275 * RIL_REQUEST_NV_RESET_CONFIG
2276 * 1 - reload all NV items
2277 * 2 - erase NV reset (SCRTN)
2278 * 3 - factory reset (RTN)
2279 */
2280 switch(resetType) {
2281 case ResetNvType::RELOAD:
2282 rilResetType = 1;
2283 break;
2284 case ResetNvType::ERASE:
2285 rilResetType = 2;
2286 break;
2287 case ResetNvType::FACTORY_RESET:
2288 rilResetType = 3;
2289 break;
2290 }
2291 dispatchInts(serial, mSlotId, RIL_REQUEST_NV_RESET_CONFIG, 1, rilResetType);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002292 return Void();
2293}
2294
2295Return<void> RadioImpl::setUiccSubscription(int32_t serial, const SelectUiccSub& uiccSub) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002296#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002297 RLOGD("setUiccSubscription: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002298#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002299 RequestInfo *pRI = android::addRequestToList(serial, mSlotId,
2300 RIL_REQUEST_SET_UICC_SUBSCRIPTION);
2301 if (pRI == NULL) {
2302 return Void();
2303 }
2304
Jack Yuf68e0da2017-02-07 14:53:09 -08002305 RIL_SelectUiccSub rilUiccSub = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002306
2307 rilUiccSub.slot = uiccSub.slot;
2308 rilUiccSub.app_index = uiccSub.appIndex;
2309 rilUiccSub.sub_type = (RIL_SubscriptionType) uiccSub.subType;
2310 rilUiccSub.act_status = (RIL_UiccSubActStatus) uiccSub.actStatus;
2311
2312 s_vendorFunctions->onRequest(pRI->pCI->requestNumber, &rilUiccSub, sizeof(rilUiccSub), pRI);
2313 return Void();
2314}
2315
2316Return<void> RadioImpl::setDataAllowed(int32_t serial, bool allow) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002317#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002318 RLOGD("setDataAllowed: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002319#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002320 dispatchInts(serial, mSlotId, RIL_REQUEST_ALLOW_DATA, 1, BOOL_TO_INT(allow));
2321 return Void();
2322}
2323
2324Return<void> RadioImpl::getHardwareConfig(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002325#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002326 RLOGD("getHardwareConfig: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002327#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002328 dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_HARDWARE_CONFIG);
2329 return Void();
2330}
2331
2332Return<void> RadioImpl::requestIccSimAuthentication(int32_t serial, int32_t authContext,
2333 const hidl_string& authData, const hidl_string& aid) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002334#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002335 RLOGD("requestIccSimAuthentication: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002336#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002337 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_SIM_AUTHENTICATION);
2338 if (pRI == NULL) {
2339 return Void();
2340 }
2341
Jack Yu8e732d42017-04-14 00:08:06 -07002342 RIL_SimAuthentication pf = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002343
2344 pf.authContext = authContext;
2345
2346 int len;
2347 if (!copyHidlStringToRil(&pf.authData, authData, pRI)) {
2348 return Void();
2349 }
2350
2351 if (!copyHidlStringToRil(&pf.aid, aid, pRI)) {
2352 memsetAndFreeStrings(1, pf.authData);
2353 return Void();
2354 }
2355
2356 s_vendorFunctions->onRequest(pRI->pCI->requestNumber, &pf, sizeof(pf), pRI);
2357
2358 memsetAndFreeStrings(2, pf.authData, pf.aid);
2359 return Void();
2360}
2361
2362/**
Jack Yuffc06452017-02-13 11:21:00 -08002363 * @param numProfiles number of data profile
2364 * @param dataProfiles the pointer to the actual data profiles. The acceptable type is
2365 RIL_DataProfileInfo or RIL_DataProfileInfo_v15.
2366 * @param dataProfilePtrs the pointer to the pointers that point to each data profile structure
2367 * @param numfields number of string-type member in the data profile structure
2368 * @param ... the variadic parameters are pointers to each string-type member
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002369 **/
Jack Yuffc06452017-02-13 11:21:00 -08002370template <typename T>
2371void freeSetDataProfileData(int numProfiles, T *dataProfiles, T **dataProfilePtrs,
2372 int numfields, ...) {
2373 va_list args;
2374 va_start(args, numfields);
2375
2376 // Iterate through each string-type field that need to be free.
2377 for (int i = 0; i < numfields; i++) {
2378 // Iterate through each data profile and free that specific string-type field.
2379 // The type 'char *T::*' is a type of pointer to a 'char *' member inside T structure.
2380 char *T::*ptr = va_arg(args, char *T::*);
2381 for (int j = 0; j < numProfiles; j++) {
2382 memsetAndFreeStrings(1, dataProfiles[j].*ptr);
2383 }
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002384 }
2385
Jack Yuffc06452017-02-13 11:21:00 -08002386 va_end(args);
2387
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002388#ifdef MEMSET_FREED
Jack Yuffc06452017-02-13 11:21:00 -08002389 memset(dataProfiles, 0, numProfiles * sizeof(T));
2390 memset(dataProfilePtrs, 0, numProfiles * sizeof(T *));
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002391#endif
2392 free(dataProfiles);
2393 free(dataProfilePtrs);
2394}
2395
Jack Yuffc06452017-02-13 11:21:00 -08002396Return<void> RadioImpl::setDataProfile(int32_t serial, const hidl_vec<DataProfileInfo>& profiles,
2397 bool isRoaming) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002398#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002399 RLOGD("setDataProfile: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002400#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002401 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_SET_DATA_PROFILE);
2402 if (pRI == NULL) {
2403 return Void();
2404 }
2405
Jack Yuffc06452017-02-13 11:21:00 -08002406 size_t num = profiles.size();
2407 bool success = false;
2408
2409 if (s_vendorFunctions->version <= 14) {
2410
2411 RIL_DataProfileInfo *dataProfiles =
2412 (RIL_DataProfileInfo *) calloc(num, sizeof(RIL_DataProfileInfo));
2413
2414 if (dataProfiles == NULL) {
2415 RLOGE("Memory allocation failed for request %s",
2416 requestToString(pRI->pCI->requestNumber));
2417 sendErrorResponse(pRI, RIL_E_NO_MEMORY);
2418 return Void();
2419 }
2420
2421 RIL_DataProfileInfo **dataProfilePtrs =
2422 (RIL_DataProfileInfo **) calloc(num, sizeof(RIL_DataProfileInfo *));
2423 if (dataProfilePtrs == NULL) {
2424 RLOGE("Memory allocation failed for request %s",
2425 requestToString(pRI->pCI->requestNumber));
2426 free(dataProfiles);
2427 sendErrorResponse(pRI, RIL_E_NO_MEMORY);
2428 return Void();
2429 }
2430
2431 for (size_t i = 0; i < num; i++) {
2432 dataProfilePtrs[i] = &dataProfiles[i];
2433
2434 success = copyHidlStringToRil(&dataProfiles[i].apn, profiles[i].apn, pRI);
2435
2436 const hidl_string &protocol =
2437 (isRoaming ? profiles[i].roamingProtocol : profiles[i].protocol);
2438
2439 if (success && !copyHidlStringToRil(&dataProfiles[i].protocol, protocol, pRI)) {
2440 success = false;
2441 }
2442
2443 if (success && !copyHidlStringToRil(&dataProfiles[i].user, profiles[i].user, pRI)) {
2444 success = false;
2445 }
2446 if (success && !copyHidlStringToRil(&dataProfiles[i].password, profiles[i].password,
2447 pRI)) {
2448 success = false;
2449 }
2450
2451 if (!success) {
2452 freeSetDataProfileData(num, dataProfiles, dataProfilePtrs, 4,
2453 &RIL_DataProfileInfo::apn, &RIL_DataProfileInfo::protocol,
2454 &RIL_DataProfileInfo::user, &RIL_DataProfileInfo::password);
2455 return Void();
2456 }
2457
2458 dataProfiles[i].profileId = (RIL_DataProfile) profiles[i].profileId;
2459 dataProfiles[i].authType = (int) profiles[i].authType;
2460 dataProfiles[i].type = (int) profiles[i].type;
2461 dataProfiles[i].maxConnsTime = profiles[i].maxConnsTime;
2462 dataProfiles[i].maxConns = profiles[i].maxConns;
2463 dataProfiles[i].waitTime = profiles[i].waitTime;
2464 dataProfiles[i].enabled = BOOL_TO_INT(profiles[i].enabled);
2465 }
2466
2467 s_vendorFunctions->onRequest(RIL_REQUEST_SET_DATA_PROFILE, dataProfilePtrs,
2468 num * sizeof(RIL_DataProfileInfo *), pRI);
2469
2470 freeSetDataProfileData(num, dataProfiles, dataProfilePtrs, 4,
2471 &RIL_DataProfileInfo::apn, &RIL_DataProfileInfo::protocol,
2472 &RIL_DataProfileInfo::user, &RIL_DataProfileInfo::password);
2473 } else {
2474 RIL_DataProfileInfo_v15 *dataProfiles =
2475 (RIL_DataProfileInfo_v15 *) calloc(num, sizeof(RIL_DataProfileInfo_v15));
2476
2477 if (dataProfiles == NULL) {
2478 RLOGE("Memory allocation failed for request %s",
2479 requestToString(pRI->pCI->requestNumber));
2480 sendErrorResponse(pRI, RIL_E_NO_MEMORY);
2481 return Void();
2482 }
2483
2484 RIL_DataProfileInfo_v15 **dataProfilePtrs =
2485 (RIL_DataProfileInfo_v15 **) calloc(num, sizeof(RIL_DataProfileInfo_v15 *));
2486 if (dataProfilePtrs == NULL) {
2487 RLOGE("Memory allocation failed for request %s",
2488 requestToString(pRI->pCI->requestNumber));
2489 free(dataProfiles);
2490 sendErrorResponse(pRI, RIL_E_NO_MEMORY);
2491 return Void();
2492 }
2493
2494 for (size_t i = 0; i < num; i++) {
2495 dataProfilePtrs[i] = &dataProfiles[i];
2496
2497 success = copyHidlStringToRil(&dataProfiles[i].apn, profiles[i].apn, pRI);
2498 if (success && !copyHidlStringToRil(&dataProfiles[i].protocol, profiles[i].protocol,
2499 pRI)) {
2500 success = false;
2501 }
2502 if (success && !copyHidlStringToRil(&dataProfiles[i].roamingProtocol,
2503 profiles[i].roamingProtocol, pRI)) {
2504 success = false;
2505 }
2506 if (success && !copyHidlStringToRil(&dataProfiles[i].user, profiles[i].user, pRI)) {
2507 success = false;
2508 }
2509 if (success && !copyHidlStringToRil(&dataProfiles[i].password, profiles[i].password,
2510 pRI)) {
2511 success = false;
2512 }
Jack Yuffc06452017-02-13 11:21:00 -08002513 if (success && !copyHidlStringToRil(&dataProfiles[i].mvnoMatchData,
2514 profiles[i].mvnoMatchData, pRI)) {
2515 success = false;
2516 }
2517
Jack Yuc13645e2017-04-13 20:55:03 -07002518 if (success && !convertMvnoTypeToString(profiles[i].mvnoType,
2519 dataProfiles[i].mvnoType)) {
2520 sendErrorResponse(pRI, RIL_E_INVALID_ARGUMENTS);
2521 success = false;
Jack Yuffc06452017-02-13 11:21:00 -08002522 }
2523
2524 if (!success) {
2525 freeSetDataProfileData(num, dataProfiles, dataProfilePtrs, 6,
2526 &RIL_DataProfileInfo_v15::apn, &RIL_DataProfileInfo_v15::protocol,
2527 &RIL_DataProfileInfo_v15::roamingProtocol, &RIL_DataProfileInfo_v15::user,
2528 &RIL_DataProfileInfo_v15::password, &RIL_DataProfileInfo_v15::mvnoMatchData);
2529 return Void();
2530 }
2531
2532 dataProfiles[i].profileId = (RIL_DataProfile) profiles[i].profileId;
2533 dataProfiles[i].authType = (int) profiles[i].authType;
2534 dataProfiles[i].type = (int) profiles[i].type;
2535 dataProfiles[i].maxConnsTime = profiles[i].maxConnsTime;
2536 dataProfiles[i].maxConns = profiles[i].maxConns;
2537 dataProfiles[i].waitTime = profiles[i].waitTime;
2538 dataProfiles[i].enabled = BOOL_TO_INT(profiles[i].enabled);
2539 dataProfiles[i].supportedTypesBitmask = profiles[i].supportedApnTypesBitmap;
2540 dataProfiles[i].bearerBitmask = profiles[i].bearerBitmap;
2541 dataProfiles[i].mtu = profiles[i].mtu;
2542 }
2543
2544 s_vendorFunctions->onRequest(RIL_REQUEST_SET_DATA_PROFILE, dataProfilePtrs,
2545 num * sizeof(RIL_DataProfileInfo_v15 *), pRI);
2546
2547 freeSetDataProfileData(num, dataProfiles, dataProfilePtrs, 6,
2548 &RIL_DataProfileInfo_v15::apn, &RIL_DataProfileInfo_v15::protocol,
2549 &RIL_DataProfileInfo_v15::roamingProtocol, &RIL_DataProfileInfo_v15::user,
2550 &RIL_DataProfileInfo_v15::password, &RIL_DataProfileInfo_v15::mvnoMatchData);
2551 }
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002552
2553 return Void();
2554}
2555
2556Return<void> RadioImpl::requestShutdown(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002557#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002558 RLOGD("requestShutdown: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002559#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002560 dispatchVoid(serial, mSlotId, RIL_REQUEST_SHUTDOWN);
2561 return Void();
2562}
2563
2564Return<void> RadioImpl::getRadioCapability(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002565#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002566 RLOGD("getRadioCapability: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002567#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002568 dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_RADIO_CAPABILITY);
2569 return Void();
2570}
2571
2572Return<void> RadioImpl::setRadioCapability(int32_t serial, const RadioCapability& rc) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002573#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002574 RLOGD("setRadioCapability: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002575#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002576 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_SET_RADIO_CAPABILITY);
2577 if (pRI == NULL) {
2578 return Void();
2579 }
2580
Jack Yu8e732d42017-04-14 00:08:06 -07002581 RIL_RadioCapability rilRc = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002582
2583 // TODO : set rilRc.version using HIDL version ?
2584 rilRc.session = rc.session;
2585 rilRc.phase = (int) rc.phase;
2586 rilRc.rat = (int) rc.raf;
2587 rilRc.status = (int) rc.status;
Scott Randolphc7213312017-04-03 14:06:40 -07002588 strncpy(rilRc.logicalModemUuid, rc.logicalModemUuid.c_str(), MAX_UUID_LENGTH);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002589
2590 s_vendorFunctions->onRequest(pRI->pCI->requestNumber, &rilRc, sizeof(rilRc), pRI);
2591
2592 return Void();
2593}
2594
2595Return<void> RadioImpl::startLceService(int32_t serial, int32_t reportInterval, bool pullMode) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002596#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002597 RLOGD("startLceService: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002598#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002599 dispatchInts(serial, mSlotId, RIL_REQUEST_START_LCE, 2, reportInterval,
2600 BOOL_TO_INT(pullMode));
2601 return Void();
2602}
2603
2604Return<void> RadioImpl::stopLceService(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002605#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002606 RLOGD("stopLceService: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002607#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002608 dispatchVoid(serial, mSlotId, RIL_REQUEST_STOP_LCE);
2609 return Void();
2610}
2611
2612Return<void> RadioImpl::pullLceData(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002613#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002614 RLOGD("pullLceData: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002615#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002616 dispatchVoid(serial, mSlotId, RIL_REQUEST_PULL_LCEDATA);
2617 return Void();
2618}
2619
2620Return<void> RadioImpl::getModemActivityInfo(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002621#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002622 RLOGD("getModemActivityInfo: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002623#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002624 dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_ACTIVITY_INFO);
2625 return Void();
2626}
2627
2628Return<void> RadioImpl::setAllowedCarriers(int32_t serial, bool allAllowed,
2629 const CarrierRestrictions& carriers) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002630#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002631 RLOGD("setAllowedCarriers: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002632#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002633 RequestInfo *pRI = android::addRequestToList(serial, mSlotId,
2634 RIL_REQUEST_SET_CARRIER_RESTRICTIONS);
2635 if (pRI == NULL) {
2636 return Void();
2637 }
2638
Jack Yuf68e0da2017-02-07 14:53:09 -08002639 RIL_CarrierRestrictions cr = {};
Jack Yu11ab4042017-02-21 17:08:01 -08002640 RIL_Carrier *allowedCarriers = NULL;
2641 RIL_Carrier *excludedCarriers = NULL;
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002642
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002643 cr.len_allowed_carriers = carriers.allowedCarriers.size();
2644 allowedCarriers = (RIL_Carrier *)calloc(cr.len_allowed_carriers, sizeof(RIL_Carrier));
2645 if (allowedCarriers == NULL) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08002646 RLOGE("setAllowedCarriers: Memory allocation failed for request %s",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002647 requestToString(pRI->pCI->requestNumber));
Jack Yuffc06452017-02-13 11:21:00 -08002648 sendErrorResponse(pRI, RIL_E_NO_MEMORY);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002649 return Void();
2650 }
2651 cr.allowed_carriers = allowedCarriers;
2652
2653 cr.len_excluded_carriers = carriers.excludedCarriers.size();
2654 excludedCarriers = (RIL_Carrier *)calloc(cr.len_excluded_carriers, sizeof(RIL_Carrier));
2655 if (excludedCarriers == NULL) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08002656 RLOGE("setAllowedCarriers: Memory allocation failed for request %s",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002657 requestToString(pRI->pCI->requestNumber));
Jack Yuffc06452017-02-13 11:21:00 -08002658 sendErrorResponse(pRI, RIL_E_NO_MEMORY);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002659#ifdef MEMSET_FREED
2660 memset(allowedCarriers, 0, cr.len_allowed_carriers * sizeof(RIL_Carrier));
2661#endif
2662 free(allowedCarriers);
2663 return Void();
2664 }
2665 cr.excluded_carriers = excludedCarriers;
2666
2667 for (int i = 0; i < cr.len_allowed_carriers; i++) {
Scott Randolphc7213312017-04-03 14:06:40 -07002668 allowedCarriers[i].mcc = carriers.allowedCarriers[i].mcc.c_str();
2669 allowedCarriers[i].mnc = carriers.allowedCarriers[i].mnc.c_str();
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002670 allowedCarriers[i].match_type = (RIL_CarrierMatchType) carriers.allowedCarriers[i].matchType;
Scott Randolphc7213312017-04-03 14:06:40 -07002671 allowedCarriers[i].match_data = carriers.allowedCarriers[i].matchData.c_str();
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002672 }
2673
Amit Mahajan3f510f62017-03-01 10:26:58 -08002674 for (int i = 0; i < cr.len_excluded_carriers; i++) {
Scott Randolphc7213312017-04-03 14:06:40 -07002675 excludedCarriers[i].mcc = carriers.excludedCarriers[i].mcc.c_str();
2676 excludedCarriers[i].mnc = carriers.excludedCarriers[i].mnc.c_str();
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002677 excludedCarriers[i].match_type =
2678 (RIL_CarrierMatchType) carriers.excludedCarriers[i].matchType;
Scott Randolphc7213312017-04-03 14:06:40 -07002679 excludedCarriers[i].match_data = carriers.excludedCarriers[i].matchData.c_str();
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002680 }
2681
2682 s_vendorFunctions->onRequest(pRI->pCI->requestNumber, &cr, sizeof(RIL_CarrierRestrictions), pRI);
2683
2684#ifdef MEMSET_FREED
2685 memset(allowedCarriers, 0, cr.len_allowed_carriers * sizeof(RIL_Carrier));
2686 memset(excludedCarriers, 0, cr.len_excluded_carriers * sizeof(RIL_Carrier));
2687#endif
2688 free(allowedCarriers);
2689 free(excludedCarriers);
2690 return Void();
2691}
2692
2693Return<void> RadioImpl::getAllowedCarriers(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002694#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002695 RLOGD("getAllowedCarriers: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002696#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002697 dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_CARRIER_RESTRICTIONS);
2698 return Void();
2699}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002700
Jack Yu11ab4042017-02-21 17:08:01 -08002701Return<void> RadioImpl::sendDeviceState(int32_t serial, DeviceStateType deviceStateType,
2702 bool state) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002703#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002704 RLOGD("sendDeviceState: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002705#endif
Jack Yu11ab4042017-02-21 17:08:01 -08002706 if (s_vendorFunctions->version < 15) {
2707 if (deviceStateType == DeviceStateType::LOW_DATA_EXPECTED) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08002708 RLOGD("sendDeviceState: calling screen state %d", BOOL_TO_INT(!state));
Jack Yu11ab4042017-02-21 17:08:01 -08002709 dispatchInts(serial, mSlotId, RIL_REQUEST_SCREEN_STATE, 1, BOOL_TO_INT(!state));
2710 } else {
2711 RequestInfo *pRI = android::addRequestToList(serial, mSlotId,
2712 RIL_REQUEST_SEND_DEVICE_STATE);
2713 sendErrorResponse(pRI, RIL_E_REQUEST_NOT_SUPPORTED);
2714 }
2715 return Void();
2716 }
2717 dispatchInts(serial, mSlotId, RIL_REQUEST_SEND_DEVICE_STATE, 2, (int) deviceStateType,
2718 BOOL_TO_INT(state));
2719 return Void();
2720}
2721
2722Return<void> RadioImpl::setIndicationFilter(int32_t serial, int32_t indicationFilter) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002723#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002724 RLOGD("setIndicationFilter: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002725#endif
Jack Yu11ab4042017-02-21 17:08:01 -08002726 if (s_vendorFunctions->version < 15) {
2727 RequestInfo *pRI = android::addRequestToList(serial, mSlotId,
2728 RIL_REQUEST_SET_UNSOLICITED_RESPONSE_FILTER);
2729 sendErrorResponse(pRI, RIL_E_REQUEST_NOT_SUPPORTED);
2730 return Void();
2731 }
2732 dispatchInts(serial, mSlotId, RIL_REQUEST_SET_UNSOLICITED_RESPONSE_FILTER, 1, indicationFilter);
2733 return Void();
2734}
2735
Wileen Chiu718c0bf2017-01-04 11:37:19 -08002736Return<void> RadioImpl::setSimCardPower(int32_t serial, bool powerUp) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002737#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002738 RLOGD("setSimCardPower: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002739#endif
Wileen Chiu718c0bf2017-01-04 11:37:19 -08002740 dispatchInts(serial, mSlotId, RIL_REQUEST_SET_SIM_CARD_POWER, 1, BOOL_TO_INT(powerUp));
2741 return Void();
2742}
2743
Grace Chen797c1c22017-03-23 18:39:48 -07002744Return<void> RadioImpl::setSimCardPower_1_1(int32_t serial,
2745 const ::android::hardware::radio::V1_1::CardPowerState state) {
2746#if VDBG
2747 RLOGD("setSimCardPower_1_1: serial %d state %d", serial, state);
2748#endif
2749 dispatchInts(serial, mSlotId, RIL_REQUEST_SET_SIM_CARD_POWER, 1, state);
2750 return Void();
2751}
2752
Sanket Padawef220dc52017-01-02 23:46:00 -08002753Return<void> RadioImpl::responseAcknowledgement() {
2754 android::releaseWakeLock();
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002755 return Void();
Sanket Padawef220dc52017-01-02 23:46:00 -08002756}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002757
Amit Mahajan439da362017-02-13 17:43:04 -08002758Return<void> OemHookImpl::setResponseFunctions(
2759 const ::android::sp<IOemHookResponse>& oemHookResponseParam,
2760 const ::android::sp<IOemHookIndication>& oemHookIndicationParam) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002761#if VDBG
Amit Mahajan439da362017-02-13 17:43:04 -08002762 RLOGD("OemHookImpl::setResponseFunctions");
Jayachandran C572f2f42017-03-25 14:30:13 -07002763#endif
Amit Mahajan439da362017-02-13 17:43:04 -08002764
2765 pthread_rwlock_t *radioServiceRwlockPtr = radio::getRadioServiceRwlock(mSlotId);
2766 int ret = pthread_rwlock_wrlock(radioServiceRwlockPtr);
2767 assert(ret == 0);
2768
2769 mOemHookResponse = oemHookResponseParam;
2770 mOemHookIndication = oemHookIndicationParam;
Amit Mahajand423d192017-03-16 17:04:01 -07002771 mCounterOemHook[mSlotId]++;
Amit Mahajan439da362017-02-13 17:43:04 -08002772
2773 ret = pthread_rwlock_unlock(radioServiceRwlockPtr);
2774 assert(ret == 0);
2775
2776 return Void();
2777}
2778
2779Return<void> OemHookImpl::sendRequestRaw(int32_t serial, const hidl_vec<uint8_t>& data) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002780#if VDBG
Amit Mahajan439da362017-02-13 17:43:04 -08002781 RLOGD("OemHookImpl::sendRequestRaw: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002782#endif
Amit Mahajan439da362017-02-13 17:43:04 -08002783 dispatchRaw(serial, mSlotId, RIL_REQUEST_OEM_HOOK_RAW, data);
2784 return Void();
2785}
2786
2787Return<void> OemHookImpl::sendRequestStrings(int32_t serial,
2788 const hidl_vec<hidl_string>& data) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002789#if VDBG
Amit Mahajan439da362017-02-13 17:43:04 -08002790 RLOGD("OemHookImpl::sendRequestStrings: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002791#endif
Amit Mahajan439da362017-02-13 17:43:04 -08002792 dispatchStrings(serial, mSlotId, RIL_REQUEST_OEM_HOOK_STRINGS, data);
2793 return Void();
2794}
2795
pkanwarc61837e2017-03-17 12:49:34 -07002796Return<void> RadioImpl::setCarrierInfoForImsiEncryption(int32_t serial,
pkanwarb10761e2017-05-21 10:24:30 -07002797 const ::android::hardware::radio::V1_1::ImsiEncryptionInfo& data) {
pkanwarc61837e2017-03-17 12:49:34 -07002798 RLOGD("setCarrierInfoForImsiEncryption: serial %d", serial);
pkanwarb10761e2017-05-21 10:24:30 -07002799 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_SET_CARRIER_INFO_IMSI_ENCRYPTION);
2800 RIL_CarrierInfoForImsiEncryption imsiEncryption = {};
2801
2802 if (!copyHidlStringToRil(&imsiEncryption.mnc, data.mnc, pRI)) {
2803 return Void();
2804 }
2805 if (!copyHidlStringToRil(&imsiEncryption.mcc, data.mcc, pRI)) {
2806 memsetAndFreeStrings(1, imsiEncryption.mnc);
2807 return Void();
2808 }
2809 if (!copyHidlStringToRil(&imsiEncryption.keyIdentifier, data.keyIdentifier, pRI)) {
2810 memsetAndFreeStrings(2, imsiEncryption.mnc, imsiEncryption.mcc);
2811 return Void();
2812 }
2813 int32_t lSize = data.carrierKey.size();
2814 imsiEncryption.carrierKey = new uint8_t[lSize];
2815 memcpy(imsiEncryption.carrierKey, data.carrierKey.data(), lSize);
2816 imsiEncryption.expirationTime = data.expirationTime;
2817 s_vendorFunctions->onRequest(pRI->pCI->requestNumber, &imsiEncryption, sizeof(RIL_CarrierInfoForImsiEncryption), pRI);
2818 delete(imsiEncryption.carrierKey);
pkanwarc61837e2017-03-17 12:49:34 -07002819 return Void();
2820}
2821
Nathan Harold6942b212017-05-25 16:10:35 -07002822Return<void> RadioImpl::startKeepalive(int32_t serial, const KeepaliveRequest& keepalive) {
2823 RLOGD("startKeepalive: serial %d", serial);
2824 return Void();
2825}
2826
2827Return<void> RadioImpl::stopKeepalive(int32_t serial, int32_t sessionHandle) {
2828 RLOGD("stopKeepalive: serial %d", serial);
2829 return Void();
2830}
2831
2832
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002833/***************************************************************************************************
2834 * RESPONSE FUNCTIONS
2835 * Functions above are used for requests going from framework to vendor code. The ones below are
2836 * responses for those requests coming back from the vendor code.
2837 **************************************************************************************************/
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002838
Sanket Padawef220dc52017-01-02 23:46:00 -08002839void radio::acknowledgeRequest(int slotId, int serial) {
2840 if (radioService[slotId]->mRadioResponse != NULL) {
Amit Mahajan17249842017-01-19 15:05:45 -08002841 Return<void> retStatus = radioService[slotId]->mRadioResponse->acknowledgeRequest(serial);
2842 radioService[slotId]->checkReturnStatus(retStatus);
Sanket Padawef220dc52017-01-02 23:46:00 -08002843 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08002844 RLOGE("acknowledgeRequest: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawef220dc52017-01-02 23:46:00 -08002845 }
2846}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002847
Sanket Padawef220dc52017-01-02 23:46:00 -08002848void populateResponseInfo(RadioResponseInfo& responseInfo, int serial, int responseType,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002849 RIL_Errno e) {
Sanket Padawef220dc52017-01-02 23:46:00 -08002850 responseInfo.serial = serial;
2851 switch (responseType) {
2852 case RESPONSE_SOLICITED:
2853 responseInfo.type = RadioResponseType::SOLICITED;
2854 break;
2855 case RESPONSE_SOLICITED_ACK_EXP:
2856 responseInfo.type = RadioResponseType::SOLICITED_ACK_EXP;
2857 break;
2858 }
2859 responseInfo.error = (RadioError) e;
2860}
2861
Naveen Kalla346bbc02017-03-16 12:55:55 -07002862int responseIntOrEmpty(RadioResponseInfo& responseInfo, int serial, int responseType, RIL_Errno e,
2863 void *response, size_t responseLen) {
2864 populateResponseInfo(responseInfo, serial, responseType, e);
2865 int ret = -1;
2866
2867 if (response == NULL && responseLen == 0) {
2868 // Earlier RILs did not send a response for some cases although the interface
2869 // expected an integer as response. Do not return error if response is empty. Instead
2870 // Return -1 in those cases to maintain backward compatibility.
2871 } else if (response == NULL || responseLen != sizeof(int)) {
2872 RLOGE("responseIntOrEmpty: Invalid response");
2873 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
2874 } else {
2875 int *p_int = (int *) response;
2876 ret = p_int[0];
2877 }
2878 return ret;
2879}
2880
Sanket Padawef220dc52017-01-02 23:46:00 -08002881int responseInt(RadioResponseInfo& responseInfo, int serial, int responseType, RIL_Errno e,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002882 void *response, size_t responseLen) {
Sanket Padawef220dc52017-01-02 23:46:00 -08002883 populateResponseInfo(responseInfo, serial, responseType, e);
2884 int ret = -1;
2885
2886 if (response == NULL || responseLen != sizeof(int)) {
2887 RLOGE("responseInt: Invalid response");
2888 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
2889 } else {
2890 int *p_int = (int *) response;
2891 ret = p_int[0];
2892 }
2893 return ret;
2894}
2895
Amit Mahajan759786a2017-03-03 17:35:47 -08002896int radio::getIccCardStatusResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002897 int responseType, int serial, RIL_Errno e,
2898 void *response, size_t responseLen) {
Sanket Padawef220dc52017-01-02 23:46:00 -08002899 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08002900 RadioResponseInfo responseInfo = {};
Sanket Padawef220dc52017-01-02 23:46:00 -08002901 populateResponseInfo(responseInfo, serial, responseType, e);
Jack Yuf68e0da2017-02-07 14:53:09 -08002902 CardStatus cardStatus = {};
Nathan Harold402dc022017-06-08 16:41:52 -07002903 RIL_CardStatus_v6 *p_cur = ((RIL_CardStatus_v6 *) response);
2904 if (response == NULL || responseLen != sizeof(RIL_CardStatus_v6)
2905 || p_cur->gsm_umts_subscription_app_index >= p_cur->num_applications
2906 || p_cur->cdma_subscription_app_index >= p_cur->num_applications
2907 || p_cur->ims_subscription_app_index >= p_cur->num_applications) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08002908 RLOGE("getIccCardStatusResponse: Invalid response");
Sanket Padawef220dc52017-01-02 23:46:00 -08002909 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002910 } else {
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002911 cardStatus.cardState = (CardState) p_cur->card_state;
2912 cardStatus.universalPinState = (PinState) p_cur->universal_pin_state;
2913 cardStatus.gsmUmtsSubscriptionAppIndex = p_cur->gsm_umts_subscription_app_index;
2914 cardStatus.cdmaSubscriptionAppIndex = p_cur->cdma_subscription_app_index;
2915 cardStatus.imsSubscriptionAppIndex = p_cur->ims_subscription_app_index;
2916
2917 RIL_AppStatus *rilAppStatus = p_cur->applications;
2918 cardStatus.applications.resize(p_cur->num_applications);
2919 AppStatus *appStatus = cardStatus.applications.data();
Jayachandran C572f2f42017-03-25 14:30:13 -07002920#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002921 RLOGD("getIccCardStatusResponse: num_applications %d", p_cur->num_applications);
Jayachandran C572f2f42017-03-25 14:30:13 -07002922#endif
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002923 for (int i = 0; i < p_cur->num_applications; i++) {
2924 appStatus[i].appType = (AppType) rilAppStatus[i].app_type;
2925 appStatus[i].appState = (AppState) rilAppStatus[i].app_state;
2926 appStatus[i].persoSubstate = (PersoSubstate) rilAppStatus[i].perso_substate;
2927 appStatus[i].aidPtr = convertCharPtrToHidlString(rilAppStatus[i].aid_ptr);
2928 appStatus[i].appLabelPtr = convertCharPtrToHidlString(
2929 rilAppStatus[i].app_label_ptr);
2930 appStatus[i].pin1Replaced = rilAppStatus[i].pin1_replaced;
2931 appStatus[i].pin1 = (PinState) rilAppStatus[i].pin1;
2932 appStatus[i].pin2 = (PinState) rilAppStatus[i].pin2;
2933 }
2934 }
2935
Amit Mahajan17249842017-01-19 15:05:45 -08002936 Return<void> retStatus = radioService[slotId]->mRadioResponse->
2937 getIccCardStatusResponse(responseInfo, cardStatus);
2938 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002939 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08002940 RLOGE("getIccCardStatusResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawef220dc52017-01-02 23:46:00 -08002941 }
2942
2943 return 0;
2944}
2945
Amit Mahajan759786a2017-03-03 17:35:47 -08002946int radio::supplyIccPinForAppResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002947 int responseType, int serial, RIL_Errno e,
2948 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002949#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002950 RLOGD("supplyIccPinForAppResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002951#endif
Sanket Padawef220dc52017-01-02 23:46:00 -08002952
2953 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08002954 RadioResponseInfo responseInfo = {};
Naveen Kalla346bbc02017-03-16 12:55:55 -07002955 int ret = responseIntOrEmpty(responseInfo, serial, responseType, e, response, responseLen);
Amit Mahajan17249842017-01-19 15:05:45 -08002956 Return<void> retStatus = radioService[slotId]->mRadioResponse->
2957 supplyIccPinForAppResponse(responseInfo, ret);
2958 radioService[slotId]->checkReturnStatus(retStatus);
Sanket Padawef220dc52017-01-02 23:46:00 -08002959 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08002960 RLOGE("supplyIccPinForAppResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawef220dc52017-01-02 23:46:00 -08002961 slotId);
2962 }
2963
2964 return 0;
2965}
2966
Amit Mahajan759786a2017-03-03 17:35:47 -08002967int radio::supplyIccPukForAppResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002968 int responseType, int serial, RIL_Errno e,
2969 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002970#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002971 RLOGD("supplyIccPukForAppResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002972#endif
Sanket Padawef220dc52017-01-02 23:46:00 -08002973
2974 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08002975 RadioResponseInfo responseInfo = {};
Naveen Kalla346bbc02017-03-16 12:55:55 -07002976 int ret = responseIntOrEmpty(responseInfo, serial, responseType, e, response, responseLen);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002977 Return<void> retStatus = radioService[slotId]->mRadioResponse->supplyIccPukForAppResponse(
2978 responseInfo, ret);
Amit Mahajan17249842017-01-19 15:05:45 -08002979 radioService[slotId]->checkReturnStatus(retStatus);
Sanket Padawef220dc52017-01-02 23:46:00 -08002980 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08002981 RLOGE("supplyIccPukForAppResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawef220dc52017-01-02 23:46:00 -08002982 slotId);
2983 }
2984
2985 return 0;
2986}
2987
Amit Mahajan759786a2017-03-03 17:35:47 -08002988int radio::supplyIccPin2ForAppResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002989 int responseType, int serial, RIL_Errno e,
2990 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002991#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002992 RLOGD("supplyIccPin2ForAppResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002993#endif
Sanket Padawef220dc52017-01-02 23:46:00 -08002994
2995 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08002996 RadioResponseInfo responseInfo = {};
Naveen Kalla346bbc02017-03-16 12:55:55 -07002997 int ret = responseIntOrEmpty(responseInfo, serial, responseType, e, response, responseLen);
Amit Mahajan17249842017-01-19 15:05:45 -08002998 Return<void> retStatus = radioService[slotId]->mRadioResponse->
2999 supplyIccPin2ForAppResponse(responseInfo, ret);
3000 radioService[slotId]->checkReturnStatus(retStatus);
Sanket Padawef220dc52017-01-02 23:46:00 -08003001 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003002 RLOGE("supplyIccPin2ForAppResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawef220dc52017-01-02 23:46:00 -08003003 slotId);
3004 }
3005
3006 return 0;
3007}
3008
Amit Mahajan759786a2017-03-03 17:35:47 -08003009int radio::supplyIccPuk2ForAppResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003010 int responseType, int serial, RIL_Errno e,
3011 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003012#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003013 RLOGD("supplyIccPuk2ForAppResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003014#endif
Sanket Padawef220dc52017-01-02 23:46:00 -08003015
3016 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003017 RadioResponseInfo responseInfo = {};
Naveen Kalla346bbc02017-03-16 12:55:55 -07003018 int ret = responseIntOrEmpty(responseInfo, serial, responseType, e, response, responseLen);
Amit Mahajan17249842017-01-19 15:05:45 -08003019 Return<void> retStatus = radioService[slotId]->mRadioResponse->
3020 supplyIccPuk2ForAppResponse(responseInfo, ret);
3021 radioService[slotId]->checkReturnStatus(retStatus);
Sanket Padawef220dc52017-01-02 23:46:00 -08003022 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003023 RLOGE("supplyIccPuk2ForAppResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawef220dc52017-01-02 23:46:00 -08003024 slotId);
3025 }
3026
3027 return 0;
3028}
3029
Amit Mahajan759786a2017-03-03 17:35:47 -08003030int radio::changeIccPinForAppResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003031 int responseType, int serial, RIL_Errno e,
3032 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003033#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003034 RLOGD("changeIccPinForAppResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003035#endif
Sanket Padawef220dc52017-01-02 23:46:00 -08003036
3037 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003038 RadioResponseInfo responseInfo = {};
Naveen Kalla346bbc02017-03-16 12:55:55 -07003039 int ret = responseIntOrEmpty(responseInfo, serial, responseType, e, response, responseLen);
Amit Mahajan17249842017-01-19 15:05:45 -08003040 Return<void> retStatus = radioService[slotId]->mRadioResponse->
3041 changeIccPinForAppResponse(responseInfo, ret);
3042 radioService[slotId]->checkReturnStatus(retStatus);
Sanket Padawef220dc52017-01-02 23:46:00 -08003043 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003044 RLOGE("changeIccPinForAppResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawef220dc52017-01-02 23:46:00 -08003045 slotId);
3046 }
3047
3048 return 0;
3049}
3050
Amit Mahajan759786a2017-03-03 17:35:47 -08003051int radio::changeIccPin2ForAppResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003052 int responseType, int serial, RIL_Errno e,
3053 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003054#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003055 RLOGD("changeIccPin2ForAppResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003056#endif
Sanket Padawef220dc52017-01-02 23:46:00 -08003057
3058 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003059 RadioResponseInfo responseInfo = {};
Naveen Kalla346bbc02017-03-16 12:55:55 -07003060 int ret = responseIntOrEmpty(responseInfo, serial, responseType, e, response, responseLen);
Amit Mahajan17249842017-01-19 15:05:45 -08003061 Return<void> retStatus = radioService[slotId]->mRadioResponse->
3062 changeIccPin2ForAppResponse(responseInfo, ret);
3063 radioService[slotId]->checkReturnStatus(retStatus);
Sanket Padawef220dc52017-01-02 23:46:00 -08003064 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003065 RLOGE("changeIccPin2ForAppResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawef220dc52017-01-02 23:46:00 -08003066 slotId);
3067 }
3068
3069 return 0;
3070}
3071
Amit Mahajan759786a2017-03-03 17:35:47 -08003072int radio::supplyNetworkDepersonalizationResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003073 int responseType, int serial, RIL_Errno e,
3074 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003075#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003076 RLOGD("supplyNetworkDepersonalizationResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003077#endif
Sanket Padawef220dc52017-01-02 23:46:00 -08003078
3079 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003080 RadioResponseInfo responseInfo = {};
Naveen Kalla346bbc02017-03-16 12:55:55 -07003081 int ret = responseIntOrEmpty(responseInfo, serial, responseType, e, response, responseLen);
Amit Mahajan17249842017-01-19 15:05:45 -08003082 Return<void> retStatus = radioService[slotId]->mRadioResponse->
3083 supplyNetworkDepersonalizationResponse(responseInfo, ret);
3084 radioService[slotId]->checkReturnStatus(retStatus);
Sanket Padawef220dc52017-01-02 23:46:00 -08003085 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003086 RLOGE("supplyNetworkDepersonalizationResponse: radioService[%d]->mRadioResponse == "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003087 "NULL", slotId);
Sanket Padawef220dc52017-01-02 23:46:00 -08003088 }
3089
3090 return 0;
3091}
3092
Amit Mahajan759786a2017-03-03 17:35:47 -08003093int radio::getCurrentCallsResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003094 int responseType, int serial, RIL_Errno e,
3095 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003096#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003097 RLOGD("getCurrentCallsResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003098#endif
Sanket Padawef220dc52017-01-02 23:46:00 -08003099
3100 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003101 RadioResponseInfo responseInfo = {};
Sanket Padawef220dc52017-01-02 23:46:00 -08003102 populateResponseInfo(responseInfo, serial, responseType, e);
3103
3104 hidl_vec<Call> calls;
3105 if (response == NULL || (responseLen % sizeof(RIL_Call *)) != 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003106 RLOGE("getCurrentCallsResponse: Invalid response");
Amit Mahajan5829a472016-12-28 17:28:07 -08003107 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
Sanket Padawef220dc52017-01-02 23:46:00 -08003108 } else {
3109 int num = responseLen / sizeof(RIL_Call *);
3110 calls.resize(num);
3111
3112 for (int i = 0 ; i < num ; i++) {
3113 RIL_Call *p_cur = ((RIL_Call **) response)[i];
3114 /* each call info */
3115 calls[i].state = (CallState) p_cur->state;
3116 calls[i].index = p_cur->index;
3117 calls[i].toa = p_cur->toa;
3118 calls[i].isMpty = p_cur->isMpty;
3119 calls[i].isMT = p_cur->isMT;
3120 calls[i].als = p_cur->als;
3121 calls[i].isVoice = p_cur->isVoice;
3122 calls[i].isVoicePrivacy = p_cur->isVoicePrivacy;
3123 calls[i].number = convertCharPtrToHidlString(p_cur->number);
3124 calls[i].numberPresentation = (CallPresentation) p_cur->numberPresentation;
3125 calls[i].name = convertCharPtrToHidlString(p_cur->name);
3126 calls[i].namePresentation = (CallPresentation) p_cur->namePresentation;
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003127 if (p_cur->uusInfo != NULL && p_cur->uusInfo->uusData != NULL) {
Sanket Padawef220dc52017-01-02 23:46:00 -08003128 RIL_UUS_Info *uusInfo = p_cur->uusInfo;
3129 calls[i].uusInfo[0].uusType = (UusType) uusInfo->uusType;
3130 calls[i].uusInfo[0].uusDcs = (UusDcs) uusInfo->uusDcs;
3131 // convert uusInfo->uusData to a null-terminated string
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003132 char *nullTermStr = strndup(uusInfo->uusData, uusInfo->uusLength);
3133 calls[i].uusInfo[0].uusData = nullTermStr;
3134 free(nullTermStr);
Sanket Padawef220dc52017-01-02 23:46:00 -08003135 }
3136 }
3137 }
3138
Amit Mahajan17249842017-01-19 15:05:45 -08003139 Return<void> retStatus = radioService[slotId]->mRadioResponse->
3140 getCurrentCallsResponse(responseInfo, calls);
3141 radioService[slotId]->checkReturnStatus(retStatus);
Sanket Padawef220dc52017-01-02 23:46:00 -08003142 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003143 RLOGE("getCurrentCallsResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawef220dc52017-01-02 23:46:00 -08003144 }
3145
3146 return 0;
3147}
3148
Amit Mahajan759786a2017-03-03 17:35:47 -08003149int radio::dialResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003150 int responseType, int serial, RIL_Errno e, void *response,
3151 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003152#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003153 RLOGD("dialResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003154#endif
Sanket Padawef220dc52017-01-02 23:46:00 -08003155
3156 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003157 RadioResponseInfo responseInfo = {};
Sanket Padawef220dc52017-01-02 23:46:00 -08003158 populateResponseInfo(responseInfo, serial, responseType, e);
Amit Mahajan17249842017-01-19 15:05:45 -08003159 Return<void> retStatus = radioService[slotId]->mRadioResponse->dialResponse(responseInfo);
3160 radioService[slotId]->checkReturnStatus(retStatus);
Sanket Padawef220dc52017-01-02 23:46:00 -08003161 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003162 RLOGE("dialResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Amit Mahajancd77a5b2016-08-25 11:19:21 -07003163 }
3164
3165 return 0;
3166}
3167
Amit Mahajan759786a2017-03-03 17:35:47 -08003168int radio::getIMSIForAppResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003169 int responseType, int serial, RIL_Errno e, void *response,
3170 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003171#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003172 RLOGD("getIMSIForAppResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003173#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003174
3175 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003176 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003177 populateResponseInfo(responseInfo, serial, responseType, e);
3178 Return<void> retStatus = radioService[slotId]->mRadioResponse->getIMSIForAppResponse(
3179 responseInfo, convertCharPtrToHidlString((char *) response));
3180 radioService[slotId]->checkReturnStatus(retStatus);
3181 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003182 RLOGE("getIMSIForAppResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003183 slotId);
3184 }
3185
3186 return 0;
3187}
3188
Amit Mahajan759786a2017-03-03 17:35:47 -08003189int radio::hangupConnectionResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003190 int responseType, int serial, RIL_Errno e,
3191 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003192#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003193 RLOGD("hangupConnectionResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003194#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003195
3196 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003197 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003198 populateResponseInfo(responseInfo, serial, responseType, e);
3199 Return<void> retStatus = radioService[slotId]->mRadioResponse->hangupConnectionResponse(
3200 responseInfo);
3201 radioService[slotId]->checkReturnStatus(retStatus);
3202 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003203 RLOGE("hangupConnectionResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003204 slotId);
3205 }
3206
3207 return 0;
3208}
3209
Amit Mahajan759786a2017-03-03 17:35:47 -08003210int radio::hangupWaitingOrBackgroundResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003211 int responseType, int serial, RIL_Errno e,
3212 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003213#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003214 RLOGD("hangupWaitingOrBackgroundResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003215#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003216
3217 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003218 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003219 populateResponseInfo(responseInfo, serial, responseType, e);
3220 Return<void> retStatus =
3221 radioService[slotId]->mRadioResponse->hangupWaitingOrBackgroundResponse(
3222 responseInfo);
3223 radioService[slotId]->checkReturnStatus(retStatus);
3224 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003225 RLOGE("hangupWaitingOrBackgroundResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003226 slotId);
3227 }
3228
3229 return 0;
3230}
3231
Amit Mahajan759786a2017-03-03 17:35:47 -08003232int radio::hangupForegroundResumeBackgroundResponse(int slotId, int responseType, int serial,
3233 RIL_Errno e, void *response,
3234 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003235#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003236 RLOGD("hangupWaitingOrBackgroundResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003237#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003238
3239 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003240 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003241 populateResponseInfo(responseInfo, serial, responseType, e);
3242 Return<void> retStatus =
3243 radioService[slotId]->mRadioResponse->hangupWaitingOrBackgroundResponse(
3244 responseInfo);
3245 radioService[slotId]->checkReturnStatus(retStatus);
3246 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003247 RLOGE("hangupWaitingOrBackgroundResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003248 slotId);
3249 }
3250
3251 return 0;
3252}
3253
Amit Mahajan759786a2017-03-03 17:35:47 -08003254int radio::switchWaitingOrHoldingAndActiveResponse(int slotId, int responseType, int serial,
3255 RIL_Errno e, void *response,
3256 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003257#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003258 RLOGD("switchWaitingOrHoldingAndActiveResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003259#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003260
3261 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003262 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003263 populateResponseInfo(responseInfo, serial, responseType, e);
3264 Return<void> retStatus =
3265 radioService[slotId]->mRadioResponse->switchWaitingOrHoldingAndActiveResponse(
3266 responseInfo);
3267 radioService[slotId]->checkReturnStatus(retStatus);
3268 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003269 RLOGE("switchWaitingOrHoldingAndActiveResponse: radioService[%d]->mRadioResponse "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003270 "== NULL", slotId);
3271 }
3272
3273 return 0;
3274}
3275
Amit Mahajan759786a2017-03-03 17:35:47 -08003276int radio::conferenceResponse(int slotId, int responseType,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003277 int serial, RIL_Errno e, void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003278#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003279 RLOGD("conferenceResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003280#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003281
3282 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003283 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003284 populateResponseInfo(responseInfo, serial, responseType, e);
3285 Return<void> retStatus = radioService[slotId]->mRadioResponse->conferenceResponse(
3286 responseInfo);
3287 radioService[slotId]->checkReturnStatus(retStatus);
3288 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003289 RLOGE("conferenceResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003290 slotId);
3291 }
3292
3293 return 0;
3294}
3295
Amit Mahajan759786a2017-03-03 17:35:47 -08003296int radio::rejectCallResponse(int slotId, int responseType,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003297 int serial, RIL_Errno e, void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003298#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003299 RLOGD("rejectCallResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003300#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003301
3302 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003303 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003304 populateResponseInfo(responseInfo, serial, responseType, e);
3305 Return<void> retStatus = radioService[slotId]->mRadioResponse->rejectCallResponse(
3306 responseInfo);
3307 radioService[slotId]->checkReturnStatus(retStatus);
3308 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003309 RLOGE("rejectCallResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003310 slotId);
3311 }
3312
3313 return 0;
3314}
3315
Amit Mahajan759786a2017-03-03 17:35:47 -08003316int radio::getLastCallFailCauseResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003317 int responseType, int serial, RIL_Errno e, void *response,
3318 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003319#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003320 RLOGD("getLastCallFailCauseResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003321#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003322
3323 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003324 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003325 populateResponseInfo(responseInfo, serial, responseType, e);
Jack Yuf68e0da2017-02-07 14:53:09 -08003326
3327 LastCallFailCauseInfo info = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003328 info.vendorCause = hidl_string();
3329 if (response == NULL) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003330 RLOGE("getCurrentCallsResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003331 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
3332 } else if (responseLen == sizeof(int)) {
3333 int *pInt = (int *) response;
3334 info.causeCode = (LastCallFailCause) pInt[0];
3335 } else if (responseLen == sizeof(RIL_LastCallFailCauseInfo)) {
3336 RIL_LastCallFailCauseInfo *pFailCauseInfo = (RIL_LastCallFailCauseInfo *) response;
3337 info.causeCode = (LastCallFailCause) pFailCauseInfo->cause_code;
3338 info.vendorCause = convertCharPtrToHidlString(pFailCauseInfo->vendor_cause);
3339 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003340 RLOGE("getCurrentCallsResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003341 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
3342 }
3343
3344 Return<void> retStatus = radioService[slotId]->mRadioResponse->getLastCallFailCauseResponse(
3345 responseInfo, info);
3346 radioService[slotId]->checkReturnStatus(retStatus);
3347 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003348 RLOGE("getLastCallFailCauseResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003349 slotId);
3350 }
3351
3352 return 0;
3353}
3354
Amit Mahajan759786a2017-03-03 17:35:47 -08003355int radio::getSignalStrengthResponse(int slotId,
Amit Mahajan3df62912017-02-10 01:35:55 +00003356 int responseType, int serial, RIL_Errno e,
3357 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003358#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003359 RLOGD("getSignalStrengthResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003360#endif
Amit Mahajan3df62912017-02-10 01:35:55 +00003361
3362 if (radioService[slotId]->mRadioResponse != NULL) {
Amit Mahajan3da9ac02017-02-13 13:41:28 -08003363 RadioResponseInfo responseInfo = {};
Amit Mahajan3df62912017-02-10 01:35:55 +00003364 populateResponseInfo(responseInfo, serial, responseType, e);
Amit Mahajan3da9ac02017-02-13 13:41:28 -08003365 SignalStrength signalStrength = {};
Amit Mahajan3df62912017-02-10 01:35:55 +00003366 if (response == NULL || responseLen != sizeof(RIL_SignalStrength_v10)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003367 RLOGE("getSignalStrengthResponse: Invalid response");
Amit Mahajan3df62912017-02-10 01:35:55 +00003368 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
3369 } else {
3370 convertRilSignalStrengthToHal(response, responseLen, signalStrength);
3371 }
3372
3373 Return<void> retStatus = radioService[slotId]->mRadioResponse->getSignalStrengthResponse(
3374 responseInfo, signalStrength);
3375 radioService[slotId]->checkReturnStatus(retStatus);
3376 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003377 RLOGE("getSignalStrengthResponse: radioService[%d]->mRadioResponse == NULL",
Amit Mahajan3df62912017-02-10 01:35:55 +00003378 slotId);
3379 }
3380
3381 return 0;
3382}
3383
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003384RIL_CellInfoType getCellInfoTypeRadioTechnology(char *rat) {
3385 if (rat == NULL) {
3386 return RIL_CELL_INFO_TYPE_NONE;
3387 }
3388
3389 int radioTech = atoi(rat);
3390
3391 switch(radioTech) {
3392
3393 case RADIO_TECH_GPRS:
3394 case RADIO_TECH_EDGE:
3395 case RADIO_TECH_GSM: {
3396 return RIL_CELL_INFO_TYPE_GSM;
3397 }
3398
3399 case RADIO_TECH_UMTS:
3400 case RADIO_TECH_HSDPA:
3401 case RADIO_TECH_HSUPA:
3402 case RADIO_TECH_HSPA:
3403 case RADIO_TECH_HSPAP: {
3404 return RIL_CELL_INFO_TYPE_WCDMA;
3405 }
3406
3407 case RADIO_TECH_IS95A:
3408 case RADIO_TECH_IS95B:
3409 case RADIO_TECH_1xRTT:
3410 case RADIO_TECH_EVDO_0:
3411 case RADIO_TECH_EVDO_A:
3412 case RADIO_TECH_EVDO_B:
3413 case RADIO_TECH_EHRPD: {
3414 return RIL_CELL_INFO_TYPE_CDMA;
3415 }
3416
3417 case RADIO_TECH_LTE:
3418 case RADIO_TECH_LTE_CA: {
3419 return RIL_CELL_INFO_TYPE_LTE;
3420 }
3421
3422 case RADIO_TECH_TD_SCDMA: {
3423 return RIL_CELL_INFO_TYPE_TD_SCDMA;
3424 }
3425
3426 default: {
3427 break;
3428 }
3429 }
3430
3431 return RIL_CELL_INFO_TYPE_NONE;
3432
3433}
3434
3435void fillCellIdentityResponse(CellIdentity &cellIdentity, RIL_CellIdentity_v16 &rilCellIdentity) {
3436
3437 cellIdentity.cellIdentityGsm.resize(0);
3438 cellIdentity.cellIdentityWcdma.resize(0);
3439 cellIdentity.cellIdentityCdma.resize(0);
3440 cellIdentity.cellIdentityTdscdma.resize(0);
3441 cellIdentity.cellIdentityLte.resize(0);
3442 cellIdentity.cellInfoType = (CellInfoType)rilCellIdentity.cellInfoType;
3443 switch(rilCellIdentity.cellInfoType) {
3444
3445 case RIL_CELL_INFO_TYPE_GSM: {
3446 cellIdentity.cellIdentityGsm.resize(1);
3447 cellIdentity.cellIdentityGsm[0].mcc =
3448 std::to_string(rilCellIdentity.cellIdentityGsm.mcc);
3449 cellIdentity.cellIdentityGsm[0].mnc =
3450 std::to_string(rilCellIdentity.cellIdentityGsm.mnc);
3451 cellIdentity.cellIdentityGsm[0].lac = rilCellIdentity.cellIdentityGsm.lac;
3452 cellIdentity.cellIdentityGsm[0].cid = rilCellIdentity.cellIdentityGsm.cid;
3453 cellIdentity.cellIdentityGsm[0].arfcn = rilCellIdentity.cellIdentityGsm.arfcn;
3454 cellIdentity.cellIdentityGsm[0].bsic = rilCellIdentity.cellIdentityGsm.bsic;
3455 break;
3456 }
3457
3458 case RIL_CELL_INFO_TYPE_WCDMA: {
3459 cellIdentity.cellIdentityWcdma.resize(1);
3460 cellIdentity.cellIdentityWcdma[0].mcc =
3461 std::to_string(rilCellIdentity.cellIdentityWcdma.mcc);
3462 cellIdentity.cellIdentityWcdma[0].mnc =
3463 std::to_string(rilCellIdentity.cellIdentityWcdma.mnc);
3464 cellIdentity.cellIdentityWcdma[0].lac = rilCellIdentity.cellIdentityWcdma.lac;
3465 cellIdentity.cellIdentityWcdma[0].cid = rilCellIdentity.cellIdentityWcdma.cid;
3466 cellIdentity.cellIdentityWcdma[0].psc = rilCellIdentity.cellIdentityWcdma.psc;
3467 cellIdentity.cellIdentityWcdma[0].uarfcn = rilCellIdentity.cellIdentityWcdma.uarfcn;
3468 break;
3469 }
3470
3471 case RIL_CELL_INFO_TYPE_CDMA: {
3472 cellIdentity.cellIdentityCdma.resize(1);
3473 cellIdentity.cellIdentityCdma[0].networkId = rilCellIdentity.cellIdentityCdma.networkId;
3474 cellIdentity.cellIdentityCdma[0].systemId = rilCellIdentity.cellIdentityCdma.systemId;
3475 cellIdentity.cellIdentityCdma[0].baseStationId =
3476 rilCellIdentity.cellIdentityCdma.basestationId;
3477 cellIdentity.cellIdentityCdma[0].longitude = rilCellIdentity.cellIdentityCdma.longitude;
3478 cellIdentity.cellIdentityCdma[0].latitude = rilCellIdentity.cellIdentityCdma.latitude;
3479 break;
3480 }
3481
3482 case RIL_CELL_INFO_TYPE_LTE: {
3483 cellIdentity.cellIdentityLte.resize(1);
3484 cellIdentity.cellIdentityLte[0].mcc =
3485 std::to_string(rilCellIdentity.cellIdentityLte.mcc);
3486 cellIdentity.cellIdentityLte[0].mnc =
3487 std::to_string(rilCellIdentity.cellIdentityLte.mnc);
3488 cellIdentity.cellIdentityLte[0].ci = rilCellIdentity.cellIdentityLte.ci;
3489 cellIdentity.cellIdentityLte[0].pci = rilCellIdentity.cellIdentityLte.pci;
3490 cellIdentity.cellIdentityLte[0].tac = rilCellIdentity.cellIdentityLte.tac;
3491 cellIdentity.cellIdentityLte[0].earfcn = rilCellIdentity.cellIdentityLte.earfcn;
3492 break;
3493 }
3494
3495 case RIL_CELL_INFO_TYPE_TD_SCDMA: {
3496 cellIdentity.cellIdentityTdscdma.resize(1);
3497 cellIdentity.cellIdentityTdscdma[0].mcc =
3498 std::to_string(rilCellIdentity.cellIdentityTdscdma.mcc);
3499 cellIdentity.cellIdentityTdscdma[0].mnc =
3500 std::to_string(rilCellIdentity.cellIdentityTdscdma.mnc);
3501 cellIdentity.cellIdentityTdscdma[0].lac = rilCellIdentity.cellIdentityTdscdma.lac;
3502 cellIdentity.cellIdentityTdscdma[0].cid = rilCellIdentity.cellIdentityTdscdma.cid;
3503 cellIdentity.cellIdentityTdscdma[0].cpid = rilCellIdentity.cellIdentityTdscdma.cpid;
3504 break;
3505 }
3506
3507 default: {
3508 break;
3509 }
3510 }
3511}
3512
3513int convertResponseStringEntryToInt(char **response, int index, int numStrings) {
3514 if ((response != NULL) && (numStrings > index) && (response[index] != NULL)) {
3515 return atoi(response[index]);
3516 }
3517
3518 return -1;
3519}
3520
3521void fillCellIdentityFromVoiceRegStateResponseString(CellIdentity &cellIdentity,
3522 int numStrings, char** response) {
3523
3524 RIL_CellIdentity_v16 rilCellIdentity;
Jack Yu8e732d42017-04-14 00:08:06 -07003525 memset(&rilCellIdentity, -1, sizeof(RIL_CellIdentity_v16));
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003526
3527 rilCellIdentity.cellInfoType = getCellInfoTypeRadioTechnology(response[3]);
3528 switch(rilCellIdentity.cellInfoType) {
3529
3530 case RIL_CELL_INFO_TYPE_GSM: {
3531 rilCellIdentity.cellIdentityGsm.lac =
3532 convertResponseStringEntryToInt(response, 1, numStrings);
3533 rilCellIdentity.cellIdentityGsm.cid =
3534 convertResponseStringEntryToInt(response, 2, numStrings);
3535 break;
3536 }
3537
3538 case RIL_CELL_INFO_TYPE_WCDMA: {
3539 rilCellIdentity.cellIdentityWcdma.lac =
3540 convertResponseStringEntryToInt(response, 1, numStrings);
3541 rilCellIdentity.cellIdentityWcdma.cid =
3542 convertResponseStringEntryToInt(response, 2, numStrings);
3543 rilCellIdentity.cellIdentityWcdma.psc =
3544 convertResponseStringEntryToInt(response, 14, numStrings);
3545 break;
3546 }
3547
3548 case RIL_CELL_INFO_TYPE_TD_SCDMA:{
3549 rilCellIdentity.cellIdentityTdscdma.lac =
3550 convertResponseStringEntryToInt(response, 1, numStrings);
3551 rilCellIdentity.cellIdentityTdscdma.cid =
3552 convertResponseStringEntryToInt(response, 2, numStrings);
3553 break;
3554 }
3555
3556 case RIL_CELL_INFO_TYPE_CDMA:{
3557 rilCellIdentity.cellIdentityCdma.basestationId =
3558 convertResponseStringEntryToInt(response, 4, numStrings);
Nathan Harold714e19c2017-07-07 17:12:04 -07003559 /* Order of Lat. and Long. swapped between RIL and HIDL interface versions. */
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003560 rilCellIdentity.cellIdentityCdma.latitude =
Nathan Harold714e19c2017-07-07 17:12:04 -07003561 convertResponseStringEntryToInt(response, 5, numStrings);
3562 rilCellIdentity.cellIdentityCdma.longitude =
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003563 convertResponseStringEntryToInt(response, 6, numStrings);
3564 rilCellIdentity.cellIdentityCdma.systemId =
3565 convertResponseStringEntryToInt(response, 8, numStrings);
3566 rilCellIdentity.cellIdentityCdma.networkId =
3567 convertResponseStringEntryToInt(response, 9, numStrings);
3568 break;
3569 }
3570
Sooraj Sasindranf28e42a2017-03-06 23:07:22 -08003571 case RIL_CELL_INFO_TYPE_LTE:{
3572 rilCellIdentity.cellIdentityLte.tac =
3573 convertResponseStringEntryToInt(response, 1, numStrings);
3574 rilCellIdentity.cellIdentityLte.ci =
3575 convertResponseStringEntryToInt(response, 2, numStrings);
3576 break;
3577 }
3578
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003579 default: {
3580 break;
3581 }
3582 }
3583
3584 fillCellIdentityResponse(cellIdentity, rilCellIdentity);
3585}
3586
3587void fillCellIdentityFromDataRegStateResponseString(CellIdentity &cellIdentity,
3588 int numStrings, char** response) {
3589
3590 RIL_CellIdentity_v16 rilCellIdentity;
Jack Yu8e732d42017-04-14 00:08:06 -07003591 memset(&rilCellIdentity, -1, sizeof(RIL_CellIdentity_v16));
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003592
3593 rilCellIdentity.cellInfoType = getCellInfoTypeRadioTechnology(response[3]);
3594 switch(rilCellIdentity.cellInfoType) {
3595 case RIL_CELL_INFO_TYPE_GSM: {
3596 rilCellIdentity.cellIdentityGsm.lac =
3597 convertResponseStringEntryToInt(response, 1, numStrings);
3598 rilCellIdentity.cellIdentityGsm.cid =
3599 convertResponseStringEntryToInt(response, 2, numStrings);
3600 break;
3601 }
3602 case RIL_CELL_INFO_TYPE_WCDMA: {
3603 rilCellIdentity.cellIdentityWcdma.lac =
3604 convertResponseStringEntryToInt(response, 1, numStrings);
3605 rilCellIdentity.cellIdentityWcdma.cid =
3606 convertResponseStringEntryToInt(response, 2, numStrings);
3607 break;
3608 }
3609 case RIL_CELL_INFO_TYPE_TD_SCDMA:{
3610 rilCellIdentity.cellIdentityTdscdma.lac =
3611 convertResponseStringEntryToInt(response, 1, numStrings);
3612 rilCellIdentity.cellIdentityTdscdma.cid =
3613 convertResponseStringEntryToInt(response, 2, numStrings);
3614 break;
3615 }
3616 case RIL_CELL_INFO_TYPE_LTE: {
3617 rilCellIdentity.cellIdentityLte.tac =
3618 convertResponseStringEntryToInt(response, 6, numStrings);
3619 rilCellIdentity.cellIdentityLte.pci =
3620 convertResponseStringEntryToInt(response, 7, numStrings);
3621 rilCellIdentity.cellIdentityLte.ci =
3622 convertResponseStringEntryToInt(response, 8, numStrings);
3623 break;
3624 }
3625 default: {
3626 break;
3627 }
3628 }
3629
3630 fillCellIdentityResponse(cellIdentity, rilCellIdentity);
3631}
3632
Amit Mahajan759786a2017-03-03 17:35:47 -08003633int radio::getVoiceRegistrationStateResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003634 int responseType, int serial, RIL_Errno e,
3635 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003636#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003637 RLOGD("getVoiceRegistrationStateResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003638#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003639
3640 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003641 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003642 populateResponseInfo(responseInfo, serial, responseType, e);
3643
Jack Yuf68e0da2017-02-07 14:53:09 -08003644 VoiceRegStateResult voiceRegResponse = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003645 int numStrings = responseLen / sizeof(char *);
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003646 if (response == NULL) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003647 RLOGE("getVoiceRegistrationStateResponse Invalid response: NULL");
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003648 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
3649 } else if (s_vendorFunctions->version <= 14) {
3650 if (numStrings != 15) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003651 RLOGE("getVoiceRegistrationStateResponse Invalid response: NULL");
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003652 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
3653 } else {
3654 char **resp = (char **) response;
3655 voiceRegResponse.regState = (RegState) ATOI_NULL_HANDLED_DEF(resp[0], 4);
3656 voiceRegResponse.rat = ATOI_NULL_HANDLED(resp[3]);
3657 voiceRegResponse.cssSupported = ATOI_NULL_HANDLED_DEF(resp[7], 0);
3658 voiceRegResponse.roamingIndicator = ATOI_NULL_HANDLED(resp[10]);
3659 voiceRegResponse.systemIsInPrl = ATOI_NULL_HANDLED_DEF(resp[11], 0);
3660 voiceRegResponse.defaultRoamingIndicator = ATOI_NULL_HANDLED_DEF(resp[12], 0);
3661 voiceRegResponse.reasonForDenial = ATOI_NULL_HANDLED_DEF(resp[13], 0);
3662 fillCellIdentityFromVoiceRegStateResponseString(voiceRegResponse.cellIdentity,
3663 numStrings, resp);
3664 }
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003665 } else {
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003666 RIL_VoiceRegistrationStateResponse *voiceRegState =
3667 (RIL_VoiceRegistrationStateResponse *)response;
3668
3669 if (responseLen != sizeof(RIL_VoiceRegistrationStateResponse)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003670 RLOGE("getVoiceRegistrationStateResponse Invalid response: NULL");
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003671 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
3672 } else {
3673 voiceRegResponse.regState = (RegState) voiceRegState->regState;
3674 voiceRegResponse.rat = voiceRegState->rat;;
3675 voiceRegResponse.cssSupported = voiceRegState->cssSupported;
3676 voiceRegResponse.roamingIndicator = voiceRegState->roamingIndicator;
3677 voiceRegResponse.systemIsInPrl = voiceRegState->systemIsInPrl;
3678 voiceRegResponse.defaultRoamingIndicator = voiceRegState->defaultRoamingIndicator;
3679 voiceRegResponse.reasonForDenial = voiceRegState->reasonForDenial;
3680 fillCellIdentityResponse(voiceRegResponse.cellIdentity,
3681 voiceRegState->cellIdentity);
3682 }
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003683 }
3684
3685 Return<void> retStatus =
3686 radioService[slotId]->mRadioResponse->getVoiceRegistrationStateResponse(
3687 responseInfo, voiceRegResponse);
3688 radioService[slotId]->checkReturnStatus(retStatus);
3689 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003690 RLOGE("getVoiceRegistrationStateResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003691 slotId);
3692 }
3693
3694 return 0;
3695}
3696
Amit Mahajan759786a2017-03-03 17:35:47 -08003697int radio::getDataRegistrationStateResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003698 int responseType, int serial, RIL_Errno e,
3699 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003700#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003701 RLOGD("getDataRegistrationStateResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003702#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003703
3704 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003705 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003706 populateResponseInfo(responseInfo, serial, responseType, e);
Jack Yuf68e0da2017-02-07 14:53:09 -08003707 DataRegStateResult dataRegResponse = {};
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003708 if (response == NULL) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003709 RLOGE("getDataRegistrationStateResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003710 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003711 } else if (s_vendorFunctions->version <= 14) {
3712 int numStrings = responseLen / sizeof(char *);
3713 if ((numStrings != 6) && (numStrings != 11)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003714 RLOGE("getDataRegistrationStateResponse Invalid response: NULL");
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003715 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
3716 } else {
3717 char **resp = (char **) response;
3718 dataRegResponse.regState = (RegState) ATOI_NULL_HANDLED_DEF(resp[0], 4);
3719 dataRegResponse.rat = ATOI_NULL_HANDLED_DEF(resp[3], 0);
3720 dataRegResponse.reasonDataDenied = ATOI_NULL_HANDLED(resp[4]);
3721 dataRegResponse.maxDataCalls = ATOI_NULL_HANDLED_DEF(resp[5], 1);
3722 fillCellIdentityFromDataRegStateResponseString(dataRegResponse.cellIdentity,
3723 numStrings, resp);
3724 }
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003725 } else {
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003726 RIL_DataRegistrationStateResponse *dataRegState =
3727 (RIL_DataRegistrationStateResponse *)response;
3728
3729 if (responseLen != sizeof(RIL_DataRegistrationStateResponse)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003730 RLOGE("getDataRegistrationStateResponse Invalid response: NULL");
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003731 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
3732 } else {
3733 dataRegResponse.regState = (RegState) dataRegState->regState;
3734 dataRegResponse.rat = dataRegState->rat;;
3735 dataRegResponse.reasonDataDenied = dataRegState->reasonDataDenied;
3736 dataRegResponse.maxDataCalls = dataRegState->maxDataCalls;
3737 fillCellIdentityResponse(dataRegResponse.cellIdentity, dataRegState->cellIdentity);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003738 }
3739 }
3740
3741 Return<void> retStatus =
3742 radioService[slotId]->mRadioResponse->getDataRegistrationStateResponse(responseInfo,
3743 dataRegResponse);
3744 radioService[slotId]->checkReturnStatus(retStatus);
3745 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003746 RLOGE("getDataRegistrationStateResponse: 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::getOperatorResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003754 int responseType, int serial, RIL_Errno e, void *response,
3755 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003756#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003757 RLOGD("getOperatorResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003758#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003759
3760 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003761 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003762 populateResponseInfo(responseInfo, serial, responseType, e);
3763 hidl_string longName;
3764 hidl_string shortName;
3765 hidl_string numeric;
3766 int numStrings = responseLen / sizeof(char *);
3767 if (response == NULL || numStrings != 3) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003768 RLOGE("getOperatorResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003769 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
3770
3771 } else {
3772 char **resp = (char **) response;
3773 longName = convertCharPtrToHidlString(resp[0]);
3774 shortName = convertCharPtrToHidlString(resp[1]);
3775 numeric = convertCharPtrToHidlString(resp[2]);
3776 }
3777 Return<void> retStatus = radioService[slotId]->mRadioResponse->getOperatorResponse(
3778 responseInfo, longName, shortName, numeric);
3779 radioService[slotId]->checkReturnStatus(retStatus);
3780 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003781 RLOGE("getOperatorResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003782 slotId);
3783 }
3784
3785 return 0;
3786}
3787
Amit Mahajan759786a2017-03-03 17:35:47 -08003788int radio::setRadioPowerResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003789 int responseType, int serial, RIL_Errno e, void *response,
3790 size_t responseLen) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003791 RLOGD("setRadioPowerResponse: serial %d", serial);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003792
3793 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003794 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003795 populateResponseInfo(responseInfo, serial, responseType, e);
3796 Return<void> retStatus = radioService[slotId]->mRadioResponse->setRadioPowerResponse(
3797 responseInfo);
3798 radioService[slotId]->checkReturnStatus(retStatus);
3799 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003800 RLOGE("setRadioPowerResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003801 slotId);
3802 }
3803
3804 return 0;
3805}
3806
Amit Mahajan759786a2017-03-03 17:35:47 -08003807int radio::sendDtmfResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003808 int responseType, int serial, RIL_Errno e, void *response,
3809 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003810#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003811 RLOGD("sendDtmfResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003812#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003813
3814 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003815 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003816 populateResponseInfo(responseInfo, serial, responseType, e);
3817 Return<void> retStatus = radioService[slotId]->mRadioResponse->sendDtmfResponse(
3818 responseInfo);
3819 radioService[slotId]->checkReturnStatus(retStatus);
3820 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003821 RLOGE("sendDtmfResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003822 slotId);
3823 }
3824
3825 return 0;
3826}
3827
3828SendSmsResult makeSendSmsResult(RadioResponseInfo& responseInfo, int serial, int responseType,
3829 RIL_Errno e, void *response, size_t responseLen) {
3830 populateResponseInfo(responseInfo, serial, responseType, e);
Jack Yuf68e0da2017-02-07 14:53:09 -08003831 SendSmsResult result = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003832
3833 if (response == NULL || responseLen != sizeof(RIL_SMS_Response)) {
3834 RLOGE("Invalid response: NULL");
3835 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003836 result.ackPDU = hidl_string();
3837 } else {
3838 RIL_SMS_Response *resp = (RIL_SMS_Response *) response;
3839 result.messageRef = resp->messageRef;
3840 result.ackPDU = convertCharPtrToHidlString(resp->ackPDU);
3841 result.errorCode = resp->errorCode;
3842 }
3843 return result;
3844}
3845
Amit Mahajan759786a2017-03-03 17:35:47 -08003846int radio::sendSmsResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003847 int responseType, int serial, RIL_Errno e, void *response,
3848 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003849#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003850 RLOGD("sendSmsResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003851#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003852
3853 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003854 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003855 SendSmsResult result = makeSendSmsResult(responseInfo, serial, responseType, e, response,
3856 responseLen);
3857
3858 Return<void> retStatus = radioService[slotId]->mRadioResponse->sendSmsResponse(responseInfo,
3859 result);
3860 radioService[slotId]->checkReturnStatus(retStatus);
3861 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003862 RLOGE("sendSmsResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003863 }
3864
3865 return 0;
3866}
3867
Amit Mahajan759786a2017-03-03 17:35:47 -08003868int radio::sendSMSExpectMoreResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003869 int responseType, int serial, RIL_Errno e, void *response,
3870 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003871#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003872 RLOGD("sendSMSExpectMoreResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003873#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003874
3875 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003876 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003877 SendSmsResult result = makeSendSmsResult(responseInfo, serial, responseType, e, response,
3878 responseLen);
3879
3880 Return<void> retStatus = radioService[slotId]->mRadioResponse->sendSMSExpectMoreResponse(
3881 responseInfo, result);
3882 radioService[slotId]->checkReturnStatus(retStatus);
3883 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003884 RLOGE("sendSMSExpectMoreResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003885 }
3886
3887 return 0;
3888}
3889
Amit Mahajan759786a2017-03-03 17:35:47 -08003890int radio::setupDataCallResponse(int slotId,
Amit Mahajan3df62912017-02-10 01:35:55 +00003891 int responseType, int serial, RIL_Errno e, void *response,
3892 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003893#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003894 RLOGD("setupDataCallResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003895#endif
Amit Mahajan3df62912017-02-10 01:35:55 +00003896
3897 if (radioService[slotId]->mRadioResponse != NULL) {
Amit Mahajan3da9ac02017-02-13 13:41:28 -08003898 RadioResponseInfo responseInfo = {};
Amit Mahajan3df62912017-02-10 01:35:55 +00003899 populateResponseInfo(responseInfo, serial, responseType, e);
3900
Amit Mahajan3da9ac02017-02-13 13:41:28 -08003901 SetupDataCallResult result = {};
Amit Mahajan3df62912017-02-10 01:35:55 +00003902 if (response == NULL || responseLen != sizeof(RIL_Data_Call_Response_v11)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003903 RLOGE("setupDataCallResponse: Invalid response");
Amit Mahajan3df62912017-02-10 01:35:55 +00003904 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
Jack Yu5079e182017-02-28 15:21:18 -08003905 result.status = DataCallFailCause::ERROR_UNSPECIFIED;
Amit Mahajan3da9ac02017-02-13 13:41:28 -08003906 result.type = hidl_string();
3907 result.ifname = hidl_string();
3908 result.addresses = hidl_string();
3909 result.dnses = hidl_string();
3910 result.gateways = hidl_string();
3911 result.pcscf = hidl_string();
Amit Mahajan3df62912017-02-10 01:35:55 +00003912 } else {
3913 convertRilDataCallToHal((RIL_Data_Call_Response_v11 *) response, result);
3914 }
3915
3916 Return<void> retStatus = radioService[slotId]->mRadioResponse->setupDataCallResponse(
3917 responseInfo, result);
3918 radioService[slotId]->checkReturnStatus(retStatus);
3919 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003920 RLOGE("setupDataCallResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Amit Mahajan3df62912017-02-10 01:35:55 +00003921 }
3922
3923 return 0;
3924}
3925
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003926IccIoResult responseIccIo(RadioResponseInfo& responseInfo, int serial, int responseType,
3927 RIL_Errno e, void *response, size_t responseLen) {
3928 populateResponseInfo(responseInfo, serial, responseType, e);
Jack Yuf68e0da2017-02-07 14:53:09 -08003929 IccIoResult result = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003930
3931 if (response == NULL || responseLen != sizeof(RIL_SIM_IO_Response)) {
3932 RLOGE("Invalid response: NULL");
3933 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003934 result.simResponse = hidl_string();
3935 } else {
3936 RIL_SIM_IO_Response *resp = (RIL_SIM_IO_Response *) response;
3937 result.sw1 = resp->sw1;
3938 result.sw2 = resp->sw2;
3939 result.simResponse = convertCharPtrToHidlString(resp->simResponse);
3940 }
3941 return result;
3942}
3943
Amit Mahajan759786a2017-03-03 17:35:47 -08003944int radio::iccIOForAppResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003945 int responseType, int serial, RIL_Errno e, void *response,
3946 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003947#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003948 RLOGD("iccIOForAppResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003949#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003950
3951 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003952 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003953 IccIoResult result = responseIccIo(responseInfo, serial, responseType, e, response,
3954 responseLen);
3955
3956 Return<void> retStatus = radioService[slotId]->mRadioResponse->iccIOForAppResponse(
3957 responseInfo, result);
3958 radioService[slotId]->checkReturnStatus(retStatus);
3959 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003960 RLOGE("iccIOForAppResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003961 }
3962
3963 return 0;
3964}
3965
Amit Mahajan759786a2017-03-03 17:35:47 -08003966int radio::sendUssdResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003967 int responseType, int serial, RIL_Errno e, void *response,
3968 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003969#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003970 RLOGD("sendUssdResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003971#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003972
3973 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003974 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003975 populateResponseInfo(responseInfo, serial, responseType, e);
3976 Return<void> retStatus = radioService[slotId]->mRadioResponse->sendUssdResponse(
3977 responseInfo);
3978 radioService[slotId]->checkReturnStatus(retStatus);
3979 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003980 RLOGE("sendUssdResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003981 slotId);
3982 }
3983
3984 return 0;
3985}
3986
Amit Mahajan759786a2017-03-03 17:35:47 -08003987int radio::cancelPendingUssdResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003988 int responseType, int serial, RIL_Errno e, void *response,
3989 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003990#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003991 RLOGD("cancelPendingUssdResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003992#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003993
3994 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003995 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003996 populateResponseInfo(responseInfo, serial, responseType, e);
3997 Return<void> retStatus = radioService[slotId]->mRadioResponse->cancelPendingUssdResponse(
3998 responseInfo);
3999 radioService[slotId]->checkReturnStatus(retStatus);
4000 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004001 RLOGE("cancelPendingUssdResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004002 slotId);
4003 }
4004
4005 return 0;
4006}
4007
Amit Mahajan759786a2017-03-03 17:35:47 -08004008int radio::getClirResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004009 int responseType, int serial, RIL_Errno e, void *response,
4010 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004011#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004012 RLOGD("getClirResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004013#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004014
4015 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004016 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004017 populateResponseInfo(responseInfo, serial, responseType, e);
4018 int n = -1, m = -1;
4019 int numInts = responseLen / sizeof(int);
4020 if (response == NULL || numInts != 2) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004021 RLOGE("getClirResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004022 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
4023 } else {
4024 int *pInt = (int *) response;
4025 n = pInt[0];
4026 m = pInt[1];
4027 }
4028 Return<void> retStatus = radioService[slotId]->mRadioResponse->getClirResponse(responseInfo,
4029 n, m);
4030 radioService[slotId]->checkReturnStatus(retStatus);
4031 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004032 RLOGE("getClirResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004033 }
4034
4035 return 0;
4036}
4037
Amit Mahajan759786a2017-03-03 17:35:47 -08004038int radio::setClirResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004039 int responseType, int serial, RIL_Errno e, void *response,
4040 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004041#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004042 RLOGD("setClirResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004043#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004044
4045 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004046 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004047 populateResponseInfo(responseInfo, serial, responseType, e);
4048 Return<void> retStatus = radioService[slotId]->mRadioResponse->setClirResponse(
4049 responseInfo);
4050 radioService[slotId]->checkReturnStatus(retStatus);
4051 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004052 RLOGE("setClirResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004053 }
4054
4055 return 0;
4056}
4057
Amit Mahajan759786a2017-03-03 17:35:47 -08004058int radio::getCallForwardStatusResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004059 int responseType, int serial, RIL_Errno e,
4060 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004061#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004062 RLOGD("getCallForwardStatusResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004063#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004064
4065 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004066 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004067 populateResponseInfo(responseInfo, serial, responseType, e);
4068 hidl_vec<CallForwardInfo> callForwardInfos;
4069
4070 if (response == NULL || responseLen % sizeof(RIL_CallForwardInfo *) != 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004071 RLOGE("getCallForwardStatusResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004072 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
4073 } else {
4074 int num = responseLen / sizeof(RIL_CallForwardInfo *);
4075 callForwardInfos.resize(num);
4076 for (int i = 0 ; i < num; i++) {
4077 RIL_CallForwardInfo *resp = ((RIL_CallForwardInfo **) response)[i];
4078 callForwardInfos[i].status = (CallForwardInfoStatus) resp->status;
4079 callForwardInfos[i].reason = resp->reason;
4080 callForwardInfos[i].serviceClass = resp->serviceClass;
4081 callForwardInfos[i].toa = resp->toa;
4082 callForwardInfos[i].number = convertCharPtrToHidlString(resp->number);
4083 callForwardInfos[i].timeSeconds = resp->timeSeconds;
4084 }
4085 }
4086
4087 Return<void> retStatus = radioService[slotId]->mRadioResponse->getCallForwardStatusResponse(
4088 responseInfo, callForwardInfos);
4089 radioService[slotId]->checkReturnStatus(retStatus);
4090 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004091 RLOGE("getCallForwardStatusResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004092 slotId);
4093 }
4094
4095 return 0;
4096}
4097
Amit Mahajan759786a2017-03-03 17:35:47 -08004098int radio::setCallForwardResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004099 int responseType, int serial, RIL_Errno e, void *response,
4100 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004101#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004102 RLOGD("setCallForwardResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004103#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004104
4105 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004106 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004107 populateResponseInfo(responseInfo, serial, responseType, e);
4108 Return<void> retStatus = radioService[slotId]->mRadioResponse->setCallForwardResponse(
4109 responseInfo);
4110 radioService[slotId]->checkReturnStatus(retStatus);
4111 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004112 RLOGE("setCallForwardResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004113 }
4114
4115 return 0;
4116}
4117
Amit Mahajan759786a2017-03-03 17:35:47 -08004118int radio::getCallWaitingResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004119 int responseType, int serial, RIL_Errno e, void *response,
4120 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004121#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004122 RLOGD("getCallWaitingResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004123#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004124
4125 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004126 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004127 populateResponseInfo(responseInfo, serial, responseType, e);
4128 bool enable = false;
4129 int serviceClass = -1;
4130 int numInts = responseLen / sizeof(int);
4131 if (response == NULL || numInts != 2) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004132 RLOGE("getCallWaitingResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004133 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
4134 } else {
4135 int *pInt = (int *) response;
4136 enable = pInt[0] == 1 ? true : false;
4137 serviceClass = pInt[1];
4138 }
Sanket Padawe5375bfa2017-03-07 17:21:05 -08004139 Return<void> retStatus = radioService[slotId]->mRadioResponse->getCallWaitingResponse(
4140 responseInfo, enable, serviceClass);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004141 radioService[slotId]->checkReturnStatus(retStatus);
4142 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004143 RLOGE("getCallWaitingResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004144 }
4145
4146 return 0;
4147}
4148
Amit Mahajan759786a2017-03-03 17:35:47 -08004149int radio::setCallWaitingResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004150 int responseType, int serial, RIL_Errno e, void *response,
4151 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004152#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004153 RLOGD("setCallWaitingResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004154#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004155
4156 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004157 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004158 populateResponseInfo(responseInfo, serial, responseType, e);
4159 Return<void> retStatus = radioService[slotId]->mRadioResponse->setCallWaitingResponse(
4160 responseInfo);
4161 radioService[slotId]->checkReturnStatus(retStatus);
4162 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004163 RLOGE("setCallWaitingResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004164 }
4165
4166 return 0;
4167}
4168
Amit Mahajan759786a2017-03-03 17:35:47 -08004169int radio::acknowledgeLastIncomingGsmSmsResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004170 int responseType, int serial, RIL_Errno e,
4171 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004172#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004173 RLOGD("acknowledgeLastIncomingGsmSmsResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004174#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004175
4176 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004177 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004178 populateResponseInfo(responseInfo, serial, responseType, e);
4179 Return<void> retStatus =
4180 radioService[slotId]->mRadioResponse->acknowledgeLastIncomingGsmSmsResponse(
4181 responseInfo);
4182 radioService[slotId]->checkReturnStatus(retStatus);
4183 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004184 RLOGE("acknowledgeLastIncomingGsmSmsResponse: radioService[%d]->mRadioResponse "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004185 "== NULL", slotId);
4186 }
4187
4188 return 0;
4189}
4190
Amit Mahajan759786a2017-03-03 17:35:47 -08004191int radio::acceptCallResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004192 int responseType, int serial, RIL_Errno e,
4193 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004194#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004195 RLOGD("acceptCallResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004196#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004197
4198 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004199 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004200 populateResponseInfo(responseInfo, serial, responseType, e);
4201 Return<void> retStatus = radioService[slotId]->mRadioResponse->acceptCallResponse(
4202 responseInfo);
4203 radioService[slotId]->checkReturnStatus(retStatus);
4204 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004205 RLOGE("acceptCallResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004206 slotId);
4207 }
4208
4209 return 0;
4210}
4211
Amit Mahajan759786a2017-03-03 17:35:47 -08004212int radio::deactivateDataCallResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004213 int responseType, int serial, RIL_Errno e,
4214 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004215#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004216 RLOGD("deactivateDataCallResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004217#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004218
4219 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004220 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004221 populateResponseInfo(responseInfo, serial, responseType, e);
4222 Return<void> retStatus = radioService[slotId]->mRadioResponse->deactivateDataCallResponse(
4223 responseInfo);
4224 radioService[slotId]->checkReturnStatus(retStatus);
4225 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004226 RLOGE("deactivateDataCallResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004227 slotId);
4228 }
4229
4230 return 0;
4231}
4232
Amit Mahajan759786a2017-03-03 17:35:47 -08004233int radio::getFacilityLockForAppResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004234 int responseType, int serial, RIL_Errno e,
4235 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004236#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004237 RLOGD("getFacilityLockForAppResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004238#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004239
4240 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004241 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004242 int ret = responseInt(responseInfo, serial, responseType, e, response, responseLen);
4243 Return<void> retStatus = radioService[slotId]->mRadioResponse->
4244 getFacilityLockForAppResponse(responseInfo, ret);
4245 radioService[slotId]->checkReturnStatus(retStatus);
4246 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004247 RLOGE("getFacilityLockForAppResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004248 slotId);
4249 }
4250
4251 return 0;
4252}
4253
Amit Mahajan759786a2017-03-03 17:35:47 -08004254int radio::setFacilityLockForAppResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004255 int responseType, int serial, RIL_Errno e,
4256 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004257#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004258 RLOGD("setFacilityLockForAppResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004259#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004260
4261 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004262 RadioResponseInfo responseInfo = {};
Naveen Kalla346bbc02017-03-16 12:55:55 -07004263 int ret = responseIntOrEmpty(responseInfo, serial, responseType, e, response, responseLen);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004264 Return<void> retStatus
4265 = radioService[slotId]->mRadioResponse->setFacilityLockForAppResponse(responseInfo,
4266 ret);
4267 radioService[slotId]->checkReturnStatus(retStatus);
4268 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004269 RLOGE("setFacilityLockForAppResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004270 slotId);
4271 }
4272
4273 return 0;
4274}
4275
Amit Mahajan759786a2017-03-03 17:35:47 -08004276int radio::setBarringPasswordResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004277 int responseType, int serial, RIL_Errno e,
4278 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004279#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004280 RLOGD("acceptCallResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004281#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004282
4283 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004284 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004285 populateResponseInfo(responseInfo, serial, responseType, e);
4286 Return<void> retStatus
4287 = radioService[slotId]->mRadioResponse->setBarringPasswordResponse(responseInfo);
4288 radioService[slotId]->checkReturnStatus(retStatus);
4289 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004290 RLOGE("setBarringPasswordResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004291 slotId);
4292 }
4293
4294 return 0;
4295}
4296
Amit Mahajan759786a2017-03-03 17:35:47 -08004297int radio::getNetworkSelectionModeResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004298 int responseType, int serial, RIL_Errno e, void *response,
4299 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004300#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004301 RLOGD("getNetworkSelectionModeResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004302#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004303
4304 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004305 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004306 populateResponseInfo(responseInfo, serial, responseType, e);
4307 bool manual = false;
4308 int serviceClass;
4309 if (response == NULL || responseLen != sizeof(int)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004310 RLOGE("getNetworkSelectionModeResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004311 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
4312 } else {
4313 int *pInt = (int *) response;
4314 manual = pInt[0] == 1 ? true : false;
4315 }
4316 Return<void> retStatus
4317 = radioService[slotId]->mRadioResponse->getNetworkSelectionModeResponse(
4318 responseInfo,
4319 manual);
4320 radioService[slotId]->checkReturnStatus(retStatus);
4321 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004322 RLOGE("getNetworkSelectionModeResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004323 slotId);
4324 }
4325
4326 return 0;
4327}
4328
Amit Mahajan759786a2017-03-03 17:35:47 -08004329int radio::setNetworkSelectionModeAutomaticResponse(int slotId, int responseType, int serial,
4330 RIL_Errno e, void *response,
4331 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004332#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004333 RLOGD("setNetworkSelectionModeAutomaticResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004334#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004335
4336 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004337 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004338 populateResponseInfo(responseInfo, serial, responseType, e);
4339 Return<void> retStatus
4340 = radioService[slotId]->mRadioResponse->setNetworkSelectionModeAutomaticResponse(
4341 responseInfo);
4342 radioService[slotId]->checkReturnStatus(retStatus);
4343 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004344 RLOGE("setNetworkSelectionModeAutomaticResponse: radioService[%d]->mRadioResponse "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004345 "== NULL", slotId);
4346 }
4347
4348 return 0;
4349}
4350
Amit Mahajan759786a2017-03-03 17:35:47 -08004351int radio::setNetworkSelectionModeManualResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004352 int responseType, int serial, RIL_Errno e,
4353 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004354#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004355 RLOGD("setNetworkSelectionModeManualResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004356#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004357
4358 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004359 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004360 populateResponseInfo(responseInfo, serial, responseType, e);
4361 Return<void> retStatus
4362 = radioService[slotId]->mRadioResponse->setNetworkSelectionModeManualResponse(
4363 responseInfo);
4364 radioService[slotId]->checkReturnStatus(retStatus);
4365 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004366 RLOGE("acceptCallResponse: radioService[%d]->setNetworkSelectionModeManualResponse "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004367 "== NULL", slotId);
4368 }
4369
4370 return 0;
4371}
4372
Jack Yuf68e0da2017-02-07 14:53:09 -08004373int convertOperatorStatusToInt(const char *str) {
4374 if (strncmp("unknown", str, 9) == 0) {
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004375 return (int) OperatorStatus::UNKNOWN;
Jack Yuf68e0da2017-02-07 14:53:09 -08004376 } else if (strncmp("available", str, 9) == 0) {
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004377 return (int) OperatorStatus::AVAILABLE;
Jack Yuf68e0da2017-02-07 14:53:09 -08004378 } else if (strncmp("current", str, 9) == 0) {
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004379 return (int) OperatorStatus::CURRENT;
Jack Yuf68e0da2017-02-07 14:53:09 -08004380 } else if (strncmp("forbidden", str, 9) == 0) {
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004381 return (int) OperatorStatus::FORBIDDEN;
4382 } else {
4383 return -1;
4384 }
4385}
4386
Amit Mahajan759786a2017-03-03 17:35:47 -08004387int radio::getAvailableNetworksResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004388 int responseType, int serial, RIL_Errno e, void *response,
4389 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004390#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004391 RLOGD("getAvailableNetworksResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004392#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004393
4394 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004395 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004396 populateResponseInfo(responseInfo, serial, responseType, e);
4397 hidl_vec<OperatorInfo> networks;
4398 if (response == NULL || responseLen % (4 * sizeof(char *))!= 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004399 RLOGE("getAvailableNetworksResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004400 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
4401 } else {
4402 char **resp = (char **) response;
4403 int numStrings = responseLen / sizeof(char *);
4404 networks.resize(numStrings/4);
Jayachandran Ce0d755c2017-03-01 18:26:50 -08004405 for (int i = 0, j = 0; i < numStrings; i = i + 4, j++) {
4406 networks[j].alphaLong = convertCharPtrToHidlString(resp[i]);
4407 networks[j].alphaShort = convertCharPtrToHidlString(resp[i + 1]);
4408 networks[j].operatorNumeric = convertCharPtrToHidlString(resp[i + 2]);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004409 int status = convertOperatorStatusToInt(resp[i + 3]);
4410 if (status == -1) {
4411 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
4412 } else {
Jayachandran Ce0d755c2017-03-01 18:26:50 -08004413 networks[j].status = (OperatorStatus) status;
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004414 }
4415 }
4416 }
4417 Return<void> retStatus
4418 = radioService[slotId]->mRadioResponse->getAvailableNetworksResponse(responseInfo,
4419 networks);
4420 radioService[slotId]->checkReturnStatus(retStatus);
4421 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004422 RLOGE("getAvailableNetworksResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004423 slotId);
4424 }
4425
4426 return 0;
4427}
4428
Amit Mahajan759786a2017-03-03 17:35:47 -08004429int radio::startDtmfResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004430 int responseType, int serial, RIL_Errno e,
4431 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004432#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004433 RLOGD("startDtmfResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004434#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004435
4436 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004437 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004438 populateResponseInfo(responseInfo, serial, responseType, e);
4439 Return<void> retStatus
4440 = radioService[slotId]->mRadioResponse->startDtmfResponse(responseInfo);
4441 radioService[slotId]->checkReturnStatus(retStatus);
4442 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004443 RLOGE("startDtmfResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004444 }
4445
4446 return 0;
4447}
4448
Amit Mahajan759786a2017-03-03 17:35:47 -08004449int radio::stopDtmfResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004450 int responseType, int serial, RIL_Errno e,
4451 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004452#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004453 RLOGD("stopDtmfResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004454#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004455
4456 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004457 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004458 populateResponseInfo(responseInfo, serial, responseType, e);
4459 Return<void> retStatus
4460 = radioService[slotId]->mRadioResponse->stopDtmfResponse(responseInfo);
4461 radioService[slotId]->checkReturnStatus(retStatus);
4462 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004463 RLOGE("stopDtmfResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004464 }
4465
4466 return 0;
4467}
4468
Amit Mahajan759786a2017-03-03 17:35:47 -08004469int radio::getBasebandVersionResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004470 int responseType, int serial, RIL_Errno e,
4471 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004472#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004473 RLOGD("getBasebandVersionResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004474#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004475
4476 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004477 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004478 populateResponseInfo(responseInfo, serial, responseType, e);
4479 Return<void> retStatus
4480 = radioService[slotId]->mRadioResponse->getBasebandVersionResponse(responseInfo,
4481 convertCharPtrToHidlString((char *) response));
4482 radioService[slotId]->checkReturnStatus(retStatus);
4483 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004484 RLOGE("getBasebandVersionResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004485 }
4486
4487 return 0;
4488}
4489
Amit Mahajan759786a2017-03-03 17:35:47 -08004490int radio::separateConnectionResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004491 int responseType, int serial, RIL_Errno e,
4492 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004493#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004494 RLOGD("separateConnectionResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004495#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004496
4497 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004498 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004499 populateResponseInfo(responseInfo, serial, responseType, e);
4500 Return<void> retStatus
4501 = radioService[slotId]->mRadioResponse->separateConnectionResponse(responseInfo);
4502 radioService[slotId]->checkReturnStatus(retStatus);
4503 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004504 RLOGE("separateConnectionResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004505 slotId);
4506 }
4507
4508 return 0;
4509}
4510
Amit Mahajan759786a2017-03-03 17:35:47 -08004511int radio::setMuteResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004512 int responseType, int serial, RIL_Errno e,
4513 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004514#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004515 RLOGD("setMuteResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004516#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004517
4518 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004519 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004520 populateResponseInfo(responseInfo, serial, responseType, e);
4521 Return<void> retStatus
4522 = radioService[slotId]->mRadioResponse->setMuteResponse(responseInfo);
4523 radioService[slotId]->checkReturnStatus(retStatus);
4524 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004525 RLOGE("setMuteResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004526 }
4527
4528 return 0;
4529}
4530
Amit Mahajan759786a2017-03-03 17:35:47 -08004531int radio::getMuteResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004532 int responseType, int serial, RIL_Errno e, void *response,
4533 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004534#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004535 RLOGD("getMuteResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004536#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004537
4538 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004539 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004540 populateResponseInfo(responseInfo, serial, responseType, e);
4541 bool enable = false;
4542 int serviceClass;
4543 if (response == NULL || responseLen != sizeof(int)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004544 RLOGE("getMuteResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004545 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
4546 } else {
4547 int *pInt = (int *) response;
4548 enable = pInt[0] == 1 ? true : false;
4549 }
4550 Return<void> retStatus = radioService[slotId]->mRadioResponse->getMuteResponse(responseInfo,
4551 enable);
4552 radioService[slotId]->checkReturnStatus(retStatus);
4553 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004554 RLOGE("getMuteResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004555 }
4556
4557 return 0;
4558}
4559
Amit Mahajan759786a2017-03-03 17:35:47 -08004560int radio::getClipResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004561 int responseType, int serial, RIL_Errno e,
4562 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004563#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004564 RLOGD("getClipResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004565#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004566
4567 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004568 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004569 int ret = responseInt(responseInfo, serial, responseType, e, response, responseLen);
4570 Return<void> retStatus = radioService[slotId]->mRadioResponse->getClipResponse(responseInfo,
4571 (ClipStatus) ret);
4572 radioService[slotId]->checkReturnStatus(retStatus);
4573 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004574 RLOGE("getClipResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004575 }
4576
4577 return 0;
4578}
4579
Amit Mahajan759786a2017-03-03 17:35:47 -08004580int radio::getDataCallListResponse(int slotId,
Amit Mahajan3df62912017-02-10 01:35:55 +00004581 int responseType, int serial, RIL_Errno e,
4582 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004583#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004584 RLOGD("getDataCallListResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004585#endif
Amit Mahajan3df62912017-02-10 01:35:55 +00004586
4587 if (radioService[slotId]->mRadioResponse != NULL) {
Amit Mahajan3da9ac02017-02-13 13:41:28 -08004588 RadioResponseInfo responseInfo = {};
Amit Mahajan3df62912017-02-10 01:35:55 +00004589 populateResponseInfo(responseInfo, serial, responseType, e);
4590
4591 hidl_vec<SetupDataCallResult> ret;
4592 if (response == NULL || responseLen % sizeof(RIL_Data_Call_Response_v11) != 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004593 RLOGE("getDataCallListResponse: invalid response");
Amit Mahajan3df62912017-02-10 01:35:55 +00004594 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
4595 } else {
4596 convertRilDataCallListToHal(response, responseLen, ret);
4597 }
4598
4599 Return<void> retStatus = radioService[slotId]->mRadioResponse->getDataCallListResponse(
4600 responseInfo, ret);
4601 radioService[slotId]->checkReturnStatus(retStatus);
4602 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004603 RLOGE("getDataCallListResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Amit Mahajan3df62912017-02-10 01:35:55 +00004604 }
4605
4606 return 0;
4607}
4608
Amit Mahajan759786a2017-03-03 17:35:47 -08004609int radio::setSuppServiceNotificationsResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004610 int responseType, int serial, RIL_Errno e,
4611 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004612#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004613 RLOGD("setSuppServiceNotificationsResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004614#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004615
4616 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004617 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004618 populateResponseInfo(responseInfo, serial, responseType, e);
4619 Return<void> retStatus
4620 = radioService[slotId]->mRadioResponse->setSuppServiceNotificationsResponse(
4621 responseInfo);
4622 radioService[slotId]->checkReturnStatus(retStatus);
4623 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004624 RLOGE("setSuppServiceNotificationsResponse: radioService[%d]->mRadioResponse "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004625 "== NULL", slotId);
4626 }
4627
4628 return 0;
4629}
4630
Amit Mahajan759786a2017-03-03 17:35:47 -08004631int radio::deleteSmsOnSimResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004632 int responseType, int serial, RIL_Errno e,
4633 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004634#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004635 RLOGD("deleteSmsOnSimResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004636#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004637
4638 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004639 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004640 populateResponseInfo(responseInfo, serial, responseType, e);
4641 Return<void> retStatus
4642 = radioService[slotId]->mRadioResponse->deleteSmsOnSimResponse(responseInfo);
4643 radioService[slotId]->checkReturnStatus(retStatus);
4644 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004645 RLOGE("deleteSmsOnSimResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004646 }
4647
4648 return 0;
4649}
4650
Amit Mahajan759786a2017-03-03 17:35:47 -08004651int radio::setBandModeResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004652 int responseType, int serial, RIL_Errno e,
4653 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004654#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004655 RLOGD("setBandModeResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004656#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004657
4658 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004659 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004660 populateResponseInfo(responseInfo, serial, responseType, e);
4661 Return<void> retStatus
4662 = radioService[slotId]->mRadioResponse->setBandModeResponse(responseInfo);
4663 radioService[slotId]->checkReturnStatus(retStatus);
4664 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004665 RLOGE("setBandModeResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004666 }
4667
4668 return 0;
4669}
4670
Amit Mahajan759786a2017-03-03 17:35:47 -08004671int radio::writeSmsToSimResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004672 int responseType, int serial, RIL_Errno e,
4673 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004674#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004675 RLOGD("writeSmsToSimResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004676#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004677
4678 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004679 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004680 int ret = responseInt(responseInfo, serial, responseType, e, response, responseLen);
4681 Return<void> retStatus
4682 = radioService[slotId]->mRadioResponse->writeSmsToSimResponse(responseInfo, ret);
4683 radioService[slotId]->checkReturnStatus(retStatus);
4684 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004685 RLOGE("writeSmsToSimResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004686 }
4687
4688 return 0;
4689}
4690
Amit Mahajan759786a2017-03-03 17:35:47 -08004691int radio::getAvailableBandModesResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004692 int responseType, int serial, RIL_Errno e, void *response,
4693 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004694#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004695 RLOGD("getAvailableBandModesResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004696#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004697
4698 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004699 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004700 populateResponseInfo(responseInfo, serial, responseType, e);
4701 hidl_vec<RadioBandMode> modes;
4702 if (response == NULL || responseLen % sizeof(int) != 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004703 RLOGE("getAvailableBandModesResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004704 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
4705 } else {
4706 int *pInt = (int *) response;
4707 int numInts = responseLen / sizeof(int);
4708 modes.resize(numInts);
4709 for (int i = 0; i < numInts; i++) {
4710 modes[i] = (RadioBandMode) pInt[i];
4711 }
4712 }
4713 Return<void> retStatus
4714 = radioService[slotId]->mRadioResponse->getAvailableBandModesResponse(responseInfo,
4715 modes);
4716 radioService[slotId]->checkReturnStatus(retStatus);
4717 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004718 RLOGE("getAvailableBandModesResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004719 slotId);
4720 }
4721
4722 return 0;
4723}
4724
Amit Mahajan759786a2017-03-03 17:35:47 -08004725int radio::sendEnvelopeResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004726 int responseType, int serial, RIL_Errno e,
4727 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004728#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004729 RLOGD("sendEnvelopeResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004730#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004731
4732 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004733 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004734 populateResponseInfo(responseInfo, serial, responseType, e);
4735 Return<void> retStatus
4736 = radioService[slotId]->mRadioResponse->sendEnvelopeResponse(responseInfo,
4737 convertCharPtrToHidlString((char *) response));
4738 radioService[slotId]->checkReturnStatus(retStatus);
4739 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004740 RLOGE("sendEnvelopeResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004741 }
4742
4743 return 0;
4744}
4745
Amit Mahajan759786a2017-03-03 17:35:47 -08004746int radio::sendTerminalResponseToSimResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004747 int responseType, int serial, RIL_Errno e,
4748 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004749#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004750 RLOGD("sendTerminalResponseToSimResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004751#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004752
4753 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004754 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004755 populateResponseInfo(responseInfo, serial, responseType, e);
4756 Return<void> retStatus
4757 = radioService[slotId]->mRadioResponse->sendTerminalResponseToSimResponse(
4758 responseInfo);
4759 radioService[slotId]->checkReturnStatus(retStatus);
4760 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004761 RLOGE("sendTerminalResponseToSimResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004762 slotId);
4763 }
4764
4765 return 0;
4766}
4767
Amit Mahajan759786a2017-03-03 17:35:47 -08004768int radio::handleStkCallSetupRequestFromSimResponse(int slotId,
4769 int responseType, int serial,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004770 RIL_Errno e, void *response,
4771 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004772#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004773 RLOGD("handleStkCallSetupRequestFromSimResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004774#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004775
4776 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004777 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004778 populateResponseInfo(responseInfo, serial, responseType, e);
4779 Return<void> retStatus
4780 = radioService[slotId]->mRadioResponse->handleStkCallSetupRequestFromSimResponse(
4781 responseInfo);
4782 radioService[slotId]->checkReturnStatus(retStatus);
4783 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004784 RLOGE("handleStkCallSetupRequestFromSimResponse: radioService[%d]->mRadioResponse "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004785 "== NULL", slotId);
4786 }
4787
4788 return 0;
4789}
4790
Amit Mahajan759786a2017-03-03 17:35:47 -08004791int radio::explicitCallTransferResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004792 int responseType, int serial, RIL_Errno e,
4793 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004794#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004795 RLOGD("explicitCallTransferResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004796#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004797
4798 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004799 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004800 populateResponseInfo(responseInfo, serial, responseType, e);
4801 Return<void> retStatus
4802 = radioService[slotId]->mRadioResponse->explicitCallTransferResponse(responseInfo);
4803 radioService[slotId]->checkReturnStatus(retStatus);
4804 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004805 RLOGE("explicitCallTransferResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004806 slotId);
4807 }
4808
4809 return 0;
4810}
4811
Amit Mahajan759786a2017-03-03 17:35:47 -08004812int radio::setPreferredNetworkTypeResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004813 int responseType, int serial, RIL_Errno e,
4814 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004815#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004816 RLOGD("setPreferredNetworkTypeResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004817#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004818
4819 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004820 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004821 populateResponseInfo(responseInfo, serial, responseType, e);
4822 Return<void> retStatus
4823 = radioService[slotId]->mRadioResponse->setPreferredNetworkTypeResponse(
4824 responseInfo);
4825 radioService[slotId]->checkReturnStatus(retStatus);
4826 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004827 RLOGE("setPreferredNetworkTypeResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004828 slotId);
4829 }
4830
4831 return 0;
4832}
4833
4834
Amit Mahajan759786a2017-03-03 17:35:47 -08004835int radio::getPreferredNetworkTypeResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004836 int responseType, int serial, RIL_Errno e,
4837 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004838#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004839 RLOGD("getPreferredNetworkTypeResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004840#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004841
4842 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004843 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004844 int ret = responseInt(responseInfo, serial, responseType, e, response, responseLen);
4845 Return<void> retStatus
4846 = radioService[slotId]->mRadioResponse->getPreferredNetworkTypeResponse(
4847 responseInfo, (PreferredNetworkType) ret);
4848 radioService[slotId]->checkReturnStatus(retStatus);
4849 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004850 RLOGE("getPreferredNetworkTypeResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004851 slotId);
4852 }
4853
4854 return 0;
4855}
4856
Amit Mahajan759786a2017-03-03 17:35:47 -08004857int radio::getNeighboringCidsResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004858 int responseType, int serial, RIL_Errno e,
4859 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004860#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004861 RLOGD("getNeighboringCidsResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004862#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004863
4864 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004865 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004866 populateResponseInfo(responseInfo, serial, responseType, e);
4867 hidl_vec<NeighboringCell> cells;
4868
4869 if (response == NULL || responseLen % sizeof(RIL_NeighboringCell *) != 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004870 RLOGE("getNeighboringCidsResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004871 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
4872 } else {
4873 int num = responseLen / sizeof(RIL_NeighboringCell *);
4874 cells.resize(num);
4875 for (int i = 0 ; i < num; i++) {
4876 RIL_NeighboringCell *resp = ((RIL_NeighboringCell **) response)[i];
4877 cells[i].cid = convertCharPtrToHidlString(resp->cid);
4878 cells[i].rssi = resp->rssi;
4879 }
4880 }
4881
4882 Return<void> retStatus
4883 = radioService[slotId]->mRadioResponse->getNeighboringCidsResponse(responseInfo,
4884 cells);
4885 radioService[slotId]->checkReturnStatus(retStatus);
4886 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004887 RLOGE("getNeighboringCidsResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004888 slotId);
4889 }
4890
4891 return 0;
4892}
4893
Amit Mahajan759786a2017-03-03 17:35:47 -08004894int radio::setLocationUpdatesResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004895 int responseType, int serial, RIL_Errno e,
4896 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004897#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004898 RLOGD("setLocationUpdatesResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004899#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004900
4901 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004902 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004903 populateResponseInfo(responseInfo, serial, responseType, e);
4904 Return<void> retStatus
4905 = radioService[slotId]->mRadioResponse->setLocationUpdatesResponse(responseInfo);
4906 radioService[slotId]->checkReturnStatus(retStatus);
4907 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004908 RLOGE("setLocationUpdatesResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004909 slotId);
4910 }
4911
4912 return 0;
4913}
4914
Amit Mahajan759786a2017-03-03 17:35:47 -08004915int radio::setCdmaSubscriptionSourceResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004916 int responseType, int serial, RIL_Errno e,
4917 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004918#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004919 RLOGD("setCdmaSubscriptionSourceResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004920#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004921
4922 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004923 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004924 populateResponseInfo(responseInfo, serial, responseType, e);
4925 Return<void> retStatus
4926 = radioService[slotId]->mRadioResponse->setCdmaSubscriptionSourceResponse(
4927 responseInfo);
4928 radioService[slotId]->checkReturnStatus(retStatus);
4929 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004930 RLOGE("setCdmaSubscriptionSourceResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004931 slotId);
4932 }
4933
4934 return 0;
4935}
4936
Amit Mahajan759786a2017-03-03 17:35:47 -08004937int radio::setCdmaRoamingPreferenceResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004938 int responseType, int serial, RIL_Errno e,
4939 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004940#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004941 RLOGD("setCdmaRoamingPreferenceResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004942#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004943
4944 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004945 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004946 populateResponseInfo(responseInfo, serial, responseType, e);
4947 Return<void> retStatus
4948 = radioService[slotId]->mRadioResponse->setCdmaRoamingPreferenceResponse(
4949 responseInfo);
4950 radioService[slotId]->checkReturnStatus(retStatus);
4951 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004952 RLOGE("setCdmaRoamingPreferenceResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004953 slotId);
4954 }
4955
4956 return 0;
4957}
4958
Amit Mahajan759786a2017-03-03 17:35:47 -08004959int radio::getCdmaRoamingPreferenceResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004960 int responseType, int serial, RIL_Errno e,
4961 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004962#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004963 RLOGD("getCdmaRoamingPreferenceResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004964#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004965
4966 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004967 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004968 int ret = responseInt(responseInfo, serial, responseType, e, response, responseLen);
4969 Return<void> retStatus
4970 = radioService[slotId]->mRadioResponse->getCdmaRoamingPreferenceResponse(
4971 responseInfo, (CdmaRoamingType) ret);
4972 radioService[slotId]->checkReturnStatus(retStatus);
4973 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004974 RLOGE("getCdmaRoamingPreferenceResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004975 slotId);
4976 }
4977
4978 return 0;
4979}
4980
Amit Mahajan759786a2017-03-03 17:35:47 -08004981int radio::setTTYModeResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004982 int responseType, int serial, RIL_Errno e,
4983 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004984#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004985 RLOGD("setTTYModeResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004986#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004987
4988 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004989 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004990 populateResponseInfo(responseInfo, serial, responseType, e);
4991 Return<void> retStatus
4992 = radioService[slotId]->mRadioResponse->setTTYModeResponse(responseInfo);
4993 radioService[slotId]->checkReturnStatus(retStatus);
4994 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004995 RLOGE("setTTYModeResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004996 }
4997
4998 return 0;
4999}
5000
Amit Mahajan759786a2017-03-03 17:35:47 -08005001int radio::getTTYModeResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005002 int responseType, int serial, RIL_Errno e,
5003 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005004#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005005 RLOGD("getTTYModeResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005006#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005007
5008 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005009 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005010 int ret = responseInt(responseInfo, serial, responseType, e, response, responseLen);
5011 Return<void> retStatus
5012 = radioService[slotId]->mRadioResponse->getTTYModeResponse(responseInfo,
5013 (TtyMode) ret);
5014 radioService[slotId]->checkReturnStatus(retStatus);
5015 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005016 RLOGE("getTTYModeResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005017 }
5018
5019 return 0;
5020}
5021
Amit Mahajan759786a2017-03-03 17:35:47 -08005022int radio::setPreferredVoicePrivacyResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005023 int responseType, int serial, RIL_Errno e,
5024 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005025#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005026 RLOGD("setPreferredVoicePrivacyResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005027#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005028
5029 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005030 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005031 populateResponseInfo(responseInfo, serial, responseType, e);
5032 Return<void> retStatus
5033 = radioService[slotId]->mRadioResponse->setPreferredVoicePrivacyResponse(
5034 responseInfo);
5035 radioService[slotId]->checkReturnStatus(retStatus);
5036 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005037 RLOGE("setPreferredVoicePrivacyResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005038 slotId);
5039 }
5040
5041 return 0;
5042}
5043
Amit Mahajan759786a2017-03-03 17:35:47 -08005044int radio::getPreferredVoicePrivacyResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005045 int responseType, int serial, RIL_Errno e,
5046 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005047#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005048 RLOGD("getPreferredVoicePrivacyResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005049#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005050
5051 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005052 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005053 populateResponseInfo(responseInfo, serial, responseType, e);
5054 bool enable = false;
5055 int numInts = responseLen / sizeof(int);
5056 if (response == NULL || numInts != 1) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005057 RLOGE("getPreferredVoicePrivacyResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005058 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
5059 } else {
5060 int *pInt = (int *) response;
5061 enable = pInt[0] == 1 ? true : false;
5062 }
5063 Return<void> retStatus
5064 = radioService[slotId]->mRadioResponse->getPreferredVoicePrivacyResponse(
5065 responseInfo, enable);
5066 radioService[slotId]->checkReturnStatus(retStatus);
5067 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005068 RLOGE("getPreferredVoicePrivacyResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005069 slotId);
5070 }
5071
5072 return 0;
5073}
5074
Amit Mahajan759786a2017-03-03 17:35:47 -08005075int radio::sendCDMAFeatureCodeResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005076 int responseType, int serial, RIL_Errno e,
5077 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005078#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005079 RLOGD("sendCDMAFeatureCodeResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005080#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005081
5082 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005083 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005084 populateResponseInfo(responseInfo, serial, responseType, e);
5085 Return<void> retStatus
5086 = radioService[slotId]->mRadioResponse->sendCDMAFeatureCodeResponse(responseInfo);
5087 radioService[slotId]->checkReturnStatus(retStatus);
5088 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005089 RLOGE("sendCDMAFeatureCodeResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005090 slotId);
5091 }
5092
5093 return 0;
5094}
5095
Amit Mahajan759786a2017-03-03 17:35:47 -08005096int radio::sendBurstDtmfResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005097 int responseType, int serial, RIL_Errno e,
5098 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005099#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005100 RLOGD("sendBurstDtmfResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005101#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005102
5103 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005104 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005105 populateResponseInfo(responseInfo, serial, responseType, e);
5106 Return<void> retStatus
5107 = radioService[slotId]->mRadioResponse->sendBurstDtmfResponse(responseInfo);
5108 radioService[slotId]->checkReturnStatus(retStatus);
5109 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005110 RLOGE("sendBurstDtmfResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005111 }
5112
5113 return 0;
5114}
5115
Amit Mahajan759786a2017-03-03 17:35:47 -08005116int radio::sendCdmaSmsResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005117 int responseType, int serial, RIL_Errno e, void *response,
5118 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005119#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005120 RLOGD("sendCdmaSmsResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005121#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005122
5123 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005124 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005125 SendSmsResult result = makeSendSmsResult(responseInfo, serial, responseType, e, response,
5126 responseLen);
5127
5128 Return<void> retStatus
5129 = radioService[slotId]->mRadioResponse->sendCdmaSmsResponse(responseInfo, result);
5130 radioService[slotId]->checkReturnStatus(retStatus);
5131 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005132 RLOGE("sendCdmaSmsResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005133 }
5134
5135 return 0;
5136}
5137
Amit Mahajan759786a2017-03-03 17:35:47 -08005138int radio::acknowledgeLastIncomingCdmaSmsResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005139 int responseType, int serial, RIL_Errno e,
5140 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005141#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005142 RLOGD("acknowledgeLastIncomingCdmaSmsResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005143#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005144
5145 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005146 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005147 populateResponseInfo(responseInfo, serial, responseType, e);
5148 Return<void> retStatus
5149 = radioService[slotId]->mRadioResponse->acknowledgeLastIncomingCdmaSmsResponse(
5150 responseInfo);
5151 radioService[slotId]->checkReturnStatus(retStatus);
5152 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005153 RLOGE("acknowledgeLastIncomingCdmaSmsResponse: radioService[%d]->mRadioResponse "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005154 "== NULL", slotId);
5155 }
5156
5157 return 0;
5158}
5159
Amit Mahajan759786a2017-03-03 17:35:47 -08005160int radio::getGsmBroadcastConfigResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005161 int responseType, int serial, RIL_Errno e,
5162 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005163#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005164 RLOGD("getGsmBroadcastConfigResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005165#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005166
5167 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005168 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005169 populateResponseInfo(responseInfo, serial, responseType, e);
5170 hidl_vec<GsmBroadcastSmsConfigInfo> configs;
5171
5172 if (response == NULL || responseLen % sizeof(RIL_GSM_BroadcastSmsConfigInfo *) != 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005173 RLOGE("getGsmBroadcastConfigResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005174 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
5175 } else {
5176 int num = responseLen / sizeof(RIL_GSM_BroadcastSmsConfigInfo *);
5177 configs.resize(num);
5178 for (int i = 0 ; i < num; i++) {
5179 RIL_GSM_BroadcastSmsConfigInfo *resp =
5180 ((RIL_GSM_BroadcastSmsConfigInfo **) response)[i];
5181 configs[i].fromServiceId = resp->fromServiceId;
5182 configs[i].toServiceId = resp->toServiceId;
5183 configs[i].fromCodeScheme = resp->fromCodeScheme;
5184 configs[i].toCodeScheme = resp->toCodeScheme;
5185 configs[i].selected = resp->selected == 1 ? true : false;
5186 }
5187 }
5188
5189 Return<void> retStatus
5190 = radioService[slotId]->mRadioResponse->getGsmBroadcastConfigResponse(responseInfo,
5191 configs);
5192 radioService[slotId]->checkReturnStatus(retStatus);
5193 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005194 RLOGE("getGsmBroadcastConfigResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005195 slotId);
5196 }
5197
5198 return 0;
5199}
5200
Amit Mahajan759786a2017-03-03 17:35:47 -08005201int radio::setGsmBroadcastConfigResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005202 int responseType, int serial, RIL_Errno e,
5203 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005204#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005205 RLOGD("setGsmBroadcastConfigResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005206#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005207
5208 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005209 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005210 populateResponseInfo(responseInfo, serial, responseType, e);
5211 Return<void> retStatus
5212 = radioService[slotId]->mRadioResponse->setGsmBroadcastConfigResponse(responseInfo);
5213 radioService[slotId]->checkReturnStatus(retStatus);
5214 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005215 RLOGE("setGsmBroadcastConfigResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005216 slotId);
5217 }
5218
5219 return 0;
5220}
5221
Amit Mahajan759786a2017-03-03 17:35:47 -08005222int radio::setGsmBroadcastActivationResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005223 int responseType, int serial, RIL_Errno e,
5224 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005225#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005226 RLOGD("setGsmBroadcastActivationResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005227#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005228
5229 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005230 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005231 populateResponseInfo(responseInfo, serial, responseType, e);
5232 Return<void> retStatus
5233 = radioService[slotId]->mRadioResponse->setGsmBroadcastActivationResponse(
5234 responseInfo);
5235 radioService[slotId]->checkReturnStatus(retStatus);
5236 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005237 RLOGE("setGsmBroadcastActivationResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005238 slotId);
5239 }
5240
5241 return 0;
5242}
5243
Amit Mahajan759786a2017-03-03 17:35:47 -08005244int radio::getCdmaBroadcastConfigResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005245 int responseType, int serial, RIL_Errno e,
5246 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005247#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005248 RLOGD("getCdmaBroadcastConfigResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005249#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005250
5251 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005252 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005253 populateResponseInfo(responseInfo, serial, responseType, e);
5254 hidl_vec<CdmaBroadcastSmsConfigInfo> configs;
5255
5256 if (response == NULL || responseLen % sizeof(RIL_CDMA_BroadcastSmsConfigInfo *) != 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005257 RLOGE("getCdmaBroadcastConfigResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005258 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
5259 } else {
5260 int num = responseLen / sizeof(RIL_CDMA_BroadcastSmsConfigInfo *);
5261 configs.resize(num);
5262 for (int i = 0 ; i < num; i++) {
5263 RIL_CDMA_BroadcastSmsConfigInfo *resp =
5264 ((RIL_CDMA_BroadcastSmsConfigInfo **) response)[i];
5265 configs[i].serviceCategory = resp->service_category;
5266 configs[i].language = resp->language;
5267 configs[i].selected = resp->selected == 1 ? true : false;
5268 }
5269 }
5270
5271 Return<void> retStatus
5272 = radioService[slotId]->mRadioResponse->getCdmaBroadcastConfigResponse(responseInfo,
5273 configs);
5274 radioService[slotId]->checkReturnStatus(retStatus);
5275 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005276 RLOGE("getCdmaBroadcastConfigResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005277 slotId);
5278 }
5279
5280 return 0;
5281}
5282
Amit Mahajan759786a2017-03-03 17:35:47 -08005283int radio::setCdmaBroadcastConfigResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005284 int responseType, int serial, RIL_Errno e,
5285 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005286#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005287 RLOGD("setCdmaBroadcastConfigResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005288#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005289
5290 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005291 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005292 populateResponseInfo(responseInfo, serial, responseType, e);
5293 Return<void> retStatus
5294 = radioService[slotId]->mRadioResponse->setCdmaBroadcastConfigResponse(
5295 responseInfo);
5296 radioService[slotId]->checkReturnStatus(retStatus);
5297 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005298 RLOGE("setCdmaBroadcastConfigResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005299 slotId);
5300 }
5301
5302 return 0;
5303}
5304
Amit Mahajan759786a2017-03-03 17:35:47 -08005305int radio::setCdmaBroadcastActivationResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005306 int responseType, int serial, RIL_Errno e,
5307 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005308#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005309 RLOGD("setCdmaBroadcastActivationResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005310#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005311
5312 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005313 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005314 populateResponseInfo(responseInfo, serial, responseType, e);
5315 Return<void> retStatus
5316 = radioService[slotId]->mRadioResponse->setCdmaBroadcastActivationResponse(
5317 responseInfo);
5318 radioService[slotId]->checkReturnStatus(retStatus);
5319 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005320 RLOGE("setCdmaBroadcastActivationResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005321 slotId);
5322 }
5323
5324 return 0;
5325}
5326
Amit Mahajan759786a2017-03-03 17:35:47 -08005327int radio::getCDMASubscriptionResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005328 int responseType, int serial, RIL_Errno e, void *response,
5329 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005330#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005331 RLOGD("getCDMASubscriptionResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005332#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005333
5334 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005335 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005336 populateResponseInfo(responseInfo, serial, responseType, e);
5337
5338 int numStrings = responseLen / sizeof(char *);
5339 hidl_string emptyString;
5340 if (response == NULL || numStrings != 5) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005341 RLOGE("getOperatorResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005342 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
5343 Return<void> retStatus
5344 = radioService[slotId]->mRadioResponse->getCDMASubscriptionResponse(
5345 responseInfo, emptyString, emptyString, emptyString, emptyString, emptyString);
5346 radioService[slotId]->checkReturnStatus(retStatus);
5347 } else {
5348 char **resp = (char **) response;
5349 Return<void> retStatus
5350 = radioService[slotId]->mRadioResponse->getCDMASubscriptionResponse(
5351 responseInfo,
5352 convertCharPtrToHidlString(resp[0]),
5353 convertCharPtrToHidlString(resp[1]),
5354 convertCharPtrToHidlString(resp[2]),
5355 convertCharPtrToHidlString(resp[3]),
5356 convertCharPtrToHidlString(resp[4]));
5357 radioService[slotId]->checkReturnStatus(retStatus);
5358 }
5359 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005360 RLOGE("getCDMASubscriptionResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005361 slotId);
5362 }
5363
5364 return 0;
5365}
5366
Amit Mahajan759786a2017-03-03 17:35:47 -08005367int radio::writeSmsToRuimResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005368 int responseType, int serial, RIL_Errno e,
5369 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005370#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005371 RLOGD("writeSmsToRuimResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005372#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005373
5374 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005375 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005376 int ret = responseInt(responseInfo, serial, responseType, e, response, responseLen);
5377 Return<void> retStatus
5378 = radioService[slotId]->mRadioResponse->writeSmsToRuimResponse(responseInfo, ret);
5379 radioService[slotId]->checkReturnStatus(retStatus);
5380 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005381 RLOGE("writeSmsToRuimResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005382 }
5383
5384 return 0;
5385}
5386
Amit Mahajan759786a2017-03-03 17:35:47 -08005387int radio::deleteSmsOnRuimResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005388 int responseType, int serial, RIL_Errno e,
5389 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005390#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005391 RLOGD("deleteSmsOnRuimResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005392#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005393
5394 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005395 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005396 populateResponseInfo(responseInfo, serial, responseType, e);
5397 Return<void> retStatus
5398 = radioService[slotId]->mRadioResponse->deleteSmsOnRuimResponse(responseInfo);
5399 radioService[slotId]->checkReturnStatus(retStatus);
5400 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005401 RLOGE("deleteSmsOnRuimResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005402 }
5403
5404 return 0;
5405}
5406
Amit Mahajan759786a2017-03-03 17:35:47 -08005407int radio::getDeviceIdentityResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005408 int responseType, int serial, RIL_Errno e, void *response,
5409 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005410#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005411 RLOGD("getDeviceIdentityResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005412#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005413
5414 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005415 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005416 populateResponseInfo(responseInfo, serial, responseType, e);
5417
5418 int numStrings = responseLen / sizeof(char *);
5419 hidl_string emptyString;
5420 if (response == NULL || numStrings != 4) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005421 RLOGE("getDeviceIdentityResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005422 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
5423 Return<void> retStatus
5424 = radioService[slotId]->mRadioResponse->getDeviceIdentityResponse(responseInfo,
5425 emptyString, emptyString, emptyString, emptyString);
5426 radioService[slotId]->checkReturnStatus(retStatus);
5427 } else {
5428 char **resp = (char **) response;
5429 Return<void> retStatus
5430 = radioService[slotId]->mRadioResponse->getDeviceIdentityResponse(responseInfo,
5431 convertCharPtrToHidlString(resp[0]),
5432 convertCharPtrToHidlString(resp[1]),
5433 convertCharPtrToHidlString(resp[2]),
5434 convertCharPtrToHidlString(resp[3]));
5435 radioService[slotId]->checkReturnStatus(retStatus);
5436 }
5437 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005438 RLOGE("getDeviceIdentityResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005439 slotId);
5440 }
5441
5442 return 0;
5443}
5444
Amit Mahajan759786a2017-03-03 17:35:47 -08005445int radio::exitEmergencyCallbackModeResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005446 int responseType, int serial, RIL_Errno e,
5447 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005448#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005449 RLOGD("exitEmergencyCallbackModeResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005450#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005451
5452 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005453 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005454 populateResponseInfo(responseInfo, serial, responseType, e);
5455 Return<void> retStatus
5456 = radioService[slotId]->mRadioResponse->exitEmergencyCallbackModeResponse(
5457 responseInfo);
5458 radioService[slotId]->checkReturnStatus(retStatus);
5459 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005460 RLOGE("exitEmergencyCallbackModeResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005461 slotId);
5462 }
5463
5464 return 0;
5465}
5466
Amit Mahajan759786a2017-03-03 17:35:47 -08005467int radio::getSmscAddressResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005468 int responseType, int serial, RIL_Errno e,
5469 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005470#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005471 RLOGD("getSmscAddressResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005472#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005473
5474 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005475 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005476 populateResponseInfo(responseInfo, serial, responseType, e);
5477 Return<void> retStatus
5478 = radioService[slotId]->mRadioResponse->getSmscAddressResponse(responseInfo,
5479 convertCharPtrToHidlString((char *) response));
5480 radioService[slotId]->checkReturnStatus(retStatus);
5481 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005482 RLOGE("getSmscAddressResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005483 }
5484
5485 return 0;
5486}
5487
Amit Mahajan759786a2017-03-03 17:35:47 -08005488int radio::setSmscAddressResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005489 int responseType, int serial, RIL_Errno e,
5490 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005491#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005492 RLOGD("setSmscAddressResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005493#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005494
5495 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005496 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005497 populateResponseInfo(responseInfo, serial, responseType, e);
5498 Return<void> retStatus
5499 = radioService[slotId]->mRadioResponse->setSmscAddressResponse(responseInfo);
5500 radioService[slotId]->checkReturnStatus(retStatus);
5501 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005502 RLOGE("setSmscAddressResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005503 }
5504
5505 return 0;
5506}
5507
Amit Mahajan759786a2017-03-03 17:35:47 -08005508int radio::reportSmsMemoryStatusResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005509 int responseType, int serial, RIL_Errno e,
5510 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005511#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005512 RLOGD("reportSmsMemoryStatusResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005513#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005514
5515 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005516 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005517 populateResponseInfo(responseInfo, serial, responseType, e);
5518 Return<void> retStatus
5519 = radioService[slotId]->mRadioResponse->reportSmsMemoryStatusResponse(responseInfo);
5520 radioService[slotId]->checkReturnStatus(retStatus);
5521 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005522 RLOGE("reportSmsMemoryStatusResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005523 slotId);
5524 }
5525
5526 return 0;
5527}
5528
Amit Mahajan759786a2017-03-03 17:35:47 -08005529int radio::reportStkServiceIsRunningResponse(int slotId,
Amit Mahajan5007ffa2017-01-31 17:14:42 -08005530 int responseType, int serial, RIL_Errno e,
5531 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005532#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005533 RLOGD("reportStkServiceIsRunningResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005534#endif
Amit Mahajan5007ffa2017-01-31 17:14:42 -08005535
5536 if (radioService[slotId]->mRadioResponse != NULL) {
Amit Mahajan3da9ac02017-02-13 13:41:28 -08005537 RadioResponseInfo responseInfo = {};
Amit Mahajan5007ffa2017-01-31 17:14:42 -08005538 populateResponseInfo(responseInfo, serial, responseType, e);
5539 Return<void> retStatus = radioService[slotId]->mRadioResponse->
5540 reportStkServiceIsRunningResponse(responseInfo);
5541 radioService[slotId]->checkReturnStatus(retStatus);
5542 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005543 RLOGE("reportStkServiceIsRunningResponse: radioService[%d]->mRadioResponse == NULL",
Amit Mahajan5007ffa2017-01-31 17:14:42 -08005544 slotId);
5545 }
5546
5547 return 0;
5548}
5549
Amit Mahajan759786a2017-03-03 17:35:47 -08005550int radio::getCdmaSubscriptionSourceResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005551 int responseType, int serial, RIL_Errno e,
5552 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005553#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005554 RLOGD("getCdmaSubscriptionSourceResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005555#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005556
5557 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005558 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005559 int ret = responseInt(responseInfo, serial, responseType, e, response, responseLen);
5560 Return<void> retStatus
5561 = radioService[slotId]->mRadioResponse->getCdmaSubscriptionSourceResponse(
5562 responseInfo, (CdmaSubscriptionSource) ret);
5563 radioService[slotId]->checkReturnStatus(retStatus);
5564 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005565 RLOGE("getCdmaSubscriptionSourceResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005566 slotId);
5567 }
5568
5569 return 0;
5570}
5571
Amit Mahajan759786a2017-03-03 17:35:47 -08005572int radio::requestIsimAuthenticationResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005573 int responseType, int serial, RIL_Errno e,
5574 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005575#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005576 RLOGD("requestIsimAuthenticationResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005577#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005578
5579 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005580 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005581 populateResponseInfo(responseInfo, serial, responseType, e);
5582 Return<void> retStatus
5583 = radioService[slotId]->mRadioResponse->requestIsimAuthenticationResponse(
5584 responseInfo,
5585 convertCharPtrToHidlString((char *) response));
5586 radioService[slotId]->checkReturnStatus(retStatus);
5587 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005588 RLOGE("requestIsimAuthenticationResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005589 slotId);
5590 }
5591
5592 return 0;
5593}
5594
Amit Mahajan759786a2017-03-03 17:35:47 -08005595int radio::acknowledgeIncomingGsmSmsWithPduResponse(int slotId,
5596 int responseType,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005597 int serial, RIL_Errno e, void *response,
5598 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005599#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005600 RLOGD("acknowledgeIncomingGsmSmsWithPduResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005601#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005602
5603 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005604 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005605 populateResponseInfo(responseInfo, serial, responseType, e);
5606 Return<void> retStatus
5607 = radioService[slotId]->mRadioResponse->acknowledgeIncomingGsmSmsWithPduResponse(
5608 responseInfo);
5609 radioService[slotId]->checkReturnStatus(retStatus);
5610 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005611 RLOGE("acknowledgeIncomingGsmSmsWithPduResponse: radioService[%d]->mRadioResponse "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005612 "== NULL", slotId);
5613 }
5614
5615 return 0;
5616}
5617
Amit Mahajan759786a2017-03-03 17:35:47 -08005618int radio::sendEnvelopeWithStatusResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005619 int responseType, int serial, RIL_Errno e, void *response,
5620 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005621#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005622 RLOGD("sendEnvelopeWithStatusResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005623#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005624
5625 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005626 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005627 IccIoResult result = responseIccIo(responseInfo, serial, responseType, e,
5628 response, responseLen);
5629
5630 Return<void> retStatus
5631 = radioService[slotId]->mRadioResponse->sendEnvelopeWithStatusResponse(responseInfo,
5632 result);
5633 radioService[slotId]->checkReturnStatus(retStatus);
5634 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005635 RLOGE("sendEnvelopeWithStatusResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005636 slotId);
5637 }
5638
5639 return 0;
5640}
5641
Amit Mahajan759786a2017-03-03 17:35:47 -08005642int radio::getVoiceRadioTechnologyResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005643 int responseType, int serial, RIL_Errno e,
5644 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005645#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005646 RLOGD("getVoiceRadioTechnologyResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005647#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005648
5649 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005650 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005651 int ret = responseInt(responseInfo, serial, responseType, e, response, responseLen);
5652 Return<void> retStatus
5653 = radioService[slotId]->mRadioResponse->getVoiceRadioTechnologyResponse(
5654 responseInfo, (RadioTechnology) ret);
5655 radioService[slotId]->checkReturnStatus(retStatus);
5656 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005657 RLOGE("getVoiceRadioTechnologyResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005658 slotId);
5659 }
5660
5661 return 0;
5662}
5663
Amit Mahajan759786a2017-03-03 17:35:47 -08005664int radio::getCellInfoListResponse(int slotId,
5665 int responseType,
Amit Mahajan3df62912017-02-10 01:35:55 +00005666 int serial, RIL_Errno e, void *response,
5667 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005668#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005669 RLOGD("getCellInfoListResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005670#endif
Amit Mahajan3df62912017-02-10 01:35:55 +00005671
5672 if (radioService[slotId]->mRadioResponse != NULL) {
Amit Mahajan3da9ac02017-02-13 13:41:28 -08005673 RadioResponseInfo responseInfo = {};
Amit Mahajan3df62912017-02-10 01:35:55 +00005674 populateResponseInfo(responseInfo, serial, responseType, e);
5675
5676 hidl_vec<CellInfo> ret;
5677 if (response == NULL || responseLen % sizeof(RIL_CellInfo_v12) != 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005678 RLOGE("getCellInfoListResponse: Invalid response");
Amit Mahajan3df62912017-02-10 01:35:55 +00005679 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
5680 } else {
5681 convertRilCellInfoListToHal(response, responseLen, ret);
5682 }
5683
5684 Return<void> retStatus = radioService[slotId]->mRadioResponse->getCellInfoListResponse(
5685 responseInfo, ret);
5686 radioService[slotId]->checkReturnStatus(retStatus);
5687 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005688 RLOGE("getCellInfoListResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Amit Mahajan3df62912017-02-10 01:35:55 +00005689 }
5690
5691 return 0;
5692}
5693
Amit Mahajan759786a2017-03-03 17:35:47 -08005694int radio::setCellInfoListRateResponse(int slotId,
5695 int responseType,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005696 int serial, RIL_Errno e, void *response,
5697 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005698#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005699 RLOGD("setCellInfoListRateResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005700#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005701
5702 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005703 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005704 populateResponseInfo(responseInfo, serial, responseType, e);
5705 Return<void> retStatus
5706 = radioService[slotId]->mRadioResponse->setCellInfoListRateResponse(responseInfo);
5707 radioService[slotId]->checkReturnStatus(retStatus);
5708 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005709 RLOGE("setCellInfoListRateResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005710 slotId);
5711 }
5712
5713 return 0;
5714}
5715
Amit Mahajan759786a2017-03-03 17:35:47 -08005716int radio::setInitialAttachApnResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005717 int responseType, int serial, RIL_Errno e,
5718 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005719#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005720 RLOGD("setInitialAttachApnResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005721#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005722
5723 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005724 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005725 populateResponseInfo(responseInfo, serial, responseType, e);
5726 Return<void> retStatus
5727 = radioService[slotId]->mRadioResponse->setInitialAttachApnResponse(responseInfo);
5728 radioService[slotId]->checkReturnStatus(retStatus);
5729 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005730 RLOGE("setInitialAttachApnResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005731 slotId);
5732 }
5733
5734 return 0;
5735}
5736
Amit Mahajan759786a2017-03-03 17:35:47 -08005737int radio::getImsRegistrationStateResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005738 int responseType, int serial, RIL_Errno e,
5739 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005740#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005741 RLOGD("getImsRegistrationStateResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005742#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005743
5744 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005745 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005746 populateResponseInfo(responseInfo, serial, responseType, e);
5747 bool isRegistered = false;
5748 int ratFamily = 0;
5749 int numInts = responseLen / sizeof(int);
5750 if (response == NULL || numInts != 2) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005751 RLOGE("getImsRegistrationStateResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005752 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
5753 } else {
5754 int *pInt = (int *) response;
5755 isRegistered = pInt[0] == 1 ? true : false;
5756 ratFamily = pInt[1];
5757 }
5758 Return<void> retStatus
5759 = radioService[slotId]->mRadioResponse->getImsRegistrationStateResponse(
5760 responseInfo, isRegistered, (RadioTechnologyFamily) ratFamily);
5761 radioService[slotId]->checkReturnStatus(retStatus);
5762 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005763 RLOGE("getImsRegistrationStateResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005764 slotId);
5765 }
5766
5767 return 0;
5768}
5769
Amit Mahajan759786a2017-03-03 17:35:47 -08005770int radio::sendImsSmsResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005771 int responseType, int serial, RIL_Errno e, void *response,
5772 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005773#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005774 RLOGD("sendImsSmsResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005775#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005776
5777 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005778 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005779 SendSmsResult result = makeSendSmsResult(responseInfo, serial, responseType, e, response,
5780 responseLen);
5781
5782 Return<void> retStatus
5783 = radioService[slotId]->mRadioResponse->sendImsSmsResponse(responseInfo, result);
5784 radioService[slotId]->checkReturnStatus(retStatus);
5785 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005786 RLOGE("sendSmsResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005787 }
5788
5789 return 0;
5790}
5791
Amit Mahajan759786a2017-03-03 17:35:47 -08005792int radio::iccTransmitApduBasicChannelResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005793 int responseType, int serial, RIL_Errno e,
5794 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005795#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005796 RLOGD("iccTransmitApduBasicChannelResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005797#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005798
5799 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005800 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005801 IccIoResult result = responseIccIo(responseInfo, serial, responseType, e, response,
5802 responseLen);
5803
5804 Return<void> retStatus
5805 = radioService[slotId]->mRadioResponse->iccTransmitApduBasicChannelResponse(
5806 responseInfo, result);
5807 radioService[slotId]->checkReturnStatus(retStatus);
5808 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005809 RLOGE("iccTransmitApduBasicChannelResponse: radioService[%d]->mRadioResponse "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005810 "== NULL", slotId);
5811 }
5812
5813 return 0;
5814}
5815
Amit Mahajan759786a2017-03-03 17:35:47 -08005816int radio::iccOpenLogicalChannelResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005817 int responseType, int serial, RIL_Errno e, void *response,
5818 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005819#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005820 RLOGD("iccOpenLogicalChannelResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005821#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005822
5823 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005824 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005825 populateResponseInfo(responseInfo, serial, responseType, e);
5826 int channelId = -1;
5827 hidl_vec<int8_t> selectResponse;
5828 int numInts = responseLen / sizeof(int);
5829 if (response == NULL || responseLen % sizeof(int) != 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005830 RLOGE("iccOpenLogicalChannelResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005831 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
5832 } else {
5833 int *pInt = (int *) response;
5834 channelId = pInt[0];
5835 selectResponse.resize(numInts - 1);
5836 for (int i = 1; i < numInts; i++) {
5837 selectResponse[i - 1] = (int8_t) pInt[i];
5838 }
5839 }
5840 Return<void> retStatus
5841 = radioService[slotId]->mRadioResponse->iccOpenLogicalChannelResponse(responseInfo,
5842 channelId, selectResponse);
5843 radioService[slotId]->checkReturnStatus(retStatus);
5844 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005845 RLOGE("iccOpenLogicalChannelResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005846 slotId);
5847 }
5848
5849 return 0;
5850}
5851
Amit Mahajan759786a2017-03-03 17:35:47 -08005852int radio::iccCloseLogicalChannelResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005853 int responseType, int serial, RIL_Errno e,
5854 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005855#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005856 RLOGD("iccCloseLogicalChannelResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005857#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005858
5859 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005860 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005861 populateResponseInfo(responseInfo, serial, responseType, e);
5862 Return<void> retStatus
5863 = radioService[slotId]->mRadioResponse->iccCloseLogicalChannelResponse(
5864 responseInfo);
5865 radioService[slotId]->checkReturnStatus(retStatus);
5866 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005867 RLOGE("iccCloseLogicalChannelResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005868 slotId);
5869 }
5870
5871 return 0;
5872}
5873
Amit Mahajan759786a2017-03-03 17:35:47 -08005874int radio::iccTransmitApduLogicalChannelResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005875 int responseType, int serial, RIL_Errno e,
5876 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005877#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005878 RLOGD("iccTransmitApduLogicalChannelResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005879#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005880
5881 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005882 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005883 IccIoResult result = responseIccIo(responseInfo, serial, responseType, e, response,
5884 responseLen);
5885
5886 Return<void> retStatus
5887 = radioService[slotId]->mRadioResponse->iccTransmitApduLogicalChannelResponse(
5888 responseInfo, result);
5889 radioService[slotId]->checkReturnStatus(retStatus);
5890 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005891 RLOGE("iccTransmitApduLogicalChannelResponse: radioService[%d]->mRadioResponse "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005892 "== NULL", slotId);
5893 }
5894
5895 return 0;
5896}
5897
Amit Mahajan759786a2017-03-03 17:35:47 -08005898int radio::nvReadItemResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005899 int responseType, int serial, RIL_Errno e,
5900 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005901#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005902 RLOGD("nvReadItemResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005903#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005904
5905 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005906 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005907 populateResponseInfo(responseInfo, serial, responseType, e);
5908 Return<void> retStatus = radioService[slotId]->mRadioResponse->nvReadItemResponse(
5909 responseInfo,
5910 convertCharPtrToHidlString((char *) response));
5911 radioService[slotId]->checkReturnStatus(retStatus);
5912 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005913 RLOGE("nvReadItemResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005914 }
5915
5916 return 0;
5917}
5918
Amit Mahajan759786a2017-03-03 17:35:47 -08005919int radio::nvWriteItemResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005920 int responseType, int serial, RIL_Errno e,
5921 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005922#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005923 RLOGD("nvWriteItemResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005924#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005925
5926 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005927 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005928 populateResponseInfo(responseInfo, serial, responseType, e);
5929 Return<void> retStatus
5930 = radioService[slotId]->mRadioResponse->nvWriteItemResponse(responseInfo);
5931 radioService[slotId]->checkReturnStatus(retStatus);
5932 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005933 RLOGE("nvWriteItemResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005934 }
5935
5936 return 0;
5937}
5938
Amit Mahajan759786a2017-03-03 17:35:47 -08005939int radio::nvWriteCdmaPrlResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005940 int responseType, int serial, RIL_Errno e,
5941 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005942#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005943 RLOGD("nvWriteCdmaPrlResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005944#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005945
5946 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005947 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005948 populateResponseInfo(responseInfo, serial, responseType, e);
5949 Return<void> retStatus
5950 = radioService[slotId]->mRadioResponse->nvWriteCdmaPrlResponse(responseInfo);
5951 radioService[slotId]->checkReturnStatus(retStatus);
5952 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005953 RLOGE("nvWriteCdmaPrlResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005954 }
5955
5956 return 0;
5957}
5958
Amit Mahajan759786a2017-03-03 17:35:47 -08005959int radio::nvResetConfigResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005960 int responseType, int serial, RIL_Errno e,
5961 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005962#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005963 RLOGD("nvResetConfigResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005964#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005965
5966 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005967 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005968 populateResponseInfo(responseInfo, serial, responseType, e);
5969 Return<void> retStatus
5970 = radioService[slotId]->mRadioResponse->nvResetConfigResponse(responseInfo);
5971 radioService[slotId]->checkReturnStatus(retStatus);
5972 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005973 RLOGE("nvResetConfigResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005974 }
5975
5976 return 0;
5977}
5978
Amit Mahajan759786a2017-03-03 17:35:47 -08005979int radio::setUiccSubscriptionResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005980 int responseType, int serial, RIL_Errno e,
5981 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005982#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005983 RLOGD("setUiccSubscriptionResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005984#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005985
5986 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005987 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005988 populateResponseInfo(responseInfo, serial, responseType, e);
5989 Return<void> retStatus
5990 = radioService[slotId]->mRadioResponse->setUiccSubscriptionResponse(responseInfo);
5991 radioService[slotId]->checkReturnStatus(retStatus);
5992 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005993 RLOGE("setUiccSubscriptionResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005994 slotId);
5995 }
5996
5997 return 0;
5998}
5999
Amit Mahajan759786a2017-03-03 17:35:47 -08006000int radio::setDataAllowedResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006001 int responseType, int serial, RIL_Errno e,
6002 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006003#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006004 RLOGD("setDataAllowedResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006005#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006006
6007 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08006008 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006009 populateResponseInfo(responseInfo, serial, responseType, e);
6010 Return<void> retStatus
6011 = radioService[slotId]->mRadioResponse->setDataAllowedResponse(responseInfo);
6012 radioService[slotId]->checkReturnStatus(retStatus);
6013 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006014 RLOGE("setDataAllowedResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006015 }
6016
6017 return 0;
6018}
6019
Amit Mahajan759786a2017-03-03 17:35:47 -08006020int radio::getHardwareConfigResponse(int slotId,
Amit Mahajan3df62912017-02-10 01:35:55 +00006021 int responseType, int serial, RIL_Errno e,
6022 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006023#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006024 RLOGD("getHardwareConfigResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006025#endif
Amit Mahajan3df62912017-02-10 01:35:55 +00006026
6027 if (radioService[slotId]->mRadioResponse != NULL) {
Amit Mahajan3da9ac02017-02-13 13:41:28 -08006028 RadioResponseInfo responseInfo = {};
Amit Mahajan3df62912017-02-10 01:35:55 +00006029 populateResponseInfo(responseInfo, serial, responseType, e);
6030
6031 hidl_vec<HardwareConfig> result;
6032 if (response == NULL || responseLen % sizeof(RIL_HardwareConfig) != 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006033 RLOGE("hardwareConfigChangedInd: invalid response");
Amit Mahajan3df62912017-02-10 01:35:55 +00006034 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
6035 } else {
6036 convertRilHardwareConfigListToHal(response, responseLen, result);
6037 }
6038
6039 Return<void> retStatus = radioService[slotId]->mRadioResponse->getHardwareConfigResponse(
6040 responseInfo, result);
6041 radioService[slotId]->checkReturnStatus(retStatus);
6042 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006043 RLOGE("getHardwareConfigResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Amit Mahajan3df62912017-02-10 01:35:55 +00006044 }
6045
6046 return 0;
6047}
6048
Amit Mahajan759786a2017-03-03 17:35:47 -08006049int radio::requestIccSimAuthenticationResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006050 int responseType, int serial, RIL_Errno e,
6051 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006052#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006053 RLOGD("requestIccSimAuthenticationResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006054#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006055
6056 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08006057 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006058 IccIoResult result = responseIccIo(responseInfo, serial, responseType, e, response,
6059 responseLen);
6060
6061 Return<void> retStatus
6062 = radioService[slotId]->mRadioResponse->requestIccSimAuthenticationResponse(
6063 responseInfo, result);
6064 radioService[slotId]->checkReturnStatus(retStatus);
6065 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006066 RLOGE("requestIccSimAuthenticationResponse: radioService[%d]->mRadioResponse "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006067 "== NULL", slotId);
6068 }
6069
6070 return 0;
6071}
6072
Amit Mahajan759786a2017-03-03 17:35:47 -08006073int radio::setDataProfileResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006074 int responseType, int serial, RIL_Errno e,
6075 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006076#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006077 RLOGD("setDataProfileResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006078#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006079
6080 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08006081 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006082 populateResponseInfo(responseInfo, serial, responseType, e);
6083 Return<void> retStatus
6084 = radioService[slotId]->mRadioResponse->setDataProfileResponse(responseInfo);
6085 radioService[slotId]->checkReturnStatus(retStatus);
6086 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006087 RLOGE("setDataProfileResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006088 }
6089
6090 return 0;
6091}
6092
Amit Mahajan759786a2017-03-03 17:35:47 -08006093int radio::requestShutdownResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006094 int responseType, int serial, RIL_Errno e,
6095 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006096#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006097 RLOGD("requestShutdownResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006098#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006099
6100 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08006101 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006102 populateResponseInfo(responseInfo, serial, responseType, e);
6103 Return<void> retStatus
6104 = radioService[slotId]->mRadioResponse->requestShutdownResponse(responseInfo);
6105 radioService[slotId]->checkReturnStatus(retStatus);
6106 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006107 RLOGE("requestShutdownResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006108 }
6109
6110 return 0;
6111}
6112
Amit Mahajan3df62912017-02-10 01:35:55 +00006113void responseRadioCapability(RadioResponseInfo& responseInfo, int serial,
6114 int responseType, RIL_Errno e, void *response, size_t responseLen, RadioCapability& rc) {
6115 populateResponseInfo(responseInfo, serial, responseType, e);
6116
Amit Mahajan1fbff082017-02-24 11:24:39 -08006117 if (response == NULL || responseLen != sizeof(RIL_RadioCapability)) {
Amit Mahajan3df62912017-02-10 01:35:55 +00006118 RLOGE("responseRadioCapability: Invalid response");
6119 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
Amit Mahajan3da9ac02017-02-13 13:41:28 -08006120 rc.logicalModemUuid = hidl_string();
Amit Mahajan3df62912017-02-10 01:35:55 +00006121 } else {
6122 convertRilRadioCapabilityToHal(response, responseLen, rc);
6123 }
6124}
6125
Amit Mahajan759786a2017-03-03 17:35:47 -08006126int radio::getRadioCapabilityResponse(int slotId,
Amit Mahajan3df62912017-02-10 01:35:55 +00006127 int responseType, int serial, RIL_Errno e,
6128 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006129#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006130 RLOGD("getRadioCapabilityResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006131#endif
Amit Mahajan3df62912017-02-10 01:35:55 +00006132
6133 if (radioService[slotId]->mRadioResponse != NULL) {
Amit Mahajan3da9ac02017-02-13 13:41:28 -08006134 RadioResponseInfo responseInfo = {};
6135 RadioCapability result = {};
Amit Mahajan3df62912017-02-10 01:35:55 +00006136 responseRadioCapability(responseInfo, serial, responseType, e, response, responseLen,
6137 result);
6138 Return<void> retStatus = radioService[slotId]->mRadioResponse->getRadioCapabilityResponse(
6139 responseInfo, result);
6140 radioService[slotId]->checkReturnStatus(retStatus);
6141 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006142 RLOGE("getRadioCapabilityResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Amit Mahajan3df62912017-02-10 01:35:55 +00006143 }
6144
6145 return 0;
6146}
6147
Amit Mahajan759786a2017-03-03 17:35:47 -08006148int radio::setRadioCapabilityResponse(int slotId,
Amit Mahajan3df62912017-02-10 01:35:55 +00006149 int responseType, int serial, RIL_Errno e,
6150 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006151#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006152 RLOGD("setRadioCapabilityResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006153#endif
Amit Mahajan3df62912017-02-10 01:35:55 +00006154
6155 if (radioService[slotId]->mRadioResponse != NULL) {
Amit Mahajan3da9ac02017-02-13 13:41:28 -08006156 RadioResponseInfo responseInfo = {};
6157 RadioCapability result = {};
Amit Mahajan3df62912017-02-10 01:35:55 +00006158 responseRadioCapability(responseInfo, serial, responseType, e, response, responseLen,
6159 result);
6160 Return<void> retStatus = radioService[slotId]->mRadioResponse->setRadioCapabilityResponse(
6161 responseInfo, result);
6162 radioService[slotId]->checkReturnStatus(retStatus);
6163 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006164 RLOGE("setRadioCapabilityResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Amit Mahajan3df62912017-02-10 01:35:55 +00006165 }
6166
6167 return 0;
6168}
6169
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006170LceStatusInfo responseLceStatusInfo(RadioResponseInfo& responseInfo, int serial, int responseType,
6171 RIL_Errno e, void *response, size_t responseLen) {
6172 populateResponseInfo(responseInfo, serial, responseType, e);
Jack Yuf68e0da2017-02-07 14:53:09 -08006173 LceStatusInfo result = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006174
6175 if (response == NULL || responseLen != sizeof(RIL_LceStatusInfo)) {
6176 RLOGE("Invalid response: NULL");
6177 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006178 } else {
6179 RIL_LceStatusInfo *resp = (RIL_LceStatusInfo *) response;
6180 result.lceStatus = (LceStatus) resp->lce_status;
6181 result.actualIntervalMs = (uint8_t) resp->actual_interval_ms;
6182 }
6183 return result;
6184}
6185
Amit Mahajan759786a2017-03-03 17:35:47 -08006186int radio::startLceServiceResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006187 int responseType, int serial, RIL_Errno e,
6188 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006189#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006190 RLOGD("startLceServiceResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006191#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006192
6193 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08006194 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006195 LceStatusInfo result = responseLceStatusInfo(responseInfo, serial, responseType, e,
6196 response, responseLen);
6197
6198 Return<void> retStatus
6199 = radioService[slotId]->mRadioResponse->startLceServiceResponse(responseInfo,
6200 result);
6201 radioService[slotId]->checkReturnStatus(retStatus);
6202 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006203 RLOGE("startLceServiceResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006204 }
6205
6206 return 0;
6207}
6208
Amit Mahajan759786a2017-03-03 17:35:47 -08006209int radio::stopLceServiceResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006210 int responseType, int serial, RIL_Errno e,
6211 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006212#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006213 RLOGD("stopLceServiceResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006214#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006215
6216 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08006217 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006218 LceStatusInfo result = responseLceStatusInfo(responseInfo, serial, responseType, e,
6219 response, responseLen);
6220
6221 Return<void> retStatus
6222 = radioService[slotId]->mRadioResponse->stopLceServiceResponse(responseInfo,
6223 result);
6224 radioService[slotId]->checkReturnStatus(retStatus);
6225 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006226 RLOGE("stopLceServiceResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006227 }
6228
6229 return 0;
6230}
6231
Amit Mahajan759786a2017-03-03 17:35:47 -08006232int radio::pullLceDataResponse(int slotId,
Amit Mahajan3df62912017-02-10 01:35:55 +00006233 int responseType, int serial, RIL_Errno e,
6234 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006235#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006236 RLOGD("pullLceDataResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006237#endif
Amit Mahajan3df62912017-02-10 01:35:55 +00006238
6239 if (radioService[slotId]->mRadioResponse != NULL) {
Amit Mahajan3da9ac02017-02-13 13:41:28 -08006240 RadioResponseInfo responseInfo = {};
Amit Mahajan3df62912017-02-10 01:35:55 +00006241 populateResponseInfo(responseInfo, serial, responseType, e);
6242
Amit Mahajan3da9ac02017-02-13 13:41:28 -08006243 LceDataInfo result = {};
Amit Mahajan3df62912017-02-10 01:35:55 +00006244 if (response == NULL || responseLen != sizeof(RIL_LceDataInfo)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006245 RLOGE("pullLceDataResponse: Invalid response");
Amit Mahajan3df62912017-02-10 01:35:55 +00006246 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
Amit Mahajan3df62912017-02-10 01:35:55 +00006247 } else {
6248 convertRilLceDataInfoToHal(response, responseLen, result);
6249 }
6250
6251 Return<void> retStatus = radioService[slotId]->mRadioResponse->pullLceDataResponse(
6252 responseInfo, result);
6253 radioService[slotId]->checkReturnStatus(retStatus);
6254 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006255 RLOGE("pullLceDataResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Amit Mahajan3df62912017-02-10 01:35:55 +00006256 }
6257
6258 return 0;
6259}
6260
Amit Mahajan759786a2017-03-03 17:35:47 -08006261int radio::getModemActivityInfoResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006262 int responseType, int serial, RIL_Errno e,
6263 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006264#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006265 RLOGD("getModemActivityInfoResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006266#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006267
6268 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08006269 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006270 populateResponseInfo(responseInfo, serial, responseType, e);
6271 ActivityStatsInfo info;
6272 if (response == NULL || responseLen != sizeof(RIL_ActivityStatsInfo)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006273 RLOGE("getModemActivityInfoResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006274 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006275 } else {
6276 RIL_ActivityStatsInfo *resp = (RIL_ActivityStatsInfo *)response;
6277 info.sleepModeTimeMs = resp->sleep_mode_time_ms;
6278 info.idleModeTimeMs = resp->idle_mode_time_ms;
6279 for(int i = 0; i < RIL_NUM_TX_POWER_LEVELS; i++) {
6280 info.txmModetimeMs[i] = resp->tx_mode_time_ms[i];
6281 }
6282 info.rxModeTimeMs = resp->rx_mode_time_ms;
6283 }
6284
6285 Return<void> retStatus
6286 = radioService[slotId]->mRadioResponse->getModemActivityInfoResponse(responseInfo,
6287 info);
6288 radioService[slotId]->checkReturnStatus(retStatus);
6289 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006290 RLOGE("getModemActivityInfoResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006291 slotId);
6292 }
6293
6294 return 0;
6295}
6296
Amit Mahajan759786a2017-03-03 17:35:47 -08006297int radio::setAllowedCarriersResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006298 int responseType, int serial, RIL_Errno e,
6299 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006300#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006301 RLOGD("setAllowedCarriersResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006302#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006303
6304 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08006305 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006306 int ret = responseInt(responseInfo, serial, responseType, e, response, responseLen);
6307 Return<void> retStatus
6308 = radioService[slotId]->mRadioResponse->setAllowedCarriersResponse(responseInfo,
6309 ret);
6310 radioService[slotId]->checkReturnStatus(retStatus);
6311 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006312 RLOGE("setAllowedCarriersResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006313 slotId);
6314 }
6315
6316 return 0;
6317}
6318
Amit Mahajan759786a2017-03-03 17:35:47 -08006319int radio::getAllowedCarriersResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006320 int responseType, int serial, RIL_Errno e,
6321 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006322#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006323 RLOGD("getAllowedCarriersResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006324#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006325
6326 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08006327 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006328 populateResponseInfo(responseInfo, serial, responseType, e);
Jack Yuf68e0da2017-02-07 14:53:09 -08006329 CarrierRestrictions carrierInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006330 bool allAllowed = true;
Jayachandran C70f7d2e2017-04-28 00:57:13 -07006331 if (response == NULL) {
6332#if VDBG
6333 RLOGD("getAllowedCarriersResponse response is NULL: all allowed");
6334#endif
6335 carrierInfo.allowedCarriers.resize(0);
6336 carrierInfo.excludedCarriers.resize(0);
6337 } else if (responseLen != sizeof(RIL_CarrierRestrictions)) {
6338 RLOGE("getAllowedCarriersResponse Invalid response");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006339 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
6340 } else {
6341 RIL_CarrierRestrictions *pCr = (RIL_CarrierRestrictions *)response;
6342 if (pCr->len_allowed_carriers > 0 || pCr->len_excluded_carriers > 0) {
6343 allAllowed = false;
6344 }
6345
6346 carrierInfo.allowedCarriers.resize(pCr->len_allowed_carriers);
6347 for(int i = 0; i < pCr->len_allowed_carriers; i++) {
6348 RIL_Carrier *carrier = pCr->allowed_carriers + i;
6349 carrierInfo.allowedCarriers[i].mcc = convertCharPtrToHidlString(carrier->mcc);
6350 carrierInfo.allowedCarriers[i].mnc = convertCharPtrToHidlString(carrier->mnc);
6351 carrierInfo.allowedCarriers[i].matchType = (CarrierMatchType) carrier->match_type;
6352 carrierInfo.allowedCarriers[i].matchData =
6353 convertCharPtrToHidlString(carrier->match_data);
6354 }
6355
6356 carrierInfo.excludedCarriers.resize(pCr->len_excluded_carriers);
6357 for(int i = 0; i < pCr->len_excluded_carriers; i++) {
6358 RIL_Carrier *carrier = pCr->excluded_carriers + i;
6359 carrierInfo.excludedCarriers[i].mcc = convertCharPtrToHidlString(carrier->mcc);
6360 carrierInfo.excludedCarriers[i].mnc = convertCharPtrToHidlString(carrier->mnc);
6361 carrierInfo.excludedCarriers[i].matchType = (CarrierMatchType) carrier->match_type;
6362 carrierInfo.excludedCarriers[i].matchData =
6363 convertCharPtrToHidlString(carrier->match_data);
6364 }
6365 }
6366
6367 Return<void> retStatus
6368 = radioService[slotId]->mRadioResponse->getAllowedCarriersResponse(responseInfo,
6369 allAllowed, carrierInfo);
6370 radioService[slotId]->checkReturnStatus(retStatus);
6371 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006372 RLOGE("getAllowedCarriersResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006373 slotId);
6374 }
6375
6376 return 0;
6377}
6378
Amit Mahajan759786a2017-03-03 17:35:47 -08006379int radio::sendDeviceStateResponse(int slotId,
Jack Yu11ab4042017-02-21 17:08:01 -08006380 int responseType, int serial, RIL_Errno e,
6381 void *response, size_t responselen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006382#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006383 RLOGD("sendDeviceStateResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006384#endif
Jack Yu11ab4042017-02-21 17:08:01 -08006385
6386 if (radioService[slotId]->mRadioResponse != NULL) {
6387 RadioResponseInfo responseInfo = {};
6388 populateResponseInfo(responseInfo, serial, responseType, e);
6389 Return<void> retStatus
6390 = radioService[slotId]->mRadioResponse->sendDeviceStateResponse(responseInfo);
6391 radioService[slotId]->checkReturnStatus(retStatus);
6392 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006393 RLOGE("sendDeviceStateResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Jack Yu11ab4042017-02-21 17:08:01 -08006394 }
6395
6396 return 0;
6397}
6398
pkanwarc61837e2017-03-17 12:49:34 -07006399int radio::setCarrierInfoForImsiEncryptionResponse(int slotId,
6400 int responseType, int serial, RIL_Errno e,
6401 void *response, size_t responseLen) {
6402 RLOGD("setCarrierInfoForImsiEncryptionResponse: serial %d", serial);
6403 if (radioService[slotId]->mRadioResponse != NULL) {
6404 RadioResponseInfo responseInfo = {};
6405 populateResponseInfo(responseInfo, serial, responseType, e);
6406 Return<sp<::android::hardware::radio::V1_1::IRadioResponse>> ret =
6407 ::android::hardware::radio::V1_1::IRadioResponse::castFrom(
6408 radioService[slotId]->mRadioResponse);
6409 if (ret.isOk()) {
6410 sp<::android::hardware::radio::V1_1::IRadioResponse> radioResponseV1_1 = ret;
6411 Return<void> retStatus
6412 = radioResponseV1_1->setCarrierInfoForImsiEncryptionResponse(responseInfo);
6413 radioService[slotId]->checkReturnStatus(retStatus);
6414 } else {
6415 RLOGE("setCarrierInfoForImsiEncryptionResponse: ret.isOk() == false for "
6416 "radioService[%d]" , slotId);
6417 }
6418 } else {
6419 RLOGE("setCarrierInfoForImsiEncryptionResponse: radioService[%d]->mRadioResponse == NULL",
6420 slotId);
6421 }
6422 return 0;
6423}
6424
Amit Mahajan759786a2017-03-03 17:35:47 -08006425int radio::setIndicationFilterResponse(int slotId,
Jack Yu11ab4042017-02-21 17:08:01 -08006426 int responseType, int serial, RIL_Errno e,
6427 void *response, size_t responselen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006428#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006429 RLOGD("setIndicationFilterResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006430#endif
Jack Yu11ab4042017-02-21 17:08:01 -08006431
6432 if (radioService[slotId]->mRadioResponse != NULL) {
6433 RadioResponseInfo responseInfo = {};
6434 populateResponseInfo(responseInfo, serial, responseType, e);
6435 Return<void> retStatus
6436 = radioService[slotId]->mRadioResponse->setIndicationFilterResponse(responseInfo);
6437 radioService[slotId]->checkReturnStatus(retStatus);
6438 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006439 RLOGE("setIndicationFilterResponse: radioService[%d]->mRadioResponse == NULL",
Jack Yu11ab4042017-02-21 17:08:01 -08006440 slotId);
6441 }
6442
6443 return 0;
6444}
6445
Amit Mahajan759786a2017-03-03 17:35:47 -08006446int radio::setSimCardPowerResponse(int slotId,
Wileen Chiu718c0bf2017-01-04 11:37:19 -08006447 int responseType, int serial, RIL_Errno e,
6448 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006449#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006450 RLOGD("setSimCardPowerResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006451#endif
Wileen Chiu718c0bf2017-01-04 11:37:19 -08006452
6453 if (radioService[slotId]->mRadioResponse != NULL) {
6454 RadioResponseInfo responseInfo = {};
6455 populateResponseInfo(responseInfo, serial, responseType, e);
Grace Chen797c1c22017-03-23 18:39:48 -07006456 Return<sp<::android::hardware::radio::V1_1::IRadioResponse>> ret =
6457 ::android::hardware::radio::V1_1::IRadioResponse::castFrom(
6458 radioService[slotId]->mRadioResponse);
6459 if (ret.isOk()) {
6460 sp<::android::hardware::radio::V1_1::IRadioResponse> radioResponseV1_1 = ret;
6461 Return<void> retStatus
6462 = radioResponseV1_1->setSimCardPowerResponse_1_1(responseInfo);
6463 radioService[slotId]->checkReturnStatus(retStatus);
6464 } else {
6465 RLOGD("setSimCardPowerResponse: ret.isOK() == false for radioService[%d]",
6466 slotId);
6467 Return<void> retStatus
6468 = radioService[slotId]->mRadioResponse->setSimCardPowerResponse(responseInfo);
6469 radioService[slotId]->checkReturnStatus(retStatus);
6470 }
Wileen Chiu718c0bf2017-01-04 11:37:19 -08006471 } else {
Grace Chen797c1c22017-03-23 18:39:48 -07006472 RLOGE("setSimCardPowerResponse: radioService[%d]->mRadioResponse == NULL",
6473 slotId);
Wileen Chiu718c0bf2017-01-04 11:37:19 -08006474 }
Wileen Chiu718c0bf2017-01-04 11:37:19 -08006475 return 0;
6476}
6477
yinxu8688abd2017-05-22 11:26:45 -07006478int radio::startNetworkScanResponse(int slotId, int responseType, int serial, RIL_Errno e,
6479 void *response, size_t responseLen) {
6480#if VDBG
6481 RLOGD("startNetworkScanResponse: serial %d", serial);
6482#endif
6483
6484 if (radioService[slotId]->mRadioResponse != NULL) {
6485 RadioResponseInfo responseInfo = {};
6486 populateResponseInfo(responseInfo, serial, responseType, e);
6487 Return<sp<::android::hardware::radio::V1_1::IRadioResponse>> ret =
6488 ::android::hardware::radio::V1_1::IRadioResponse::castFrom(
6489 radioService[slotId]->mRadioResponse);
6490 if (ret.isOk()) {
6491 sp<::android::hardware::radio::V1_1::IRadioResponse> radioResponseV1_1 = ret;
6492 Return<void> retStatus = radioResponseV1_1->startNetworkScanResponse(responseInfo);
6493 radioService[slotId]->checkReturnStatus(retStatus);
6494 } else {
6495 RLOGD("startNetworkScanResponse: ret.isOK() == false for radioService[%d]", slotId);
6496 }
6497 } else {
6498 RLOGE("startNetworkScanResponse: radioService[%d]->mRadioResponse == NULL", slotId);
6499 }
6500
6501 return 0;
6502}
6503
6504int radio::stopNetworkScanResponse(int slotId, int responseType, int serial, RIL_Errno e,
6505 void *response, size_t responseLen) {
6506#if VDBG
6507 RLOGD("stopNetworkScanResponse: serial %d", serial);
6508#endif
6509
6510 if (radioService[slotId]->mRadioResponse != NULL) {
6511 RadioResponseInfo responseInfo = {};
6512 populateResponseInfo(responseInfo, serial, responseType, e);
6513 Return<sp<::android::hardware::radio::V1_1::IRadioResponse>> ret =
6514 ::android::hardware::radio::V1_1::IRadioResponse::castFrom(
6515 radioService[slotId]->mRadioResponse);
6516 if (ret.isOk()) {
6517 sp<::android::hardware::radio::V1_1::IRadioResponse> radioResponseV1_1 = ret;
6518 Return<void> retStatus = radioResponseV1_1->stopNetworkScanResponse(responseInfo);
6519 radioService[slotId]->checkReturnStatus(retStatus);
6520 } else {
6521 RLOGD("stopNetworkScanResponse: ret.isOK() == false for radioService[%d]", slotId);
6522 }
6523 } else {
6524 RLOGE("stopNetworkScanResponse: radioService[%d]->mRadioResponse == NULL", slotId);
6525 }
6526
6527 return 0;
6528}
6529
Amit Mahajan759786a2017-03-03 17:35:47 -08006530int radio::sendRequestRawResponse(int slotId,
Amit Mahajan439da362017-02-13 17:43:04 -08006531 int responseType, int serial, RIL_Errno e,
6532 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006533#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006534 RLOGD("sendRequestRawResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006535#endif
Amit Mahajan439da362017-02-13 17:43:04 -08006536
6537 if (oemHookService[slotId]->mOemHookResponse != NULL) {
6538 RadioResponseInfo responseInfo = {};
6539 populateResponseInfo(responseInfo, serial, responseType, e);
6540 hidl_vec<uint8_t> data;
6541
6542 if (response == NULL) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006543 RLOGE("sendRequestRawResponse: Invalid response");
Amit Mahajan439da362017-02-13 17:43:04 -08006544 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
6545 } else {
6546 data.setToExternal((uint8_t *) response, responseLen);
6547 }
6548 Return<void> retStatus = oemHookService[slotId]->mOemHookResponse->
6549 sendRequestRawResponse(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("sendRequestRawResponse: oemHookService[%d]->mOemHookResponse == NULL",
Amit Mahajan439da362017-02-13 17:43:04 -08006553 slotId);
6554 }
6555
6556 return 0;
6557}
6558
Amit Mahajan759786a2017-03-03 17:35:47 -08006559int radio::sendRequestStringsResponse(int slotId,
Amit Mahajan439da362017-02-13 17:43:04 -08006560 int responseType, int serial, RIL_Errno e,
6561 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006562#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006563 RLOGD("sendRequestStringsResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006564#endif
Amit Mahajan439da362017-02-13 17:43:04 -08006565
6566 if (oemHookService[slotId]->mOemHookResponse != NULL) {
6567 RadioResponseInfo responseInfo = {};
6568 populateResponseInfo(responseInfo, serial, responseType, e);
6569 hidl_vec<hidl_string> data;
6570
6571 if (response == NULL || responseLen % sizeof(char *) != 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006572 RLOGE("sendRequestStringsResponse Invalid response: NULL");
Amit Mahajan439da362017-02-13 17:43:04 -08006573 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
6574 } else {
6575 char **resp = (char **) response;
6576 int numStrings = responseLen / sizeof(char *);
6577 data.resize(numStrings);
6578 for (int i = 0; i < numStrings; i++) {
6579 data[i] = convertCharPtrToHidlString(resp[i]);
6580 }
6581 }
6582 Return<void> retStatus
6583 = oemHookService[slotId]->mOemHookResponse->sendRequestStringsResponse(
6584 responseInfo, data);
Amit Mahajand423d192017-03-16 17:04:01 -07006585 checkReturnStatus(slotId, retStatus, false);
Amit Mahajan439da362017-02-13 17:43:04 -08006586 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006587 RLOGE("sendRequestStringsResponse: oemHookService[%d]->mOemHookResponse == "
Amit Mahajan439da362017-02-13 17:43:04 -08006588 "NULL", slotId);
6589 }
6590
6591 return 0;
6592}
6593
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006594// Radio Indication functions
6595
Amit Mahajan5829a472016-12-28 17:28:07 -08006596RadioIndicationType convertIntToRadioIndicationType(int indicationType) {
6597 return indicationType == RESPONSE_UNSOLICITED ? (RadioIndicationType::UNSOLICITED) :
6598 (RadioIndicationType::UNSOLICITED_ACK_EXP);
6599}
6600
Amit Mahajan759786a2017-03-03 17:35:47 -08006601int radio::radioStateChangedInd(int slotId,
Amit Mahajan1f652692017-03-01 12:08:46 -08006602 int indicationType, int token, RIL_Errno e, void *response,
6603 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08006604 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan1f652692017-03-01 12:08:46 -08006605 RadioState radioState = (RadioState) s_vendorFunctions->onStateRequest();
Amit Mahajan111ddca2017-03-03 12:05:13 -08006606 RLOGD("radioStateChangedInd: radioState %d", radioState);
Amit Mahajan17249842017-01-19 15:05:45 -08006607 Return<void> retStatus = radioService[slotId]->mRadioIndication->radioStateChanged(
Amit Mahajan1f652692017-03-01 12:08:46 -08006608 convertIntToRadioIndicationType(indicationType), radioState);
Amit Mahajan17249842017-01-19 15:05:45 -08006609 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajancd77a5b2016-08-25 11:19:21 -07006610 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006611 RLOGE("radioStateChangedInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajancd77a5b2016-08-25 11:19:21 -07006612 }
Amit Mahajan1f652692017-03-01 12:08:46 -08006613
6614 return 0;
Amit Mahajancd77a5b2016-08-25 11:19:21 -07006615}
6616
Amit Mahajan759786a2017-03-03 17:35:47 -08006617int radio::callStateChangedInd(int slotId,
Amit Mahajan5829a472016-12-28 17:28:07 -08006618 int indicationType, int token, RIL_Errno e, void *response,
6619 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08006620 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006621#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006622 RLOGD("callStateChangedInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07006623#endif
Amit Mahajan17249842017-01-19 15:05:45 -08006624 Return<void> retStatus = radioService[slotId]->mRadioIndication->callStateChanged(
Amit Mahajan5829a472016-12-28 17:28:07 -08006625 convertIntToRadioIndicationType(indicationType));
Amit Mahajan17249842017-01-19 15:05:45 -08006626 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08006627 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006628 RLOGE("callStateChangedInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08006629 }
6630
6631 return 0;
6632}
6633
Amit Mahajan759786a2017-03-03 17:35:47 -08006634int radio::networkStateChangedInd(int slotId,
Amit Mahajan1f652692017-03-01 12:08:46 -08006635 int indicationType, int token, RIL_Errno e, void *response,
6636 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08006637 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006638#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006639 RLOGD("networkStateChangedInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07006640#endif
Jack Yu06181bb2017-01-10 12:10:41 -08006641 Return<void> retStatus = radioService[slotId]->mRadioIndication->networkStateChanged(
Amit Mahajan5829a472016-12-28 17:28:07 -08006642 convertIntToRadioIndicationType(indicationType));
Amit Mahajan17249842017-01-19 15:05:45 -08006643 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08006644 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006645 RLOGE("networkStateChangedInd: radioService[%d]->mRadioIndication == NULL",
Amit Mahajan2fa9e632017-01-06 16:55:33 -08006646 slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08006647 }
6648
6649 return 0;
6650}
6651
6652uint8_t hexCharToInt(uint8_t c) {
6653 if (c >= '0' && c <= '9') return (c - '0');
6654 if (c >= 'A' && c <= 'F') return (c - 'A' + 10);
6655 if (c >= 'a' && c <= 'f') return (c - 'a' + 10);
6656
6657 return INVALID_HEX_CHAR;
6658}
6659
6660uint8_t * convertHexStringToBytes(void *response, size_t responseLen) {
6661 if (responseLen % 2 != 0) {
6662 return NULL;
6663 }
6664
6665 uint8_t *bytes = (uint8_t *)calloc(responseLen/2, sizeof(uint8_t));
6666 if (bytes == NULL) {
6667 RLOGE("convertHexStringToBytes: cannot allocate memory for bytes string");
6668 return NULL;
6669 }
6670 uint8_t *hexString = (uint8_t *)response;
6671
Wei Wang100ac9b2017-02-03 14:18:07 -08006672 for (size_t i = 0; i < responseLen; i += 2) {
Amit Mahajan5829a472016-12-28 17:28:07 -08006673 uint8_t hexChar1 = hexCharToInt(hexString[i]);
6674 uint8_t hexChar2 = hexCharToInt(hexString[i + 1]);
6675
6676 if (hexChar1 == INVALID_HEX_CHAR || hexChar2 == INVALID_HEX_CHAR) {
6677 RLOGE("convertHexStringToBytes: invalid hex char %d %d",
6678 hexString[i], hexString[i + 1]);
6679 free(bytes);
6680 return NULL;
6681 }
6682 bytes[i/2] = ((hexChar1 << 4) | hexChar2);
6683 }
6684
6685 return bytes;
6686}
6687
Amit Mahajan759786a2017-03-03 17:35:47 -08006688int radio::newSmsInd(int slotId, int indicationType,
Amit Mahajan5829a472016-12-28 17:28:07 -08006689 int token, RIL_Errno e, void *response, size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08006690 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan5829a472016-12-28 17:28:07 -08006691 if (response == NULL || responseLen == 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006692 RLOGE("newSmsInd: invalid response");
Amit Mahajan5829a472016-12-28 17:28:07 -08006693 return 0;
6694 }
6695
6696 uint8_t *bytes = convertHexStringToBytes(response, responseLen);
6697 if (bytes == NULL) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006698 RLOGE("newSmsInd: convertHexStringToBytes failed");
Amit Mahajan5829a472016-12-28 17:28:07 -08006699 return 0;
6700 }
6701
6702 hidl_vec<uint8_t> pdu;
6703 pdu.setToExternal(bytes, responseLen/2);
Jayachandran C572f2f42017-03-25 14:30:13 -07006704#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006705 RLOGD("newSmsInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07006706#endif
Amit Mahajan17249842017-01-19 15:05:45 -08006707 Return<void> retStatus = radioService[slotId]->mRadioIndication->newSms(
Amit Mahajan5829a472016-12-28 17:28:07 -08006708 convertIntToRadioIndicationType(indicationType), pdu);
Amit Mahajan17249842017-01-19 15:05:45 -08006709 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08006710 free(bytes);
6711 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006712 RLOGE("newSmsInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08006713 }
6714
6715 return 0;
6716}
6717
Amit Mahajan759786a2017-03-03 17:35:47 -08006718int radio::newSmsStatusReportInd(int slotId,
Amit Mahajan5829a472016-12-28 17:28:07 -08006719 int indicationType, int token, RIL_Errno e, void *response,
6720 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08006721 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan5829a472016-12-28 17:28:07 -08006722 if (response == NULL || responseLen == 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006723 RLOGE("newSmsStatusReportInd: invalid response");
Amit Mahajan5829a472016-12-28 17:28:07 -08006724 return 0;
6725 }
6726
6727 uint8_t *bytes = convertHexStringToBytes(response, responseLen);
6728 if (bytes == NULL) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006729 RLOGE("newSmsStatusReportInd: convertHexStringToBytes failed");
Amit Mahajan5829a472016-12-28 17:28:07 -08006730 return 0;
6731 }
6732
6733 hidl_vec<uint8_t> pdu;
6734 pdu.setToExternal(bytes, responseLen/2);
Jayachandran C572f2f42017-03-25 14:30:13 -07006735#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006736 RLOGD("newSmsStatusReportInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07006737#endif
Amit Mahajan17249842017-01-19 15:05:45 -08006738 Return<void> retStatus = radioService[slotId]->mRadioIndication->newSmsStatusReport(
Amit Mahajan5829a472016-12-28 17:28:07 -08006739 convertIntToRadioIndicationType(indicationType), pdu);
Amit Mahajan17249842017-01-19 15:05:45 -08006740 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08006741 free(bytes);
6742 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006743 RLOGE("newSmsStatusReportInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08006744 }
6745
6746 return 0;
6747}
6748
Amit Mahajan759786a2017-03-03 17:35:47 -08006749int radio::newSmsOnSimInd(int slotId, int indicationType,
Amit Mahajan5829a472016-12-28 17:28:07 -08006750 int token, RIL_Errno e, void *response, size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08006751 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan5829a472016-12-28 17:28:07 -08006752 if (response == NULL || responseLen != sizeof(int)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006753 RLOGE("newSmsOnSimInd: invalid response");
Amit Mahajan5829a472016-12-28 17:28:07 -08006754 return 0;
6755 }
6756 int32_t recordNumber = ((int32_t *) response)[0];
Jayachandran C572f2f42017-03-25 14:30:13 -07006757#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006758 RLOGD("newSmsOnSimInd: slotIndex %d", recordNumber);
Jayachandran C572f2f42017-03-25 14:30:13 -07006759#endif
Amit Mahajan17249842017-01-19 15:05:45 -08006760 Return<void> retStatus = radioService[slotId]->mRadioIndication->newSmsOnSim(
Amit Mahajan5829a472016-12-28 17:28:07 -08006761 convertIntToRadioIndicationType(indicationType), recordNumber);
Amit Mahajan17249842017-01-19 15:05:45 -08006762 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08006763 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006764 RLOGE("newSmsOnSimInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08006765 }
6766
6767 return 0;
6768}
6769
Amit Mahajan759786a2017-03-03 17:35:47 -08006770int radio::onUssdInd(int slotId, int indicationType,
Amit Mahajan5829a472016-12-28 17:28:07 -08006771 int token, RIL_Errno e, void *response, size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08006772 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan5829a472016-12-28 17:28:07 -08006773 if (response == NULL || responseLen != 2 * sizeof(char *)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006774 RLOGE("onUssdInd: invalid response");
Amit Mahajan5829a472016-12-28 17:28:07 -08006775 return 0;
6776 }
6777 char **strings = (char **) response;
6778 char *mode = strings[0];
6779 hidl_string msg = convertCharPtrToHidlString(strings[1]);
6780 UssdModeType modeType = (UssdModeType) atoi(mode);
Jayachandran C572f2f42017-03-25 14:30:13 -07006781#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006782 RLOGD("onUssdInd: mode %s", mode);
Jayachandran C572f2f42017-03-25 14:30:13 -07006783#endif
Amit Mahajan17249842017-01-19 15:05:45 -08006784 Return<void> retStatus = radioService[slotId]->mRadioIndication->onUssd(
Amit Mahajan5829a472016-12-28 17:28:07 -08006785 convertIntToRadioIndicationType(indicationType), modeType, msg);
Amit Mahajan17249842017-01-19 15:05:45 -08006786 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08006787 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006788 RLOGE("onUssdInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08006789 }
6790
6791 return 0;
6792}
6793
Amit Mahajan759786a2017-03-03 17:35:47 -08006794int radio::nitzTimeReceivedInd(int slotId,
Amit Mahajan5829a472016-12-28 17:28:07 -08006795 int indicationType, int token, RIL_Errno e, void *response,
6796 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08006797 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan5829a472016-12-28 17:28:07 -08006798 if (response == NULL || responseLen == 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006799 RLOGE("nitzTimeReceivedInd: invalid response");
Amit Mahajan5829a472016-12-28 17:28:07 -08006800 return 0;
6801 }
6802 hidl_string nitzTime = convertCharPtrToHidlString((char *) response);
6803 int64_t timeReceived = android::elapsedRealtime();
Jayachandran C572f2f42017-03-25 14:30:13 -07006804#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006805 RLOGD("nitzTimeReceivedInd: nitzTime %s receivedTime %" PRId64, nitzTime.c_str(),
Amit Mahajan2fa9e632017-01-06 16:55:33 -08006806 timeReceived);
Jayachandran C572f2f42017-03-25 14:30:13 -07006807#endif
Amit Mahajan17249842017-01-19 15:05:45 -08006808 Return<void> retStatus = radioService[slotId]->mRadioIndication->nitzTimeReceived(
Amit Mahajan5829a472016-12-28 17:28:07 -08006809 convertIntToRadioIndicationType(indicationType), nitzTime, timeReceived);
Amit Mahajan17249842017-01-19 15:05:45 -08006810 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08006811 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006812 RLOGE("nitzTimeReceivedInd: radioService[%d]->mRadioIndication == NULL", slotId);
Weilun Dud2c30932017-02-09 12:32:42 -08006813 return -1;
Amit Mahajan5829a472016-12-28 17:28:07 -08006814 }
6815
6816 return 0;
6817}
6818
Amit Mahajan2fa9e632017-01-06 16:55:33 -08006819void convertRilSignalStrengthToHal(void *response, size_t responseLen,
6820 SignalStrength& signalStrength) {
6821 RIL_SignalStrength_v10 *rilSignalStrength = (RIL_SignalStrength_v10 *) response;
6822
6823 // Fixup LTE for backwards compatibility
6824 // signalStrength: -1 -> 99
6825 if (rilSignalStrength->LTE_SignalStrength.signalStrength == -1) {
6826 rilSignalStrength->LTE_SignalStrength.signalStrength = 99;
6827 }
6828 // rsrp: -1 -> INT_MAX all other negative value to positive.
6829 // So remap here
6830 if (rilSignalStrength->LTE_SignalStrength.rsrp == -1) {
6831 rilSignalStrength->LTE_SignalStrength.rsrp = INT_MAX;
6832 } else if (rilSignalStrength->LTE_SignalStrength.rsrp < -1) {
6833 rilSignalStrength->LTE_SignalStrength.rsrp = -rilSignalStrength->LTE_SignalStrength.rsrp;
6834 }
6835 // rsrq: -1 -> INT_MAX
6836 if (rilSignalStrength->LTE_SignalStrength.rsrq == -1) {
6837 rilSignalStrength->LTE_SignalStrength.rsrq = INT_MAX;
6838 }
6839 // Not remapping rssnr is already using INT_MAX
6840 // cqi: -1 -> INT_MAX
6841 if (rilSignalStrength->LTE_SignalStrength.cqi == -1) {
6842 rilSignalStrength->LTE_SignalStrength.cqi = INT_MAX;
6843 }
6844
6845 signalStrength.gw.signalStrength = rilSignalStrength->GW_SignalStrength.signalStrength;
6846 signalStrength.gw.bitErrorRate = rilSignalStrength->GW_SignalStrength.bitErrorRate;
6847 signalStrength.cdma.dbm = rilSignalStrength->CDMA_SignalStrength.dbm;
6848 signalStrength.cdma.ecio = rilSignalStrength->CDMA_SignalStrength.ecio;
6849 signalStrength.evdo.dbm = rilSignalStrength->EVDO_SignalStrength.dbm;
6850 signalStrength.evdo.ecio = rilSignalStrength->EVDO_SignalStrength.ecio;
6851 signalStrength.evdo.signalNoiseRatio =
6852 rilSignalStrength->EVDO_SignalStrength.signalNoiseRatio;
6853 signalStrength.lte.signalStrength = rilSignalStrength->LTE_SignalStrength.signalStrength;
6854 signalStrength.lte.rsrp = rilSignalStrength->LTE_SignalStrength.rsrp;
6855 signalStrength.lte.rsrq = rilSignalStrength->LTE_SignalStrength.rsrq;
6856 signalStrength.lte.rssnr = rilSignalStrength->LTE_SignalStrength.rssnr;
6857 signalStrength.lte.cqi = rilSignalStrength->LTE_SignalStrength.cqi;
6858 signalStrength.lte.timingAdvance = rilSignalStrength->LTE_SignalStrength.timingAdvance;
6859 signalStrength.tdScdma.rscp = rilSignalStrength->TD_SCDMA_SignalStrength.rscp;
6860}
6861
Amit Mahajan759786a2017-03-03 17:35:47 -08006862int radio::currentSignalStrengthInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08006863 int indicationType, int token, RIL_Errno e,
6864 void *response, size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08006865 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan2fa9e632017-01-06 16:55:33 -08006866 if (response == NULL || responseLen != sizeof(RIL_SignalStrength_v10)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006867 RLOGE("currentSignalStrengthInd: invalid response");
Amit Mahajan2fa9e632017-01-06 16:55:33 -08006868 return 0;
6869 }
6870
Jack Yuf68e0da2017-02-07 14:53:09 -08006871 SignalStrength signalStrength = {};
Amit Mahajan2fa9e632017-01-06 16:55:33 -08006872 convertRilSignalStrengthToHal(response, responseLen, signalStrength);
6873
Jayachandran C572f2f42017-03-25 14:30:13 -07006874#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006875 RLOGD("currentSignalStrengthInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07006876#endif
Amit Mahajan17249842017-01-19 15:05:45 -08006877 Return<void> retStatus = radioService[slotId]->mRadioIndication->currentSignalStrength(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08006878 convertIntToRadioIndicationType(indicationType), signalStrength);
Amit Mahajan17249842017-01-19 15:05:45 -08006879 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08006880 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006881 RLOGE("currentSignalStrengthInd: radioService[%d]->mRadioIndication == NULL",
Amit Mahajan2fa9e632017-01-06 16:55:33 -08006882 slotId);
6883 }
6884
6885 return 0;
6886}
6887
Amit Mahajan5829a472016-12-28 17:28:07 -08006888void convertRilDataCallToHal(RIL_Data_Call_Response_v11 *dcResponse,
6889 SetupDataCallResult& dcResult) {
Jack Yu5079e182017-02-28 15:21:18 -08006890 dcResult.status = (DataCallFailCause) dcResponse->status;
Amit Mahajan5829a472016-12-28 17:28:07 -08006891 dcResult.suggestedRetryTime = dcResponse->suggestedRetryTime;
6892 dcResult.cid = dcResponse->cid;
6893 dcResult.active = dcResponse->active;
6894 dcResult.type = convertCharPtrToHidlString(dcResponse->type);
6895 dcResult.ifname = convertCharPtrToHidlString(dcResponse->ifname);
6896 dcResult.addresses = convertCharPtrToHidlString(dcResponse->addresses);
6897 dcResult.dnses = convertCharPtrToHidlString(dcResponse->dnses);
6898 dcResult.gateways = convertCharPtrToHidlString(dcResponse->gateways);
6899 dcResult.pcscf = convertCharPtrToHidlString(dcResponse->pcscf);
6900 dcResult.mtu = dcResponse->mtu;
6901}
6902
6903void convertRilDataCallListToHal(void *response, size_t responseLen,
6904 hidl_vec<SetupDataCallResult>& dcResultList) {
6905 int num = responseLen / sizeof(RIL_Data_Call_Response_v11);
6906
6907 RIL_Data_Call_Response_v11 *dcResponse = (RIL_Data_Call_Response_v11 *) response;
6908 dcResultList.resize(num);
6909 for (int i = 0; i < num; i++) {
6910 convertRilDataCallToHal(&dcResponse[i], dcResultList[i]);
6911 }
6912}
6913
Amit Mahajan759786a2017-03-03 17:35:47 -08006914int radio::dataCallListChangedInd(int slotId,
Amit Mahajan5829a472016-12-28 17:28:07 -08006915 int indicationType, int token, RIL_Errno e, void *response,
6916 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08006917 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan5829a472016-12-28 17:28:07 -08006918 if (response == NULL || responseLen % sizeof(RIL_Data_Call_Response_v11) != 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006919 RLOGE("dataCallListChangedInd: invalid response");
Amit Mahajan5829a472016-12-28 17:28:07 -08006920 return 0;
6921 }
6922 hidl_vec<SetupDataCallResult> dcList;
6923 convertRilDataCallListToHal(response, responseLen, dcList);
Jayachandran C572f2f42017-03-25 14:30:13 -07006924#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006925 RLOGD("dataCallListChangedInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07006926#endif
Amit Mahajan17249842017-01-19 15:05:45 -08006927 Return<void> retStatus = radioService[slotId]->mRadioIndication->dataCallListChanged(
Amit Mahajan5829a472016-12-28 17:28:07 -08006928 convertIntToRadioIndicationType(indicationType), dcList);
Amit Mahajan17249842017-01-19 15:05:45 -08006929 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08006930 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006931 RLOGE("dataCallListChangedInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08006932 }
6933
6934 return 0;
6935}
6936
Amit Mahajan759786a2017-03-03 17:35:47 -08006937int radio::suppSvcNotifyInd(int slotId, int indicationType,
Amit Mahajan5829a472016-12-28 17:28:07 -08006938 int token, RIL_Errno e, void *response, size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08006939 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan5829a472016-12-28 17:28:07 -08006940 if (response == NULL || responseLen != sizeof(RIL_SuppSvcNotification)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006941 RLOGE("suppSvcNotifyInd: invalid response");
Amit Mahajan5829a472016-12-28 17:28:07 -08006942 return 0;
6943 }
6944
Jack Yuf68e0da2017-02-07 14:53:09 -08006945 SuppSvcNotification suppSvc = {};
Amit Mahajan5829a472016-12-28 17:28:07 -08006946 RIL_SuppSvcNotification *ssn = (RIL_SuppSvcNotification *) response;
6947 suppSvc.isMT = ssn->notificationType;
6948 suppSvc.code = ssn->code;
6949 suppSvc.index = ssn->index;
6950 suppSvc.type = ssn->type;
6951 suppSvc.number = convertCharPtrToHidlString(ssn->number);
6952
Jayachandran C572f2f42017-03-25 14:30:13 -07006953#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006954 RLOGD("suppSvcNotifyInd: isMT %d code %d index %d type %d",
Amit Mahajan5829a472016-12-28 17:28:07 -08006955 suppSvc.isMT, suppSvc.code, suppSvc.index, suppSvc.type);
Jayachandran C572f2f42017-03-25 14:30:13 -07006956#endif
Amit Mahajan17249842017-01-19 15:05:45 -08006957 Return<void> retStatus = radioService[slotId]->mRadioIndication->suppSvcNotify(
Amit Mahajan5829a472016-12-28 17:28:07 -08006958 convertIntToRadioIndicationType(indicationType), suppSvc);
Amit Mahajan17249842017-01-19 15:05:45 -08006959 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08006960 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006961 RLOGE("suppSvcNotifyInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08006962 }
6963
6964 return 0;
6965}
6966
Amit Mahajan759786a2017-03-03 17:35:47 -08006967int radio::stkSessionEndInd(int slotId, int indicationType,
Amit Mahajan5829a472016-12-28 17:28:07 -08006968 int token, RIL_Errno e, void *response, size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08006969 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006970#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006971 RLOGD("stkSessionEndInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07006972#endif
Amit Mahajan17249842017-01-19 15:05:45 -08006973 Return<void> retStatus = radioService[slotId]->mRadioIndication->stkSessionEnd(
Amit Mahajan5829a472016-12-28 17:28:07 -08006974 convertIntToRadioIndicationType(indicationType));
Amit Mahajan17249842017-01-19 15:05:45 -08006975 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08006976 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006977 RLOGE("stkSessionEndInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08006978 }
6979
6980 return 0;
6981}
6982
Amit Mahajan759786a2017-03-03 17:35:47 -08006983int radio::stkProactiveCommandInd(int slotId,
Amit Mahajan5829a472016-12-28 17:28:07 -08006984 int indicationType, int token, RIL_Errno e, void *response,
6985 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08006986 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan5829a472016-12-28 17:28:07 -08006987 if (response == NULL || responseLen == 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006988 RLOGE("stkProactiveCommandInd: invalid response");
Amit Mahajan5829a472016-12-28 17:28:07 -08006989 return 0;
6990 }
Jayachandran C572f2f42017-03-25 14:30:13 -07006991#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006992 RLOGD("stkProactiveCommandInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07006993#endif
Amit Mahajan17249842017-01-19 15:05:45 -08006994 Return<void> retStatus = radioService[slotId]->mRadioIndication->stkProactiveCommand(
Amit Mahajan5829a472016-12-28 17:28:07 -08006995 convertIntToRadioIndicationType(indicationType),
6996 convertCharPtrToHidlString((char *) response));
Amit Mahajan17249842017-01-19 15:05:45 -08006997 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08006998 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006999 RLOGE("stkProactiveCommandInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08007000 }
7001
7002 return 0;
7003}
7004
Amit Mahajan759786a2017-03-03 17:35:47 -08007005int radio::stkEventNotifyInd(int slotId, int indicationType,
Amit Mahajan5829a472016-12-28 17:28:07 -08007006 int token, RIL_Errno e, void *response, size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007007 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan5829a472016-12-28 17:28:07 -08007008 if (response == NULL || responseLen == 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007009 RLOGE("stkEventNotifyInd: invalid response");
Amit Mahajan5829a472016-12-28 17:28:07 -08007010 return 0;
7011 }
Jayachandran C572f2f42017-03-25 14:30:13 -07007012#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007013 RLOGD("stkEventNotifyInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07007014#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007015 Return<void> retStatus = radioService[slotId]->mRadioIndication->stkEventNotify(
Amit Mahajan5829a472016-12-28 17:28:07 -08007016 convertIntToRadioIndicationType(indicationType),
7017 convertCharPtrToHidlString((char *) response));
Amit Mahajan17249842017-01-19 15:05:45 -08007018 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08007019 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007020 RLOGE("stkEventNotifyInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08007021 }
7022
7023 return 0;
7024}
7025
Amit Mahajan759786a2017-03-03 17:35:47 -08007026int radio::stkCallSetupInd(int slotId, int indicationType,
Amit Mahajan5829a472016-12-28 17:28:07 -08007027 int token, RIL_Errno e, void *response, size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007028 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan5829a472016-12-28 17:28:07 -08007029 if (response == NULL || responseLen != sizeof(int)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007030 RLOGE("stkCallSetupInd: invalid response");
Amit Mahajan5829a472016-12-28 17:28:07 -08007031 return 0;
7032 }
7033 int32_t timeout = ((int32_t *) response)[0];
Jayachandran C572f2f42017-03-25 14:30:13 -07007034#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007035 RLOGD("stkCallSetupInd: timeout %d", timeout);
Jayachandran C572f2f42017-03-25 14:30:13 -07007036#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007037 Return<void> retStatus = radioService[slotId]->mRadioIndication->stkCallSetup(
Amit Mahajan5829a472016-12-28 17:28:07 -08007038 convertIntToRadioIndicationType(indicationType), timeout);
Amit Mahajan17249842017-01-19 15:05:45 -08007039 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08007040 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007041 RLOGE("stkCallSetupInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08007042 }
7043
7044 return 0;
7045}
7046
Amit Mahajan759786a2017-03-03 17:35:47 -08007047int radio::simSmsStorageFullInd(int slotId,
Amit Mahajan5829a472016-12-28 17:28:07 -08007048 int indicationType, int token, RIL_Errno e, void *response,
7049 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007050 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Jayachandran C572f2f42017-03-25 14:30:13 -07007051#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007052 RLOGD("simSmsStorageFullInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07007053#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007054 Return<void> retStatus = radioService[slotId]->mRadioIndication->simSmsStorageFull(
Amit Mahajan5829a472016-12-28 17:28:07 -08007055 convertIntToRadioIndicationType(indicationType));
Amit Mahajan17249842017-01-19 15:05:45 -08007056 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08007057 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007058 RLOGE("simSmsStorageFullInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08007059 }
7060
7061 return 0;
7062}
7063
Amit Mahajan759786a2017-03-03 17:35:47 -08007064int radio::simRefreshInd(int slotId, int indicationType,
Amit Mahajan5829a472016-12-28 17:28:07 -08007065 int token, RIL_Errno e, void *response, size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007066 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan5829a472016-12-28 17:28:07 -08007067 if (response == NULL || responseLen != sizeof(RIL_SimRefreshResponse_v7)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007068 RLOGE("simRefreshInd: invalid response");
Amit Mahajan5829a472016-12-28 17:28:07 -08007069 return 0;
7070 }
7071
Jack Yuf68e0da2017-02-07 14:53:09 -08007072 SimRefreshResult refreshResult = {};
Amit Mahajan5829a472016-12-28 17:28:07 -08007073 RIL_SimRefreshResponse_v7 *simRefreshResponse = ((RIL_SimRefreshResponse_v7 *) response);
7074 refreshResult.type =
7075 (android::hardware::radio::V1_0::SimRefreshType) simRefreshResponse->result;
7076 refreshResult.efId = simRefreshResponse->ef_id;
7077 refreshResult.aid = convertCharPtrToHidlString(simRefreshResponse->aid);
7078
Jayachandran C572f2f42017-03-25 14:30:13 -07007079#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007080 RLOGD("simRefreshInd: type %d efId %d", refreshResult.type, refreshResult.efId);
Jayachandran C572f2f42017-03-25 14:30:13 -07007081#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007082 Return<void> retStatus = radioService[slotId]->mRadioIndication->simRefresh(
Amit Mahajan5829a472016-12-28 17:28:07 -08007083 convertIntToRadioIndicationType(indicationType), refreshResult);
Amit Mahajan17249842017-01-19 15:05:45 -08007084 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08007085 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007086 RLOGE("simRefreshInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08007087 }
7088
7089 return 0;
7090}
7091
7092void convertRilCdmaSignalInfoRecordToHal(RIL_CDMA_SignalInfoRecord *signalInfoRecord,
7093 CdmaSignalInfoRecord& record) {
7094 record.isPresent = signalInfoRecord->isPresent;
7095 record.signalType = signalInfoRecord->signalType;
7096 record.alertPitch = signalInfoRecord->alertPitch;
7097 record.signal = signalInfoRecord->signal;
7098}
7099
Amit Mahajan759786a2017-03-03 17:35:47 -08007100int radio::callRingInd(int slotId, int indicationType,
Amit Mahajan5829a472016-12-28 17:28:07 -08007101 int token, RIL_Errno e, void *response, size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007102 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan5829a472016-12-28 17:28:07 -08007103 bool isGsm;
Jack Yuf68e0da2017-02-07 14:53:09 -08007104 CdmaSignalInfoRecord record = {};
Amit Mahajan5829a472016-12-28 17:28:07 -08007105 if (response == NULL || responseLen == 0) {
7106 isGsm = true;
7107 } else {
7108 isGsm = false;
7109 if (responseLen != sizeof (RIL_CDMA_SignalInfoRecord)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007110 RLOGE("callRingInd: invalid response");
Amit Mahajan5829a472016-12-28 17:28:07 -08007111 return 0;
7112 }
7113 convertRilCdmaSignalInfoRecordToHal((RIL_CDMA_SignalInfoRecord *) response, record);
7114 }
7115
Jayachandran C572f2f42017-03-25 14:30:13 -07007116#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007117 RLOGD("callRingInd: isGsm %d", isGsm);
Jayachandran C572f2f42017-03-25 14:30:13 -07007118#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007119 Return<void> retStatus = radioService[slotId]->mRadioIndication->callRing(
Amit Mahajan5829a472016-12-28 17:28:07 -08007120 convertIntToRadioIndicationType(indicationType), isGsm, record);
Amit Mahajan17249842017-01-19 15:05:45 -08007121 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08007122 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007123 RLOGE("callRingInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08007124 }
7125
7126 return 0;
7127}
7128
Amit Mahajan759786a2017-03-03 17:35:47 -08007129int radio::simStatusChangedInd(int slotId,
Amit Mahajan5829a472016-12-28 17:28:07 -08007130 int indicationType, int token, RIL_Errno e, void *response,
7131 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007132 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Jayachandran C572f2f42017-03-25 14:30:13 -07007133#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007134 RLOGD("simStatusChangedInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07007135#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007136 Return<void> retStatus = radioService[slotId]->mRadioIndication->simStatusChanged(
Amit Mahajan5829a472016-12-28 17:28:07 -08007137 convertIntToRadioIndicationType(indicationType));
Amit Mahajan17249842017-01-19 15:05:45 -08007138 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08007139 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007140 RLOGE("simStatusChangedInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08007141 }
7142
7143 return 0;
7144}
7145
Amit Mahajan759786a2017-03-03 17:35:47 -08007146int radio::cdmaNewSmsInd(int slotId, int indicationType,
Amit Mahajan5829a472016-12-28 17:28:07 -08007147 int token, RIL_Errno e, void *response, size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007148 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan5829a472016-12-28 17:28:07 -08007149 if (response == NULL || responseLen != sizeof(RIL_CDMA_SMS_Message)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007150 RLOGE("cdmaNewSmsInd: invalid response");
Amit Mahajan5829a472016-12-28 17:28:07 -08007151 return 0;
7152 }
7153
Jack Yuf68e0da2017-02-07 14:53:09 -08007154 CdmaSmsMessage msg = {};
Amit Mahajan5829a472016-12-28 17:28:07 -08007155 RIL_CDMA_SMS_Message *rilMsg = (RIL_CDMA_SMS_Message *) response;
7156 msg.teleserviceId = rilMsg->uTeleserviceID;
7157 msg.isServicePresent = rilMsg->bIsServicePresent;
7158 msg.serviceCategory = rilMsg->uServicecategory;
7159 msg.address.digitMode =
7160 (android::hardware::radio::V1_0::CdmaSmsDigitMode) rilMsg->sAddress.digit_mode;
7161 msg.address.numberMode =
7162 (android::hardware::radio::V1_0::CdmaSmsNumberMode) rilMsg->sAddress.number_mode;
7163 msg.address.numberType =
7164 (android::hardware::radio::V1_0::CdmaSmsNumberType) rilMsg->sAddress.number_type;
7165 msg.address.numberPlan =
7166 (android::hardware::radio::V1_0::CdmaSmsNumberPlan) rilMsg->sAddress.number_plan;
7167
7168 int digitLimit = MIN((rilMsg->sAddress.number_of_digits), RIL_CDMA_SMS_ADDRESS_MAX);
7169 msg.address.digits.setToExternal(rilMsg->sAddress.digits, digitLimit);
7170
7171 msg.subAddress.subaddressType = (android::hardware::radio::V1_0::CdmaSmsSubaddressType)
7172 rilMsg->sSubAddress.subaddressType;
7173 msg.subAddress.odd = rilMsg->sSubAddress.odd;
7174
7175 digitLimit= MIN((rilMsg->sSubAddress.number_of_digits), RIL_CDMA_SMS_SUBADDRESS_MAX);
7176 msg.subAddress.digits.setToExternal(rilMsg->sSubAddress.digits, digitLimit);
7177
7178 digitLimit = MIN((rilMsg->uBearerDataLen), RIL_CDMA_SMS_BEARER_DATA_MAX);
7179 msg.bearerData.setToExternal(rilMsg->aBearerData, digitLimit);
7180
Jayachandran C572f2f42017-03-25 14:30:13 -07007181#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007182 RLOGD("cdmaNewSmsInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07007183#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007184 Return<void> retStatus = radioService[slotId]->mRadioIndication->cdmaNewSms(
Amit Mahajan5829a472016-12-28 17:28:07 -08007185 convertIntToRadioIndicationType(indicationType), msg);
Amit Mahajan17249842017-01-19 15:05:45 -08007186 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08007187 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007188 RLOGE("cdmaNewSmsInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08007189 }
7190
7191 return 0;
7192}
7193
Amit Mahajan759786a2017-03-03 17:35:47 -08007194int radio::newBroadcastSmsInd(int slotId,
Amit Mahajan1955c742016-12-29 07:07:54 -08007195 int indicationType, int token, RIL_Errno e, void *response,
7196 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007197 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan1955c742016-12-29 07:07:54 -08007198 if (response == NULL || responseLen == 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007199 RLOGE("newBroadcastSmsInd: invalid response");
Amit Mahajan1955c742016-12-29 07:07:54 -08007200 return 0;
7201 }
7202
7203 hidl_vec<uint8_t> data;
7204 data.setToExternal((uint8_t *) response, responseLen);
Jayachandran C572f2f42017-03-25 14:30:13 -07007205#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007206 RLOGD("newBroadcastSmsInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07007207#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007208 Return<void> retStatus = radioService[slotId]->mRadioIndication->newBroadcastSms(
Amit Mahajan1955c742016-12-29 07:07:54 -08007209 convertIntToRadioIndicationType(indicationType), data);
Amit Mahajan17249842017-01-19 15:05:45 -08007210 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan1955c742016-12-29 07:07:54 -08007211 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007212 RLOGE("newBroadcastSmsInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan1955c742016-12-29 07:07:54 -08007213 }
7214
7215 return 0;
7216}
7217
Amit Mahajan759786a2017-03-03 17:35:47 -08007218int radio::cdmaRuimSmsStorageFullInd(int slotId,
Amit Mahajan1955c742016-12-29 07:07:54 -08007219 int indicationType, int token, RIL_Errno e, void *response,
7220 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007221 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Jayachandran C572f2f42017-03-25 14:30:13 -07007222#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007223 RLOGD("cdmaRuimSmsStorageFullInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07007224#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007225 Return<void> retStatus = radioService[slotId]->mRadioIndication->cdmaRuimSmsStorageFull(
Amit Mahajan1955c742016-12-29 07:07:54 -08007226 convertIntToRadioIndicationType(indicationType));
Amit Mahajan17249842017-01-19 15:05:45 -08007227 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan1955c742016-12-29 07:07:54 -08007228 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007229 RLOGE("cdmaRuimSmsStorageFullInd: radioService[%d]->mRadioIndication == NULL",
Amit Mahajan1955c742016-12-29 07:07:54 -08007230 slotId);
7231 }
7232
7233 return 0;
7234}
7235
Amit Mahajan759786a2017-03-03 17:35:47 -08007236int radio::restrictedStateChangedInd(int slotId,
Amit Mahajan1955c742016-12-29 07:07:54 -08007237 int indicationType, int token, RIL_Errno e, void *response,
7238 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007239 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan1955c742016-12-29 07:07:54 -08007240 if (response == NULL || responseLen != sizeof(int)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007241 RLOGE("restrictedStateChangedInd: invalid response");
Amit Mahajan1955c742016-12-29 07:07:54 -08007242 return 0;
7243 }
7244 int32_t state = ((int32_t *) response)[0];
Jayachandran C572f2f42017-03-25 14:30:13 -07007245#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007246 RLOGD("restrictedStateChangedInd: state %d", state);
Jayachandran C572f2f42017-03-25 14:30:13 -07007247#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007248 Return<void> retStatus = radioService[slotId]->mRadioIndication->restrictedStateChanged(
Amit Mahajan1955c742016-12-29 07:07:54 -08007249 convertIntToRadioIndicationType(indicationType), (PhoneRestrictedState) state);
Amit Mahajan17249842017-01-19 15:05:45 -08007250 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan1955c742016-12-29 07:07:54 -08007251 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007252 RLOGE("restrictedStateChangedInd: radioService[%d]->mRadioIndication == NULL",
Amit Mahajan1955c742016-12-29 07:07:54 -08007253 slotId);
7254 }
7255
7256 return 0;
7257}
7258
Amit Mahajan759786a2017-03-03 17:35:47 -08007259int radio::enterEmergencyCallbackModeInd(int slotId,
Amit Mahajan1955c742016-12-29 07:07:54 -08007260 int indicationType, int token, RIL_Errno e, void *response,
7261 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007262 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Jayachandran C572f2f42017-03-25 14:30:13 -07007263#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007264 RLOGD("enterEmergencyCallbackModeInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07007265#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007266 Return<void> retStatus = radioService[slotId]->mRadioIndication->enterEmergencyCallbackMode(
Amit Mahajan1955c742016-12-29 07:07:54 -08007267 convertIntToRadioIndicationType(indicationType));
Amit Mahajan17249842017-01-19 15:05:45 -08007268 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan1955c742016-12-29 07:07:54 -08007269 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007270 RLOGE("enterEmergencyCallbackModeInd: radioService[%d]->mRadioIndication == NULL",
Amit Mahajan1955c742016-12-29 07:07:54 -08007271 slotId);
7272 }
7273
7274 return 0;
7275}
7276
Amit Mahajan759786a2017-03-03 17:35:47 -08007277int radio::cdmaCallWaitingInd(int slotId,
Amit Mahajan1955c742016-12-29 07:07:54 -08007278 int indicationType, int token, RIL_Errno e, void *response,
7279 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007280 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan1955c742016-12-29 07:07:54 -08007281 if (response == NULL || responseLen != sizeof(RIL_CDMA_CallWaiting_v6)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007282 RLOGE("cdmaCallWaitingInd: invalid response");
Amit Mahajan1955c742016-12-29 07:07:54 -08007283 return 0;
7284 }
7285
Jack Yuf68e0da2017-02-07 14:53:09 -08007286 CdmaCallWaiting callWaitingRecord = {};
Amit Mahajan1955c742016-12-29 07:07:54 -08007287 RIL_CDMA_CallWaiting_v6 *callWaitingRil = ((RIL_CDMA_CallWaiting_v6 *) response);
7288 callWaitingRecord.number = convertCharPtrToHidlString(callWaitingRil->number);
7289 callWaitingRecord.numberPresentation =
7290 (CdmaCallWaitingNumberPresentation) callWaitingRil->numberPresentation;
7291 callWaitingRecord.name = convertCharPtrToHidlString(callWaitingRil->name);
7292 convertRilCdmaSignalInfoRecordToHal(&callWaitingRil->signalInfoRecord,
7293 callWaitingRecord.signalInfoRecord);
7294 callWaitingRecord.numberType = (CdmaCallWaitingNumberType) callWaitingRil->number_type;
7295 callWaitingRecord.numberPlan = (CdmaCallWaitingNumberPlan) callWaitingRil->number_plan;
7296
Jayachandran C572f2f42017-03-25 14:30:13 -07007297#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007298 RLOGD("cdmaCallWaitingInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07007299#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007300 Return<void> retStatus = radioService[slotId]->mRadioIndication->cdmaCallWaiting(
Amit Mahajan1955c742016-12-29 07:07:54 -08007301 convertIntToRadioIndicationType(indicationType), callWaitingRecord);
Amit Mahajan17249842017-01-19 15:05:45 -08007302 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan1955c742016-12-29 07:07:54 -08007303 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007304 RLOGE("cdmaCallWaitingInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan1955c742016-12-29 07:07:54 -08007305 }
7306
7307 return 0;
7308}
7309
Amit Mahajan759786a2017-03-03 17:35:47 -08007310int radio::cdmaOtaProvisionStatusInd(int slotId,
Amit Mahajan1955c742016-12-29 07:07:54 -08007311 int indicationType, int token, RIL_Errno e, void *response,
7312 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007313 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan1955c742016-12-29 07:07:54 -08007314 if (response == NULL || responseLen != sizeof(int)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007315 RLOGE("cdmaOtaProvisionStatusInd: invalid response");
Amit Mahajan1955c742016-12-29 07:07:54 -08007316 return 0;
7317 }
7318 int32_t status = ((int32_t *) response)[0];
Jayachandran C572f2f42017-03-25 14:30:13 -07007319#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007320 RLOGD("cdmaOtaProvisionStatusInd: status %d", status);
Jayachandran C572f2f42017-03-25 14:30:13 -07007321#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007322 Return<void> retStatus = radioService[slotId]->mRadioIndication->cdmaOtaProvisionStatus(
Amit Mahajan1955c742016-12-29 07:07:54 -08007323 convertIntToRadioIndicationType(indicationType), (CdmaOtaProvisionStatus) status);
Amit Mahajan17249842017-01-19 15:05:45 -08007324 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan1955c742016-12-29 07:07:54 -08007325 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007326 RLOGE("cdmaOtaProvisionStatusInd: radioService[%d]->mRadioIndication == NULL",
Amit Mahajan1955c742016-12-29 07:07:54 -08007327 slotId);
7328 }
7329
7330 return 0;
7331}
7332
Amit Mahajan759786a2017-03-03 17:35:47 -08007333int radio::cdmaInfoRecInd(int slotId,
Amit Mahajan1955c742016-12-29 07:07:54 -08007334 int indicationType, int token, RIL_Errno e, void *response,
7335 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007336 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan1955c742016-12-29 07:07:54 -08007337 if (response == NULL || responseLen != sizeof(RIL_CDMA_InformationRecords)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007338 RLOGE("cdmaInfoRecInd: invalid response");
Amit Mahajan1955c742016-12-29 07:07:54 -08007339 return 0;
7340 }
7341
Jack Yuf68e0da2017-02-07 14:53:09 -08007342 CdmaInformationRecords records = {};
Amit Mahajan1955c742016-12-29 07:07:54 -08007343 RIL_CDMA_InformationRecords *recordsRil = (RIL_CDMA_InformationRecords *) response;
7344
7345 char* string8 = NULL;
7346 int num = MIN(recordsRil->numberOfInfoRecs, RIL_CDMA_MAX_NUMBER_OF_INFO_RECS);
7347 if (recordsRil->numberOfInfoRecs > RIL_CDMA_MAX_NUMBER_OF_INFO_RECS) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007348 RLOGE("cdmaInfoRecInd: received %d recs which is more than %d, dropping "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08007349 "additional ones", recordsRil->numberOfInfoRecs,
Amit Mahajan1955c742016-12-29 07:07:54 -08007350 RIL_CDMA_MAX_NUMBER_OF_INFO_RECS);
7351 }
7352 records.infoRec.resize(num);
7353 for (int i = 0 ; i < num ; i++) {
7354 CdmaInformationRecord *record = &records.infoRec[i];
7355 RIL_CDMA_InformationRecord *infoRec = &recordsRil->infoRec[i];
7356 record->name = (CdmaInfoRecName) infoRec->name;
Sanket Padawe378ccdd2017-01-24 14:11:12 -08007357 // All vectors should be size 0 except one which will be size 1. Set everything to
7358 // size 0 initially.
7359 record->display.resize(0);
7360 record->number.resize(0);
7361 record->signal.resize(0);
7362 record->redir.resize(0);
7363 record->lineCtrl.resize(0);
7364 record->clir.resize(0);
7365 record->audioCtrl.resize(0);
Amit Mahajan1955c742016-12-29 07:07:54 -08007366 switch (infoRec->name) {
7367 case RIL_CDMA_DISPLAY_INFO_REC:
7368 case RIL_CDMA_EXTENDED_DISPLAY_INFO_REC: {
7369 if (infoRec->rec.display.alpha_len > CDMA_ALPHA_INFO_BUFFER_LENGTH) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007370 RLOGE("cdmaInfoRecInd: invalid display info response length %d "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08007371 "expected not more than %d", (int) infoRec->rec.display.alpha_len,
Amit Mahajan1955c742016-12-29 07:07:54 -08007372 CDMA_ALPHA_INFO_BUFFER_LENGTH);
7373 return 0;
7374 }
7375 string8 = (char*) malloc((infoRec->rec.display.alpha_len + 1) * sizeof(char));
7376 if (string8 == NULL) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007377 RLOGE("cdmaInfoRecInd: Memory allocation failed for "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08007378 "responseCdmaInformationRecords");
Amit Mahajan1955c742016-12-29 07:07:54 -08007379 return 0;
7380 }
7381 memcpy(string8, infoRec->rec.display.alpha_buf, infoRec->rec.display.alpha_len);
7382 string8[(int)infoRec->rec.display.alpha_len] = '\0';
7383
7384 record->display.resize(1);
7385 record->display[0].alphaBuf = string8;
7386 free(string8);
7387 string8 = NULL;
7388 break;
7389 }
7390
7391 case RIL_CDMA_CALLED_PARTY_NUMBER_INFO_REC:
7392 case RIL_CDMA_CALLING_PARTY_NUMBER_INFO_REC:
7393 case RIL_CDMA_CONNECTED_NUMBER_INFO_REC: {
7394 if (infoRec->rec.number.len > CDMA_NUMBER_INFO_BUFFER_LENGTH) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007395 RLOGE("cdmaInfoRecInd: invalid display info response length %d "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08007396 "expected not more than %d", (int) infoRec->rec.number.len,
Amit Mahajan1955c742016-12-29 07:07:54 -08007397 CDMA_NUMBER_INFO_BUFFER_LENGTH);
7398 return 0;
7399 }
7400 string8 = (char*) malloc((infoRec->rec.number.len + 1) * sizeof(char));
7401 if (string8 == NULL) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007402 RLOGE("cdmaInfoRecInd: Memory allocation failed for "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08007403 "responseCdmaInformationRecords");
Amit Mahajan1955c742016-12-29 07:07:54 -08007404 return 0;
7405 }
7406 memcpy(string8, infoRec->rec.number.buf, infoRec->rec.number.len);
7407 string8[(int)infoRec->rec.number.len] = '\0';
7408
7409 record->number.resize(1);
7410 record->number[0].number = string8;
7411 free(string8);
7412 string8 = NULL;
7413 record->number[0].numberType = infoRec->rec.number.number_type;
7414 record->number[0].numberPlan = infoRec->rec.number.number_plan;
7415 record->number[0].pi = infoRec->rec.number.pi;
7416 record->number[0].si = infoRec->rec.number.si;
7417 break;
7418 }
7419
7420 case RIL_CDMA_SIGNAL_INFO_REC: {
7421 record->signal.resize(1);
7422 record->signal[0].isPresent = infoRec->rec.signal.isPresent;
7423 record->signal[0].signalType = infoRec->rec.signal.signalType;
7424 record->signal[0].alertPitch = infoRec->rec.signal.alertPitch;
7425 record->signal[0].signal = infoRec->rec.signal.signal;
7426 break;
7427 }
7428
7429 case RIL_CDMA_REDIRECTING_NUMBER_INFO_REC: {
7430 if (infoRec->rec.redir.redirectingNumber.len >
7431 CDMA_NUMBER_INFO_BUFFER_LENGTH) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007432 RLOGE("cdmaInfoRecInd: invalid display info response length %d "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08007433 "expected not more than %d\n",
Amit Mahajan1955c742016-12-29 07:07:54 -08007434 (int)infoRec->rec.redir.redirectingNumber.len,
7435 CDMA_NUMBER_INFO_BUFFER_LENGTH);
7436 return 0;
7437 }
7438 string8 = (char*) malloc((infoRec->rec.redir.redirectingNumber.len + 1) *
7439 sizeof(char));
7440 if (string8 == NULL) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007441 RLOGE("cdmaInfoRecInd: Memory allocation failed for "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08007442 "responseCdmaInformationRecords");
Amit Mahajan1955c742016-12-29 07:07:54 -08007443 return 0;
7444 }
7445 memcpy(string8, infoRec->rec.redir.redirectingNumber.buf,
7446 infoRec->rec.redir.redirectingNumber.len);
7447 string8[(int)infoRec->rec.redir.redirectingNumber.len] = '\0';
7448
7449 record->redir.resize(1);
7450 record->redir[0].redirectingNumber.number = string8;
7451 free(string8);
7452 string8 = NULL;
7453 record->redir[0].redirectingNumber.numberType =
7454 infoRec->rec.redir.redirectingNumber.number_type;
7455 record->redir[0].redirectingNumber.numberPlan =
7456 infoRec->rec.redir.redirectingNumber.number_plan;
7457 record->redir[0].redirectingNumber.pi = infoRec->rec.redir.redirectingNumber.pi;
7458 record->redir[0].redirectingNumber.si = infoRec->rec.redir.redirectingNumber.si;
7459 record->redir[0].redirectingReason =
7460 (CdmaRedirectingReason) infoRec->rec.redir.redirectingReason;
7461 break;
7462 }
7463
7464 case RIL_CDMA_LINE_CONTROL_INFO_REC: {
7465 record->lineCtrl.resize(1);
7466 record->lineCtrl[0].lineCtrlPolarityIncluded =
7467 infoRec->rec.lineCtrl.lineCtrlPolarityIncluded;
7468 record->lineCtrl[0].lineCtrlToggle = infoRec->rec.lineCtrl.lineCtrlToggle;
7469 record->lineCtrl[0].lineCtrlReverse = infoRec->rec.lineCtrl.lineCtrlReverse;
7470 record->lineCtrl[0].lineCtrlPowerDenial =
7471 infoRec->rec.lineCtrl.lineCtrlPowerDenial;
7472 break;
7473 }
7474
7475 case RIL_CDMA_T53_CLIR_INFO_REC: {
7476 record->clir.resize(1);
7477 record->clir[0].cause = infoRec->rec.clir.cause;
7478 break;
7479 }
7480
7481 case RIL_CDMA_T53_AUDIO_CONTROL_INFO_REC: {
7482 record->audioCtrl.resize(1);
7483 record->audioCtrl[0].upLink = infoRec->rec.audioCtrl.upLink;
7484 record->audioCtrl[0].downLink = infoRec->rec.audioCtrl.downLink;
7485 break;
7486 }
7487
7488 case RIL_CDMA_T53_RELEASE_INFO_REC:
Amit Mahajan111ddca2017-03-03 12:05:13 -08007489 RLOGE("cdmaInfoRecInd: RIL_CDMA_T53_RELEASE_INFO_REC: INVALID");
Amit Mahajan1955c742016-12-29 07:07:54 -08007490 return 0;
7491
7492 default:
Amit Mahajan111ddca2017-03-03 12:05:13 -08007493 RLOGE("cdmaInfoRecInd: Incorrect name value");
Amit Mahajan1955c742016-12-29 07:07:54 -08007494 return 0;
7495 }
7496 }
7497
Jayachandran C572f2f42017-03-25 14:30:13 -07007498#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007499 RLOGD("cdmaInfoRecInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07007500#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007501 Return<void> retStatus = radioService[slotId]->mRadioIndication->cdmaInfoRec(
Amit Mahajan1955c742016-12-29 07:07:54 -08007502 convertIntToRadioIndicationType(indicationType), records);
Amit Mahajan17249842017-01-19 15:05:45 -08007503 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan1955c742016-12-29 07:07:54 -08007504 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007505 RLOGE("cdmaInfoRecInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan1955c742016-12-29 07:07:54 -08007506 }
7507
7508 return 0;
7509}
7510
Amit Mahajan759786a2017-03-03 17:35:47 -08007511int radio::indicateRingbackToneInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007512 int indicationType, int token, RIL_Errno e, void *response,
7513 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007514 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007515 if (response == NULL || responseLen != sizeof(int)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007516 RLOGE("indicateRingbackToneInd: invalid response");
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007517 return 0;
7518 }
7519 bool start = ((int32_t *) response)[0];
Jayachandran C572f2f42017-03-25 14:30:13 -07007520#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007521 RLOGD("indicateRingbackToneInd: start %d", start);
Jayachandran C572f2f42017-03-25 14:30:13 -07007522#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007523 Return<void> retStatus = radioService[slotId]->mRadioIndication->indicateRingbackTone(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007524 convertIntToRadioIndicationType(indicationType), start);
Amit Mahajan17249842017-01-19 15:05:45 -08007525 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007526 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007527 RLOGE("indicateRingbackToneInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007528 }
7529
7530 return 0;
7531}
7532
Amit Mahajan759786a2017-03-03 17:35:47 -08007533int radio::resendIncallMuteInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007534 int indicationType, int token, RIL_Errno e, void *response,
7535 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007536 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Jayachandran C572f2f42017-03-25 14:30:13 -07007537#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007538 RLOGD("resendIncallMuteInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07007539#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007540 Return<void> retStatus = radioService[slotId]->mRadioIndication->resendIncallMute(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007541 convertIntToRadioIndicationType(indicationType));
Amit Mahajan17249842017-01-19 15:05:45 -08007542 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007543 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007544 RLOGE("resendIncallMuteInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007545 }
7546
7547 return 0;
7548}
7549
Amit Mahajan759786a2017-03-03 17:35:47 -08007550int radio::cdmaSubscriptionSourceChangedInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007551 int indicationType, int token, RIL_Errno e,
7552 void *response, size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007553 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007554 if (response == NULL || responseLen != sizeof(int)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007555 RLOGE("cdmaSubscriptionSourceChangedInd: invalid response");
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007556 return 0;
7557 }
7558 int32_t cdmaSource = ((int32_t *) response)[0];
Jayachandran C572f2f42017-03-25 14:30:13 -07007559#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007560 RLOGD("cdmaSubscriptionSourceChangedInd: cdmaSource %d", cdmaSource);
Jayachandran C572f2f42017-03-25 14:30:13 -07007561#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007562 Return<void> retStatus = radioService[slotId]->mRadioIndication->
7563 cdmaSubscriptionSourceChanged(convertIntToRadioIndicationType(indicationType),
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007564 (CdmaSubscriptionSource) cdmaSource);
Amit Mahajan17249842017-01-19 15:05:45 -08007565 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007566 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007567 RLOGE("cdmaSubscriptionSourceChangedInd: radioService[%d]->mRadioIndication == NULL",
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007568 slotId);
7569 }
7570
7571 return 0;
7572}
7573
Amit Mahajan759786a2017-03-03 17:35:47 -08007574int radio::cdmaPrlChangedInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007575 int indicationType, int token, RIL_Errno e, void *response,
7576 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007577 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007578 if (response == NULL || responseLen != sizeof(int)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007579 RLOGE("cdmaPrlChangedInd: invalid response");
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007580 return 0;
7581 }
7582 int32_t version = ((int32_t *) response)[0];
Jayachandran C572f2f42017-03-25 14:30:13 -07007583#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007584 RLOGD("cdmaPrlChangedInd: version %d", version);
Jayachandran C572f2f42017-03-25 14:30:13 -07007585#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007586 Return<void> retStatus = radioService[slotId]->mRadioIndication->cdmaPrlChanged(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007587 convertIntToRadioIndicationType(indicationType), version);
Amit Mahajan17249842017-01-19 15:05:45 -08007588 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007589 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007590 RLOGE("cdmaPrlChangedInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007591 }
7592
7593 return 0;
7594}
7595
Amit Mahajan759786a2017-03-03 17:35:47 -08007596int radio::exitEmergencyCallbackModeInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007597 int indicationType, int token, RIL_Errno e, void *response,
7598 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007599 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Jayachandran C572f2f42017-03-25 14:30:13 -07007600#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007601 RLOGD("exitEmergencyCallbackModeInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07007602#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007603 Return<void> retStatus = radioService[slotId]->mRadioIndication->exitEmergencyCallbackMode(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007604 convertIntToRadioIndicationType(indicationType));
Amit Mahajan17249842017-01-19 15:05:45 -08007605 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007606 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007607 RLOGE("exitEmergencyCallbackModeInd: radioService[%d]->mRadioIndication == NULL",
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007608 slotId);
7609 }
7610
7611 return 0;
7612}
7613
Amit Mahajan759786a2017-03-03 17:35:47 -08007614int radio::rilConnectedInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007615 int indicationType, int token, RIL_Errno e, void *response,
7616 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007617 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007618 RLOGD("rilConnectedInd");
Amit Mahajan17249842017-01-19 15:05:45 -08007619 Return<void> retStatus = radioService[slotId]->mRadioIndication->rilConnected(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007620 convertIntToRadioIndicationType(indicationType));
Amit Mahajan17249842017-01-19 15:05:45 -08007621 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007622 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007623 RLOGE("rilConnectedInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007624 }
7625
7626 return 0;
7627}
7628
Amit Mahajan759786a2017-03-03 17:35:47 -08007629int radio::voiceRadioTechChangedInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007630 int indicationType, int token, RIL_Errno e, void *response,
7631 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007632 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007633 if (response == NULL || responseLen != sizeof(int)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007634 RLOGE("voiceRadioTechChangedInd: invalid response");
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007635 return 0;
7636 }
7637 int32_t rat = ((int32_t *) response)[0];
Jayachandran C572f2f42017-03-25 14:30:13 -07007638#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007639 RLOGD("voiceRadioTechChangedInd: rat %d", rat);
Jayachandran C572f2f42017-03-25 14:30:13 -07007640#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007641 Return<void> retStatus = radioService[slotId]->mRadioIndication->voiceRadioTechChanged(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007642 convertIntToRadioIndicationType(indicationType), (RadioTechnology) rat);
Amit Mahajan17249842017-01-19 15:05:45 -08007643 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007644 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007645 RLOGE("voiceRadioTechChangedInd: radioService[%d]->mRadioIndication == NULL",
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007646 slotId);
7647 }
7648
7649 return 0;
7650}
7651
7652void convertRilCellInfoListToHal(void *response, size_t responseLen, hidl_vec<CellInfo>& records) {
7653 int num = responseLen / sizeof(RIL_CellInfo_v12);
7654 records.resize(num);
7655
7656 RIL_CellInfo_v12 *rillCellInfo = (RIL_CellInfo_v12 *) response;
7657 for (int i = 0; i < num; i++) {
7658 records[i].cellInfoType = (CellInfoType) rillCellInfo->cellInfoType;
7659 records[i].registered = rillCellInfo->registered;
7660 records[i].timeStampType = (TimeStampType) rillCellInfo->timeStampType;
7661 records[i].timeStamp = rillCellInfo->timeStamp;
Sanket Padawe378ccdd2017-01-24 14:11:12 -08007662 // All vectors should be size 0 except one which will be size 1. Set everything to
7663 // size 0 initially.
7664 records[i].gsm.resize(0);
7665 records[i].wcdma.resize(0);
7666 records[i].cdma.resize(0);
7667 records[i].lte.resize(0);
7668 records[i].tdscdma.resize(0);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007669 switch(rillCellInfo->cellInfoType) {
7670 case RIL_CELL_INFO_TYPE_GSM: {
7671 records[i].gsm.resize(1);
7672 CellInfoGsm *cellInfoGsm = &records[i].gsm[0];
7673 cellInfoGsm->cellIdentityGsm.mcc =
7674 std::to_string(rillCellInfo->CellInfo.gsm.cellIdentityGsm.mcc);
7675 cellInfoGsm->cellIdentityGsm.mnc =
7676 std::to_string(rillCellInfo->CellInfo.gsm.cellIdentityGsm.mnc);
7677 cellInfoGsm->cellIdentityGsm.lac =
7678 rillCellInfo->CellInfo.gsm.cellIdentityGsm.lac;
7679 cellInfoGsm->cellIdentityGsm.cid =
7680 rillCellInfo->CellInfo.gsm.cellIdentityGsm.cid;
7681 cellInfoGsm->cellIdentityGsm.arfcn =
7682 rillCellInfo->CellInfo.gsm.cellIdentityGsm.arfcn;
7683 cellInfoGsm->cellIdentityGsm.bsic =
7684 rillCellInfo->CellInfo.gsm.cellIdentityGsm.bsic;
7685 cellInfoGsm->signalStrengthGsm.signalStrength =
7686 rillCellInfo->CellInfo.gsm.signalStrengthGsm.signalStrength;
7687 cellInfoGsm->signalStrengthGsm.bitErrorRate =
7688 rillCellInfo->CellInfo.gsm.signalStrengthGsm.bitErrorRate;
7689 cellInfoGsm->signalStrengthGsm.timingAdvance =
7690 rillCellInfo->CellInfo.gsm.signalStrengthGsm.timingAdvance;
7691 break;
7692 }
7693
7694 case RIL_CELL_INFO_TYPE_WCDMA: {
7695 records[i].wcdma.resize(1);
7696 CellInfoWcdma *cellInfoWcdma = &records[i].wcdma[0];
7697 cellInfoWcdma->cellIdentityWcdma.mcc =
7698 std::to_string(rillCellInfo->CellInfo.wcdma.cellIdentityWcdma.mcc);
7699 cellInfoWcdma->cellIdentityWcdma.mnc =
7700 std::to_string(rillCellInfo->CellInfo.wcdma.cellIdentityWcdma.mnc);
7701 cellInfoWcdma->cellIdentityWcdma.lac =
7702 rillCellInfo->CellInfo.wcdma.cellIdentityWcdma.lac;
7703 cellInfoWcdma->cellIdentityWcdma.cid =
7704 rillCellInfo->CellInfo.wcdma.cellIdentityWcdma.cid;
7705 cellInfoWcdma->cellIdentityWcdma.psc =
7706 rillCellInfo->CellInfo.wcdma.cellIdentityWcdma.psc;
7707 cellInfoWcdma->cellIdentityWcdma.uarfcn =
7708 rillCellInfo->CellInfo.wcdma.cellIdentityWcdma.uarfcn;
7709 cellInfoWcdma->signalStrengthWcdma.signalStrength =
7710 rillCellInfo->CellInfo.wcdma.signalStrengthWcdma.signalStrength;
7711 cellInfoWcdma->signalStrengthWcdma.bitErrorRate =
7712 rillCellInfo->CellInfo.wcdma.signalStrengthWcdma.bitErrorRate;
7713 break;
7714 }
7715
7716 case RIL_CELL_INFO_TYPE_CDMA: {
7717 records[i].cdma.resize(1);
7718 CellInfoCdma *cellInfoCdma = &records[i].cdma[0];
7719 cellInfoCdma->cellIdentityCdma.networkId =
7720 rillCellInfo->CellInfo.cdma.cellIdentityCdma.networkId;
7721 cellInfoCdma->cellIdentityCdma.systemId =
7722 rillCellInfo->CellInfo.cdma.cellIdentityCdma.systemId;
7723 cellInfoCdma->cellIdentityCdma.baseStationId =
7724 rillCellInfo->CellInfo.cdma.cellIdentityCdma.basestationId;
7725 cellInfoCdma->cellIdentityCdma.longitude =
7726 rillCellInfo->CellInfo.cdma.cellIdentityCdma.longitude;
7727 cellInfoCdma->cellIdentityCdma.latitude =
7728 rillCellInfo->CellInfo.cdma.cellIdentityCdma.latitude;
7729 cellInfoCdma->signalStrengthCdma.dbm =
7730 rillCellInfo->CellInfo.cdma.signalStrengthCdma.dbm;
7731 cellInfoCdma->signalStrengthCdma.ecio =
7732 rillCellInfo->CellInfo.cdma.signalStrengthCdma.ecio;
7733 cellInfoCdma->signalStrengthEvdo.dbm =
7734 rillCellInfo->CellInfo.cdma.signalStrengthEvdo.dbm;
7735 cellInfoCdma->signalStrengthEvdo.ecio =
7736 rillCellInfo->CellInfo.cdma.signalStrengthEvdo.ecio;
7737 cellInfoCdma->signalStrengthEvdo.signalNoiseRatio =
7738 rillCellInfo->CellInfo.cdma.signalStrengthEvdo.signalNoiseRatio;
7739 break;
7740 }
7741
7742 case RIL_CELL_INFO_TYPE_LTE: {
7743 records[i].lte.resize(1);
7744 CellInfoLte *cellInfoLte = &records[i].lte[0];
7745 cellInfoLte->cellIdentityLte.mcc =
7746 std::to_string(rillCellInfo->CellInfo.lte.cellIdentityLte.mcc);
7747 cellInfoLte->cellIdentityLte.mnc =
7748 std::to_string(rillCellInfo->CellInfo.lte.cellIdentityLte.mnc);
7749 cellInfoLte->cellIdentityLte.ci =
7750 rillCellInfo->CellInfo.lte.cellIdentityLte.ci;
7751 cellInfoLte->cellIdentityLte.pci =
7752 rillCellInfo->CellInfo.lte.cellIdentityLte.pci;
7753 cellInfoLte->cellIdentityLte.tac =
7754 rillCellInfo->CellInfo.lte.cellIdentityLte.tac;
7755 cellInfoLte->cellIdentityLte.earfcn =
7756 rillCellInfo->CellInfo.lte.cellIdentityLte.earfcn;
7757 cellInfoLte->signalStrengthLte.signalStrength =
7758 rillCellInfo->CellInfo.lte.signalStrengthLte.signalStrength;
7759 cellInfoLte->signalStrengthLte.rsrp =
7760 rillCellInfo->CellInfo.lte.signalStrengthLte.rsrp;
7761 cellInfoLte->signalStrengthLte.rsrq =
7762 rillCellInfo->CellInfo.lte.signalStrengthLte.rsrq;
7763 cellInfoLte->signalStrengthLte.rssnr =
7764 rillCellInfo->CellInfo.lte.signalStrengthLte.rssnr;
7765 cellInfoLte->signalStrengthLte.cqi =
7766 rillCellInfo->CellInfo.lte.signalStrengthLte.cqi;
7767 cellInfoLte->signalStrengthLte.timingAdvance =
7768 rillCellInfo->CellInfo.lte.signalStrengthLte.timingAdvance;
7769 break;
7770 }
7771
7772 case RIL_CELL_INFO_TYPE_TD_SCDMA: {
7773 records[i].tdscdma.resize(1);
7774 CellInfoTdscdma *cellInfoTdscdma = &records[i].tdscdma[0];
7775 cellInfoTdscdma->cellIdentityTdscdma.mcc =
7776 std::to_string(rillCellInfo->CellInfo.tdscdma.cellIdentityTdscdma.mcc);
7777 cellInfoTdscdma->cellIdentityTdscdma.mnc =
7778 std::to_string(rillCellInfo->CellInfo.tdscdma.cellIdentityTdscdma.mnc);
7779 cellInfoTdscdma->cellIdentityTdscdma.lac =
7780 rillCellInfo->CellInfo.tdscdma.cellIdentityTdscdma.lac;
7781 cellInfoTdscdma->cellIdentityTdscdma.cid =
7782 rillCellInfo->CellInfo.tdscdma.cellIdentityTdscdma.cid;
7783 cellInfoTdscdma->cellIdentityTdscdma.cpid =
7784 rillCellInfo->CellInfo.tdscdma.cellIdentityTdscdma.cpid;
7785 cellInfoTdscdma->signalStrengthTdscdma.rscp =
7786 rillCellInfo->CellInfo.tdscdma.signalStrengthTdscdma.rscp;
7787 break;
7788 }
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08007789 default: {
7790 break;
7791 }
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007792 }
7793 rillCellInfo += 1;
7794 }
7795}
7796
Amit Mahajan759786a2017-03-03 17:35:47 -08007797int radio::cellInfoListInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007798 int indicationType, int token, RIL_Errno e, void *response,
7799 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007800 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007801 if (response == NULL || responseLen % sizeof(RIL_CellInfo_v12) != 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007802 RLOGE("cellInfoListInd: invalid response");
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007803 return 0;
7804 }
7805
7806 hidl_vec<CellInfo> records;
7807 convertRilCellInfoListToHal(response, responseLen, records);
7808
Jayachandran C572f2f42017-03-25 14:30:13 -07007809#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007810 RLOGD("cellInfoListInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07007811#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007812 Return<void> retStatus = radioService[slotId]->mRadioIndication->cellInfoList(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007813 convertIntToRadioIndicationType(indicationType), records);
Amit Mahajan17249842017-01-19 15:05:45 -08007814 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007815 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007816 RLOGE("cellInfoListInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007817 }
7818
7819 return 0;
7820}
7821
Amit Mahajan759786a2017-03-03 17:35:47 -08007822int radio::imsNetworkStateChangedInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007823 int indicationType, int token, RIL_Errno e, void *response,
7824 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007825 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Jayachandran C572f2f42017-03-25 14:30:13 -07007826#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007827 RLOGD("imsNetworkStateChangedInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07007828#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007829 Return<void> retStatus = radioService[slotId]->mRadioIndication->imsNetworkStateChanged(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007830 convertIntToRadioIndicationType(indicationType));
Amit Mahajan17249842017-01-19 15:05:45 -08007831 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007832 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007833 RLOGE("imsNetworkStateChangedInd: radioService[%d]->mRadioIndication == NULL",
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007834 slotId);
7835 }
7836
7837 return 0;
7838}
7839
Amit Mahajan759786a2017-03-03 17:35:47 -08007840int radio::subscriptionStatusChangedInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007841 int indicationType, int token, RIL_Errno e, void *response,
7842 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007843 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007844 if (response == NULL || responseLen != sizeof(int)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007845 RLOGE("subscriptionStatusChangedInd: invalid response");
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007846 return 0;
7847 }
7848 bool activate = ((int32_t *) response)[0];
Jayachandran C572f2f42017-03-25 14:30:13 -07007849#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007850 RLOGD("subscriptionStatusChangedInd: activate %d", activate);
Jayachandran C572f2f42017-03-25 14:30:13 -07007851#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007852 Return<void> retStatus = radioService[slotId]->mRadioIndication->subscriptionStatusChanged(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007853 convertIntToRadioIndicationType(indicationType), activate);
Amit Mahajan17249842017-01-19 15:05:45 -08007854 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007855 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007856 RLOGE("subscriptionStatusChangedInd: radioService[%d]->mRadioIndication == NULL",
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007857 slotId);
7858 }
7859
7860 return 0;
7861}
7862
Amit Mahajan759786a2017-03-03 17:35:47 -08007863int radio::srvccStateNotifyInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007864 int indicationType, int token, RIL_Errno e, void *response,
7865 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007866 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007867 if (response == NULL || responseLen != sizeof(int)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007868 RLOGE("srvccStateNotifyInd: invalid response");
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007869 return 0;
7870 }
7871 int32_t state = ((int32_t *) response)[0];
Jayachandran C572f2f42017-03-25 14:30:13 -07007872#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007873 RLOGD("srvccStateNotifyInd: rat %d", state);
Jayachandran C572f2f42017-03-25 14:30:13 -07007874#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007875 Return<void> retStatus = radioService[slotId]->mRadioIndication->srvccStateNotify(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007876 convertIntToRadioIndicationType(indicationType), (SrvccState) state);
Amit Mahajan17249842017-01-19 15:05:45 -08007877 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007878 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007879 RLOGE("srvccStateNotifyInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007880 }
7881
7882 return 0;
7883}
7884
7885void convertRilHardwareConfigListToHal(void *response, size_t responseLen,
7886 hidl_vec<HardwareConfig>& records) {
7887 int num = responseLen / sizeof(RIL_HardwareConfig);
7888 records.resize(num);
7889
7890 RIL_HardwareConfig *rilHardwareConfig = (RIL_HardwareConfig *) response;
7891 for (int i = 0; i < num; i++) {
7892 records[i].type = (HardwareConfigType) rilHardwareConfig[i].type;
7893 records[i].uuid = convertCharPtrToHidlString(rilHardwareConfig[i].uuid);
7894 records[i].state = (HardwareConfigState) rilHardwareConfig[i].state;
7895 switch (rilHardwareConfig[i].type) {
7896 case RIL_HARDWARE_CONFIG_MODEM: {
7897 records[i].modem.resize(1);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08007898 records[i].sim.resize(0);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007899 HardwareConfigModem *hwConfigModem = &records[i].modem[0];
7900 hwConfigModem->rat = rilHardwareConfig[i].cfg.modem.rat;
7901 hwConfigModem->maxVoice = rilHardwareConfig[i].cfg.modem.maxVoice;
7902 hwConfigModem->maxData = rilHardwareConfig[i].cfg.modem.maxData;
7903 hwConfigModem->maxStandby = rilHardwareConfig[i].cfg.modem.maxStandby;
7904 break;
7905 }
7906
7907 case RIL_HARDWARE_CONFIG_SIM: {
7908 records[i].sim.resize(1);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08007909 records[i].modem.resize(0);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007910 records[i].sim[0].modemUuid =
7911 convertCharPtrToHidlString(rilHardwareConfig[i].cfg.sim.modemUuid);
7912 break;
7913 }
7914 }
7915 }
7916}
7917
Amit Mahajan759786a2017-03-03 17:35:47 -08007918int radio::hardwareConfigChangedInd(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_HardwareConfig) != 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007923 RLOGE("hardwareConfigChangedInd: invalid response");
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007924 return 0;
7925 }
7926
7927 hidl_vec<HardwareConfig> configs;
7928 convertRilHardwareConfigListToHal(response, responseLen, configs);
7929
Jayachandran C572f2f42017-03-25 14:30:13 -07007930#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007931 RLOGD("hardwareConfigChangedInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07007932#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007933 Return<void> retStatus = radioService[slotId]->mRadioIndication->hardwareConfigChanged(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007934 convertIntToRadioIndicationType(indicationType), configs);
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("hardwareConfigChangedInd: radioService[%d]->mRadioIndication == NULL",
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007938 slotId);
7939 }
7940
7941 return 0;
7942}
7943
7944void convertRilRadioCapabilityToHal(void *response, size_t responseLen, RadioCapability& rc) {
7945 RIL_RadioCapability *rilRadioCapability = (RIL_RadioCapability *) response;
7946 rc.session = rilRadioCapability->session;
7947 rc.phase = (android::hardware::radio::V1_0::RadioCapabilityPhase) rilRadioCapability->phase;
7948 rc.raf = rilRadioCapability->rat;
7949 rc.logicalModemUuid = convertCharPtrToHidlString(rilRadioCapability->logicalModemUuid);
7950 rc.status = (android::hardware::radio::V1_0::RadioCapabilityStatus) rilRadioCapability->status;
7951}
7952
Amit Mahajan759786a2017-03-03 17:35:47 -08007953int radio::radioCapabilityIndicationInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007954 int indicationType, int token, RIL_Errno e, void *response,
7955 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007956 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007957 if (response == NULL || responseLen != sizeof(RIL_RadioCapability)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007958 RLOGE("radioCapabilityIndicationInd: invalid response");
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007959 return 0;
7960 }
7961
Jack Yuf68e0da2017-02-07 14:53:09 -08007962 RadioCapability rc = {};
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007963 convertRilRadioCapabilityToHal(response, responseLen, rc);
7964
Jayachandran C572f2f42017-03-25 14:30:13 -07007965#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007966 RLOGD("radioCapabilityIndicationInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07007967#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007968 Return<void> retStatus = radioService[slotId]->mRadioIndication->radioCapabilityIndication(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007969 convertIntToRadioIndicationType(indicationType), rc);
Amit Mahajan17249842017-01-19 15:05:45 -08007970 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007971 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007972 RLOGE("radioCapabilityIndicationInd: radioService[%d]->mRadioIndication == NULL",
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007973 slotId);
7974 }
7975
7976 return 0;
7977}
7978
7979bool isServiceTypeCfQuery(RIL_SsServiceType serType, RIL_SsRequestType reqType) {
7980 if ((reqType == SS_INTERROGATION) &&
7981 (serType == SS_CFU ||
7982 serType == SS_CF_BUSY ||
7983 serType == SS_CF_NO_REPLY ||
7984 serType == SS_CF_NOT_REACHABLE ||
7985 serType == SS_CF_ALL ||
7986 serType == SS_CF_ALL_CONDITIONAL)) {
7987 return true;
7988 }
7989 return false;
7990}
7991
Amit Mahajan759786a2017-03-03 17:35:47 -08007992int radio::onSupplementaryServiceIndicationInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007993 int indicationType, int token, RIL_Errno e,
7994 void *response, size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007995 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007996 if (response == NULL || responseLen != sizeof(RIL_StkCcUnsolSsResponse)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007997 RLOGE("onSupplementaryServiceIndicationInd: invalid response");
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007998 return 0;
7999 }
8000
8001 RIL_StkCcUnsolSsResponse *rilSsResponse = (RIL_StkCcUnsolSsResponse *) response;
Jack Yuf68e0da2017-02-07 14:53:09 -08008002 StkCcUnsolSsResult ss = {};
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008003 ss.serviceType = (SsServiceType) rilSsResponse->serviceType;
8004 ss.requestType = (SsRequestType) rilSsResponse->requestType;
8005 ss.teleserviceType = (SsTeleserviceType) rilSsResponse->teleserviceType;
8006 ss.serviceClass = rilSsResponse->serviceClass;
8007 ss.result = (RadioError) rilSsResponse->result;
8008
8009 if (isServiceTypeCfQuery(rilSsResponse->serviceType, rilSsResponse->requestType)) {
Jayachandran C572f2f42017-03-25 14:30:13 -07008010#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08008011 RLOGD("onSupplementaryServiceIndicationInd CF type, num of Cf elements %d",
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008012 rilSsResponse->cfData.numValidIndexes);
Jayachandran C572f2f42017-03-25 14:30:13 -07008013#endif
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008014 if (rilSsResponse->cfData.numValidIndexes > NUM_SERVICE_CLASSES) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008015 RLOGE("onSupplementaryServiceIndicationInd numValidIndexes is greater than "
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008016 "max value %d, truncating it to max value", NUM_SERVICE_CLASSES);
8017 rilSsResponse->cfData.numValidIndexes = NUM_SERVICE_CLASSES;
8018 }
8019
8020 ss.cfData.resize(1);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08008021 ss.ssInfo.resize(0);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008022
8023 /* number of call info's */
8024 ss.cfData[0].cfInfo.resize(rilSsResponse->cfData.numValidIndexes);
8025
8026 for (int i = 0; i < rilSsResponse->cfData.numValidIndexes; i++) {
8027 RIL_CallForwardInfo cf = rilSsResponse->cfData.cfInfo[i];
8028 CallForwardInfo *cfInfo = &ss.cfData[0].cfInfo[i];
8029
8030 cfInfo->status = (CallForwardInfoStatus) cf.status;
8031 cfInfo->reason = cf.reason;
8032 cfInfo->serviceClass = cf.serviceClass;
8033 cfInfo->toa = cf.toa;
8034 cfInfo->number = convertCharPtrToHidlString(cf.number);
8035 cfInfo->timeSeconds = cf.timeSeconds;
Jayachandran C572f2f42017-03-25 14:30:13 -07008036#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08008037 RLOGD("onSupplementaryServiceIndicationInd: "
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008038 "Data: %d,reason=%d,cls=%d,toa=%d,num=%s,tout=%d],", cf.status,
8039 cf.reason, cf.serviceClass, cf.toa, (char*)cf.number, cf.timeSeconds);
Jayachandran C572f2f42017-03-25 14:30:13 -07008040#endif
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008041 }
8042 } else {
8043 ss.ssInfo.resize(1);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08008044 ss.cfData.resize(0);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008045
8046 /* each int */
8047 ss.ssInfo[0].ssInfo.resize(SS_INFO_MAX);
8048 for (int i = 0; i < SS_INFO_MAX; i++) {
Jayachandran C572f2f42017-03-25 14:30:13 -07008049#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08008050 RLOGD("onSupplementaryServiceIndicationInd: Data: %d",
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008051 rilSsResponse->ssInfo[i]);
Jayachandran C572f2f42017-03-25 14:30:13 -07008052#endif
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008053 ss.ssInfo[0].ssInfo[i] = rilSsResponse->ssInfo[i];
8054 }
8055 }
8056
Jayachandran C572f2f42017-03-25 14:30:13 -07008057#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08008058 RLOGD("onSupplementaryServiceIndicationInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07008059#endif
Amit Mahajan17249842017-01-19 15:05:45 -08008060 Return<void> retStatus = radioService[slotId]->mRadioIndication->
8061 onSupplementaryServiceIndication(convertIntToRadioIndicationType(indicationType),
8062 ss);
8063 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008064 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008065 RLOGE("onSupplementaryServiceIndicationInd: "
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008066 "radioService[%d]->mRadioIndication == NULL", slotId);
8067 }
8068
8069 return 0;
8070}
8071
Amit Mahajan759786a2017-03-03 17:35:47 -08008072int radio::stkCallControlAlphaNotifyInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008073 int indicationType, int token, RIL_Errno e, void *response,
8074 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08008075 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008076 if (response == NULL || responseLen == 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008077 RLOGE("stkCallControlAlphaNotifyInd: invalid response");
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008078 return 0;
8079 }
Jayachandran C572f2f42017-03-25 14:30:13 -07008080#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08008081 RLOGD("stkCallControlAlphaNotifyInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07008082#endif
Amit Mahajan17249842017-01-19 15:05:45 -08008083 Return<void> retStatus = radioService[slotId]->mRadioIndication->stkCallControlAlphaNotify(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008084 convertIntToRadioIndicationType(indicationType),
8085 convertCharPtrToHidlString((char *) response));
Amit Mahajan17249842017-01-19 15:05:45 -08008086 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008087 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008088 RLOGE("stkCallControlAlphaNotifyInd: radioService[%d]->mRadioIndication == NULL",
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008089 slotId);
8090 }
8091
8092 return 0;
8093}
8094
8095void convertRilLceDataInfoToHal(void *response, size_t responseLen, LceDataInfo& lce) {
8096 RIL_LceDataInfo *rilLceDataInfo = (RIL_LceDataInfo *)response;
8097 lce.lastHopCapacityKbps = rilLceDataInfo->last_hop_capacity_kbps;
8098 lce.confidenceLevel = rilLceDataInfo->confidence_level;
8099 lce.lceSuspended = rilLceDataInfo->lce_suspended;
8100}
8101
Amit Mahajan759786a2017-03-03 17:35:47 -08008102int radio::lceDataInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008103 int indicationType, int token, RIL_Errno e, void *response,
8104 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08008105 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008106 if (response == NULL || responseLen != sizeof(RIL_LceDataInfo)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008107 RLOGE("lceDataInd: invalid response");
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008108 return 0;
8109 }
8110
Jack Yuf68e0da2017-02-07 14:53:09 -08008111 LceDataInfo lce = {};
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008112 convertRilLceDataInfoToHal(response, responseLen, lce);
Jayachandran C572f2f42017-03-25 14:30:13 -07008113#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08008114 RLOGD("lceDataInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07008115#endif
Amit Mahajan17249842017-01-19 15:05:45 -08008116 Return<void> retStatus = radioService[slotId]->mRadioIndication->lceData(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008117 convertIntToRadioIndicationType(indicationType), lce);
Amit Mahajan17249842017-01-19 15:05:45 -08008118 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008119 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008120 RLOGE("lceDataInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008121 }
8122
8123 return 0;
8124}
8125
Amit Mahajan759786a2017-03-03 17:35:47 -08008126int radio::pcoDataInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008127 int indicationType, int token, RIL_Errno e, void *response,
8128 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08008129 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008130 if (response == NULL || responseLen != sizeof(RIL_PCO_Data)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008131 RLOGE("pcoDataInd: invalid response");
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008132 return 0;
8133 }
8134
Jack Yuf68e0da2017-02-07 14:53:09 -08008135 PcoDataInfo pco = {};
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008136 RIL_PCO_Data *rilPcoData = (RIL_PCO_Data *)response;
8137 pco.cid = rilPcoData->cid;
8138 pco.bearerProto = convertCharPtrToHidlString(rilPcoData->bearer_proto);
8139 pco.pcoId = rilPcoData->pco_id;
8140 pco.contents.setToExternal((uint8_t *) rilPcoData->contents, rilPcoData->contents_length);
8141
Jayachandran C572f2f42017-03-25 14:30:13 -07008142#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08008143 RLOGD("pcoDataInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07008144#endif
Amit Mahajan17249842017-01-19 15:05:45 -08008145 Return<void> retStatus = radioService[slotId]->mRadioIndication->pcoData(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008146 convertIntToRadioIndicationType(indicationType), pco);
Amit Mahajan17249842017-01-19 15:05:45 -08008147 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008148 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008149 RLOGE("pcoDataInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008150 }
8151
8152 return 0;
8153}
8154
Amit Mahajan759786a2017-03-03 17:35:47 -08008155int radio::modemResetInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008156 int indicationType, int token, RIL_Errno e, void *response,
8157 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08008158 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008159 if (response == NULL || responseLen == 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008160 RLOGE("modemResetInd: invalid response");
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008161 return 0;
8162 }
Jayachandran C572f2f42017-03-25 14:30:13 -07008163#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08008164 RLOGD("modemResetInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07008165#endif
Amit Mahajan17249842017-01-19 15:05:45 -08008166 Return<void> retStatus = radioService[slotId]->mRadioIndication->modemReset(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008167 convertIntToRadioIndicationType(indicationType),
8168 convertCharPtrToHidlString((char *) response));
Amit Mahajan17249842017-01-19 15:05:45 -08008169 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008170 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008171 RLOGE("modemResetInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008172 }
8173
8174 return 0;
8175}
8176
yinxu584379e2017-05-03 15:15:19 -07008177int radio::networkScanResultInd(int slotId,
8178 int indicationType, int token, RIL_Errno e, void *response,
yinxu8688abd2017-05-22 11:26:45 -07008179 size_t responseLen) {
yinxu584379e2017-05-03 15:15:19 -07008180#if VDBG
8181 RLOGD("networkScanResultInd");
8182#endif
yinxu8688abd2017-05-22 11:26:45 -07008183 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
8184 if (response == NULL || responseLen == 0) {
8185 RLOGE("networkScanResultInd: invalid response");
8186 return 0;
8187 }
8188 RLOGD("networkScanResultInd");
8189
8190#if VDBG
8191 RLOGD("networkScanResultInd");
8192#endif
8193
8194 Return<sp<::android::hardware::radio::V1_1::IRadioIndication>> ret =
8195 ::android::hardware::radio::V1_1::IRadioIndication::castFrom(
8196 radioService[slotId]->mRadioIndication);
8197 if (ret.isOk()) {
8198 RIL_NetworkScanResult *networkScanResult = (RIL_NetworkScanResult *) response;
8199
8200 ::android::hardware::radio::V1_1::NetworkScanResult result;
8201 result.status =
8202 (::android::hardware::radio::V1_1::ScanStatus) networkScanResult->status;
8203 result.error = (RadioError) e;
8204 convertRilCellInfoListToHal(
8205 networkScanResult->network_infos,
8206 networkScanResult->network_infos_length * sizeof(RIL_CellInfo_v12),
8207 result.networkInfos);
8208
8209 sp<::android::hardware::radio::V1_1::IRadioIndication> radioIndicationV1_1 = ret;
8210 Return<void> retStatus = radioIndicationV1_1->networkScanResult(
8211 convertIntToRadioIndicationType(indicationType), result);
8212 radioService[slotId]->checkReturnStatus(retStatus);
8213 } else {
8214 RLOGE("networkScanResultInd: ret.isOk() == false for radioService[%d]", slotId);
8215 }
8216 } else {
8217 RLOGE("networkScanResultInd: radioService[%d]->mRadioIndication == NULL", slotId);
8218 }
yinxu584379e2017-05-03 15:15:19 -07008219 return 0;
8220}
8221
pkanwarc61837e2017-03-17 12:49:34 -07008222int radio::carrierInfoForImsiEncryption(int slotId,
8223 int indicationType, int token, RIL_Errno e, void *response,
8224 size_t responseLen) {
8225 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
8226 if (response == NULL || responseLen == 0) {
8227 RLOGE("carrierInfoForImsiEncryption: invalid response");
8228 return 0;
8229 }
8230 RLOGD("carrierInfoForImsiEncryption");
8231 Return<sp<::android::hardware::radio::V1_1::IRadioIndication>> ret =
8232 ::android::hardware::radio::V1_1::IRadioIndication::castFrom(
8233 radioService[slotId]->mRadioIndication);
8234 if (ret.isOk()) {
8235 sp<::android::hardware::radio::V1_1::IRadioIndication> radioIndicationV1_1 = ret;
8236 Return<void> retStatus = radioIndicationV1_1->carrierInfoForImsiEncryption(
8237 convertIntToRadioIndicationType(indicationType));
8238 radioService[slotId]->checkReturnStatus(retStatus);
8239 } else {
8240 RLOGE("carrierInfoForImsiEncryptionResponse: ret.isOk() == false for radioService[%d]",
8241 slotId);
8242 }
8243 } else {
8244 RLOGE("carrierInfoForImsiEncryption: radioService[%d]->mRadioIndication == NULL", slotId);
8245 }
8246
8247 return 0;
8248}
8249
Amit Mahajan759786a2017-03-03 17:35:47 -08008250int radio::oemHookRawInd(int slotId,
Amit Mahajan439da362017-02-13 17:43:04 -08008251 int indicationType, int token, RIL_Errno e, void *response,
8252 size_t responseLen) {
8253 if (oemHookService[slotId] != NULL && oemHookService[slotId]->mOemHookIndication != NULL) {
8254 if (response == NULL || responseLen == 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008255 RLOGE("oemHookRawInd: invalid response");
Amit Mahajan439da362017-02-13 17:43:04 -08008256 return 0;
8257 }
8258
8259 hidl_vec<uint8_t> data;
8260 data.setToExternal((uint8_t *) response, responseLen);
Jayachandran C572f2f42017-03-25 14:30:13 -07008261#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08008262 RLOGD("oemHookRawInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07008263#endif
Amit Mahajan439da362017-02-13 17:43:04 -08008264 Return<void> retStatus = oemHookService[slotId]->mOemHookIndication->oemHookRaw(
8265 convertIntToRadioIndicationType(indicationType), data);
Amit Mahajand423d192017-03-16 17:04:01 -07008266 checkReturnStatus(slotId, retStatus, false);
Amit Mahajan439da362017-02-13 17:43:04 -08008267 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008268 RLOGE("oemHookRawInd: oemHookService[%d]->mOemHookIndication == NULL", slotId);
Amit Mahajan439da362017-02-13 17:43:04 -08008269 }
8270
8271 return 0;
8272}
8273
Amit Mahajancd77a5b2016-08-25 11:19:21 -07008274void radio::registerService(RIL_RadioFunctions *callbacks, CommandInfo *commands) {
8275 using namespace android::hardware;
8276 int simCount = 1;
Amit Mahajan439da362017-02-13 17:43:04 -08008277 const char *serviceNames[] = {
Amit Mahajan7955c432017-03-28 11:17:55 -07008278 android::RIL_getServiceName()
Amit Mahajancd77a5b2016-08-25 11:19:21 -07008279 #if (SIM_COUNT >= 2)
Amit Mahajan7955c432017-03-28 11:17:55 -07008280 , RIL2_SERVICE_NAME
Amit Mahajancd77a5b2016-08-25 11:19:21 -07008281 #if (SIM_COUNT >= 3)
Amit Mahajan7955c432017-03-28 11:17:55 -07008282 , RIL3_SERVICE_NAME
Amit Mahajancd77a5b2016-08-25 11:19:21 -07008283 #if (SIM_COUNT >= 4)
Amit Mahajan7955c432017-03-28 11:17:55 -07008284 , RIL4_SERVICE_NAME
Amit Mahajan439da362017-02-13 17:43:04 -08008285 #endif
8286 #endif
8287 #endif
8288 };
8289
Amit Mahajancd77a5b2016-08-25 11:19:21 -07008290 #if (SIM_COUNT >= 2)
8291 simCount = SIM_COUNT;
8292 #endif
8293
8294 configureRpcThreadpool(1, true /* callerWillJoin */);
8295 for (int i = 0; i < simCount; i++) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08008296 pthread_rwlock_t *radioServiceRwlockPtr = getRadioServiceRwlock(i);
8297 int ret = pthread_rwlock_wrlock(radioServiceRwlockPtr);
8298 assert(ret == 0);
8299
Amit Mahajancd77a5b2016-08-25 11:19:21 -07008300 radioService[i] = new RadioImpl;
Sanket Padawef220dc52017-01-02 23:46:00 -08008301 radioService[i]->mSlotId = i;
Amit Mahajan439da362017-02-13 17:43:04 -08008302 oemHookService[i] = new OemHookImpl;
8303 oemHookService[i]->mSlotId = i;
pkanwarc61837e2017-03-17 12:49:34 -07008304 RLOGD("registerService: starting android::hardware::radio::V1_1::IRadio %s",
8305 serviceNames[i]);
Amit Mahajancd77a5b2016-08-25 11:19:21 -07008306 android::status_t status = radioService[i]->registerAsService(serviceNames[i]);
Amit Mahajan7955c432017-03-28 11:17:55 -07008307 status = oemHookService[i]->registerAsService(serviceNames[i]);
Amit Mahajan932e08e2017-01-24 05:45:02 -08008308
8309 ret = pthread_rwlock_unlock(radioServiceRwlockPtr);
8310 assert(ret == 0);
Amit Mahajancd77a5b2016-08-25 11:19:21 -07008311 }
8312
Sanket Padawe378ccdd2017-01-24 14:11:12 -08008313 s_vendorFunctions = callbacks;
Amit Mahajancd77a5b2016-08-25 11:19:21 -07008314 s_commands = commands;
8315}
8316
8317void rilc_thread_pool() {
8318 joinRpcThreadpool();
Amit Mahajan932e08e2017-01-24 05:45:02 -08008319}
8320
8321pthread_rwlock_t * radio::getRadioServiceRwlock(int slotId) {
8322 pthread_rwlock_t *radioServiceRwlockPtr = &radioServiceRwlock;
8323
8324 #if (SIM_COUNT >= 2)
8325 if (slotId == 2) radioServiceRwlockPtr = &radioServiceRwlock2;
8326 #if (SIM_COUNT >= 3)
8327 if (slotId == 3) radioServiceRwlockPtr = &radioServiceRwlock3;
8328 #if (SIM_COUNT >= 4)
8329 if (slotId == 4) radioServiceRwlockPtr = &radioServiceRwlock4;
8330 #endif
8331 #endif
8332 #endif
8333
8334 return radioServiceRwlockPtr;
Sanket Padawe0de29d12017-02-10 13:19:47 -08008335}