blob: 0c7a2c0fccde3850535bf6e37e3463aba2059cb8 [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
Amit Mahajancd77a5b2016-08-25 11:19:21 -070019#include <android/hardware/radio/1.0/IRadio.h>
Amit Mahajan439da362017-02-13 17:43:04 -080020#include <android/hardware/radio/deprecated/1.0/IOemHook.h>
Amit Mahajancd77a5b2016-08-25 11:19:21 -070021
22#include <hwbinder/IPCThreadState.h>
23#include <hwbinder/ProcessState.h>
24#include <ril_service.h>
25#include <hidl/HidlTransportSupport.h>
Amit Mahajan5829a472016-12-28 17:28:07 -080026#include <utils/SystemClock.h>
Wei Wang100ac9b2017-02-03 14:18:07 -080027#include <inttypes.h>
Amit Mahajan5829a472016-12-28 17:28:07 -080028
29#define INVALID_HEX_CHAR 16
Amit Mahajancd77a5b2016-08-25 11:19:21 -070030
Jayachandran C572f2f42017-03-25 14:30:13 -070031// Enable verbose logging
32#define VDBG 0
33
Amit Mahajancd77a5b2016-08-25 11:19:21 -070034using namespace android::hardware::radio::V1_0;
Amit Mahajan439da362017-02-13 17:43:04 -080035using namespace android::hardware::radio::deprecated::V1_0;
Amit Mahajancd77a5b2016-08-25 11:19:21 -070036using ::android::hardware::configureRpcThreadpool;
37using ::android::hardware::joinRpcThreadpool;
38using ::android::hardware::Return;
Amit Mahajancd77a5b2016-08-25 11:19:21 -070039using ::android::hardware::hidl_string;
40using ::android::hardware::hidl_vec;
41using ::android::hardware::hidl_array;
42using ::android::hardware::Void;
43using android::CommandInfo;
44using android::RequestInfo;
45using android::requestToString;
46using android::sp;
47
Sanket Padawe378ccdd2017-01-24 14:11:12 -080048#define BOOL_TO_INT(x) (x ? 1 : 0)
49#define ATOI_NULL_HANDLED(x) (x ? atoi(x) : -1)
50#define ATOI_NULL_HANDLED_DEF(x, defaultVal) (x ? atoi(x) : defaultVal)
51
Amit Mahajan93f603c2017-05-15 16:41:44 -070052#if defined(ANDROID_MULTI_SIM)
53#define CALL_ONREQUEST(a, b, c, d, e) \
54 s_vendorFunctions->onRequest((a), (b), (c), (d), ((RIL_SOCKET_ID)(e)))
55#define CALL_ONSTATEREQUEST(a) s_vendorFunctions->onStateRequest((RIL_SOCKET_ID)(a))
56#else
57#define CALL_ONREQUEST(a, b, c, d, e) s_vendorFunctions->onRequest((a), (b), (c), (d))
58#define CALL_ONSTATEREQUEST(a) s_vendorFunctions->onStateRequest()
59#endif
60
Sanket Padawe378ccdd2017-01-24 14:11:12 -080061RIL_RadioFunctions *s_vendorFunctions = NULL;
Amit Mahajancd77a5b2016-08-25 11:19:21 -070062static CommandInfo *s_commands;
63
64struct RadioImpl;
Amit Mahajan439da362017-02-13 17:43:04 -080065struct OemHookImpl;
Amit Mahajancd77a5b2016-08-25 11:19:21 -070066
67#if (SIM_COUNT >= 2)
68sp<RadioImpl> radioService[SIM_COUNT];
Amit Mahajan439da362017-02-13 17:43:04 -080069sp<OemHookImpl> oemHookService[SIM_COUNT];
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[SIM_COUNT];
72volatile int32_t mCounterOemHook[SIM_COUNT];
Amit Mahajancd77a5b2016-08-25 11:19:21 -070073#else
74sp<RadioImpl> radioService[1];
Amit Mahajan439da362017-02-13 17:43:04 -080075sp<OemHookImpl> oemHookService[1];
76// counter used for synchronization. It is incremented every time response callbacks are updated.
Amit Mahajand423d192017-03-16 17:04:01 -070077volatile int32_t mCounterRadio[1];
78volatile int32_t mCounterOemHook[1];
Amit Mahajancd77a5b2016-08-25 11:19:21 -070079#endif
80
Amit Mahajan932e08e2017-01-24 05:45:02 -080081static pthread_rwlock_t radioServiceRwlock = PTHREAD_RWLOCK_INITIALIZER;
82
83#if (SIM_COUNT >= 2)
84static pthread_rwlock_t radioServiceRwlock2 = PTHREAD_RWLOCK_INITIALIZER;
85#if (SIM_COUNT >= 3)
86static pthread_rwlock_t radioServiceRwlock3 = PTHREAD_RWLOCK_INITIALIZER;
87#if (SIM_COUNT >= 4)
88static pthread_rwlock_t radioServiceRwlock4 = PTHREAD_RWLOCK_INITIALIZER;
89#endif
90#endif
91#endif
92
Amit Mahajan3df62912017-02-10 01:35:55 +000093void convertRilHardwareConfigListToHal(void *response, size_t responseLen,
94 hidl_vec<HardwareConfig>& records);
95
96void convertRilRadioCapabilityToHal(void *response, size_t responseLen, RadioCapability& rc);
97
98void convertRilLceDataInfoToHal(void *response, size_t responseLen, LceDataInfo& lce);
99
100void convertRilSignalStrengthToHal(void *response, size_t responseLen,
101 SignalStrength& signalStrength);
102
Adrian DC15627d92017-04-23 21:28:36 +0200103void convertRilDataCallToHal(RIL_Data_Call_Response_v6 *dcResponse,
104 SetupDataCallResult& dcResult);
105
106void convertRilDataCallToHal(RIL_Data_Call_Response_v9 *dcResponse,
107 SetupDataCallResult& dcResult);
108
Amit Mahajan3df62912017-02-10 01:35:55 +0000109void convertRilDataCallToHal(RIL_Data_Call_Response_v11 *dcResponse,
110 SetupDataCallResult& dcResult);
111
112void convertRilDataCallListToHal(void *response, size_t responseLen,
113 hidl_vec<SetupDataCallResult>& dcResultList);
114
115void convertRilCellInfoListToHal(void *response, size_t responseLen, hidl_vec<CellInfo>& records);
116
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700117struct RadioImpl : public IRadio {
Sanket Padawef220dc52017-01-02 23:46:00 -0800118 int32_t mSlotId;
119 sp<IRadioResponse> mRadioResponse;
120 sp<IRadioIndication> mRadioIndication;
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700121
122 Return<void> setResponseFunctions(
123 const ::android::sp<IRadioResponse>& radioResponse,
124 const ::android::sp<IRadioIndication>& radioIndication);
125
126 Return<void> getIccCardStatus(int32_t serial);
127
Sanket Padawef220dc52017-01-02 23:46:00 -0800128 Return<void> supplyIccPinForApp(int32_t serial, const hidl_string& pin,
129 const hidl_string& aid);
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700130
Sanket Padawef220dc52017-01-02 23:46:00 -0800131 Return<void> supplyIccPukForApp(int32_t serial, const hidl_string& puk,
132 const hidl_string& pin, const hidl_string& aid);
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700133
134 Return<void> supplyIccPin2ForApp(int32_t serial,
Sanket Padawef220dc52017-01-02 23:46:00 -0800135 const hidl_string& pin2,
136 const hidl_string& aid);
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700137
Sanket Padawef220dc52017-01-02 23:46:00 -0800138 Return<void> supplyIccPuk2ForApp(int32_t serial, const hidl_string& puk2,
139 const hidl_string& pin2, const hidl_string& aid);
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700140
Sanket Padawef220dc52017-01-02 23:46:00 -0800141 Return<void> changeIccPinForApp(int32_t serial, const hidl_string& oldPin,
142 const hidl_string& newPin, const hidl_string& aid);
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700143
Sanket Padawef220dc52017-01-02 23:46:00 -0800144 Return<void> changeIccPin2ForApp(int32_t serial, const hidl_string& oldPin2,
145 const hidl_string& newPin2, const hidl_string& aid);
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700146
Sanket Padawef220dc52017-01-02 23:46:00 -0800147 Return<void> supplyNetworkDepersonalization(int32_t serial, const hidl_string& netPin);
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700148
149 Return<void> getCurrentCalls(int32_t serial);
150
Sanket Padawef220dc52017-01-02 23:46:00 -0800151 Return<void> dial(int32_t serial, const Dial& dialInfo);
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700152
153 Return<void> getImsiForApp(int32_t serial,
154 const ::android::hardware::hidl_string& aid);
155
156 Return<void> hangup(int32_t serial, int32_t gsmIndex);
157
158 Return<void> hangupWaitingOrBackground(int32_t serial);
159
160 Return<void> hangupForegroundResumeBackground(int32_t serial);
161
162 Return<void> switchWaitingOrHoldingAndActive(int32_t serial);
163
164 Return<void> conference(int32_t serial);
165
166 Return<void> rejectCall(int32_t serial);
167
168 Return<void> getLastCallFailCause(int32_t serial);
169
170 Return<void> getSignalStrength(int32_t serial);
171
172 Return<void> getVoiceRegistrationState(int32_t serial);
173
174 Return<void> getDataRegistrationState(int32_t serial);
175
176 Return<void> getOperator(int32_t serial);
177
178 Return<void> setRadioPower(int32_t serial, bool on);
179
180 Return<void> sendDtmf(int32_t serial,
181 const ::android::hardware::hidl_string& s);
182
183 Return<void> sendSms(int32_t serial, const GsmSmsMessage& message);
184
185 Return<void> sendSMSExpectMore(int32_t serial, const GsmSmsMessage& message);
186
187 Return<void> setupDataCall(int32_t serial,
Jack Yu06181bb2017-01-10 12:10:41 -0800188 RadioTechnology radioTechnology,
189 const DataProfileInfo& profileInfo,
190 bool modemCognitive,
Jack Yuffc06452017-02-13 11:21:00 -0800191 bool roamingAllowed,
192 bool isRoaming);
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700193
194 Return<void> iccIOForApp(int32_t serial,
195 const IccIo& iccIo);
196
197 Return<void> sendUssd(int32_t serial,
198 const ::android::hardware::hidl_string& ussd);
199
200 Return<void> cancelPendingUssd(int32_t serial);
201
202 Return<void> getClir(int32_t serial);
203
204 Return<void> setClir(int32_t serial, int32_t status);
205
206 Return<void> getCallForwardStatus(int32_t serial,
207 const CallForwardInfo& callInfo);
208
209 Return<void> setCallForward(int32_t serial,
210 const CallForwardInfo& callInfo);
211
212 Return<void> getCallWaiting(int32_t serial, int32_t serviceClass);
213
214 Return<void> setCallWaiting(int32_t serial, bool enable, int32_t serviceClass);
215
216 Return<void> acknowledgeLastIncomingGsmSms(int32_t serial,
217 bool success, SmsAcknowledgeFailCause cause);
218
219 Return<void> acceptCall(int32_t serial);
220
221 Return<void> deactivateDataCall(int32_t serial,
222 int32_t cid, bool reasonRadioShutDown);
223
224 Return<void> getFacilityLockForApp(int32_t serial,
225 const ::android::hardware::hidl_string& facility,
226 const ::android::hardware::hidl_string& password,
227 int32_t serviceClass,
228 const ::android::hardware::hidl_string& appId);
229
230 Return<void> setFacilityLockForApp(int32_t serial,
231 const ::android::hardware::hidl_string& facility,
232 bool lockState,
233 const ::android::hardware::hidl_string& password,
234 int32_t serviceClass,
235 const ::android::hardware::hidl_string& appId);
236
237 Return<void> setBarringPassword(int32_t serial,
238 const ::android::hardware::hidl_string& facility,
239 const ::android::hardware::hidl_string& oldPassword,
240 const ::android::hardware::hidl_string& newPassword);
241
242 Return<void> getNetworkSelectionMode(int32_t serial);
243
244 Return<void> setNetworkSelectionModeAutomatic(int32_t serial);
245
246 Return<void> setNetworkSelectionModeManual(int32_t serial,
247 const ::android::hardware::hidl_string& operatorNumeric);
248
249 Return<void> getAvailableNetworks(int32_t serial);
250
251 Return<void> startDtmf(int32_t serial,
252 const ::android::hardware::hidl_string& s);
253
254 Return<void> stopDtmf(int32_t serial);
255
256 Return<void> getBasebandVersion(int32_t serial);
257
258 Return<void> separateConnection(int32_t serial, int32_t gsmIndex);
259
260 Return<void> setMute(int32_t serial, bool enable);
261
262 Return<void> getMute(int32_t serial);
263
264 Return<void> getClip(int32_t serial);
265
266 Return<void> getDataCallList(int32_t serial);
267
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700268 Return<void> setSuppServiceNotifications(int32_t serial, bool enable);
269
270 Return<void> writeSmsToSim(int32_t serial,
271 const SmsWriteArgs& smsWriteArgs);
272
273 Return<void> deleteSmsOnSim(int32_t serial, int32_t index);
274
275 Return<void> setBandMode(int32_t serial, RadioBandMode mode);
276
277 Return<void> getAvailableBandModes(int32_t serial);
278
279 Return<void> sendEnvelope(int32_t serial,
280 const ::android::hardware::hidl_string& command);
281
282 Return<void> sendTerminalResponseToSim(int32_t serial,
283 const ::android::hardware::hidl_string& commandResponse);
284
285 Return<void> handleStkCallSetupRequestFromSim(int32_t serial, bool accept);
286
287 Return<void> explicitCallTransfer(int32_t serial);
288
289 Return<void> setPreferredNetworkType(int32_t serial, PreferredNetworkType nwType);
290
291 Return<void> getPreferredNetworkType(int32_t serial);
292
293 Return<void> getNeighboringCids(int32_t serial);
294
295 Return<void> setLocationUpdates(int32_t serial, bool enable);
296
297 Return<void> setCdmaSubscriptionSource(int32_t serial,
298 CdmaSubscriptionSource cdmaSub);
299
300 Return<void> setCdmaRoamingPreference(int32_t serial, CdmaRoamingType type);
301
302 Return<void> getCdmaRoamingPreference(int32_t serial);
303
304 Return<void> setTTYMode(int32_t serial, TtyMode mode);
305
306 Return<void> getTTYMode(int32_t serial);
307
308 Return<void> setPreferredVoicePrivacy(int32_t serial, bool enable);
309
310 Return<void> getPreferredVoicePrivacy(int32_t serial);
311
312 Return<void> sendCDMAFeatureCode(int32_t serial,
313 const ::android::hardware::hidl_string& featureCode);
314
315 Return<void> sendBurstDtmf(int32_t serial,
316 const ::android::hardware::hidl_string& dtmf,
317 int32_t on,
318 int32_t off);
319
320 Return<void> sendCdmaSms(int32_t serial, const CdmaSmsMessage& sms);
321
322 Return<void> acknowledgeLastIncomingCdmaSms(int32_t serial,
323 const CdmaSmsAck& smsAck);
324
325 Return<void> getGsmBroadcastConfig(int32_t serial);
326
327 Return<void> setGsmBroadcastConfig(int32_t serial,
328 const hidl_vec<GsmBroadcastSmsConfigInfo>& configInfo);
329
330 Return<void> setGsmBroadcastActivation(int32_t serial, bool activate);
331
332 Return<void> getCdmaBroadcastConfig(int32_t serial);
333
334 Return<void> setCdmaBroadcastConfig(int32_t serial,
335 const hidl_vec<CdmaBroadcastSmsConfigInfo>& configInfo);
336
337 Return<void> setCdmaBroadcastActivation(int32_t serial, bool activate);
338
339 Return<void> getCDMASubscription(int32_t serial);
340
341 Return<void> writeSmsToRuim(int32_t serial, const CdmaSmsWriteArgs& cdmaSms);
342
343 Return<void> deleteSmsOnRuim(int32_t serial, int32_t index);
344
345 Return<void> getDeviceIdentity(int32_t serial);
346
347 Return<void> exitEmergencyCallbackMode(int32_t serial);
348
349 Return<void> getSmscAddress(int32_t serial);
350
351 Return<void> setSmscAddress(int32_t serial,
352 const ::android::hardware::hidl_string& smsc);
353
354 Return<void> reportSmsMemoryStatus(int32_t serial, bool available);
355
356 Return<void> reportStkServiceIsRunning(int32_t serial);
357
358 Return<void> getCdmaSubscriptionSource(int32_t serial);
359
360 Return<void> requestIsimAuthentication(int32_t serial,
361 const ::android::hardware::hidl_string& challenge);
362
363 Return<void> acknowledgeIncomingGsmSmsWithPdu(int32_t serial,
364 bool success,
365 const ::android::hardware::hidl_string& ackPdu);
366
367 Return<void> sendEnvelopeWithStatus(int32_t serial,
368 const ::android::hardware::hidl_string& contents);
369
370 Return<void> getVoiceRadioTechnology(int32_t serial);
371
372 Return<void> getCellInfoList(int32_t serial);
373
374 Return<void> setCellInfoListRate(int32_t serial, int32_t rate);
375
Jack Yu06181bb2017-01-10 12:10:41 -0800376 Return<void> setInitialAttachApn(int32_t serial, const DataProfileInfo& dataProfileInfo,
Jack Yuffc06452017-02-13 11:21:00 -0800377 bool modemCognitive, bool isRoaming);
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700378
379 Return<void> getImsRegistrationState(int32_t serial);
380
381 Return<void> sendImsSms(int32_t serial, const ImsSmsMessage& message);
382
383 Return<void> iccTransmitApduBasicChannel(int32_t serial, const SimApdu& message);
384
385 Return<void> iccOpenLogicalChannel(int32_t serial,
Wileen Chiud6222e02015-11-23 14:25:22 -0800386 const ::android::hardware::hidl_string& aid, int32_t p2);
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700387
388 Return<void> iccCloseLogicalChannel(int32_t serial, int32_t channelId);
389
390 Return<void> iccTransmitApduLogicalChannel(int32_t serial, const SimApdu& message);
391
392 Return<void> nvReadItem(int32_t serial, NvItem itemId);
393
394 Return<void> nvWriteItem(int32_t serial, const NvWriteItem& item);
395
396 Return<void> nvWriteCdmaPrl(int32_t serial,
397 const ::android::hardware::hidl_vec<uint8_t>& prl);
398
399 Return<void> nvResetConfig(int32_t serial, ResetNvType resetType);
400
401 Return<void> setUiccSubscription(int32_t serial, const SelectUiccSub& uiccSub);
402
403 Return<void> setDataAllowed(int32_t serial, bool allow);
404
405 Return<void> getHardwareConfig(int32_t serial);
406
407 Return<void> requestIccSimAuthentication(int32_t serial,
408 int32_t authContext,
409 const ::android::hardware::hidl_string& authData,
410 const ::android::hardware::hidl_string& aid);
411
412 Return<void> setDataProfile(int32_t serial,
Jack Yuffc06452017-02-13 11:21:00 -0800413 const ::android::hardware::hidl_vec<DataProfileInfo>& profiles, bool isRoaming);
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700414
415 Return<void> requestShutdown(int32_t serial);
416
417 Return<void> getRadioCapability(int32_t serial);
418
419 Return<void> setRadioCapability(int32_t serial, const RadioCapability& rc);
420
421 Return<void> startLceService(int32_t serial, int32_t reportInterval, bool pullMode);
422
423 Return<void> stopLceService(int32_t serial);
424
425 Return<void> pullLceData(int32_t serial);
426
427 Return<void> getModemActivityInfo(int32_t serial);
428
429 Return<void> setAllowedCarriers(int32_t serial,
430 bool allAllowed,
431 const CarrierRestrictions& carriers);
432
433 Return<void> getAllowedCarriers(int32_t serial);
434
Jack Yu06181bb2017-01-10 12:10:41 -0800435 Return<void> sendDeviceState(int32_t serial, DeviceStateType deviceStateType, bool state);
436
437 Return<void> setIndicationFilter(int32_t serial, int32_t indicationFilter);
438
Wileen Chiu718c0bf2017-01-04 11:37:19 -0800439 Return<void> setSimCardPower(int32_t serial, bool powerUp);
440
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700441 Return<void> responseAcknowledgement();
Amit Mahajan17249842017-01-19 15:05:45 -0800442
443 void checkReturnStatus(Return<void>& ret);
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700444};
445
Amit Mahajan439da362017-02-13 17:43:04 -0800446struct OemHookImpl : public IOemHook {
447 int32_t mSlotId;
448 sp<IOemHookResponse> mOemHookResponse;
449 sp<IOemHookIndication> mOemHookIndication;
450
451 Return<void> setResponseFunctions(
452 const ::android::sp<IOemHookResponse>& oemHookResponse,
453 const ::android::sp<IOemHookIndication>& oemHookIndication);
454
455 Return<void> sendRequestRaw(int32_t serial,
456 const ::android::hardware::hidl_vec<uint8_t>& data);
457
458 Return<void> sendRequestStrings(int32_t serial,
459 const ::android::hardware::hidl_vec<::android::hardware::hidl_string>& data);
460};
461
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800462void memsetAndFreeStrings(int numPointers, ...) {
463 va_list ap;
464 va_start(ap, numPointers);
465 for (int i = 0; i < numPointers; i++) {
466 char *ptr = va_arg(ap, char *);
467 if (ptr) {
468#ifdef MEMSET_FREED
Jack Yuffc06452017-02-13 11:21:00 -0800469 // TODO: Should pass in the maximum length of the string
470 memsetString(ptr);
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800471#endif
472 free(ptr);
473 }
474 }
475 va_end(ap);
476}
477
Jack Yuffc06452017-02-13 11:21:00 -0800478void sendErrorResponse(RequestInfo *pRI, RIL_Errno err) {
Amit Mahajan759786a2017-03-03 17:35:47 -0800479 pRI->pCI->responseFunction((int) pRI->socket_id,
Jack Yuffc06452017-02-13 11:21:00 -0800480 (int) RadioResponseType::SOLICITED, pRI->token, err, NULL, 0);
481}
482
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800483/**
Jack Yuf68e0da2017-02-07 14:53:09 -0800484 * Copies over src to dest. If memory allocation fails, responseFunction() is called for the
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800485 * request with error RIL_E_NO_MEMORY.
486 * Returns true on success, and false on failure.
487 */
Jack Yuf68e0da2017-02-07 14:53:09 -0800488bool copyHidlStringToRil(char **dest, const hidl_string &src, RequestInfo *pRI) {
489 size_t len = src.size();
490 if (len == 0) {
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800491 *dest = NULL;
492 return true;
493 }
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800494 *dest = (char *) calloc(len + 1, sizeof(char));
495 if (*dest == NULL) {
496 RLOGE("Memory allocation failed for request %s", requestToString(pRI->pCI->requestNumber));
Jack Yuffc06452017-02-13 11:21:00 -0800497 sendErrorResponse(pRI, RIL_E_NO_MEMORY);
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800498 return false;
499 }
Scott Randolph8a7c3b82017-04-03 14:06:40 -0700500 strncpy(*dest, src.c_str(), len + 1);
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800501 return true;
502}
503
504hidl_string convertCharPtrToHidlString(const char *ptr) {
505 hidl_string ret;
506 if (ptr != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -0800507 // TODO: replace this with strnlen
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800508 ret.setToExternal(ptr, strlen(ptr));
509 }
510 return ret;
511}
512
513bool dispatchVoid(int serial, int slotId, int request) {
514 RequestInfo *pRI = android::addRequestToList(serial, slotId, request);
515 if (pRI == NULL) {
516 return false;
517 }
Amit Mahajan93f603c2017-05-15 16:41:44 -0700518 CALL_ONREQUEST(request, NULL, 0, pRI, slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800519 return true;
520}
521
522bool dispatchString(int serial, int slotId, int request, const char * str) {
523 RequestInfo *pRI = android::addRequestToList(serial, slotId, request);
524 if (pRI == NULL) {
525 return false;
526 }
527
528 char *pString;
529 if (!copyHidlStringToRil(&pString, str, pRI)) {
530 return false;
531 }
532
Amit Mahajan93f603c2017-05-15 16:41:44 -0700533 CALL_ONREQUEST(request, pString, sizeof(char *), pRI, slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800534
535 memsetAndFreeStrings(1, pString);
536 return true;
537}
538
539bool dispatchStrings(int serial, int slotId, int request, int countStrings, ...) {
540 RequestInfo *pRI = android::addRequestToList(serial, slotId, request);
541 if (pRI == NULL) {
542 return false;
543 }
544
Sanket Padawef220dc52017-01-02 23:46:00 -0800545 char **pStrings;
Sanket Padawef220dc52017-01-02 23:46:00 -0800546 pStrings = (char **)calloc(countStrings, sizeof(char *));
547 if (pStrings == NULL) {
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800548 RLOGE("Memory allocation failed for request %s", requestToString(request));
Jack Yuffc06452017-02-13 11:21:00 -0800549 sendErrorResponse(pRI, RIL_E_NO_MEMORY);
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800550 return false;
Sanket Padawef220dc52017-01-02 23:46:00 -0800551 }
552 va_list ap;
553 va_start(ap, countStrings);
554 for (int i = 0; i < countStrings; i++) {
555 const char* str = va_arg(ap, const char *);
Jack Yu8b489142017-04-13 20:55:03 -0700556 if (!copyHidlStringToRil(&pStrings[i], hidl_string(str), pRI)) {
Sanket Padawef220dc52017-01-02 23:46:00 -0800557 va_end(ap);
Sanket Padawef220dc52017-01-02 23:46:00 -0800558 for (int j = 0; j < i; j++) {
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800559 memsetAndFreeStrings(1, pStrings[j]);
Sanket Padawef220dc52017-01-02 23:46:00 -0800560 }
561 free(pStrings);
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800562 return false;
Sanket Padawef220dc52017-01-02 23:46:00 -0800563 }
Sanket Padawef220dc52017-01-02 23:46:00 -0800564 }
565 va_end(ap);
566
Amit Mahajan93f603c2017-05-15 16:41:44 -0700567 CALL_ONREQUEST(request, pStrings, countStrings * sizeof(char *), pRI, slotId);
Sanket Padawef220dc52017-01-02 23:46:00 -0800568
569 if (pStrings != NULL) {
570 for (int i = 0 ; i < countStrings ; i++) {
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800571 memsetAndFreeStrings(1, pStrings[i]);
Sanket Padawef220dc52017-01-02 23:46:00 -0800572 }
573
574#ifdef MEMSET_FREED
575 memset(pStrings, 0, countStrings * sizeof(char *));
576#endif
577 free(pStrings);
578 }
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800579 return true;
580}
581
582bool dispatchStrings(int serial, int slotId, int request, const hidl_vec<hidl_string>& data) {
583 RequestInfo *pRI = android::addRequestToList(serial, slotId, request);
584 if (pRI == NULL) {
585 return false;
586 }
587
588 int countStrings = data.size();
589 char **pStrings;
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800590 pStrings = (char **)calloc(countStrings, sizeof(char *));
591 if (pStrings == NULL) {
592 RLOGE("Memory allocation failed for request %s", requestToString(request));
Jack Yuffc06452017-02-13 11:21:00 -0800593 sendErrorResponse(pRI, RIL_E_NO_MEMORY);
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800594 return false;
595 }
596
597 for (int i = 0; i < countStrings; i++) {
Jack Yuf68e0da2017-02-07 14:53:09 -0800598 if (!copyHidlStringToRil(&pStrings[i], data[i], pRI)) {
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800599 for (int j = 0; j < i; j++) {
600 memsetAndFreeStrings(1, pStrings[j]);
601 }
602 free(pStrings);
603 return false;
604 }
605 }
606
Amit Mahajan93f603c2017-05-15 16:41:44 -0700607 CALL_ONREQUEST(request, pStrings, countStrings * sizeof(char *), pRI, slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800608
609 if (pStrings != NULL) {
610 for (int i = 0 ; i < countStrings ; i++) {
611 memsetAndFreeStrings(1, pStrings[i]);
612 }
613
614#ifdef MEMSET_FREED
615 memset(pStrings, 0, countStrings * sizeof(char *));
616#endif
617 free(pStrings);
618 }
619 return true;
620}
621
622bool dispatchInts(int serial, int slotId, int request, int countInts, ...) {
623 RequestInfo *pRI = android::addRequestToList(serial, slotId, request);
624 if (pRI == NULL) {
625 return false;
626 }
627
Jack Yuffc06452017-02-13 11:21:00 -0800628 int *pInts = (int *)calloc(countInts, sizeof(int));
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800629
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800630 if (pInts == NULL) {
631 RLOGE("Memory allocation failed for request %s", requestToString(request));
Jack Yuffc06452017-02-13 11:21:00 -0800632 sendErrorResponse(pRI, RIL_E_NO_MEMORY);
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800633 return false;
634 }
635 va_list ap;
636 va_start(ap, countInts);
637 for (int i = 0; i < countInts; i++) {
638 pInts[i] = va_arg(ap, int);
639 }
640 va_end(ap);
641
Amit Mahajan93f603c2017-05-15 16:41:44 -0700642 CALL_ONREQUEST(request, pInts, countInts * sizeof(int), pRI, slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800643
644 if (pInts != NULL) {
645#ifdef MEMSET_FREED
646 memset(pInts, 0, countInts * sizeof(int));
647#endif
648 free(pInts);
649 }
650 return true;
651}
652
653bool dispatchCallForwardStatus(int serial, int slotId, int request,
654 const CallForwardInfo& callInfo) {
655 RequestInfo *pRI = android::addRequestToList(serial, slotId, request);
656 if (pRI == NULL) {
657 return false;
658 }
659
660 RIL_CallForwardInfo cf;
661 cf.status = (int) callInfo.status;
662 cf.reason = callInfo.reason;
663 cf.serviceClass = callInfo.serviceClass;
664 cf.toa = callInfo.toa;
665 cf.timeSeconds = callInfo.timeSeconds;
666
667 if (!copyHidlStringToRil(&cf.number, callInfo.number, pRI)) {
668 return false;
669 }
670
Amit Mahajan93f603c2017-05-15 16:41:44 -0700671 CALL_ONREQUEST(request, &cf, sizeof(cf), pRI, slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800672
673 memsetAndFreeStrings(1, cf.number);
674
675 return true;
676}
677
678bool dispatchRaw(int serial, int slotId, int request, const hidl_vec<uint8_t>& rawBytes) {
679 RequestInfo *pRI = android::addRequestToList(serial, slotId, request);
680 if (pRI == NULL) {
681 return false;
682 }
683
684 const uint8_t *uData = rawBytes.data();
685
Amit Mahajan93f603c2017-05-15 16:41:44 -0700686 CALL_ONREQUEST(request, (void *) uData, rawBytes.size(), pRI, slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800687
688 return true;
689}
690
691bool dispatchIccApdu(int serial, int slotId, int request, const SimApdu& message) {
692 RequestInfo *pRI = android::addRequestToList(serial, slotId, request);
693 if (pRI == NULL) {
694 return false;
695 }
696
Jack Yuc22b3de2017-04-14 00:08:06 -0700697 RIL_SIM_APDU apdu = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800698
699 apdu.sessionid = message.sessionId;
700 apdu.cla = message.cla;
701 apdu.instruction = message.instruction;
702 apdu.p1 = message.p1;
703 apdu.p2 = message.p2;
704 apdu.p3 = message.p3;
705
706 if (!copyHidlStringToRil(&apdu.data, message.data, pRI)) {
707 return false;
708 }
709
Amit Mahajan93f603c2017-05-15 16:41:44 -0700710 CALL_ONREQUEST(request, &apdu, sizeof(apdu), pRI, slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800711
712 memsetAndFreeStrings(1, apdu.data);
713
714 return true;
Sanket Padawef220dc52017-01-02 23:46:00 -0800715}
716
Amit Mahajand423d192017-03-16 17:04:01 -0700717void checkReturnStatus(int32_t slotId, Return<void>& ret, bool isRadioService) {
Amit Mahajan17249842017-01-19 15:05:45 -0800718 if (ret.isOk() == false) {
Amit Mahajan439da362017-02-13 17:43:04 -0800719 RLOGE("checkReturnStatus: unable to call response/indication callback");
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800720 // Remote process hosting the callbacks must be dead. Reset the callback objects;
Amit Mahajan17249842017-01-19 15:05:45 -0800721 // there's no other recovery to be done here. When the client process is back up, it will
722 // call setResponseFunctions()
Amit Mahajan932e08e2017-01-24 05:45:02 -0800723
724 // Caller should already hold rdlock, release that first
725 // note the current counter to avoid overwriting updates made by another thread before
726 // write lock is acquired.
Amit Mahajand423d192017-03-16 17:04:01 -0700727 int counter = isRadioService ? mCounterRadio[slotId] : mCounterOemHook[slotId];
Amit Mahajan439da362017-02-13 17:43:04 -0800728 pthread_rwlock_t *radioServiceRwlockPtr = radio::getRadioServiceRwlock(slotId);
Amit Mahajan932e08e2017-01-24 05:45:02 -0800729 int ret = pthread_rwlock_unlock(radioServiceRwlockPtr);
730 assert(ret == 0);
731
732 // acquire wrlock
733 ret = pthread_rwlock_wrlock(radioServiceRwlockPtr);
734 assert(ret == 0);
735
736 // make sure the counter value has not changed
Amit Mahajand423d192017-03-16 17:04:01 -0700737 if (counter == (isRadioService ? mCounterRadio[slotId] : mCounterOemHook[slotId])) {
738 if (isRadioService) {
739 radioService[slotId]->mRadioResponse = NULL;
740 radioService[slotId]->mRadioIndication = NULL;
741 } else {
742 oemHookService[slotId]->mOemHookResponse = NULL;
743 oemHookService[slotId]->mOemHookIndication = NULL;
744 }
745 isRadioService ? mCounterRadio[slotId]++ : mCounterOemHook[slotId]++;
Amit Mahajan932e08e2017-01-24 05:45:02 -0800746 } else {
Amit Mahajan439da362017-02-13 17:43:04 -0800747 RLOGE("checkReturnStatus: not resetting responseFunctions as they likely "
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800748 "got updated on another thread");
Amit Mahajan932e08e2017-01-24 05:45:02 -0800749 }
750
751 // release wrlock
752 ret = pthread_rwlock_unlock(radioServiceRwlockPtr);
753 assert(ret == 0);
754
755 // Reacquire rdlock
756 ret = pthread_rwlock_rdlock(radioServiceRwlockPtr);
757 assert(ret == 0);
Amit Mahajan17249842017-01-19 15:05:45 -0800758 }
759}
760
Amit Mahajan439da362017-02-13 17:43:04 -0800761void RadioImpl::checkReturnStatus(Return<void>& ret) {
Amit Mahajand423d192017-03-16 17:04:01 -0700762 ::checkReturnStatus(mSlotId, ret, true);
Amit Mahajan439da362017-02-13 17:43:04 -0800763}
764
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700765Return<void> RadioImpl::setResponseFunctions(
766 const ::android::sp<IRadioResponse>& radioResponseParam,
767 const ::android::sp<IRadioIndication>& radioIndicationParam) {
Amit Mahajan111ddca2017-03-03 12:05:13 -0800768 RLOGD("setResponseFunctions");
Amit Mahajan932e08e2017-01-24 05:45:02 -0800769
770 pthread_rwlock_t *radioServiceRwlockPtr = radio::getRadioServiceRwlock(mSlotId);
771 int ret = pthread_rwlock_wrlock(radioServiceRwlockPtr);
772 assert(ret == 0);
773
Sanket Padawef220dc52017-01-02 23:46:00 -0800774 mRadioResponse = radioResponseParam;
775 mRadioIndication = radioIndicationParam;
Amit Mahajand423d192017-03-16 17:04:01 -0700776 mCounterRadio[mSlotId]++;
Amit Mahajan932e08e2017-01-24 05:45:02 -0800777
778 ret = pthread_rwlock_unlock(radioServiceRwlockPtr);
779 assert(ret == 0);
780
Amit Mahajan60482fd2017-03-14 16:39:27 -0700781 // client is connected. Send initial indications.
782 android::onNewCommandConnect((RIL_SOCKET_ID) mSlotId);
783
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800784 return Void();
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700785}
786
787Return<void> RadioImpl::getIccCardStatus(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -0700788#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -0800789 RLOGD("getIccCardStatus: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -0700790#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800791 dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_SIM_STATUS);
792 return Void();
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700793}
794
Sanket Padawef220dc52017-01-02 23:46:00 -0800795Return<void> RadioImpl::supplyIccPinForApp(int32_t serial, const hidl_string& pin,
796 const hidl_string& aid) {
Jayachandran C572f2f42017-03-25 14:30:13 -0700797#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -0800798 RLOGD("supplyIccPinForApp: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -0700799#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800800 dispatchStrings(serial, mSlotId, RIL_REQUEST_ENTER_SIM_PIN,
Scott Randolph8a7c3b82017-04-03 14:06:40 -0700801 2, pin.c_str(), aid.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800802 return Void();
Sanket Padawef220dc52017-01-02 23:46:00 -0800803}
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700804
Sanket Padawef220dc52017-01-02 23:46:00 -0800805Return<void> RadioImpl::supplyIccPukForApp(int32_t serial, const hidl_string& puk,
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800806 const hidl_string& pin, const hidl_string& aid) {
Jayachandran C572f2f42017-03-25 14:30:13 -0700807#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -0800808 RLOGD("supplyIccPukForApp: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -0700809#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800810 dispatchStrings(serial, mSlotId, RIL_REQUEST_ENTER_SIM_PUK,
Scott Randolph8a7c3b82017-04-03 14:06:40 -0700811 3, puk.c_str(), pin.c_str(), aid.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800812 return Void();
Sanket Padawef220dc52017-01-02 23:46:00 -0800813}
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700814
Sanket Padawef220dc52017-01-02 23:46:00 -0800815Return<void> RadioImpl::supplyIccPin2ForApp(int32_t serial, const hidl_string& pin2,
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800816 const hidl_string& aid) {
Jayachandran C572f2f42017-03-25 14:30:13 -0700817#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -0800818 RLOGD("supplyIccPin2ForApp: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -0700819#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800820 dispatchStrings(serial, mSlotId, RIL_REQUEST_ENTER_SIM_PIN2,
Scott Randolph8a7c3b82017-04-03 14:06:40 -0700821 2, pin2.c_str(), aid.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800822 return Void();
Sanket Padawef220dc52017-01-02 23:46:00 -0800823}
824
825Return<void> RadioImpl::supplyIccPuk2ForApp(int32_t serial, const hidl_string& puk2,
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800826 const hidl_string& pin2, const hidl_string& aid) {
Jayachandran C572f2f42017-03-25 14:30:13 -0700827#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -0800828 RLOGD("supplyIccPuk2ForApp: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -0700829#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800830 dispatchStrings(serial, mSlotId, RIL_REQUEST_ENTER_SIM_PUK2,
Scott Randolph8a7c3b82017-04-03 14:06:40 -0700831 3, puk2.c_str(), pin2.c_str(), aid.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800832 return Void();
Sanket Padawef220dc52017-01-02 23:46:00 -0800833}
834
835Return<void> RadioImpl::changeIccPinForApp(int32_t serial, const hidl_string& oldPin,
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800836 const hidl_string& newPin, const hidl_string& aid) {
Jayachandran C572f2f42017-03-25 14:30:13 -0700837#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -0800838 RLOGD("changeIccPinForApp: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -0700839#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800840 dispatchStrings(serial, mSlotId, RIL_REQUEST_CHANGE_SIM_PIN,
Scott Randolph8a7c3b82017-04-03 14:06:40 -0700841 3, oldPin.c_str(), newPin.c_str(), aid.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800842 return Void();
Sanket Padawef220dc52017-01-02 23:46:00 -0800843}
844
845Return<void> RadioImpl::changeIccPin2ForApp(int32_t serial, const hidl_string& oldPin2,
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800846 const hidl_string& newPin2, const hidl_string& aid) {
Jayachandran C572f2f42017-03-25 14:30:13 -0700847#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -0800848 RLOGD("changeIccPin2ForApp: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -0700849#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800850 dispatchStrings(serial, mSlotId, RIL_REQUEST_CHANGE_SIM_PIN2,
Scott Randolph8a7c3b82017-04-03 14:06:40 -0700851 3, oldPin2.c_str(), newPin2.c_str(), aid.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800852 return Void();
Sanket Padawef220dc52017-01-02 23:46:00 -0800853}
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700854
855Return<void> RadioImpl::supplyNetworkDepersonalization(int32_t serial,
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800856 const hidl_string& netPin) {
Jayachandran C572f2f42017-03-25 14:30:13 -0700857#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -0800858 RLOGD("supplyNetworkDepersonalization: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -0700859#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800860 dispatchStrings(serial, mSlotId, RIL_REQUEST_ENTER_NETWORK_DEPERSONALIZATION,
Scott Randolph8a7c3b82017-04-03 14:06:40 -0700861 1, netPin.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800862 return Void();
Sanket Padawef220dc52017-01-02 23:46:00 -0800863}
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700864
Sanket Padawef220dc52017-01-02 23:46:00 -0800865Return<void> RadioImpl::getCurrentCalls(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -0700866#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -0800867 RLOGD("getCurrentCalls: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -0700868#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800869 dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_CURRENT_CALLS);
870 return Void();
Sanket Padawef220dc52017-01-02 23:46:00 -0800871}
872
873Return<void> RadioImpl::dial(int32_t serial, const Dial& dialInfo) {
Jayachandran C572f2f42017-03-25 14:30:13 -0700874#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -0800875 RLOGD("dial: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -0700876#endif
Sanket Padawef220dc52017-01-02 23:46:00 -0800877 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_DIAL);
878 if (pRI == NULL) {
879 return Void();
880 }
Jack Yuf68e0da2017-02-07 14:53:09 -0800881 RIL_Dial dial = {};
882 RIL_UUS_Info uusInfo = {};
Sanket Padawef220dc52017-01-02 23:46:00 -0800883 int32_t sizeOfDial = sizeof(dial);
884
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800885 if (!copyHidlStringToRil(&dial.address, dialInfo.address, pRI)) {
Sanket Padawef220dc52017-01-02 23:46:00 -0800886 return Void();
887 }
Jack Yuf68e0da2017-02-07 14:53:09 -0800888 dial.clir = (int) dialInfo.clir;
Sanket Padawef220dc52017-01-02 23:46:00 -0800889
Sanket Padawef220dc52017-01-02 23:46:00 -0800890 if (dialInfo.uusInfo.size() != 0) {
Sanket Padawef220dc52017-01-02 23:46:00 -0800891 uusInfo.uusType = (RIL_UUS_Type) dialInfo.uusInfo[0].uusType;
892 uusInfo.uusDcs = (RIL_UUS_DCS) dialInfo.uusInfo[0].uusDcs;
893
894 if (dialInfo.uusInfo[0].uusData.size() == 0) {
895 uusInfo.uusData = NULL;
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800896 uusInfo.uusLength = 0;
Sanket Padawef220dc52017-01-02 23:46:00 -0800897 } else {
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800898 if (!copyHidlStringToRil(&uusInfo.uusData, dialInfo.uusInfo[0].uusData, pRI)) {
899 memsetAndFreeStrings(1, dial.address);
Sanket Padawef220dc52017-01-02 23:46:00 -0800900 return Void();
901 }
Jack Yuf68e0da2017-02-07 14:53:09 -0800902 uusInfo.uusLength = dialInfo.uusInfo[0].uusData.size();
Sanket Padawef220dc52017-01-02 23:46:00 -0800903 }
904
Sanket Padawef220dc52017-01-02 23:46:00 -0800905 dial.uusInfo = &uusInfo;
906 }
907
Amit Mahajan93f603c2017-05-15 16:41:44 -0700908 CALL_ONREQUEST(RIL_REQUEST_DIAL, &dial, sizeOfDial, pRI, mSlotId);
Sanket Padawef220dc52017-01-02 23:46:00 -0800909
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800910 memsetAndFreeStrings(2, dial.address, uusInfo.uusData);
Sanket Padawef220dc52017-01-02 23:46:00 -0800911
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800912 return Void();
Sanket Padawef220dc52017-01-02 23:46:00 -0800913}
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700914
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800915Return<void> RadioImpl::getImsiForApp(int32_t serial, const hidl_string& aid) {
Jayachandran C572f2f42017-03-25 14:30:13 -0700916#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -0800917 RLOGD("getImsiForApp: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -0700918#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800919 dispatchStrings(serial, mSlotId, RIL_REQUEST_GET_IMSI,
Scott Randolph8a7c3b82017-04-03 14:06:40 -0700920 1, aid.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800921 return Void();
922}
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700923
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800924Return<void> RadioImpl::hangup(int32_t serial, int32_t gsmIndex) {
Jayachandran C572f2f42017-03-25 14:30:13 -0700925#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -0800926 RLOGD("hangup: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -0700927#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800928 dispatchInts(serial, mSlotId, RIL_REQUEST_HANGUP, 1, gsmIndex);
929 return Void();
930}
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700931
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800932Return<void> RadioImpl::hangupWaitingOrBackground(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -0700933#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -0800934 RLOGD("hangupWaitingOrBackground: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -0700935#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800936 dispatchVoid(serial, mSlotId, RIL_REQUEST_HANGUP_WAITING_OR_BACKGROUND);
937 return Void();
938}
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700939
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800940Return<void> RadioImpl::hangupForegroundResumeBackground(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -0700941#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -0800942 RLOGD("hangupForegroundResumeBackground: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -0700943#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800944 dispatchVoid(serial, mSlotId, RIL_REQUEST_HANGUP_FOREGROUND_RESUME_BACKGROUND);
945 return Void();
946}
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700947
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800948Return<void> RadioImpl::switchWaitingOrHoldingAndActive(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -0700949#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -0800950 RLOGD("switchWaitingOrHoldingAndActive: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -0700951#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800952 dispatchVoid(serial, mSlotId, RIL_REQUEST_SWITCH_WAITING_OR_HOLDING_AND_ACTIVE);
953 return Void();
954}
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700955
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800956Return<void> RadioImpl::conference(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -0700957#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -0800958 RLOGD("conference: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -0700959#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800960 dispatchVoid(serial, mSlotId, RIL_REQUEST_CONFERENCE);
961 return Void();
962}
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700963
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800964Return<void> RadioImpl::rejectCall(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -0700965#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -0800966 RLOGD("rejectCall: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -0700967#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800968 dispatchVoid(serial, mSlotId, RIL_REQUEST_UDUB);
969 return Void();
970}
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700971
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800972Return<void> RadioImpl::getLastCallFailCause(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -0700973#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -0800974 RLOGD("getLastCallFailCause: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -0700975#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800976 dispatchVoid(serial, mSlotId, RIL_REQUEST_LAST_CALL_FAIL_CAUSE);
977 return Void();
978}
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700979
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800980Return<void> RadioImpl::getSignalStrength(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -0700981#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -0800982 RLOGD("getSignalStrength: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -0700983#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800984 dispatchVoid(serial, mSlotId, RIL_REQUEST_SIGNAL_STRENGTH);
985 return Void();
986}
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700987
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800988Return<void> RadioImpl::getVoiceRegistrationState(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -0700989#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -0800990 RLOGD("getVoiceRegistrationState: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -0700991#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800992 dispatchVoid(serial, mSlotId, RIL_REQUEST_VOICE_REGISTRATION_STATE);
993 return Void();
994}
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700995
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800996Return<void> RadioImpl::getDataRegistrationState(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -0700997#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -0800998 RLOGD("getDataRegistrationState: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -0700999#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001000 dispatchVoid(serial, mSlotId, RIL_REQUEST_DATA_REGISTRATION_STATE);
1001 return Void();
1002}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001003
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001004Return<void> RadioImpl::getOperator(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001005#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001006 RLOGD("getOperator: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001007#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001008 dispatchVoid(serial, mSlotId, RIL_REQUEST_OPERATOR);
1009 return Void();
1010}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001011
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001012Return<void> RadioImpl::setRadioPower(int32_t serial, bool on) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08001013 RLOGD("setRadioPower: serial %d on %d", serial, on);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001014 dispatchInts(serial, mSlotId, RIL_REQUEST_RADIO_POWER, 1, BOOL_TO_INT(on));
1015 return Void();
1016}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001017
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001018Return<void> RadioImpl::sendDtmf(int32_t serial, const hidl_string& s) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001019#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001020 RLOGD("sendDtmf: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001021#endif
Scott Randolph8a7c3b82017-04-03 14:06:40 -07001022 dispatchString(serial, mSlotId, RIL_REQUEST_DTMF, s.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001023 return Void();
1024}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001025
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001026Return<void> RadioImpl::sendSms(int32_t serial, const GsmSmsMessage& message) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001027#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001028 RLOGD("sendSms: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001029#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001030 dispatchStrings(serial, mSlotId, RIL_REQUEST_SEND_SMS,
Scott Randolph8a7c3b82017-04-03 14:06:40 -07001031 2, message.smscPdu.c_str(), message.pdu.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001032 return Void();
1033}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001034
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001035Return<void> RadioImpl::sendSMSExpectMore(int32_t serial, const GsmSmsMessage& message) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001036#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001037 RLOGD("sendSMSExpectMore: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001038#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001039 dispatchStrings(serial, mSlotId, RIL_REQUEST_SEND_SMS_EXPECT_MORE,
Scott Randolph8a7c3b82017-04-03 14:06:40 -07001040 2, message.smscPdu.c_str(), message.pdu.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001041 return Void();
1042}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001043
Jack Yu8b489142017-04-13 20:55:03 -07001044static bool convertMvnoTypeToString(MvnoType type, char *&str) {
Jack Yuffc06452017-02-13 11:21:00 -08001045 switch (type) {
Jack Yu8b489142017-04-13 20:55:03 -07001046 case MvnoType::IMSI:
1047 str = (char *)"imsi";
1048 return true;
1049 case MvnoType::GID:
1050 str = (char *)"gid";
1051 return true;
1052 case MvnoType::SPN:
1053 str = (char *)"spn";
1054 return true;
1055 case MvnoType::NONE:
1056 str = (char *)"";
1057 return true;
Jack Yuffc06452017-02-13 11:21:00 -08001058 }
Jack Yu8b489142017-04-13 20:55:03 -07001059 return false;
Jack Yuffc06452017-02-13 11:21:00 -08001060}
1061
1062Return<void> RadioImpl::setupDataCall(int32_t serial, RadioTechnology radioTechnology,
1063 const DataProfileInfo& dataProfileInfo, bool modemCognitive,
1064 bool roamingAllowed, bool isRoaming) {
1065
Jayachandran C572f2f42017-03-25 14:30:13 -07001066#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001067 RLOGD("setupDataCall: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001068#endif
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001069
Jack Yuffc06452017-02-13 11:21:00 -08001070 if (s_vendorFunctions->version >= 4 && s_vendorFunctions->version <= 14) {
1071 const hidl_string &protocol =
1072 (isRoaming ? dataProfileInfo.roamingProtocol : dataProfileInfo.protocol);
1073 dispatchStrings(serial, mSlotId, RIL_REQUEST_SETUP_DATA_CALL, 7,
1074 std::to_string((int) radioTechnology + 2).c_str(),
1075 std::to_string((int) dataProfileInfo.profileId).c_str(),
1076 dataProfileInfo.apn.c_str(),
1077 dataProfileInfo.user.c_str(),
1078 dataProfileInfo.password.c_str(),
1079 std::to_string((int) dataProfileInfo.authType).c_str(),
1080 protocol.c_str());
1081 } else if (s_vendorFunctions->version >= 15) {
Jack Yu8b489142017-04-13 20:55:03 -07001082 char *mvnoTypeStr = NULL;
1083 if (!convertMvnoTypeToString(dataProfileInfo.mvnoType, mvnoTypeStr)) {
Jack Yuffc06452017-02-13 11:21:00 -08001084 RequestInfo *pRI = android::addRequestToList(serial, mSlotId,
1085 RIL_REQUEST_SETUP_DATA_CALL);
1086 if (pRI != NULL) {
1087 sendErrorResponse(pRI, RIL_E_INVALID_ARGUMENTS);
1088 }
1089 return Void();
1090 }
1091 dispatchStrings(serial, mSlotId, RIL_REQUEST_SETUP_DATA_CALL, 15,
1092 std::to_string((int) radioTechnology + 2).c_str(),
1093 std::to_string((int) dataProfileInfo.profileId).c_str(),
1094 dataProfileInfo.apn.c_str(),
1095 dataProfileInfo.user.c_str(),
1096 dataProfileInfo.password.c_str(),
1097 std::to_string((int) dataProfileInfo.authType).c_str(),
1098 dataProfileInfo.protocol.c_str(),
1099 dataProfileInfo.roamingProtocol.c_str(),
1100 std::to_string(dataProfileInfo.supportedApnTypesBitmap).c_str(),
1101 std::to_string(dataProfileInfo.bearerBitmap).c_str(),
Jack Yu8b489142017-04-13 20:55:03 -07001102 modemCognitive ? "1" : "0",
Jack Yuffc06452017-02-13 11:21:00 -08001103 std::to_string(dataProfileInfo.mtu).c_str(),
1104 mvnoTypeStr,
1105 dataProfileInfo.mvnoMatchData.c_str(),
Jack Yu8b489142017-04-13 20:55:03 -07001106 roamingAllowed ? "1" : "0");
Jack Yuffc06452017-02-13 11:21:00 -08001107 } else {
1108 RLOGE("Unsupported RIL version %d, min version expected 4", s_vendorFunctions->version);
1109 RequestInfo *pRI = android::addRequestToList(serial, mSlotId,
1110 RIL_REQUEST_SETUP_DATA_CALL);
1111 if (pRI != NULL) {
1112 sendErrorResponse(pRI, RIL_E_REQUEST_NOT_SUPPORTED);
1113 }
1114 }
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001115 return Void();
1116}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001117
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001118Return<void> RadioImpl::iccIOForApp(int32_t serial, const IccIo& iccIo) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001119#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001120 RLOGD("iccIOForApp: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001121#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001122 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_SIM_IO);
1123 if (pRI == NULL) {
1124 return Void();
1125 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001126
Jack Yuc22b3de2017-04-14 00:08:06 -07001127 RIL_SIM_IO_v6 rilIccIo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001128 rilIccIo.command = iccIo.command;
1129 rilIccIo.fileid = iccIo.fileId;
1130 if (!copyHidlStringToRil(&rilIccIo.path, iccIo.path, pRI)) {
1131 return Void();
1132 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001133
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001134 rilIccIo.p1 = iccIo.p1;
1135 rilIccIo.p2 = iccIo.p2;
1136 rilIccIo.p3 = iccIo.p3;
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001137
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001138 if (!copyHidlStringToRil(&rilIccIo.data, iccIo.data, pRI)) {
1139 memsetAndFreeStrings(1, rilIccIo.path);
1140 return Void();
1141 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001142
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001143 if (!copyHidlStringToRil(&rilIccIo.pin2, iccIo.pin2, pRI)) {
1144 memsetAndFreeStrings(2, rilIccIo.path, rilIccIo.data);
1145 return Void();
1146 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001147
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001148 if (!copyHidlStringToRil(&rilIccIo.aidPtr, iccIo.aid, pRI)) {
1149 memsetAndFreeStrings(3, rilIccIo.path, rilIccIo.data, rilIccIo.pin2);
1150 return Void();
1151 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001152
Amit Mahajan93f603c2017-05-15 16:41:44 -07001153 CALL_ONREQUEST(RIL_REQUEST_SIM_IO, &rilIccIo, sizeof(rilIccIo), pRI, mSlotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001154
1155 memsetAndFreeStrings(4, rilIccIo.path, rilIccIo.data, rilIccIo.pin2, rilIccIo.aidPtr);
1156
1157 return Void();
1158}
1159
1160Return<void> RadioImpl::sendUssd(int32_t serial, const hidl_string& ussd) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001161#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001162 RLOGD("sendUssd: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001163#endif
Scott Randolph8a7c3b82017-04-03 14:06:40 -07001164 dispatchString(serial, mSlotId, RIL_REQUEST_SEND_USSD, ussd.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001165 return Void();
1166}
1167
1168Return<void> RadioImpl::cancelPendingUssd(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001169#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001170 RLOGD("cancelPendingUssd: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001171#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001172 dispatchVoid(serial, mSlotId, RIL_REQUEST_CANCEL_USSD);
1173 return Void();
1174}
1175
1176Return<void> RadioImpl::getClir(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001177#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001178 RLOGD("getClir: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001179#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001180 dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_CLIR);
1181 return Void();
1182}
1183
1184Return<void> RadioImpl::setClir(int32_t serial, int32_t status) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001185#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001186 RLOGD("setClir: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001187#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001188 dispatchInts(serial, mSlotId, RIL_REQUEST_SET_CLIR, 1, status);
1189 return Void();
1190}
1191
1192Return<void> RadioImpl::getCallForwardStatus(int32_t serial, const CallForwardInfo& callInfo) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001193#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001194 RLOGD("getCallForwardStatus: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001195#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001196 dispatchCallForwardStatus(serial, mSlotId, RIL_REQUEST_QUERY_CALL_FORWARD_STATUS,
1197 callInfo);
1198 return Void();
1199}
1200
1201Return<void> RadioImpl::setCallForward(int32_t serial, const CallForwardInfo& callInfo) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001202#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001203 RLOGD("setCallForward: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001204#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001205 dispatchCallForwardStatus(serial, mSlotId, RIL_REQUEST_SET_CALL_FORWARD,
1206 callInfo);
1207 return Void();
1208}
1209
1210Return<void> RadioImpl::getCallWaiting(int32_t serial, int32_t serviceClass) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001211#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001212 RLOGD("getCallWaiting: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001213#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001214 dispatchInts(serial, mSlotId, RIL_REQUEST_QUERY_CALL_WAITING, 1, serviceClass);
1215 return Void();
1216}
1217
1218Return<void> RadioImpl::setCallWaiting(int32_t serial, bool enable, int32_t serviceClass) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001219#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001220 RLOGD("setCallWaiting: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001221#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001222 dispatchInts(serial, mSlotId, RIL_REQUEST_SET_CALL_WAITING, 2, BOOL_TO_INT(enable),
1223 serviceClass);
1224 return Void();
1225}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001226
1227Return<void> RadioImpl::acknowledgeLastIncomingGsmSms(int32_t serial,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001228 bool success, SmsAcknowledgeFailCause cause) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001229#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001230 RLOGD("acknowledgeLastIncomingGsmSms: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001231#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001232 dispatchInts(serial, mSlotId, RIL_REQUEST_SMS_ACKNOWLEDGE, 2, BOOL_TO_INT(success),
1233 cause);
1234 return Void();
1235}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001236
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001237Return<void> RadioImpl::acceptCall(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001238#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001239 RLOGD("acceptCall: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001240#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001241 dispatchVoid(serial, mSlotId, RIL_REQUEST_ANSWER);
1242 return Void();
1243}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001244
1245Return<void> RadioImpl::deactivateDataCall(int32_t serial,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001246 int32_t cid, bool reasonRadioShutDown) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001247#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001248 RLOGD("deactivateDataCall: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001249#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001250 dispatchStrings(serial, mSlotId, RIL_REQUEST_DEACTIVATE_DATA_CALL,
Scott Randolph8a7c3b82017-04-03 14:06:40 -07001251 2, (std::to_string(cid)).c_str(), reasonRadioShutDown ? "1" : "0");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001252 return Void();
1253}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001254
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001255Return<void> RadioImpl::getFacilityLockForApp(int32_t serial, const hidl_string& facility,
1256 const hidl_string& password, int32_t serviceClass,
1257 const hidl_string& appId) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001258#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001259 RLOGD("getFacilityLockForApp: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001260#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001261 dispatchStrings(serial, mSlotId, RIL_REQUEST_QUERY_FACILITY_LOCK,
Scott Randolph8a7c3b82017-04-03 14:06:40 -07001262 4, facility.c_str(), password.c_str(),
1263 (std::to_string(serviceClass)).c_str(), appId.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001264 return Void();
1265}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001266
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001267Return<void> RadioImpl::setFacilityLockForApp(int32_t serial, const hidl_string& facility,
1268 bool lockState, const hidl_string& password,
1269 int32_t serviceClass, const hidl_string& appId) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001270#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001271 RLOGD("setFacilityLockForApp: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001272#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001273 dispatchStrings(serial, mSlotId, RIL_REQUEST_SET_FACILITY_LOCK,
Scott Randolph8a7c3b82017-04-03 14:06:40 -07001274 5, facility.c_str(), lockState ? "1" : "0", password.c_str(),
1275 (std::to_string(serviceClass)).c_str(), appId.c_str() );
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001276 return Void();
1277}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001278
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001279Return<void> RadioImpl::setBarringPassword(int32_t serial, const hidl_string& facility,
1280 const hidl_string& oldPassword,
1281 const hidl_string& newPassword) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001282#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001283 RLOGD("setBarringPassword: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001284#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001285 dispatchStrings(serial, mSlotId, RIL_REQUEST_CHANGE_BARRING_PASSWORD,
Sanket Padawe75e42a52017-05-24 10:03:55 -07001286 3, facility.c_str(), oldPassword.c_str(), newPassword.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001287 return Void();
1288}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001289
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001290Return<void> RadioImpl::getNetworkSelectionMode(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001291#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001292 RLOGD("getNetworkSelectionMode: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001293#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001294 dispatchVoid(serial, mSlotId, RIL_REQUEST_QUERY_NETWORK_SELECTION_MODE);
1295 return Void();
1296}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001297
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001298Return<void> RadioImpl::setNetworkSelectionModeAutomatic(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001299#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001300 RLOGD("setNetworkSelectionModeAutomatic: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001301#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001302 dispatchVoid(serial, mSlotId, RIL_REQUEST_SET_NETWORK_SELECTION_AUTOMATIC);
1303 return Void();
1304}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001305
1306Return<void> RadioImpl::setNetworkSelectionModeManual(int32_t serial,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001307 const hidl_string& operatorNumeric) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001308#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001309 RLOGD("setNetworkSelectionModeManual: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001310#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001311 dispatchString(serial, mSlotId, RIL_REQUEST_SET_NETWORK_SELECTION_MANUAL,
Scott Randolph8a7c3b82017-04-03 14:06:40 -07001312 operatorNumeric.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001313 return Void();
1314}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001315
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001316Return<void> RadioImpl::getAvailableNetworks(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001317#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001318 RLOGD("getAvailableNetworks: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001319#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001320 dispatchVoid(serial, mSlotId, RIL_REQUEST_QUERY_AVAILABLE_NETWORKS);
1321 return Void();
1322}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001323
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001324Return<void> RadioImpl::startDtmf(int32_t serial, const hidl_string& s) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001325#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001326 RLOGD("startDtmf: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001327#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001328 dispatchString(serial, mSlotId, RIL_REQUEST_DTMF_START,
Scott Randolph8a7c3b82017-04-03 14:06:40 -07001329 s.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001330 return Void();
1331}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001332
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001333Return<void> RadioImpl::stopDtmf(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001334#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001335 RLOGD("stopDtmf: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001336#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001337 dispatchVoid(serial, mSlotId, RIL_REQUEST_DTMF_STOP);
1338 return Void();
1339}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001340
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001341Return<void> RadioImpl::getBasebandVersion(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001342#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001343 RLOGD("getBasebandVersion: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001344#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001345 dispatchVoid(serial, mSlotId, RIL_REQUEST_BASEBAND_VERSION);
1346 return Void();
1347}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001348
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001349Return<void> RadioImpl::separateConnection(int32_t serial, int32_t gsmIndex) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001350#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001351 RLOGD("separateConnection: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001352#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001353 dispatchInts(serial, mSlotId, RIL_REQUEST_SEPARATE_CONNECTION, 1, gsmIndex);
1354 return Void();
1355}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001356
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001357Return<void> RadioImpl::setMute(int32_t serial, bool enable) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001358#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001359 RLOGD("setMute: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001360#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001361 dispatchInts(serial, mSlotId, RIL_REQUEST_SET_MUTE, 1, BOOL_TO_INT(enable));
1362 return Void();
1363}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001364
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001365Return<void> RadioImpl::getMute(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001366#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001367 RLOGD("getMute: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001368#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001369 dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_MUTE);
1370 return Void();
1371}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001372
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001373Return<void> RadioImpl::getClip(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001374#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001375 RLOGD("getClip: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001376#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001377 dispatchVoid(serial, mSlotId, RIL_REQUEST_QUERY_CLIP);
1378 return Void();
1379}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001380
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001381Return<void> RadioImpl::getDataCallList(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001382#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001383 RLOGD("getDataCallList: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001384#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001385 dispatchVoid(serial, mSlotId, RIL_REQUEST_DATA_CALL_LIST);
1386 return Void();
1387}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001388
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001389Return<void> RadioImpl::setSuppServiceNotifications(int32_t serial, bool enable) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001390#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001391 RLOGD("setSuppServiceNotifications: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001392#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001393 dispatchInts(serial, mSlotId, RIL_REQUEST_SET_SUPP_SVC_NOTIFICATION, 1,
1394 BOOL_TO_INT(enable));
1395 return Void();
1396}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001397
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001398Return<void> RadioImpl::writeSmsToSim(int32_t serial, const SmsWriteArgs& smsWriteArgs) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001399#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001400 RLOGD("writeSmsToSim: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001401#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001402 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_WRITE_SMS_TO_SIM);
1403 if (pRI == NULL) {
1404 return Void();
1405 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001406
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001407 RIL_SMS_WriteArgs args;
1408 args.status = (int) smsWriteArgs.status;
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001409
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001410 int len;
1411 if (!copyHidlStringToRil(&args.pdu, smsWriteArgs.pdu, pRI)) {
1412 return Void();
1413 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001414
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001415 if (!copyHidlStringToRil(&args.smsc, smsWriteArgs.smsc, pRI)) {
1416 memsetAndFreeStrings(1, args.pdu);
1417 return Void();
1418 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001419
Amit Mahajan93f603c2017-05-15 16:41:44 -07001420 CALL_ONREQUEST(RIL_REQUEST_WRITE_SMS_TO_SIM, &args, sizeof(args), pRI, mSlotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001421
1422 memsetAndFreeStrings(2, args.smsc, args.pdu);
1423
1424 return Void();
1425}
1426
1427Return<void> RadioImpl::deleteSmsOnSim(int32_t serial, int32_t index) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001428#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001429 RLOGD("deleteSmsOnSim: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001430#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001431 dispatchInts(serial, mSlotId, RIL_REQUEST_DELETE_SMS_ON_SIM, 1, index);
1432 return Void();
1433}
1434
1435Return<void> RadioImpl::setBandMode(int32_t serial, RadioBandMode mode) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001436#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001437 RLOGD("setBandMode: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001438#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001439 dispatchInts(serial, mSlotId, RIL_REQUEST_SET_BAND_MODE, 1, mode);
1440 return Void();
1441}
1442
1443Return<void> RadioImpl::getAvailableBandModes(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001444#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001445 RLOGD("getAvailableBandModes: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001446#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001447 dispatchVoid(serial, mSlotId, RIL_REQUEST_QUERY_AVAILABLE_BAND_MODE);
1448 return Void();
1449}
1450
1451Return<void> RadioImpl::sendEnvelope(int32_t serial, const hidl_string& command) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001452#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001453 RLOGD("sendEnvelope: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001454#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001455 dispatchString(serial, mSlotId, RIL_REQUEST_STK_SEND_ENVELOPE_COMMAND,
Scott Randolph8a7c3b82017-04-03 14:06:40 -07001456 command.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001457 return Void();
1458}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001459
1460Return<void> RadioImpl::sendTerminalResponseToSim(int32_t serial,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001461 const hidl_string& commandResponse) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001462#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001463 RLOGD("sendTerminalResponseToSim: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001464#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001465 dispatchString(serial, mSlotId, RIL_REQUEST_STK_SEND_TERMINAL_RESPONSE,
Scott Randolph8a7c3b82017-04-03 14:06:40 -07001466 commandResponse.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001467 return Void();
1468}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001469
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001470Return<void> RadioImpl::handleStkCallSetupRequestFromSim(int32_t serial, bool accept) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001471#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001472 RLOGD("handleStkCallSetupRequestFromSim: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001473#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001474 dispatchInts(serial, mSlotId, RIL_REQUEST_STK_HANDLE_CALL_SETUP_REQUESTED_FROM_SIM,
1475 1, BOOL_TO_INT(accept));
1476 return Void();
1477}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001478
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001479Return<void> RadioImpl::explicitCallTransfer(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001480#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001481 RLOGD("explicitCallTransfer: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001482#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001483 dispatchVoid(serial, mSlotId, RIL_REQUEST_EXPLICIT_CALL_TRANSFER);
1484 return Void();
1485}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001486
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001487Return<void> RadioImpl::setPreferredNetworkType(int32_t serial, PreferredNetworkType nwType) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001488#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001489 RLOGD("setPreferredNetworkType: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001490#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001491 dispatchInts(serial, mSlotId, RIL_REQUEST_SET_PREFERRED_NETWORK_TYPE, 1, nwType);
1492 return Void();
1493}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001494
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001495Return<void> RadioImpl::getPreferredNetworkType(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001496#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001497 RLOGD("getPreferredNetworkType: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001498#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001499 dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_PREFERRED_NETWORK_TYPE);
1500 return Void();
1501}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001502
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001503Return<void> RadioImpl::getNeighboringCids(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001504#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001505 RLOGD("getNeighboringCids: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001506#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001507 dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_NEIGHBORING_CELL_IDS);
1508 return Void();
1509}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001510
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001511Return<void> RadioImpl::setLocationUpdates(int32_t serial, bool enable) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001512#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001513 RLOGD("setLocationUpdates: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001514#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001515 dispatchInts(serial, mSlotId, RIL_REQUEST_SET_LOCATION_UPDATES, 1, BOOL_TO_INT(enable));
1516 return Void();
1517}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001518
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001519Return<void> RadioImpl::setCdmaSubscriptionSource(int32_t serial, CdmaSubscriptionSource cdmaSub) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001520#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001521 RLOGD("setCdmaSubscriptionSource: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001522#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001523 dispatchInts(serial, mSlotId, RIL_REQUEST_CDMA_SET_SUBSCRIPTION_SOURCE, 1, cdmaSub);
1524 return Void();
1525}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001526
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001527Return<void> RadioImpl::setCdmaRoamingPreference(int32_t serial, CdmaRoamingType type) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001528#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001529 RLOGD("setCdmaRoamingPreference: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001530#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001531 dispatchInts(serial, mSlotId, RIL_REQUEST_CDMA_SET_ROAMING_PREFERENCE, 1, type);
1532 return Void();
1533}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001534
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001535Return<void> RadioImpl::getCdmaRoamingPreference(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001536#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001537 RLOGD("getCdmaRoamingPreference: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001538#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001539 dispatchVoid(serial, mSlotId, RIL_REQUEST_CDMA_QUERY_ROAMING_PREFERENCE);
1540 return Void();
1541}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001542
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001543Return<void> RadioImpl::setTTYMode(int32_t serial, TtyMode mode) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001544#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001545 RLOGD("setTTYMode: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001546#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001547 dispatchInts(serial, mSlotId, RIL_REQUEST_SET_TTY_MODE, 1, mode);
1548 return Void();
1549}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001550
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001551Return<void> RadioImpl::getTTYMode(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001552#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001553 RLOGD("getTTYMode: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001554#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001555 dispatchVoid(serial, mSlotId, RIL_REQUEST_QUERY_TTY_MODE);
1556 return Void();
1557}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001558
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001559Return<void> RadioImpl::setPreferredVoicePrivacy(int32_t serial, bool enable) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001560#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001561 RLOGD("setPreferredVoicePrivacy: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001562#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001563 dispatchInts(serial, mSlotId, RIL_REQUEST_CDMA_SET_PREFERRED_VOICE_PRIVACY_MODE,
1564 1, BOOL_TO_INT(enable));
1565 return Void();
1566}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001567
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001568Return<void> RadioImpl::getPreferredVoicePrivacy(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001569#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001570 RLOGD("getPreferredVoicePrivacy: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001571#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001572 dispatchVoid(serial, mSlotId, RIL_REQUEST_CDMA_QUERY_PREFERRED_VOICE_PRIVACY_MODE);
1573 return Void();
1574}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001575
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001576Return<void> RadioImpl::sendCDMAFeatureCode(int32_t serial, const hidl_string& featureCode) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001577#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001578 RLOGD("sendCDMAFeatureCode: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001579#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001580 dispatchString(serial, mSlotId, RIL_REQUEST_CDMA_FLASH,
Scott Randolph8a7c3b82017-04-03 14:06:40 -07001581 featureCode.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001582 return Void();
1583}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001584
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001585Return<void> RadioImpl::sendBurstDtmf(int32_t serial, const hidl_string& dtmf, int32_t on,
1586 int32_t off) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001587#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001588 RLOGD("sendBurstDtmf: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001589#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001590 dispatchStrings(serial, mSlotId, RIL_REQUEST_CDMA_BURST_DTMF,
Scott Randolph8a7c3b82017-04-03 14:06:40 -07001591 3, dtmf.c_str(), (std::to_string(on)).c_str(),
1592 (std::to_string(off)).c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001593 return Void();
1594}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001595
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001596void constructCdmaSms(RIL_CDMA_SMS_Message &rcsm, const CdmaSmsMessage& sms) {
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001597 rcsm.uTeleserviceID = sms.teleserviceId;
1598 rcsm.bIsServicePresent = BOOL_TO_INT(sms.isServicePresent);
1599 rcsm.uServicecategory = sms.serviceCategory;
1600 rcsm.sAddress.digit_mode = (RIL_CDMA_SMS_DigitMode) sms.address.digitMode;
1601 rcsm.sAddress.number_mode = (RIL_CDMA_SMS_NumberMode) sms.address.numberMode;
1602 rcsm.sAddress.number_type = (RIL_CDMA_SMS_NumberType) sms.address.numberType;
1603 rcsm.sAddress.number_plan = (RIL_CDMA_SMS_NumberPlan) sms.address.numberPlan;
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001604
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001605 rcsm.sAddress.number_of_digits = sms.address.digits.size();
1606 int digitLimit= MIN((rcsm.sAddress.number_of_digits), RIL_CDMA_SMS_ADDRESS_MAX);
1607 for (int i = 0; i < digitLimit; i++) {
1608 rcsm.sAddress.digits[i] = sms.address.digits[i];
1609 }
1610
1611 rcsm.sSubAddress.subaddressType = (RIL_CDMA_SMS_SubaddressType) sms.subAddress.subaddressType;
1612 rcsm.sSubAddress.odd = BOOL_TO_INT(sms.subAddress.odd);
1613
1614 rcsm.sSubAddress.number_of_digits = sms.subAddress.digits.size();
1615 digitLimit= MIN((rcsm.sSubAddress.number_of_digits), RIL_CDMA_SMS_SUBADDRESS_MAX);
1616 for (int i = 0; i < digitLimit; i++) {
1617 rcsm.sSubAddress.digits[i] = sms.subAddress.digits[i];
1618 }
1619
1620 rcsm.uBearerDataLen = sms.bearerData.size();
1621 digitLimit= MIN((rcsm.uBearerDataLen), RIL_CDMA_SMS_BEARER_DATA_MAX);
1622 for (int i = 0; i < digitLimit; i++) {
1623 rcsm.aBearerData[i] = sms.bearerData[i];
1624 }
1625}
1626
1627Return<void> RadioImpl::sendCdmaSms(int32_t serial, const CdmaSmsMessage& sms) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001628#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001629 RLOGD("sendCdmaSms: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001630#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001631 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_CDMA_SEND_SMS);
1632 if (pRI == NULL) {
1633 return Void();
1634 }
1635
Jack Yuc22b3de2017-04-14 00:08:06 -07001636 RIL_CDMA_SMS_Message rcsm = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001637 constructCdmaSms(rcsm, sms);
1638
Amit Mahajan93f603c2017-05-15 16:41:44 -07001639 CALL_ONREQUEST(pRI->pCI->requestNumber, &rcsm, sizeof(rcsm), pRI, mSlotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001640 return Void();
1641}
1642
1643Return<void> RadioImpl::acknowledgeLastIncomingCdmaSms(int32_t serial, const CdmaSmsAck& smsAck) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001644#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001645 RLOGD("acknowledgeLastIncomingCdmaSms: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001646#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001647 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_CDMA_SMS_ACKNOWLEDGE);
1648 if (pRI == NULL) {
1649 return Void();
1650 }
1651
Jack Yuf68e0da2017-02-07 14:53:09 -08001652 RIL_CDMA_SMS_Ack rcsa = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001653
1654 rcsa.uErrorClass = (RIL_CDMA_SMS_ErrorClass) smsAck.errorClass;
1655 rcsa.uSMSCauseCode = smsAck.smsCauseCode;
1656
Amit Mahajan93f603c2017-05-15 16:41:44 -07001657 CALL_ONREQUEST(pRI->pCI->requestNumber, &rcsa, sizeof(rcsa), pRI, mSlotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001658 return Void();
1659}
1660
1661Return<void> RadioImpl::getGsmBroadcastConfig(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001662#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001663 RLOGD("getGsmBroadcastConfig: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001664#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001665 dispatchVoid(serial, mSlotId, RIL_REQUEST_GSM_GET_BROADCAST_SMS_CONFIG);
1666 return Void();
1667}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001668
1669Return<void> RadioImpl::setGsmBroadcastConfig(int32_t serial,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001670 const hidl_vec<GsmBroadcastSmsConfigInfo>&
1671 configInfo) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001672#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001673 RLOGD("setGsmBroadcastConfig: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001674#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001675 RequestInfo *pRI = android::addRequestToList(serial, mSlotId,
1676 RIL_REQUEST_GSM_SET_BROADCAST_SMS_CONFIG);
1677 if (pRI == NULL) {
1678 return Void();
1679 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001680
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001681 int num = configInfo.size();
1682 RIL_GSM_BroadcastSmsConfigInfo gsmBci[num];
1683 RIL_GSM_BroadcastSmsConfigInfo *gsmBciPtrs[num];
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001684
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001685 for (int i = 0 ; i < num ; i++ ) {
1686 gsmBciPtrs[i] = &gsmBci[i];
1687 gsmBci[i].fromServiceId = configInfo[i].fromServiceId;
1688 gsmBci[i].toServiceId = configInfo[i].toServiceId;
1689 gsmBci[i].fromCodeScheme = configInfo[i].fromCodeScheme;
1690 gsmBci[i].toCodeScheme = configInfo[i].toCodeScheme;
1691 gsmBci[i].selected = BOOL_TO_INT(configInfo[i].selected);
1692 }
1693
Amit Mahajan93f603c2017-05-15 16:41:44 -07001694 CALL_ONREQUEST(pRI->pCI->requestNumber, gsmBciPtrs,
1695 num * sizeof(RIL_GSM_BroadcastSmsConfigInfo *), pRI, mSlotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001696 return Void();
1697}
1698
1699Return<void> RadioImpl::setGsmBroadcastActivation(int32_t serial, bool activate) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001700#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001701 RLOGD("setGsmBroadcastActivation: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001702#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001703 dispatchInts(serial, mSlotId, RIL_REQUEST_GSM_SMS_BROADCAST_ACTIVATION,
Sanket Padawe0de29d12017-02-10 13:19:47 -08001704 1, BOOL_TO_INT(!activate));
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001705 return Void();
1706}
1707
1708Return<void> RadioImpl::getCdmaBroadcastConfig(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001709#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001710 RLOGD("getCdmaBroadcastConfig: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001711#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001712 dispatchVoid(serial, mSlotId, RIL_REQUEST_CDMA_GET_BROADCAST_SMS_CONFIG);
1713 return Void();
1714}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001715
1716Return<void> RadioImpl::setCdmaBroadcastConfig(int32_t serial,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001717 const hidl_vec<CdmaBroadcastSmsConfigInfo>&
1718 configInfo) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001719#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001720 RLOGD("setCdmaBroadcastConfig: 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,
1723 RIL_REQUEST_CDMA_SET_BROADCAST_SMS_CONFIG);
1724 if (pRI == NULL) {
1725 return Void();
1726 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001727
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001728 int num = configInfo.size();
1729 RIL_CDMA_BroadcastSmsConfigInfo cdmaBci[num];
1730 RIL_CDMA_BroadcastSmsConfigInfo *cdmaBciPtrs[num];
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001731
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001732 for (int i = 0 ; i < num ; i++ ) {
1733 cdmaBciPtrs[i] = &cdmaBci[i];
1734 cdmaBci[i].service_category = configInfo[i].serviceCategory;
1735 cdmaBci[i].language = configInfo[i].language;
1736 cdmaBci[i].selected = BOOL_TO_INT(configInfo[i].selected);
1737 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001738
Amit Mahajan93f603c2017-05-15 16:41:44 -07001739 CALL_ONREQUEST(pRI->pCI->requestNumber, cdmaBciPtrs,
1740 num * sizeof(RIL_CDMA_BroadcastSmsConfigInfo *), pRI, mSlotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001741 return Void();
1742}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001743
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001744Return<void> RadioImpl::setCdmaBroadcastActivation(int32_t serial, bool activate) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001745#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001746 RLOGD("setCdmaBroadcastActivation: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001747#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001748 dispatchInts(serial, mSlotId, RIL_REQUEST_CDMA_SMS_BROADCAST_ACTIVATION,
Sanket Padawe0de29d12017-02-10 13:19:47 -08001749 1, BOOL_TO_INT(!activate));
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001750 return Void();
1751}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001752
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001753Return<void> RadioImpl::getCDMASubscription(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001754#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001755 RLOGD("getCDMASubscription: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001756#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001757 dispatchVoid(serial, mSlotId, RIL_REQUEST_CDMA_SUBSCRIPTION);
1758 return Void();
1759}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001760
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001761Return<void> RadioImpl::writeSmsToRuim(int32_t serial, const CdmaSmsWriteArgs& cdmaSms) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001762#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001763 RLOGD("writeSmsToRuim: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001764#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001765 RequestInfo *pRI = android::addRequestToList(serial, mSlotId,
1766 RIL_REQUEST_CDMA_WRITE_SMS_TO_RUIM);
1767 if (pRI == NULL) {
1768 return Void();
1769 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001770
Jack Yuf68e0da2017-02-07 14:53:09 -08001771 RIL_CDMA_SMS_WriteArgs rcsw = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001772 rcsw.status = (int) cdmaSms.status;
1773 constructCdmaSms(rcsw.message, cdmaSms.message);
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001774
Amit Mahajan93f603c2017-05-15 16:41:44 -07001775 CALL_ONREQUEST(pRI->pCI->requestNumber, &rcsw, sizeof(rcsw), pRI, mSlotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001776 return Void();
1777}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001778
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001779Return<void> RadioImpl::deleteSmsOnRuim(int32_t serial, int32_t index) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001780#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001781 RLOGD("deleteSmsOnRuim: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001782#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001783 dispatchInts(serial, mSlotId, RIL_REQUEST_CDMA_DELETE_SMS_ON_RUIM, 1, index);
1784 return Void();
1785}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001786
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001787Return<void> RadioImpl::getDeviceIdentity(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001788#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001789 RLOGD("getDeviceIdentity: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001790#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001791 dispatchVoid(serial, mSlotId, RIL_REQUEST_DEVICE_IDENTITY);
1792 return Void();
1793}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001794
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001795Return<void> RadioImpl::exitEmergencyCallbackMode(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001796#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001797 RLOGD("exitEmergencyCallbackMode: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001798#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001799 dispatchVoid(serial, mSlotId, RIL_REQUEST_EXIT_EMERGENCY_CALLBACK_MODE);
1800 return Void();
1801}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001802
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001803Return<void> RadioImpl::getSmscAddress(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001804#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001805 RLOGD("getSmscAddress: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001806#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001807 dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_SMSC_ADDRESS);
1808 return Void();
1809}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001810
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001811Return<void> RadioImpl::setSmscAddress(int32_t serial, const hidl_string& smsc) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001812#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001813 RLOGD("setSmscAddress: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001814#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001815 dispatchString(serial, mSlotId, RIL_REQUEST_SET_SMSC_ADDRESS,
Scott Randolph8a7c3b82017-04-03 14:06:40 -07001816 smsc.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001817 return Void();
1818}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001819
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001820Return<void> RadioImpl::reportSmsMemoryStatus(int32_t serial, bool available) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001821#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001822 RLOGD("reportSmsMemoryStatus: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001823#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001824 dispatchInts(serial, mSlotId, RIL_REQUEST_REPORT_SMS_MEMORY_STATUS, 1,
1825 BOOL_TO_INT(available));
1826 return Void();
1827}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001828
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001829Return<void> RadioImpl::reportStkServiceIsRunning(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001830#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001831 RLOGD("reportStkServiceIsRunning: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001832#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001833 dispatchVoid(serial, mSlotId, RIL_REQUEST_REPORT_STK_SERVICE_IS_RUNNING);
1834 return Void();
1835}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001836
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001837Return<void> RadioImpl::getCdmaSubscriptionSource(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001838#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001839 RLOGD("getCdmaSubscriptionSource: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001840#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001841 dispatchVoid(serial, mSlotId, RIL_REQUEST_CDMA_GET_SUBSCRIPTION_SOURCE);
1842 return Void();
1843}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001844
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001845Return<void> RadioImpl::requestIsimAuthentication(int32_t serial, const hidl_string& challenge) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001846#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001847 RLOGD("requestIsimAuthentication: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001848#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001849 dispatchString(serial, mSlotId, RIL_REQUEST_ISIM_AUTHENTICATION,
Scott Randolph8a7c3b82017-04-03 14:06:40 -07001850 challenge.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001851 return Void();
1852}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001853
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001854Return<void> RadioImpl::acknowledgeIncomingGsmSmsWithPdu(int32_t serial, bool success,
1855 const hidl_string& ackPdu) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001856#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001857 RLOGD("acknowledgeIncomingGsmSmsWithPdu: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001858#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001859 dispatchStrings(serial, mSlotId, RIL_REQUEST_ACKNOWLEDGE_INCOMING_GSM_SMS_WITH_PDU,
Scott Randolph8a7c3b82017-04-03 14:06:40 -07001860 2, success ? "1" : "0", ackPdu.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001861 return Void();
1862}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001863
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001864Return<void> RadioImpl::sendEnvelopeWithStatus(int32_t serial, const hidl_string& contents) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001865#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001866 RLOGD("sendEnvelopeWithStatus: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001867#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001868 dispatchString(serial, mSlotId, RIL_REQUEST_STK_SEND_ENVELOPE_WITH_STATUS,
Scott Randolph8a7c3b82017-04-03 14:06:40 -07001869 contents.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001870 return Void();
1871}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001872
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001873Return<void> RadioImpl::getVoiceRadioTechnology(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001874#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001875 RLOGD("getVoiceRadioTechnology: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001876#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001877 dispatchVoid(serial, mSlotId, RIL_REQUEST_VOICE_RADIO_TECH);
1878 return Void();
1879}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001880
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001881Return<void> RadioImpl::getCellInfoList(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001882#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001883 RLOGD("getCellInfoList: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001884#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001885 dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_CELL_INFO_LIST);
1886 return Void();
1887}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001888
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001889Return<void> RadioImpl::setCellInfoListRate(int32_t serial, int32_t rate) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001890#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001891 RLOGD("setCellInfoListRate: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001892#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001893 dispatchInts(serial, mSlotId, RIL_REQUEST_SET_UNSOL_CELL_INFO_LIST_RATE, 1, rate);
1894 return Void();
1895}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001896
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001897Return<void> RadioImpl::setInitialAttachApn(int32_t serial, const DataProfileInfo& dataProfileInfo,
Jack Yuffc06452017-02-13 11:21:00 -08001898 bool modemCognitive, bool isRoaming) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001899#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001900 RLOGD("setInitialAttachApn: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001901#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001902 RequestInfo *pRI = android::addRequestToList(serial, mSlotId,
1903 RIL_REQUEST_SET_INITIAL_ATTACH_APN);
1904 if (pRI == NULL) {
1905 return Void();
1906 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001907
Jack Yuffc06452017-02-13 11:21:00 -08001908 if (s_vendorFunctions->version <= 14) {
1909 RIL_InitialAttachApn iaa = {};
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001910
Sanket Padawe46e9ee32017-06-20 12:40:19 -07001911 if (dataProfileInfo.apn.size() == 0) {
1912 iaa.apn = (char *) calloc(1, sizeof(char));
1913 if (iaa.apn == NULL) {
1914 RLOGE("Memory allocation failed for request %s",
1915 requestToString(pRI->pCI->requestNumber));
1916 sendErrorResponse(pRI, RIL_E_NO_MEMORY);
1917 return Void();
1918 }
1919 iaa.apn[0] = '\0';
1920 } else {
1921 if (!copyHidlStringToRil(&iaa.apn, dataProfileInfo.apn, pRI)) {
1922 return Void();
1923 }
Jack Yuffc06452017-02-13 11:21:00 -08001924 }
1925
1926 const hidl_string &protocol =
1927 (isRoaming ? dataProfileInfo.roamingProtocol : dataProfileInfo.protocol);
1928
1929 if (!copyHidlStringToRil(&iaa.protocol, protocol, pRI)) {
Jack Yuc22b3de2017-04-14 00:08:06 -07001930 memsetAndFreeStrings(1, iaa.apn);
Jack Yuffc06452017-02-13 11:21:00 -08001931 return Void();
1932 }
1933 iaa.authtype = (int) dataProfileInfo.authType;
1934 if (!copyHidlStringToRil(&iaa.username, dataProfileInfo.user, pRI)) {
Jack Yuc22b3de2017-04-14 00:08:06 -07001935 memsetAndFreeStrings(2, iaa.apn, iaa.protocol);
Jack Yuffc06452017-02-13 11:21:00 -08001936 return Void();
1937 }
1938 if (!copyHidlStringToRil(&iaa.password, dataProfileInfo.password, pRI)) {
Jack Yuc22b3de2017-04-14 00:08:06 -07001939 memsetAndFreeStrings(3, iaa.apn, iaa.protocol, iaa.username);
Jack Yuffc06452017-02-13 11:21:00 -08001940 return Void();
1941 }
1942
Amit Mahajan93f603c2017-05-15 16:41:44 -07001943 CALL_ONREQUEST(RIL_REQUEST_SET_INITIAL_ATTACH_APN, &iaa, sizeof(iaa), pRI, mSlotId);
Jack Yuffc06452017-02-13 11:21:00 -08001944
1945 memsetAndFreeStrings(4, iaa.apn, iaa.protocol, iaa.username, iaa.password);
1946 } else {
1947 RIL_InitialAttachApn_v15 iaa = {};
1948
Sanket Padawe46e9ee32017-06-20 12:40:19 -07001949 if (dataProfileInfo.apn.size() == 0) {
1950 iaa.apn = (char *) calloc(1, sizeof(char));
1951 if (iaa.apn == NULL) {
1952 RLOGE("Memory allocation failed for request %s",
1953 requestToString(pRI->pCI->requestNumber));
1954 sendErrorResponse(pRI, RIL_E_NO_MEMORY);
1955 return Void();
1956 }
1957 iaa.apn[0] = '\0';
1958 } else {
1959 if (!copyHidlStringToRil(&iaa.apn, dataProfileInfo.apn, pRI)) {
1960 return Void();
1961 }
Jack Yuffc06452017-02-13 11:21:00 -08001962 }
Sanket Padawe46e9ee32017-06-20 12:40:19 -07001963
Jack Yuffc06452017-02-13 11:21:00 -08001964 if (!copyHidlStringToRil(&iaa.protocol, dataProfileInfo.protocol, pRI)) {
Jack Yuc22b3de2017-04-14 00:08:06 -07001965 memsetAndFreeStrings(1, iaa.apn);
Jack Yuffc06452017-02-13 11:21:00 -08001966 return Void();
1967 }
1968 if (!copyHidlStringToRil(&iaa.roamingProtocol, dataProfileInfo.roamingProtocol, pRI)) {
Jack Yuc22b3de2017-04-14 00:08:06 -07001969 memsetAndFreeStrings(2, iaa.apn, iaa.protocol);
Jack Yuffc06452017-02-13 11:21:00 -08001970 return Void();
1971 }
1972 iaa.authtype = (int) dataProfileInfo.authType;
1973 if (!copyHidlStringToRil(&iaa.username, dataProfileInfo.user, pRI)) {
Jack Yuc22b3de2017-04-14 00:08:06 -07001974 memsetAndFreeStrings(3, iaa.apn, iaa.protocol, iaa.roamingProtocol);
Jack Yuffc06452017-02-13 11:21:00 -08001975 return Void();
1976 }
1977 if (!copyHidlStringToRil(&iaa.password, dataProfileInfo.password, pRI)) {
Jack Yuc22b3de2017-04-14 00:08:06 -07001978 memsetAndFreeStrings(4, iaa.apn, iaa.protocol, iaa.roamingProtocol, iaa.username);
Jack Yuffc06452017-02-13 11:21:00 -08001979 return Void();
1980 }
1981 iaa.supportedTypesBitmask = dataProfileInfo.supportedApnTypesBitmap;
1982 iaa.bearerBitmask = dataProfileInfo.bearerBitmap;
1983 iaa.modemCognitive = BOOL_TO_INT(modemCognitive);
1984 iaa.mtu = dataProfileInfo.mtu;
1985
Jack Yu8b489142017-04-13 20:55:03 -07001986 if (!convertMvnoTypeToString(dataProfileInfo.mvnoType, iaa.mvnoType)) {
Jack Yuffc06452017-02-13 11:21:00 -08001987 sendErrorResponse(pRI, RIL_E_INVALID_ARGUMENTS);
Jack Yuc22b3de2017-04-14 00:08:06 -07001988 memsetAndFreeStrings(5, iaa.apn, iaa.protocol, iaa.roamingProtocol, iaa.username,
1989 iaa.password);
Jack Yuffc06452017-02-13 11:21:00 -08001990 return Void();
1991 }
1992
1993 if (!copyHidlStringToRil(&iaa.mvnoMatchData, dataProfileInfo.mvnoMatchData, pRI)) {
Jack Yuc22b3de2017-04-14 00:08:06 -07001994 memsetAndFreeStrings(5, iaa.apn, iaa.protocol, iaa.roamingProtocol, iaa.username,
1995 iaa.password);
Jack Yuffc06452017-02-13 11:21:00 -08001996 return Void();
1997 }
1998
Amit Mahajan93f603c2017-05-15 16:41:44 -07001999 CALL_ONREQUEST(RIL_REQUEST_SET_INITIAL_ATTACH_APN, &iaa, sizeof(iaa), pRI, mSlotId);
Jack Yuffc06452017-02-13 11:21:00 -08002000
2001 memsetAndFreeStrings(6, iaa.apn, iaa.protocol, iaa.roamingProtocol, iaa.username,
2002 iaa.password, iaa.mvnoMatchData);
2003 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002004
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002005 return Void();
2006}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002007
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002008Return<void> RadioImpl::getImsRegistrationState(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002009#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002010 RLOGD("getImsRegistrationState: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002011#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002012 dispatchVoid(serial, mSlotId, RIL_REQUEST_IMS_REGISTRATION_STATE);
2013 return Void();
2014}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002015
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002016bool dispatchImsGsmSms(const ImsSmsMessage& message, RequestInfo *pRI) {
Jack Yuf68e0da2017-02-07 14:53:09 -08002017 RIL_IMS_SMS_Message rism = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002018 char **pStrings;
2019 int countStrings = 2;
2020 int dataLen = sizeof(char *) * countStrings;
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002021
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002022 rism.tech = RADIO_TECH_3GPP;
2023 rism.retry = BOOL_TO_INT(message.retry);
2024 rism.messageRef = message.messageRef;
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002025
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002026 if (message.gsmMessage.size() != 1) {
2027 RLOGE("dispatchImsGsmSms: Invalid len %s", requestToString(pRI->pCI->requestNumber));
Jack Yuffc06452017-02-13 11:21:00 -08002028 sendErrorResponse(pRI, RIL_E_INVALID_ARGUMENTS);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002029 return false;
2030 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002031
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002032 pStrings = (char **)calloc(countStrings, sizeof(char *));
2033 if (pStrings == NULL) {
2034 RLOGE("dispatchImsGsmSms: Memory allocation failed for request %s",
2035 requestToString(pRI->pCI->requestNumber));
Jack Yuffc06452017-02-13 11:21:00 -08002036 sendErrorResponse(pRI, RIL_E_NO_MEMORY);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002037 return false;
2038 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002039
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002040 if (!copyHidlStringToRil(&pStrings[0], message.gsmMessage[0].smscPdu, pRI)) {
2041#ifdef MEMSET_FREED
2042 memset(pStrings, 0, datalen);
2043#endif
2044 free(pStrings);
2045 return false;
2046 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002047
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002048 if (!copyHidlStringToRil(&pStrings[1], message.gsmMessage[0].pdu, pRI)) {
2049 memsetAndFreeStrings(1, pStrings[0]);
2050#ifdef MEMSET_FREED
2051 memset(pStrings, 0, datalen);
2052#endif
2053 free(pStrings);
2054 return false;
2055 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002056
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002057 rism.message.gsmMessage = pStrings;
Amit Mahajan93f603c2017-05-15 16:41:44 -07002058 CALL_ONREQUEST(pRI->pCI->requestNumber, &rism, sizeof(RIL_RadioTechnologyFamily) +
2059 sizeof(uint8_t) + sizeof(int32_t) + dataLen, pRI, pRI->socket_id);
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002060
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002061 for (int i = 0 ; i < countStrings ; i++) {
2062 memsetAndFreeStrings(1, pStrings[i]);
2063 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002064
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002065#ifdef MEMSET_FREED
2066 memset(pStrings, 0, datalen);
2067#endif
2068 free(pStrings);
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002069
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002070 return true;
2071}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002072
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002073bool dispatchImsCdmaSms(const ImsSmsMessage& message, RequestInfo *pRI) {
Jack Yuc22b3de2017-04-14 00:08:06 -07002074 RIL_IMS_SMS_Message rism = {};
2075 RIL_CDMA_SMS_Message rcsm = {};
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002076
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002077 if (message.cdmaMessage.size() != 1) {
2078 RLOGE("dispatchImsCdmaSms: Invalid len %s", requestToString(pRI->pCI->requestNumber));
Jack Yuffc06452017-02-13 11:21:00 -08002079 sendErrorResponse(pRI, RIL_E_INVALID_ARGUMENTS);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002080 return false;
2081 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002082
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002083 rism.tech = RADIO_TECH_3GPP2;
2084 rism.retry = BOOL_TO_INT(message.retry);
2085 rism.messageRef = message.messageRef;
2086 rism.message.cdmaMessage = &rcsm;
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002087
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002088 constructCdmaSms(rcsm, message.cdmaMessage[0]);
2089
Amit Mahajan93f603c2017-05-15 16:41:44 -07002090 CALL_ONREQUEST(pRI->pCI->requestNumber, &rism, sizeof(RIL_RadioTechnologyFamily) +
2091 sizeof(uint8_t) + sizeof(int32_t) + sizeof(rcsm), pRI, pRI->socket_id);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002092
2093 return true;
2094}
2095
2096Return<void> RadioImpl::sendImsSms(int32_t serial, const ImsSmsMessage& message) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002097#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002098 RLOGD("sendImsSms: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002099#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002100 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_IMS_SEND_SMS);
2101 if (pRI == NULL) {
2102 return Void();
2103 }
2104
2105 RIL_RadioTechnologyFamily format = (RIL_RadioTechnologyFamily) message.tech;
2106
2107 if (RADIO_TECH_3GPP == format) {
2108 dispatchImsGsmSms(message, pRI);
2109 } else if (RADIO_TECH_3GPP2 == format) {
2110 dispatchImsCdmaSms(message, pRI);
2111 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08002112 RLOGE("sendImsSms: Invalid radio tech %s",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002113 requestToString(pRI->pCI->requestNumber));
Jack Yuffc06452017-02-13 11:21:00 -08002114 sendErrorResponse(pRI, RIL_E_INVALID_ARGUMENTS);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002115 }
2116 return Void();
2117}
2118
2119Return<void> RadioImpl::iccTransmitApduBasicChannel(int32_t serial, const SimApdu& message) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002120#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002121 RLOGD("iccTransmitApduBasicChannel: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002122#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002123 dispatchIccApdu(serial, mSlotId, RIL_REQUEST_SIM_TRANSMIT_APDU_BASIC, message);
2124 return Void();
2125}
2126
Wileen Chiud6222e02015-11-23 14:25:22 -08002127Return<void> RadioImpl::iccOpenLogicalChannel(int32_t serial, const hidl_string& aid, int32_t p2) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002128#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002129 RLOGD("iccOpenLogicalChannel: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002130#endif
Wileen Chiud6222e02015-11-23 14:25:22 -08002131 if (s_vendorFunctions->version < 15) {
2132 dispatchString(serial, mSlotId, RIL_REQUEST_SIM_OPEN_CHANNEL, aid.c_str());
2133 } else {
2134 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_SIM_OPEN_CHANNEL);
2135 if (pRI == NULL) {
2136 return Void();
2137 }
2138
Jack Yuc22b3de2017-04-14 00:08:06 -07002139 RIL_OpenChannelParams params = {};
Wileen Chiud6222e02015-11-23 14:25:22 -08002140
2141 params.p2 = p2;
2142
2143 if (!copyHidlStringToRil(&params.aidPtr, aid, pRI)) {
2144 return Void();
2145 }
2146
Amit Mahajan93f603c2017-05-15 16:41:44 -07002147 CALL_ONREQUEST(pRI->pCI->requestNumber, &params, sizeof(params), pRI, mSlotId);
Wileen Chiud6222e02015-11-23 14:25:22 -08002148
2149 memsetAndFreeStrings(1, params.aidPtr);
2150 }
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002151 return Void();
2152}
2153
2154Return<void> RadioImpl::iccCloseLogicalChannel(int32_t serial, int32_t channelId) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002155#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002156 RLOGD("iccCloseLogicalChannel: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002157#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002158 dispatchInts(serial, mSlotId, RIL_REQUEST_SIM_CLOSE_CHANNEL, 1, channelId);
2159 return Void();
2160}
2161
2162Return<void> RadioImpl::iccTransmitApduLogicalChannel(int32_t serial, const SimApdu& message) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002163#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002164 RLOGD("iccTransmitApduLogicalChannel: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002165#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002166 dispatchIccApdu(serial, mSlotId, RIL_REQUEST_SIM_TRANSMIT_APDU_CHANNEL, message);
2167 return Void();
2168}
2169
2170Return<void> RadioImpl::nvReadItem(int32_t serial, NvItem itemId) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002171#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002172 RLOGD("nvReadItem: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002173#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002174 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_NV_READ_ITEM);
2175 if (pRI == NULL) {
2176 return Void();
2177 }
2178
Jack Yuc22b3de2017-04-14 00:08:06 -07002179 RIL_NV_ReadItem nvri = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002180 nvri.itemID = (RIL_NV_Item) itemId;
2181
Amit Mahajan93f603c2017-05-15 16:41:44 -07002182 CALL_ONREQUEST(pRI->pCI->requestNumber, &nvri, sizeof(nvri), pRI, mSlotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002183 return Void();
2184}
2185
2186Return<void> RadioImpl::nvWriteItem(int32_t serial, const NvWriteItem& item) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002187#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002188 RLOGD("nvWriteItem: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002189#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002190 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_NV_WRITE_ITEM);
2191 if (pRI == NULL) {
2192 return Void();
2193 }
2194
Jack Yuc22b3de2017-04-14 00:08:06 -07002195 RIL_NV_WriteItem nvwi = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002196
2197 nvwi.itemID = (RIL_NV_Item) item.itemId;
2198
2199 if (!copyHidlStringToRil(&nvwi.value, item.value, pRI)) {
2200 return Void();
2201 }
2202
Amit Mahajan93f603c2017-05-15 16:41:44 -07002203 CALL_ONREQUEST(pRI->pCI->requestNumber, &nvwi, sizeof(nvwi), pRI, mSlotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002204
2205 memsetAndFreeStrings(1, nvwi.value);
2206 return Void();
2207}
2208
2209Return<void> RadioImpl::nvWriteCdmaPrl(int32_t serial, const hidl_vec<uint8_t>& prl) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002210#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002211 RLOGD("nvWriteCdmaPrl: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002212#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002213 dispatchRaw(serial, mSlotId, RIL_REQUEST_NV_WRITE_CDMA_PRL, prl);
2214 return Void();
2215}
2216
2217Return<void> RadioImpl::nvResetConfig(int32_t serial, ResetNvType resetType) {
Jayachandran C587713a2017-04-30 10:21:14 -07002218 int rilResetType = -1;
Jayachandran C572f2f42017-03-25 14:30:13 -07002219#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002220 RLOGD("nvResetConfig: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002221#endif
Jayachandran C587713a2017-04-30 10:21:14 -07002222 /* Convert ResetNvType to RIL.h values
2223 * RIL_REQUEST_NV_RESET_CONFIG
2224 * 1 - reload all NV items
2225 * 2 - erase NV reset (SCRTN)
2226 * 3 - factory reset (RTN)
2227 */
2228 switch(resetType) {
2229 case ResetNvType::RELOAD:
2230 rilResetType = 1;
2231 break;
2232 case ResetNvType::ERASE:
2233 rilResetType = 2;
2234 break;
2235 case ResetNvType::FACTORY_RESET:
2236 rilResetType = 3;
2237 break;
2238 }
2239 dispatchInts(serial, mSlotId, RIL_REQUEST_NV_RESET_CONFIG, 1, rilResetType);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002240 return Void();
2241}
2242
2243Return<void> RadioImpl::setUiccSubscription(int32_t serial, const SelectUiccSub& uiccSub) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002244#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002245 RLOGD("setUiccSubscription: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002246#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002247 RequestInfo *pRI = android::addRequestToList(serial, mSlotId,
2248 RIL_REQUEST_SET_UICC_SUBSCRIPTION);
2249 if (pRI == NULL) {
2250 return Void();
2251 }
2252
Jack Yuf68e0da2017-02-07 14:53:09 -08002253 RIL_SelectUiccSub rilUiccSub = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002254
2255 rilUiccSub.slot = uiccSub.slot;
2256 rilUiccSub.app_index = uiccSub.appIndex;
2257 rilUiccSub.sub_type = (RIL_SubscriptionType) uiccSub.subType;
2258 rilUiccSub.act_status = (RIL_UiccSubActStatus) uiccSub.actStatus;
2259
Amit Mahajan93f603c2017-05-15 16:41:44 -07002260 CALL_ONREQUEST(pRI->pCI->requestNumber, &rilUiccSub, sizeof(rilUiccSub), pRI, mSlotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002261 return Void();
2262}
2263
2264Return<void> RadioImpl::setDataAllowed(int32_t serial, bool allow) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002265#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002266 RLOGD("setDataAllowed: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002267#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002268 dispatchInts(serial, mSlotId, RIL_REQUEST_ALLOW_DATA, 1, BOOL_TO_INT(allow));
2269 return Void();
2270}
2271
2272Return<void> RadioImpl::getHardwareConfig(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002273#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002274 RLOGD("getHardwareConfig: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002275#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002276 dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_HARDWARE_CONFIG);
2277 return Void();
2278}
2279
2280Return<void> RadioImpl::requestIccSimAuthentication(int32_t serial, int32_t authContext,
2281 const hidl_string& authData, const hidl_string& aid) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002282#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002283 RLOGD("requestIccSimAuthentication: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002284#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002285 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_SIM_AUTHENTICATION);
2286 if (pRI == NULL) {
2287 return Void();
2288 }
2289
Jack Yuc22b3de2017-04-14 00:08:06 -07002290 RIL_SimAuthentication pf = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002291
2292 pf.authContext = authContext;
2293
2294 int len;
2295 if (!copyHidlStringToRil(&pf.authData, authData, pRI)) {
2296 return Void();
2297 }
2298
2299 if (!copyHidlStringToRil(&pf.aid, aid, pRI)) {
2300 memsetAndFreeStrings(1, pf.authData);
2301 return Void();
2302 }
2303
Amit Mahajan93f603c2017-05-15 16:41:44 -07002304 CALL_ONREQUEST(pRI->pCI->requestNumber, &pf, sizeof(pf), pRI, mSlotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002305
2306 memsetAndFreeStrings(2, pf.authData, pf.aid);
2307 return Void();
2308}
2309
2310/**
Jack Yuffc06452017-02-13 11:21:00 -08002311 * @param numProfiles number of data profile
2312 * @param dataProfiles the pointer to the actual data profiles. The acceptable type is
2313 RIL_DataProfileInfo or RIL_DataProfileInfo_v15.
2314 * @param dataProfilePtrs the pointer to the pointers that point to each data profile structure
2315 * @param numfields number of string-type member in the data profile structure
2316 * @param ... the variadic parameters are pointers to each string-type member
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002317 **/
Jack Yuffc06452017-02-13 11:21:00 -08002318template <typename T>
2319void freeSetDataProfileData(int numProfiles, T *dataProfiles, T **dataProfilePtrs,
2320 int numfields, ...) {
2321 va_list args;
2322 va_start(args, numfields);
2323
2324 // Iterate through each string-type field that need to be free.
2325 for (int i = 0; i < numfields; i++) {
2326 // Iterate through each data profile and free that specific string-type field.
2327 // The type 'char *T::*' is a type of pointer to a 'char *' member inside T structure.
2328 char *T::*ptr = va_arg(args, char *T::*);
2329 for (int j = 0; j < numProfiles; j++) {
2330 memsetAndFreeStrings(1, dataProfiles[j].*ptr);
2331 }
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002332 }
2333
Jack Yuffc06452017-02-13 11:21:00 -08002334 va_end(args);
2335
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002336#ifdef MEMSET_FREED
Jack Yuffc06452017-02-13 11:21:00 -08002337 memset(dataProfiles, 0, numProfiles * sizeof(T));
2338 memset(dataProfilePtrs, 0, numProfiles * sizeof(T *));
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002339#endif
2340 free(dataProfiles);
2341 free(dataProfilePtrs);
2342}
2343
Jack Yuffc06452017-02-13 11:21:00 -08002344Return<void> RadioImpl::setDataProfile(int32_t serial, const hidl_vec<DataProfileInfo>& profiles,
2345 bool isRoaming) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002346#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002347 RLOGD("setDataProfile: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002348#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002349 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_SET_DATA_PROFILE);
2350 if (pRI == NULL) {
2351 return Void();
2352 }
2353
Jack Yuffc06452017-02-13 11:21:00 -08002354 size_t num = profiles.size();
2355 bool success = false;
2356
2357 if (s_vendorFunctions->version <= 14) {
2358
2359 RIL_DataProfileInfo *dataProfiles =
2360 (RIL_DataProfileInfo *) calloc(num, sizeof(RIL_DataProfileInfo));
2361
2362 if (dataProfiles == NULL) {
2363 RLOGE("Memory allocation failed for request %s",
2364 requestToString(pRI->pCI->requestNumber));
2365 sendErrorResponse(pRI, RIL_E_NO_MEMORY);
2366 return Void();
2367 }
2368
2369 RIL_DataProfileInfo **dataProfilePtrs =
2370 (RIL_DataProfileInfo **) calloc(num, sizeof(RIL_DataProfileInfo *));
2371 if (dataProfilePtrs == NULL) {
2372 RLOGE("Memory allocation failed for request %s",
2373 requestToString(pRI->pCI->requestNumber));
2374 free(dataProfiles);
2375 sendErrorResponse(pRI, RIL_E_NO_MEMORY);
2376 return Void();
2377 }
2378
2379 for (size_t i = 0; i < num; i++) {
2380 dataProfilePtrs[i] = &dataProfiles[i];
2381
2382 success = copyHidlStringToRil(&dataProfiles[i].apn, profiles[i].apn, pRI);
2383
2384 const hidl_string &protocol =
2385 (isRoaming ? profiles[i].roamingProtocol : profiles[i].protocol);
2386
2387 if (success && !copyHidlStringToRil(&dataProfiles[i].protocol, protocol, pRI)) {
2388 success = false;
2389 }
2390
2391 if (success && !copyHidlStringToRil(&dataProfiles[i].user, profiles[i].user, pRI)) {
2392 success = false;
2393 }
2394 if (success && !copyHidlStringToRil(&dataProfiles[i].password, profiles[i].password,
2395 pRI)) {
2396 success = false;
2397 }
2398
2399 if (!success) {
2400 freeSetDataProfileData(num, dataProfiles, dataProfilePtrs, 4,
2401 &RIL_DataProfileInfo::apn, &RIL_DataProfileInfo::protocol,
2402 &RIL_DataProfileInfo::user, &RIL_DataProfileInfo::password);
2403 return Void();
2404 }
2405
2406 dataProfiles[i].profileId = (RIL_DataProfile) profiles[i].profileId;
2407 dataProfiles[i].authType = (int) profiles[i].authType;
2408 dataProfiles[i].type = (int) profiles[i].type;
2409 dataProfiles[i].maxConnsTime = profiles[i].maxConnsTime;
2410 dataProfiles[i].maxConns = profiles[i].maxConns;
2411 dataProfiles[i].waitTime = profiles[i].waitTime;
2412 dataProfiles[i].enabled = BOOL_TO_INT(profiles[i].enabled);
2413 }
2414
Amit Mahajan93f603c2017-05-15 16:41:44 -07002415 CALL_ONREQUEST(RIL_REQUEST_SET_DATA_PROFILE, dataProfilePtrs,
2416 num * sizeof(RIL_DataProfileInfo *), pRI, mSlotId);
Jack Yuffc06452017-02-13 11:21:00 -08002417
2418 freeSetDataProfileData(num, dataProfiles, dataProfilePtrs, 4,
2419 &RIL_DataProfileInfo::apn, &RIL_DataProfileInfo::protocol,
2420 &RIL_DataProfileInfo::user, &RIL_DataProfileInfo::password);
2421 } else {
2422 RIL_DataProfileInfo_v15 *dataProfiles =
2423 (RIL_DataProfileInfo_v15 *) calloc(num, sizeof(RIL_DataProfileInfo_v15));
2424
2425 if (dataProfiles == NULL) {
2426 RLOGE("Memory allocation failed for request %s",
2427 requestToString(pRI->pCI->requestNumber));
2428 sendErrorResponse(pRI, RIL_E_NO_MEMORY);
2429 return Void();
2430 }
2431
2432 RIL_DataProfileInfo_v15 **dataProfilePtrs =
2433 (RIL_DataProfileInfo_v15 **) calloc(num, sizeof(RIL_DataProfileInfo_v15 *));
2434 if (dataProfilePtrs == NULL) {
2435 RLOGE("Memory allocation failed for request %s",
2436 requestToString(pRI->pCI->requestNumber));
2437 free(dataProfiles);
2438 sendErrorResponse(pRI, RIL_E_NO_MEMORY);
2439 return Void();
2440 }
2441
2442 for (size_t i = 0; i < num; i++) {
2443 dataProfilePtrs[i] = &dataProfiles[i];
2444
2445 success = copyHidlStringToRil(&dataProfiles[i].apn, profiles[i].apn, pRI);
2446 if (success && !copyHidlStringToRil(&dataProfiles[i].protocol, profiles[i].protocol,
2447 pRI)) {
2448 success = false;
2449 }
2450 if (success && !copyHidlStringToRil(&dataProfiles[i].roamingProtocol,
2451 profiles[i].roamingProtocol, pRI)) {
2452 success = false;
2453 }
2454 if (success && !copyHidlStringToRil(&dataProfiles[i].user, profiles[i].user, pRI)) {
2455 success = false;
2456 }
2457 if (success && !copyHidlStringToRil(&dataProfiles[i].password, profiles[i].password,
2458 pRI)) {
2459 success = false;
2460 }
2461
2462 if (success && !copyHidlStringToRil(&dataProfiles[i].mvnoMatchData,
2463 profiles[i].mvnoMatchData, pRI)) {
2464 success = false;
2465 }
2466
Jack Yu8b489142017-04-13 20:55:03 -07002467 if (success && !convertMvnoTypeToString(profiles[i].mvnoType,
2468 dataProfiles[i].mvnoType)) {
2469 sendErrorResponse(pRI, RIL_E_INVALID_ARGUMENTS);
2470 success = false;
Jack Yuffc06452017-02-13 11:21:00 -08002471 }
2472
2473 if (!success) {
2474 freeSetDataProfileData(num, dataProfiles, dataProfilePtrs, 6,
2475 &RIL_DataProfileInfo_v15::apn, &RIL_DataProfileInfo_v15::protocol,
2476 &RIL_DataProfileInfo_v15::roamingProtocol, &RIL_DataProfileInfo_v15::user,
2477 &RIL_DataProfileInfo_v15::password, &RIL_DataProfileInfo_v15::mvnoMatchData);
2478 return Void();
2479 }
2480
2481 dataProfiles[i].profileId = (RIL_DataProfile) profiles[i].profileId;
2482 dataProfiles[i].authType = (int) profiles[i].authType;
2483 dataProfiles[i].type = (int) profiles[i].type;
2484 dataProfiles[i].maxConnsTime = profiles[i].maxConnsTime;
2485 dataProfiles[i].maxConns = profiles[i].maxConns;
2486 dataProfiles[i].waitTime = profiles[i].waitTime;
2487 dataProfiles[i].enabled = BOOL_TO_INT(profiles[i].enabled);
2488 dataProfiles[i].supportedTypesBitmask = profiles[i].supportedApnTypesBitmap;
2489 dataProfiles[i].bearerBitmask = profiles[i].bearerBitmap;
2490 dataProfiles[i].mtu = profiles[i].mtu;
2491 }
2492
Amit Mahajan93f603c2017-05-15 16:41:44 -07002493 CALL_ONREQUEST(RIL_REQUEST_SET_DATA_PROFILE, dataProfilePtrs,
2494 num * sizeof(RIL_DataProfileInfo_v15 *), pRI, mSlotId);
Jack Yuffc06452017-02-13 11:21:00 -08002495
2496 freeSetDataProfileData(num, dataProfiles, dataProfilePtrs, 6,
2497 &RIL_DataProfileInfo_v15::apn, &RIL_DataProfileInfo_v15::protocol,
2498 &RIL_DataProfileInfo_v15::roamingProtocol, &RIL_DataProfileInfo_v15::user,
2499 &RIL_DataProfileInfo_v15::password, &RIL_DataProfileInfo_v15::mvnoMatchData);
2500 }
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002501
2502 return Void();
2503}
2504
2505Return<void> RadioImpl::requestShutdown(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002506#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002507 RLOGD("requestShutdown: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002508#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002509 dispatchVoid(serial, mSlotId, RIL_REQUEST_SHUTDOWN);
2510 return Void();
2511}
2512
2513Return<void> RadioImpl::getRadioCapability(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002514#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002515 RLOGD("getRadioCapability: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002516#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002517 dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_RADIO_CAPABILITY);
2518 return Void();
2519}
2520
2521Return<void> RadioImpl::setRadioCapability(int32_t serial, const RadioCapability& rc) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002522#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002523 RLOGD("setRadioCapability: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002524#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002525 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_SET_RADIO_CAPABILITY);
2526 if (pRI == NULL) {
2527 return Void();
2528 }
2529
Jack Yuc22b3de2017-04-14 00:08:06 -07002530 RIL_RadioCapability rilRc = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002531
2532 // TODO : set rilRc.version using HIDL version ?
2533 rilRc.session = rc.session;
2534 rilRc.phase = (int) rc.phase;
2535 rilRc.rat = (int) rc.raf;
2536 rilRc.status = (int) rc.status;
Scott Randolph8a7c3b82017-04-03 14:06:40 -07002537 strncpy(rilRc.logicalModemUuid, rc.logicalModemUuid.c_str(), MAX_UUID_LENGTH);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002538
Amit Mahajan93f603c2017-05-15 16:41:44 -07002539 CALL_ONREQUEST(pRI->pCI->requestNumber, &rilRc, sizeof(rilRc), pRI, mSlotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002540
2541 return Void();
2542}
2543
2544Return<void> RadioImpl::startLceService(int32_t serial, int32_t reportInterval, bool pullMode) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002545#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002546 RLOGD("startLceService: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002547#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002548 dispatchInts(serial, mSlotId, RIL_REQUEST_START_LCE, 2, reportInterval,
2549 BOOL_TO_INT(pullMode));
2550 return Void();
2551}
2552
2553Return<void> RadioImpl::stopLceService(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002554#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002555 RLOGD("stopLceService: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002556#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002557 dispatchVoid(serial, mSlotId, RIL_REQUEST_STOP_LCE);
2558 return Void();
2559}
2560
2561Return<void> RadioImpl::pullLceData(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002562#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002563 RLOGD("pullLceData: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002564#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002565 dispatchVoid(serial, mSlotId, RIL_REQUEST_PULL_LCEDATA);
2566 return Void();
2567}
2568
2569Return<void> RadioImpl::getModemActivityInfo(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002570#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002571 RLOGD("getModemActivityInfo: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002572#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002573 dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_ACTIVITY_INFO);
2574 return Void();
2575}
2576
2577Return<void> RadioImpl::setAllowedCarriers(int32_t serial, bool allAllowed,
2578 const CarrierRestrictions& carriers) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002579#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002580 RLOGD("setAllowedCarriers: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002581#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002582 RequestInfo *pRI = android::addRequestToList(serial, mSlotId,
2583 RIL_REQUEST_SET_CARRIER_RESTRICTIONS);
2584 if (pRI == NULL) {
2585 return Void();
2586 }
2587
Jack Yuf68e0da2017-02-07 14:53:09 -08002588 RIL_CarrierRestrictions cr = {};
Jack Yu11ab4042017-02-21 17:08:01 -08002589 RIL_Carrier *allowedCarriers = NULL;
2590 RIL_Carrier *excludedCarriers = NULL;
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002591
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002592 cr.len_allowed_carriers = carriers.allowedCarriers.size();
2593 allowedCarriers = (RIL_Carrier *)calloc(cr.len_allowed_carriers, sizeof(RIL_Carrier));
2594 if (allowedCarriers == NULL) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08002595 RLOGE("setAllowedCarriers: Memory allocation failed for request %s",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002596 requestToString(pRI->pCI->requestNumber));
Jack Yuffc06452017-02-13 11:21:00 -08002597 sendErrorResponse(pRI, RIL_E_NO_MEMORY);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002598 return Void();
2599 }
2600 cr.allowed_carriers = allowedCarriers;
2601
2602 cr.len_excluded_carriers = carriers.excludedCarriers.size();
2603 excludedCarriers = (RIL_Carrier *)calloc(cr.len_excluded_carriers, sizeof(RIL_Carrier));
2604 if (excludedCarriers == NULL) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08002605 RLOGE("setAllowedCarriers: Memory allocation failed for request %s",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002606 requestToString(pRI->pCI->requestNumber));
Jack Yuffc06452017-02-13 11:21:00 -08002607 sendErrorResponse(pRI, RIL_E_NO_MEMORY);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002608#ifdef MEMSET_FREED
2609 memset(allowedCarriers, 0, cr.len_allowed_carriers * sizeof(RIL_Carrier));
2610#endif
2611 free(allowedCarriers);
2612 return Void();
2613 }
2614 cr.excluded_carriers = excludedCarriers;
2615
2616 for (int i = 0; i < cr.len_allowed_carriers; i++) {
Scott Randolph8a7c3b82017-04-03 14:06:40 -07002617 allowedCarriers[i].mcc = carriers.allowedCarriers[i].mcc.c_str();
2618 allowedCarriers[i].mnc = carriers.allowedCarriers[i].mnc.c_str();
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002619 allowedCarriers[i].match_type = (RIL_CarrierMatchType) carriers.allowedCarriers[i].matchType;
Scott Randolph8a7c3b82017-04-03 14:06:40 -07002620 allowedCarriers[i].match_data = carriers.allowedCarriers[i].matchData.c_str();
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002621 }
2622
Amit Mahajan3f510f62017-03-01 10:26:58 -08002623 for (int i = 0; i < cr.len_excluded_carriers; i++) {
Scott Randolph8a7c3b82017-04-03 14:06:40 -07002624 excludedCarriers[i].mcc = carriers.excludedCarriers[i].mcc.c_str();
2625 excludedCarriers[i].mnc = carriers.excludedCarriers[i].mnc.c_str();
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002626 excludedCarriers[i].match_type =
2627 (RIL_CarrierMatchType) carriers.excludedCarriers[i].matchType;
Scott Randolph8a7c3b82017-04-03 14:06:40 -07002628 excludedCarriers[i].match_data = carriers.excludedCarriers[i].matchData.c_str();
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002629 }
2630
Amit Mahajan93f603c2017-05-15 16:41:44 -07002631 CALL_ONREQUEST(pRI->pCI->requestNumber, &cr, sizeof(RIL_CarrierRestrictions), pRI, mSlotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002632
2633#ifdef MEMSET_FREED
2634 memset(allowedCarriers, 0, cr.len_allowed_carriers * sizeof(RIL_Carrier));
2635 memset(excludedCarriers, 0, cr.len_excluded_carriers * sizeof(RIL_Carrier));
2636#endif
2637 free(allowedCarriers);
2638 free(excludedCarriers);
2639 return Void();
2640}
2641
2642Return<void> RadioImpl::getAllowedCarriers(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002643#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002644 RLOGD("getAllowedCarriers: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002645#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002646 dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_CARRIER_RESTRICTIONS);
2647 return Void();
2648}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002649
Jack Yu11ab4042017-02-21 17:08:01 -08002650Return<void> RadioImpl::sendDeviceState(int32_t serial, DeviceStateType deviceStateType,
2651 bool state) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002652#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002653 RLOGD("sendDeviceState: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002654#endif
Jack Yu11ab4042017-02-21 17:08:01 -08002655 if (s_vendorFunctions->version < 15) {
2656 if (deviceStateType == DeviceStateType::LOW_DATA_EXPECTED) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08002657 RLOGD("sendDeviceState: calling screen state %d", BOOL_TO_INT(!state));
Jack Yu11ab4042017-02-21 17:08:01 -08002658 dispatchInts(serial, mSlotId, RIL_REQUEST_SCREEN_STATE, 1, BOOL_TO_INT(!state));
2659 } else {
2660 RequestInfo *pRI = android::addRequestToList(serial, mSlotId,
2661 RIL_REQUEST_SEND_DEVICE_STATE);
2662 sendErrorResponse(pRI, RIL_E_REQUEST_NOT_SUPPORTED);
2663 }
2664 return Void();
2665 }
2666 dispatchInts(serial, mSlotId, RIL_REQUEST_SEND_DEVICE_STATE, 2, (int) deviceStateType,
2667 BOOL_TO_INT(state));
2668 return Void();
2669}
2670
2671Return<void> RadioImpl::setIndicationFilter(int32_t serial, int32_t indicationFilter) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002672#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002673 RLOGD("setIndicationFilter: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002674#endif
Jack Yu11ab4042017-02-21 17:08:01 -08002675 if (s_vendorFunctions->version < 15) {
2676 RequestInfo *pRI = android::addRequestToList(serial, mSlotId,
2677 RIL_REQUEST_SET_UNSOLICITED_RESPONSE_FILTER);
2678 sendErrorResponse(pRI, RIL_E_REQUEST_NOT_SUPPORTED);
2679 return Void();
2680 }
2681 dispatchInts(serial, mSlotId, RIL_REQUEST_SET_UNSOLICITED_RESPONSE_FILTER, 1, indicationFilter);
2682 return Void();
2683}
2684
Wileen Chiu718c0bf2017-01-04 11:37:19 -08002685Return<void> RadioImpl::setSimCardPower(int32_t serial, bool powerUp) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002686#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002687 RLOGD("setSimCardPower: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002688#endif
Wileen Chiu718c0bf2017-01-04 11:37:19 -08002689 dispatchInts(serial, mSlotId, RIL_REQUEST_SET_SIM_CARD_POWER, 1, BOOL_TO_INT(powerUp));
2690 return Void();
2691}
2692
Sanket Padawef220dc52017-01-02 23:46:00 -08002693Return<void> RadioImpl::responseAcknowledgement() {
2694 android::releaseWakeLock();
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002695 return Void();
Sanket Padawef220dc52017-01-02 23:46:00 -08002696}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002697
Amit Mahajan439da362017-02-13 17:43:04 -08002698Return<void> OemHookImpl::setResponseFunctions(
2699 const ::android::sp<IOemHookResponse>& oemHookResponseParam,
2700 const ::android::sp<IOemHookIndication>& oemHookIndicationParam) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002701#if VDBG
Amit Mahajan439da362017-02-13 17:43:04 -08002702 RLOGD("OemHookImpl::setResponseFunctions");
Jayachandran C572f2f42017-03-25 14:30:13 -07002703#endif
Amit Mahajan439da362017-02-13 17:43:04 -08002704
2705 pthread_rwlock_t *radioServiceRwlockPtr = radio::getRadioServiceRwlock(mSlotId);
2706 int ret = pthread_rwlock_wrlock(radioServiceRwlockPtr);
2707 assert(ret == 0);
2708
2709 mOemHookResponse = oemHookResponseParam;
2710 mOemHookIndication = oemHookIndicationParam;
Amit Mahajand423d192017-03-16 17:04:01 -07002711 mCounterOemHook[mSlotId]++;
Amit Mahajan439da362017-02-13 17:43:04 -08002712
2713 ret = pthread_rwlock_unlock(radioServiceRwlockPtr);
2714 assert(ret == 0);
2715
2716 return Void();
2717}
2718
2719Return<void> OemHookImpl::sendRequestRaw(int32_t serial, const hidl_vec<uint8_t>& data) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002720#if VDBG
Amit Mahajan439da362017-02-13 17:43:04 -08002721 RLOGD("OemHookImpl::sendRequestRaw: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002722#endif
Amit Mahajan439da362017-02-13 17:43:04 -08002723 dispatchRaw(serial, mSlotId, RIL_REQUEST_OEM_HOOK_RAW, data);
2724 return Void();
2725}
2726
2727Return<void> OemHookImpl::sendRequestStrings(int32_t serial,
2728 const hidl_vec<hidl_string>& data) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002729#if VDBG
Amit Mahajan439da362017-02-13 17:43:04 -08002730 RLOGD("OemHookImpl::sendRequestStrings: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002731#endif
Amit Mahajan439da362017-02-13 17:43:04 -08002732 dispatchStrings(serial, mSlotId, RIL_REQUEST_OEM_HOOK_STRINGS, data);
2733 return Void();
2734}
2735
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002736/***************************************************************************************************
2737 * RESPONSE FUNCTIONS
2738 * Functions above are used for requests going from framework to vendor code. The ones below are
2739 * responses for those requests coming back from the vendor code.
2740 **************************************************************************************************/
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002741
Sanket Padawef220dc52017-01-02 23:46:00 -08002742void radio::acknowledgeRequest(int slotId, int serial) {
2743 if (radioService[slotId]->mRadioResponse != NULL) {
Amit Mahajan17249842017-01-19 15:05:45 -08002744 Return<void> retStatus = radioService[slotId]->mRadioResponse->acknowledgeRequest(serial);
2745 radioService[slotId]->checkReturnStatus(retStatus);
Sanket Padawef220dc52017-01-02 23:46:00 -08002746 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08002747 RLOGE("acknowledgeRequest: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawef220dc52017-01-02 23:46:00 -08002748 }
2749}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002750
Sanket Padawef220dc52017-01-02 23:46:00 -08002751void populateResponseInfo(RadioResponseInfo& responseInfo, int serial, int responseType,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002752 RIL_Errno e) {
Sanket Padawef220dc52017-01-02 23:46:00 -08002753 responseInfo.serial = serial;
2754 switch (responseType) {
2755 case RESPONSE_SOLICITED:
2756 responseInfo.type = RadioResponseType::SOLICITED;
2757 break;
2758 case RESPONSE_SOLICITED_ACK_EXP:
2759 responseInfo.type = RadioResponseType::SOLICITED_ACK_EXP;
2760 break;
2761 }
2762 responseInfo.error = (RadioError) e;
2763}
2764
Naveen Kalla346bbc02017-03-16 12:55:55 -07002765int responseIntOrEmpty(RadioResponseInfo& responseInfo, int serial, int responseType, RIL_Errno e,
2766 void *response, size_t responseLen) {
2767 populateResponseInfo(responseInfo, serial, responseType, e);
2768 int ret = -1;
2769
2770 if (response == NULL && responseLen == 0) {
2771 // Earlier RILs did not send a response for some cases although the interface
2772 // expected an integer as response. Do not return error if response is empty. Instead
2773 // Return -1 in those cases to maintain backward compatibility.
2774 } else if (response == NULL || responseLen != sizeof(int)) {
2775 RLOGE("responseIntOrEmpty: Invalid response");
2776 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
2777 } else {
2778 int *p_int = (int *) response;
2779 ret = p_int[0];
2780 }
2781 return ret;
2782}
2783
Sanket Padawef220dc52017-01-02 23:46:00 -08002784int responseInt(RadioResponseInfo& responseInfo, int serial, int responseType, RIL_Errno e,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002785 void *response, size_t responseLen) {
Sanket Padawef220dc52017-01-02 23:46:00 -08002786 populateResponseInfo(responseInfo, serial, responseType, e);
2787 int ret = -1;
2788
2789 if (response == NULL || responseLen != sizeof(int)) {
2790 RLOGE("responseInt: Invalid response");
2791 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
2792 } else {
2793 int *p_int = (int *) response;
2794 ret = p_int[0];
2795 }
2796 return ret;
2797}
2798
Amit Mahajan759786a2017-03-03 17:35:47 -08002799int radio::getIccCardStatusResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002800 int responseType, int serial, RIL_Errno e,
2801 void *response, size_t responseLen) {
Sanket Padawef220dc52017-01-02 23:46:00 -08002802 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08002803 RadioResponseInfo responseInfo = {};
Sanket Padawef220dc52017-01-02 23:46:00 -08002804 populateResponseInfo(responseInfo, serial, responseType, e);
Jack Yuf68e0da2017-02-07 14:53:09 -08002805 CardStatus cardStatus = {};
Sanket Padawef220dc52017-01-02 23:46:00 -08002806 if (response == NULL || responseLen != sizeof(RIL_CardStatus_v6)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08002807 RLOGE("getIccCardStatusResponse: Invalid response");
Sanket Padawef220dc52017-01-02 23:46:00 -08002808 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002809 } else {
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002810 RIL_CardStatus_v6 *p_cur = ((RIL_CardStatus_v6 *) response);
2811 cardStatus.cardState = (CardState) p_cur->card_state;
2812 cardStatus.universalPinState = (PinState) p_cur->universal_pin_state;
2813 cardStatus.gsmUmtsSubscriptionAppIndex = p_cur->gsm_umts_subscription_app_index;
2814 cardStatus.cdmaSubscriptionAppIndex = p_cur->cdma_subscription_app_index;
2815 cardStatus.imsSubscriptionAppIndex = p_cur->ims_subscription_app_index;
2816
2817 RIL_AppStatus *rilAppStatus = p_cur->applications;
2818 cardStatus.applications.resize(p_cur->num_applications);
2819 AppStatus *appStatus = cardStatus.applications.data();
Jayachandran C572f2f42017-03-25 14:30:13 -07002820#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002821 RLOGD("getIccCardStatusResponse: num_applications %d", p_cur->num_applications);
Jayachandran C572f2f42017-03-25 14:30:13 -07002822#endif
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002823 for (int i = 0; i < p_cur->num_applications; i++) {
2824 appStatus[i].appType = (AppType) rilAppStatus[i].app_type;
2825 appStatus[i].appState = (AppState) rilAppStatus[i].app_state;
2826 appStatus[i].persoSubstate = (PersoSubstate) rilAppStatus[i].perso_substate;
2827 appStatus[i].aidPtr = convertCharPtrToHidlString(rilAppStatus[i].aid_ptr);
2828 appStatus[i].appLabelPtr = convertCharPtrToHidlString(
2829 rilAppStatus[i].app_label_ptr);
2830 appStatus[i].pin1Replaced = rilAppStatus[i].pin1_replaced;
2831 appStatus[i].pin1 = (PinState) rilAppStatus[i].pin1;
2832 appStatus[i].pin2 = (PinState) rilAppStatus[i].pin2;
2833 }
2834 }
2835
Amit Mahajan17249842017-01-19 15:05:45 -08002836 Return<void> retStatus = radioService[slotId]->mRadioResponse->
2837 getIccCardStatusResponse(responseInfo, cardStatus);
2838 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002839 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08002840 RLOGE("getIccCardStatusResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawef220dc52017-01-02 23:46:00 -08002841 }
2842
2843 return 0;
2844}
2845
Amit Mahajan759786a2017-03-03 17:35:47 -08002846int radio::supplyIccPinForAppResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002847 int responseType, int serial, RIL_Errno e,
2848 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002849#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002850 RLOGD("supplyIccPinForAppResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002851#endif
Sanket Padawef220dc52017-01-02 23:46:00 -08002852
2853 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08002854 RadioResponseInfo responseInfo = {};
Naveen Kalla346bbc02017-03-16 12:55:55 -07002855 int ret = responseIntOrEmpty(responseInfo, serial, responseType, e, response, responseLen);
Amit Mahajan17249842017-01-19 15:05:45 -08002856 Return<void> retStatus = radioService[slotId]->mRadioResponse->
2857 supplyIccPinForAppResponse(responseInfo, ret);
Amit Mahajan93f603c2017-05-15 16:41:44 -07002858 RLOGE("supplyIccPinForAppResponse: amit ret %d", ret);
Amit Mahajan17249842017-01-19 15:05:45 -08002859 radioService[slotId]->checkReturnStatus(retStatus);
Sanket Padawef220dc52017-01-02 23:46:00 -08002860 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08002861 RLOGE("supplyIccPinForAppResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawef220dc52017-01-02 23:46:00 -08002862 slotId);
2863 }
2864
2865 return 0;
2866}
2867
Amit Mahajan759786a2017-03-03 17:35:47 -08002868int radio::supplyIccPukForAppResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002869 int responseType, int serial, RIL_Errno e,
2870 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002871#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002872 RLOGD("supplyIccPukForAppResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002873#endif
Sanket Padawef220dc52017-01-02 23:46:00 -08002874
2875 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08002876 RadioResponseInfo responseInfo = {};
Naveen Kalla346bbc02017-03-16 12:55:55 -07002877 int ret = responseIntOrEmpty(responseInfo, serial, responseType, e, response, responseLen);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002878 Return<void> retStatus = radioService[slotId]->mRadioResponse->supplyIccPukForAppResponse(
2879 responseInfo, ret);
Amit Mahajan17249842017-01-19 15:05:45 -08002880 radioService[slotId]->checkReturnStatus(retStatus);
Sanket Padawef220dc52017-01-02 23:46:00 -08002881 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08002882 RLOGE("supplyIccPukForAppResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawef220dc52017-01-02 23:46:00 -08002883 slotId);
2884 }
2885
2886 return 0;
2887}
2888
Amit Mahajan759786a2017-03-03 17:35:47 -08002889int radio::supplyIccPin2ForAppResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002890 int responseType, int serial, RIL_Errno e,
2891 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002892#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002893 RLOGD("supplyIccPin2ForAppResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002894#endif
Sanket Padawef220dc52017-01-02 23:46:00 -08002895
2896 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08002897 RadioResponseInfo responseInfo = {};
Naveen Kalla346bbc02017-03-16 12:55:55 -07002898 int ret = responseIntOrEmpty(responseInfo, serial, responseType, e, response, responseLen);
Amit Mahajan17249842017-01-19 15:05:45 -08002899 Return<void> retStatus = radioService[slotId]->mRadioResponse->
2900 supplyIccPin2ForAppResponse(responseInfo, ret);
2901 radioService[slotId]->checkReturnStatus(retStatus);
Sanket Padawef220dc52017-01-02 23:46:00 -08002902 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08002903 RLOGE("supplyIccPin2ForAppResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawef220dc52017-01-02 23:46:00 -08002904 slotId);
2905 }
2906
2907 return 0;
2908}
2909
Amit Mahajan759786a2017-03-03 17:35:47 -08002910int radio::supplyIccPuk2ForAppResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002911 int responseType, int serial, RIL_Errno e,
2912 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002913#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002914 RLOGD("supplyIccPuk2ForAppResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002915#endif
Sanket Padawef220dc52017-01-02 23:46:00 -08002916
2917 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08002918 RadioResponseInfo responseInfo = {};
Naveen Kalla346bbc02017-03-16 12:55:55 -07002919 int ret = responseIntOrEmpty(responseInfo, serial, responseType, e, response, responseLen);
Amit Mahajan17249842017-01-19 15:05:45 -08002920 Return<void> retStatus = radioService[slotId]->mRadioResponse->
2921 supplyIccPuk2ForAppResponse(responseInfo, ret);
2922 radioService[slotId]->checkReturnStatus(retStatus);
Sanket Padawef220dc52017-01-02 23:46:00 -08002923 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08002924 RLOGE("supplyIccPuk2ForAppResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawef220dc52017-01-02 23:46:00 -08002925 slotId);
2926 }
2927
2928 return 0;
2929}
2930
Amit Mahajan759786a2017-03-03 17:35:47 -08002931int radio::changeIccPinForAppResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002932 int responseType, int serial, RIL_Errno e,
2933 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002934#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002935 RLOGD("changeIccPinForAppResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002936#endif
Sanket Padawef220dc52017-01-02 23:46:00 -08002937
2938 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08002939 RadioResponseInfo responseInfo = {};
Naveen Kalla346bbc02017-03-16 12:55:55 -07002940 int ret = responseIntOrEmpty(responseInfo, serial, responseType, e, response, responseLen);
Amit Mahajan17249842017-01-19 15:05:45 -08002941 Return<void> retStatus = radioService[slotId]->mRadioResponse->
2942 changeIccPinForAppResponse(responseInfo, ret);
2943 radioService[slotId]->checkReturnStatus(retStatus);
Sanket Padawef220dc52017-01-02 23:46:00 -08002944 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08002945 RLOGE("changeIccPinForAppResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawef220dc52017-01-02 23:46:00 -08002946 slotId);
2947 }
2948
2949 return 0;
2950}
2951
Amit Mahajan759786a2017-03-03 17:35:47 -08002952int radio::changeIccPin2ForAppResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002953 int responseType, int serial, RIL_Errno e,
2954 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002955#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002956 RLOGD("changeIccPin2ForAppResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002957#endif
Sanket Padawef220dc52017-01-02 23:46:00 -08002958
2959 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08002960 RadioResponseInfo responseInfo = {};
Naveen Kalla346bbc02017-03-16 12:55:55 -07002961 int ret = responseIntOrEmpty(responseInfo, serial, responseType, e, response, responseLen);
Amit Mahajan17249842017-01-19 15:05:45 -08002962 Return<void> retStatus = radioService[slotId]->mRadioResponse->
2963 changeIccPin2ForAppResponse(responseInfo, ret);
2964 radioService[slotId]->checkReturnStatus(retStatus);
Sanket Padawef220dc52017-01-02 23:46:00 -08002965 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08002966 RLOGE("changeIccPin2ForAppResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawef220dc52017-01-02 23:46:00 -08002967 slotId);
2968 }
2969
2970 return 0;
2971}
2972
Amit Mahajan759786a2017-03-03 17:35:47 -08002973int radio::supplyNetworkDepersonalizationResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002974 int responseType, int serial, RIL_Errno e,
2975 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002976#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002977 RLOGD("supplyNetworkDepersonalizationResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002978#endif
Sanket Padawef220dc52017-01-02 23:46:00 -08002979
2980 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08002981 RadioResponseInfo responseInfo = {};
Naveen Kalla346bbc02017-03-16 12:55:55 -07002982 int ret = responseIntOrEmpty(responseInfo, serial, responseType, e, response, responseLen);
Amit Mahajan17249842017-01-19 15:05:45 -08002983 Return<void> retStatus = radioService[slotId]->mRadioResponse->
2984 supplyNetworkDepersonalizationResponse(responseInfo, ret);
2985 radioService[slotId]->checkReturnStatus(retStatus);
Sanket Padawef220dc52017-01-02 23:46:00 -08002986 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08002987 RLOGE("supplyNetworkDepersonalizationResponse: radioService[%d]->mRadioResponse == "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002988 "NULL", slotId);
Sanket Padawef220dc52017-01-02 23:46:00 -08002989 }
2990
2991 return 0;
2992}
2993
Amit Mahajan759786a2017-03-03 17:35:47 -08002994int radio::getCurrentCallsResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002995 int responseType, int serial, RIL_Errno e,
2996 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002997#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002998 RLOGD("getCurrentCallsResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002999#endif
Sanket Padawef220dc52017-01-02 23:46:00 -08003000
3001 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003002 RadioResponseInfo responseInfo = {};
Sanket Padawef220dc52017-01-02 23:46:00 -08003003 populateResponseInfo(responseInfo, serial, responseType, e);
3004
3005 hidl_vec<Call> calls;
Amit Mahajan13058cb2017-06-07 23:10:27 -07003006 if ((response == NULL && responseLen != 0)
3007 || (responseLen % sizeof(RIL_Call *)) != 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003008 RLOGE("getCurrentCallsResponse: Invalid response");
Amit Mahajan5829a472016-12-28 17:28:07 -08003009 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
Sanket Padawef220dc52017-01-02 23:46:00 -08003010 } else {
3011 int num = responseLen / sizeof(RIL_Call *);
3012 calls.resize(num);
3013
3014 for (int i = 0 ; i < num ; i++) {
3015 RIL_Call *p_cur = ((RIL_Call **) response)[i];
3016 /* each call info */
3017 calls[i].state = (CallState) p_cur->state;
3018 calls[i].index = p_cur->index;
3019 calls[i].toa = p_cur->toa;
3020 calls[i].isMpty = p_cur->isMpty;
3021 calls[i].isMT = p_cur->isMT;
3022 calls[i].als = p_cur->als;
3023 calls[i].isVoice = p_cur->isVoice;
3024 calls[i].isVoicePrivacy = p_cur->isVoicePrivacy;
3025 calls[i].number = convertCharPtrToHidlString(p_cur->number);
3026 calls[i].numberPresentation = (CallPresentation) p_cur->numberPresentation;
3027 calls[i].name = convertCharPtrToHidlString(p_cur->name);
3028 calls[i].namePresentation = (CallPresentation) p_cur->namePresentation;
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003029 if (p_cur->uusInfo != NULL && p_cur->uusInfo->uusData != NULL) {
Sanket Padawef220dc52017-01-02 23:46:00 -08003030 RIL_UUS_Info *uusInfo = p_cur->uusInfo;
3031 calls[i].uusInfo[0].uusType = (UusType) uusInfo->uusType;
3032 calls[i].uusInfo[0].uusDcs = (UusDcs) uusInfo->uusDcs;
3033 // convert uusInfo->uusData to a null-terminated string
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003034 char *nullTermStr = strndup(uusInfo->uusData, uusInfo->uusLength);
3035 calls[i].uusInfo[0].uusData = nullTermStr;
3036 free(nullTermStr);
Sanket Padawef220dc52017-01-02 23:46:00 -08003037 }
3038 }
3039 }
3040
Amit Mahajan17249842017-01-19 15:05:45 -08003041 Return<void> retStatus = radioService[slotId]->mRadioResponse->
3042 getCurrentCallsResponse(responseInfo, calls);
3043 radioService[slotId]->checkReturnStatus(retStatus);
Sanket Padawef220dc52017-01-02 23:46:00 -08003044 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003045 RLOGE("getCurrentCallsResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawef220dc52017-01-02 23:46:00 -08003046 }
3047
3048 return 0;
3049}
3050
Amit Mahajan759786a2017-03-03 17:35:47 -08003051int radio::dialResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003052 int responseType, int serial, RIL_Errno e, void *response,
3053 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003054#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003055 RLOGD("dialResponse: 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 = {};
Sanket Padawef220dc52017-01-02 23:46:00 -08003060 populateResponseInfo(responseInfo, serial, responseType, e);
Amit Mahajan17249842017-01-19 15:05:45 -08003061 Return<void> retStatus = radioService[slotId]->mRadioResponse->dialResponse(responseInfo);
3062 radioService[slotId]->checkReturnStatus(retStatus);
Sanket Padawef220dc52017-01-02 23:46:00 -08003063 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003064 RLOGE("dialResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Amit Mahajancd77a5b2016-08-25 11:19:21 -07003065 }
3066
3067 return 0;
3068}
3069
Amit Mahajan759786a2017-03-03 17:35:47 -08003070int radio::getIMSIForAppResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003071 int responseType, int serial, RIL_Errno e, void *response,
3072 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003073#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003074 RLOGD("getIMSIForAppResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003075#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003076
3077 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003078 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003079 populateResponseInfo(responseInfo, serial, responseType, e);
3080 Return<void> retStatus = radioService[slotId]->mRadioResponse->getIMSIForAppResponse(
3081 responseInfo, convertCharPtrToHidlString((char *) response));
3082 radioService[slotId]->checkReturnStatus(retStatus);
3083 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003084 RLOGE("getIMSIForAppResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003085 slotId);
3086 }
3087
3088 return 0;
3089}
3090
Amit Mahajan759786a2017-03-03 17:35:47 -08003091int radio::hangupConnectionResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003092 int responseType, int serial, RIL_Errno e,
3093 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003094#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003095 RLOGD("hangupConnectionResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003096#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003097
3098 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003099 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003100 populateResponseInfo(responseInfo, serial, responseType, e);
3101 Return<void> retStatus = radioService[slotId]->mRadioResponse->hangupConnectionResponse(
3102 responseInfo);
3103 radioService[slotId]->checkReturnStatus(retStatus);
3104 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003105 RLOGE("hangupConnectionResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003106 slotId);
3107 }
3108
3109 return 0;
3110}
3111
Amit Mahajan759786a2017-03-03 17:35:47 -08003112int radio::hangupWaitingOrBackgroundResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003113 int responseType, int serial, RIL_Errno e,
3114 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003115#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003116 RLOGD("hangupWaitingOrBackgroundResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003117#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003118
3119 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003120 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003121 populateResponseInfo(responseInfo, serial, responseType, e);
3122 Return<void> retStatus =
3123 radioService[slotId]->mRadioResponse->hangupWaitingOrBackgroundResponse(
3124 responseInfo);
3125 radioService[slotId]->checkReturnStatus(retStatus);
3126 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003127 RLOGE("hangupWaitingOrBackgroundResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003128 slotId);
3129 }
3130
3131 return 0;
3132}
3133
Amit Mahajan759786a2017-03-03 17:35:47 -08003134int radio::hangupForegroundResumeBackgroundResponse(int slotId, int responseType, int serial,
3135 RIL_Errno e, void *response,
3136 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003137#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003138 RLOGD("hangupWaitingOrBackgroundResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003139#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003140
3141 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003142 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003143 populateResponseInfo(responseInfo, serial, responseType, e);
3144 Return<void> retStatus =
3145 radioService[slotId]->mRadioResponse->hangupWaitingOrBackgroundResponse(
3146 responseInfo);
3147 radioService[slotId]->checkReturnStatus(retStatus);
3148 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003149 RLOGE("hangupWaitingOrBackgroundResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003150 slotId);
3151 }
3152
3153 return 0;
3154}
3155
Amit Mahajan759786a2017-03-03 17:35:47 -08003156int radio::switchWaitingOrHoldingAndActiveResponse(int slotId, int responseType, int serial,
3157 RIL_Errno e, void *response,
3158 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003159#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003160 RLOGD("switchWaitingOrHoldingAndActiveResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003161#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003162
3163 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003164 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003165 populateResponseInfo(responseInfo, serial, responseType, e);
3166 Return<void> retStatus =
3167 radioService[slotId]->mRadioResponse->switchWaitingOrHoldingAndActiveResponse(
3168 responseInfo);
3169 radioService[slotId]->checkReturnStatus(retStatus);
3170 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003171 RLOGE("switchWaitingOrHoldingAndActiveResponse: radioService[%d]->mRadioResponse "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003172 "== NULL", slotId);
3173 }
3174
3175 return 0;
3176}
3177
Amit Mahajan759786a2017-03-03 17:35:47 -08003178int radio::conferenceResponse(int slotId, int responseType,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003179 int serial, RIL_Errno e, void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003180#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003181 RLOGD("conferenceResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003182#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003183
3184 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003185 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003186 populateResponseInfo(responseInfo, serial, responseType, e);
3187 Return<void> retStatus = radioService[slotId]->mRadioResponse->conferenceResponse(
3188 responseInfo);
3189 radioService[slotId]->checkReturnStatus(retStatus);
3190 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003191 RLOGE("conferenceResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003192 slotId);
3193 }
3194
3195 return 0;
3196}
3197
Amit Mahajan759786a2017-03-03 17:35:47 -08003198int radio::rejectCallResponse(int slotId, int responseType,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003199 int serial, RIL_Errno e, void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003200#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003201 RLOGD("rejectCallResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003202#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003203
3204 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003205 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003206 populateResponseInfo(responseInfo, serial, responseType, e);
3207 Return<void> retStatus = radioService[slotId]->mRadioResponse->rejectCallResponse(
3208 responseInfo);
3209 radioService[slotId]->checkReturnStatus(retStatus);
3210 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003211 RLOGE("rejectCallResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003212 slotId);
3213 }
3214
3215 return 0;
3216}
3217
Amit Mahajan759786a2017-03-03 17:35:47 -08003218int radio::getLastCallFailCauseResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003219 int responseType, int serial, RIL_Errno e, void *response,
3220 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003221#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003222 RLOGD("getLastCallFailCauseResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003223#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003224
3225 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003226 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003227 populateResponseInfo(responseInfo, serial, responseType, e);
Jack Yuf68e0da2017-02-07 14:53:09 -08003228
3229 LastCallFailCauseInfo info = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003230 info.vendorCause = hidl_string();
3231 if (response == NULL) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003232 RLOGE("getCurrentCallsResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003233 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
3234 } else if (responseLen == sizeof(int)) {
3235 int *pInt = (int *) response;
3236 info.causeCode = (LastCallFailCause) pInt[0];
3237 } else if (responseLen == sizeof(RIL_LastCallFailCauseInfo)) {
3238 RIL_LastCallFailCauseInfo *pFailCauseInfo = (RIL_LastCallFailCauseInfo *) response;
3239 info.causeCode = (LastCallFailCause) pFailCauseInfo->cause_code;
3240 info.vendorCause = convertCharPtrToHidlString(pFailCauseInfo->vendor_cause);
3241 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003242 RLOGE("getCurrentCallsResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003243 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
3244 }
3245
3246 Return<void> retStatus = radioService[slotId]->mRadioResponse->getLastCallFailCauseResponse(
3247 responseInfo, info);
3248 radioService[slotId]->checkReturnStatus(retStatus);
3249 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003250 RLOGE("getLastCallFailCauseResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003251 slotId);
3252 }
3253
3254 return 0;
3255}
3256
Amit Mahajan759786a2017-03-03 17:35:47 -08003257int radio::getSignalStrengthResponse(int slotId,
Amit Mahajan3df62912017-02-10 01:35:55 +00003258 int responseType, int serial, RIL_Errno e,
3259 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003260#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003261 RLOGD("getSignalStrengthResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003262#endif
Amit Mahajan3df62912017-02-10 01:35:55 +00003263
3264 if (radioService[slotId]->mRadioResponse != NULL) {
Amit Mahajan3da9ac02017-02-13 13:41:28 -08003265 RadioResponseInfo responseInfo = {};
Amit Mahajan3df62912017-02-10 01:35:55 +00003266 populateResponseInfo(responseInfo, serial, responseType, e);
Amit Mahajan3da9ac02017-02-13 13:41:28 -08003267 SignalStrength signalStrength = {};
Adrian DC15627d92017-04-23 21:28:36 +02003268 if (response == NULL || (responseLen != sizeof(RIL_SignalStrength_v10)
3269 && responseLen != sizeof(RIL_SignalStrength_v8))) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003270 RLOGE("getSignalStrengthResponse: Invalid response");
Amit Mahajan3df62912017-02-10 01:35:55 +00003271 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
3272 } else {
3273 convertRilSignalStrengthToHal(response, responseLen, signalStrength);
3274 }
3275
3276 Return<void> retStatus = radioService[slotId]->mRadioResponse->getSignalStrengthResponse(
3277 responseInfo, signalStrength);
3278 radioService[slotId]->checkReturnStatus(retStatus);
3279 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003280 RLOGE("getSignalStrengthResponse: radioService[%d]->mRadioResponse == NULL",
Amit Mahajan3df62912017-02-10 01:35:55 +00003281 slotId);
3282 }
3283
3284 return 0;
3285}
3286
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003287RIL_CellInfoType getCellInfoTypeRadioTechnology(char *rat) {
3288 if (rat == NULL) {
3289 return RIL_CELL_INFO_TYPE_NONE;
3290 }
3291
3292 int radioTech = atoi(rat);
3293
3294 switch(radioTech) {
3295
3296 case RADIO_TECH_GPRS:
3297 case RADIO_TECH_EDGE:
3298 case RADIO_TECH_GSM: {
3299 return RIL_CELL_INFO_TYPE_GSM;
3300 }
3301
3302 case RADIO_TECH_UMTS:
3303 case RADIO_TECH_HSDPA:
3304 case RADIO_TECH_HSUPA:
3305 case RADIO_TECH_HSPA:
3306 case RADIO_TECH_HSPAP: {
3307 return RIL_CELL_INFO_TYPE_WCDMA;
3308 }
3309
3310 case RADIO_TECH_IS95A:
3311 case RADIO_TECH_IS95B:
3312 case RADIO_TECH_1xRTT:
3313 case RADIO_TECH_EVDO_0:
3314 case RADIO_TECH_EVDO_A:
3315 case RADIO_TECH_EVDO_B:
3316 case RADIO_TECH_EHRPD: {
3317 return RIL_CELL_INFO_TYPE_CDMA;
3318 }
3319
3320 case RADIO_TECH_LTE:
3321 case RADIO_TECH_LTE_CA: {
3322 return RIL_CELL_INFO_TYPE_LTE;
3323 }
3324
3325 case RADIO_TECH_TD_SCDMA: {
3326 return RIL_CELL_INFO_TYPE_TD_SCDMA;
3327 }
3328
3329 default: {
3330 break;
3331 }
3332 }
3333
3334 return RIL_CELL_INFO_TYPE_NONE;
3335
3336}
3337
3338void fillCellIdentityResponse(CellIdentity &cellIdentity, RIL_CellIdentity_v16 &rilCellIdentity) {
3339
3340 cellIdentity.cellIdentityGsm.resize(0);
3341 cellIdentity.cellIdentityWcdma.resize(0);
3342 cellIdentity.cellIdentityCdma.resize(0);
3343 cellIdentity.cellIdentityTdscdma.resize(0);
3344 cellIdentity.cellIdentityLte.resize(0);
3345 cellIdentity.cellInfoType = (CellInfoType)rilCellIdentity.cellInfoType;
3346 switch(rilCellIdentity.cellInfoType) {
3347
3348 case RIL_CELL_INFO_TYPE_GSM: {
3349 cellIdentity.cellIdentityGsm.resize(1);
3350 cellIdentity.cellIdentityGsm[0].mcc =
3351 std::to_string(rilCellIdentity.cellIdentityGsm.mcc);
3352 cellIdentity.cellIdentityGsm[0].mnc =
3353 std::to_string(rilCellIdentity.cellIdentityGsm.mnc);
3354 cellIdentity.cellIdentityGsm[0].lac = rilCellIdentity.cellIdentityGsm.lac;
3355 cellIdentity.cellIdentityGsm[0].cid = rilCellIdentity.cellIdentityGsm.cid;
3356 cellIdentity.cellIdentityGsm[0].arfcn = rilCellIdentity.cellIdentityGsm.arfcn;
3357 cellIdentity.cellIdentityGsm[0].bsic = rilCellIdentity.cellIdentityGsm.bsic;
3358 break;
3359 }
3360
3361 case RIL_CELL_INFO_TYPE_WCDMA: {
3362 cellIdentity.cellIdentityWcdma.resize(1);
3363 cellIdentity.cellIdentityWcdma[0].mcc =
3364 std::to_string(rilCellIdentity.cellIdentityWcdma.mcc);
3365 cellIdentity.cellIdentityWcdma[0].mnc =
3366 std::to_string(rilCellIdentity.cellIdentityWcdma.mnc);
3367 cellIdentity.cellIdentityWcdma[0].lac = rilCellIdentity.cellIdentityWcdma.lac;
3368 cellIdentity.cellIdentityWcdma[0].cid = rilCellIdentity.cellIdentityWcdma.cid;
3369 cellIdentity.cellIdentityWcdma[0].psc = rilCellIdentity.cellIdentityWcdma.psc;
3370 cellIdentity.cellIdentityWcdma[0].uarfcn = rilCellIdentity.cellIdentityWcdma.uarfcn;
3371 break;
3372 }
3373
3374 case RIL_CELL_INFO_TYPE_CDMA: {
3375 cellIdentity.cellIdentityCdma.resize(1);
3376 cellIdentity.cellIdentityCdma[0].networkId = rilCellIdentity.cellIdentityCdma.networkId;
3377 cellIdentity.cellIdentityCdma[0].systemId = rilCellIdentity.cellIdentityCdma.systemId;
3378 cellIdentity.cellIdentityCdma[0].baseStationId =
3379 rilCellIdentity.cellIdentityCdma.basestationId;
3380 cellIdentity.cellIdentityCdma[0].longitude = rilCellIdentity.cellIdentityCdma.longitude;
3381 cellIdentity.cellIdentityCdma[0].latitude = rilCellIdentity.cellIdentityCdma.latitude;
3382 break;
3383 }
3384
3385 case RIL_CELL_INFO_TYPE_LTE: {
3386 cellIdentity.cellIdentityLte.resize(1);
3387 cellIdentity.cellIdentityLte[0].mcc =
3388 std::to_string(rilCellIdentity.cellIdentityLte.mcc);
3389 cellIdentity.cellIdentityLte[0].mnc =
3390 std::to_string(rilCellIdentity.cellIdentityLte.mnc);
3391 cellIdentity.cellIdentityLte[0].ci = rilCellIdentity.cellIdentityLte.ci;
3392 cellIdentity.cellIdentityLte[0].pci = rilCellIdentity.cellIdentityLte.pci;
3393 cellIdentity.cellIdentityLte[0].tac = rilCellIdentity.cellIdentityLte.tac;
3394 cellIdentity.cellIdentityLte[0].earfcn = rilCellIdentity.cellIdentityLte.earfcn;
3395 break;
3396 }
3397
3398 case RIL_CELL_INFO_TYPE_TD_SCDMA: {
3399 cellIdentity.cellIdentityTdscdma.resize(1);
3400 cellIdentity.cellIdentityTdscdma[0].mcc =
3401 std::to_string(rilCellIdentity.cellIdentityTdscdma.mcc);
3402 cellIdentity.cellIdentityTdscdma[0].mnc =
3403 std::to_string(rilCellIdentity.cellIdentityTdscdma.mnc);
3404 cellIdentity.cellIdentityTdscdma[0].lac = rilCellIdentity.cellIdentityTdscdma.lac;
3405 cellIdentity.cellIdentityTdscdma[0].cid = rilCellIdentity.cellIdentityTdscdma.cid;
3406 cellIdentity.cellIdentityTdscdma[0].cpid = rilCellIdentity.cellIdentityTdscdma.cpid;
3407 break;
3408 }
3409
3410 default: {
3411 break;
3412 }
3413 }
3414}
3415
3416int convertResponseStringEntryToInt(char **response, int index, int numStrings) {
3417 if ((response != NULL) && (numStrings > index) && (response[index] != NULL)) {
3418 return atoi(response[index]);
3419 }
3420
3421 return -1;
3422}
3423
Sooraj Sasindran758ee462017-06-07 16:30:18 -07003424int convertResponseHexStringEntryToInt(char **response, int index, int numStrings) {
3425 const int hexBase = 16;
3426 if ((response != NULL) && (numStrings > index) && (response[index] != NULL)) {
3427 return strtol(response[index], NULL, hexBase);
3428 }
3429
3430 return -1;
3431}
3432
3433/* Fill Cell Identity info from Voice Registration State Response.
3434 * This fucntion is applicable only for RIL Version < 15.
3435 * Response is a "char **".
3436 * First and Second entries are in hex string format
3437 * and rest are integers represented in ascii format. */
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003438void fillCellIdentityFromVoiceRegStateResponseString(CellIdentity &cellIdentity,
3439 int numStrings, char** response) {
3440
3441 RIL_CellIdentity_v16 rilCellIdentity;
Jack Yuc22b3de2017-04-14 00:08:06 -07003442 memset(&rilCellIdentity, -1, sizeof(RIL_CellIdentity_v16));
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003443
3444 rilCellIdentity.cellInfoType = getCellInfoTypeRadioTechnology(response[3]);
3445 switch(rilCellIdentity.cellInfoType) {
3446
3447 case RIL_CELL_INFO_TYPE_GSM: {
Sooraj Sasindran758ee462017-06-07 16:30:18 -07003448 /* valid LAC are hexstrings in the range 0x0000 - 0xffff */
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003449 rilCellIdentity.cellIdentityGsm.lac =
Sooraj Sasindran758ee462017-06-07 16:30:18 -07003450 convertResponseHexStringEntryToInt(response, 1, numStrings);
3451
3452 /* valid CID are hexstrings in the range 0x00000000 - 0xffffffff */
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003453 rilCellIdentity.cellIdentityGsm.cid =
Sooraj Sasindran758ee462017-06-07 16:30:18 -07003454 convertResponseHexStringEntryToInt(response, 2, numStrings);
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003455 break;
3456 }
3457
3458 case RIL_CELL_INFO_TYPE_WCDMA: {
Sooraj Sasindran758ee462017-06-07 16:30:18 -07003459 /* valid LAC are hexstrings in the range 0x0000 - 0xffff */
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003460 rilCellIdentity.cellIdentityWcdma.lac =
Sooraj Sasindran758ee462017-06-07 16:30:18 -07003461 convertResponseHexStringEntryToInt(response, 1, numStrings);
3462
3463 /* valid CID are hexstrings in the range 0x00000000 - 0xffffffff */
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003464 rilCellIdentity.cellIdentityWcdma.cid =
Sooraj Sasindran758ee462017-06-07 16:30:18 -07003465 convertResponseHexStringEntryToInt(response, 2, numStrings);
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003466 rilCellIdentity.cellIdentityWcdma.psc =
3467 convertResponseStringEntryToInt(response, 14, numStrings);
3468 break;
3469 }
3470
3471 case RIL_CELL_INFO_TYPE_TD_SCDMA:{
Sooraj Sasindran758ee462017-06-07 16:30:18 -07003472 /* valid LAC are hexstrings in the range 0x0000 - 0xffff */
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003473 rilCellIdentity.cellIdentityTdscdma.lac =
Sooraj Sasindran758ee462017-06-07 16:30:18 -07003474 convertResponseHexStringEntryToInt(response, 1, numStrings);
3475
3476 /* valid CID are hexstrings in the range 0x00000000 - 0xffffffff */
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003477 rilCellIdentity.cellIdentityTdscdma.cid =
Sooraj Sasindran758ee462017-06-07 16:30:18 -07003478 convertResponseHexStringEntryToInt(response, 2, numStrings);
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003479 break;
3480 }
3481
3482 case RIL_CELL_INFO_TYPE_CDMA:{
3483 rilCellIdentity.cellIdentityCdma.basestationId =
3484 convertResponseStringEntryToInt(response, 4, numStrings);
3485 rilCellIdentity.cellIdentityCdma.longitude =
3486 convertResponseStringEntryToInt(response, 5, numStrings);
3487 rilCellIdentity.cellIdentityCdma.latitude =
3488 convertResponseStringEntryToInt(response, 6, numStrings);
3489 rilCellIdentity.cellIdentityCdma.systemId =
3490 convertResponseStringEntryToInt(response, 8, numStrings);
3491 rilCellIdentity.cellIdentityCdma.networkId =
3492 convertResponseStringEntryToInt(response, 9, numStrings);
3493 break;
3494 }
3495
Sooraj Sasindranf28e42a2017-03-06 23:07:22 -08003496 case RIL_CELL_INFO_TYPE_LTE:{
Sooraj Sasindran758ee462017-06-07 16:30:18 -07003497 /* valid TAC are hexstrings in the range 0x0000 - 0xffff */
Sooraj Sasindranf28e42a2017-03-06 23:07:22 -08003498 rilCellIdentity.cellIdentityLte.tac =
Sooraj Sasindran758ee462017-06-07 16:30:18 -07003499 convertResponseHexStringEntryToInt(response, 1, numStrings);
3500
3501 /* valid CID are hexstrings in the range 0x00000000 - 0xffffffff */
Sooraj Sasindranf28e42a2017-03-06 23:07:22 -08003502 rilCellIdentity.cellIdentityLte.ci =
Sooraj Sasindran758ee462017-06-07 16:30:18 -07003503 convertResponseHexStringEntryToInt(response, 2, numStrings);
Sooraj Sasindranf28e42a2017-03-06 23:07:22 -08003504 break;
3505 }
3506
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003507 default: {
3508 break;
3509 }
3510 }
3511
3512 fillCellIdentityResponse(cellIdentity, rilCellIdentity);
3513}
3514
Sooraj Sasindran758ee462017-06-07 16:30:18 -07003515/* Fill Cell Identity info from Data Registration State Response.
3516 * This fucntion is applicable only for RIL Version < 15.
3517 * Response is a "char **".
3518 * First and Second entries are in hex string format
3519 * and rest are integers represented in ascii format. */
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003520void fillCellIdentityFromDataRegStateResponseString(CellIdentity &cellIdentity,
3521 int numStrings, char** response) {
3522
3523 RIL_CellIdentity_v16 rilCellIdentity;
Jack Yuc22b3de2017-04-14 00:08:06 -07003524 memset(&rilCellIdentity, -1, sizeof(RIL_CellIdentity_v16));
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003525
3526 rilCellIdentity.cellInfoType = getCellInfoTypeRadioTechnology(response[3]);
3527 switch(rilCellIdentity.cellInfoType) {
3528 case RIL_CELL_INFO_TYPE_GSM: {
Sooraj Sasindran758ee462017-06-07 16:30:18 -07003529 /* valid LAC are hexstrings in the range 0x0000 - 0xffff */
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003530 rilCellIdentity.cellIdentityGsm.lac =
Sooraj Sasindran758ee462017-06-07 16:30:18 -07003531 convertResponseHexStringEntryToInt(response, 1, numStrings);
3532
3533 /* valid CID are hexstrings in the range 0x00000000 - 0xffffffff */
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003534 rilCellIdentity.cellIdentityGsm.cid =
Sooraj Sasindran758ee462017-06-07 16:30:18 -07003535 convertResponseHexStringEntryToInt(response, 2, numStrings);
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003536 break;
3537 }
3538 case RIL_CELL_INFO_TYPE_WCDMA: {
Sooraj Sasindran758ee462017-06-07 16:30:18 -07003539 /* valid LAC are hexstrings in the range 0x0000 - 0xffff */
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003540 rilCellIdentity.cellIdentityWcdma.lac =
Sooraj Sasindran758ee462017-06-07 16:30:18 -07003541 convertResponseHexStringEntryToInt(response, 1, numStrings);
3542
3543 /* valid CID are hexstrings in the range 0x00000000 - 0xffffffff */
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003544 rilCellIdentity.cellIdentityWcdma.cid =
Sooraj Sasindran758ee462017-06-07 16:30:18 -07003545 convertResponseHexStringEntryToInt(response, 2, numStrings);
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003546 break;
3547 }
3548 case RIL_CELL_INFO_TYPE_TD_SCDMA:{
Sooraj Sasindran758ee462017-06-07 16:30:18 -07003549 /* valid LAC are hexstrings in the range 0x0000 - 0xffff */
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003550 rilCellIdentity.cellIdentityTdscdma.lac =
Sooraj Sasindran758ee462017-06-07 16:30:18 -07003551 convertResponseHexStringEntryToInt(response, 1, numStrings);
3552
3553 /* valid CID are hexstrings in the range 0x00000000 - 0xffffffff */
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003554 rilCellIdentity.cellIdentityTdscdma.cid =
Sooraj Sasindran758ee462017-06-07 16:30:18 -07003555 convertResponseHexStringEntryToInt(response, 2, numStrings);
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003556 break;
3557 }
3558 case RIL_CELL_INFO_TYPE_LTE: {
3559 rilCellIdentity.cellIdentityLte.tac =
3560 convertResponseStringEntryToInt(response, 6, numStrings);
3561 rilCellIdentity.cellIdentityLte.pci =
3562 convertResponseStringEntryToInt(response, 7, numStrings);
3563 rilCellIdentity.cellIdentityLte.ci =
3564 convertResponseStringEntryToInt(response, 8, numStrings);
3565 break;
3566 }
3567 default: {
3568 break;
3569 }
3570 }
3571
3572 fillCellIdentityResponse(cellIdentity, rilCellIdentity);
3573}
3574
Amit Mahajan759786a2017-03-03 17:35:47 -08003575int radio::getVoiceRegistrationStateResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003576 int responseType, int serial, RIL_Errno e,
3577 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003578#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003579 RLOGD("getVoiceRegistrationStateResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003580#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003581
3582 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003583 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003584 populateResponseInfo(responseInfo, serial, responseType, e);
3585
Jack Yuf68e0da2017-02-07 14:53:09 -08003586 VoiceRegStateResult voiceRegResponse = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003587 int numStrings = responseLen / sizeof(char *);
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003588 if (response == NULL) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003589 RLOGE("getVoiceRegistrationStateResponse Invalid response: NULL");
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003590 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
3591 } else if (s_vendorFunctions->version <= 14) {
3592 if (numStrings != 15) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003593 RLOGE("getVoiceRegistrationStateResponse Invalid response: NULL");
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003594 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
3595 } else {
3596 char **resp = (char **) response;
3597 voiceRegResponse.regState = (RegState) ATOI_NULL_HANDLED_DEF(resp[0], 4);
3598 voiceRegResponse.rat = ATOI_NULL_HANDLED(resp[3]);
3599 voiceRegResponse.cssSupported = ATOI_NULL_HANDLED_DEF(resp[7], 0);
3600 voiceRegResponse.roamingIndicator = ATOI_NULL_HANDLED(resp[10]);
3601 voiceRegResponse.systemIsInPrl = ATOI_NULL_HANDLED_DEF(resp[11], 0);
3602 voiceRegResponse.defaultRoamingIndicator = ATOI_NULL_HANDLED_DEF(resp[12], 0);
3603 voiceRegResponse.reasonForDenial = ATOI_NULL_HANDLED_DEF(resp[13], 0);
3604 fillCellIdentityFromVoiceRegStateResponseString(voiceRegResponse.cellIdentity,
3605 numStrings, resp);
3606 }
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003607 } else {
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003608 RIL_VoiceRegistrationStateResponse *voiceRegState =
3609 (RIL_VoiceRegistrationStateResponse *)response;
3610
3611 if (responseLen != sizeof(RIL_VoiceRegistrationStateResponse)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003612 RLOGE("getVoiceRegistrationStateResponse Invalid response: NULL");
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003613 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
3614 } else {
3615 voiceRegResponse.regState = (RegState) voiceRegState->regState;
3616 voiceRegResponse.rat = voiceRegState->rat;;
3617 voiceRegResponse.cssSupported = voiceRegState->cssSupported;
3618 voiceRegResponse.roamingIndicator = voiceRegState->roamingIndicator;
3619 voiceRegResponse.systemIsInPrl = voiceRegState->systemIsInPrl;
3620 voiceRegResponse.defaultRoamingIndicator = voiceRegState->defaultRoamingIndicator;
3621 voiceRegResponse.reasonForDenial = voiceRegState->reasonForDenial;
3622 fillCellIdentityResponse(voiceRegResponse.cellIdentity,
3623 voiceRegState->cellIdentity);
3624 }
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003625 }
3626
3627 Return<void> retStatus =
3628 radioService[slotId]->mRadioResponse->getVoiceRegistrationStateResponse(
3629 responseInfo, voiceRegResponse);
3630 radioService[slotId]->checkReturnStatus(retStatus);
3631 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003632 RLOGE("getVoiceRegistrationStateResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003633 slotId);
3634 }
3635
3636 return 0;
3637}
3638
Amit Mahajan759786a2017-03-03 17:35:47 -08003639int radio::getDataRegistrationStateResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003640 int responseType, int serial, RIL_Errno e,
3641 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003642#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003643 RLOGD("getDataRegistrationStateResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003644#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003645
3646 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003647 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003648 populateResponseInfo(responseInfo, serial, responseType, e);
Jack Yuf68e0da2017-02-07 14:53:09 -08003649 DataRegStateResult dataRegResponse = {};
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003650 if (response == NULL) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003651 RLOGE("getDataRegistrationStateResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003652 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003653 } else if (s_vendorFunctions->version <= 14) {
3654 int numStrings = responseLen / sizeof(char *);
3655 if ((numStrings != 6) && (numStrings != 11)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003656 RLOGE("getDataRegistrationStateResponse Invalid response: NULL");
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003657 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
3658 } else {
3659 char **resp = (char **) response;
3660 dataRegResponse.regState = (RegState) ATOI_NULL_HANDLED_DEF(resp[0], 4);
3661 dataRegResponse.rat = ATOI_NULL_HANDLED_DEF(resp[3], 0);
3662 dataRegResponse.reasonDataDenied = ATOI_NULL_HANDLED(resp[4]);
3663 dataRegResponse.maxDataCalls = ATOI_NULL_HANDLED_DEF(resp[5], 1);
3664 fillCellIdentityFromDataRegStateResponseString(dataRegResponse.cellIdentity,
3665 numStrings, resp);
3666 }
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003667 } else {
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003668 RIL_DataRegistrationStateResponse *dataRegState =
3669 (RIL_DataRegistrationStateResponse *)response;
3670
3671 if (responseLen != sizeof(RIL_DataRegistrationStateResponse)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003672 RLOGE("getDataRegistrationStateResponse Invalid response: NULL");
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003673 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
3674 } else {
3675 dataRegResponse.regState = (RegState) dataRegState->regState;
3676 dataRegResponse.rat = dataRegState->rat;;
3677 dataRegResponse.reasonDataDenied = dataRegState->reasonDataDenied;
3678 dataRegResponse.maxDataCalls = dataRegState->maxDataCalls;
3679 fillCellIdentityResponse(dataRegResponse.cellIdentity, dataRegState->cellIdentity);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003680 }
3681 }
3682
3683 Return<void> retStatus =
3684 radioService[slotId]->mRadioResponse->getDataRegistrationStateResponse(responseInfo,
3685 dataRegResponse);
3686 radioService[slotId]->checkReturnStatus(retStatus);
3687 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003688 RLOGE("getDataRegistrationStateResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003689 slotId);
3690 }
3691
3692 return 0;
3693}
3694
Amit Mahajan759786a2017-03-03 17:35:47 -08003695int radio::getOperatorResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003696 int responseType, int serial, RIL_Errno e, void *response,
3697 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003698#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003699 RLOGD("getOperatorResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003700#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003701
3702 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003703 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003704 populateResponseInfo(responseInfo, serial, responseType, e);
3705 hidl_string longName;
3706 hidl_string shortName;
3707 hidl_string numeric;
3708 int numStrings = responseLen / sizeof(char *);
3709 if (response == NULL || numStrings != 3) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003710 RLOGE("getOperatorResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003711 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
3712
3713 } else {
3714 char **resp = (char **) response;
3715 longName = convertCharPtrToHidlString(resp[0]);
3716 shortName = convertCharPtrToHidlString(resp[1]);
3717 numeric = convertCharPtrToHidlString(resp[2]);
3718 }
3719 Return<void> retStatus = radioService[slotId]->mRadioResponse->getOperatorResponse(
3720 responseInfo, longName, shortName, numeric);
3721 radioService[slotId]->checkReturnStatus(retStatus);
3722 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003723 RLOGE("getOperatorResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003724 slotId);
3725 }
3726
3727 return 0;
3728}
3729
Amit Mahajan759786a2017-03-03 17:35:47 -08003730int radio::setRadioPowerResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003731 int responseType, int serial, RIL_Errno e, void *response,
3732 size_t responseLen) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003733 RLOGD("setRadioPowerResponse: serial %d", serial);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003734
3735 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003736 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003737 populateResponseInfo(responseInfo, serial, responseType, e);
3738 Return<void> retStatus = radioService[slotId]->mRadioResponse->setRadioPowerResponse(
3739 responseInfo);
3740 radioService[slotId]->checkReturnStatus(retStatus);
3741 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003742 RLOGE("setRadioPowerResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003743 slotId);
3744 }
3745
3746 return 0;
3747}
3748
Amit Mahajan759786a2017-03-03 17:35:47 -08003749int radio::sendDtmfResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003750 int responseType, int serial, RIL_Errno e, void *response,
3751 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003752#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003753 RLOGD("sendDtmfResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003754#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003755
3756 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003757 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003758 populateResponseInfo(responseInfo, serial, responseType, e);
3759 Return<void> retStatus = radioService[slotId]->mRadioResponse->sendDtmfResponse(
3760 responseInfo);
3761 radioService[slotId]->checkReturnStatus(retStatus);
3762 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003763 RLOGE("sendDtmfResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003764 slotId);
3765 }
3766
3767 return 0;
3768}
3769
3770SendSmsResult makeSendSmsResult(RadioResponseInfo& responseInfo, int serial, int responseType,
3771 RIL_Errno e, void *response, size_t responseLen) {
3772 populateResponseInfo(responseInfo, serial, responseType, e);
Jack Yuf68e0da2017-02-07 14:53:09 -08003773 SendSmsResult result = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003774
3775 if (response == NULL || responseLen != sizeof(RIL_SMS_Response)) {
3776 RLOGE("Invalid response: NULL");
3777 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003778 result.ackPDU = hidl_string();
3779 } else {
3780 RIL_SMS_Response *resp = (RIL_SMS_Response *) response;
3781 result.messageRef = resp->messageRef;
3782 result.ackPDU = convertCharPtrToHidlString(resp->ackPDU);
3783 result.errorCode = resp->errorCode;
3784 }
3785 return result;
3786}
3787
Amit Mahajan759786a2017-03-03 17:35:47 -08003788int radio::sendSmsResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003789 int responseType, int serial, RIL_Errno e, void *response,
3790 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003791#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003792 RLOGD("sendSmsResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003793#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003794
3795 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003796 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003797 SendSmsResult result = makeSendSmsResult(responseInfo, serial, responseType, e, response,
3798 responseLen);
3799
3800 Return<void> retStatus = radioService[slotId]->mRadioResponse->sendSmsResponse(responseInfo,
3801 result);
3802 radioService[slotId]->checkReturnStatus(retStatus);
3803 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003804 RLOGE("sendSmsResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003805 }
3806
3807 return 0;
3808}
3809
Amit Mahajan759786a2017-03-03 17:35:47 -08003810int radio::sendSMSExpectMoreResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003811 int responseType, int serial, RIL_Errno e, void *response,
3812 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003813#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003814 RLOGD("sendSMSExpectMoreResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003815#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003816
3817 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003818 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003819 SendSmsResult result = makeSendSmsResult(responseInfo, serial, responseType, e, response,
3820 responseLen);
3821
3822 Return<void> retStatus = radioService[slotId]->mRadioResponse->sendSMSExpectMoreResponse(
3823 responseInfo, result);
3824 radioService[slotId]->checkReturnStatus(retStatus);
3825 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003826 RLOGE("sendSMSExpectMoreResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003827 }
3828
3829 return 0;
3830}
3831
Amit Mahajan759786a2017-03-03 17:35:47 -08003832int radio::setupDataCallResponse(int slotId,
Amit Mahajan3df62912017-02-10 01:35:55 +00003833 int responseType, int serial, RIL_Errno e, void *response,
3834 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003835#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003836 RLOGD("setupDataCallResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003837#endif
Amit Mahajan3df62912017-02-10 01:35:55 +00003838
3839 if (radioService[slotId]->mRadioResponse != NULL) {
Amit Mahajan3da9ac02017-02-13 13:41:28 -08003840 RadioResponseInfo responseInfo = {};
Amit Mahajan3df62912017-02-10 01:35:55 +00003841 populateResponseInfo(responseInfo, serial, responseType, e);
3842
Amit Mahajan3da9ac02017-02-13 13:41:28 -08003843 SetupDataCallResult result = {};
Adrian DC15627d92017-04-23 21:28:36 +02003844
3845 if (response == NULL || (responseLen % sizeof(RIL_Data_Call_Response_v11) != 0
3846 && responseLen % sizeof(RIL_Data_Call_Response_v9) != 0
3847 && responseLen % sizeof(RIL_Data_Call_Response_v6) != 0)) {
Amit Mahajan13058cb2017-06-07 23:10:27 -07003848 if (response != NULL) {
3849 RLOGE("setupDataCallResponse: Invalid response");
3850 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
3851 }
Jack Yu5079e182017-02-28 15:21:18 -08003852 result.status = DataCallFailCause::ERROR_UNSPECIFIED;
Amit Mahajan3da9ac02017-02-13 13:41:28 -08003853 result.type = hidl_string();
3854 result.ifname = hidl_string();
3855 result.addresses = hidl_string();
3856 result.dnses = hidl_string();
3857 result.gateways = hidl_string();
3858 result.pcscf = hidl_string();
Adrian DC15627d92017-04-23 21:28:36 +02003859 } else if ((responseLen % sizeof(RIL_Data_Call_Response_v11)) == 0) {
Amit Mahajan3df62912017-02-10 01:35:55 +00003860 convertRilDataCallToHal((RIL_Data_Call_Response_v11 *) response, result);
Adrian DC15627d92017-04-23 21:28:36 +02003861 } else if ((responseLen % sizeof(RIL_Data_Call_Response_v9)) == 0) {
3862 convertRilDataCallToHal((RIL_Data_Call_Response_v9 *) response, result);
3863 } else if ((responseLen % sizeof(RIL_Data_Call_Response_v6)) == 0) {
3864 convertRilDataCallToHal((RIL_Data_Call_Response_v6 *) response, result);
Amit Mahajan3df62912017-02-10 01:35:55 +00003865 }
3866
3867 Return<void> retStatus = radioService[slotId]->mRadioResponse->setupDataCallResponse(
3868 responseInfo, result);
3869 radioService[slotId]->checkReturnStatus(retStatus);
3870 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003871 RLOGE("setupDataCallResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Amit Mahajan3df62912017-02-10 01:35:55 +00003872 }
3873
3874 return 0;
3875}
3876
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003877IccIoResult responseIccIo(RadioResponseInfo& responseInfo, int serial, int responseType,
3878 RIL_Errno e, void *response, size_t responseLen) {
3879 populateResponseInfo(responseInfo, serial, responseType, e);
Jack Yuf68e0da2017-02-07 14:53:09 -08003880 IccIoResult result = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003881
3882 if (response == NULL || responseLen != sizeof(RIL_SIM_IO_Response)) {
3883 RLOGE("Invalid response: NULL");
3884 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003885 result.simResponse = hidl_string();
3886 } else {
3887 RIL_SIM_IO_Response *resp = (RIL_SIM_IO_Response *) response;
3888 result.sw1 = resp->sw1;
3889 result.sw2 = resp->sw2;
3890 result.simResponse = convertCharPtrToHidlString(resp->simResponse);
3891 }
3892 return result;
3893}
3894
Amit Mahajan759786a2017-03-03 17:35:47 -08003895int radio::iccIOForAppResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003896 int responseType, int serial, RIL_Errno e, void *response,
3897 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003898#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003899 RLOGD("iccIOForAppResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003900#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003901
3902 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003903 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003904 IccIoResult result = responseIccIo(responseInfo, serial, responseType, e, response,
3905 responseLen);
3906
3907 Return<void> retStatus = radioService[slotId]->mRadioResponse->iccIOForAppResponse(
3908 responseInfo, result);
3909 radioService[slotId]->checkReturnStatus(retStatus);
3910 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003911 RLOGE("iccIOForAppResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003912 }
3913
3914 return 0;
3915}
3916
Amit Mahajan759786a2017-03-03 17:35:47 -08003917int radio::sendUssdResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003918 int responseType, int serial, RIL_Errno e, void *response,
3919 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003920#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003921 RLOGD("sendUssdResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003922#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003923
3924 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003925 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003926 populateResponseInfo(responseInfo, serial, responseType, e);
3927 Return<void> retStatus = radioService[slotId]->mRadioResponse->sendUssdResponse(
3928 responseInfo);
3929 radioService[slotId]->checkReturnStatus(retStatus);
3930 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003931 RLOGE("sendUssdResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003932 slotId);
3933 }
3934
3935 return 0;
3936}
3937
Amit Mahajan759786a2017-03-03 17:35:47 -08003938int radio::cancelPendingUssdResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003939 int responseType, int serial, RIL_Errno e, void *response,
3940 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003941#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003942 RLOGD("cancelPendingUssdResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003943#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003944
3945 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003946 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003947 populateResponseInfo(responseInfo, serial, responseType, e);
3948 Return<void> retStatus = radioService[slotId]->mRadioResponse->cancelPendingUssdResponse(
3949 responseInfo);
3950 radioService[slotId]->checkReturnStatus(retStatus);
3951 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003952 RLOGE("cancelPendingUssdResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003953 slotId);
3954 }
3955
3956 return 0;
3957}
3958
Amit Mahajan759786a2017-03-03 17:35:47 -08003959int radio::getClirResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003960 int responseType, int serial, RIL_Errno e, void *response,
3961 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003962#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003963 RLOGD("getClirResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003964#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003965
3966 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003967 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003968 populateResponseInfo(responseInfo, serial, responseType, e);
3969 int n = -1, m = -1;
3970 int numInts = responseLen / sizeof(int);
3971 if (response == NULL || numInts != 2) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003972 RLOGE("getClirResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003973 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
3974 } else {
3975 int *pInt = (int *) response;
3976 n = pInt[0];
3977 m = pInt[1];
3978 }
3979 Return<void> retStatus = radioService[slotId]->mRadioResponse->getClirResponse(responseInfo,
3980 n, m);
3981 radioService[slotId]->checkReturnStatus(retStatus);
3982 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003983 RLOGE("getClirResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003984 }
3985
3986 return 0;
3987}
3988
Amit Mahajan759786a2017-03-03 17:35:47 -08003989int radio::setClirResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003990 int responseType, int serial, RIL_Errno e, void *response,
3991 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003992#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003993 RLOGD("setClirResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003994#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003995
3996 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003997 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003998 populateResponseInfo(responseInfo, serial, responseType, e);
3999 Return<void> retStatus = radioService[slotId]->mRadioResponse->setClirResponse(
4000 responseInfo);
4001 radioService[slotId]->checkReturnStatus(retStatus);
4002 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004003 RLOGE("setClirResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004004 }
4005
4006 return 0;
4007}
4008
Amit Mahajan759786a2017-03-03 17:35:47 -08004009int radio::getCallForwardStatusResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004010 int responseType, int serial, RIL_Errno e,
4011 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004012#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004013 RLOGD("getCallForwardStatusResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004014#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004015
4016 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004017 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004018 populateResponseInfo(responseInfo, serial, responseType, e);
4019 hidl_vec<CallForwardInfo> callForwardInfos;
4020
Amit Mahajan13058cb2017-06-07 23:10:27 -07004021 if ((response == NULL && responseLen != 0)
4022 || responseLen % sizeof(RIL_CallForwardInfo *) != 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004023 RLOGE("getCallForwardStatusResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004024 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
4025 } else {
4026 int num = responseLen / sizeof(RIL_CallForwardInfo *);
4027 callForwardInfos.resize(num);
4028 for (int i = 0 ; i < num; i++) {
4029 RIL_CallForwardInfo *resp = ((RIL_CallForwardInfo **) response)[i];
4030 callForwardInfos[i].status = (CallForwardInfoStatus) resp->status;
4031 callForwardInfos[i].reason = resp->reason;
4032 callForwardInfos[i].serviceClass = resp->serviceClass;
4033 callForwardInfos[i].toa = resp->toa;
4034 callForwardInfos[i].number = convertCharPtrToHidlString(resp->number);
4035 callForwardInfos[i].timeSeconds = resp->timeSeconds;
4036 }
4037 }
4038
4039 Return<void> retStatus = radioService[slotId]->mRadioResponse->getCallForwardStatusResponse(
4040 responseInfo, callForwardInfos);
4041 radioService[slotId]->checkReturnStatus(retStatus);
4042 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004043 RLOGE("getCallForwardStatusResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004044 slotId);
4045 }
4046
4047 return 0;
4048}
4049
Amit Mahajan759786a2017-03-03 17:35:47 -08004050int radio::setCallForwardResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004051 int responseType, int serial, RIL_Errno e, void *response,
4052 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004053#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004054 RLOGD("setCallForwardResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004055#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004056
4057 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004058 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004059 populateResponseInfo(responseInfo, serial, responseType, e);
4060 Return<void> retStatus = radioService[slotId]->mRadioResponse->setCallForwardResponse(
4061 responseInfo);
4062 radioService[slotId]->checkReturnStatus(retStatus);
4063 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004064 RLOGE("setCallForwardResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004065 }
4066
4067 return 0;
4068}
4069
Amit Mahajan759786a2017-03-03 17:35:47 -08004070int radio::getCallWaitingResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004071 int responseType, int serial, RIL_Errno e, void *response,
4072 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004073#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004074 RLOGD("getCallWaitingResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004075#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004076
4077 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004078 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004079 populateResponseInfo(responseInfo, serial, responseType, e);
4080 bool enable = false;
4081 int serviceClass = -1;
4082 int numInts = responseLen / sizeof(int);
4083 if (response == NULL || numInts != 2) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004084 RLOGE("getCallWaitingResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004085 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
4086 } else {
4087 int *pInt = (int *) response;
4088 enable = pInt[0] == 1 ? true : false;
4089 serviceClass = pInt[1];
4090 }
Sanket Padawe5375bfa2017-03-07 17:21:05 -08004091 Return<void> retStatus = radioService[slotId]->mRadioResponse->getCallWaitingResponse(
4092 responseInfo, enable, serviceClass);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004093 radioService[slotId]->checkReturnStatus(retStatus);
4094 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004095 RLOGE("getCallWaitingResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004096 }
4097
4098 return 0;
4099}
4100
Amit Mahajan759786a2017-03-03 17:35:47 -08004101int radio::setCallWaitingResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004102 int responseType, int serial, RIL_Errno e, void *response,
4103 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004104#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004105 RLOGD("setCallWaitingResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004106#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004107
4108 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004109 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004110 populateResponseInfo(responseInfo, serial, responseType, e);
4111 Return<void> retStatus = radioService[slotId]->mRadioResponse->setCallWaitingResponse(
4112 responseInfo);
4113 radioService[slotId]->checkReturnStatus(retStatus);
4114 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004115 RLOGE("setCallWaitingResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004116 }
4117
4118 return 0;
4119}
4120
Amit Mahajan759786a2017-03-03 17:35:47 -08004121int radio::acknowledgeLastIncomingGsmSmsResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004122 int responseType, int serial, RIL_Errno e,
4123 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004124#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004125 RLOGD("acknowledgeLastIncomingGsmSmsResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004126#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004127
4128 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004129 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004130 populateResponseInfo(responseInfo, serial, responseType, e);
4131 Return<void> retStatus =
4132 radioService[slotId]->mRadioResponse->acknowledgeLastIncomingGsmSmsResponse(
4133 responseInfo);
4134 radioService[slotId]->checkReturnStatus(retStatus);
4135 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004136 RLOGE("acknowledgeLastIncomingGsmSmsResponse: radioService[%d]->mRadioResponse "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004137 "== NULL", slotId);
4138 }
4139
4140 return 0;
4141}
4142
Amit Mahajan759786a2017-03-03 17:35:47 -08004143int radio::acceptCallResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004144 int responseType, int serial, RIL_Errno e,
4145 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004146#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004147 RLOGD("acceptCallResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004148#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004149
4150 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004151 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004152 populateResponseInfo(responseInfo, serial, responseType, e);
4153 Return<void> retStatus = radioService[slotId]->mRadioResponse->acceptCallResponse(
4154 responseInfo);
4155 radioService[slotId]->checkReturnStatus(retStatus);
4156 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004157 RLOGE("acceptCallResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004158 slotId);
4159 }
4160
4161 return 0;
4162}
4163
Amit Mahajan759786a2017-03-03 17:35:47 -08004164int radio::deactivateDataCallResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004165 int responseType, int serial, RIL_Errno e,
4166 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004167#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004168 RLOGD("deactivateDataCallResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004169#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004170
4171 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004172 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004173 populateResponseInfo(responseInfo, serial, responseType, e);
4174 Return<void> retStatus = radioService[slotId]->mRadioResponse->deactivateDataCallResponse(
4175 responseInfo);
4176 radioService[slotId]->checkReturnStatus(retStatus);
4177 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004178 RLOGE("deactivateDataCallResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004179 slotId);
4180 }
4181
4182 return 0;
4183}
4184
Amit Mahajan759786a2017-03-03 17:35:47 -08004185int radio::getFacilityLockForAppResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004186 int responseType, int serial, RIL_Errno e,
4187 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004188#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004189 RLOGD("getFacilityLockForAppResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004190#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004191
4192 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004193 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004194 int ret = responseInt(responseInfo, serial, responseType, e, response, responseLen);
4195 Return<void> retStatus = radioService[slotId]->mRadioResponse->
4196 getFacilityLockForAppResponse(responseInfo, ret);
4197 radioService[slotId]->checkReturnStatus(retStatus);
4198 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004199 RLOGE("getFacilityLockForAppResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004200 slotId);
4201 }
4202
4203 return 0;
4204}
4205
Amit Mahajan759786a2017-03-03 17:35:47 -08004206int radio::setFacilityLockForAppResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004207 int responseType, int serial, RIL_Errno e,
4208 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004209#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004210 RLOGD("setFacilityLockForAppResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004211#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004212
4213 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004214 RadioResponseInfo responseInfo = {};
Naveen Kalla346bbc02017-03-16 12:55:55 -07004215 int ret = responseIntOrEmpty(responseInfo, serial, responseType, e, response, responseLen);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004216 Return<void> retStatus
4217 = radioService[slotId]->mRadioResponse->setFacilityLockForAppResponse(responseInfo,
4218 ret);
4219 radioService[slotId]->checkReturnStatus(retStatus);
4220 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004221 RLOGE("setFacilityLockForAppResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004222 slotId);
4223 }
4224
4225 return 0;
4226}
4227
Amit Mahajan759786a2017-03-03 17:35:47 -08004228int radio::setBarringPasswordResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004229 int responseType, int serial, RIL_Errno e,
4230 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004231#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004232 RLOGD("acceptCallResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004233#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004234
4235 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004236 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004237 populateResponseInfo(responseInfo, serial, responseType, e);
4238 Return<void> retStatus
4239 = radioService[slotId]->mRadioResponse->setBarringPasswordResponse(responseInfo);
4240 radioService[slotId]->checkReturnStatus(retStatus);
4241 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004242 RLOGE("setBarringPasswordResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004243 slotId);
4244 }
4245
4246 return 0;
4247}
4248
Amit Mahajan759786a2017-03-03 17:35:47 -08004249int radio::getNetworkSelectionModeResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004250 int responseType, int serial, RIL_Errno e, void *response,
4251 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004252#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004253 RLOGD("getNetworkSelectionModeResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004254#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004255
4256 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004257 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004258 populateResponseInfo(responseInfo, serial, responseType, e);
4259 bool manual = false;
4260 int serviceClass;
4261 if (response == NULL || responseLen != sizeof(int)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004262 RLOGE("getNetworkSelectionModeResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004263 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
4264 } else {
4265 int *pInt = (int *) response;
4266 manual = pInt[0] == 1 ? true : false;
4267 }
4268 Return<void> retStatus
4269 = radioService[slotId]->mRadioResponse->getNetworkSelectionModeResponse(
4270 responseInfo,
4271 manual);
4272 radioService[slotId]->checkReturnStatus(retStatus);
4273 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004274 RLOGE("getNetworkSelectionModeResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004275 slotId);
4276 }
4277
4278 return 0;
4279}
4280
Amit Mahajan759786a2017-03-03 17:35:47 -08004281int radio::setNetworkSelectionModeAutomaticResponse(int slotId, int responseType, int serial,
4282 RIL_Errno e, void *response,
4283 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004284#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004285 RLOGD("setNetworkSelectionModeAutomaticResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004286#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004287
4288 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004289 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004290 populateResponseInfo(responseInfo, serial, responseType, e);
4291 Return<void> retStatus
4292 = radioService[slotId]->mRadioResponse->setNetworkSelectionModeAutomaticResponse(
4293 responseInfo);
4294 radioService[slotId]->checkReturnStatus(retStatus);
4295 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004296 RLOGE("setNetworkSelectionModeAutomaticResponse: radioService[%d]->mRadioResponse "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004297 "== NULL", slotId);
4298 }
4299
4300 return 0;
4301}
4302
Amit Mahajan759786a2017-03-03 17:35:47 -08004303int radio::setNetworkSelectionModeManualResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004304 int responseType, int serial, RIL_Errno e,
4305 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004306#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004307 RLOGD("setNetworkSelectionModeManualResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004308#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004309
4310 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004311 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004312 populateResponseInfo(responseInfo, serial, responseType, e);
4313 Return<void> retStatus
4314 = radioService[slotId]->mRadioResponse->setNetworkSelectionModeManualResponse(
4315 responseInfo);
4316 radioService[slotId]->checkReturnStatus(retStatus);
4317 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004318 RLOGE("acceptCallResponse: radioService[%d]->setNetworkSelectionModeManualResponse "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004319 "== NULL", slotId);
4320 }
4321
4322 return 0;
4323}
4324
Jack Yuf68e0da2017-02-07 14:53:09 -08004325int convertOperatorStatusToInt(const char *str) {
4326 if (strncmp("unknown", str, 9) == 0) {
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004327 return (int) OperatorStatus::UNKNOWN;
Jack Yuf68e0da2017-02-07 14:53:09 -08004328 } else if (strncmp("available", str, 9) == 0) {
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004329 return (int) OperatorStatus::AVAILABLE;
Jack Yuf68e0da2017-02-07 14:53:09 -08004330 } else if (strncmp("current", str, 9) == 0) {
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004331 return (int) OperatorStatus::CURRENT;
Jack Yuf68e0da2017-02-07 14:53:09 -08004332 } else if (strncmp("forbidden", str, 9) == 0) {
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004333 return (int) OperatorStatus::FORBIDDEN;
4334 } else {
4335 return -1;
4336 }
4337}
4338
Amit Mahajan759786a2017-03-03 17:35:47 -08004339int radio::getAvailableNetworksResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004340 int responseType, int serial, RIL_Errno e, void *response,
4341 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004342#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004343 RLOGD("getAvailableNetworksResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004344#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004345
4346 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004347 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004348 populateResponseInfo(responseInfo, serial, responseType, e);
4349 hidl_vec<OperatorInfo> networks;
Amit Mahajan13058cb2017-06-07 23:10:27 -07004350 if ((response == NULL && responseLen != 0)
4351 || responseLen % (4 * sizeof(char *))!= 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004352 RLOGE("getAvailableNetworksResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004353 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
4354 } else {
4355 char **resp = (char **) response;
4356 int numStrings = responseLen / sizeof(char *);
4357 networks.resize(numStrings/4);
Jayachandran Ce0d755c2017-03-01 18:26:50 -08004358 for (int i = 0, j = 0; i < numStrings; i = i + 4, j++) {
4359 networks[j].alphaLong = convertCharPtrToHidlString(resp[i]);
4360 networks[j].alphaShort = convertCharPtrToHidlString(resp[i + 1]);
4361 networks[j].operatorNumeric = convertCharPtrToHidlString(resp[i + 2]);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004362 int status = convertOperatorStatusToInt(resp[i + 3]);
4363 if (status == -1) {
4364 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
4365 } else {
Jayachandran Ce0d755c2017-03-01 18:26:50 -08004366 networks[j].status = (OperatorStatus) status;
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004367 }
4368 }
4369 }
4370 Return<void> retStatus
4371 = radioService[slotId]->mRadioResponse->getAvailableNetworksResponse(responseInfo,
4372 networks);
4373 radioService[slotId]->checkReturnStatus(retStatus);
4374 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004375 RLOGE("getAvailableNetworksResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004376 slotId);
4377 }
4378
4379 return 0;
4380}
4381
Amit Mahajan759786a2017-03-03 17:35:47 -08004382int radio::startDtmfResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004383 int responseType, int serial, RIL_Errno e,
4384 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004385#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004386 RLOGD("startDtmfResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004387#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004388
4389 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004390 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004391 populateResponseInfo(responseInfo, serial, responseType, e);
4392 Return<void> retStatus
4393 = radioService[slotId]->mRadioResponse->startDtmfResponse(responseInfo);
4394 radioService[slotId]->checkReturnStatus(retStatus);
4395 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004396 RLOGE("startDtmfResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004397 }
4398
4399 return 0;
4400}
4401
Amit Mahajan759786a2017-03-03 17:35:47 -08004402int radio::stopDtmfResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004403 int responseType, int serial, RIL_Errno e,
4404 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004405#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004406 RLOGD("stopDtmfResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004407#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004408
4409 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004410 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004411 populateResponseInfo(responseInfo, serial, responseType, e);
4412 Return<void> retStatus
4413 = radioService[slotId]->mRadioResponse->stopDtmfResponse(responseInfo);
4414 radioService[slotId]->checkReturnStatus(retStatus);
4415 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004416 RLOGE("stopDtmfResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004417 }
4418
4419 return 0;
4420}
4421
Amit Mahajan759786a2017-03-03 17:35:47 -08004422int radio::getBasebandVersionResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004423 int responseType, int serial, RIL_Errno e,
4424 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004425#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004426 RLOGD("getBasebandVersionResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004427#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004428
4429 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004430 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004431 populateResponseInfo(responseInfo, serial, responseType, e);
4432 Return<void> retStatus
4433 = radioService[slotId]->mRadioResponse->getBasebandVersionResponse(responseInfo,
4434 convertCharPtrToHidlString((char *) response));
4435 radioService[slotId]->checkReturnStatus(retStatus);
4436 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004437 RLOGE("getBasebandVersionResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004438 }
4439
4440 return 0;
4441}
4442
Amit Mahajan759786a2017-03-03 17:35:47 -08004443int radio::separateConnectionResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004444 int responseType, int serial, RIL_Errno e,
4445 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004446#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004447 RLOGD("separateConnectionResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004448#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004449
4450 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004451 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004452 populateResponseInfo(responseInfo, serial, responseType, e);
4453 Return<void> retStatus
4454 = radioService[slotId]->mRadioResponse->separateConnectionResponse(responseInfo);
4455 radioService[slotId]->checkReturnStatus(retStatus);
4456 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004457 RLOGE("separateConnectionResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004458 slotId);
4459 }
4460
4461 return 0;
4462}
4463
Amit Mahajan759786a2017-03-03 17:35:47 -08004464int radio::setMuteResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004465 int responseType, int serial, RIL_Errno e,
4466 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004467#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004468 RLOGD("setMuteResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004469#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004470
4471 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004472 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004473 populateResponseInfo(responseInfo, serial, responseType, e);
4474 Return<void> retStatus
4475 = radioService[slotId]->mRadioResponse->setMuteResponse(responseInfo);
4476 radioService[slotId]->checkReturnStatus(retStatus);
4477 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004478 RLOGE("setMuteResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004479 }
4480
4481 return 0;
4482}
4483
Amit Mahajan759786a2017-03-03 17:35:47 -08004484int radio::getMuteResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004485 int responseType, int serial, RIL_Errno e, void *response,
4486 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004487#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004488 RLOGD("getMuteResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004489#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004490
4491 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004492 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004493 populateResponseInfo(responseInfo, serial, responseType, e);
4494 bool enable = false;
4495 int serviceClass;
4496 if (response == NULL || responseLen != sizeof(int)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004497 RLOGE("getMuteResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004498 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
4499 } else {
4500 int *pInt = (int *) response;
4501 enable = pInt[0] == 1 ? true : false;
4502 }
4503 Return<void> retStatus = radioService[slotId]->mRadioResponse->getMuteResponse(responseInfo,
4504 enable);
4505 radioService[slotId]->checkReturnStatus(retStatus);
4506 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004507 RLOGE("getMuteResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004508 }
4509
4510 return 0;
4511}
4512
Amit Mahajan759786a2017-03-03 17:35:47 -08004513int radio::getClipResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004514 int responseType, int serial, RIL_Errno e,
4515 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004516#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004517 RLOGD("getClipResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004518#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004519
4520 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004521 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004522 int ret = responseInt(responseInfo, serial, responseType, e, response, responseLen);
4523 Return<void> retStatus = radioService[slotId]->mRadioResponse->getClipResponse(responseInfo,
4524 (ClipStatus) ret);
4525 radioService[slotId]->checkReturnStatus(retStatus);
4526 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004527 RLOGE("getClipResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004528 }
4529
4530 return 0;
4531}
4532
Amit Mahajan759786a2017-03-03 17:35:47 -08004533int radio::getDataCallListResponse(int slotId,
Amit Mahajan3df62912017-02-10 01:35:55 +00004534 int responseType, int serial, RIL_Errno e,
4535 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004536#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004537 RLOGD("getDataCallListResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004538#endif
Amit Mahajan3df62912017-02-10 01:35:55 +00004539
4540 if (radioService[slotId]->mRadioResponse != NULL) {
Amit Mahajan3da9ac02017-02-13 13:41:28 -08004541 RadioResponseInfo responseInfo = {};
Amit Mahajan3df62912017-02-10 01:35:55 +00004542 populateResponseInfo(responseInfo, serial, responseType, e);
4543
4544 hidl_vec<SetupDataCallResult> ret;
Amit Mahajan13058cb2017-06-07 23:10:27 -07004545 if ((response == NULL && responseLen != 0)
Adrian DC15627d92017-04-23 21:28:36 +02004546 || (responseLen % sizeof(RIL_Data_Call_Response_v11) != 0
4547 && responseLen % sizeof(RIL_Data_Call_Response_v9) != 0
4548 && responseLen % sizeof(RIL_Data_Call_Response_v6) != 0)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004549 RLOGE("getDataCallListResponse: invalid response");
Amit Mahajan3df62912017-02-10 01:35:55 +00004550 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
4551 } else {
4552 convertRilDataCallListToHal(response, responseLen, ret);
4553 }
4554
4555 Return<void> retStatus = radioService[slotId]->mRadioResponse->getDataCallListResponse(
4556 responseInfo, ret);
4557 radioService[slotId]->checkReturnStatus(retStatus);
4558 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004559 RLOGE("getDataCallListResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Amit Mahajan3df62912017-02-10 01:35:55 +00004560 }
4561
4562 return 0;
4563}
4564
Amit Mahajan759786a2017-03-03 17:35:47 -08004565int radio::setSuppServiceNotificationsResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004566 int responseType, int serial, RIL_Errno e,
4567 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004568#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004569 RLOGD("setSuppServiceNotificationsResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004570#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004571
4572 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004573 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004574 populateResponseInfo(responseInfo, serial, responseType, e);
4575 Return<void> retStatus
4576 = radioService[slotId]->mRadioResponse->setSuppServiceNotificationsResponse(
4577 responseInfo);
4578 radioService[slotId]->checkReturnStatus(retStatus);
4579 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004580 RLOGE("setSuppServiceNotificationsResponse: radioService[%d]->mRadioResponse "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004581 "== NULL", slotId);
4582 }
4583
4584 return 0;
4585}
4586
Amit Mahajan759786a2017-03-03 17:35:47 -08004587int radio::deleteSmsOnSimResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004588 int responseType, int serial, RIL_Errno e,
4589 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004590#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004591 RLOGD("deleteSmsOnSimResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004592#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004593
4594 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004595 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004596 populateResponseInfo(responseInfo, serial, responseType, e);
4597 Return<void> retStatus
4598 = radioService[slotId]->mRadioResponse->deleteSmsOnSimResponse(responseInfo);
4599 radioService[slotId]->checkReturnStatus(retStatus);
4600 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004601 RLOGE("deleteSmsOnSimResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004602 }
4603
4604 return 0;
4605}
4606
Amit Mahajan759786a2017-03-03 17:35:47 -08004607int radio::setBandModeResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004608 int responseType, int serial, RIL_Errno e,
4609 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004610#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004611 RLOGD("setBandModeResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004612#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004613
4614 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004615 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004616 populateResponseInfo(responseInfo, serial, responseType, e);
4617 Return<void> retStatus
4618 = radioService[slotId]->mRadioResponse->setBandModeResponse(responseInfo);
4619 radioService[slotId]->checkReturnStatus(retStatus);
4620 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004621 RLOGE("setBandModeResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004622 }
4623
4624 return 0;
4625}
4626
Amit Mahajan759786a2017-03-03 17:35:47 -08004627int radio::writeSmsToSimResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004628 int responseType, int serial, RIL_Errno e,
4629 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004630#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004631 RLOGD("writeSmsToSimResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004632#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004633
4634 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004635 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004636 int ret = responseInt(responseInfo, serial, responseType, e, response, responseLen);
4637 Return<void> retStatus
4638 = radioService[slotId]->mRadioResponse->writeSmsToSimResponse(responseInfo, ret);
4639 radioService[slotId]->checkReturnStatus(retStatus);
4640 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004641 RLOGE("writeSmsToSimResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004642 }
4643
4644 return 0;
4645}
4646
Amit Mahajan759786a2017-03-03 17:35:47 -08004647int radio::getAvailableBandModesResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004648 int responseType, int serial, RIL_Errno e, void *response,
4649 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004650#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004651 RLOGD("getAvailableBandModesResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004652#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004653
4654 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004655 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004656 populateResponseInfo(responseInfo, serial, responseType, e);
4657 hidl_vec<RadioBandMode> modes;
Amit Mahajan13058cb2017-06-07 23:10:27 -07004658 if ((response == NULL && responseLen != 0)|| responseLen % sizeof(int) != 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004659 RLOGE("getAvailableBandModesResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004660 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
4661 } else {
4662 int *pInt = (int *) response;
4663 int numInts = responseLen / sizeof(int);
4664 modes.resize(numInts);
4665 for (int i = 0; i < numInts; i++) {
4666 modes[i] = (RadioBandMode) pInt[i];
4667 }
4668 }
4669 Return<void> retStatus
4670 = radioService[slotId]->mRadioResponse->getAvailableBandModesResponse(responseInfo,
4671 modes);
4672 radioService[slotId]->checkReturnStatus(retStatus);
4673 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004674 RLOGE("getAvailableBandModesResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004675 slotId);
4676 }
4677
4678 return 0;
4679}
4680
Amit Mahajan759786a2017-03-03 17:35:47 -08004681int radio::sendEnvelopeResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004682 int responseType, int serial, RIL_Errno e,
4683 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004684#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004685 RLOGD("sendEnvelopeResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004686#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004687
4688 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004689 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004690 populateResponseInfo(responseInfo, serial, responseType, e);
4691 Return<void> retStatus
4692 = radioService[slotId]->mRadioResponse->sendEnvelopeResponse(responseInfo,
4693 convertCharPtrToHidlString((char *) response));
4694 radioService[slotId]->checkReturnStatus(retStatus);
4695 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004696 RLOGE("sendEnvelopeResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004697 }
4698
4699 return 0;
4700}
4701
Amit Mahajan759786a2017-03-03 17:35:47 -08004702int radio::sendTerminalResponseToSimResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004703 int responseType, int serial, RIL_Errno e,
4704 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004705#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004706 RLOGD("sendTerminalResponseToSimResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004707#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004708
4709 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004710 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004711 populateResponseInfo(responseInfo, serial, responseType, e);
4712 Return<void> retStatus
4713 = radioService[slotId]->mRadioResponse->sendTerminalResponseToSimResponse(
4714 responseInfo);
4715 radioService[slotId]->checkReturnStatus(retStatus);
4716 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004717 RLOGE("sendTerminalResponseToSimResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004718 slotId);
4719 }
4720
4721 return 0;
4722}
4723
Amit Mahajan759786a2017-03-03 17:35:47 -08004724int radio::handleStkCallSetupRequestFromSimResponse(int slotId,
4725 int responseType, int serial,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004726 RIL_Errno e, void *response,
4727 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004728#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004729 RLOGD("handleStkCallSetupRequestFromSimResponse: 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->handleStkCallSetupRequestFromSimResponse(
4737 responseInfo);
4738 radioService[slotId]->checkReturnStatus(retStatus);
4739 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004740 RLOGE("handleStkCallSetupRequestFromSimResponse: radioService[%d]->mRadioResponse "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004741 "== NULL", slotId);
4742 }
4743
4744 return 0;
4745}
4746
Amit Mahajan759786a2017-03-03 17:35:47 -08004747int radio::explicitCallTransferResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004748 int responseType, int serial, RIL_Errno e,
4749 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004750#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004751 RLOGD("explicitCallTransferResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004752#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004753
4754 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004755 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004756 populateResponseInfo(responseInfo, serial, responseType, e);
4757 Return<void> retStatus
4758 = radioService[slotId]->mRadioResponse->explicitCallTransferResponse(responseInfo);
4759 radioService[slotId]->checkReturnStatus(retStatus);
4760 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004761 RLOGE("explicitCallTransferResponse: 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::setPreferredNetworkTypeResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004769 int responseType, int serial, RIL_Errno e,
4770 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004771#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004772 RLOGD("setPreferredNetworkTypeResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004773#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004774
4775 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004776 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004777 populateResponseInfo(responseInfo, serial, responseType, e);
4778 Return<void> retStatus
4779 = radioService[slotId]->mRadioResponse->setPreferredNetworkTypeResponse(
4780 responseInfo);
4781 radioService[slotId]->checkReturnStatus(retStatus);
4782 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004783 RLOGE("setPreferredNetworkTypeResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004784 slotId);
4785 }
4786
4787 return 0;
4788}
4789
4790
Amit Mahajan759786a2017-03-03 17:35:47 -08004791int radio::getPreferredNetworkTypeResponse(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("getPreferredNetworkTypeResponse: 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 int ret = responseInt(responseInfo, serial, responseType, e, response, responseLen);
4801 Return<void> retStatus
4802 = radioService[slotId]->mRadioResponse->getPreferredNetworkTypeResponse(
4803 responseInfo, (PreferredNetworkType) ret);
4804 radioService[slotId]->checkReturnStatus(retStatus);
4805 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004806 RLOGE("getPreferredNetworkTypeResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004807 slotId);
4808 }
4809
4810 return 0;
4811}
4812
Amit Mahajan759786a2017-03-03 17:35:47 -08004813int radio::getNeighboringCidsResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004814 int responseType, int serial, RIL_Errno e,
4815 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004816#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004817 RLOGD("getNeighboringCidsResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004818#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004819
4820 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004821 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004822 populateResponseInfo(responseInfo, serial, responseType, e);
4823 hidl_vec<NeighboringCell> cells;
4824
Amit Mahajan13058cb2017-06-07 23:10:27 -07004825 if ((response == NULL && responseLen != 0)
4826 || responseLen % sizeof(RIL_NeighboringCell *) != 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004827 RLOGE("getNeighboringCidsResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004828 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
4829 } else {
4830 int num = responseLen / sizeof(RIL_NeighboringCell *);
4831 cells.resize(num);
4832 for (int i = 0 ; i < num; i++) {
4833 RIL_NeighboringCell *resp = ((RIL_NeighboringCell **) response)[i];
4834 cells[i].cid = convertCharPtrToHidlString(resp->cid);
4835 cells[i].rssi = resp->rssi;
4836 }
4837 }
4838
4839 Return<void> retStatus
4840 = radioService[slotId]->mRadioResponse->getNeighboringCidsResponse(responseInfo,
4841 cells);
4842 radioService[slotId]->checkReturnStatus(retStatus);
4843 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004844 RLOGE("getNeighboringCidsResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004845 slotId);
4846 }
4847
4848 return 0;
4849}
4850
Amit Mahajan759786a2017-03-03 17:35:47 -08004851int radio::setLocationUpdatesResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004852 int responseType, int serial, RIL_Errno e,
4853 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004854#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004855 RLOGD("setLocationUpdatesResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004856#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004857
4858 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004859 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004860 populateResponseInfo(responseInfo, serial, responseType, e);
4861 Return<void> retStatus
4862 = radioService[slotId]->mRadioResponse->setLocationUpdatesResponse(responseInfo);
4863 radioService[slotId]->checkReturnStatus(retStatus);
4864 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004865 RLOGE("setLocationUpdatesResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004866 slotId);
4867 }
4868
4869 return 0;
4870}
4871
Amit Mahajan759786a2017-03-03 17:35:47 -08004872int radio::setCdmaSubscriptionSourceResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004873 int responseType, int serial, RIL_Errno e,
4874 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004875#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004876 RLOGD("setCdmaSubscriptionSourceResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004877#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004878
4879 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004880 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004881 populateResponseInfo(responseInfo, serial, responseType, e);
4882 Return<void> retStatus
4883 = radioService[slotId]->mRadioResponse->setCdmaSubscriptionSourceResponse(
4884 responseInfo);
4885 radioService[slotId]->checkReturnStatus(retStatus);
4886 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004887 RLOGE("setCdmaSubscriptionSourceResponse: 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::setCdmaRoamingPreferenceResponse(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("setCdmaRoamingPreferenceResponse: 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->setCdmaRoamingPreferenceResponse(
4906 responseInfo);
4907 radioService[slotId]->checkReturnStatus(retStatus);
4908 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004909 RLOGE("setCdmaRoamingPreferenceResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004910 slotId);
4911 }
4912
4913 return 0;
4914}
4915
Amit Mahajan759786a2017-03-03 17:35:47 -08004916int radio::getCdmaRoamingPreferenceResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004917 int responseType, int serial, RIL_Errno e,
4918 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004919#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004920 RLOGD("getCdmaRoamingPreferenceResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004921#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004922
4923 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004924 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004925 int ret = responseInt(responseInfo, serial, responseType, e, response, responseLen);
4926 Return<void> retStatus
4927 = radioService[slotId]->mRadioResponse->getCdmaRoamingPreferenceResponse(
4928 responseInfo, (CdmaRoamingType) ret);
4929 radioService[slotId]->checkReturnStatus(retStatus);
4930 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004931 RLOGE("getCdmaRoamingPreferenceResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004932 slotId);
4933 }
4934
4935 return 0;
4936}
4937
Amit Mahajan759786a2017-03-03 17:35:47 -08004938int radio::setTTYModeResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004939 int responseType, int serial, RIL_Errno e,
4940 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004941#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004942 RLOGD("setTTYModeResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004943#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004944
4945 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004946 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004947 populateResponseInfo(responseInfo, serial, responseType, e);
4948 Return<void> retStatus
4949 = radioService[slotId]->mRadioResponse->setTTYModeResponse(responseInfo);
4950 radioService[slotId]->checkReturnStatus(retStatus);
4951 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004952 RLOGE("setTTYModeResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004953 }
4954
4955 return 0;
4956}
4957
Amit Mahajan759786a2017-03-03 17:35:47 -08004958int radio::getTTYModeResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004959 int responseType, int serial, RIL_Errno e,
4960 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004961#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004962 RLOGD("getTTYModeResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004963#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004964
4965 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004966 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004967 int ret = responseInt(responseInfo, serial, responseType, e, response, responseLen);
4968 Return<void> retStatus
4969 = radioService[slotId]->mRadioResponse->getTTYModeResponse(responseInfo,
4970 (TtyMode) ret);
4971 radioService[slotId]->checkReturnStatus(retStatus);
4972 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004973 RLOGE("getTTYModeResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004974 }
4975
4976 return 0;
4977}
4978
Amit Mahajan759786a2017-03-03 17:35:47 -08004979int radio::setPreferredVoicePrivacyResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004980 int responseType, int serial, RIL_Errno e,
4981 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004982#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004983 RLOGD("setPreferredVoicePrivacyResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004984#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004985
4986 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004987 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004988 populateResponseInfo(responseInfo, serial, responseType, e);
4989 Return<void> retStatus
4990 = radioService[slotId]->mRadioResponse->setPreferredVoicePrivacyResponse(
4991 responseInfo);
4992 radioService[slotId]->checkReturnStatus(retStatus);
4993 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004994 RLOGE("setPreferredVoicePrivacyResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004995 slotId);
4996 }
4997
4998 return 0;
4999}
5000
Amit Mahajan759786a2017-03-03 17:35:47 -08005001int radio::getPreferredVoicePrivacyResponse(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("getPreferredVoicePrivacyResponse: 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 populateResponseInfo(responseInfo, serial, responseType, e);
5011 bool enable = false;
5012 int numInts = responseLen / sizeof(int);
5013 if (response == NULL || numInts != 1) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005014 RLOGE("getPreferredVoicePrivacyResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005015 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
5016 } else {
5017 int *pInt = (int *) response;
5018 enable = pInt[0] == 1 ? true : false;
5019 }
5020 Return<void> retStatus
5021 = radioService[slotId]->mRadioResponse->getPreferredVoicePrivacyResponse(
5022 responseInfo, enable);
5023 radioService[slotId]->checkReturnStatus(retStatus);
5024 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005025 RLOGE("getPreferredVoicePrivacyResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005026 slotId);
5027 }
5028
5029 return 0;
5030}
5031
Amit Mahajan759786a2017-03-03 17:35:47 -08005032int radio::sendCDMAFeatureCodeResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005033 int responseType, int serial, RIL_Errno e,
5034 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005035#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005036 RLOGD("sendCDMAFeatureCodeResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005037#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005038
5039 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005040 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005041 populateResponseInfo(responseInfo, serial, responseType, e);
5042 Return<void> retStatus
5043 = radioService[slotId]->mRadioResponse->sendCDMAFeatureCodeResponse(responseInfo);
5044 radioService[slotId]->checkReturnStatus(retStatus);
5045 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005046 RLOGE("sendCDMAFeatureCodeResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005047 slotId);
5048 }
5049
5050 return 0;
5051}
5052
Amit Mahajan759786a2017-03-03 17:35:47 -08005053int radio::sendBurstDtmfResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005054 int responseType, int serial, RIL_Errno e,
5055 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005056#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005057 RLOGD("sendBurstDtmfResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005058#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005059
5060 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005061 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005062 populateResponseInfo(responseInfo, serial, responseType, e);
5063 Return<void> retStatus
5064 = radioService[slotId]->mRadioResponse->sendBurstDtmfResponse(responseInfo);
5065 radioService[slotId]->checkReturnStatus(retStatus);
5066 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005067 RLOGE("sendBurstDtmfResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005068 }
5069
5070 return 0;
5071}
5072
Amit Mahajan759786a2017-03-03 17:35:47 -08005073int radio::sendCdmaSmsResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005074 int responseType, int serial, RIL_Errno e, void *response,
5075 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005076#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005077 RLOGD("sendCdmaSmsResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005078#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005079
5080 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005081 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005082 SendSmsResult result = makeSendSmsResult(responseInfo, serial, responseType, e, response,
5083 responseLen);
5084
5085 Return<void> retStatus
5086 = radioService[slotId]->mRadioResponse->sendCdmaSmsResponse(responseInfo, result);
5087 radioService[slotId]->checkReturnStatus(retStatus);
5088 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005089 RLOGE("sendCdmaSmsResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005090 }
5091
5092 return 0;
5093}
5094
Amit Mahajan759786a2017-03-03 17:35:47 -08005095int radio::acknowledgeLastIncomingCdmaSmsResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005096 int responseType, int serial, RIL_Errno e,
5097 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005098#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005099 RLOGD("acknowledgeLastIncomingCdmaSmsResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005100#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005101
5102 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005103 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005104 populateResponseInfo(responseInfo, serial, responseType, e);
5105 Return<void> retStatus
5106 = radioService[slotId]->mRadioResponse->acknowledgeLastIncomingCdmaSmsResponse(
5107 responseInfo);
5108 radioService[slotId]->checkReturnStatus(retStatus);
5109 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005110 RLOGE("acknowledgeLastIncomingCdmaSmsResponse: radioService[%d]->mRadioResponse "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005111 "== NULL", slotId);
5112 }
5113
5114 return 0;
5115}
5116
Amit Mahajan759786a2017-03-03 17:35:47 -08005117int radio::getGsmBroadcastConfigResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005118 int responseType, int serial, RIL_Errno e,
5119 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005120#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005121 RLOGD("getGsmBroadcastConfigResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005122#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005123
5124 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005125 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005126 populateResponseInfo(responseInfo, serial, responseType, e);
5127 hidl_vec<GsmBroadcastSmsConfigInfo> configs;
5128
Amit Mahajan13058cb2017-06-07 23:10:27 -07005129 if ((response == NULL && responseLen != 0)
5130 || responseLen % sizeof(RIL_GSM_BroadcastSmsConfigInfo *) != 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005131 RLOGE("getGsmBroadcastConfigResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005132 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
5133 } else {
5134 int num = responseLen / sizeof(RIL_GSM_BroadcastSmsConfigInfo *);
5135 configs.resize(num);
5136 for (int i = 0 ; i < num; i++) {
5137 RIL_GSM_BroadcastSmsConfigInfo *resp =
5138 ((RIL_GSM_BroadcastSmsConfigInfo **) response)[i];
5139 configs[i].fromServiceId = resp->fromServiceId;
5140 configs[i].toServiceId = resp->toServiceId;
5141 configs[i].fromCodeScheme = resp->fromCodeScheme;
5142 configs[i].toCodeScheme = resp->toCodeScheme;
5143 configs[i].selected = resp->selected == 1 ? true : false;
5144 }
5145 }
5146
5147 Return<void> retStatus
5148 = radioService[slotId]->mRadioResponse->getGsmBroadcastConfigResponse(responseInfo,
5149 configs);
5150 radioService[slotId]->checkReturnStatus(retStatus);
5151 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005152 RLOGE("getGsmBroadcastConfigResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005153 slotId);
5154 }
5155
5156 return 0;
5157}
5158
Amit Mahajan759786a2017-03-03 17:35:47 -08005159int radio::setGsmBroadcastConfigResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005160 int responseType, int serial, RIL_Errno e,
5161 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005162#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005163 RLOGD("setGsmBroadcastConfigResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005164#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005165
5166 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005167 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005168 populateResponseInfo(responseInfo, serial, responseType, e);
5169 Return<void> retStatus
5170 = radioService[slotId]->mRadioResponse->setGsmBroadcastConfigResponse(responseInfo);
5171 radioService[slotId]->checkReturnStatus(retStatus);
5172 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005173 RLOGE("setGsmBroadcastConfigResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005174 slotId);
5175 }
5176
5177 return 0;
5178}
5179
Amit Mahajan759786a2017-03-03 17:35:47 -08005180int radio::setGsmBroadcastActivationResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005181 int responseType, int serial, RIL_Errno e,
5182 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005183#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005184 RLOGD("setGsmBroadcastActivationResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005185#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005186
5187 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005188 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005189 populateResponseInfo(responseInfo, serial, responseType, e);
5190 Return<void> retStatus
5191 = radioService[slotId]->mRadioResponse->setGsmBroadcastActivationResponse(
5192 responseInfo);
5193 radioService[slotId]->checkReturnStatus(retStatus);
5194 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005195 RLOGE("setGsmBroadcastActivationResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005196 slotId);
5197 }
5198
5199 return 0;
5200}
5201
Amit Mahajan759786a2017-03-03 17:35:47 -08005202int radio::getCdmaBroadcastConfigResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005203 int responseType, int serial, RIL_Errno e,
5204 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005205#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005206 RLOGD("getCdmaBroadcastConfigResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005207#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005208
5209 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005210 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005211 populateResponseInfo(responseInfo, serial, responseType, e);
5212 hidl_vec<CdmaBroadcastSmsConfigInfo> configs;
5213
Amit Mahajan13058cb2017-06-07 23:10:27 -07005214 if ((response == NULL && responseLen != 0)
5215 || responseLen % sizeof(RIL_CDMA_BroadcastSmsConfigInfo *) != 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005216 RLOGE("getCdmaBroadcastConfigResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005217 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
5218 } else {
5219 int num = responseLen / sizeof(RIL_CDMA_BroadcastSmsConfigInfo *);
5220 configs.resize(num);
5221 for (int i = 0 ; i < num; i++) {
5222 RIL_CDMA_BroadcastSmsConfigInfo *resp =
5223 ((RIL_CDMA_BroadcastSmsConfigInfo **) response)[i];
5224 configs[i].serviceCategory = resp->service_category;
5225 configs[i].language = resp->language;
5226 configs[i].selected = resp->selected == 1 ? true : false;
5227 }
5228 }
5229
5230 Return<void> retStatus
5231 = radioService[slotId]->mRadioResponse->getCdmaBroadcastConfigResponse(responseInfo,
5232 configs);
5233 radioService[slotId]->checkReturnStatus(retStatus);
5234 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005235 RLOGE("getCdmaBroadcastConfigResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005236 slotId);
5237 }
5238
5239 return 0;
5240}
5241
Amit Mahajan759786a2017-03-03 17:35:47 -08005242int radio::setCdmaBroadcastConfigResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005243 int responseType, int serial, RIL_Errno e,
5244 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005245#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005246 RLOGD("setCdmaBroadcastConfigResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005247#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005248
5249 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005250 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005251 populateResponseInfo(responseInfo, serial, responseType, e);
5252 Return<void> retStatus
5253 = radioService[slotId]->mRadioResponse->setCdmaBroadcastConfigResponse(
5254 responseInfo);
5255 radioService[slotId]->checkReturnStatus(retStatus);
5256 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005257 RLOGE("setCdmaBroadcastConfigResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005258 slotId);
5259 }
5260
5261 return 0;
5262}
5263
Amit Mahajan759786a2017-03-03 17:35:47 -08005264int radio::setCdmaBroadcastActivationResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005265 int responseType, int serial, RIL_Errno e,
5266 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005267#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005268 RLOGD("setCdmaBroadcastActivationResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005269#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005270
5271 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005272 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005273 populateResponseInfo(responseInfo, serial, responseType, e);
5274 Return<void> retStatus
5275 = radioService[slotId]->mRadioResponse->setCdmaBroadcastActivationResponse(
5276 responseInfo);
5277 radioService[slotId]->checkReturnStatus(retStatus);
5278 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005279 RLOGE("setCdmaBroadcastActivationResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005280 slotId);
5281 }
5282
5283 return 0;
5284}
5285
Amit Mahajan759786a2017-03-03 17:35:47 -08005286int radio::getCDMASubscriptionResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005287 int responseType, int serial, RIL_Errno e, void *response,
5288 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005289#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005290 RLOGD("getCDMASubscriptionResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005291#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005292
5293 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005294 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005295 populateResponseInfo(responseInfo, serial, responseType, e);
5296
5297 int numStrings = responseLen / sizeof(char *);
5298 hidl_string emptyString;
5299 if (response == NULL || numStrings != 5) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005300 RLOGE("getOperatorResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005301 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
5302 Return<void> retStatus
5303 = radioService[slotId]->mRadioResponse->getCDMASubscriptionResponse(
5304 responseInfo, emptyString, emptyString, emptyString, emptyString, emptyString);
5305 radioService[slotId]->checkReturnStatus(retStatus);
5306 } else {
5307 char **resp = (char **) response;
5308 Return<void> retStatus
5309 = radioService[slotId]->mRadioResponse->getCDMASubscriptionResponse(
5310 responseInfo,
5311 convertCharPtrToHidlString(resp[0]),
5312 convertCharPtrToHidlString(resp[1]),
5313 convertCharPtrToHidlString(resp[2]),
5314 convertCharPtrToHidlString(resp[3]),
5315 convertCharPtrToHidlString(resp[4]));
5316 radioService[slotId]->checkReturnStatus(retStatus);
5317 }
5318 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005319 RLOGE("getCDMASubscriptionResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005320 slotId);
5321 }
5322
5323 return 0;
5324}
5325
Amit Mahajan759786a2017-03-03 17:35:47 -08005326int radio::writeSmsToRuimResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005327 int responseType, int serial, RIL_Errno e,
5328 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005329#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005330 RLOGD("writeSmsToRuimResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005331#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005332
5333 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005334 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005335 int ret = responseInt(responseInfo, serial, responseType, e, response, responseLen);
5336 Return<void> retStatus
5337 = radioService[slotId]->mRadioResponse->writeSmsToRuimResponse(responseInfo, ret);
5338 radioService[slotId]->checkReturnStatus(retStatus);
5339 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005340 RLOGE("writeSmsToRuimResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005341 }
5342
5343 return 0;
5344}
5345
Amit Mahajan759786a2017-03-03 17:35:47 -08005346int radio::deleteSmsOnRuimResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005347 int responseType, int serial, RIL_Errno e,
5348 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005349#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005350 RLOGD("deleteSmsOnRuimResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005351#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005352
5353 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005354 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005355 populateResponseInfo(responseInfo, serial, responseType, e);
5356 Return<void> retStatus
5357 = radioService[slotId]->mRadioResponse->deleteSmsOnRuimResponse(responseInfo);
5358 radioService[slotId]->checkReturnStatus(retStatus);
5359 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005360 RLOGE("deleteSmsOnRuimResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005361 }
5362
5363 return 0;
5364}
5365
Amit Mahajan759786a2017-03-03 17:35:47 -08005366int radio::getDeviceIdentityResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005367 int responseType, int serial, RIL_Errno e, void *response,
5368 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005369#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005370 RLOGD("getDeviceIdentityResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005371#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005372
5373 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005374 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005375 populateResponseInfo(responseInfo, serial, responseType, e);
5376
5377 int numStrings = responseLen / sizeof(char *);
5378 hidl_string emptyString;
5379 if (response == NULL || numStrings != 4) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005380 RLOGE("getDeviceIdentityResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005381 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
5382 Return<void> retStatus
5383 = radioService[slotId]->mRadioResponse->getDeviceIdentityResponse(responseInfo,
5384 emptyString, emptyString, emptyString, emptyString);
5385 radioService[slotId]->checkReturnStatus(retStatus);
5386 } else {
5387 char **resp = (char **) response;
5388 Return<void> retStatus
5389 = radioService[slotId]->mRadioResponse->getDeviceIdentityResponse(responseInfo,
5390 convertCharPtrToHidlString(resp[0]),
5391 convertCharPtrToHidlString(resp[1]),
5392 convertCharPtrToHidlString(resp[2]),
5393 convertCharPtrToHidlString(resp[3]));
5394 radioService[slotId]->checkReturnStatus(retStatus);
5395 }
5396 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005397 RLOGE("getDeviceIdentityResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005398 slotId);
5399 }
5400
5401 return 0;
5402}
5403
Amit Mahajan759786a2017-03-03 17:35:47 -08005404int radio::exitEmergencyCallbackModeResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005405 int responseType, int serial, RIL_Errno e,
5406 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005407#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005408 RLOGD("exitEmergencyCallbackModeResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005409#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005410
5411 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005412 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005413 populateResponseInfo(responseInfo, serial, responseType, e);
5414 Return<void> retStatus
5415 = radioService[slotId]->mRadioResponse->exitEmergencyCallbackModeResponse(
5416 responseInfo);
5417 radioService[slotId]->checkReturnStatus(retStatus);
5418 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005419 RLOGE("exitEmergencyCallbackModeResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005420 slotId);
5421 }
5422
5423 return 0;
5424}
5425
Amit Mahajan759786a2017-03-03 17:35:47 -08005426int radio::getSmscAddressResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005427 int responseType, int serial, RIL_Errno e,
5428 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005429#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005430 RLOGD("getSmscAddressResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005431#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005432
5433 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005434 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005435 populateResponseInfo(responseInfo, serial, responseType, e);
5436 Return<void> retStatus
5437 = radioService[slotId]->mRadioResponse->getSmscAddressResponse(responseInfo,
5438 convertCharPtrToHidlString((char *) response));
5439 radioService[slotId]->checkReturnStatus(retStatus);
5440 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005441 RLOGE("getSmscAddressResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005442 }
5443
5444 return 0;
5445}
5446
Amit Mahajan759786a2017-03-03 17:35:47 -08005447int radio::setSmscAddressResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005448 int responseType, int serial, RIL_Errno e,
5449 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005450#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005451 RLOGD("setSmscAddressResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005452#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005453
5454 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005455 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005456 populateResponseInfo(responseInfo, serial, responseType, e);
5457 Return<void> retStatus
5458 = radioService[slotId]->mRadioResponse->setSmscAddressResponse(responseInfo);
5459 radioService[slotId]->checkReturnStatus(retStatus);
5460 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005461 RLOGE("setSmscAddressResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005462 }
5463
5464 return 0;
5465}
5466
Amit Mahajan759786a2017-03-03 17:35:47 -08005467int radio::reportSmsMemoryStatusResponse(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("reportSmsMemoryStatusResponse: 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->reportSmsMemoryStatusResponse(responseInfo);
5479 radioService[slotId]->checkReturnStatus(retStatus);
5480 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005481 RLOGE("reportSmsMemoryStatusResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005482 slotId);
5483 }
5484
5485 return 0;
5486}
5487
Amit Mahajan759786a2017-03-03 17:35:47 -08005488int radio::reportStkServiceIsRunningResponse(int slotId,
Amit Mahajan5007ffa2017-01-31 17:14:42 -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("reportStkServiceIsRunningResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005493#endif
Amit Mahajan5007ffa2017-01-31 17:14:42 -08005494
5495 if (radioService[slotId]->mRadioResponse != NULL) {
Amit Mahajan3da9ac02017-02-13 13:41:28 -08005496 RadioResponseInfo responseInfo = {};
Amit Mahajan5007ffa2017-01-31 17:14:42 -08005497 populateResponseInfo(responseInfo, serial, responseType, e);
5498 Return<void> retStatus = radioService[slotId]->mRadioResponse->
5499 reportStkServiceIsRunningResponse(responseInfo);
5500 radioService[slotId]->checkReturnStatus(retStatus);
5501 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005502 RLOGE("reportStkServiceIsRunningResponse: radioService[%d]->mRadioResponse == NULL",
Amit Mahajan5007ffa2017-01-31 17:14:42 -08005503 slotId);
5504 }
5505
5506 return 0;
5507}
5508
Amit Mahajan759786a2017-03-03 17:35:47 -08005509int radio::getCdmaSubscriptionSourceResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005510 int responseType, int serial, RIL_Errno e,
5511 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005512#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005513 RLOGD("getCdmaSubscriptionSourceResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005514#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005515
5516 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005517 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005518 int ret = responseInt(responseInfo, serial, responseType, e, response, responseLen);
5519 Return<void> retStatus
5520 = radioService[slotId]->mRadioResponse->getCdmaSubscriptionSourceResponse(
5521 responseInfo, (CdmaSubscriptionSource) ret);
5522 radioService[slotId]->checkReturnStatus(retStatus);
5523 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005524 RLOGE("getCdmaSubscriptionSourceResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005525 slotId);
5526 }
5527
5528 return 0;
5529}
5530
Amit Mahajan759786a2017-03-03 17:35:47 -08005531int radio::requestIsimAuthenticationResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005532 int responseType, int serial, RIL_Errno e,
5533 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005534#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005535 RLOGD("requestIsimAuthenticationResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005536#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005537
5538 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005539 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005540 populateResponseInfo(responseInfo, serial, responseType, e);
5541 Return<void> retStatus
5542 = radioService[slotId]->mRadioResponse->requestIsimAuthenticationResponse(
5543 responseInfo,
5544 convertCharPtrToHidlString((char *) response));
5545 radioService[slotId]->checkReturnStatus(retStatus);
5546 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005547 RLOGE("requestIsimAuthenticationResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005548 slotId);
5549 }
5550
5551 return 0;
5552}
5553
Amit Mahajan759786a2017-03-03 17:35:47 -08005554int radio::acknowledgeIncomingGsmSmsWithPduResponse(int slotId,
5555 int responseType,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005556 int serial, RIL_Errno e, void *response,
5557 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005558#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005559 RLOGD("acknowledgeIncomingGsmSmsWithPduResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005560#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005561
5562 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005563 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005564 populateResponseInfo(responseInfo, serial, responseType, e);
5565 Return<void> retStatus
5566 = radioService[slotId]->mRadioResponse->acknowledgeIncomingGsmSmsWithPduResponse(
5567 responseInfo);
5568 radioService[slotId]->checkReturnStatus(retStatus);
5569 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005570 RLOGE("acknowledgeIncomingGsmSmsWithPduResponse: radioService[%d]->mRadioResponse "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005571 "== NULL", slotId);
5572 }
5573
5574 return 0;
5575}
5576
Amit Mahajan759786a2017-03-03 17:35:47 -08005577int radio::sendEnvelopeWithStatusResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005578 int responseType, int serial, RIL_Errno e, void *response,
5579 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005580#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005581 RLOGD("sendEnvelopeWithStatusResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005582#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005583
5584 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005585 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005586 IccIoResult result = responseIccIo(responseInfo, serial, responseType, e,
5587 response, responseLen);
5588
5589 Return<void> retStatus
5590 = radioService[slotId]->mRadioResponse->sendEnvelopeWithStatusResponse(responseInfo,
5591 result);
5592 radioService[slotId]->checkReturnStatus(retStatus);
5593 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005594 RLOGE("sendEnvelopeWithStatusResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005595 slotId);
5596 }
5597
5598 return 0;
5599}
5600
Amit Mahajan759786a2017-03-03 17:35:47 -08005601int radio::getVoiceRadioTechnologyResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005602 int responseType, int serial, RIL_Errno e,
5603 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005604#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005605 RLOGD("getVoiceRadioTechnologyResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005606#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005607
5608 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005609 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005610 int ret = responseInt(responseInfo, serial, responseType, e, response, responseLen);
5611 Return<void> retStatus
5612 = radioService[slotId]->mRadioResponse->getVoiceRadioTechnologyResponse(
5613 responseInfo, (RadioTechnology) ret);
5614 radioService[slotId]->checkReturnStatus(retStatus);
5615 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005616 RLOGE("getVoiceRadioTechnologyResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005617 slotId);
5618 }
5619
5620 return 0;
5621}
5622
Amit Mahajan759786a2017-03-03 17:35:47 -08005623int radio::getCellInfoListResponse(int slotId,
5624 int responseType,
Amit Mahajan3df62912017-02-10 01:35:55 +00005625 int serial, RIL_Errno e, void *response,
5626 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005627#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005628 RLOGD("getCellInfoListResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005629#endif
Amit Mahajan3df62912017-02-10 01:35:55 +00005630
5631 if (radioService[slotId]->mRadioResponse != NULL) {
Amit Mahajan3da9ac02017-02-13 13:41:28 -08005632 RadioResponseInfo responseInfo = {};
Amit Mahajan3df62912017-02-10 01:35:55 +00005633 populateResponseInfo(responseInfo, serial, responseType, e);
5634
5635 hidl_vec<CellInfo> ret;
Amit Mahajan13058cb2017-06-07 23:10:27 -07005636 if ((response == NULL && responseLen != 0)
5637 || responseLen % sizeof(RIL_CellInfo_v12) != 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005638 RLOGE("getCellInfoListResponse: Invalid response");
Amit Mahajan3df62912017-02-10 01:35:55 +00005639 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
5640 } else {
5641 convertRilCellInfoListToHal(response, responseLen, ret);
5642 }
5643
5644 Return<void> retStatus = radioService[slotId]->mRadioResponse->getCellInfoListResponse(
5645 responseInfo, ret);
5646 radioService[slotId]->checkReturnStatus(retStatus);
5647 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005648 RLOGE("getCellInfoListResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Amit Mahajan3df62912017-02-10 01:35:55 +00005649 }
5650
5651 return 0;
5652}
5653
Amit Mahajan759786a2017-03-03 17:35:47 -08005654int radio::setCellInfoListRateResponse(int slotId,
5655 int responseType,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005656 int serial, RIL_Errno e, void *response,
5657 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005658#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005659 RLOGD("setCellInfoListRateResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005660#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005661
5662 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005663 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005664 populateResponseInfo(responseInfo, serial, responseType, e);
5665 Return<void> retStatus
5666 = radioService[slotId]->mRadioResponse->setCellInfoListRateResponse(responseInfo);
5667 radioService[slotId]->checkReturnStatus(retStatus);
5668 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005669 RLOGE("setCellInfoListRateResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005670 slotId);
5671 }
5672
5673 return 0;
5674}
5675
Amit Mahajan759786a2017-03-03 17:35:47 -08005676int radio::setInitialAttachApnResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005677 int responseType, int serial, RIL_Errno e,
5678 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005679#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005680 RLOGD("setInitialAttachApnResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005681#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005682
5683 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005684 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005685 populateResponseInfo(responseInfo, serial, responseType, e);
5686 Return<void> retStatus
5687 = radioService[slotId]->mRadioResponse->setInitialAttachApnResponse(responseInfo);
5688 radioService[slotId]->checkReturnStatus(retStatus);
5689 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005690 RLOGE("setInitialAttachApnResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005691 slotId);
5692 }
5693
5694 return 0;
5695}
5696
Amit Mahajan759786a2017-03-03 17:35:47 -08005697int radio::getImsRegistrationStateResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005698 int responseType, int serial, RIL_Errno e,
5699 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005700#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005701 RLOGD("getImsRegistrationStateResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005702#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005703
5704 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005705 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005706 populateResponseInfo(responseInfo, serial, responseType, e);
5707 bool isRegistered = false;
5708 int ratFamily = 0;
5709 int numInts = responseLen / sizeof(int);
5710 if (response == NULL || numInts != 2) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005711 RLOGE("getImsRegistrationStateResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005712 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
5713 } else {
5714 int *pInt = (int *) response;
5715 isRegistered = pInt[0] == 1 ? true : false;
5716 ratFamily = pInt[1];
5717 }
5718 Return<void> retStatus
5719 = radioService[slotId]->mRadioResponse->getImsRegistrationStateResponse(
5720 responseInfo, isRegistered, (RadioTechnologyFamily) ratFamily);
5721 radioService[slotId]->checkReturnStatus(retStatus);
5722 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005723 RLOGE("getImsRegistrationStateResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005724 slotId);
5725 }
5726
5727 return 0;
5728}
5729
Amit Mahajan759786a2017-03-03 17:35:47 -08005730int radio::sendImsSmsResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005731 int responseType, int serial, RIL_Errno e, void *response,
5732 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005733#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005734 RLOGD("sendImsSmsResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005735#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005736
5737 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005738 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005739 SendSmsResult result = makeSendSmsResult(responseInfo, serial, responseType, e, response,
5740 responseLen);
5741
5742 Return<void> retStatus
5743 = radioService[slotId]->mRadioResponse->sendImsSmsResponse(responseInfo, result);
5744 radioService[slotId]->checkReturnStatus(retStatus);
5745 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005746 RLOGE("sendSmsResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005747 }
5748
5749 return 0;
5750}
5751
Amit Mahajan759786a2017-03-03 17:35:47 -08005752int radio::iccTransmitApduBasicChannelResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005753 int responseType, int serial, RIL_Errno e,
5754 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005755#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005756 RLOGD("iccTransmitApduBasicChannelResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005757#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005758
5759 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005760 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005761 IccIoResult result = responseIccIo(responseInfo, serial, responseType, e, response,
5762 responseLen);
5763
5764 Return<void> retStatus
5765 = radioService[slotId]->mRadioResponse->iccTransmitApduBasicChannelResponse(
5766 responseInfo, result);
5767 radioService[slotId]->checkReturnStatus(retStatus);
5768 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005769 RLOGE("iccTransmitApduBasicChannelResponse: radioService[%d]->mRadioResponse "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005770 "== NULL", slotId);
5771 }
5772
5773 return 0;
5774}
5775
Amit Mahajan759786a2017-03-03 17:35:47 -08005776int radio::iccOpenLogicalChannelResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005777 int responseType, int serial, RIL_Errno e, void *response,
5778 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005779#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005780 RLOGD("iccOpenLogicalChannelResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005781#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005782
5783 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005784 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005785 populateResponseInfo(responseInfo, serial, responseType, e);
5786 int channelId = -1;
5787 hidl_vec<int8_t> selectResponse;
5788 int numInts = responseLen / sizeof(int);
5789 if (response == NULL || responseLen % sizeof(int) != 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005790 RLOGE("iccOpenLogicalChannelResponse Invalid response: NULL");
Amit Mahajan13058cb2017-06-07 23:10:27 -07005791 if (response != NULL) {
5792 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
5793 }
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005794 } else {
5795 int *pInt = (int *) response;
5796 channelId = pInt[0];
5797 selectResponse.resize(numInts - 1);
5798 for (int i = 1; i < numInts; i++) {
5799 selectResponse[i - 1] = (int8_t) pInt[i];
5800 }
5801 }
5802 Return<void> retStatus
5803 = radioService[slotId]->mRadioResponse->iccOpenLogicalChannelResponse(responseInfo,
5804 channelId, selectResponse);
5805 radioService[slotId]->checkReturnStatus(retStatus);
5806 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005807 RLOGE("iccOpenLogicalChannelResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005808 slotId);
5809 }
5810
5811 return 0;
5812}
5813
Amit Mahajan759786a2017-03-03 17:35:47 -08005814int radio::iccCloseLogicalChannelResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005815 int responseType, int serial, RIL_Errno e,
5816 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005817#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005818 RLOGD("iccCloseLogicalChannelResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005819#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005820
5821 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005822 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005823 populateResponseInfo(responseInfo, serial, responseType, e);
5824 Return<void> retStatus
5825 = radioService[slotId]->mRadioResponse->iccCloseLogicalChannelResponse(
5826 responseInfo);
5827 radioService[slotId]->checkReturnStatus(retStatus);
5828 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005829 RLOGE("iccCloseLogicalChannelResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005830 slotId);
5831 }
5832
5833 return 0;
5834}
5835
Amit Mahajan759786a2017-03-03 17:35:47 -08005836int radio::iccTransmitApduLogicalChannelResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005837 int responseType, int serial, RIL_Errno e,
5838 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005839#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005840 RLOGD("iccTransmitApduLogicalChannelResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005841#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005842
5843 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005844 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005845 IccIoResult result = responseIccIo(responseInfo, serial, responseType, e, response,
5846 responseLen);
5847
5848 Return<void> retStatus
5849 = radioService[slotId]->mRadioResponse->iccTransmitApduLogicalChannelResponse(
5850 responseInfo, result);
5851 radioService[slotId]->checkReturnStatus(retStatus);
5852 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005853 RLOGE("iccTransmitApduLogicalChannelResponse: radioService[%d]->mRadioResponse "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005854 "== NULL", slotId);
5855 }
5856
5857 return 0;
5858}
5859
Amit Mahajan759786a2017-03-03 17:35:47 -08005860int radio::nvReadItemResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005861 int responseType, int serial, RIL_Errno e,
5862 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005863#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005864 RLOGD("nvReadItemResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005865#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005866
5867 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005868 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005869 populateResponseInfo(responseInfo, serial, responseType, e);
5870 Return<void> retStatus = radioService[slotId]->mRadioResponse->nvReadItemResponse(
5871 responseInfo,
5872 convertCharPtrToHidlString((char *) response));
5873 radioService[slotId]->checkReturnStatus(retStatus);
5874 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005875 RLOGE("nvReadItemResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005876 }
5877
5878 return 0;
5879}
5880
Amit Mahajan759786a2017-03-03 17:35:47 -08005881int radio::nvWriteItemResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005882 int responseType, int serial, RIL_Errno e,
5883 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005884#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005885 RLOGD("nvWriteItemResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005886#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005887
5888 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005889 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005890 populateResponseInfo(responseInfo, serial, responseType, e);
5891 Return<void> retStatus
5892 = radioService[slotId]->mRadioResponse->nvWriteItemResponse(responseInfo);
5893 radioService[slotId]->checkReturnStatus(retStatus);
5894 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005895 RLOGE("nvWriteItemResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005896 }
5897
5898 return 0;
5899}
5900
Amit Mahajan759786a2017-03-03 17:35:47 -08005901int radio::nvWriteCdmaPrlResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005902 int responseType, int serial, RIL_Errno e,
5903 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005904#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005905 RLOGD("nvWriteCdmaPrlResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005906#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005907
5908 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005909 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005910 populateResponseInfo(responseInfo, serial, responseType, e);
5911 Return<void> retStatus
5912 = radioService[slotId]->mRadioResponse->nvWriteCdmaPrlResponse(responseInfo);
5913 radioService[slotId]->checkReturnStatus(retStatus);
5914 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005915 RLOGE("nvWriteCdmaPrlResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005916 }
5917
5918 return 0;
5919}
5920
Amit Mahajan759786a2017-03-03 17:35:47 -08005921int radio::nvResetConfigResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005922 int responseType, int serial, RIL_Errno e,
5923 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005924#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005925 RLOGD("nvResetConfigResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005926#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005927
5928 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005929 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005930 populateResponseInfo(responseInfo, serial, responseType, e);
5931 Return<void> retStatus
5932 = radioService[slotId]->mRadioResponse->nvResetConfigResponse(responseInfo);
5933 radioService[slotId]->checkReturnStatus(retStatus);
5934 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005935 RLOGE("nvResetConfigResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005936 }
5937
5938 return 0;
5939}
5940
Amit Mahajan759786a2017-03-03 17:35:47 -08005941int radio::setUiccSubscriptionResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005942 int responseType, int serial, RIL_Errno e,
5943 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005944#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005945 RLOGD("setUiccSubscriptionResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005946#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005947
5948 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005949 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005950 populateResponseInfo(responseInfo, serial, responseType, e);
5951 Return<void> retStatus
5952 = radioService[slotId]->mRadioResponse->setUiccSubscriptionResponse(responseInfo);
5953 radioService[slotId]->checkReturnStatus(retStatus);
5954 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005955 RLOGE("setUiccSubscriptionResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005956 slotId);
5957 }
5958
5959 return 0;
5960}
5961
Amit Mahajan759786a2017-03-03 17:35:47 -08005962int radio::setDataAllowedResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005963 int responseType, int serial, RIL_Errno e,
5964 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005965#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005966 RLOGD("setDataAllowedResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005967#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005968
5969 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005970 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005971 populateResponseInfo(responseInfo, serial, responseType, e);
5972 Return<void> retStatus
5973 = radioService[slotId]->mRadioResponse->setDataAllowedResponse(responseInfo);
5974 radioService[slotId]->checkReturnStatus(retStatus);
5975 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005976 RLOGE("setDataAllowedResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005977 }
5978
5979 return 0;
5980}
5981
Amit Mahajan759786a2017-03-03 17:35:47 -08005982int radio::getHardwareConfigResponse(int slotId,
Amit Mahajan3df62912017-02-10 01:35:55 +00005983 int responseType, int serial, RIL_Errno e,
5984 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005985#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005986 RLOGD("getHardwareConfigResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005987#endif
Amit Mahajan3df62912017-02-10 01:35:55 +00005988
5989 if (radioService[slotId]->mRadioResponse != NULL) {
Amit Mahajan3da9ac02017-02-13 13:41:28 -08005990 RadioResponseInfo responseInfo = {};
Amit Mahajan3df62912017-02-10 01:35:55 +00005991 populateResponseInfo(responseInfo, serial, responseType, e);
5992
5993 hidl_vec<HardwareConfig> result;
Amit Mahajan13058cb2017-06-07 23:10:27 -07005994 if ((response == NULL && responseLen != 0)
5995 || responseLen % sizeof(RIL_HardwareConfig) != 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005996 RLOGE("hardwareConfigChangedInd: invalid response");
Amit Mahajan3df62912017-02-10 01:35:55 +00005997 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
5998 } else {
5999 convertRilHardwareConfigListToHal(response, responseLen, result);
6000 }
6001
6002 Return<void> retStatus = radioService[slotId]->mRadioResponse->getHardwareConfigResponse(
6003 responseInfo, result);
6004 radioService[slotId]->checkReturnStatus(retStatus);
6005 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006006 RLOGE("getHardwareConfigResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Amit Mahajan3df62912017-02-10 01:35:55 +00006007 }
6008
6009 return 0;
6010}
6011
Amit Mahajan759786a2017-03-03 17:35:47 -08006012int radio::requestIccSimAuthenticationResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006013 int responseType, int serial, RIL_Errno e,
6014 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006015#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006016 RLOGD("requestIccSimAuthenticationResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006017#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006018
6019 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08006020 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006021 IccIoResult result = responseIccIo(responseInfo, serial, responseType, e, response,
6022 responseLen);
6023
6024 Return<void> retStatus
6025 = radioService[slotId]->mRadioResponse->requestIccSimAuthenticationResponse(
6026 responseInfo, result);
6027 radioService[slotId]->checkReturnStatus(retStatus);
6028 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006029 RLOGE("requestIccSimAuthenticationResponse: radioService[%d]->mRadioResponse "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006030 "== NULL", slotId);
6031 }
6032
6033 return 0;
6034}
6035
Amit Mahajan759786a2017-03-03 17:35:47 -08006036int radio::setDataProfileResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006037 int responseType, int serial, RIL_Errno e,
6038 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006039#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006040 RLOGD("setDataProfileResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006041#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006042
6043 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08006044 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006045 populateResponseInfo(responseInfo, serial, responseType, e);
6046 Return<void> retStatus
6047 = radioService[slotId]->mRadioResponse->setDataProfileResponse(responseInfo);
6048 radioService[slotId]->checkReturnStatus(retStatus);
6049 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006050 RLOGE("setDataProfileResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006051 }
6052
6053 return 0;
6054}
6055
Amit Mahajan759786a2017-03-03 17:35:47 -08006056int radio::requestShutdownResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006057 int responseType, int serial, RIL_Errno e,
6058 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006059#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006060 RLOGD("requestShutdownResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006061#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006062
6063 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08006064 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006065 populateResponseInfo(responseInfo, serial, responseType, e);
6066 Return<void> retStatus
6067 = radioService[slotId]->mRadioResponse->requestShutdownResponse(responseInfo);
6068 radioService[slotId]->checkReturnStatus(retStatus);
6069 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006070 RLOGE("requestShutdownResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006071 }
6072
6073 return 0;
6074}
6075
Amit Mahajan3df62912017-02-10 01:35:55 +00006076void responseRadioCapability(RadioResponseInfo& responseInfo, int serial,
6077 int responseType, RIL_Errno e, void *response, size_t responseLen, RadioCapability& rc) {
6078 populateResponseInfo(responseInfo, serial, responseType, e);
6079
Amit Mahajan1fbff082017-02-24 11:24:39 -08006080 if (response == NULL || responseLen != sizeof(RIL_RadioCapability)) {
Amit Mahajan3df62912017-02-10 01:35:55 +00006081 RLOGE("responseRadioCapability: Invalid response");
6082 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
Amit Mahajan3da9ac02017-02-13 13:41:28 -08006083 rc.logicalModemUuid = hidl_string();
Amit Mahajan3df62912017-02-10 01:35:55 +00006084 } else {
6085 convertRilRadioCapabilityToHal(response, responseLen, rc);
6086 }
6087}
6088
Amit Mahajan759786a2017-03-03 17:35:47 -08006089int radio::getRadioCapabilityResponse(int slotId,
Amit Mahajan3df62912017-02-10 01:35:55 +00006090 int responseType, int serial, RIL_Errno e,
6091 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006092#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006093 RLOGD("getRadioCapabilityResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006094#endif
Amit Mahajan3df62912017-02-10 01:35:55 +00006095
6096 if (radioService[slotId]->mRadioResponse != NULL) {
Amit Mahajan3da9ac02017-02-13 13:41:28 -08006097 RadioResponseInfo responseInfo = {};
6098 RadioCapability result = {};
Amit Mahajan3df62912017-02-10 01:35:55 +00006099 responseRadioCapability(responseInfo, serial, responseType, e, response, responseLen,
6100 result);
6101 Return<void> retStatus = radioService[slotId]->mRadioResponse->getRadioCapabilityResponse(
6102 responseInfo, result);
6103 radioService[slotId]->checkReturnStatus(retStatus);
6104 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006105 RLOGE("getRadioCapabilityResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Amit Mahajan3df62912017-02-10 01:35:55 +00006106 }
6107
6108 return 0;
6109}
6110
Amit Mahajan759786a2017-03-03 17:35:47 -08006111int radio::setRadioCapabilityResponse(int slotId,
Amit Mahajan3df62912017-02-10 01:35:55 +00006112 int responseType, int serial, RIL_Errno e,
6113 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006114#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006115 RLOGD("setRadioCapabilityResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006116#endif
Amit Mahajan3df62912017-02-10 01:35:55 +00006117
6118 if (radioService[slotId]->mRadioResponse != NULL) {
Amit Mahajan3da9ac02017-02-13 13:41:28 -08006119 RadioResponseInfo responseInfo = {};
6120 RadioCapability result = {};
Amit Mahajan3df62912017-02-10 01:35:55 +00006121 responseRadioCapability(responseInfo, serial, responseType, e, response, responseLen,
6122 result);
6123 Return<void> retStatus = radioService[slotId]->mRadioResponse->setRadioCapabilityResponse(
6124 responseInfo, result);
6125 radioService[slotId]->checkReturnStatus(retStatus);
6126 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006127 RLOGE("setRadioCapabilityResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Amit Mahajan3df62912017-02-10 01:35:55 +00006128 }
6129
6130 return 0;
6131}
6132
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006133LceStatusInfo responseLceStatusInfo(RadioResponseInfo& responseInfo, int serial, int responseType,
6134 RIL_Errno e, void *response, size_t responseLen) {
6135 populateResponseInfo(responseInfo, serial, responseType, e);
Jack Yuf68e0da2017-02-07 14:53:09 -08006136 LceStatusInfo result = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006137
6138 if (response == NULL || responseLen != sizeof(RIL_LceStatusInfo)) {
6139 RLOGE("Invalid response: NULL");
6140 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006141 } else {
6142 RIL_LceStatusInfo *resp = (RIL_LceStatusInfo *) response;
6143 result.lceStatus = (LceStatus) resp->lce_status;
6144 result.actualIntervalMs = (uint8_t) resp->actual_interval_ms;
6145 }
6146 return result;
6147}
6148
Amit Mahajan759786a2017-03-03 17:35:47 -08006149int radio::startLceServiceResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006150 int responseType, int serial, RIL_Errno e,
6151 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006152#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006153 RLOGD("startLceServiceResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006154#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006155
6156 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08006157 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006158 LceStatusInfo result = responseLceStatusInfo(responseInfo, serial, responseType, e,
6159 response, responseLen);
6160
6161 Return<void> retStatus
6162 = radioService[slotId]->mRadioResponse->startLceServiceResponse(responseInfo,
6163 result);
6164 radioService[slotId]->checkReturnStatus(retStatus);
6165 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006166 RLOGE("startLceServiceResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006167 }
6168
6169 return 0;
6170}
6171
Amit Mahajan759786a2017-03-03 17:35:47 -08006172int radio::stopLceServiceResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006173 int responseType, int serial, RIL_Errno e,
6174 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006175#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006176 RLOGD("stopLceServiceResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006177#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006178
6179 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08006180 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006181 LceStatusInfo result = responseLceStatusInfo(responseInfo, serial, responseType, e,
6182 response, responseLen);
6183
6184 Return<void> retStatus
6185 = radioService[slotId]->mRadioResponse->stopLceServiceResponse(responseInfo,
6186 result);
6187 radioService[slotId]->checkReturnStatus(retStatus);
6188 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006189 RLOGE("stopLceServiceResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006190 }
6191
6192 return 0;
6193}
6194
Amit Mahajan759786a2017-03-03 17:35:47 -08006195int radio::pullLceDataResponse(int slotId,
Amit Mahajan3df62912017-02-10 01:35:55 +00006196 int responseType, int serial, RIL_Errno e,
6197 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006198#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006199 RLOGD("pullLceDataResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006200#endif
Amit Mahajan3df62912017-02-10 01:35:55 +00006201
6202 if (radioService[slotId]->mRadioResponse != NULL) {
Amit Mahajan3da9ac02017-02-13 13:41:28 -08006203 RadioResponseInfo responseInfo = {};
Amit Mahajan3df62912017-02-10 01:35:55 +00006204 populateResponseInfo(responseInfo, serial, responseType, e);
6205
Amit Mahajan3da9ac02017-02-13 13:41:28 -08006206 LceDataInfo result = {};
Amit Mahajan3df62912017-02-10 01:35:55 +00006207 if (response == NULL || responseLen != sizeof(RIL_LceDataInfo)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006208 RLOGE("pullLceDataResponse: Invalid response");
Amit Mahajan3df62912017-02-10 01:35:55 +00006209 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
Amit Mahajan3df62912017-02-10 01:35:55 +00006210 } else {
6211 convertRilLceDataInfoToHal(response, responseLen, result);
6212 }
6213
6214 Return<void> retStatus = radioService[slotId]->mRadioResponse->pullLceDataResponse(
6215 responseInfo, result);
6216 radioService[slotId]->checkReturnStatus(retStatus);
6217 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006218 RLOGE("pullLceDataResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Amit Mahajan3df62912017-02-10 01:35:55 +00006219 }
6220
6221 return 0;
6222}
6223
Amit Mahajan759786a2017-03-03 17:35:47 -08006224int radio::getModemActivityInfoResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006225 int responseType, int serial, RIL_Errno e,
6226 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006227#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006228 RLOGD("getModemActivityInfoResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006229#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006230
6231 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08006232 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006233 populateResponseInfo(responseInfo, serial, responseType, e);
6234 ActivityStatsInfo info;
6235 if (response == NULL || responseLen != sizeof(RIL_ActivityStatsInfo)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006236 RLOGE("getModemActivityInfoResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006237 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006238 } else {
6239 RIL_ActivityStatsInfo *resp = (RIL_ActivityStatsInfo *)response;
6240 info.sleepModeTimeMs = resp->sleep_mode_time_ms;
6241 info.idleModeTimeMs = resp->idle_mode_time_ms;
6242 for(int i = 0; i < RIL_NUM_TX_POWER_LEVELS; i++) {
6243 info.txmModetimeMs[i] = resp->tx_mode_time_ms[i];
6244 }
6245 info.rxModeTimeMs = resp->rx_mode_time_ms;
6246 }
6247
6248 Return<void> retStatus
6249 = radioService[slotId]->mRadioResponse->getModemActivityInfoResponse(responseInfo,
6250 info);
6251 radioService[slotId]->checkReturnStatus(retStatus);
6252 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006253 RLOGE("getModemActivityInfoResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006254 slotId);
6255 }
6256
6257 return 0;
6258}
6259
Amit Mahajan759786a2017-03-03 17:35:47 -08006260int radio::setAllowedCarriersResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006261 int responseType, int serial, RIL_Errno e,
6262 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006263#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006264 RLOGD("setAllowedCarriersResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006265#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006266
6267 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08006268 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006269 int ret = responseInt(responseInfo, serial, responseType, e, response, responseLen);
6270 Return<void> retStatus
6271 = radioService[slotId]->mRadioResponse->setAllowedCarriersResponse(responseInfo,
6272 ret);
6273 radioService[slotId]->checkReturnStatus(retStatus);
6274 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006275 RLOGE("setAllowedCarriersResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006276 slotId);
6277 }
6278
6279 return 0;
6280}
6281
Amit Mahajan759786a2017-03-03 17:35:47 -08006282int radio::getAllowedCarriersResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006283 int responseType, int serial, RIL_Errno e,
6284 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006285#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006286 RLOGD("getAllowedCarriersResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006287#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006288
6289 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08006290 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006291 populateResponseInfo(responseInfo, serial, responseType, e);
Jack Yuf68e0da2017-02-07 14:53:09 -08006292 CarrierRestrictions carrierInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006293 bool allAllowed = true;
Jayachandran C47094302017-04-28 00:57:13 -07006294 if (response == NULL) {
6295#if VDBG
6296 RLOGD("getAllowedCarriersResponse response is NULL: all allowed");
6297#endif
6298 carrierInfo.allowedCarriers.resize(0);
6299 carrierInfo.excludedCarriers.resize(0);
6300 } else if (responseLen != sizeof(RIL_CarrierRestrictions)) {
6301 RLOGE("getAllowedCarriersResponse Invalid response");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006302 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
6303 } else {
6304 RIL_CarrierRestrictions *pCr = (RIL_CarrierRestrictions *)response;
6305 if (pCr->len_allowed_carriers > 0 || pCr->len_excluded_carriers > 0) {
6306 allAllowed = false;
6307 }
6308
6309 carrierInfo.allowedCarriers.resize(pCr->len_allowed_carriers);
6310 for(int i = 0; i < pCr->len_allowed_carriers; i++) {
6311 RIL_Carrier *carrier = pCr->allowed_carriers + i;
6312 carrierInfo.allowedCarriers[i].mcc = convertCharPtrToHidlString(carrier->mcc);
6313 carrierInfo.allowedCarriers[i].mnc = convertCharPtrToHidlString(carrier->mnc);
6314 carrierInfo.allowedCarriers[i].matchType = (CarrierMatchType) carrier->match_type;
6315 carrierInfo.allowedCarriers[i].matchData =
6316 convertCharPtrToHidlString(carrier->match_data);
6317 }
6318
6319 carrierInfo.excludedCarriers.resize(pCr->len_excluded_carriers);
6320 for(int i = 0; i < pCr->len_excluded_carriers; i++) {
6321 RIL_Carrier *carrier = pCr->excluded_carriers + i;
6322 carrierInfo.excludedCarriers[i].mcc = convertCharPtrToHidlString(carrier->mcc);
6323 carrierInfo.excludedCarriers[i].mnc = convertCharPtrToHidlString(carrier->mnc);
6324 carrierInfo.excludedCarriers[i].matchType = (CarrierMatchType) carrier->match_type;
6325 carrierInfo.excludedCarriers[i].matchData =
6326 convertCharPtrToHidlString(carrier->match_data);
6327 }
6328 }
6329
6330 Return<void> retStatus
6331 = radioService[slotId]->mRadioResponse->getAllowedCarriersResponse(responseInfo,
6332 allAllowed, carrierInfo);
6333 radioService[slotId]->checkReturnStatus(retStatus);
6334 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006335 RLOGE("getAllowedCarriersResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006336 slotId);
6337 }
6338
6339 return 0;
6340}
6341
Amit Mahajan759786a2017-03-03 17:35:47 -08006342int radio::sendDeviceStateResponse(int slotId,
Jack Yu11ab4042017-02-21 17:08:01 -08006343 int responseType, int serial, RIL_Errno e,
6344 void *response, size_t responselen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006345#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006346 RLOGD("sendDeviceStateResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006347#endif
Jack Yu11ab4042017-02-21 17:08:01 -08006348
6349 if (radioService[slotId]->mRadioResponse != NULL) {
6350 RadioResponseInfo responseInfo = {};
6351 populateResponseInfo(responseInfo, serial, responseType, e);
6352 Return<void> retStatus
6353 = radioService[slotId]->mRadioResponse->sendDeviceStateResponse(responseInfo);
6354 radioService[slotId]->checkReturnStatus(retStatus);
6355 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006356 RLOGE("sendDeviceStateResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Jack Yu11ab4042017-02-21 17:08:01 -08006357 }
6358
6359 return 0;
6360}
6361
Amit Mahajan759786a2017-03-03 17:35:47 -08006362int radio::setIndicationFilterResponse(int slotId,
Jack Yu11ab4042017-02-21 17:08:01 -08006363 int responseType, int serial, RIL_Errno e,
6364 void *response, size_t responselen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006365#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006366 RLOGD("setIndicationFilterResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006367#endif
Jack Yu11ab4042017-02-21 17:08:01 -08006368
6369 if (radioService[slotId]->mRadioResponse != NULL) {
6370 RadioResponseInfo responseInfo = {};
6371 populateResponseInfo(responseInfo, serial, responseType, e);
6372 Return<void> retStatus
6373 = radioService[slotId]->mRadioResponse->setIndicationFilterResponse(responseInfo);
6374 radioService[slotId]->checkReturnStatus(retStatus);
6375 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006376 RLOGE("setIndicationFilterResponse: radioService[%d]->mRadioResponse == NULL",
Jack Yu11ab4042017-02-21 17:08:01 -08006377 slotId);
6378 }
6379
6380 return 0;
6381}
6382
6383
Amit Mahajan759786a2017-03-03 17:35:47 -08006384int radio::setSimCardPowerResponse(int slotId,
Wileen Chiu718c0bf2017-01-04 11:37:19 -08006385 int responseType, int serial, RIL_Errno e,
6386 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006387#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006388 RLOGD("setSimCardPowerResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006389#endif
Wileen Chiu718c0bf2017-01-04 11:37:19 -08006390
6391 if (radioService[slotId]->mRadioResponse != NULL) {
6392 RadioResponseInfo responseInfo = {};
6393 populateResponseInfo(responseInfo, serial, responseType, e);
6394 Return<void> retStatus
6395 = radioService[slotId]->mRadioResponse->setSimCardPowerResponse(responseInfo);
6396 radioService[slotId]->checkReturnStatus(retStatus);
6397 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006398 RLOGE("setSimCardPowerResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Wileen Chiu718c0bf2017-01-04 11:37:19 -08006399 }
6400
6401 return 0;
6402}
6403
Amit Mahajan759786a2017-03-03 17:35:47 -08006404int radio::sendRequestRawResponse(int slotId,
Amit Mahajan439da362017-02-13 17:43:04 -08006405 int responseType, int serial, RIL_Errno e,
6406 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006407#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006408 RLOGD("sendRequestRawResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006409#endif
Amit Mahajan439da362017-02-13 17:43:04 -08006410
6411 if (oemHookService[slotId]->mOemHookResponse != NULL) {
6412 RadioResponseInfo responseInfo = {};
6413 populateResponseInfo(responseInfo, serial, responseType, e);
6414 hidl_vec<uint8_t> data;
6415
6416 if (response == NULL) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006417 RLOGE("sendRequestRawResponse: Invalid response");
Amit Mahajan439da362017-02-13 17:43:04 -08006418 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
6419 } else {
6420 data.setToExternal((uint8_t *) response, responseLen);
6421 }
6422 Return<void> retStatus = oemHookService[slotId]->mOemHookResponse->
6423 sendRequestRawResponse(responseInfo, data);
Amit Mahajand423d192017-03-16 17:04:01 -07006424 checkReturnStatus(slotId, retStatus, false);
Amit Mahajan439da362017-02-13 17:43:04 -08006425 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006426 RLOGE("sendRequestRawResponse: oemHookService[%d]->mOemHookResponse == NULL",
Amit Mahajan439da362017-02-13 17:43:04 -08006427 slotId);
6428 }
6429
6430 return 0;
6431}
6432
Amit Mahajan759786a2017-03-03 17:35:47 -08006433int radio::sendRequestStringsResponse(int slotId,
Amit Mahajan439da362017-02-13 17:43:04 -08006434 int responseType, int serial, RIL_Errno e,
6435 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006436#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006437 RLOGD("sendRequestStringsResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006438#endif
Amit Mahajan439da362017-02-13 17:43:04 -08006439
6440 if (oemHookService[slotId]->mOemHookResponse != NULL) {
6441 RadioResponseInfo responseInfo = {};
6442 populateResponseInfo(responseInfo, serial, responseType, e);
6443 hidl_vec<hidl_string> data;
6444
Amit Mahajan13058cb2017-06-07 23:10:27 -07006445 if ((response == NULL && responseLen != 0) || responseLen % sizeof(char *) != 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006446 RLOGE("sendRequestStringsResponse Invalid response: NULL");
Amit Mahajan439da362017-02-13 17:43:04 -08006447 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
6448 } else {
6449 char **resp = (char **) response;
6450 int numStrings = responseLen / sizeof(char *);
6451 data.resize(numStrings);
6452 for (int i = 0; i < numStrings; i++) {
6453 data[i] = convertCharPtrToHidlString(resp[i]);
6454 }
6455 }
6456 Return<void> retStatus
6457 = oemHookService[slotId]->mOemHookResponse->sendRequestStringsResponse(
6458 responseInfo, data);
Amit Mahajand423d192017-03-16 17:04:01 -07006459 checkReturnStatus(slotId, retStatus, false);
Amit Mahajan439da362017-02-13 17:43:04 -08006460 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006461 RLOGE("sendRequestStringsResponse: oemHookService[%d]->mOemHookResponse == "
Amit Mahajan439da362017-02-13 17:43:04 -08006462 "NULL", slotId);
6463 }
6464
6465 return 0;
6466}
6467
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006468// Radio Indication functions
6469
Amit Mahajan5829a472016-12-28 17:28:07 -08006470RadioIndicationType convertIntToRadioIndicationType(int indicationType) {
6471 return indicationType == RESPONSE_UNSOLICITED ? (RadioIndicationType::UNSOLICITED) :
6472 (RadioIndicationType::UNSOLICITED_ACK_EXP);
6473}
6474
Amit Mahajan759786a2017-03-03 17:35:47 -08006475int radio::radioStateChangedInd(int slotId,
Amit Mahajan1f652692017-03-01 12:08:46 -08006476 int indicationType, int token, RIL_Errno e, void *response,
6477 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08006478 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan93f603c2017-05-15 16:41:44 -07006479 RadioState radioState =
6480 (RadioState) CALL_ONSTATEREQUEST(slotId);
Amit Mahajan111ddca2017-03-03 12:05:13 -08006481 RLOGD("radioStateChangedInd: radioState %d", radioState);
Amit Mahajan17249842017-01-19 15:05:45 -08006482 Return<void> retStatus = radioService[slotId]->mRadioIndication->radioStateChanged(
Amit Mahajan1f652692017-03-01 12:08:46 -08006483 convertIntToRadioIndicationType(indicationType), radioState);
Amit Mahajan17249842017-01-19 15:05:45 -08006484 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajancd77a5b2016-08-25 11:19:21 -07006485 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006486 RLOGE("radioStateChangedInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajancd77a5b2016-08-25 11:19:21 -07006487 }
Amit Mahajan1f652692017-03-01 12:08:46 -08006488
6489 return 0;
Amit Mahajancd77a5b2016-08-25 11:19:21 -07006490}
6491
Amit Mahajan759786a2017-03-03 17:35:47 -08006492int radio::callStateChangedInd(int slotId,
Amit Mahajan5829a472016-12-28 17:28:07 -08006493 int indicationType, int token, RIL_Errno e, void *response,
6494 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08006495 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006496#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006497 RLOGD("callStateChangedInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07006498#endif
Amit Mahajan17249842017-01-19 15:05:45 -08006499 Return<void> retStatus = radioService[slotId]->mRadioIndication->callStateChanged(
Amit Mahajan5829a472016-12-28 17:28:07 -08006500 convertIntToRadioIndicationType(indicationType));
Amit Mahajan17249842017-01-19 15:05:45 -08006501 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08006502 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006503 RLOGE("callStateChangedInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08006504 }
6505
6506 return 0;
6507}
6508
Amit Mahajan759786a2017-03-03 17:35:47 -08006509int radio::networkStateChangedInd(int slotId,
Amit Mahajan1f652692017-03-01 12:08:46 -08006510 int indicationType, int token, RIL_Errno e, void *response,
6511 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08006512 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006513#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006514 RLOGD("networkStateChangedInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07006515#endif
Jack Yu06181bb2017-01-10 12:10:41 -08006516 Return<void> retStatus = radioService[slotId]->mRadioIndication->networkStateChanged(
Amit Mahajan5829a472016-12-28 17:28:07 -08006517 convertIntToRadioIndicationType(indicationType));
Amit Mahajan17249842017-01-19 15:05:45 -08006518 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08006519 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006520 RLOGE("networkStateChangedInd: radioService[%d]->mRadioIndication == NULL",
Amit Mahajan2fa9e632017-01-06 16:55:33 -08006521 slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08006522 }
6523
6524 return 0;
6525}
6526
6527uint8_t hexCharToInt(uint8_t c) {
6528 if (c >= '0' && c <= '9') return (c - '0');
6529 if (c >= 'A' && c <= 'F') return (c - 'A' + 10);
6530 if (c >= 'a' && c <= 'f') return (c - 'a' + 10);
6531
6532 return INVALID_HEX_CHAR;
6533}
6534
6535uint8_t * convertHexStringToBytes(void *response, size_t responseLen) {
6536 if (responseLen % 2 != 0) {
6537 return NULL;
6538 }
6539
6540 uint8_t *bytes = (uint8_t *)calloc(responseLen/2, sizeof(uint8_t));
6541 if (bytes == NULL) {
6542 RLOGE("convertHexStringToBytes: cannot allocate memory for bytes string");
6543 return NULL;
6544 }
6545 uint8_t *hexString = (uint8_t *)response;
6546
Wei Wang100ac9b2017-02-03 14:18:07 -08006547 for (size_t i = 0; i < responseLen; i += 2) {
Amit Mahajan5829a472016-12-28 17:28:07 -08006548 uint8_t hexChar1 = hexCharToInt(hexString[i]);
6549 uint8_t hexChar2 = hexCharToInt(hexString[i + 1]);
6550
6551 if (hexChar1 == INVALID_HEX_CHAR || hexChar2 == INVALID_HEX_CHAR) {
6552 RLOGE("convertHexStringToBytes: invalid hex char %d %d",
6553 hexString[i], hexString[i + 1]);
6554 free(bytes);
6555 return NULL;
6556 }
6557 bytes[i/2] = ((hexChar1 << 4) | hexChar2);
6558 }
6559
6560 return bytes;
6561}
6562
Amit Mahajan759786a2017-03-03 17:35:47 -08006563int radio::newSmsInd(int slotId, int indicationType,
Amit Mahajan5829a472016-12-28 17:28:07 -08006564 int token, RIL_Errno e, void *response, size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08006565 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan5829a472016-12-28 17:28:07 -08006566 if (response == NULL || responseLen == 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006567 RLOGE("newSmsInd: invalid response");
Amit Mahajan5829a472016-12-28 17:28:07 -08006568 return 0;
6569 }
6570
6571 uint8_t *bytes = convertHexStringToBytes(response, responseLen);
6572 if (bytes == NULL) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006573 RLOGE("newSmsInd: convertHexStringToBytes failed");
Amit Mahajan5829a472016-12-28 17:28:07 -08006574 return 0;
6575 }
6576
6577 hidl_vec<uint8_t> pdu;
6578 pdu.setToExternal(bytes, responseLen/2);
Jayachandran C572f2f42017-03-25 14:30:13 -07006579#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006580 RLOGD("newSmsInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07006581#endif
Amit Mahajan17249842017-01-19 15:05:45 -08006582 Return<void> retStatus = radioService[slotId]->mRadioIndication->newSms(
Amit Mahajan5829a472016-12-28 17:28:07 -08006583 convertIntToRadioIndicationType(indicationType), pdu);
Amit Mahajan17249842017-01-19 15:05:45 -08006584 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08006585 free(bytes);
6586 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006587 RLOGE("newSmsInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08006588 }
6589
6590 return 0;
6591}
6592
Amit Mahajan759786a2017-03-03 17:35:47 -08006593int radio::newSmsStatusReportInd(int slotId,
Amit Mahajan5829a472016-12-28 17:28:07 -08006594 int indicationType, int token, RIL_Errno e, void *response,
6595 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08006596 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan5829a472016-12-28 17:28:07 -08006597 if (response == NULL || responseLen == 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006598 RLOGE("newSmsStatusReportInd: invalid response");
Amit Mahajan5829a472016-12-28 17:28:07 -08006599 return 0;
6600 }
6601
6602 uint8_t *bytes = convertHexStringToBytes(response, responseLen);
6603 if (bytes == NULL) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006604 RLOGE("newSmsStatusReportInd: convertHexStringToBytes failed");
Amit Mahajan5829a472016-12-28 17:28:07 -08006605 return 0;
6606 }
6607
6608 hidl_vec<uint8_t> pdu;
6609 pdu.setToExternal(bytes, responseLen/2);
Jayachandran C572f2f42017-03-25 14:30:13 -07006610#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006611 RLOGD("newSmsStatusReportInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07006612#endif
Amit Mahajan17249842017-01-19 15:05:45 -08006613 Return<void> retStatus = radioService[slotId]->mRadioIndication->newSmsStatusReport(
Amit Mahajan5829a472016-12-28 17:28:07 -08006614 convertIntToRadioIndicationType(indicationType), pdu);
Amit Mahajan17249842017-01-19 15:05:45 -08006615 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08006616 free(bytes);
6617 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006618 RLOGE("newSmsStatusReportInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08006619 }
6620
6621 return 0;
6622}
6623
Amit Mahajan759786a2017-03-03 17:35:47 -08006624int radio::newSmsOnSimInd(int slotId, int indicationType,
Amit Mahajan5829a472016-12-28 17:28:07 -08006625 int token, RIL_Errno e, void *response, size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08006626 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan5829a472016-12-28 17:28:07 -08006627 if (response == NULL || responseLen != sizeof(int)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006628 RLOGE("newSmsOnSimInd: invalid response");
Amit Mahajan5829a472016-12-28 17:28:07 -08006629 return 0;
6630 }
6631 int32_t recordNumber = ((int32_t *) response)[0];
Jayachandran C572f2f42017-03-25 14:30:13 -07006632#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006633 RLOGD("newSmsOnSimInd: slotIndex %d", recordNumber);
Jayachandran C572f2f42017-03-25 14:30:13 -07006634#endif
Amit Mahajan17249842017-01-19 15:05:45 -08006635 Return<void> retStatus = radioService[slotId]->mRadioIndication->newSmsOnSim(
Amit Mahajan5829a472016-12-28 17:28:07 -08006636 convertIntToRadioIndicationType(indicationType), recordNumber);
Amit Mahajan17249842017-01-19 15:05:45 -08006637 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08006638 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006639 RLOGE("newSmsOnSimInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08006640 }
6641
6642 return 0;
6643}
6644
Amit Mahajan759786a2017-03-03 17:35:47 -08006645int radio::onUssdInd(int slotId, int indicationType,
Amit Mahajan5829a472016-12-28 17:28:07 -08006646 int token, RIL_Errno e, void *response, size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08006647 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan5829a472016-12-28 17:28:07 -08006648 if (response == NULL || responseLen != 2 * sizeof(char *)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006649 RLOGE("onUssdInd: invalid response");
Amit Mahajan5829a472016-12-28 17:28:07 -08006650 return 0;
6651 }
6652 char **strings = (char **) response;
6653 char *mode = strings[0];
6654 hidl_string msg = convertCharPtrToHidlString(strings[1]);
6655 UssdModeType modeType = (UssdModeType) atoi(mode);
Jayachandran C572f2f42017-03-25 14:30:13 -07006656#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006657 RLOGD("onUssdInd: mode %s", mode);
Jayachandran C572f2f42017-03-25 14:30:13 -07006658#endif
Amit Mahajan17249842017-01-19 15:05:45 -08006659 Return<void> retStatus = radioService[slotId]->mRadioIndication->onUssd(
Amit Mahajan5829a472016-12-28 17:28:07 -08006660 convertIntToRadioIndicationType(indicationType), modeType, msg);
Amit Mahajan17249842017-01-19 15:05:45 -08006661 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08006662 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006663 RLOGE("onUssdInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08006664 }
6665
6666 return 0;
6667}
6668
Amit Mahajan759786a2017-03-03 17:35:47 -08006669int radio::nitzTimeReceivedInd(int slotId,
Amit Mahajan5829a472016-12-28 17:28:07 -08006670 int indicationType, int token, RIL_Errno e, void *response,
6671 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08006672 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan5829a472016-12-28 17:28:07 -08006673 if (response == NULL || responseLen == 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006674 RLOGE("nitzTimeReceivedInd: invalid response");
Amit Mahajan5829a472016-12-28 17:28:07 -08006675 return 0;
6676 }
6677 hidl_string nitzTime = convertCharPtrToHidlString((char *) response);
6678 int64_t timeReceived = android::elapsedRealtime();
Jayachandran C572f2f42017-03-25 14:30:13 -07006679#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006680 RLOGD("nitzTimeReceivedInd: nitzTime %s receivedTime %" PRId64, nitzTime.c_str(),
Amit Mahajan2fa9e632017-01-06 16:55:33 -08006681 timeReceived);
Jayachandran C572f2f42017-03-25 14:30:13 -07006682#endif
Amit Mahajan17249842017-01-19 15:05:45 -08006683 Return<void> retStatus = radioService[slotId]->mRadioIndication->nitzTimeReceived(
Amit Mahajan5829a472016-12-28 17:28:07 -08006684 convertIntToRadioIndicationType(indicationType), nitzTime, timeReceived);
Amit Mahajan17249842017-01-19 15:05:45 -08006685 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08006686 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006687 RLOGE("nitzTimeReceivedInd: radioService[%d]->mRadioIndication == NULL", slotId);
Weilun Dud2c30932017-02-09 12:32:42 -08006688 return -1;
Amit Mahajan5829a472016-12-28 17:28:07 -08006689 }
6690
6691 return 0;
6692}
6693
Adrian DC15627d92017-04-23 21:28:36 +02006694void convertRilSignalStrengthToHalV8(void *response, size_t responseLen,
6695 SignalStrength& signalStrength) {
6696 RIL_SignalStrength_v8 *rilSignalStrength = (RIL_SignalStrength_v8 *) response;
6697
6698 // Fixup LTE for backwards compatibility
6699 // signalStrength: -1 -> 99
6700 if (rilSignalStrength->LTE_SignalStrength.signalStrength == -1) {
6701 rilSignalStrength->LTE_SignalStrength.signalStrength = 99;
6702 }
6703 // rsrp: -1 -> INT_MAX all other negative value to positive.
6704 // So remap here
6705 if (rilSignalStrength->LTE_SignalStrength.rsrp == -1) {
6706 rilSignalStrength->LTE_SignalStrength.rsrp = INT_MAX;
6707 } else if (rilSignalStrength->LTE_SignalStrength.rsrp < -1) {
6708 rilSignalStrength->LTE_SignalStrength.rsrp = -rilSignalStrength->LTE_SignalStrength.rsrp;
6709 }
6710 // rsrq: -1 -> INT_MAX
6711 if (rilSignalStrength->LTE_SignalStrength.rsrq == -1) {
6712 rilSignalStrength->LTE_SignalStrength.rsrq = INT_MAX;
6713 }
6714 // Not remapping rssnr is already using INT_MAX
6715 // cqi: -1 -> INT_MAX
6716 if (rilSignalStrength->LTE_SignalStrength.cqi == -1) {
6717 rilSignalStrength->LTE_SignalStrength.cqi = INT_MAX;
6718 }
6719
6720 signalStrength.gw.signalStrength = rilSignalStrength->GW_SignalStrength.signalStrength;
6721 signalStrength.gw.bitErrorRate = rilSignalStrength->GW_SignalStrength.bitErrorRate;
6722 signalStrength.cdma.dbm = rilSignalStrength->CDMA_SignalStrength.dbm;
6723 signalStrength.cdma.ecio = rilSignalStrength->CDMA_SignalStrength.ecio;
6724 signalStrength.evdo.dbm = rilSignalStrength->EVDO_SignalStrength.dbm;
6725 signalStrength.evdo.ecio = rilSignalStrength->EVDO_SignalStrength.ecio;
6726 signalStrength.evdo.signalNoiseRatio =
6727 rilSignalStrength->EVDO_SignalStrength.signalNoiseRatio;
6728 signalStrength.lte.signalStrength = rilSignalStrength->LTE_SignalStrength.signalStrength;
6729 signalStrength.lte.rsrp = rilSignalStrength->LTE_SignalStrength.rsrp;
6730 signalStrength.lte.rsrq = rilSignalStrength->LTE_SignalStrength.rsrq;
6731 signalStrength.lte.rssnr = rilSignalStrength->LTE_SignalStrength.rssnr;
6732 signalStrength.lte.cqi = rilSignalStrength->LTE_SignalStrength.cqi;
6733 signalStrength.lte.timingAdvance = rilSignalStrength->LTE_SignalStrength.timingAdvance;
6734 signalStrength.tdScdma.rscp = INT_MAX;
6735}
6736
6737void convertRilSignalStrengthToHalV10(void *response, size_t responseLen,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08006738 SignalStrength& signalStrength) {
6739 RIL_SignalStrength_v10 *rilSignalStrength = (RIL_SignalStrength_v10 *) response;
6740
6741 // Fixup LTE for backwards compatibility
6742 // signalStrength: -1 -> 99
6743 if (rilSignalStrength->LTE_SignalStrength.signalStrength == -1) {
6744 rilSignalStrength->LTE_SignalStrength.signalStrength = 99;
6745 }
6746 // rsrp: -1 -> INT_MAX all other negative value to positive.
6747 // So remap here
6748 if (rilSignalStrength->LTE_SignalStrength.rsrp == -1) {
6749 rilSignalStrength->LTE_SignalStrength.rsrp = INT_MAX;
6750 } else if (rilSignalStrength->LTE_SignalStrength.rsrp < -1) {
6751 rilSignalStrength->LTE_SignalStrength.rsrp = -rilSignalStrength->LTE_SignalStrength.rsrp;
6752 }
6753 // rsrq: -1 -> INT_MAX
6754 if (rilSignalStrength->LTE_SignalStrength.rsrq == -1) {
6755 rilSignalStrength->LTE_SignalStrength.rsrq = INT_MAX;
6756 }
6757 // Not remapping rssnr is already using INT_MAX
6758 // cqi: -1 -> INT_MAX
6759 if (rilSignalStrength->LTE_SignalStrength.cqi == -1) {
6760 rilSignalStrength->LTE_SignalStrength.cqi = INT_MAX;
6761 }
6762
6763 signalStrength.gw.signalStrength = rilSignalStrength->GW_SignalStrength.signalStrength;
6764 signalStrength.gw.bitErrorRate = rilSignalStrength->GW_SignalStrength.bitErrorRate;
6765 signalStrength.cdma.dbm = rilSignalStrength->CDMA_SignalStrength.dbm;
6766 signalStrength.cdma.ecio = rilSignalStrength->CDMA_SignalStrength.ecio;
6767 signalStrength.evdo.dbm = rilSignalStrength->EVDO_SignalStrength.dbm;
6768 signalStrength.evdo.ecio = rilSignalStrength->EVDO_SignalStrength.ecio;
6769 signalStrength.evdo.signalNoiseRatio =
6770 rilSignalStrength->EVDO_SignalStrength.signalNoiseRatio;
6771 signalStrength.lte.signalStrength = rilSignalStrength->LTE_SignalStrength.signalStrength;
6772 signalStrength.lte.rsrp = rilSignalStrength->LTE_SignalStrength.rsrp;
6773 signalStrength.lte.rsrq = rilSignalStrength->LTE_SignalStrength.rsrq;
6774 signalStrength.lte.rssnr = rilSignalStrength->LTE_SignalStrength.rssnr;
6775 signalStrength.lte.cqi = rilSignalStrength->LTE_SignalStrength.cqi;
6776 signalStrength.lte.timingAdvance = rilSignalStrength->LTE_SignalStrength.timingAdvance;
6777 signalStrength.tdScdma.rscp = rilSignalStrength->TD_SCDMA_SignalStrength.rscp;
6778}
6779
Adrian DC15627d92017-04-23 21:28:36 +02006780void convertRilSignalStrengthToHal(void *response, size_t responseLen,
6781 SignalStrength& signalStrength) {
6782 if (responseLen == sizeof(RIL_SignalStrength_v8)) {
6783 convertRilSignalStrengthToHalV8(response, responseLen, signalStrength);
6784 } else {
6785 convertRilSignalStrengthToHalV10(response, responseLen, signalStrength);
6786 }
6787}
6788
Amit Mahajan759786a2017-03-03 17:35:47 -08006789int radio::currentSignalStrengthInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08006790 int indicationType, int token, RIL_Errno e,
6791 void *response, size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08006792 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Adrian DC15627d92017-04-23 21:28:36 +02006793 if (response == NULL || (responseLen != sizeof(RIL_SignalStrength_v10)
6794 && responseLen != sizeof(RIL_SignalStrength_v8))) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006795 RLOGE("currentSignalStrengthInd: invalid response");
Amit Mahajan2fa9e632017-01-06 16:55:33 -08006796 return 0;
6797 }
6798
Jack Yuf68e0da2017-02-07 14:53:09 -08006799 SignalStrength signalStrength = {};
Amit Mahajan2fa9e632017-01-06 16:55:33 -08006800 convertRilSignalStrengthToHal(response, responseLen, signalStrength);
6801
Jayachandran C572f2f42017-03-25 14:30:13 -07006802#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006803 RLOGD("currentSignalStrengthInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07006804#endif
Amit Mahajan17249842017-01-19 15:05:45 -08006805 Return<void> retStatus = radioService[slotId]->mRadioIndication->currentSignalStrength(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08006806 convertIntToRadioIndicationType(indicationType), signalStrength);
Amit Mahajan17249842017-01-19 15:05:45 -08006807 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08006808 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006809 RLOGE("currentSignalStrengthInd: radioService[%d]->mRadioIndication == NULL",
Amit Mahajan2fa9e632017-01-06 16:55:33 -08006810 slotId);
6811 }
6812
6813 return 0;
6814}
6815
Adrian DC15627d92017-04-23 21:28:36 +02006816void convertRilDataCallToHal(RIL_Data_Call_Response_v6 *dcResponse,
6817 SetupDataCallResult& dcResult) {
6818 dcResult.status = (DataCallFailCause) dcResponse->status;
6819 dcResult.suggestedRetryTime = dcResponse->suggestedRetryTime;
6820 dcResult.cid = dcResponse->cid;
6821 dcResult.active = dcResponse->active;
6822 dcResult.type = convertCharPtrToHidlString(dcResponse->type);
6823 dcResult.ifname = convertCharPtrToHidlString(dcResponse->ifname);
6824 dcResult.addresses = convertCharPtrToHidlString(dcResponse->addresses);
6825 dcResult.dnses = convertCharPtrToHidlString(dcResponse->dnses);
6826 dcResult.gateways = convertCharPtrToHidlString(dcResponse->gateways);
6827 dcResult.pcscf = hidl_string();
6828 dcResult.mtu = 0;
6829}
6830
6831void convertRilDataCallToHal(RIL_Data_Call_Response_v9 *dcResponse,
6832 SetupDataCallResult& dcResult) {
6833 dcResult.status = (DataCallFailCause) dcResponse->status;
6834 dcResult.suggestedRetryTime = dcResponse->suggestedRetryTime;
6835 dcResult.cid = dcResponse->cid;
6836 dcResult.active = dcResponse->active;
6837 dcResult.type = convertCharPtrToHidlString(dcResponse->type);
6838 dcResult.ifname = convertCharPtrToHidlString(dcResponse->ifname);
6839 dcResult.addresses = convertCharPtrToHidlString(dcResponse->addresses);
6840 dcResult.dnses = convertCharPtrToHidlString(dcResponse->dnses);
6841 dcResult.gateways = convertCharPtrToHidlString(dcResponse->gateways);
6842 dcResult.pcscf = convertCharPtrToHidlString(dcResponse->pcscf);
6843 dcResult.mtu = 0;
6844}
6845
Amit Mahajan5829a472016-12-28 17:28:07 -08006846void convertRilDataCallToHal(RIL_Data_Call_Response_v11 *dcResponse,
6847 SetupDataCallResult& dcResult) {
Jack Yu5079e182017-02-28 15:21:18 -08006848 dcResult.status = (DataCallFailCause) dcResponse->status;
Amit Mahajan5829a472016-12-28 17:28:07 -08006849 dcResult.suggestedRetryTime = dcResponse->suggestedRetryTime;
6850 dcResult.cid = dcResponse->cid;
6851 dcResult.active = dcResponse->active;
6852 dcResult.type = convertCharPtrToHidlString(dcResponse->type);
6853 dcResult.ifname = convertCharPtrToHidlString(dcResponse->ifname);
6854 dcResult.addresses = convertCharPtrToHidlString(dcResponse->addresses);
6855 dcResult.dnses = convertCharPtrToHidlString(dcResponse->dnses);
6856 dcResult.gateways = convertCharPtrToHidlString(dcResponse->gateways);
6857 dcResult.pcscf = convertCharPtrToHidlString(dcResponse->pcscf);
6858 dcResult.mtu = dcResponse->mtu;
6859}
6860
6861void convertRilDataCallListToHal(void *response, size_t responseLen,
6862 hidl_vec<SetupDataCallResult>& dcResultList) {
Adrian DC15627d92017-04-23 21:28:36 +02006863 int num;
Amit Mahajan5829a472016-12-28 17:28:07 -08006864
Adrian DC15627d92017-04-23 21:28:36 +02006865 if ((responseLen % sizeof(RIL_Data_Call_Response_v11)) == 0) {
6866 num = responseLen / sizeof(RIL_Data_Call_Response_v11);
6867 RIL_Data_Call_Response_v11 *dcResponse = (RIL_Data_Call_Response_v11 *) response;
6868 dcResultList.resize(num);
6869 for (int i = 0; i < num; i++) {
6870 convertRilDataCallToHal(&dcResponse[i], dcResultList[i]);
6871 }
6872 } else if ((responseLen % sizeof(RIL_Data_Call_Response_v9)) == 0) {
6873 num = responseLen / sizeof(RIL_Data_Call_Response_v9);
6874 RIL_Data_Call_Response_v9 *dcResponse = (RIL_Data_Call_Response_v9 *) response;
6875 dcResultList.resize(num);
6876 for (int i = 0; i < num; i++) {
6877 convertRilDataCallToHal(&dcResponse[i], dcResultList[i]);
6878 }
6879 } else if ((responseLen % sizeof(RIL_Data_Call_Response_v6)) == 0) {
6880 num = responseLen / sizeof(RIL_Data_Call_Response_v6);
6881 RIL_Data_Call_Response_v6 *dcResponse = (RIL_Data_Call_Response_v6 *) response;
6882 dcResultList.resize(num);
6883 for (int i = 0; i < num; i++) {
6884 convertRilDataCallToHal(&dcResponse[i], dcResultList[i]);
6885 }
Amit Mahajan5829a472016-12-28 17:28:07 -08006886 }
6887}
6888
Amit Mahajan759786a2017-03-03 17:35:47 -08006889int radio::dataCallListChangedInd(int slotId,
Amit Mahajan5829a472016-12-28 17:28:07 -08006890 int indicationType, int token, RIL_Errno e, void *response,
6891 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08006892 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan13058cb2017-06-07 23:10:27 -07006893 if ((response == NULL && responseLen != 0)
Adrian DC15627d92017-04-23 21:28:36 +02006894 || (responseLen % sizeof(RIL_Data_Call_Response_v11) != 0
6895 && responseLen % sizeof(RIL_Data_Call_Response_v9) != 0
6896 && responseLen % sizeof(RIL_Data_Call_Response_v6) != 0)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006897 RLOGE("dataCallListChangedInd: invalid response");
Amit Mahajan5829a472016-12-28 17:28:07 -08006898 return 0;
6899 }
6900 hidl_vec<SetupDataCallResult> dcList;
6901 convertRilDataCallListToHal(response, responseLen, dcList);
Jayachandran C572f2f42017-03-25 14:30:13 -07006902#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006903 RLOGD("dataCallListChangedInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07006904#endif
Amit Mahajan17249842017-01-19 15:05:45 -08006905 Return<void> retStatus = radioService[slotId]->mRadioIndication->dataCallListChanged(
Amit Mahajan5829a472016-12-28 17:28:07 -08006906 convertIntToRadioIndicationType(indicationType), dcList);
Amit Mahajan17249842017-01-19 15:05:45 -08006907 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08006908 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006909 RLOGE("dataCallListChangedInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08006910 }
6911
6912 return 0;
6913}
6914
Amit Mahajan759786a2017-03-03 17:35:47 -08006915int radio::suppSvcNotifyInd(int slotId, int indicationType,
Amit Mahajan5829a472016-12-28 17:28:07 -08006916 int token, RIL_Errno e, void *response, size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08006917 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan5829a472016-12-28 17:28:07 -08006918 if (response == NULL || responseLen != sizeof(RIL_SuppSvcNotification)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006919 RLOGE("suppSvcNotifyInd: invalid response");
Amit Mahajan5829a472016-12-28 17:28:07 -08006920 return 0;
6921 }
6922
Jack Yuf68e0da2017-02-07 14:53:09 -08006923 SuppSvcNotification suppSvc = {};
Amit Mahajan5829a472016-12-28 17:28:07 -08006924 RIL_SuppSvcNotification *ssn = (RIL_SuppSvcNotification *) response;
6925 suppSvc.isMT = ssn->notificationType;
6926 suppSvc.code = ssn->code;
6927 suppSvc.index = ssn->index;
6928 suppSvc.type = ssn->type;
6929 suppSvc.number = convertCharPtrToHidlString(ssn->number);
6930
Jayachandran C572f2f42017-03-25 14:30:13 -07006931#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006932 RLOGD("suppSvcNotifyInd: isMT %d code %d index %d type %d",
Amit Mahajan5829a472016-12-28 17:28:07 -08006933 suppSvc.isMT, suppSvc.code, suppSvc.index, suppSvc.type);
Jayachandran C572f2f42017-03-25 14:30:13 -07006934#endif
Amit Mahajan17249842017-01-19 15:05:45 -08006935 Return<void> retStatus = radioService[slotId]->mRadioIndication->suppSvcNotify(
Amit Mahajan5829a472016-12-28 17:28:07 -08006936 convertIntToRadioIndicationType(indicationType), suppSvc);
Amit Mahajan17249842017-01-19 15:05:45 -08006937 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08006938 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006939 RLOGE("suppSvcNotifyInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08006940 }
6941
6942 return 0;
6943}
6944
Amit Mahajan759786a2017-03-03 17:35:47 -08006945int radio::stkSessionEndInd(int slotId, int indicationType,
Amit Mahajan5829a472016-12-28 17:28:07 -08006946 int token, RIL_Errno e, void *response, size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08006947 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006948#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006949 RLOGD("stkSessionEndInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07006950#endif
Amit Mahajan17249842017-01-19 15:05:45 -08006951 Return<void> retStatus = radioService[slotId]->mRadioIndication->stkSessionEnd(
Amit Mahajan5829a472016-12-28 17:28:07 -08006952 convertIntToRadioIndicationType(indicationType));
Amit Mahajan17249842017-01-19 15:05:45 -08006953 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08006954 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006955 RLOGE("stkSessionEndInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08006956 }
6957
6958 return 0;
6959}
6960
Amit Mahajan759786a2017-03-03 17:35:47 -08006961int radio::stkProactiveCommandInd(int slotId,
Amit Mahajan5829a472016-12-28 17:28:07 -08006962 int indicationType, int token, RIL_Errno e, void *response,
6963 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08006964 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan5829a472016-12-28 17:28:07 -08006965 if (response == NULL || responseLen == 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006966 RLOGE("stkProactiveCommandInd: invalid response");
Amit Mahajan5829a472016-12-28 17:28:07 -08006967 return 0;
6968 }
Jayachandran C572f2f42017-03-25 14:30:13 -07006969#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006970 RLOGD("stkProactiveCommandInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07006971#endif
Amit Mahajan17249842017-01-19 15:05:45 -08006972 Return<void> retStatus = radioService[slotId]->mRadioIndication->stkProactiveCommand(
Amit Mahajan5829a472016-12-28 17:28:07 -08006973 convertIntToRadioIndicationType(indicationType),
6974 convertCharPtrToHidlString((char *) response));
Amit Mahajan17249842017-01-19 15:05:45 -08006975 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08006976 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006977 RLOGE("stkProactiveCommandInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08006978 }
6979
6980 return 0;
6981}
6982
Amit Mahajan759786a2017-03-03 17:35:47 -08006983int radio::stkEventNotifyInd(int slotId, int indicationType,
Amit Mahajan5829a472016-12-28 17:28:07 -08006984 int token, RIL_Errno e, void *response, size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08006985 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan5829a472016-12-28 17:28:07 -08006986 if (response == NULL || responseLen == 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006987 RLOGE("stkEventNotifyInd: invalid response");
Amit Mahajan5829a472016-12-28 17:28:07 -08006988 return 0;
6989 }
Jayachandran C572f2f42017-03-25 14:30:13 -07006990#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006991 RLOGD("stkEventNotifyInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07006992#endif
Amit Mahajan17249842017-01-19 15:05:45 -08006993 Return<void> retStatus = radioService[slotId]->mRadioIndication->stkEventNotify(
Amit Mahajan5829a472016-12-28 17:28:07 -08006994 convertIntToRadioIndicationType(indicationType),
6995 convertCharPtrToHidlString((char *) response));
Amit Mahajan17249842017-01-19 15:05:45 -08006996 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08006997 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006998 RLOGE("stkEventNotifyInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08006999 }
7000
7001 return 0;
7002}
7003
Amit Mahajan759786a2017-03-03 17:35:47 -08007004int radio::stkCallSetupInd(int slotId, int indicationType,
Amit Mahajan5829a472016-12-28 17:28:07 -08007005 int token, RIL_Errno e, void *response, size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007006 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan5829a472016-12-28 17:28:07 -08007007 if (response == NULL || responseLen != sizeof(int)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007008 RLOGE("stkCallSetupInd: invalid response");
Amit Mahajan5829a472016-12-28 17:28:07 -08007009 return 0;
7010 }
7011 int32_t timeout = ((int32_t *) response)[0];
Jayachandran C572f2f42017-03-25 14:30:13 -07007012#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007013 RLOGD("stkCallSetupInd: timeout %d", timeout);
Jayachandran C572f2f42017-03-25 14:30:13 -07007014#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007015 Return<void> retStatus = radioService[slotId]->mRadioIndication->stkCallSetup(
Amit Mahajan5829a472016-12-28 17:28:07 -08007016 convertIntToRadioIndicationType(indicationType), timeout);
Amit Mahajan17249842017-01-19 15:05:45 -08007017 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08007018 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007019 RLOGE("stkCallSetupInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08007020 }
7021
7022 return 0;
7023}
7024
Amit Mahajan759786a2017-03-03 17:35:47 -08007025int radio::simSmsStorageFullInd(int slotId,
Amit Mahajan5829a472016-12-28 17:28:07 -08007026 int indicationType, int token, RIL_Errno e, void *response,
7027 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007028 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Jayachandran C572f2f42017-03-25 14:30:13 -07007029#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007030 RLOGD("simSmsStorageFullInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07007031#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007032 Return<void> retStatus = radioService[slotId]->mRadioIndication->simSmsStorageFull(
Amit Mahajan5829a472016-12-28 17:28:07 -08007033 convertIntToRadioIndicationType(indicationType));
Amit Mahajan17249842017-01-19 15:05:45 -08007034 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08007035 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007036 RLOGE("simSmsStorageFullInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08007037 }
7038
7039 return 0;
7040}
7041
Amit Mahajan759786a2017-03-03 17:35:47 -08007042int radio::simRefreshInd(int slotId, int indicationType,
Amit Mahajan5829a472016-12-28 17:28:07 -08007043 int token, RIL_Errno e, void *response, size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007044 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan5829a472016-12-28 17:28:07 -08007045 if (response == NULL || responseLen != sizeof(RIL_SimRefreshResponse_v7)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007046 RLOGE("simRefreshInd: invalid response");
Amit Mahajan5829a472016-12-28 17:28:07 -08007047 return 0;
7048 }
7049
Jack Yuf68e0da2017-02-07 14:53:09 -08007050 SimRefreshResult refreshResult = {};
Amit Mahajan5829a472016-12-28 17:28:07 -08007051 RIL_SimRefreshResponse_v7 *simRefreshResponse = ((RIL_SimRefreshResponse_v7 *) response);
7052 refreshResult.type =
7053 (android::hardware::radio::V1_0::SimRefreshType) simRefreshResponse->result;
7054 refreshResult.efId = simRefreshResponse->ef_id;
7055 refreshResult.aid = convertCharPtrToHidlString(simRefreshResponse->aid);
7056
Jayachandran C572f2f42017-03-25 14:30:13 -07007057#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007058 RLOGD("simRefreshInd: type %d efId %d", refreshResult.type, refreshResult.efId);
Jayachandran C572f2f42017-03-25 14:30:13 -07007059#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007060 Return<void> retStatus = radioService[slotId]->mRadioIndication->simRefresh(
Amit Mahajan5829a472016-12-28 17:28:07 -08007061 convertIntToRadioIndicationType(indicationType), refreshResult);
Amit Mahajan17249842017-01-19 15:05:45 -08007062 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08007063 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007064 RLOGE("simRefreshInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08007065 }
7066
7067 return 0;
7068}
7069
7070void convertRilCdmaSignalInfoRecordToHal(RIL_CDMA_SignalInfoRecord *signalInfoRecord,
7071 CdmaSignalInfoRecord& record) {
7072 record.isPresent = signalInfoRecord->isPresent;
7073 record.signalType = signalInfoRecord->signalType;
7074 record.alertPitch = signalInfoRecord->alertPitch;
7075 record.signal = signalInfoRecord->signal;
7076}
7077
Amit Mahajan759786a2017-03-03 17:35:47 -08007078int radio::callRingInd(int slotId, int indicationType,
Amit Mahajan5829a472016-12-28 17:28:07 -08007079 int token, RIL_Errno e, void *response, size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007080 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan5829a472016-12-28 17:28:07 -08007081 bool isGsm;
Jack Yuf68e0da2017-02-07 14:53:09 -08007082 CdmaSignalInfoRecord record = {};
Amit Mahajan5829a472016-12-28 17:28:07 -08007083 if (response == NULL || responseLen == 0) {
7084 isGsm = true;
7085 } else {
7086 isGsm = false;
7087 if (responseLen != sizeof (RIL_CDMA_SignalInfoRecord)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007088 RLOGE("callRingInd: invalid response");
Amit Mahajan5829a472016-12-28 17:28:07 -08007089 return 0;
7090 }
7091 convertRilCdmaSignalInfoRecordToHal((RIL_CDMA_SignalInfoRecord *) response, record);
7092 }
7093
Jayachandran C572f2f42017-03-25 14:30:13 -07007094#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007095 RLOGD("callRingInd: isGsm %d", isGsm);
Jayachandran C572f2f42017-03-25 14:30:13 -07007096#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007097 Return<void> retStatus = radioService[slotId]->mRadioIndication->callRing(
Amit Mahajan5829a472016-12-28 17:28:07 -08007098 convertIntToRadioIndicationType(indicationType), isGsm, record);
Amit Mahajan17249842017-01-19 15:05:45 -08007099 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08007100 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007101 RLOGE("callRingInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08007102 }
7103
7104 return 0;
7105}
7106
Amit Mahajan759786a2017-03-03 17:35:47 -08007107int radio::simStatusChangedInd(int slotId,
Amit Mahajan5829a472016-12-28 17:28:07 -08007108 int indicationType, int token, RIL_Errno e, void *response,
7109 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007110 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Jayachandran C572f2f42017-03-25 14:30:13 -07007111#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007112 RLOGD("simStatusChangedInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07007113#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007114 Return<void> retStatus = radioService[slotId]->mRadioIndication->simStatusChanged(
Amit Mahajan5829a472016-12-28 17:28:07 -08007115 convertIntToRadioIndicationType(indicationType));
Amit Mahajan17249842017-01-19 15:05:45 -08007116 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08007117 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007118 RLOGE("simStatusChangedInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08007119 }
7120
7121 return 0;
7122}
7123
Amit Mahajan759786a2017-03-03 17:35:47 -08007124int radio::cdmaNewSmsInd(int slotId, int indicationType,
Amit Mahajan5829a472016-12-28 17:28:07 -08007125 int token, RIL_Errno e, void *response, size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007126 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan5829a472016-12-28 17:28:07 -08007127 if (response == NULL || responseLen != sizeof(RIL_CDMA_SMS_Message)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007128 RLOGE("cdmaNewSmsInd: invalid response");
Amit Mahajan5829a472016-12-28 17:28:07 -08007129 return 0;
7130 }
7131
Jack Yuf68e0da2017-02-07 14:53:09 -08007132 CdmaSmsMessage msg = {};
Amit Mahajan5829a472016-12-28 17:28:07 -08007133 RIL_CDMA_SMS_Message *rilMsg = (RIL_CDMA_SMS_Message *) response;
7134 msg.teleserviceId = rilMsg->uTeleserviceID;
7135 msg.isServicePresent = rilMsg->bIsServicePresent;
7136 msg.serviceCategory = rilMsg->uServicecategory;
7137 msg.address.digitMode =
7138 (android::hardware::radio::V1_0::CdmaSmsDigitMode) rilMsg->sAddress.digit_mode;
7139 msg.address.numberMode =
7140 (android::hardware::radio::V1_0::CdmaSmsNumberMode) rilMsg->sAddress.number_mode;
7141 msg.address.numberType =
7142 (android::hardware::radio::V1_0::CdmaSmsNumberType) rilMsg->sAddress.number_type;
7143 msg.address.numberPlan =
7144 (android::hardware::radio::V1_0::CdmaSmsNumberPlan) rilMsg->sAddress.number_plan;
7145
7146 int digitLimit = MIN((rilMsg->sAddress.number_of_digits), RIL_CDMA_SMS_ADDRESS_MAX);
7147 msg.address.digits.setToExternal(rilMsg->sAddress.digits, digitLimit);
7148
7149 msg.subAddress.subaddressType = (android::hardware::radio::V1_0::CdmaSmsSubaddressType)
7150 rilMsg->sSubAddress.subaddressType;
7151 msg.subAddress.odd = rilMsg->sSubAddress.odd;
7152
7153 digitLimit= MIN((rilMsg->sSubAddress.number_of_digits), RIL_CDMA_SMS_SUBADDRESS_MAX);
7154 msg.subAddress.digits.setToExternal(rilMsg->sSubAddress.digits, digitLimit);
7155
7156 digitLimit = MIN((rilMsg->uBearerDataLen), RIL_CDMA_SMS_BEARER_DATA_MAX);
7157 msg.bearerData.setToExternal(rilMsg->aBearerData, digitLimit);
7158
Jayachandran C572f2f42017-03-25 14:30:13 -07007159#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007160 RLOGD("cdmaNewSmsInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07007161#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007162 Return<void> retStatus = radioService[slotId]->mRadioIndication->cdmaNewSms(
Amit Mahajan5829a472016-12-28 17:28:07 -08007163 convertIntToRadioIndicationType(indicationType), msg);
Amit Mahajan17249842017-01-19 15:05:45 -08007164 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08007165 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007166 RLOGE("cdmaNewSmsInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08007167 }
7168
7169 return 0;
7170}
7171
Amit Mahajan759786a2017-03-03 17:35:47 -08007172int radio::newBroadcastSmsInd(int slotId,
Amit Mahajan1955c742016-12-29 07:07:54 -08007173 int indicationType, int token, RIL_Errno e, void *response,
7174 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007175 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan1955c742016-12-29 07:07:54 -08007176 if (response == NULL || responseLen == 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007177 RLOGE("newBroadcastSmsInd: invalid response");
Amit Mahajan1955c742016-12-29 07:07:54 -08007178 return 0;
7179 }
7180
7181 hidl_vec<uint8_t> data;
7182 data.setToExternal((uint8_t *) response, responseLen);
Jayachandran C572f2f42017-03-25 14:30:13 -07007183#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007184 RLOGD("newBroadcastSmsInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07007185#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007186 Return<void> retStatus = radioService[slotId]->mRadioIndication->newBroadcastSms(
Amit Mahajan1955c742016-12-29 07:07:54 -08007187 convertIntToRadioIndicationType(indicationType), data);
Amit Mahajan17249842017-01-19 15:05:45 -08007188 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan1955c742016-12-29 07:07:54 -08007189 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007190 RLOGE("newBroadcastSmsInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan1955c742016-12-29 07:07:54 -08007191 }
7192
7193 return 0;
7194}
7195
Amit Mahajan759786a2017-03-03 17:35:47 -08007196int radio::cdmaRuimSmsStorageFullInd(int slotId,
Amit Mahajan1955c742016-12-29 07:07:54 -08007197 int indicationType, int token, RIL_Errno e, void *response,
7198 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007199 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Jayachandran C572f2f42017-03-25 14:30:13 -07007200#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007201 RLOGD("cdmaRuimSmsStorageFullInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07007202#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007203 Return<void> retStatus = radioService[slotId]->mRadioIndication->cdmaRuimSmsStorageFull(
Amit Mahajan1955c742016-12-29 07:07:54 -08007204 convertIntToRadioIndicationType(indicationType));
Amit Mahajan17249842017-01-19 15:05:45 -08007205 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan1955c742016-12-29 07:07:54 -08007206 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007207 RLOGE("cdmaRuimSmsStorageFullInd: radioService[%d]->mRadioIndication == NULL",
Amit Mahajan1955c742016-12-29 07:07:54 -08007208 slotId);
7209 }
7210
7211 return 0;
7212}
7213
Amit Mahajan759786a2017-03-03 17:35:47 -08007214int radio::restrictedStateChangedInd(int slotId,
Amit Mahajan1955c742016-12-29 07:07:54 -08007215 int indicationType, int token, RIL_Errno e, void *response,
7216 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007217 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan1955c742016-12-29 07:07:54 -08007218 if (response == NULL || responseLen != sizeof(int)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007219 RLOGE("restrictedStateChangedInd: invalid response");
Amit Mahajan1955c742016-12-29 07:07:54 -08007220 return 0;
7221 }
7222 int32_t state = ((int32_t *) response)[0];
Jayachandran C572f2f42017-03-25 14:30:13 -07007223#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007224 RLOGD("restrictedStateChangedInd: state %d", state);
Jayachandran C572f2f42017-03-25 14:30:13 -07007225#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007226 Return<void> retStatus = radioService[slotId]->mRadioIndication->restrictedStateChanged(
Amit Mahajan1955c742016-12-29 07:07:54 -08007227 convertIntToRadioIndicationType(indicationType), (PhoneRestrictedState) state);
Amit Mahajan17249842017-01-19 15:05:45 -08007228 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan1955c742016-12-29 07:07:54 -08007229 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007230 RLOGE("restrictedStateChangedInd: radioService[%d]->mRadioIndication == NULL",
Amit Mahajan1955c742016-12-29 07:07:54 -08007231 slotId);
7232 }
7233
7234 return 0;
7235}
7236
Amit Mahajan759786a2017-03-03 17:35:47 -08007237int radio::enterEmergencyCallbackModeInd(int slotId,
Amit Mahajan1955c742016-12-29 07:07:54 -08007238 int indicationType, int token, RIL_Errno e, void *response,
7239 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007240 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Jayachandran C572f2f42017-03-25 14:30:13 -07007241#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007242 RLOGD("enterEmergencyCallbackModeInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07007243#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007244 Return<void> retStatus = radioService[slotId]->mRadioIndication->enterEmergencyCallbackMode(
Amit Mahajan1955c742016-12-29 07:07:54 -08007245 convertIntToRadioIndicationType(indicationType));
Amit Mahajan17249842017-01-19 15:05:45 -08007246 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan1955c742016-12-29 07:07:54 -08007247 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007248 RLOGE("enterEmergencyCallbackModeInd: radioService[%d]->mRadioIndication == NULL",
Amit Mahajan1955c742016-12-29 07:07:54 -08007249 slotId);
7250 }
7251
7252 return 0;
7253}
7254
Amit Mahajan759786a2017-03-03 17:35:47 -08007255int radio::cdmaCallWaitingInd(int slotId,
Amit Mahajan1955c742016-12-29 07:07:54 -08007256 int indicationType, int token, RIL_Errno e, void *response,
7257 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007258 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan1955c742016-12-29 07:07:54 -08007259 if (response == NULL || responseLen != sizeof(RIL_CDMA_CallWaiting_v6)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007260 RLOGE("cdmaCallWaitingInd: invalid response");
Amit Mahajan1955c742016-12-29 07:07:54 -08007261 return 0;
7262 }
7263
Jack Yuf68e0da2017-02-07 14:53:09 -08007264 CdmaCallWaiting callWaitingRecord = {};
Amit Mahajan1955c742016-12-29 07:07:54 -08007265 RIL_CDMA_CallWaiting_v6 *callWaitingRil = ((RIL_CDMA_CallWaiting_v6 *) response);
7266 callWaitingRecord.number = convertCharPtrToHidlString(callWaitingRil->number);
7267 callWaitingRecord.numberPresentation =
7268 (CdmaCallWaitingNumberPresentation) callWaitingRil->numberPresentation;
7269 callWaitingRecord.name = convertCharPtrToHidlString(callWaitingRil->name);
7270 convertRilCdmaSignalInfoRecordToHal(&callWaitingRil->signalInfoRecord,
7271 callWaitingRecord.signalInfoRecord);
7272 callWaitingRecord.numberType = (CdmaCallWaitingNumberType) callWaitingRil->number_type;
7273 callWaitingRecord.numberPlan = (CdmaCallWaitingNumberPlan) callWaitingRil->number_plan;
7274
Jayachandran C572f2f42017-03-25 14:30:13 -07007275#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007276 RLOGD("cdmaCallWaitingInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07007277#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007278 Return<void> retStatus = radioService[slotId]->mRadioIndication->cdmaCallWaiting(
Amit Mahajan1955c742016-12-29 07:07:54 -08007279 convertIntToRadioIndicationType(indicationType), callWaitingRecord);
Amit Mahajan17249842017-01-19 15:05:45 -08007280 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan1955c742016-12-29 07:07:54 -08007281 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007282 RLOGE("cdmaCallWaitingInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan1955c742016-12-29 07:07:54 -08007283 }
7284
7285 return 0;
7286}
7287
Amit Mahajan759786a2017-03-03 17:35:47 -08007288int radio::cdmaOtaProvisionStatusInd(int slotId,
Amit Mahajan1955c742016-12-29 07:07:54 -08007289 int indicationType, int token, RIL_Errno e, void *response,
7290 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007291 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan1955c742016-12-29 07:07:54 -08007292 if (response == NULL || responseLen != sizeof(int)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007293 RLOGE("cdmaOtaProvisionStatusInd: invalid response");
Amit Mahajan1955c742016-12-29 07:07:54 -08007294 return 0;
7295 }
7296 int32_t status = ((int32_t *) response)[0];
Jayachandran C572f2f42017-03-25 14:30:13 -07007297#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007298 RLOGD("cdmaOtaProvisionStatusInd: status %d", status);
Jayachandran C572f2f42017-03-25 14:30:13 -07007299#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007300 Return<void> retStatus = radioService[slotId]->mRadioIndication->cdmaOtaProvisionStatus(
Amit Mahajan1955c742016-12-29 07:07:54 -08007301 convertIntToRadioIndicationType(indicationType), (CdmaOtaProvisionStatus) status);
Amit Mahajan17249842017-01-19 15:05:45 -08007302 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan1955c742016-12-29 07:07:54 -08007303 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007304 RLOGE("cdmaOtaProvisionStatusInd: radioService[%d]->mRadioIndication == NULL",
Amit Mahajan1955c742016-12-29 07:07:54 -08007305 slotId);
7306 }
7307
7308 return 0;
7309}
7310
Amit Mahajan759786a2017-03-03 17:35:47 -08007311int radio::cdmaInfoRecInd(int slotId,
Amit Mahajan1955c742016-12-29 07:07:54 -08007312 int indicationType, int token, RIL_Errno e, void *response,
7313 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007314 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan1955c742016-12-29 07:07:54 -08007315 if (response == NULL || responseLen != sizeof(RIL_CDMA_InformationRecords)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007316 RLOGE("cdmaInfoRecInd: invalid response");
Amit Mahajan1955c742016-12-29 07:07:54 -08007317 return 0;
7318 }
7319
Jack Yuf68e0da2017-02-07 14:53:09 -08007320 CdmaInformationRecords records = {};
Amit Mahajan1955c742016-12-29 07:07:54 -08007321 RIL_CDMA_InformationRecords *recordsRil = (RIL_CDMA_InformationRecords *) response;
7322
7323 char* string8 = NULL;
7324 int num = MIN(recordsRil->numberOfInfoRecs, RIL_CDMA_MAX_NUMBER_OF_INFO_RECS);
7325 if (recordsRil->numberOfInfoRecs > RIL_CDMA_MAX_NUMBER_OF_INFO_RECS) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007326 RLOGE("cdmaInfoRecInd: received %d recs which is more than %d, dropping "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08007327 "additional ones", recordsRil->numberOfInfoRecs,
Amit Mahajan1955c742016-12-29 07:07:54 -08007328 RIL_CDMA_MAX_NUMBER_OF_INFO_RECS);
7329 }
7330 records.infoRec.resize(num);
7331 for (int i = 0 ; i < num ; i++) {
7332 CdmaInformationRecord *record = &records.infoRec[i];
7333 RIL_CDMA_InformationRecord *infoRec = &recordsRil->infoRec[i];
7334 record->name = (CdmaInfoRecName) infoRec->name;
Sanket Padawe378ccdd2017-01-24 14:11:12 -08007335 // All vectors should be size 0 except one which will be size 1. Set everything to
7336 // size 0 initially.
7337 record->display.resize(0);
7338 record->number.resize(0);
7339 record->signal.resize(0);
7340 record->redir.resize(0);
7341 record->lineCtrl.resize(0);
7342 record->clir.resize(0);
7343 record->audioCtrl.resize(0);
Amit Mahajan1955c742016-12-29 07:07:54 -08007344 switch (infoRec->name) {
7345 case RIL_CDMA_DISPLAY_INFO_REC:
7346 case RIL_CDMA_EXTENDED_DISPLAY_INFO_REC: {
7347 if (infoRec->rec.display.alpha_len > CDMA_ALPHA_INFO_BUFFER_LENGTH) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007348 RLOGE("cdmaInfoRecInd: invalid display info response length %d "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08007349 "expected not more than %d", (int) infoRec->rec.display.alpha_len,
Amit Mahajan1955c742016-12-29 07:07:54 -08007350 CDMA_ALPHA_INFO_BUFFER_LENGTH);
7351 return 0;
7352 }
7353 string8 = (char*) malloc((infoRec->rec.display.alpha_len + 1) * sizeof(char));
7354 if (string8 == NULL) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007355 RLOGE("cdmaInfoRecInd: Memory allocation failed for "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08007356 "responseCdmaInformationRecords");
Amit Mahajan1955c742016-12-29 07:07:54 -08007357 return 0;
7358 }
7359 memcpy(string8, infoRec->rec.display.alpha_buf, infoRec->rec.display.alpha_len);
7360 string8[(int)infoRec->rec.display.alpha_len] = '\0';
7361
7362 record->display.resize(1);
7363 record->display[0].alphaBuf = string8;
7364 free(string8);
7365 string8 = NULL;
7366 break;
7367 }
7368
7369 case RIL_CDMA_CALLED_PARTY_NUMBER_INFO_REC:
7370 case RIL_CDMA_CALLING_PARTY_NUMBER_INFO_REC:
7371 case RIL_CDMA_CONNECTED_NUMBER_INFO_REC: {
7372 if (infoRec->rec.number.len > CDMA_NUMBER_INFO_BUFFER_LENGTH) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007373 RLOGE("cdmaInfoRecInd: invalid display info response length %d "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08007374 "expected not more than %d", (int) infoRec->rec.number.len,
Amit Mahajan1955c742016-12-29 07:07:54 -08007375 CDMA_NUMBER_INFO_BUFFER_LENGTH);
7376 return 0;
7377 }
7378 string8 = (char*) malloc((infoRec->rec.number.len + 1) * sizeof(char));
7379 if (string8 == NULL) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007380 RLOGE("cdmaInfoRecInd: Memory allocation failed for "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08007381 "responseCdmaInformationRecords");
Amit Mahajan1955c742016-12-29 07:07:54 -08007382 return 0;
7383 }
7384 memcpy(string8, infoRec->rec.number.buf, infoRec->rec.number.len);
7385 string8[(int)infoRec->rec.number.len] = '\0';
7386
7387 record->number.resize(1);
7388 record->number[0].number = string8;
7389 free(string8);
7390 string8 = NULL;
7391 record->number[0].numberType = infoRec->rec.number.number_type;
7392 record->number[0].numberPlan = infoRec->rec.number.number_plan;
7393 record->number[0].pi = infoRec->rec.number.pi;
7394 record->number[0].si = infoRec->rec.number.si;
7395 break;
7396 }
7397
7398 case RIL_CDMA_SIGNAL_INFO_REC: {
7399 record->signal.resize(1);
7400 record->signal[0].isPresent = infoRec->rec.signal.isPresent;
7401 record->signal[0].signalType = infoRec->rec.signal.signalType;
7402 record->signal[0].alertPitch = infoRec->rec.signal.alertPitch;
7403 record->signal[0].signal = infoRec->rec.signal.signal;
7404 break;
7405 }
7406
7407 case RIL_CDMA_REDIRECTING_NUMBER_INFO_REC: {
7408 if (infoRec->rec.redir.redirectingNumber.len >
7409 CDMA_NUMBER_INFO_BUFFER_LENGTH) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007410 RLOGE("cdmaInfoRecInd: invalid display info response length %d "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08007411 "expected not more than %d\n",
Amit Mahajan1955c742016-12-29 07:07:54 -08007412 (int)infoRec->rec.redir.redirectingNumber.len,
7413 CDMA_NUMBER_INFO_BUFFER_LENGTH);
7414 return 0;
7415 }
7416 string8 = (char*) malloc((infoRec->rec.redir.redirectingNumber.len + 1) *
7417 sizeof(char));
7418 if (string8 == NULL) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007419 RLOGE("cdmaInfoRecInd: Memory allocation failed for "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08007420 "responseCdmaInformationRecords");
Amit Mahajan1955c742016-12-29 07:07:54 -08007421 return 0;
7422 }
7423 memcpy(string8, infoRec->rec.redir.redirectingNumber.buf,
7424 infoRec->rec.redir.redirectingNumber.len);
7425 string8[(int)infoRec->rec.redir.redirectingNumber.len] = '\0';
7426
7427 record->redir.resize(1);
7428 record->redir[0].redirectingNumber.number = string8;
7429 free(string8);
7430 string8 = NULL;
7431 record->redir[0].redirectingNumber.numberType =
7432 infoRec->rec.redir.redirectingNumber.number_type;
7433 record->redir[0].redirectingNumber.numberPlan =
7434 infoRec->rec.redir.redirectingNumber.number_plan;
7435 record->redir[0].redirectingNumber.pi = infoRec->rec.redir.redirectingNumber.pi;
7436 record->redir[0].redirectingNumber.si = infoRec->rec.redir.redirectingNumber.si;
7437 record->redir[0].redirectingReason =
7438 (CdmaRedirectingReason) infoRec->rec.redir.redirectingReason;
7439 break;
7440 }
7441
7442 case RIL_CDMA_LINE_CONTROL_INFO_REC: {
7443 record->lineCtrl.resize(1);
7444 record->lineCtrl[0].lineCtrlPolarityIncluded =
7445 infoRec->rec.lineCtrl.lineCtrlPolarityIncluded;
7446 record->lineCtrl[0].lineCtrlToggle = infoRec->rec.lineCtrl.lineCtrlToggle;
7447 record->lineCtrl[0].lineCtrlReverse = infoRec->rec.lineCtrl.lineCtrlReverse;
7448 record->lineCtrl[0].lineCtrlPowerDenial =
7449 infoRec->rec.lineCtrl.lineCtrlPowerDenial;
7450 break;
7451 }
7452
7453 case RIL_CDMA_T53_CLIR_INFO_REC: {
7454 record->clir.resize(1);
7455 record->clir[0].cause = infoRec->rec.clir.cause;
7456 break;
7457 }
7458
7459 case RIL_CDMA_T53_AUDIO_CONTROL_INFO_REC: {
7460 record->audioCtrl.resize(1);
7461 record->audioCtrl[0].upLink = infoRec->rec.audioCtrl.upLink;
7462 record->audioCtrl[0].downLink = infoRec->rec.audioCtrl.downLink;
7463 break;
7464 }
7465
7466 case RIL_CDMA_T53_RELEASE_INFO_REC:
Amit Mahajan111ddca2017-03-03 12:05:13 -08007467 RLOGE("cdmaInfoRecInd: RIL_CDMA_T53_RELEASE_INFO_REC: INVALID");
Amit Mahajan1955c742016-12-29 07:07:54 -08007468 return 0;
7469
7470 default:
Amit Mahajan111ddca2017-03-03 12:05:13 -08007471 RLOGE("cdmaInfoRecInd: Incorrect name value");
Amit Mahajan1955c742016-12-29 07:07:54 -08007472 return 0;
7473 }
7474 }
7475
Jayachandran C572f2f42017-03-25 14:30:13 -07007476#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007477 RLOGD("cdmaInfoRecInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07007478#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007479 Return<void> retStatus = radioService[slotId]->mRadioIndication->cdmaInfoRec(
Amit Mahajan1955c742016-12-29 07:07:54 -08007480 convertIntToRadioIndicationType(indicationType), records);
Amit Mahajan17249842017-01-19 15:05:45 -08007481 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan1955c742016-12-29 07:07:54 -08007482 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007483 RLOGE("cdmaInfoRecInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan1955c742016-12-29 07:07:54 -08007484 }
7485
7486 return 0;
7487}
7488
Amit Mahajan759786a2017-03-03 17:35:47 -08007489int radio::indicateRingbackToneInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007490 int indicationType, int token, RIL_Errno e, void *response,
7491 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007492 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007493 if (response == NULL || responseLen != sizeof(int)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007494 RLOGE("indicateRingbackToneInd: invalid response");
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007495 return 0;
7496 }
7497 bool start = ((int32_t *) response)[0];
Jayachandran C572f2f42017-03-25 14:30:13 -07007498#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007499 RLOGD("indicateRingbackToneInd: start %d", start);
Jayachandran C572f2f42017-03-25 14:30:13 -07007500#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007501 Return<void> retStatus = radioService[slotId]->mRadioIndication->indicateRingbackTone(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007502 convertIntToRadioIndicationType(indicationType), start);
Amit Mahajan17249842017-01-19 15:05:45 -08007503 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007504 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007505 RLOGE("indicateRingbackToneInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007506 }
7507
7508 return 0;
7509}
7510
Amit Mahajan759786a2017-03-03 17:35:47 -08007511int radio::resendIncallMuteInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007512 int indicationType, int token, RIL_Errno e, void *response,
7513 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007514 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Jayachandran C572f2f42017-03-25 14:30:13 -07007515#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007516 RLOGD("resendIncallMuteInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07007517#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007518 Return<void> retStatus = radioService[slotId]->mRadioIndication->resendIncallMute(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007519 convertIntToRadioIndicationType(indicationType));
Amit Mahajan17249842017-01-19 15:05:45 -08007520 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007521 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007522 RLOGE("resendIncallMuteInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007523 }
7524
7525 return 0;
7526}
7527
Amit Mahajan759786a2017-03-03 17:35:47 -08007528int radio::cdmaSubscriptionSourceChangedInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007529 int indicationType, int token, RIL_Errno e,
7530 void *response, size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007531 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007532 if (response == NULL || responseLen != sizeof(int)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007533 RLOGE("cdmaSubscriptionSourceChangedInd: invalid response");
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007534 return 0;
7535 }
7536 int32_t cdmaSource = ((int32_t *) response)[0];
Jayachandran C572f2f42017-03-25 14:30:13 -07007537#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007538 RLOGD("cdmaSubscriptionSourceChangedInd: cdmaSource %d", cdmaSource);
Jayachandran C572f2f42017-03-25 14:30:13 -07007539#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007540 Return<void> retStatus = radioService[slotId]->mRadioIndication->
7541 cdmaSubscriptionSourceChanged(convertIntToRadioIndicationType(indicationType),
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007542 (CdmaSubscriptionSource) cdmaSource);
Amit Mahajan17249842017-01-19 15:05:45 -08007543 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007544 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007545 RLOGE("cdmaSubscriptionSourceChangedInd: radioService[%d]->mRadioIndication == NULL",
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007546 slotId);
7547 }
7548
7549 return 0;
7550}
7551
Amit Mahajan759786a2017-03-03 17:35:47 -08007552int radio::cdmaPrlChangedInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007553 int indicationType, int token, RIL_Errno e, void *response,
7554 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007555 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007556 if (response == NULL || responseLen != sizeof(int)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007557 RLOGE("cdmaPrlChangedInd: invalid response");
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007558 return 0;
7559 }
7560 int32_t version = ((int32_t *) response)[0];
Jayachandran C572f2f42017-03-25 14:30:13 -07007561#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007562 RLOGD("cdmaPrlChangedInd: version %d", version);
Jayachandran C572f2f42017-03-25 14:30:13 -07007563#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007564 Return<void> retStatus = radioService[slotId]->mRadioIndication->cdmaPrlChanged(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007565 convertIntToRadioIndicationType(indicationType), version);
Amit Mahajan17249842017-01-19 15:05:45 -08007566 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007567 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007568 RLOGE("cdmaPrlChangedInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007569 }
7570
7571 return 0;
7572}
7573
Amit Mahajan759786a2017-03-03 17:35:47 -08007574int radio::exitEmergencyCallbackModeInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007575 int indicationType, int token, RIL_Errno e, void *response,
7576 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007577 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Jayachandran C572f2f42017-03-25 14:30:13 -07007578#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007579 RLOGD("exitEmergencyCallbackModeInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07007580#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007581 Return<void> retStatus = radioService[slotId]->mRadioIndication->exitEmergencyCallbackMode(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007582 convertIntToRadioIndicationType(indicationType));
Amit Mahajan17249842017-01-19 15:05:45 -08007583 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007584 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007585 RLOGE("exitEmergencyCallbackModeInd: radioService[%d]->mRadioIndication == NULL",
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007586 slotId);
7587 }
7588
7589 return 0;
7590}
7591
Amit Mahajan759786a2017-03-03 17:35:47 -08007592int radio::rilConnectedInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007593 int indicationType, int token, RIL_Errno e, void *response,
7594 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007595 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007596 RLOGD("rilConnectedInd");
Amit Mahajan17249842017-01-19 15:05:45 -08007597 Return<void> retStatus = radioService[slotId]->mRadioIndication->rilConnected(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007598 convertIntToRadioIndicationType(indicationType));
Amit Mahajan17249842017-01-19 15:05:45 -08007599 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007600 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007601 RLOGE("rilConnectedInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007602 }
7603
7604 return 0;
7605}
7606
Amit Mahajan759786a2017-03-03 17:35:47 -08007607int radio::voiceRadioTechChangedInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007608 int indicationType, int token, RIL_Errno e, void *response,
7609 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007610 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007611 if (response == NULL || responseLen != sizeof(int)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007612 RLOGE("voiceRadioTechChangedInd: invalid response");
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007613 return 0;
7614 }
7615 int32_t rat = ((int32_t *) response)[0];
Jayachandran C572f2f42017-03-25 14:30:13 -07007616#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007617 RLOGD("voiceRadioTechChangedInd: rat %d", rat);
Jayachandran C572f2f42017-03-25 14:30:13 -07007618#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007619 Return<void> retStatus = radioService[slotId]->mRadioIndication->voiceRadioTechChanged(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007620 convertIntToRadioIndicationType(indicationType), (RadioTechnology) rat);
Amit Mahajan17249842017-01-19 15:05:45 -08007621 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007622 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007623 RLOGE("voiceRadioTechChangedInd: radioService[%d]->mRadioIndication == NULL",
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007624 slotId);
7625 }
7626
7627 return 0;
7628}
7629
7630void convertRilCellInfoListToHal(void *response, size_t responseLen, hidl_vec<CellInfo>& records) {
7631 int num = responseLen / sizeof(RIL_CellInfo_v12);
7632 records.resize(num);
7633
7634 RIL_CellInfo_v12 *rillCellInfo = (RIL_CellInfo_v12 *) response;
7635 for (int i = 0; i < num; i++) {
7636 records[i].cellInfoType = (CellInfoType) rillCellInfo->cellInfoType;
7637 records[i].registered = rillCellInfo->registered;
7638 records[i].timeStampType = (TimeStampType) rillCellInfo->timeStampType;
7639 records[i].timeStamp = rillCellInfo->timeStamp;
Sanket Padawe378ccdd2017-01-24 14:11:12 -08007640 // All vectors should be size 0 except one which will be size 1. Set everything to
7641 // size 0 initially.
7642 records[i].gsm.resize(0);
7643 records[i].wcdma.resize(0);
7644 records[i].cdma.resize(0);
7645 records[i].lte.resize(0);
7646 records[i].tdscdma.resize(0);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007647 switch(rillCellInfo->cellInfoType) {
7648 case RIL_CELL_INFO_TYPE_GSM: {
7649 records[i].gsm.resize(1);
7650 CellInfoGsm *cellInfoGsm = &records[i].gsm[0];
7651 cellInfoGsm->cellIdentityGsm.mcc =
7652 std::to_string(rillCellInfo->CellInfo.gsm.cellIdentityGsm.mcc);
7653 cellInfoGsm->cellIdentityGsm.mnc =
7654 std::to_string(rillCellInfo->CellInfo.gsm.cellIdentityGsm.mnc);
7655 cellInfoGsm->cellIdentityGsm.lac =
7656 rillCellInfo->CellInfo.gsm.cellIdentityGsm.lac;
7657 cellInfoGsm->cellIdentityGsm.cid =
7658 rillCellInfo->CellInfo.gsm.cellIdentityGsm.cid;
7659 cellInfoGsm->cellIdentityGsm.arfcn =
7660 rillCellInfo->CellInfo.gsm.cellIdentityGsm.arfcn;
7661 cellInfoGsm->cellIdentityGsm.bsic =
7662 rillCellInfo->CellInfo.gsm.cellIdentityGsm.bsic;
7663 cellInfoGsm->signalStrengthGsm.signalStrength =
7664 rillCellInfo->CellInfo.gsm.signalStrengthGsm.signalStrength;
7665 cellInfoGsm->signalStrengthGsm.bitErrorRate =
7666 rillCellInfo->CellInfo.gsm.signalStrengthGsm.bitErrorRate;
7667 cellInfoGsm->signalStrengthGsm.timingAdvance =
7668 rillCellInfo->CellInfo.gsm.signalStrengthGsm.timingAdvance;
7669 break;
7670 }
7671
7672 case RIL_CELL_INFO_TYPE_WCDMA: {
7673 records[i].wcdma.resize(1);
7674 CellInfoWcdma *cellInfoWcdma = &records[i].wcdma[0];
7675 cellInfoWcdma->cellIdentityWcdma.mcc =
7676 std::to_string(rillCellInfo->CellInfo.wcdma.cellIdentityWcdma.mcc);
7677 cellInfoWcdma->cellIdentityWcdma.mnc =
7678 std::to_string(rillCellInfo->CellInfo.wcdma.cellIdentityWcdma.mnc);
7679 cellInfoWcdma->cellIdentityWcdma.lac =
7680 rillCellInfo->CellInfo.wcdma.cellIdentityWcdma.lac;
7681 cellInfoWcdma->cellIdentityWcdma.cid =
7682 rillCellInfo->CellInfo.wcdma.cellIdentityWcdma.cid;
7683 cellInfoWcdma->cellIdentityWcdma.psc =
7684 rillCellInfo->CellInfo.wcdma.cellIdentityWcdma.psc;
7685 cellInfoWcdma->cellIdentityWcdma.uarfcn =
7686 rillCellInfo->CellInfo.wcdma.cellIdentityWcdma.uarfcn;
7687 cellInfoWcdma->signalStrengthWcdma.signalStrength =
7688 rillCellInfo->CellInfo.wcdma.signalStrengthWcdma.signalStrength;
7689 cellInfoWcdma->signalStrengthWcdma.bitErrorRate =
7690 rillCellInfo->CellInfo.wcdma.signalStrengthWcdma.bitErrorRate;
7691 break;
7692 }
7693
7694 case RIL_CELL_INFO_TYPE_CDMA: {
7695 records[i].cdma.resize(1);
7696 CellInfoCdma *cellInfoCdma = &records[i].cdma[0];
7697 cellInfoCdma->cellIdentityCdma.networkId =
7698 rillCellInfo->CellInfo.cdma.cellIdentityCdma.networkId;
7699 cellInfoCdma->cellIdentityCdma.systemId =
7700 rillCellInfo->CellInfo.cdma.cellIdentityCdma.systemId;
7701 cellInfoCdma->cellIdentityCdma.baseStationId =
7702 rillCellInfo->CellInfo.cdma.cellIdentityCdma.basestationId;
7703 cellInfoCdma->cellIdentityCdma.longitude =
7704 rillCellInfo->CellInfo.cdma.cellIdentityCdma.longitude;
7705 cellInfoCdma->cellIdentityCdma.latitude =
7706 rillCellInfo->CellInfo.cdma.cellIdentityCdma.latitude;
7707 cellInfoCdma->signalStrengthCdma.dbm =
7708 rillCellInfo->CellInfo.cdma.signalStrengthCdma.dbm;
7709 cellInfoCdma->signalStrengthCdma.ecio =
7710 rillCellInfo->CellInfo.cdma.signalStrengthCdma.ecio;
7711 cellInfoCdma->signalStrengthEvdo.dbm =
7712 rillCellInfo->CellInfo.cdma.signalStrengthEvdo.dbm;
7713 cellInfoCdma->signalStrengthEvdo.ecio =
7714 rillCellInfo->CellInfo.cdma.signalStrengthEvdo.ecio;
7715 cellInfoCdma->signalStrengthEvdo.signalNoiseRatio =
7716 rillCellInfo->CellInfo.cdma.signalStrengthEvdo.signalNoiseRatio;
7717 break;
7718 }
7719
7720 case RIL_CELL_INFO_TYPE_LTE: {
7721 records[i].lte.resize(1);
7722 CellInfoLte *cellInfoLte = &records[i].lte[0];
7723 cellInfoLte->cellIdentityLte.mcc =
7724 std::to_string(rillCellInfo->CellInfo.lte.cellIdentityLte.mcc);
7725 cellInfoLte->cellIdentityLte.mnc =
7726 std::to_string(rillCellInfo->CellInfo.lte.cellIdentityLte.mnc);
7727 cellInfoLte->cellIdentityLte.ci =
7728 rillCellInfo->CellInfo.lte.cellIdentityLte.ci;
7729 cellInfoLte->cellIdentityLte.pci =
7730 rillCellInfo->CellInfo.lte.cellIdentityLte.pci;
7731 cellInfoLte->cellIdentityLte.tac =
7732 rillCellInfo->CellInfo.lte.cellIdentityLte.tac;
7733 cellInfoLte->cellIdentityLte.earfcn =
7734 rillCellInfo->CellInfo.lte.cellIdentityLte.earfcn;
7735 cellInfoLte->signalStrengthLte.signalStrength =
7736 rillCellInfo->CellInfo.lte.signalStrengthLte.signalStrength;
7737 cellInfoLte->signalStrengthLte.rsrp =
7738 rillCellInfo->CellInfo.lte.signalStrengthLte.rsrp;
7739 cellInfoLte->signalStrengthLte.rsrq =
7740 rillCellInfo->CellInfo.lte.signalStrengthLte.rsrq;
7741 cellInfoLte->signalStrengthLte.rssnr =
7742 rillCellInfo->CellInfo.lte.signalStrengthLte.rssnr;
7743 cellInfoLte->signalStrengthLte.cqi =
7744 rillCellInfo->CellInfo.lte.signalStrengthLte.cqi;
7745 cellInfoLte->signalStrengthLte.timingAdvance =
7746 rillCellInfo->CellInfo.lte.signalStrengthLte.timingAdvance;
7747 break;
7748 }
7749
7750 case RIL_CELL_INFO_TYPE_TD_SCDMA: {
7751 records[i].tdscdma.resize(1);
7752 CellInfoTdscdma *cellInfoTdscdma = &records[i].tdscdma[0];
7753 cellInfoTdscdma->cellIdentityTdscdma.mcc =
7754 std::to_string(rillCellInfo->CellInfo.tdscdma.cellIdentityTdscdma.mcc);
7755 cellInfoTdscdma->cellIdentityTdscdma.mnc =
7756 std::to_string(rillCellInfo->CellInfo.tdscdma.cellIdentityTdscdma.mnc);
7757 cellInfoTdscdma->cellIdentityTdscdma.lac =
7758 rillCellInfo->CellInfo.tdscdma.cellIdentityTdscdma.lac;
7759 cellInfoTdscdma->cellIdentityTdscdma.cid =
7760 rillCellInfo->CellInfo.tdscdma.cellIdentityTdscdma.cid;
7761 cellInfoTdscdma->cellIdentityTdscdma.cpid =
7762 rillCellInfo->CellInfo.tdscdma.cellIdentityTdscdma.cpid;
7763 cellInfoTdscdma->signalStrengthTdscdma.rscp =
7764 rillCellInfo->CellInfo.tdscdma.signalStrengthTdscdma.rscp;
7765 break;
7766 }
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08007767 default: {
7768 break;
7769 }
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007770 }
7771 rillCellInfo += 1;
7772 }
7773}
7774
Amit Mahajan759786a2017-03-03 17:35:47 -08007775int radio::cellInfoListInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007776 int indicationType, int token, RIL_Errno e, void *response,
7777 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007778 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan13058cb2017-06-07 23:10:27 -07007779 if ((response == NULL && responseLen != 0) || responseLen % sizeof(RIL_CellInfo_v12) != 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007780 RLOGE("cellInfoListInd: invalid response");
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007781 return 0;
7782 }
7783
7784 hidl_vec<CellInfo> records;
7785 convertRilCellInfoListToHal(response, responseLen, records);
7786
Jayachandran C572f2f42017-03-25 14:30:13 -07007787#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007788 RLOGD("cellInfoListInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07007789#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007790 Return<void> retStatus = radioService[slotId]->mRadioIndication->cellInfoList(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007791 convertIntToRadioIndicationType(indicationType), records);
Amit Mahajan17249842017-01-19 15:05:45 -08007792 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007793 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007794 RLOGE("cellInfoListInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007795 }
7796
7797 return 0;
7798}
7799
Amit Mahajan759786a2017-03-03 17:35:47 -08007800int radio::imsNetworkStateChangedInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007801 int indicationType, int token, RIL_Errno e, void *response,
7802 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007803 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Jayachandran C572f2f42017-03-25 14:30:13 -07007804#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007805 RLOGD("imsNetworkStateChangedInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07007806#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007807 Return<void> retStatus = radioService[slotId]->mRadioIndication->imsNetworkStateChanged(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007808 convertIntToRadioIndicationType(indicationType));
Amit Mahajan17249842017-01-19 15:05:45 -08007809 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007810 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007811 RLOGE("imsNetworkStateChangedInd: radioService[%d]->mRadioIndication == NULL",
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007812 slotId);
7813 }
7814
7815 return 0;
7816}
7817
Amit Mahajan759786a2017-03-03 17:35:47 -08007818int radio::subscriptionStatusChangedInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007819 int indicationType, int token, RIL_Errno e, void *response,
7820 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007821 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007822 if (response == NULL || responseLen != sizeof(int)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007823 RLOGE("subscriptionStatusChangedInd: invalid response");
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007824 return 0;
7825 }
7826 bool activate = ((int32_t *) response)[0];
Jayachandran C572f2f42017-03-25 14:30:13 -07007827#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007828 RLOGD("subscriptionStatusChangedInd: activate %d", activate);
Jayachandran C572f2f42017-03-25 14:30:13 -07007829#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007830 Return<void> retStatus = radioService[slotId]->mRadioIndication->subscriptionStatusChanged(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007831 convertIntToRadioIndicationType(indicationType), activate);
Amit Mahajan17249842017-01-19 15:05:45 -08007832 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007833 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007834 RLOGE("subscriptionStatusChangedInd: radioService[%d]->mRadioIndication == NULL",
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007835 slotId);
7836 }
7837
7838 return 0;
7839}
7840
Amit Mahajan759786a2017-03-03 17:35:47 -08007841int radio::srvccStateNotifyInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007842 int indicationType, int token, RIL_Errno e, void *response,
7843 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007844 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007845 if (response == NULL || responseLen != sizeof(int)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007846 RLOGE("srvccStateNotifyInd: invalid response");
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007847 return 0;
7848 }
7849 int32_t state = ((int32_t *) response)[0];
Jayachandran C572f2f42017-03-25 14:30:13 -07007850#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007851 RLOGD("srvccStateNotifyInd: rat %d", state);
Jayachandran C572f2f42017-03-25 14:30:13 -07007852#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007853 Return<void> retStatus = radioService[slotId]->mRadioIndication->srvccStateNotify(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007854 convertIntToRadioIndicationType(indicationType), (SrvccState) state);
Amit Mahajan17249842017-01-19 15:05:45 -08007855 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007856 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007857 RLOGE("srvccStateNotifyInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007858 }
7859
7860 return 0;
7861}
7862
7863void convertRilHardwareConfigListToHal(void *response, size_t responseLen,
7864 hidl_vec<HardwareConfig>& records) {
7865 int num = responseLen / sizeof(RIL_HardwareConfig);
7866 records.resize(num);
7867
7868 RIL_HardwareConfig *rilHardwareConfig = (RIL_HardwareConfig *) response;
7869 for (int i = 0; i < num; i++) {
7870 records[i].type = (HardwareConfigType) rilHardwareConfig[i].type;
7871 records[i].uuid = convertCharPtrToHidlString(rilHardwareConfig[i].uuid);
7872 records[i].state = (HardwareConfigState) rilHardwareConfig[i].state;
7873 switch (rilHardwareConfig[i].type) {
7874 case RIL_HARDWARE_CONFIG_MODEM: {
7875 records[i].modem.resize(1);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08007876 records[i].sim.resize(0);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007877 HardwareConfigModem *hwConfigModem = &records[i].modem[0];
7878 hwConfigModem->rat = rilHardwareConfig[i].cfg.modem.rat;
7879 hwConfigModem->maxVoice = rilHardwareConfig[i].cfg.modem.maxVoice;
7880 hwConfigModem->maxData = rilHardwareConfig[i].cfg.modem.maxData;
7881 hwConfigModem->maxStandby = rilHardwareConfig[i].cfg.modem.maxStandby;
7882 break;
7883 }
7884
7885 case RIL_HARDWARE_CONFIG_SIM: {
7886 records[i].sim.resize(1);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08007887 records[i].modem.resize(0);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007888 records[i].sim[0].modemUuid =
7889 convertCharPtrToHidlString(rilHardwareConfig[i].cfg.sim.modemUuid);
7890 break;
7891 }
7892 }
7893 }
7894}
7895
Amit Mahajan759786a2017-03-03 17:35:47 -08007896int radio::hardwareConfigChangedInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007897 int indicationType, int token, RIL_Errno e, void *response,
7898 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007899 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan13058cb2017-06-07 23:10:27 -07007900 if ((response == NULL && responseLen != 0)
7901 || responseLen % sizeof(RIL_HardwareConfig) != 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007902 RLOGE("hardwareConfigChangedInd: invalid response");
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007903 return 0;
7904 }
7905
7906 hidl_vec<HardwareConfig> configs;
7907 convertRilHardwareConfigListToHal(response, responseLen, configs);
7908
Jayachandran C572f2f42017-03-25 14:30:13 -07007909#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007910 RLOGD("hardwareConfigChangedInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07007911#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007912 Return<void> retStatus = radioService[slotId]->mRadioIndication->hardwareConfigChanged(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007913 convertIntToRadioIndicationType(indicationType), configs);
Amit Mahajan17249842017-01-19 15:05:45 -08007914 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007915 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007916 RLOGE("hardwareConfigChangedInd: radioService[%d]->mRadioIndication == NULL",
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007917 slotId);
7918 }
7919
7920 return 0;
7921}
7922
7923void convertRilRadioCapabilityToHal(void *response, size_t responseLen, RadioCapability& rc) {
7924 RIL_RadioCapability *rilRadioCapability = (RIL_RadioCapability *) response;
7925 rc.session = rilRadioCapability->session;
7926 rc.phase = (android::hardware::radio::V1_0::RadioCapabilityPhase) rilRadioCapability->phase;
7927 rc.raf = rilRadioCapability->rat;
7928 rc.logicalModemUuid = convertCharPtrToHidlString(rilRadioCapability->logicalModemUuid);
7929 rc.status = (android::hardware::radio::V1_0::RadioCapabilityStatus) rilRadioCapability->status;
7930}
7931
Amit Mahajan759786a2017-03-03 17:35:47 -08007932int radio::radioCapabilityIndicationInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007933 int indicationType, int token, RIL_Errno e, void *response,
7934 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007935 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007936 if (response == NULL || responseLen != sizeof(RIL_RadioCapability)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007937 RLOGE("radioCapabilityIndicationInd: invalid response");
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007938 return 0;
7939 }
7940
Jack Yuf68e0da2017-02-07 14:53:09 -08007941 RadioCapability rc = {};
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007942 convertRilRadioCapabilityToHal(response, responseLen, rc);
7943
Jayachandran C572f2f42017-03-25 14:30:13 -07007944#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007945 RLOGD("radioCapabilityIndicationInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07007946#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007947 Return<void> retStatus = radioService[slotId]->mRadioIndication->radioCapabilityIndication(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007948 convertIntToRadioIndicationType(indicationType), rc);
Amit Mahajan17249842017-01-19 15:05:45 -08007949 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007950 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007951 RLOGE("radioCapabilityIndicationInd: radioService[%d]->mRadioIndication == NULL",
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007952 slotId);
7953 }
7954
7955 return 0;
7956}
7957
7958bool isServiceTypeCfQuery(RIL_SsServiceType serType, RIL_SsRequestType reqType) {
7959 if ((reqType == SS_INTERROGATION) &&
7960 (serType == SS_CFU ||
7961 serType == SS_CF_BUSY ||
7962 serType == SS_CF_NO_REPLY ||
7963 serType == SS_CF_NOT_REACHABLE ||
7964 serType == SS_CF_ALL ||
7965 serType == SS_CF_ALL_CONDITIONAL)) {
7966 return true;
7967 }
7968 return false;
7969}
7970
Amit Mahajan759786a2017-03-03 17:35:47 -08007971int radio::onSupplementaryServiceIndicationInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007972 int indicationType, int token, RIL_Errno e,
7973 void *response, size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007974 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007975 if (response == NULL || responseLen != sizeof(RIL_StkCcUnsolSsResponse)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007976 RLOGE("onSupplementaryServiceIndicationInd: invalid response");
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007977 return 0;
7978 }
7979
7980 RIL_StkCcUnsolSsResponse *rilSsResponse = (RIL_StkCcUnsolSsResponse *) response;
Jack Yuf68e0da2017-02-07 14:53:09 -08007981 StkCcUnsolSsResult ss = {};
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007982 ss.serviceType = (SsServiceType) rilSsResponse->serviceType;
7983 ss.requestType = (SsRequestType) rilSsResponse->requestType;
7984 ss.teleserviceType = (SsTeleserviceType) rilSsResponse->teleserviceType;
7985 ss.serviceClass = rilSsResponse->serviceClass;
7986 ss.result = (RadioError) rilSsResponse->result;
7987
7988 if (isServiceTypeCfQuery(rilSsResponse->serviceType, rilSsResponse->requestType)) {
Jayachandran C572f2f42017-03-25 14:30:13 -07007989#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007990 RLOGD("onSupplementaryServiceIndicationInd CF type, num of Cf elements %d",
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007991 rilSsResponse->cfData.numValidIndexes);
Jayachandran C572f2f42017-03-25 14:30:13 -07007992#endif
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007993 if (rilSsResponse->cfData.numValidIndexes > NUM_SERVICE_CLASSES) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007994 RLOGE("onSupplementaryServiceIndicationInd numValidIndexes is greater than "
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007995 "max value %d, truncating it to max value", NUM_SERVICE_CLASSES);
7996 rilSsResponse->cfData.numValidIndexes = NUM_SERVICE_CLASSES;
7997 }
7998
7999 ss.cfData.resize(1);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08008000 ss.ssInfo.resize(0);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008001
8002 /* number of call info's */
8003 ss.cfData[0].cfInfo.resize(rilSsResponse->cfData.numValidIndexes);
8004
8005 for (int i = 0; i < rilSsResponse->cfData.numValidIndexes; i++) {
8006 RIL_CallForwardInfo cf = rilSsResponse->cfData.cfInfo[i];
8007 CallForwardInfo *cfInfo = &ss.cfData[0].cfInfo[i];
8008
8009 cfInfo->status = (CallForwardInfoStatus) cf.status;
8010 cfInfo->reason = cf.reason;
8011 cfInfo->serviceClass = cf.serviceClass;
8012 cfInfo->toa = cf.toa;
8013 cfInfo->number = convertCharPtrToHidlString(cf.number);
8014 cfInfo->timeSeconds = cf.timeSeconds;
Jayachandran C572f2f42017-03-25 14:30:13 -07008015#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08008016 RLOGD("onSupplementaryServiceIndicationInd: "
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008017 "Data: %d,reason=%d,cls=%d,toa=%d,num=%s,tout=%d],", cf.status,
8018 cf.reason, cf.serviceClass, cf.toa, (char*)cf.number, cf.timeSeconds);
Jayachandran C572f2f42017-03-25 14:30:13 -07008019#endif
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008020 }
8021 } else {
8022 ss.ssInfo.resize(1);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08008023 ss.cfData.resize(0);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008024
8025 /* each int */
8026 ss.ssInfo[0].ssInfo.resize(SS_INFO_MAX);
8027 for (int i = 0; i < SS_INFO_MAX; i++) {
Jayachandran C572f2f42017-03-25 14:30:13 -07008028#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08008029 RLOGD("onSupplementaryServiceIndicationInd: Data: %d",
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008030 rilSsResponse->ssInfo[i]);
Jayachandran C572f2f42017-03-25 14:30:13 -07008031#endif
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008032 ss.ssInfo[0].ssInfo[i] = rilSsResponse->ssInfo[i];
8033 }
8034 }
8035
Jayachandran C572f2f42017-03-25 14:30:13 -07008036#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08008037 RLOGD("onSupplementaryServiceIndicationInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07008038#endif
Amit Mahajan17249842017-01-19 15:05:45 -08008039 Return<void> retStatus = radioService[slotId]->mRadioIndication->
8040 onSupplementaryServiceIndication(convertIntToRadioIndicationType(indicationType),
8041 ss);
8042 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008043 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008044 RLOGE("onSupplementaryServiceIndicationInd: "
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008045 "radioService[%d]->mRadioIndication == NULL", slotId);
8046 }
8047
8048 return 0;
8049}
8050
Amit Mahajan759786a2017-03-03 17:35:47 -08008051int radio::stkCallControlAlphaNotifyInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008052 int indicationType, int token, RIL_Errno e, void *response,
8053 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08008054 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008055 if (response == NULL || responseLen == 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008056 RLOGE("stkCallControlAlphaNotifyInd: invalid response");
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008057 return 0;
8058 }
Jayachandran C572f2f42017-03-25 14:30:13 -07008059#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08008060 RLOGD("stkCallControlAlphaNotifyInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07008061#endif
Amit Mahajan17249842017-01-19 15:05:45 -08008062 Return<void> retStatus = radioService[slotId]->mRadioIndication->stkCallControlAlphaNotify(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008063 convertIntToRadioIndicationType(indicationType),
8064 convertCharPtrToHidlString((char *) response));
Amit Mahajan17249842017-01-19 15:05:45 -08008065 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008066 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008067 RLOGE("stkCallControlAlphaNotifyInd: radioService[%d]->mRadioIndication == NULL",
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008068 slotId);
8069 }
8070
8071 return 0;
8072}
8073
8074void convertRilLceDataInfoToHal(void *response, size_t responseLen, LceDataInfo& lce) {
8075 RIL_LceDataInfo *rilLceDataInfo = (RIL_LceDataInfo *)response;
8076 lce.lastHopCapacityKbps = rilLceDataInfo->last_hop_capacity_kbps;
8077 lce.confidenceLevel = rilLceDataInfo->confidence_level;
8078 lce.lceSuspended = rilLceDataInfo->lce_suspended;
8079}
8080
Amit Mahajan759786a2017-03-03 17:35:47 -08008081int radio::lceDataInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008082 int indicationType, int token, RIL_Errno e, void *response,
8083 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08008084 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008085 if (response == NULL || responseLen != sizeof(RIL_LceDataInfo)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008086 RLOGE("lceDataInd: invalid response");
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008087 return 0;
8088 }
8089
Jack Yuf68e0da2017-02-07 14:53:09 -08008090 LceDataInfo lce = {};
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008091 convertRilLceDataInfoToHal(response, responseLen, lce);
Jayachandran C572f2f42017-03-25 14:30:13 -07008092#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08008093 RLOGD("lceDataInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07008094#endif
Amit Mahajan17249842017-01-19 15:05:45 -08008095 Return<void> retStatus = radioService[slotId]->mRadioIndication->lceData(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008096 convertIntToRadioIndicationType(indicationType), lce);
Amit Mahajan17249842017-01-19 15:05:45 -08008097 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008098 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008099 RLOGE("lceDataInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008100 }
8101
8102 return 0;
8103}
8104
Amit Mahajan759786a2017-03-03 17:35:47 -08008105int radio::pcoDataInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008106 int indicationType, int token, RIL_Errno e, void *response,
8107 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08008108 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008109 if (response == NULL || responseLen != sizeof(RIL_PCO_Data)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008110 RLOGE("pcoDataInd: invalid response");
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008111 return 0;
8112 }
8113
Jack Yuf68e0da2017-02-07 14:53:09 -08008114 PcoDataInfo pco = {};
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008115 RIL_PCO_Data *rilPcoData = (RIL_PCO_Data *)response;
8116 pco.cid = rilPcoData->cid;
8117 pco.bearerProto = convertCharPtrToHidlString(rilPcoData->bearer_proto);
8118 pco.pcoId = rilPcoData->pco_id;
8119 pco.contents.setToExternal((uint8_t *) rilPcoData->contents, rilPcoData->contents_length);
8120
Jayachandran C572f2f42017-03-25 14:30:13 -07008121#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08008122 RLOGD("pcoDataInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07008123#endif
Amit Mahajan17249842017-01-19 15:05:45 -08008124 Return<void> retStatus = radioService[slotId]->mRadioIndication->pcoData(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008125 convertIntToRadioIndicationType(indicationType), pco);
Amit Mahajan17249842017-01-19 15:05:45 -08008126 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008127 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008128 RLOGE("pcoDataInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008129 }
8130
8131 return 0;
8132}
8133
Amit Mahajan759786a2017-03-03 17:35:47 -08008134int radio::modemResetInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008135 int indicationType, int token, RIL_Errno e, void *response,
8136 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08008137 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008138 if (response == NULL || responseLen == 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008139 RLOGE("modemResetInd: invalid response");
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008140 return 0;
8141 }
Jayachandran C572f2f42017-03-25 14:30:13 -07008142#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08008143 RLOGD("modemResetInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07008144#endif
Amit Mahajan17249842017-01-19 15:05:45 -08008145 Return<void> retStatus = radioService[slotId]->mRadioIndication->modemReset(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008146 convertIntToRadioIndicationType(indicationType),
8147 convertCharPtrToHidlString((char *) response));
Amit Mahajan17249842017-01-19 15:05:45 -08008148 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008149 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008150 RLOGE("modemResetInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008151 }
8152
8153 return 0;
8154}
8155
Amit Mahajan759786a2017-03-03 17:35:47 -08008156int radio::oemHookRawInd(int slotId,
Amit Mahajan439da362017-02-13 17:43:04 -08008157 int indicationType, int token, RIL_Errno e, void *response,
8158 size_t responseLen) {
8159 if (oemHookService[slotId] != NULL && oemHookService[slotId]->mOemHookIndication != NULL) {
8160 if (response == NULL || responseLen == 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008161 RLOGE("oemHookRawInd: invalid response");
Amit Mahajan439da362017-02-13 17:43:04 -08008162 return 0;
8163 }
8164
8165 hidl_vec<uint8_t> data;
8166 data.setToExternal((uint8_t *) response, responseLen);
Jayachandran C572f2f42017-03-25 14:30:13 -07008167#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08008168 RLOGD("oemHookRawInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07008169#endif
Amit Mahajan439da362017-02-13 17:43:04 -08008170 Return<void> retStatus = oemHookService[slotId]->mOemHookIndication->oemHookRaw(
8171 convertIntToRadioIndicationType(indicationType), data);
Amit Mahajand423d192017-03-16 17:04:01 -07008172 checkReturnStatus(slotId, retStatus, false);
Amit Mahajan439da362017-02-13 17:43:04 -08008173 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008174 RLOGE("oemHookRawInd: oemHookService[%d]->mOemHookIndication == NULL", slotId);
Amit Mahajan439da362017-02-13 17:43:04 -08008175 }
8176
8177 return 0;
8178}
8179
Amit Mahajancd77a5b2016-08-25 11:19:21 -07008180void radio::registerService(RIL_RadioFunctions *callbacks, CommandInfo *commands) {
8181 using namespace android::hardware;
8182 int simCount = 1;
Amit Mahajan439da362017-02-13 17:43:04 -08008183 const char *serviceNames[] = {
Amit Mahajan35e93102017-03-28 11:17:55 -07008184 android::RIL_getServiceName()
Amit Mahajancd77a5b2016-08-25 11:19:21 -07008185 #if (SIM_COUNT >= 2)
Amit Mahajan35e93102017-03-28 11:17:55 -07008186 , RIL2_SERVICE_NAME
Amit Mahajancd77a5b2016-08-25 11:19:21 -07008187 #if (SIM_COUNT >= 3)
Amit Mahajan35e93102017-03-28 11:17:55 -07008188 , RIL3_SERVICE_NAME
Amit Mahajancd77a5b2016-08-25 11:19:21 -07008189 #if (SIM_COUNT >= 4)
Amit Mahajan35e93102017-03-28 11:17:55 -07008190 , RIL4_SERVICE_NAME
Amit Mahajan439da362017-02-13 17:43:04 -08008191 #endif
8192 #endif
8193 #endif
8194 };
8195
Amit Mahajancd77a5b2016-08-25 11:19:21 -07008196 #if (SIM_COUNT >= 2)
8197 simCount = SIM_COUNT;
8198 #endif
8199
8200 configureRpcThreadpool(1, true /* callerWillJoin */);
8201 for (int i = 0; i < simCount; i++) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08008202 pthread_rwlock_t *radioServiceRwlockPtr = getRadioServiceRwlock(i);
8203 int ret = pthread_rwlock_wrlock(radioServiceRwlockPtr);
8204 assert(ret == 0);
8205
Amit Mahajancd77a5b2016-08-25 11:19:21 -07008206 radioService[i] = new RadioImpl;
Sanket Padawef220dc52017-01-02 23:46:00 -08008207 radioService[i]->mSlotId = i;
Amit Mahajan439da362017-02-13 17:43:04 -08008208 oemHookService[i] = new OemHookImpl;
8209 oemHookService[i]->mSlotId = i;
Amit Mahajan111ddca2017-03-03 12:05:13 -08008210 RLOGD("registerService: starting IRadio %s", serviceNames[i]);
Amit Mahajancd77a5b2016-08-25 11:19:21 -07008211 android::status_t status = radioService[i]->registerAsService(serviceNames[i]);
Amit Mahajan35e93102017-03-28 11:17:55 -07008212 status = oemHookService[i]->registerAsService(serviceNames[i]);
Amit Mahajan932e08e2017-01-24 05:45:02 -08008213
8214 ret = pthread_rwlock_unlock(radioServiceRwlockPtr);
8215 assert(ret == 0);
Amit Mahajancd77a5b2016-08-25 11:19:21 -07008216 }
8217
Sanket Padawe378ccdd2017-01-24 14:11:12 -08008218 s_vendorFunctions = callbacks;
Amit Mahajancd77a5b2016-08-25 11:19:21 -07008219 s_commands = commands;
8220}
8221
8222void rilc_thread_pool() {
8223 joinRpcThreadpool();
Amit Mahajan932e08e2017-01-24 05:45:02 -08008224}
8225
8226pthread_rwlock_t * radio::getRadioServiceRwlock(int slotId) {
8227 pthread_rwlock_t *radioServiceRwlockPtr = &radioServiceRwlock;
8228
8229 #if (SIM_COUNT >= 2)
8230 if (slotId == 2) radioServiceRwlockPtr = &radioServiceRwlock2;
8231 #if (SIM_COUNT >= 3)
8232 if (slotId == 3) radioServiceRwlockPtr = &radioServiceRwlock3;
8233 #if (SIM_COUNT >= 4)
8234 if (slotId == 4) radioServiceRwlockPtr = &radioServiceRwlock4;
8235 #endif
8236 #endif
8237 #endif
8238
8239 return radioServiceRwlockPtr;
Sanket Padawe0de29d12017-02-10 13:19:47 -08008240}