blob: f67575b5b2c227f27734fd70e55fa7d6fb4a7fef [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
pkanwardb8e0942017-03-17 12:49:34 -070019#include <android/hardware/radio/1.1/IRadio.h>
20#include <android/hardware/radio/1.1/IRadioResponse.h>
21#include <android/hardware/radio/1.1/IRadioIndication.h>
Grace Chen08eb6542017-03-23 18:39:48 -070022#include <android/hardware/radio/1.1/types.h>
pkanwardb8e0942017-03-17 12:49:34 -070023
Amit Mahajan439da362017-02-13 17:43:04 -080024#include <android/hardware/radio/deprecated/1.0/IOemHook.h>
Amit Mahajancd77a5b2016-08-25 11:19:21 -070025
26#include <hwbinder/IPCThreadState.h>
27#include <hwbinder/ProcessState.h>
28#include <ril_service.h>
29#include <hidl/HidlTransportSupport.h>
Amit Mahajan5829a472016-12-28 17:28:07 -080030#include <utils/SystemClock.h>
Wei Wang100ac9b2017-02-03 14:18:07 -080031#include <inttypes.h>
Amit Mahajan5829a472016-12-28 17:28:07 -080032
33#define INVALID_HEX_CHAR 16
Amit Mahajancd77a5b2016-08-25 11:19:21 -070034
Amit Mahajanccb6d7f2017-06-09 10:44:54 -070035using namespace android::hardware::radio;
Amit Mahajancd77a5b2016-08-25 11:19:21 -070036using namespace android::hardware::radio::V1_0;
Amit Mahajan439da362017-02-13 17:43:04 -080037using namespace android::hardware::radio::deprecated::V1_0;
Amit Mahajancd77a5b2016-08-25 11:19:21 -070038using ::android::hardware::configureRpcThreadpool;
39using ::android::hardware::joinRpcThreadpool;
40using ::android::hardware::Return;
Amit Mahajancd77a5b2016-08-25 11:19:21 -070041using ::android::hardware::hidl_string;
42using ::android::hardware::hidl_vec;
43using ::android::hardware::hidl_array;
yinxu3abe7c72017-05-03 15:15:19 -070044using ::android::hardware::radio::V1_1::NetworkScanRequest;
Amit Mahajancd77a5b2016-08-25 11:19:21 -070045using ::android::hardware::Void;
46using android::CommandInfo;
47using android::RequestInfo;
48using android::requestToString;
49using android::sp;
50
Sanket Padawe378ccdd2017-01-24 14:11:12 -080051#define BOOL_TO_INT(x) (x ? 1 : 0)
52#define ATOI_NULL_HANDLED(x) (x ? atoi(x) : -1)
53#define ATOI_NULL_HANDLED_DEF(x, defaultVal) (x ? atoi(x) : defaultVal)
54
Amit Mahajanb3a11bb2017-05-15 16:41:44 -070055#if defined(ANDROID_MULTI_SIM)
56#define CALL_ONREQUEST(a, b, c, d, e) \
57 s_vendorFunctions->onRequest((a), (b), (c), (d), ((RIL_SOCKET_ID)(e)))
58#define CALL_ONSTATEREQUEST(a) s_vendorFunctions->onStateRequest((RIL_SOCKET_ID)(a))
59#else
60#define CALL_ONREQUEST(a, b, c, d, e) s_vendorFunctions->onRequest((a), (b), (c), (d))
61#define CALL_ONSTATEREQUEST(a) s_vendorFunctions->onStateRequest()
62#endif
63
Sanket Padawe378ccdd2017-01-24 14:11:12 -080064RIL_RadioFunctions *s_vendorFunctions = NULL;
Amit Mahajancd77a5b2016-08-25 11:19:21 -070065static CommandInfo *s_commands;
66
67struct RadioImpl;
Amit Mahajan439da362017-02-13 17:43:04 -080068struct OemHookImpl;
Amit Mahajancd77a5b2016-08-25 11:19:21 -070069
70#if (SIM_COUNT >= 2)
71sp<RadioImpl> radioService[SIM_COUNT];
Amit Mahajan439da362017-02-13 17:43:04 -080072sp<OemHookImpl> oemHookService[SIM_COUNT];
73// counter used for synchronization. It is incremented every time response callbacks are updated.
Amit Mahajand423d192017-03-16 17:04:01 -070074volatile int32_t mCounterRadio[SIM_COUNT];
75volatile int32_t mCounterOemHook[SIM_COUNT];
Amit Mahajancd77a5b2016-08-25 11:19:21 -070076#else
77sp<RadioImpl> radioService[1];
Amit Mahajan439da362017-02-13 17:43:04 -080078sp<OemHookImpl> oemHookService[1];
79// counter used for synchronization. It is incremented every time response callbacks are updated.
Amit Mahajand423d192017-03-16 17:04:01 -070080volatile int32_t mCounterRadio[1];
81volatile int32_t mCounterOemHook[1];
Amit Mahajancd77a5b2016-08-25 11:19:21 -070082#endif
83
Amit Mahajan932e08e2017-01-24 05:45:02 -080084static pthread_rwlock_t radioServiceRwlock = PTHREAD_RWLOCK_INITIALIZER;
85
86#if (SIM_COUNT >= 2)
87static pthread_rwlock_t radioServiceRwlock2 = PTHREAD_RWLOCK_INITIALIZER;
88#if (SIM_COUNT >= 3)
89static pthread_rwlock_t radioServiceRwlock3 = PTHREAD_RWLOCK_INITIALIZER;
90#if (SIM_COUNT >= 4)
91static pthread_rwlock_t radioServiceRwlock4 = PTHREAD_RWLOCK_INITIALIZER;
92#endif
93#endif
94#endif
95
Amit Mahajan3df62912017-02-10 01:35:55 +000096void convertRilHardwareConfigListToHal(void *response, size_t responseLen,
97 hidl_vec<HardwareConfig>& records);
98
99void convertRilRadioCapabilityToHal(void *response, size_t responseLen, RadioCapability& rc);
100
101void convertRilLceDataInfoToHal(void *response, size_t responseLen, LceDataInfo& lce);
102
103void convertRilSignalStrengthToHal(void *response, size_t responseLen,
104 SignalStrength& signalStrength);
105
106void convertRilDataCallToHal(RIL_Data_Call_Response_v11 *dcResponse,
107 SetupDataCallResult& dcResult);
108
109void convertRilDataCallListToHal(void *response, size_t responseLen,
110 hidl_vec<SetupDataCallResult>& dcResultList);
111
112void convertRilCellInfoListToHal(void *response, size_t responseLen, hidl_vec<CellInfo>& records);
113
Amit Mahajanccb6d7f2017-06-09 10:44:54 -0700114struct RadioImpl : public V1_1::IRadio {
Sanket Padawef220dc52017-01-02 23:46:00 -0800115 int32_t mSlotId;
116 sp<IRadioResponse> mRadioResponse;
117 sp<IRadioIndication> mRadioIndication;
Amit Mahajanccb6d7f2017-06-09 10:44:54 -0700118 sp<V1_1::IRadioResponse> mRadioResponseV1_1;
119 sp<V1_1::IRadioIndication> mRadioIndicationV1_1;
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700120
121 Return<void> setResponseFunctions(
122 const ::android::sp<IRadioResponse>& radioResponse,
123 const ::android::sp<IRadioIndication>& radioIndication);
124
125 Return<void> getIccCardStatus(int32_t serial);
126
Sanket Padawef220dc52017-01-02 23:46:00 -0800127 Return<void> supplyIccPinForApp(int32_t serial, const hidl_string& pin,
128 const hidl_string& aid);
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700129
Sanket Padawef220dc52017-01-02 23:46:00 -0800130 Return<void> supplyIccPukForApp(int32_t serial, const hidl_string& puk,
131 const hidl_string& pin, const hidl_string& aid);
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700132
133 Return<void> supplyIccPin2ForApp(int32_t serial,
Sanket Padawef220dc52017-01-02 23:46:00 -0800134 const hidl_string& pin2,
135 const hidl_string& aid);
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700136
Sanket Padawef220dc52017-01-02 23:46:00 -0800137 Return<void> supplyIccPuk2ForApp(int32_t serial, const hidl_string& puk2,
138 const hidl_string& pin2, const hidl_string& aid);
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700139
Sanket Padawef220dc52017-01-02 23:46:00 -0800140 Return<void> changeIccPinForApp(int32_t serial, const hidl_string& oldPin,
141 const hidl_string& newPin, const hidl_string& aid);
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700142
Sanket Padawef220dc52017-01-02 23:46:00 -0800143 Return<void> changeIccPin2ForApp(int32_t serial, const hidl_string& oldPin2,
144 const hidl_string& newPin2, const hidl_string& aid);
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700145
Sanket Padawef220dc52017-01-02 23:46:00 -0800146 Return<void> supplyNetworkDepersonalization(int32_t serial, const hidl_string& netPin);
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700147
148 Return<void> getCurrentCalls(int32_t serial);
149
Sanket Padawef220dc52017-01-02 23:46:00 -0800150 Return<void> dial(int32_t serial, const Dial& dialInfo);
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700151
152 Return<void> getImsiForApp(int32_t serial,
153 const ::android::hardware::hidl_string& aid);
154
155 Return<void> hangup(int32_t serial, int32_t gsmIndex);
156
157 Return<void> hangupWaitingOrBackground(int32_t serial);
158
159 Return<void> hangupForegroundResumeBackground(int32_t serial);
160
161 Return<void> switchWaitingOrHoldingAndActive(int32_t serial);
162
163 Return<void> conference(int32_t serial);
164
165 Return<void> rejectCall(int32_t serial);
166
167 Return<void> getLastCallFailCause(int32_t serial);
168
169 Return<void> getSignalStrength(int32_t serial);
170
171 Return<void> getVoiceRegistrationState(int32_t serial);
172
173 Return<void> getDataRegistrationState(int32_t serial);
174
175 Return<void> getOperator(int32_t serial);
176
177 Return<void> setRadioPower(int32_t serial, bool on);
178
179 Return<void> sendDtmf(int32_t serial,
180 const ::android::hardware::hidl_string& s);
181
182 Return<void> sendSms(int32_t serial, const GsmSmsMessage& message);
183
184 Return<void> sendSMSExpectMore(int32_t serial, const GsmSmsMessage& message);
185
186 Return<void> setupDataCall(int32_t serial,
Jack Yu06181bb2017-01-10 12:10:41 -0800187 RadioTechnology radioTechnology,
188 const DataProfileInfo& profileInfo,
189 bool modemCognitive,
Jack Yuffc06452017-02-13 11:21:00 -0800190 bool roamingAllowed,
191 bool isRoaming);
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700192
193 Return<void> iccIOForApp(int32_t serial,
194 const IccIo& iccIo);
195
196 Return<void> sendUssd(int32_t serial,
197 const ::android::hardware::hidl_string& ussd);
198
199 Return<void> cancelPendingUssd(int32_t serial);
200
201 Return<void> getClir(int32_t serial);
202
203 Return<void> setClir(int32_t serial, int32_t status);
204
205 Return<void> getCallForwardStatus(int32_t serial,
206 const CallForwardInfo& callInfo);
207
208 Return<void> setCallForward(int32_t serial,
209 const CallForwardInfo& callInfo);
210
211 Return<void> getCallWaiting(int32_t serial, int32_t serviceClass);
212
213 Return<void> setCallWaiting(int32_t serial, bool enable, int32_t serviceClass);
214
215 Return<void> acknowledgeLastIncomingGsmSms(int32_t serial,
216 bool success, SmsAcknowledgeFailCause cause);
217
218 Return<void> acceptCall(int32_t serial);
219
220 Return<void> deactivateDataCall(int32_t serial,
221 int32_t cid, bool reasonRadioShutDown);
222
223 Return<void> getFacilityLockForApp(int32_t serial,
224 const ::android::hardware::hidl_string& facility,
225 const ::android::hardware::hidl_string& password,
226 int32_t serviceClass,
227 const ::android::hardware::hidl_string& appId);
228
229 Return<void> setFacilityLockForApp(int32_t serial,
230 const ::android::hardware::hidl_string& facility,
231 bool lockState,
232 const ::android::hardware::hidl_string& password,
233 int32_t serviceClass,
234 const ::android::hardware::hidl_string& appId);
235
236 Return<void> setBarringPassword(int32_t serial,
237 const ::android::hardware::hidl_string& facility,
238 const ::android::hardware::hidl_string& oldPassword,
239 const ::android::hardware::hidl_string& newPassword);
240
241 Return<void> getNetworkSelectionMode(int32_t serial);
242
243 Return<void> setNetworkSelectionModeAutomatic(int32_t serial);
244
245 Return<void> setNetworkSelectionModeManual(int32_t serial,
246 const ::android::hardware::hidl_string& operatorNumeric);
247
248 Return<void> getAvailableNetworks(int32_t serial);
249
yinxu3abe7c72017-05-03 15:15:19 -0700250 Return<void> startNetworkScan(int32_t serial, const NetworkScanRequest& request);
251
252 Return<void> stopNetworkScan(int32_t serial);
253
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700254 Return<void> startDtmf(int32_t serial,
255 const ::android::hardware::hidl_string& s);
256
257 Return<void> stopDtmf(int32_t serial);
258
259 Return<void> getBasebandVersion(int32_t serial);
260
261 Return<void> separateConnection(int32_t serial, int32_t gsmIndex);
262
263 Return<void> setMute(int32_t serial, bool enable);
264
265 Return<void> getMute(int32_t serial);
266
267 Return<void> getClip(int32_t serial);
268
269 Return<void> getDataCallList(int32_t serial);
270
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700271 Return<void> setSuppServiceNotifications(int32_t serial, bool enable);
272
273 Return<void> writeSmsToSim(int32_t serial,
274 const SmsWriteArgs& smsWriteArgs);
275
276 Return<void> deleteSmsOnSim(int32_t serial, int32_t index);
277
278 Return<void> setBandMode(int32_t serial, RadioBandMode mode);
279
280 Return<void> getAvailableBandModes(int32_t serial);
281
282 Return<void> sendEnvelope(int32_t serial,
283 const ::android::hardware::hidl_string& command);
284
285 Return<void> sendTerminalResponseToSim(int32_t serial,
286 const ::android::hardware::hidl_string& commandResponse);
287
288 Return<void> handleStkCallSetupRequestFromSim(int32_t serial, bool accept);
289
290 Return<void> explicitCallTransfer(int32_t serial);
291
292 Return<void> setPreferredNetworkType(int32_t serial, PreferredNetworkType nwType);
293
294 Return<void> getPreferredNetworkType(int32_t serial);
295
296 Return<void> getNeighboringCids(int32_t serial);
297
298 Return<void> setLocationUpdates(int32_t serial, bool enable);
299
300 Return<void> setCdmaSubscriptionSource(int32_t serial,
301 CdmaSubscriptionSource cdmaSub);
302
303 Return<void> setCdmaRoamingPreference(int32_t serial, CdmaRoamingType type);
304
305 Return<void> getCdmaRoamingPreference(int32_t serial);
306
307 Return<void> setTTYMode(int32_t serial, TtyMode mode);
308
309 Return<void> getTTYMode(int32_t serial);
310
311 Return<void> setPreferredVoicePrivacy(int32_t serial, bool enable);
312
313 Return<void> getPreferredVoicePrivacy(int32_t serial);
314
315 Return<void> sendCDMAFeatureCode(int32_t serial,
316 const ::android::hardware::hidl_string& featureCode);
317
318 Return<void> sendBurstDtmf(int32_t serial,
319 const ::android::hardware::hidl_string& dtmf,
320 int32_t on,
321 int32_t off);
322
323 Return<void> sendCdmaSms(int32_t serial, const CdmaSmsMessage& sms);
324
325 Return<void> acknowledgeLastIncomingCdmaSms(int32_t serial,
326 const CdmaSmsAck& smsAck);
327
328 Return<void> getGsmBroadcastConfig(int32_t serial);
329
330 Return<void> setGsmBroadcastConfig(int32_t serial,
331 const hidl_vec<GsmBroadcastSmsConfigInfo>& configInfo);
332
333 Return<void> setGsmBroadcastActivation(int32_t serial, bool activate);
334
335 Return<void> getCdmaBroadcastConfig(int32_t serial);
336
337 Return<void> setCdmaBroadcastConfig(int32_t serial,
338 const hidl_vec<CdmaBroadcastSmsConfigInfo>& configInfo);
339
340 Return<void> setCdmaBroadcastActivation(int32_t serial, bool activate);
341
342 Return<void> getCDMASubscription(int32_t serial);
343
344 Return<void> writeSmsToRuim(int32_t serial, const CdmaSmsWriteArgs& cdmaSms);
345
346 Return<void> deleteSmsOnRuim(int32_t serial, int32_t index);
347
348 Return<void> getDeviceIdentity(int32_t serial);
349
350 Return<void> exitEmergencyCallbackMode(int32_t serial);
351
352 Return<void> getSmscAddress(int32_t serial);
353
354 Return<void> setSmscAddress(int32_t serial,
355 const ::android::hardware::hidl_string& smsc);
356
357 Return<void> reportSmsMemoryStatus(int32_t serial, bool available);
358
359 Return<void> reportStkServiceIsRunning(int32_t serial);
360
361 Return<void> getCdmaSubscriptionSource(int32_t serial);
362
363 Return<void> requestIsimAuthentication(int32_t serial,
364 const ::android::hardware::hidl_string& challenge);
365
366 Return<void> acknowledgeIncomingGsmSmsWithPdu(int32_t serial,
367 bool success,
368 const ::android::hardware::hidl_string& ackPdu);
369
370 Return<void> sendEnvelopeWithStatus(int32_t serial,
371 const ::android::hardware::hidl_string& contents);
372
373 Return<void> getVoiceRadioTechnology(int32_t serial);
374
375 Return<void> getCellInfoList(int32_t serial);
376
377 Return<void> setCellInfoListRate(int32_t serial, int32_t rate);
378
Jack Yu06181bb2017-01-10 12:10:41 -0800379 Return<void> setInitialAttachApn(int32_t serial, const DataProfileInfo& dataProfileInfo,
Jack Yuffc06452017-02-13 11:21:00 -0800380 bool modemCognitive, bool isRoaming);
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700381
382 Return<void> getImsRegistrationState(int32_t serial);
383
384 Return<void> sendImsSms(int32_t serial, const ImsSmsMessage& message);
385
386 Return<void> iccTransmitApduBasicChannel(int32_t serial, const SimApdu& message);
387
388 Return<void> iccOpenLogicalChannel(int32_t serial,
Wileen Chiu410b7562015-11-23 14:25:22 -0800389 const ::android::hardware::hidl_string& aid, int32_t p2);
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700390
391 Return<void> iccCloseLogicalChannel(int32_t serial, int32_t channelId);
392
393 Return<void> iccTransmitApduLogicalChannel(int32_t serial, const SimApdu& message);
394
395 Return<void> nvReadItem(int32_t serial, NvItem itemId);
396
397 Return<void> nvWriteItem(int32_t serial, const NvWriteItem& item);
398
399 Return<void> nvWriteCdmaPrl(int32_t serial,
400 const ::android::hardware::hidl_vec<uint8_t>& prl);
401
402 Return<void> nvResetConfig(int32_t serial, ResetNvType resetType);
403
404 Return<void> setUiccSubscription(int32_t serial, const SelectUiccSub& uiccSub);
405
406 Return<void> setDataAllowed(int32_t serial, bool allow);
407
408 Return<void> getHardwareConfig(int32_t serial);
409
410 Return<void> requestIccSimAuthentication(int32_t serial,
411 int32_t authContext,
412 const ::android::hardware::hidl_string& authData,
413 const ::android::hardware::hidl_string& aid);
414
415 Return<void> setDataProfile(int32_t serial,
Jack Yuffc06452017-02-13 11:21:00 -0800416 const ::android::hardware::hidl_vec<DataProfileInfo>& profiles, bool isRoaming);
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700417
418 Return<void> requestShutdown(int32_t serial);
419
420 Return<void> getRadioCapability(int32_t serial);
421
422 Return<void> setRadioCapability(int32_t serial, const RadioCapability& rc);
423
424 Return<void> startLceService(int32_t serial, int32_t reportInterval, bool pullMode);
425
426 Return<void> stopLceService(int32_t serial);
427
428 Return<void> pullLceData(int32_t serial);
429
430 Return<void> getModemActivityInfo(int32_t serial);
431
432 Return<void> setAllowedCarriers(int32_t serial,
433 bool allAllowed,
434 const CarrierRestrictions& carriers);
435
436 Return<void> getAllowedCarriers(int32_t serial);
437
Jack Yu06181bb2017-01-10 12:10:41 -0800438 Return<void> sendDeviceState(int32_t serial, DeviceStateType deviceStateType, bool state);
439
440 Return<void> setIndicationFilter(int32_t serial, int32_t indicationFilter);
441
Wileen Chiu718c0bf2017-01-04 11:37:19 -0800442 Return<void> setSimCardPower(int32_t serial, bool powerUp);
Grace Chen08eb6542017-03-23 18:39:48 -0700443 Return<void> setSimCardPower_1_1(int32_t serial,
Amit Mahajanccb6d7f2017-06-09 10:44:54 -0700444 const V1_1::CardPowerState state);
Wileen Chiu718c0bf2017-01-04 11:37:19 -0800445
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700446 Return<void> responseAcknowledgement();
Amit Mahajan17249842017-01-19 15:05:45 -0800447
pkanwardb8e0942017-03-17 12:49:34 -0700448 Return<void> setCarrierInfoForImsiEncryption(int32_t serial,
449 const ::android::hardware::hidl_vec<uint8_t>& carrierKey,
450 const hidl_string& keyIdentifier);
451
Amit Mahajan17249842017-01-19 15:05:45 -0800452 void checkReturnStatus(Return<void>& ret);
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700453};
454
Amit Mahajan439da362017-02-13 17:43:04 -0800455struct OemHookImpl : public IOemHook {
456 int32_t mSlotId;
457 sp<IOemHookResponse> mOemHookResponse;
458 sp<IOemHookIndication> mOemHookIndication;
459
460 Return<void> setResponseFunctions(
461 const ::android::sp<IOemHookResponse>& oemHookResponse,
462 const ::android::sp<IOemHookIndication>& oemHookIndication);
463
464 Return<void> sendRequestRaw(int32_t serial,
465 const ::android::hardware::hidl_vec<uint8_t>& data);
466
467 Return<void> sendRequestStrings(int32_t serial,
468 const ::android::hardware::hidl_vec<::android::hardware::hidl_string>& data);
469};
470
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800471void memsetAndFreeStrings(int numPointers, ...) {
472 va_list ap;
473 va_start(ap, numPointers);
474 for (int i = 0; i < numPointers; i++) {
475 char *ptr = va_arg(ap, char *);
476 if (ptr) {
477#ifdef MEMSET_FREED
Jack Yub4295a42017-04-14 12:51:49 -0700478#define MAX_STRING_LENGTH 4096
479 memset(ptr, 0, strnlen(ptr, MAX_STRING_LENGTH));
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800480#endif
481 free(ptr);
482 }
483 }
484 va_end(ap);
485}
486
Jack Yuffc06452017-02-13 11:21:00 -0800487void sendErrorResponse(RequestInfo *pRI, RIL_Errno err) {
Amit Mahajan759786a2017-03-03 17:35:47 -0800488 pRI->pCI->responseFunction((int) pRI->socket_id,
Jack Yuffc06452017-02-13 11:21:00 -0800489 (int) RadioResponseType::SOLICITED, pRI->token, err, NULL, 0);
490}
491
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800492/**
Jack Yuf68e0da2017-02-07 14:53:09 -0800493 * Copies over src to dest. If memory allocation fails, responseFunction() is called for the
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800494 * request with error RIL_E_NO_MEMORY.
495 * Returns true on success, and false on failure.
496 */
Jack Yuf68e0da2017-02-07 14:53:09 -0800497bool copyHidlStringToRil(char **dest, const hidl_string &src, RequestInfo *pRI) {
498 size_t len = src.size();
499 if (len == 0) {
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800500 *dest = NULL;
501 return true;
502 }
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800503 *dest = (char *) calloc(len + 1, sizeof(char));
504 if (*dest == NULL) {
505 RLOGE("Memory allocation failed for request %s", requestToString(pRI->pCI->requestNumber));
Jack Yuffc06452017-02-13 11:21:00 -0800506 sendErrorResponse(pRI, RIL_E_NO_MEMORY);
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800507 return false;
508 }
Scott Randolphc7213312017-04-03 14:06:40 -0700509 strncpy(*dest, src.c_str(), len + 1);
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800510 return true;
511}
512
513hidl_string convertCharPtrToHidlString(const char *ptr) {
514 hidl_string ret;
515 if (ptr != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -0800516 // TODO: replace this with strnlen
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800517 ret.setToExternal(ptr, strlen(ptr));
518 }
519 return ret;
520}
521
522bool dispatchVoid(int serial, int slotId, int request) {
523 RequestInfo *pRI = android::addRequestToList(serial, slotId, request);
524 if (pRI == NULL) {
525 return false;
526 }
Amit Mahajanb3a11bb2017-05-15 16:41:44 -0700527 CALL_ONREQUEST(request, NULL, 0, pRI, slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800528 return true;
529}
530
531bool dispatchString(int serial, int slotId, int request, const char * str) {
532 RequestInfo *pRI = android::addRequestToList(serial, slotId, request);
533 if (pRI == NULL) {
534 return false;
535 }
536
537 char *pString;
538 if (!copyHidlStringToRil(&pString, str, pRI)) {
539 return false;
540 }
541
Amit Mahajanb3a11bb2017-05-15 16:41:44 -0700542 CALL_ONREQUEST(request, pString, sizeof(char *), pRI, slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800543
544 memsetAndFreeStrings(1, pString);
545 return true;
546}
547
548bool dispatchStrings(int serial, int slotId, int request, int countStrings, ...) {
549 RequestInfo *pRI = android::addRequestToList(serial, slotId, request);
550 if (pRI == NULL) {
551 return false;
552 }
553
Sanket Padawef220dc52017-01-02 23:46:00 -0800554 char **pStrings;
Sanket Padawef220dc52017-01-02 23:46:00 -0800555 pStrings = (char **)calloc(countStrings, sizeof(char *));
556 if (pStrings == NULL) {
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800557 RLOGE("Memory allocation failed for request %s", requestToString(request));
Jack Yuffc06452017-02-13 11:21:00 -0800558 sendErrorResponse(pRI, RIL_E_NO_MEMORY);
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800559 return false;
Sanket Padawef220dc52017-01-02 23:46:00 -0800560 }
561 va_list ap;
562 va_start(ap, countStrings);
563 for (int i = 0; i < countStrings; i++) {
564 const char* str = va_arg(ap, const char *);
Jack Yuc13645e2017-04-13 20:55:03 -0700565 if (!copyHidlStringToRil(&pStrings[i], hidl_string(str), pRI)) {
Sanket Padawef220dc52017-01-02 23:46:00 -0800566 va_end(ap);
Sanket Padawef220dc52017-01-02 23:46:00 -0800567 for (int j = 0; j < i; j++) {
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800568 memsetAndFreeStrings(1, pStrings[j]);
Sanket Padawef220dc52017-01-02 23:46:00 -0800569 }
570 free(pStrings);
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800571 return false;
Sanket Padawef220dc52017-01-02 23:46:00 -0800572 }
Sanket Padawef220dc52017-01-02 23:46:00 -0800573 }
574 va_end(ap);
575
Amit Mahajanb3a11bb2017-05-15 16:41:44 -0700576 CALL_ONREQUEST(request, pStrings, countStrings * sizeof(char *), pRI, slotId);
Sanket Padawef220dc52017-01-02 23:46:00 -0800577
578 if (pStrings != NULL) {
579 for (int i = 0 ; i < countStrings ; i++) {
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800580 memsetAndFreeStrings(1, pStrings[i]);
Sanket Padawef220dc52017-01-02 23:46:00 -0800581 }
582
583#ifdef MEMSET_FREED
584 memset(pStrings, 0, countStrings * sizeof(char *));
585#endif
586 free(pStrings);
587 }
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800588 return true;
589}
590
591bool dispatchStrings(int serial, int slotId, int request, const hidl_vec<hidl_string>& data) {
592 RequestInfo *pRI = android::addRequestToList(serial, slotId, request);
593 if (pRI == NULL) {
594 return false;
595 }
596
597 int countStrings = data.size();
598 char **pStrings;
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800599 pStrings = (char **)calloc(countStrings, sizeof(char *));
600 if (pStrings == NULL) {
601 RLOGE("Memory allocation failed for request %s", requestToString(request));
Jack Yuffc06452017-02-13 11:21:00 -0800602 sendErrorResponse(pRI, RIL_E_NO_MEMORY);
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800603 return false;
604 }
605
606 for (int i = 0; i < countStrings; i++) {
Jack Yuf68e0da2017-02-07 14:53:09 -0800607 if (!copyHidlStringToRil(&pStrings[i], data[i], pRI)) {
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800608 for (int j = 0; j < i; j++) {
609 memsetAndFreeStrings(1, pStrings[j]);
610 }
611 free(pStrings);
612 return false;
613 }
614 }
615
Amit Mahajanb3a11bb2017-05-15 16:41:44 -0700616 CALL_ONREQUEST(request, pStrings, countStrings * sizeof(char *), pRI, slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800617
618 if (pStrings != NULL) {
619 for (int i = 0 ; i < countStrings ; i++) {
620 memsetAndFreeStrings(1, pStrings[i]);
621 }
622
623#ifdef MEMSET_FREED
624 memset(pStrings, 0, countStrings * sizeof(char *));
625#endif
626 free(pStrings);
627 }
628 return true;
629}
630
631bool dispatchInts(int serial, int slotId, int request, int countInts, ...) {
632 RequestInfo *pRI = android::addRequestToList(serial, slotId, request);
633 if (pRI == NULL) {
634 return false;
635 }
636
Jack Yuffc06452017-02-13 11:21:00 -0800637 int *pInts = (int *)calloc(countInts, sizeof(int));
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800638
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800639 if (pInts == NULL) {
640 RLOGE("Memory allocation failed for request %s", requestToString(request));
Jack Yuffc06452017-02-13 11:21:00 -0800641 sendErrorResponse(pRI, RIL_E_NO_MEMORY);
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800642 return false;
643 }
644 va_list ap;
645 va_start(ap, countInts);
646 for (int i = 0; i < countInts; i++) {
647 pInts[i] = va_arg(ap, int);
648 }
649 va_end(ap);
650
Amit Mahajanb3a11bb2017-05-15 16:41:44 -0700651 CALL_ONREQUEST(request, pInts, countInts * sizeof(int), pRI, slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800652
653 if (pInts != NULL) {
654#ifdef MEMSET_FREED
655 memset(pInts, 0, countInts * sizeof(int));
656#endif
657 free(pInts);
658 }
659 return true;
660}
661
662bool dispatchCallForwardStatus(int serial, int slotId, int request,
663 const CallForwardInfo& callInfo) {
664 RequestInfo *pRI = android::addRequestToList(serial, slotId, request);
665 if (pRI == NULL) {
666 return false;
667 }
668
669 RIL_CallForwardInfo cf;
670 cf.status = (int) callInfo.status;
671 cf.reason = callInfo.reason;
672 cf.serviceClass = callInfo.serviceClass;
673 cf.toa = callInfo.toa;
674 cf.timeSeconds = callInfo.timeSeconds;
675
676 if (!copyHidlStringToRil(&cf.number, callInfo.number, pRI)) {
677 return false;
678 }
679
Amit Mahajanb3a11bb2017-05-15 16:41:44 -0700680 CALL_ONREQUEST(request, &cf, sizeof(cf), pRI, slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800681
682 memsetAndFreeStrings(1, cf.number);
683
684 return true;
685}
686
687bool dispatchRaw(int serial, int slotId, int request, const hidl_vec<uint8_t>& rawBytes) {
688 RequestInfo *pRI = android::addRequestToList(serial, slotId, request);
689 if (pRI == NULL) {
690 return false;
691 }
692
693 const uint8_t *uData = rawBytes.data();
694
Amit Mahajanb3a11bb2017-05-15 16:41:44 -0700695 CALL_ONREQUEST(request, (void *) uData, rawBytes.size(), pRI, slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800696
697 return true;
698}
699
700bool dispatchIccApdu(int serial, int slotId, int request, const SimApdu& message) {
701 RequestInfo *pRI = android::addRequestToList(serial, slotId, request);
702 if (pRI == NULL) {
703 return false;
704 }
705
Jack Yu8e732d42017-04-14 00:08:06 -0700706 RIL_SIM_APDU apdu = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800707
708 apdu.sessionid = message.sessionId;
709 apdu.cla = message.cla;
710 apdu.instruction = message.instruction;
711 apdu.p1 = message.p1;
712 apdu.p2 = message.p2;
713 apdu.p3 = message.p3;
714
715 if (!copyHidlStringToRil(&apdu.data, message.data, pRI)) {
716 return false;
717 }
718
Amit Mahajanb3a11bb2017-05-15 16:41:44 -0700719 CALL_ONREQUEST(request, &apdu, sizeof(apdu), pRI, slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800720
721 memsetAndFreeStrings(1, apdu.data);
722
723 return true;
Sanket Padawef220dc52017-01-02 23:46:00 -0800724}
725
Amit Mahajand423d192017-03-16 17:04:01 -0700726void checkReturnStatus(int32_t slotId, Return<void>& ret, bool isRadioService) {
Amit Mahajan17249842017-01-19 15:05:45 -0800727 if (ret.isOk() == false) {
Amit Mahajan439da362017-02-13 17:43:04 -0800728 RLOGE("checkReturnStatus: unable to call response/indication callback");
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800729 // Remote process hosting the callbacks must be dead. Reset the callback objects;
Amit Mahajan17249842017-01-19 15:05:45 -0800730 // there's no other recovery to be done here. When the client process is back up, it will
731 // call setResponseFunctions()
Amit Mahajan932e08e2017-01-24 05:45:02 -0800732
733 // Caller should already hold rdlock, release that first
734 // note the current counter to avoid overwriting updates made by another thread before
735 // write lock is acquired.
Amit Mahajand423d192017-03-16 17:04:01 -0700736 int counter = isRadioService ? mCounterRadio[slotId] : mCounterOemHook[slotId];
Amit Mahajan439da362017-02-13 17:43:04 -0800737 pthread_rwlock_t *radioServiceRwlockPtr = radio::getRadioServiceRwlock(slotId);
Amit Mahajan932e08e2017-01-24 05:45:02 -0800738 int ret = pthread_rwlock_unlock(radioServiceRwlockPtr);
739 assert(ret == 0);
740
741 // acquire wrlock
742 ret = pthread_rwlock_wrlock(radioServiceRwlockPtr);
743 assert(ret == 0);
744
745 // make sure the counter value has not changed
Amit Mahajand423d192017-03-16 17:04:01 -0700746 if (counter == (isRadioService ? mCounterRadio[slotId] : mCounterOemHook[slotId])) {
747 if (isRadioService) {
748 radioService[slotId]->mRadioResponse = NULL;
749 radioService[slotId]->mRadioIndication = NULL;
Amit Mahajanccb6d7f2017-06-09 10:44:54 -0700750 radioService[slotId]->mRadioResponseV1_1 = NULL;
751 radioService[slotId]->mRadioIndicationV1_1 = NULL;
Amit Mahajand423d192017-03-16 17:04:01 -0700752 } else {
753 oemHookService[slotId]->mOemHookResponse = NULL;
754 oemHookService[slotId]->mOemHookIndication = NULL;
755 }
756 isRadioService ? mCounterRadio[slotId]++ : mCounterOemHook[slotId]++;
Amit Mahajan932e08e2017-01-24 05:45:02 -0800757 } else {
Amit Mahajan439da362017-02-13 17:43:04 -0800758 RLOGE("checkReturnStatus: not resetting responseFunctions as they likely "
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800759 "got updated on another thread");
Amit Mahajan932e08e2017-01-24 05:45:02 -0800760 }
761
762 // release wrlock
763 ret = pthread_rwlock_unlock(radioServiceRwlockPtr);
764 assert(ret == 0);
765
766 // Reacquire rdlock
767 ret = pthread_rwlock_rdlock(radioServiceRwlockPtr);
768 assert(ret == 0);
Amit Mahajan17249842017-01-19 15:05:45 -0800769 }
770}
771
Amit Mahajan439da362017-02-13 17:43:04 -0800772void RadioImpl::checkReturnStatus(Return<void>& ret) {
Amit Mahajand423d192017-03-16 17:04:01 -0700773 ::checkReturnStatus(mSlotId, ret, true);
Amit Mahajan439da362017-02-13 17:43:04 -0800774}
775
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700776Return<void> RadioImpl::setResponseFunctions(
777 const ::android::sp<IRadioResponse>& radioResponseParam,
778 const ::android::sp<IRadioIndication>& radioIndicationParam) {
Amit Mahajan111ddca2017-03-03 12:05:13 -0800779 RLOGD("setResponseFunctions");
Amit Mahajan932e08e2017-01-24 05:45:02 -0800780
781 pthread_rwlock_t *radioServiceRwlockPtr = radio::getRadioServiceRwlock(mSlotId);
782 int ret = pthread_rwlock_wrlock(radioServiceRwlockPtr);
783 assert(ret == 0);
784
Sanket Padawef220dc52017-01-02 23:46:00 -0800785 mRadioResponse = radioResponseParam;
786 mRadioIndication = radioIndicationParam;
Amit Mahajanccb6d7f2017-06-09 10:44:54 -0700787 mRadioResponseV1_1 = V1_1::IRadioResponse::castFrom(mRadioResponse).withDefault(nullptr);
788 mRadioIndicationV1_1 = V1_1::IRadioIndication::castFrom(mRadioIndication).withDefault(nullptr);
789 if (mRadioResponseV1_1 == nullptr || mRadioIndicationV1_1 == nullptr) {
790 mRadioResponseV1_1 = nullptr;
791 mRadioIndicationV1_1 = nullptr;
792 }
793
Amit Mahajand423d192017-03-16 17:04:01 -0700794 mCounterRadio[mSlotId]++;
Amit Mahajan932e08e2017-01-24 05:45:02 -0800795
796 ret = pthread_rwlock_unlock(radioServiceRwlockPtr);
797 assert(ret == 0);
798
Amit Mahajan60482fd2017-03-14 16:39:27 -0700799 // client is connected. Send initial indications.
800 android::onNewCommandConnect((RIL_SOCKET_ID) mSlotId);
801
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800802 return Void();
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700803}
804
805Return<void> RadioImpl::getIccCardStatus(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -0700806#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -0800807 RLOGD("getIccCardStatus: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -0700808#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800809 dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_SIM_STATUS);
810 return Void();
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700811}
812
Sanket Padawef220dc52017-01-02 23:46:00 -0800813Return<void> RadioImpl::supplyIccPinForApp(int32_t serial, const hidl_string& pin,
814 const hidl_string& aid) {
Jayachandran C572f2f42017-03-25 14:30:13 -0700815#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -0800816 RLOGD("supplyIccPinForApp: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -0700817#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800818 dispatchStrings(serial, mSlotId, RIL_REQUEST_ENTER_SIM_PIN,
Scott Randolphc7213312017-04-03 14:06:40 -0700819 2, pin.c_str(), aid.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800820 return Void();
Sanket Padawef220dc52017-01-02 23:46:00 -0800821}
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700822
Sanket Padawef220dc52017-01-02 23:46:00 -0800823Return<void> RadioImpl::supplyIccPukForApp(int32_t serial, const hidl_string& puk,
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800824 const hidl_string& pin, const hidl_string& aid) {
Jayachandran C572f2f42017-03-25 14:30:13 -0700825#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -0800826 RLOGD("supplyIccPukForApp: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -0700827#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800828 dispatchStrings(serial, mSlotId, RIL_REQUEST_ENTER_SIM_PUK,
Scott Randolphc7213312017-04-03 14:06:40 -0700829 3, puk.c_str(), pin.c_str(), aid.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800830 return Void();
Sanket Padawef220dc52017-01-02 23:46:00 -0800831}
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700832
Sanket Padawef220dc52017-01-02 23:46:00 -0800833Return<void> RadioImpl::supplyIccPin2ForApp(int32_t serial, const hidl_string& pin2,
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800834 const hidl_string& aid) {
Jayachandran C572f2f42017-03-25 14:30:13 -0700835#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -0800836 RLOGD("supplyIccPin2ForApp: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -0700837#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800838 dispatchStrings(serial, mSlotId, RIL_REQUEST_ENTER_SIM_PIN2,
Scott Randolphc7213312017-04-03 14:06:40 -0700839 2, pin2.c_str(), aid.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800840 return Void();
Sanket Padawef220dc52017-01-02 23:46:00 -0800841}
842
843Return<void> RadioImpl::supplyIccPuk2ForApp(int32_t serial, const hidl_string& puk2,
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800844 const hidl_string& pin2, const hidl_string& aid) {
Jayachandran C572f2f42017-03-25 14:30:13 -0700845#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -0800846 RLOGD("supplyIccPuk2ForApp: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -0700847#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800848 dispatchStrings(serial, mSlotId, RIL_REQUEST_ENTER_SIM_PUK2,
Scott Randolphc7213312017-04-03 14:06:40 -0700849 3, puk2.c_str(), pin2.c_str(), aid.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800850 return Void();
Sanket Padawef220dc52017-01-02 23:46:00 -0800851}
852
853Return<void> RadioImpl::changeIccPinForApp(int32_t serial, const hidl_string& oldPin,
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800854 const hidl_string& newPin, const hidl_string& aid) {
Jayachandran C572f2f42017-03-25 14:30:13 -0700855#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -0800856 RLOGD("changeIccPinForApp: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -0700857#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800858 dispatchStrings(serial, mSlotId, RIL_REQUEST_CHANGE_SIM_PIN,
Scott Randolphc7213312017-04-03 14:06:40 -0700859 3, oldPin.c_str(), newPin.c_str(), aid.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800860 return Void();
Sanket Padawef220dc52017-01-02 23:46:00 -0800861}
862
863Return<void> RadioImpl::changeIccPin2ForApp(int32_t serial, const hidl_string& oldPin2,
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800864 const hidl_string& newPin2, const hidl_string& aid) {
Jayachandran C572f2f42017-03-25 14:30:13 -0700865#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -0800866 RLOGD("changeIccPin2ForApp: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -0700867#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800868 dispatchStrings(serial, mSlotId, RIL_REQUEST_CHANGE_SIM_PIN2,
Scott Randolphc7213312017-04-03 14:06:40 -0700869 3, oldPin2.c_str(), newPin2.c_str(), aid.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800870 return Void();
Sanket Padawef220dc52017-01-02 23:46:00 -0800871}
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700872
873Return<void> RadioImpl::supplyNetworkDepersonalization(int32_t serial,
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800874 const hidl_string& netPin) {
Jayachandran C572f2f42017-03-25 14:30:13 -0700875#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -0800876 RLOGD("supplyNetworkDepersonalization: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -0700877#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800878 dispatchStrings(serial, mSlotId, RIL_REQUEST_ENTER_NETWORK_DEPERSONALIZATION,
Scott Randolphc7213312017-04-03 14:06:40 -0700879 1, netPin.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800880 return Void();
Sanket Padawef220dc52017-01-02 23:46:00 -0800881}
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700882
Sanket Padawef220dc52017-01-02 23:46:00 -0800883Return<void> RadioImpl::getCurrentCalls(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -0700884#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -0800885 RLOGD("getCurrentCalls: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -0700886#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800887 dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_CURRENT_CALLS);
888 return Void();
Sanket Padawef220dc52017-01-02 23:46:00 -0800889}
890
891Return<void> RadioImpl::dial(int32_t serial, const Dial& dialInfo) {
Jayachandran C572f2f42017-03-25 14:30:13 -0700892#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -0800893 RLOGD("dial: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -0700894#endif
Sanket Padawef220dc52017-01-02 23:46:00 -0800895 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_DIAL);
896 if (pRI == NULL) {
897 return Void();
898 }
Jack Yuf68e0da2017-02-07 14:53:09 -0800899 RIL_Dial dial = {};
900 RIL_UUS_Info uusInfo = {};
Sanket Padawef220dc52017-01-02 23:46:00 -0800901 int32_t sizeOfDial = sizeof(dial);
902
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800903 if (!copyHidlStringToRil(&dial.address, dialInfo.address, pRI)) {
Sanket Padawef220dc52017-01-02 23:46:00 -0800904 return Void();
905 }
Jack Yuf68e0da2017-02-07 14:53:09 -0800906 dial.clir = (int) dialInfo.clir;
Sanket Padawef220dc52017-01-02 23:46:00 -0800907
Sanket Padawef220dc52017-01-02 23:46:00 -0800908 if (dialInfo.uusInfo.size() != 0) {
Sanket Padawef220dc52017-01-02 23:46:00 -0800909 uusInfo.uusType = (RIL_UUS_Type) dialInfo.uusInfo[0].uusType;
910 uusInfo.uusDcs = (RIL_UUS_DCS) dialInfo.uusInfo[0].uusDcs;
911
912 if (dialInfo.uusInfo[0].uusData.size() == 0) {
913 uusInfo.uusData = NULL;
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800914 uusInfo.uusLength = 0;
Sanket Padawef220dc52017-01-02 23:46:00 -0800915 } else {
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800916 if (!copyHidlStringToRil(&uusInfo.uusData, dialInfo.uusInfo[0].uusData, pRI)) {
917 memsetAndFreeStrings(1, dial.address);
Sanket Padawef220dc52017-01-02 23:46:00 -0800918 return Void();
919 }
Jack Yuf68e0da2017-02-07 14:53:09 -0800920 uusInfo.uusLength = dialInfo.uusInfo[0].uusData.size();
Sanket Padawef220dc52017-01-02 23:46:00 -0800921 }
922
Sanket Padawef220dc52017-01-02 23:46:00 -0800923 dial.uusInfo = &uusInfo;
924 }
925
Amit Mahajanb3a11bb2017-05-15 16:41:44 -0700926 CALL_ONREQUEST(RIL_REQUEST_DIAL, &dial, sizeOfDial, pRI, mSlotId);
Sanket Padawef220dc52017-01-02 23:46:00 -0800927
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800928 memsetAndFreeStrings(2, dial.address, uusInfo.uusData);
Sanket Padawef220dc52017-01-02 23:46:00 -0800929
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800930 return Void();
Sanket Padawef220dc52017-01-02 23:46:00 -0800931}
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700932
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800933Return<void> RadioImpl::getImsiForApp(int32_t serial, const hidl_string& aid) {
Jayachandran C572f2f42017-03-25 14:30:13 -0700934#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -0800935 RLOGD("getImsiForApp: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -0700936#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800937 dispatchStrings(serial, mSlotId, RIL_REQUEST_GET_IMSI,
Scott Randolphc7213312017-04-03 14:06:40 -0700938 1, aid.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800939 return Void();
940}
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700941
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800942Return<void> RadioImpl::hangup(int32_t serial, int32_t gsmIndex) {
Jayachandran C572f2f42017-03-25 14:30:13 -0700943#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -0800944 RLOGD("hangup: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -0700945#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800946 dispatchInts(serial, mSlotId, RIL_REQUEST_HANGUP, 1, gsmIndex);
947 return Void();
948}
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700949
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800950Return<void> RadioImpl::hangupWaitingOrBackground(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -0700951#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -0800952 RLOGD("hangupWaitingOrBackground: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -0700953#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800954 dispatchVoid(serial, mSlotId, RIL_REQUEST_HANGUP_WAITING_OR_BACKGROUND);
955 return Void();
956}
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700957
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800958Return<void> RadioImpl::hangupForegroundResumeBackground(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -0700959#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -0800960 RLOGD("hangupForegroundResumeBackground: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -0700961#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800962 dispatchVoid(serial, mSlotId, RIL_REQUEST_HANGUP_FOREGROUND_RESUME_BACKGROUND);
963 return Void();
964}
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700965
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800966Return<void> RadioImpl::switchWaitingOrHoldingAndActive(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -0700967#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -0800968 RLOGD("switchWaitingOrHoldingAndActive: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -0700969#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800970 dispatchVoid(serial, mSlotId, RIL_REQUEST_SWITCH_WAITING_OR_HOLDING_AND_ACTIVE);
971 return Void();
972}
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700973
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800974Return<void> RadioImpl::conference(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -0700975#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -0800976 RLOGD("conference: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -0700977#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800978 dispatchVoid(serial, mSlotId, RIL_REQUEST_CONFERENCE);
979 return Void();
980}
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700981
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800982Return<void> RadioImpl::rejectCall(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -0700983#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -0800984 RLOGD("rejectCall: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -0700985#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800986 dispatchVoid(serial, mSlotId, RIL_REQUEST_UDUB);
987 return Void();
988}
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700989
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800990Return<void> RadioImpl::getLastCallFailCause(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -0700991#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -0800992 RLOGD("getLastCallFailCause: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -0700993#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800994 dispatchVoid(serial, mSlotId, RIL_REQUEST_LAST_CALL_FAIL_CAUSE);
995 return Void();
996}
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700997
Sanket Padawe378ccdd2017-01-24 14:11:12 -0800998Return<void> RadioImpl::getSignalStrength(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -0700999#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001000 RLOGD("getSignalStrength: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001001#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001002 dispatchVoid(serial, mSlotId, RIL_REQUEST_SIGNAL_STRENGTH);
1003 return Void();
1004}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001005
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001006Return<void> RadioImpl::getVoiceRegistrationState(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001007#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001008 RLOGD("getVoiceRegistrationState: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001009#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001010 dispatchVoid(serial, mSlotId, RIL_REQUEST_VOICE_REGISTRATION_STATE);
1011 return Void();
1012}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001013
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001014Return<void> RadioImpl::getDataRegistrationState(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001015#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001016 RLOGD("getDataRegistrationState: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001017#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001018 dispatchVoid(serial, mSlotId, RIL_REQUEST_DATA_REGISTRATION_STATE);
1019 return Void();
1020}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001021
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001022Return<void> RadioImpl::getOperator(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001023#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001024 RLOGD("getOperator: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001025#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001026 dispatchVoid(serial, mSlotId, RIL_REQUEST_OPERATOR);
1027 return Void();
1028}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001029
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001030Return<void> RadioImpl::setRadioPower(int32_t serial, bool on) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08001031 RLOGD("setRadioPower: serial %d on %d", serial, on);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001032 dispatchInts(serial, mSlotId, RIL_REQUEST_RADIO_POWER, 1, BOOL_TO_INT(on));
1033 return Void();
1034}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001035
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001036Return<void> RadioImpl::sendDtmf(int32_t serial, const hidl_string& s) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001037#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001038 RLOGD("sendDtmf: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001039#endif
Scott Randolphc7213312017-04-03 14:06:40 -07001040 dispatchString(serial, mSlotId, RIL_REQUEST_DTMF, s.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001041 return Void();
1042}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001043
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001044Return<void> RadioImpl::sendSms(int32_t serial, const GsmSmsMessage& message) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001045#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001046 RLOGD("sendSms: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001047#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001048 dispatchStrings(serial, mSlotId, RIL_REQUEST_SEND_SMS,
Scott Randolphc7213312017-04-03 14:06:40 -07001049 2, message.smscPdu.c_str(), message.pdu.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001050 return Void();
1051}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001052
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001053Return<void> RadioImpl::sendSMSExpectMore(int32_t serial, const GsmSmsMessage& message) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001054#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001055 RLOGD("sendSMSExpectMore: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001056#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001057 dispatchStrings(serial, mSlotId, RIL_REQUEST_SEND_SMS_EXPECT_MORE,
Scott Randolphc7213312017-04-03 14:06:40 -07001058 2, message.smscPdu.c_str(), message.pdu.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001059 return Void();
1060}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001061
Jack Yuc13645e2017-04-13 20:55:03 -07001062static bool convertMvnoTypeToString(MvnoType type, char *&str) {
Jack Yuffc06452017-02-13 11:21:00 -08001063 switch (type) {
Jack Yuc13645e2017-04-13 20:55:03 -07001064 case MvnoType::IMSI:
1065 str = (char *)"imsi";
1066 return true;
1067 case MvnoType::GID:
1068 str = (char *)"gid";
1069 return true;
1070 case MvnoType::SPN:
1071 str = (char *)"spn";
1072 return true;
1073 case MvnoType::NONE:
1074 str = (char *)"";
1075 return true;
Jack Yuffc06452017-02-13 11:21:00 -08001076 }
Jack Yuc13645e2017-04-13 20:55:03 -07001077 return false;
Jack Yuffc06452017-02-13 11:21:00 -08001078}
1079
1080Return<void> RadioImpl::setupDataCall(int32_t serial, RadioTechnology radioTechnology,
1081 const DataProfileInfo& dataProfileInfo, bool modemCognitive,
1082 bool roamingAllowed, bool isRoaming) {
1083
Jayachandran C572f2f42017-03-25 14:30:13 -07001084#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001085 RLOGD("setupDataCall: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001086#endif
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001087
Jack Yuffc06452017-02-13 11:21:00 -08001088 if (s_vendorFunctions->version >= 4 && s_vendorFunctions->version <= 14) {
1089 const hidl_string &protocol =
1090 (isRoaming ? dataProfileInfo.roamingProtocol : dataProfileInfo.protocol);
1091 dispatchStrings(serial, mSlotId, RIL_REQUEST_SETUP_DATA_CALL, 7,
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 protocol.c_str());
1099 } else if (s_vendorFunctions->version >= 15) {
Jack Yuc13645e2017-04-13 20:55:03 -07001100 char *mvnoTypeStr = NULL;
1101 if (!convertMvnoTypeToString(dataProfileInfo.mvnoType, mvnoTypeStr)) {
Jack Yuffc06452017-02-13 11:21:00 -08001102 RequestInfo *pRI = android::addRequestToList(serial, mSlotId,
1103 RIL_REQUEST_SETUP_DATA_CALL);
1104 if (pRI != NULL) {
1105 sendErrorResponse(pRI, RIL_E_INVALID_ARGUMENTS);
1106 }
1107 return Void();
1108 }
1109 dispatchStrings(serial, mSlotId, RIL_REQUEST_SETUP_DATA_CALL, 15,
1110 std::to_string((int) radioTechnology + 2).c_str(),
1111 std::to_string((int) dataProfileInfo.profileId).c_str(),
1112 dataProfileInfo.apn.c_str(),
1113 dataProfileInfo.user.c_str(),
1114 dataProfileInfo.password.c_str(),
1115 std::to_string((int) dataProfileInfo.authType).c_str(),
1116 dataProfileInfo.protocol.c_str(),
1117 dataProfileInfo.roamingProtocol.c_str(),
1118 std::to_string(dataProfileInfo.supportedApnTypesBitmap).c_str(),
1119 std::to_string(dataProfileInfo.bearerBitmap).c_str(),
Jack Yuc13645e2017-04-13 20:55:03 -07001120 modemCognitive ? "1" : "0",
Jack Yuffc06452017-02-13 11:21:00 -08001121 std::to_string(dataProfileInfo.mtu).c_str(),
1122 mvnoTypeStr,
1123 dataProfileInfo.mvnoMatchData.c_str(),
Jack Yuc13645e2017-04-13 20:55:03 -07001124 roamingAllowed ? "1" : "0");
Jack Yuffc06452017-02-13 11:21:00 -08001125 } else {
1126 RLOGE("Unsupported RIL version %d, min version expected 4", s_vendorFunctions->version);
1127 RequestInfo *pRI = android::addRequestToList(serial, mSlotId,
1128 RIL_REQUEST_SETUP_DATA_CALL);
1129 if (pRI != NULL) {
1130 sendErrorResponse(pRI, RIL_E_REQUEST_NOT_SUPPORTED);
1131 }
1132 }
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001133 return Void();
1134}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001135
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001136Return<void> RadioImpl::iccIOForApp(int32_t serial, const IccIo& iccIo) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001137#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001138 RLOGD("iccIOForApp: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001139#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001140 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_SIM_IO);
1141 if (pRI == NULL) {
1142 return Void();
1143 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001144
Jack Yu8e732d42017-04-14 00:08:06 -07001145 RIL_SIM_IO_v6 rilIccIo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001146 rilIccIo.command = iccIo.command;
1147 rilIccIo.fileid = iccIo.fileId;
1148 if (!copyHidlStringToRil(&rilIccIo.path, iccIo.path, pRI)) {
1149 return Void();
1150 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001151
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001152 rilIccIo.p1 = iccIo.p1;
1153 rilIccIo.p2 = iccIo.p2;
1154 rilIccIo.p3 = iccIo.p3;
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001155
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001156 if (!copyHidlStringToRil(&rilIccIo.data, iccIo.data, pRI)) {
1157 memsetAndFreeStrings(1, rilIccIo.path);
1158 return Void();
1159 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001160
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001161 if (!copyHidlStringToRil(&rilIccIo.pin2, iccIo.pin2, pRI)) {
1162 memsetAndFreeStrings(2, rilIccIo.path, rilIccIo.data);
1163 return Void();
1164 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001165
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001166 if (!copyHidlStringToRil(&rilIccIo.aidPtr, iccIo.aid, pRI)) {
1167 memsetAndFreeStrings(3, rilIccIo.path, rilIccIo.data, rilIccIo.pin2);
1168 return Void();
1169 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001170
Amit Mahajanb3a11bb2017-05-15 16:41:44 -07001171 CALL_ONREQUEST(RIL_REQUEST_SIM_IO, &rilIccIo, sizeof(rilIccIo), pRI, mSlotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001172
1173 memsetAndFreeStrings(4, rilIccIo.path, rilIccIo.data, rilIccIo.pin2, rilIccIo.aidPtr);
1174
1175 return Void();
1176}
1177
1178Return<void> RadioImpl::sendUssd(int32_t serial, const hidl_string& ussd) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001179#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001180 RLOGD("sendUssd: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001181#endif
Scott Randolphc7213312017-04-03 14:06:40 -07001182 dispatchString(serial, mSlotId, RIL_REQUEST_SEND_USSD, ussd.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001183 return Void();
1184}
1185
1186Return<void> RadioImpl::cancelPendingUssd(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001187#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001188 RLOGD("cancelPendingUssd: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001189#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001190 dispatchVoid(serial, mSlotId, RIL_REQUEST_CANCEL_USSD);
1191 return Void();
1192}
1193
1194Return<void> RadioImpl::getClir(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001195#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001196 RLOGD("getClir: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001197#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001198 dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_CLIR);
1199 return Void();
1200}
1201
1202Return<void> RadioImpl::setClir(int32_t serial, int32_t status) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001203#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001204 RLOGD("setClir: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001205#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001206 dispatchInts(serial, mSlotId, RIL_REQUEST_SET_CLIR, 1, status);
1207 return Void();
1208}
1209
1210Return<void> RadioImpl::getCallForwardStatus(int32_t serial, const CallForwardInfo& callInfo) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001211#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001212 RLOGD("getCallForwardStatus: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001213#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001214 dispatchCallForwardStatus(serial, mSlotId, RIL_REQUEST_QUERY_CALL_FORWARD_STATUS,
1215 callInfo);
1216 return Void();
1217}
1218
1219Return<void> RadioImpl::setCallForward(int32_t serial, const CallForwardInfo& callInfo) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001220#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001221 RLOGD("setCallForward: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001222#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001223 dispatchCallForwardStatus(serial, mSlotId, RIL_REQUEST_SET_CALL_FORWARD,
1224 callInfo);
1225 return Void();
1226}
1227
1228Return<void> RadioImpl::getCallWaiting(int32_t serial, int32_t serviceClass) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001229#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001230 RLOGD("getCallWaiting: 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_QUERY_CALL_WAITING, 1, serviceClass);
1233 return Void();
1234}
1235
1236Return<void> RadioImpl::setCallWaiting(int32_t serial, bool enable, int32_t serviceClass) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001237#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001238 RLOGD("setCallWaiting: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001239#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001240 dispatchInts(serial, mSlotId, RIL_REQUEST_SET_CALL_WAITING, 2, BOOL_TO_INT(enable),
1241 serviceClass);
1242 return Void();
1243}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001244
1245Return<void> RadioImpl::acknowledgeLastIncomingGsmSms(int32_t serial,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001246 bool success, SmsAcknowledgeFailCause cause) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001247#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001248 RLOGD("acknowledgeLastIncomingGsmSms: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001249#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001250 dispatchInts(serial, mSlotId, RIL_REQUEST_SMS_ACKNOWLEDGE, 2, BOOL_TO_INT(success),
1251 cause);
1252 return Void();
1253}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001254
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001255Return<void> RadioImpl::acceptCall(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001256#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001257 RLOGD("acceptCall: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001258#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001259 dispatchVoid(serial, mSlotId, RIL_REQUEST_ANSWER);
1260 return Void();
1261}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001262
1263Return<void> RadioImpl::deactivateDataCall(int32_t serial,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001264 int32_t cid, bool reasonRadioShutDown) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001265#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001266 RLOGD("deactivateDataCall: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001267#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001268 dispatchStrings(serial, mSlotId, RIL_REQUEST_DEACTIVATE_DATA_CALL,
Scott Randolphc7213312017-04-03 14:06:40 -07001269 2, (std::to_string(cid)).c_str(), reasonRadioShutDown ? "1" : "0");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001270 return Void();
1271}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001272
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001273Return<void> RadioImpl::getFacilityLockForApp(int32_t serial, const hidl_string& facility,
1274 const hidl_string& password, int32_t serviceClass,
1275 const hidl_string& appId) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001276#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001277 RLOGD("getFacilityLockForApp: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001278#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001279 dispatchStrings(serial, mSlotId, RIL_REQUEST_QUERY_FACILITY_LOCK,
Scott Randolphc7213312017-04-03 14:06:40 -07001280 4, facility.c_str(), password.c_str(),
1281 (std::to_string(serviceClass)).c_str(), appId.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001282 return Void();
1283}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001284
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001285Return<void> RadioImpl::setFacilityLockForApp(int32_t serial, const hidl_string& facility,
1286 bool lockState, const hidl_string& password,
1287 int32_t serviceClass, const hidl_string& appId) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001288#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001289 RLOGD("setFacilityLockForApp: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001290#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001291 dispatchStrings(serial, mSlotId, RIL_REQUEST_SET_FACILITY_LOCK,
Scott Randolphc7213312017-04-03 14:06:40 -07001292 5, facility.c_str(), lockState ? "1" : "0", password.c_str(),
1293 (std::to_string(serviceClass)).c_str(), appId.c_str() );
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001294 return Void();
1295}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001296
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001297Return<void> RadioImpl::setBarringPassword(int32_t serial, const hidl_string& facility,
1298 const hidl_string& oldPassword,
1299 const hidl_string& newPassword) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001300#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001301 RLOGD("setBarringPassword: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001302#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001303 dispatchStrings(serial, mSlotId, RIL_REQUEST_CHANGE_BARRING_PASSWORD,
Sanket Padawe75e42a52017-05-24 10:03:55 -07001304 3, facility.c_str(), oldPassword.c_str(), newPassword.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001305 return Void();
1306}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001307
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001308Return<void> RadioImpl::getNetworkSelectionMode(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001309#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001310 RLOGD("getNetworkSelectionMode: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001311#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001312 dispatchVoid(serial, mSlotId, RIL_REQUEST_QUERY_NETWORK_SELECTION_MODE);
1313 return Void();
1314}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001315
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001316Return<void> RadioImpl::setNetworkSelectionModeAutomatic(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001317#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001318 RLOGD("setNetworkSelectionModeAutomatic: 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_SET_NETWORK_SELECTION_AUTOMATIC);
1321 return Void();
1322}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001323
1324Return<void> RadioImpl::setNetworkSelectionModeManual(int32_t serial,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001325 const hidl_string& operatorNumeric) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001326#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001327 RLOGD("setNetworkSelectionModeManual: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001328#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001329 dispatchString(serial, mSlotId, RIL_REQUEST_SET_NETWORK_SELECTION_MANUAL,
Scott Randolphc7213312017-04-03 14:06:40 -07001330 operatorNumeric.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001331 return Void();
1332}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001333
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001334Return<void> RadioImpl::getAvailableNetworks(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001335#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001336 RLOGD("getAvailableNetworks: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001337#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001338 dispatchVoid(serial, mSlotId, RIL_REQUEST_QUERY_AVAILABLE_NETWORKS);
1339 return Void();
1340}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001341
yinxu3abe7c72017-05-03 15:15:19 -07001342Return<void> RadioImpl::startNetworkScan(int32_t serial, const NetworkScanRequest& request) {
1343#if VDBG
1344 RLOGD("startNetworkScan: serial %d", serial);
1345#endif
yinxu8688abd2017-05-22 11:26:45 -07001346
1347 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_START_NETWORK_SCAN);
1348 if (pRI == NULL) {
1349 return Void();
1350 }
1351
1352 if (request.specifiers.size() > MAX_RADIO_ACCESS_NETWORKS) {
1353 sendErrorResponse(pRI, RIL_E_INVALID_ARGUMENTS);
1354 return Void();
1355 }
1356
1357 RIL_NetworkScanRequest scan_request = {};
1358
1359 scan_request.type = (RIL_ScanType) request.type;
1360 scan_request.interval = request.interval;
1361 scan_request.specifiers_length = request.specifiers.size();
1362 for (size_t i = 0; i < request.specifiers.size(); ++i) {
1363 if (request.specifiers[i].geranBands.size() > MAX_BANDS ||
1364 request.specifiers[i].utranBands.size() > MAX_BANDS ||
1365 request.specifiers[i].eutranBands.size() > MAX_BANDS ||
1366 request.specifiers[i].channels.size() > MAX_CHANNELS) {
1367 sendErrorResponse(pRI, RIL_E_INVALID_ARGUMENTS);
1368 return Void();
1369 }
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07001370 const V1_1::RadioAccessSpecifier& ras_from =
yinxu8688abd2017-05-22 11:26:45 -07001371 request.specifiers[i];
1372 RIL_RadioAccessSpecifier& ras_to = scan_request.specifiers[i];
1373
1374 ras_to.radio_access_network = (RIL_RadioAccessNetworks) ras_from.radioAccessNetwork;
1375 ras_to.channels_length = ras_from.channels.size();
1376
1377 std::copy(ras_from.channels.begin(), ras_from.channels.end(), ras_to.channels);
1378 const std::vector<uint32_t> * bands = nullptr;
1379 switch (request.specifiers[i].radioAccessNetwork) {
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07001380 case V1_1::RadioAccessNetworks::GERAN:
yinxu8688abd2017-05-22 11:26:45 -07001381 ras_to.bands_length = ras_from.geranBands.size();
1382 bands = (std::vector<uint32_t> *) &ras_from.geranBands;
1383 break;
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07001384 case V1_1::RadioAccessNetworks::UTRAN:
yinxu8688abd2017-05-22 11:26:45 -07001385 ras_to.bands_length = ras_from.utranBands.size();
1386 bands = (std::vector<uint32_t> *) &ras_from.utranBands;
1387 break;
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07001388 case V1_1::RadioAccessNetworks::EUTRAN:
yinxu8688abd2017-05-22 11:26:45 -07001389 ras_to.bands_length = ras_from.eutranBands.size();
1390 bands = (std::vector<uint32_t> *) &ras_from.eutranBands;
1391 break;
1392 default:
1393 sendErrorResponse(pRI, RIL_E_INVALID_ARGUMENTS);
1394 return Void();
1395 }
1396 // safe to copy to geran_bands because it's a union member
1397 std::memcpy(&ras_to.bands.geran_bands, bands, ras_to.bands_length * sizeof(uint32_t));
1398 }
1399
Mathieu Chartierf65b2c92017-06-05 13:59:25 -07001400 CALL_ONREQUEST(RIL_REQUEST_START_NETWORK_SCAN, &scan_request, sizeof(scan_request), pRI,
1401 mSlotId);
yinxu8688abd2017-05-22 11:26:45 -07001402
yinxu3abe7c72017-05-03 15:15:19 -07001403 return Void();
1404}
1405
1406Return<void> RadioImpl::stopNetworkScan(int32_t serial) {
1407#if VDBG
1408 RLOGD("stopNetworkScan: serial %d", serial);
1409#endif
yinxu3abe7c72017-05-03 15:15:19 -07001410 dispatchVoid(serial, mSlotId, RIL_REQUEST_STOP_NETWORK_SCAN);
1411 return Void();
1412}
1413
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001414Return<void> RadioImpl::startDtmf(int32_t serial, const hidl_string& s) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001415#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001416 RLOGD("startDtmf: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001417#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001418 dispatchString(serial, mSlotId, RIL_REQUEST_DTMF_START,
Scott Randolphc7213312017-04-03 14:06:40 -07001419 s.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001420 return Void();
1421}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001422
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001423Return<void> RadioImpl::stopDtmf(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001424#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001425 RLOGD("stopDtmf: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001426#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001427 dispatchVoid(serial, mSlotId, RIL_REQUEST_DTMF_STOP);
1428 return Void();
1429}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001430
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001431Return<void> RadioImpl::getBasebandVersion(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001432#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001433 RLOGD("getBasebandVersion: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001434#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001435 dispatchVoid(serial, mSlotId, RIL_REQUEST_BASEBAND_VERSION);
1436 return Void();
1437}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001438
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001439Return<void> RadioImpl::separateConnection(int32_t serial, int32_t gsmIndex) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001440#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001441 RLOGD("separateConnection: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001442#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001443 dispatchInts(serial, mSlotId, RIL_REQUEST_SEPARATE_CONNECTION, 1, gsmIndex);
1444 return Void();
1445}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001446
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001447Return<void> RadioImpl::setMute(int32_t serial, bool enable) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001448#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001449 RLOGD("setMute: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001450#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001451 dispatchInts(serial, mSlotId, RIL_REQUEST_SET_MUTE, 1, BOOL_TO_INT(enable));
1452 return Void();
1453}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001454
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001455Return<void> RadioImpl::getMute(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001456#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001457 RLOGD("getMute: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001458#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001459 dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_MUTE);
1460 return Void();
1461}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001462
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001463Return<void> RadioImpl::getClip(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001464#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001465 RLOGD("getClip: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001466#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001467 dispatchVoid(serial, mSlotId, RIL_REQUEST_QUERY_CLIP);
1468 return Void();
1469}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001470
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001471Return<void> RadioImpl::getDataCallList(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001472#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001473 RLOGD("getDataCallList: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001474#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001475 dispatchVoid(serial, mSlotId, RIL_REQUEST_DATA_CALL_LIST);
1476 return Void();
1477}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001478
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001479Return<void> RadioImpl::setSuppServiceNotifications(int32_t serial, bool enable) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001480#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001481 RLOGD("setSuppServiceNotifications: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001482#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001483 dispatchInts(serial, mSlotId, RIL_REQUEST_SET_SUPP_SVC_NOTIFICATION, 1,
1484 BOOL_TO_INT(enable));
1485 return Void();
1486}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001487
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001488Return<void> RadioImpl::writeSmsToSim(int32_t serial, const SmsWriteArgs& smsWriteArgs) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001489#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001490 RLOGD("writeSmsToSim: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001491#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001492 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_WRITE_SMS_TO_SIM);
1493 if (pRI == NULL) {
1494 return Void();
1495 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001496
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001497 RIL_SMS_WriteArgs args;
1498 args.status = (int) smsWriteArgs.status;
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001499
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001500 if (!copyHidlStringToRil(&args.pdu, smsWriteArgs.pdu, pRI)) {
1501 return Void();
1502 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001503
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001504 if (!copyHidlStringToRil(&args.smsc, smsWriteArgs.smsc, pRI)) {
1505 memsetAndFreeStrings(1, args.pdu);
1506 return Void();
1507 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001508
Amit Mahajanb3a11bb2017-05-15 16:41:44 -07001509 CALL_ONREQUEST(RIL_REQUEST_WRITE_SMS_TO_SIM, &args, sizeof(args), pRI, mSlotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001510
1511 memsetAndFreeStrings(2, args.smsc, args.pdu);
1512
1513 return Void();
1514}
1515
1516Return<void> RadioImpl::deleteSmsOnSim(int32_t serial, int32_t index) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001517#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001518 RLOGD("deleteSmsOnSim: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001519#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001520 dispatchInts(serial, mSlotId, RIL_REQUEST_DELETE_SMS_ON_SIM, 1, index);
1521 return Void();
1522}
1523
1524Return<void> RadioImpl::setBandMode(int32_t serial, RadioBandMode mode) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001525#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001526 RLOGD("setBandMode: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001527#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001528 dispatchInts(serial, mSlotId, RIL_REQUEST_SET_BAND_MODE, 1, mode);
1529 return Void();
1530}
1531
1532Return<void> RadioImpl::getAvailableBandModes(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001533#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001534 RLOGD("getAvailableBandModes: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001535#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001536 dispatchVoid(serial, mSlotId, RIL_REQUEST_QUERY_AVAILABLE_BAND_MODE);
1537 return Void();
1538}
1539
1540Return<void> RadioImpl::sendEnvelope(int32_t serial, const hidl_string& command) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001541#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001542 RLOGD("sendEnvelope: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001543#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001544 dispatchString(serial, mSlotId, RIL_REQUEST_STK_SEND_ENVELOPE_COMMAND,
Scott Randolphc7213312017-04-03 14:06:40 -07001545 command.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001546 return Void();
1547}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001548
1549Return<void> RadioImpl::sendTerminalResponseToSim(int32_t serial,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001550 const hidl_string& commandResponse) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001551#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001552 RLOGD("sendTerminalResponseToSim: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001553#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001554 dispatchString(serial, mSlotId, RIL_REQUEST_STK_SEND_TERMINAL_RESPONSE,
Scott Randolphc7213312017-04-03 14:06:40 -07001555 commandResponse.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001556 return Void();
1557}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001558
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001559Return<void> RadioImpl::handleStkCallSetupRequestFromSim(int32_t serial, bool accept) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001560#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001561 RLOGD("handleStkCallSetupRequestFromSim: 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_STK_HANDLE_CALL_SETUP_REQUESTED_FROM_SIM,
1564 1, BOOL_TO_INT(accept));
1565 return Void();
1566}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001567
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001568Return<void> RadioImpl::explicitCallTransfer(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001569#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001570 RLOGD("explicitCallTransfer: 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_EXPLICIT_CALL_TRANSFER);
1573 return Void();
1574}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001575
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001576Return<void> RadioImpl::setPreferredNetworkType(int32_t serial, PreferredNetworkType nwType) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001577#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001578 RLOGD("setPreferredNetworkType: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001579#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001580 dispatchInts(serial, mSlotId, RIL_REQUEST_SET_PREFERRED_NETWORK_TYPE, 1, nwType);
1581 return Void();
1582}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001583
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001584Return<void> RadioImpl::getPreferredNetworkType(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001585#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001586 RLOGD("getPreferredNetworkType: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001587#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001588 dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_PREFERRED_NETWORK_TYPE);
1589 return Void();
1590}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001591
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001592Return<void> RadioImpl::getNeighboringCids(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001593#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001594 RLOGD("getNeighboringCids: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001595#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001596 dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_NEIGHBORING_CELL_IDS);
1597 return Void();
1598}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001599
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001600Return<void> RadioImpl::setLocationUpdates(int32_t serial, bool enable) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001601#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001602 RLOGD("setLocationUpdates: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001603#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001604 dispatchInts(serial, mSlotId, RIL_REQUEST_SET_LOCATION_UPDATES, 1, BOOL_TO_INT(enable));
1605 return Void();
1606}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001607
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001608Return<void> RadioImpl::setCdmaSubscriptionSource(int32_t serial, CdmaSubscriptionSource cdmaSub) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001609#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001610 RLOGD("setCdmaSubscriptionSource: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001611#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001612 dispatchInts(serial, mSlotId, RIL_REQUEST_CDMA_SET_SUBSCRIPTION_SOURCE, 1, cdmaSub);
1613 return Void();
1614}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001615
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001616Return<void> RadioImpl::setCdmaRoamingPreference(int32_t serial, CdmaRoamingType type) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001617#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001618 RLOGD("setCdmaRoamingPreference: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001619#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001620 dispatchInts(serial, mSlotId, RIL_REQUEST_CDMA_SET_ROAMING_PREFERENCE, 1, type);
1621 return Void();
1622}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001623
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001624Return<void> RadioImpl::getCdmaRoamingPreference(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001625#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001626 RLOGD("getCdmaRoamingPreference: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001627#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001628 dispatchVoid(serial, mSlotId, RIL_REQUEST_CDMA_QUERY_ROAMING_PREFERENCE);
1629 return Void();
1630}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001631
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001632Return<void> RadioImpl::setTTYMode(int32_t serial, TtyMode mode) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001633#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001634 RLOGD("setTTYMode: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001635#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001636 dispatchInts(serial, mSlotId, RIL_REQUEST_SET_TTY_MODE, 1, mode);
1637 return Void();
1638}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001639
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001640Return<void> RadioImpl::getTTYMode(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001641#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001642 RLOGD("getTTYMode: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001643#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001644 dispatchVoid(serial, mSlotId, RIL_REQUEST_QUERY_TTY_MODE);
1645 return Void();
1646}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001647
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001648Return<void> RadioImpl::setPreferredVoicePrivacy(int32_t serial, bool enable) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001649#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001650 RLOGD("setPreferredVoicePrivacy: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001651#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001652 dispatchInts(serial, mSlotId, RIL_REQUEST_CDMA_SET_PREFERRED_VOICE_PRIVACY_MODE,
1653 1, BOOL_TO_INT(enable));
1654 return Void();
1655}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001656
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001657Return<void> RadioImpl::getPreferredVoicePrivacy(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001658#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001659 RLOGD("getPreferredVoicePrivacy: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001660#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001661 dispatchVoid(serial, mSlotId, RIL_REQUEST_CDMA_QUERY_PREFERRED_VOICE_PRIVACY_MODE);
1662 return Void();
1663}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001664
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001665Return<void> RadioImpl::sendCDMAFeatureCode(int32_t serial, const hidl_string& featureCode) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001666#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001667 RLOGD("sendCDMAFeatureCode: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001668#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001669 dispatchString(serial, mSlotId, RIL_REQUEST_CDMA_FLASH,
Scott Randolphc7213312017-04-03 14:06:40 -07001670 featureCode.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001671 return Void();
1672}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001673
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001674Return<void> RadioImpl::sendBurstDtmf(int32_t serial, const hidl_string& dtmf, int32_t on,
1675 int32_t off) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001676#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001677 RLOGD("sendBurstDtmf: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001678#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001679 dispatchStrings(serial, mSlotId, RIL_REQUEST_CDMA_BURST_DTMF,
Scott Randolphc7213312017-04-03 14:06:40 -07001680 3, dtmf.c_str(), (std::to_string(on)).c_str(),
1681 (std::to_string(off)).c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001682 return Void();
1683}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001684
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001685void constructCdmaSms(RIL_CDMA_SMS_Message &rcsm, const CdmaSmsMessage& sms) {
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001686 rcsm.uTeleserviceID = sms.teleserviceId;
1687 rcsm.bIsServicePresent = BOOL_TO_INT(sms.isServicePresent);
1688 rcsm.uServicecategory = sms.serviceCategory;
1689 rcsm.sAddress.digit_mode = (RIL_CDMA_SMS_DigitMode) sms.address.digitMode;
1690 rcsm.sAddress.number_mode = (RIL_CDMA_SMS_NumberMode) sms.address.numberMode;
1691 rcsm.sAddress.number_type = (RIL_CDMA_SMS_NumberType) sms.address.numberType;
1692 rcsm.sAddress.number_plan = (RIL_CDMA_SMS_NumberPlan) sms.address.numberPlan;
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001693
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001694 rcsm.sAddress.number_of_digits = sms.address.digits.size();
1695 int digitLimit= MIN((rcsm.sAddress.number_of_digits), RIL_CDMA_SMS_ADDRESS_MAX);
1696 for (int i = 0; i < digitLimit; i++) {
1697 rcsm.sAddress.digits[i] = sms.address.digits[i];
1698 }
1699
1700 rcsm.sSubAddress.subaddressType = (RIL_CDMA_SMS_SubaddressType) sms.subAddress.subaddressType;
1701 rcsm.sSubAddress.odd = BOOL_TO_INT(sms.subAddress.odd);
1702
1703 rcsm.sSubAddress.number_of_digits = sms.subAddress.digits.size();
1704 digitLimit= MIN((rcsm.sSubAddress.number_of_digits), RIL_CDMA_SMS_SUBADDRESS_MAX);
1705 for (int i = 0; i < digitLimit; i++) {
1706 rcsm.sSubAddress.digits[i] = sms.subAddress.digits[i];
1707 }
1708
1709 rcsm.uBearerDataLen = sms.bearerData.size();
1710 digitLimit= MIN((rcsm.uBearerDataLen), RIL_CDMA_SMS_BEARER_DATA_MAX);
1711 for (int i = 0; i < digitLimit; i++) {
1712 rcsm.aBearerData[i] = sms.bearerData[i];
1713 }
1714}
1715
1716Return<void> RadioImpl::sendCdmaSms(int32_t serial, const CdmaSmsMessage& sms) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001717#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001718 RLOGD("sendCdmaSms: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001719#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001720 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_CDMA_SEND_SMS);
1721 if (pRI == NULL) {
1722 return Void();
1723 }
1724
Jack Yu8e732d42017-04-14 00:08:06 -07001725 RIL_CDMA_SMS_Message rcsm = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001726 constructCdmaSms(rcsm, sms);
1727
Amit Mahajanb3a11bb2017-05-15 16:41:44 -07001728 CALL_ONREQUEST(pRI->pCI->requestNumber, &rcsm, sizeof(rcsm), pRI, mSlotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001729 return Void();
1730}
1731
1732Return<void> RadioImpl::acknowledgeLastIncomingCdmaSms(int32_t serial, const CdmaSmsAck& smsAck) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001733#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001734 RLOGD("acknowledgeLastIncomingCdmaSms: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001735#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001736 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_CDMA_SMS_ACKNOWLEDGE);
1737 if (pRI == NULL) {
1738 return Void();
1739 }
1740
Jack Yuf68e0da2017-02-07 14:53:09 -08001741 RIL_CDMA_SMS_Ack rcsa = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001742
1743 rcsa.uErrorClass = (RIL_CDMA_SMS_ErrorClass) smsAck.errorClass;
1744 rcsa.uSMSCauseCode = smsAck.smsCauseCode;
1745
Amit Mahajanb3a11bb2017-05-15 16:41:44 -07001746 CALL_ONREQUEST(pRI->pCI->requestNumber, &rcsa, sizeof(rcsa), pRI, mSlotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001747 return Void();
1748}
1749
1750Return<void> RadioImpl::getGsmBroadcastConfig(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001751#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001752 RLOGD("getGsmBroadcastConfig: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001753#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001754 dispatchVoid(serial, mSlotId, RIL_REQUEST_GSM_GET_BROADCAST_SMS_CONFIG);
1755 return Void();
1756}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001757
1758Return<void> RadioImpl::setGsmBroadcastConfig(int32_t serial,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001759 const hidl_vec<GsmBroadcastSmsConfigInfo>&
1760 configInfo) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001761#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001762 RLOGD("setGsmBroadcastConfig: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001763#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001764 RequestInfo *pRI = android::addRequestToList(serial, mSlotId,
1765 RIL_REQUEST_GSM_SET_BROADCAST_SMS_CONFIG);
1766 if (pRI == NULL) {
1767 return Void();
1768 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001769
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001770 int num = configInfo.size();
1771 RIL_GSM_BroadcastSmsConfigInfo gsmBci[num];
1772 RIL_GSM_BroadcastSmsConfigInfo *gsmBciPtrs[num];
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001773
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001774 for (int i = 0 ; i < num ; i++ ) {
1775 gsmBciPtrs[i] = &gsmBci[i];
1776 gsmBci[i].fromServiceId = configInfo[i].fromServiceId;
1777 gsmBci[i].toServiceId = configInfo[i].toServiceId;
1778 gsmBci[i].fromCodeScheme = configInfo[i].fromCodeScheme;
1779 gsmBci[i].toCodeScheme = configInfo[i].toCodeScheme;
1780 gsmBci[i].selected = BOOL_TO_INT(configInfo[i].selected);
1781 }
1782
Amit Mahajanb3a11bb2017-05-15 16:41:44 -07001783 CALL_ONREQUEST(pRI->pCI->requestNumber, gsmBciPtrs,
1784 num * sizeof(RIL_GSM_BroadcastSmsConfigInfo *), pRI, mSlotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001785 return Void();
1786}
1787
1788Return<void> RadioImpl::setGsmBroadcastActivation(int32_t serial, bool activate) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001789#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001790 RLOGD("setGsmBroadcastActivation: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001791#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001792 dispatchInts(serial, mSlotId, RIL_REQUEST_GSM_SMS_BROADCAST_ACTIVATION,
Sanket Padawe0de29d12017-02-10 13:19:47 -08001793 1, BOOL_TO_INT(!activate));
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001794 return Void();
1795}
1796
1797Return<void> RadioImpl::getCdmaBroadcastConfig(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001798#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001799 RLOGD("getCdmaBroadcastConfig: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001800#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001801 dispatchVoid(serial, mSlotId, RIL_REQUEST_CDMA_GET_BROADCAST_SMS_CONFIG);
1802 return Void();
1803}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001804
1805Return<void> RadioImpl::setCdmaBroadcastConfig(int32_t serial,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001806 const hidl_vec<CdmaBroadcastSmsConfigInfo>&
1807 configInfo) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001808#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001809 RLOGD("setCdmaBroadcastConfig: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001810#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001811 RequestInfo *pRI = android::addRequestToList(serial, mSlotId,
1812 RIL_REQUEST_CDMA_SET_BROADCAST_SMS_CONFIG);
1813 if (pRI == NULL) {
1814 return Void();
1815 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001816
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001817 int num = configInfo.size();
1818 RIL_CDMA_BroadcastSmsConfigInfo cdmaBci[num];
1819 RIL_CDMA_BroadcastSmsConfigInfo *cdmaBciPtrs[num];
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001820
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001821 for (int i = 0 ; i < num ; i++ ) {
1822 cdmaBciPtrs[i] = &cdmaBci[i];
1823 cdmaBci[i].service_category = configInfo[i].serviceCategory;
1824 cdmaBci[i].language = configInfo[i].language;
1825 cdmaBci[i].selected = BOOL_TO_INT(configInfo[i].selected);
1826 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001827
Amit Mahajanb3a11bb2017-05-15 16:41:44 -07001828 CALL_ONREQUEST(pRI->pCI->requestNumber, cdmaBciPtrs,
1829 num * sizeof(RIL_CDMA_BroadcastSmsConfigInfo *), pRI, mSlotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001830 return Void();
1831}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001832
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001833Return<void> RadioImpl::setCdmaBroadcastActivation(int32_t serial, bool activate) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001834#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001835 RLOGD("setCdmaBroadcastActivation: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001836#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001837 dispatchInts(serial, mSlotId, RIL_REQUEST_CDMA_SMS_BROADCAST_ACTIVATION,
Sanket Padawe0de29d12017-02-10 13:19:47 -08001838 1, BOOL_TO_INT(!activate));
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001839 return Void();
1840}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001841
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001842Return<void> RadioImpl::getCDMASubscription(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001843#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001844 RLOGD("getCDMASubscription: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001845#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001846 dispatchVoid(serial, mSlotId, RIL_REQUEST_CDMA_SUBSCRIPTION);
1847 return Void();
1848}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001849
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001850Return<void> RadioImpl::writeSmsToRuim(int32_t serial, const CdmaSmsWriteArgs& cdmaSms) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001851#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001852 RLOGD("writeSmsToRuim: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001853#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001854 RequestInfo *pRI = android::addRequestToList(serial, mSlotId,
1855 RIL_REQUEST_CDMA_WRITE_SMS_TO_RUIM);
1856 if (pRI == NULL) {
1857 return Void();
1858 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001859
Jack Yuf68e0da2017-02-07 14:53:09 -08001860 RIL_CDMA_SMS_WriteArgs rcsw = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001861 rcsw.status = (int) cdmaSms.status;
1862 constructCdmaSms(rcsw.message, cdmaSms.message);
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001863
Amit Mahajanb3a11bb2017-05-15 16:41:44 -07001864 CALL_ONREQUEST(pRI->pCI->requestNumber, &rcsw, sizeof(rcsw), pRI, mSlotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001865 return Void();
1866}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001867
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001868Return<void> RadioImpl::deleteSmsOnRuim(int32_t serial, int32_t index) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001869#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001870 RLOGD("deleteSmsOnRuim: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001871#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001872 dispatchInts(serial, mSlotId, RIL_REQUEST_CDMA_DELETE_SMS_ON_RUIM, 1, index);
1873 return Void();
1874}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001875
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001876Return<void> RadioImpl::getDeviceIdentity(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001877#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001878 RLOGD("getDeviceIdentity: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001879#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001880 dispatchVoid(serial, mSlotId, RIL_REQUEST_DEVICE_IDENTITY);
1881 return Void();
1882}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001883
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001884Return<void> RadioImpl::exitEmergencyCallbackMode(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001885#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001886 RLOGD("exitEmergencyCallbackMode: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001887#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001888 dispatchVoid(serial, mSlotId, RIL_REQUEST_EXIT_EMERGENCY_CALLBACK_MODE);
1889 return Void();
1890}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001891
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001892Return<void> RadioImpl::getSmscAddress(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001893#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001894 RLOGD("getSmscAddress: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001895#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001896 dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_SMSC_ADDRESS);
1897 return Void();
1898}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001899
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001900Return<void> RadioImpl::setSmscAddress(int32_t serial, const hidl_string& smsc) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001901#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001902 RLOGD("setSmscAddress: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001903#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001904 dispatchString(serial, mSlotId, RIL_REQUEST_SET_SMSC_ADDRESS,
Scott Randolphc7213312017-04-03 14:06:40 -07001905 smsc.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001906 return Void();
1907}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001908
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001909Return<void> RadioImpl::reportSmsMemoryStatus(int32_t serial, bool available) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001910#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001911 RLOGD("reportSmsMemoryStatus: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001912#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001913 dispatchInts(serial, mSlotId, RIL_REQUEST_REPORT_SMS_MEMORY_STATUS, 1,
1914 BOOL_TO_INT(available));
1915 return Void();
1916}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001917
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001918Return<void> RadioImpl::reportStkServiceIsRunning(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001919#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001920 RLOGD("reportStkServiceIsRunning: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001921#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001922 dispatchVoid(serial, mSlotId, RIL_REQUEST_REPORT_STK_SERVICE_IS_RUNNING);
1923 return Void();
1924}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001925
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001926Return<void> RadioImpl::getCdmaSubscriptionSource(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001927#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001928 RLOGD("getCdmaSubscriptionSource: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001929#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001930 dispatchVoid(serial, mSlotId, RIL_REQUEST_CDMA_GET_SUBSCRIPTION_SOURCE);
1931 return Void();
1932}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001933
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001934Return<void> RadioImpl::requestIsimAuthentication(int32_t serial, const hidl_string& challenge) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001935#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001936 RLOGD("requestIsimAuthentication: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001937#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001938 dispatchString(serial, mSlotId, RIL_REQUEST_ISIM_AUTHENTICATION,
Scott Randolphc7213312017-04-03 14:06:40 -07001939 challenge.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001940 return Void();
1941}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001942
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001943Return<void> RadioImpl::acknowledgeIncomingGsmSmsWithPdu(int32_t serial, bool success,
1944 const hidl_string& ackPdu) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001945#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001946 RLOGD("acknowledgeIncomingGsmSmsWithPdu: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001947#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001948 dispatchStrings(serial, mSlotId, RIL_REQUEST_ACKNOWLEDGE_INCOMING_GSM_SMS_WITH_PDU,
Scott Randolphc7213312017-04-03 14:06:40 -07001949 2, success ? "1" : "0", ackPdu.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001950 return Void();
1951}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001952
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001953Return<void> RadioImpl::sendEnvelopeWithStatus(int32_t serial, const hidl_string& contents) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001954#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001955 RLOGD("sendEnvelopeWithStatus: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001956#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001957 dispatchString(serial, mSlotId, RIL_REQUEST_STK_SEND_ENVELOPE_WITH_STATUS,
Scott Randolphc7213312017-04-03 14:06:40 -07001958 contents.c_str());
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001959 return Void();
1960}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001961
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001962Return<void> RadioImpl::getVoiceRadioTechnology(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001963#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001964 RLOGD("getVoiceRadioTechnology: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001965#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001966 dispatchVoid(serial, mSlotId, RIL_REQUEST_VOICE_RADIO_TECH);
1967 return Void();
1968}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001969
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001970Return<void> RadioImpl::getCellInfoList(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001971#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001972 RLOGD("getCellInfoList: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001973#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001974 dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_CELL_INFO_LIST);
1975 return Void();
1976}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001977
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001978Return<void> RadioImpl::setCellInfoListRate(int32_t serial, int32_t rate) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001979#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001980 RLOGD("setCellInfoListRate: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001981#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001982 dispatchInts(serial, mSlotId, RIL_REQUEST_SET_UNSOL_CELL_INFO_LIST_RATE, 1, rate);
1983 return Void();
1984}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001985
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001986Return<void> RadioImpl::setInitialAttachApn(int32_t serial, const DataProfileInfo& dataProfileInfo,
Jack Yuffc06452017-02-13 11:21:00 -08001987 bool modemCognitive, bool isRoaming) {
Jayachandran C572f2f42017-03-25 14:30:13 -07001988#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08001989 RLOGD("setInitialAttachApn: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07001990#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08001991 RequestInfo *pRI = android::addRequestToList(serial, mSlotId,
1992 RIL_REQUEST_SET_INITIAL_ATTACH_APN);
1993 if (pRI == NULL) {
1994 return Void();
1995 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001996
Jack Yuffc06452017-02-13 11:21:00 -08001997 if (s_vendorFunctions->version <= 14) {
1998 RIL_InitialAttachApn iaa = {};
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001999
Sanket Padawe46e9ee32017-06-20 12:40:19 -07002000 if (dataProfileInfo.apn.size() == 0) {
2001 iaa.apn = (char *) calloc(1, sizeof(char));
2002 if (iaa.apn == NULL) {
2003 RLOGE("Memory allocation failed for request %s",
2004 requestToString(pRI->pCI->requestNumber));
2005 sendErrorResponse(pRI, RIL_E_NO_MEMORY);
2006 return Void();
2007 }
2008 iaa.apn[0] = '\0';
2009 } else {
2010 if (!copyHidlStringToRil(&iaa.apn, dataProfileInfo.apn, pRI)) {
2011 return Void();
2012 }
Jack Yuffc06452017-02-13 11:21:00 -08002013 }
2014
2015 const hidl_string &protocol =
2016 (isRoaming ? dataProfileInfo.roamingProtocol : dataProfileInfo.protocol);
2017
2018 if (!copyHidlStringToRil(&iaa.protocol, protocol, pRI)) {
Jack Yu8e732d42017-04-14 00:08:06 -07002019 memsetAndFreeStrings(1, iaa.apn);
Jack Yuffc06452017-02-13 11:21:00 -08002020 return Void();
2021 }
2022 iaa.authtype = (int) dataProfileInfo.authType;
2023 if (!copyHidlStringToRil(&iaa.username, dataProfileInfo.user, pRI)) {
Jack Yu8e732d42017-04-14 00:08:06 -07002024 memsetAndFreeStrings(2, iaa.apn, iaa.protocol);
Jack Yuffc06452017-02-13 11:21:00 -08002025 return Void();
2026 }
2027 if (!copyHidlStringToRil(&iaa.password, dataProfileInfo.password, pRI)) {
Jack Yu8e732d42017-04-14 00:08:06 -07002028 memsetAndFreeStrings(3, iaa.apn, iaa.protocol, iaa.username);
Jack Yuffc06452017-02-13 11:21:00 -08002029 return Void();
2030 }
2031
Amit Mahajanb3a11bb2017-05-15 16:41:44 -07002032 CALL_ONREQUEST(RIL_REQUEST_SET_INITIAL_ATTACH_APN, &iaa, sizeof(iaa), pRI, mSlotId);
Jack Yuffc06452017-02-13 11:21:00 -08002033
2034 memsetAndFreeStrings(4, iaa.apn, iaa.protocol, iaa.username, iaa.password);
2035 } else {
2036 RIL_InitialAttachApn_v15 iaa = {};
2037
Sanket Padawe46e9ee32017-06-20 12:40:19 -07002038 if (dataProfileInfo.apn.size() == 0) {
2039 iaa.apn = (char *) calloc(1, sizeof(char));
2040 if (iaa.apn == NULL) {
2041 RLOGE("Memory allocation failed for request %s",
2042 requestToString(pRI->pCI->requestNumber));
2043 sendErrorResponse(pRI, RIL_E_NO_MEMORY);
2044 return Void();
2045 }
2046 iaa.apn[0] = '\0';
2047 } else {
2048 if (!copyHidlStringToRil(&iaa.apn, dataProfileInfo.apn, pRI)) {
2049 return Void();
2050 }
Jack Yuffc06452017-02-13 11:21:00 -08002051 }
Sanket Padawe46e9ee32017-06-20 12:40:19 -07002052
Jack Yuffc06452017-02-13 11:21:00 -08002053 if (!copyHidlStringToRil(&iaa.protocol, dataProfileInfo.protocol, pRI)) {
Jack Yu8e732d42017-04-14 00:08:06 -07002054 memsetAndFreeStrings(1, iaa.apn);
Jack Yuffc06452017-02-13 11:21:00 -08002055 return Void();
2056 }
2057 if (!copyHidlStringToRil(&iaa.roamingProtocol, dataProfileInfo.roamingProtocol, pRI)) {
Jack Yu8e732d42017-04-14 00:08:06 -07002058 memsetAndFreeStrings(2, iaa.apn, iaa.protocol);
Jack Yuffc06452017-02-13 11:21:00 -08002059 return Void();
2060 }
2061 iaa.authtype = (int) dataProfileInfo.authType;
2062 if (!copyHidlStringToRil(&iaa.username, dataProfileInfo.user, pRI)) {
Jack Yu8e732d42017-04-14 00:08:06 -07002063 memsetAndFreeStrings(3, iaa.apn, iaa.protocol, iaa.roamingProtocol);
Jack Yuffc06452017-02-13 11:21:00 -08002064 return Void();
2065 }
2066 if (!copyHidlStringToRil(&iaa.password, dataProfileInfo.password, pRI)) {
Jack Yu8e732d42017-04-14 00:08:06 -07002067 memsetAndFreeStrings(4, iaa.apn, iaa.protocol, iaa.roamingProtocol, iaa.username);
Jack Yuffc06452017-02-13 11:21:00 -08002068 return Void();
2069 }
2070 iaa.supportedTypesBitmask = dataProfileInfo.supportedApnTypesBitmap;
2071 iaa.bearerBitmask = dataProfileInfo.bearerBitmap;
2072 iaa.modemCognitive = BOOL_TO_INT(modemCognitive);
2073 iaa.mtu = dataProfileInfo.mtu;
2074
Jack Yuc13645e2017-04-13 20:55:03 -07002075 if (!convertMvnoTypeToString(dataProfileInfo.mvnoType, iaa.mvnoType)) {
Jack Yuffc06452017-02-13 11:21:00 -08002076 sendErrorResponse(pRI, RIL_E_INVALID_ARGUMENTS);
Jack Yu8e732d42017-04-14 00:08:06 -07002077 memsetAndFreeStrings(5, iaa.apn, iaa.protocol, iaa.roamingProtocol, iaa.username,
2078 iaa.password);
Jack Yuffc06452017-02-13 11:21:00 -08002079 return Void();
2080 }
2081
2082 if (!copyHidlStringToRil(&iaa.mvnoMatchData, dataProfileInfo.mvnoMatchData, pRI)) {
Jack Yu8e732d42017-04-14 00:08:06 -07002083 memsetAndFreeStrings(5, iaa.apn, iaa.protocol, iaa.roamingProtocol, iaa.username,
2084 iaa.password);
Jack Yuffc06452017-02-13 11:21:00 -08002085 return Void();
2086 }
2087
Amit Mahajanb3a11bb2017-05-15 16:41:44 -07002088 CALL_ONREQUEST(RIL_REQUEST_SET_INITIAL_ATTACH_APN, &iaa, sizeof(iaa), pRI, mSlotId);
Jack Yuffc06452017-02-13 11:21:00 -08002089
2090 memsetAndFreeStrings(6, iaa.apn, iaa.protocol, iaa.roamingProtocol, iaa.username,
2091 iaa.password, iaa.mvnoMatchData);
2092 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002093
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002094 return Void();
2095}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002096
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002097Return<void> RadioImpl::getImsRegistrationState(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002098#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002099 RLOGD("getImsRegistrationState: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002100#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002101 dispatchVoid(serial, mSlotId, RIL_REQUEST_IMS_REGISTRATION_STATE);
2102 return Void();
2103}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002104
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002105bool dispatchImsGsmSms(const ImsSmsMessage& message, RequestInfo *pRI) {
Jack Yuf68e0da2017-02-07 14:53:09 -08002106 RIL_IMS_SMS_Message rism = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002107 char **pStrings;
2108 int countStrings = 2;
2109 int dataLen = sizeof(char *) * countStrings;
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002110
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002111 rism.tech = RADIO_TECH_3GPP;
2112 rism.retry = BOOL_TO_INT(message.retry);
2113 rism.messageRef = message.messageRef;
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002114
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002115 if (message.gsmMessage.size() != 1) {
2116 RLOGE("dispatchImsGsmSms: Invalid len %s", requestToString(pRI->pCI->requestNumber));
Jack Yuffc06452017-02-13 11:21:00 -08002117 sendErrorResponse(pRI, RIL_E_INVALID_ARGUMENTS);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002118 return false;
2119 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002120
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002121 pStrings = (char **)calloc(countStrings, sizeof(char *));
2122 if (pStrings == NULL) {
2123 RLOGE("dispatchImsGsmSms: Memory allocation failed for request %s",
2124 requestToString(pRI->pCI->requestNumber));
Jack Yuffc06452017-02-13 11:21:00 -08002125 sendErrorResponse(pRI, RIL_E_NO_MEMORY);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002126 return false;
2127 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002128
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002129 if (!copyHidlStringToRil(&pStrings[0], message.gsmMessage[0].smscPdu, pRI)) {
2130#ifdef MEMSET_FREED
Jack Yub4295a42017-04-14 12:51:49 -07002131 memset(pStrings, 0, dataLen);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002132#endif
2133 free(pStrings);
2134 return false;
2135 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002136
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002137 if (!copyHidlStringToRil(&pStrings[1], message.gsmMessage[0].pdu, pRI)) {
2138 memsetAndFreeStrings(1, pStrings[0]);
2139#ifdef MEMSET_FREED
Jack Yub4295a42017-04-14 12:51:49 -07002140 memset(pStrings, 0, dataLen);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002141#endif
2142 free(pStrings);
2143 return false;
2144 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002145
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002146 rism.message.gsmMessage = pStrings;
Amit Mahajanb3a11bb2017-05-15 16:41:44 -07002147 CALL_ONREQUEST(pRI->pCI->requestNumber, &rism, sizeof(RIL_RadioTechnologyFamily) +
2148 sizeof(uint8_t) + sizeof(int32_t) + dataLen, pRI, pRI->socket_id);
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002149
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002150 for (int i = 0 ; i < countStrings ; i++) {
2151 memsetAndFreeStrings(1, pStrings[i]);
2152 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002153
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002154#ifdef MEMSET_FREED
Jack Yub4295a42017-04-14 12:51:49 -07002155 memset(pStrings, 0, dataLen);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002156#endif
2157 free(pStrings);
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002158
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002159 return true;
2160}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002161
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002162bool dispatchImsCdmaSms(const ImsSmsMessage& message, RequestInfo *pRI) {
Jack Yu8e732d42017-04-14 00:08:06 -07002163 RIL_IMS_SMS_Message rism = {};
2164 RIL_CDMA_SMS_Message rcsm = {};
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002165
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002166 if (message.cdmaMessage.size() != 1) {
2167 RLOGE("dispatchImsCdmaSms: Invalid len %s", requestToString(pRI->pCI->requestNumber));
Jack Yuffc06452017-02-13 11:21:00 -08002168 sendErrorResponse(pRI, RIL_E_INVALID_ARGUMENTS);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002169 return false;
2170 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002171
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002172 rism.tech = RADIO_TECH_3GPP2;
2173 rism.retry = BOOL_TO_INT(message.retry);
2174 rism.messageRef = message.messageRef;
2175 rism.message.cdmaMessage = &rcsm;
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002176
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002177 constructCdmaSms(rcsm, message.cdmaMessage[0]);
2178
Amit Mahajanb3a11bb2017-05-15 16:41:44 -07002179 CALL_ONREQUEST(pRI->pCI->requestNumber, &rism, sizeof(RIL_RadioTechnologyFamily) +
2180 sizeof(uint8_t) + sizeof(int32_t) + sizeof(rcsm), pRI, pRI->socket_id);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002181
2182 return true;
2183}
2184
2185Return<void> RadioImpl::sendImsSms(int32_t serial, const ImsSmsMessage& message) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002186#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002187 RLOGD("sendImsSms: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002188#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002189 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_IMS_SEND_SMS);
2190 if (pRI == NULL) {
2191 return Void();
2192 }
2193
2194 RIL_RadioTechnologyFamily format = (RIL_RadioTechnologyFamily) message.tech;
2195
2196 if (RADIO_TECH_3GPP == format) {
2197 dispatchImsGsmSms(message, pRI);
2198 } else if (RADIO_TECH_3GPP2 == format) {
2199 dispatchImsCdmaSms(message, pRI);
2200 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08002201 RLOGE("sendImsSms: Invalid radio tech %s",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002202 requestToString(pRI->pCI->requestNumber));
Jack Yuffc06452017-02-13 11:21:00 -08002203 sendErrorResponse(pRI, RIL_E_INVALID_ARGUMENTS);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002204 }
2205 return Void();
2206}
2207
2208Return<void> RadioImpl::iccTransmitApduBasicChannel(int32_t serial, const SimApdu& message) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002209#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002210 RLOGD("iccTransmitApduBasicChannel: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002211#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002212 dispatchIccApdu(serial, mSlotId, RIL_REQUEST_SIM_TRANSMIT_APDU_BASIC, message);
2213 return Void();
2214}
2215
Wileen Chiu410b7562015-11-23 14:25:22 -08002216Return<void> RadioImpl::iccOpenLogicalChannel(int32_t serial, const hidl_string& aid, int32_t p2) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002217#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002218 RLOGD("iccOpenLogicalChannel: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002219#endif
Wileen Chiu410b7562015-11-23 14:25:22 -08002220 if (s_vendorFunctions->version < 15) {
2221 dispatchString(serial, mSlotId, RIL_REQUEST_SIM_OPEN_CHANNEL, aid.c_str());
2222 } else {
2223 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_SIM_OPEN_CHANNEL);
2224 if (pRI == NULL) {
2225 return Void();
2226 }
2227
Jack Yu8e732d42017-04-14 00:08:06 -07002228 RIL_OpenChannelParams params = {};
Wileen Chiu410b7562015-11-23 14:25:22 -08002229
2230 params.p2 = p2;
2231
2232 if (!copyHidlStringToRil(&params.aidPtr, aid, pRI)) {
2233 return Void();
2234 }
2235
Amit Mahajanb3a11bb2017-05-15 16:41:44 -07002236 CALL_ONREQUEST(pRI->pCI->requestNumber, &params, sizeof(params), pRI, mSlotId);
Wileen Chiu410b7562015-11-23 14:25:22 -08002237
2238 memsetAndFreeStrings(1, params.aidPtr);
2239 }
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002240 return Void();
2241}
2242
2243Return<void> RadioImpl::iccCloseLogicalChannel(int32_t serial, int32_t channelId) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002244#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002245 RLOGD("iccCloseLogicalChannel: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002246#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002247 dispatchInts(serial, mSlotId, RIL_REQUEST_SIM_CLOSE_CHANNEL, 1, channelId);
2248 return Void();
2249}
2250
2251Return<void> RadioImpl::iccTransmitApduLogicalChannel(int32_t serial, const SimApdu& message) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002252#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002253 RLOGD("iccTransmitApduLogicalChannel: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002254#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002255 dispatchIccApdu(serial, mSlotId, RIL_REQUEST_SIM_TRANSMIT_APDU_CHANNEL, message);
2256 return Void();
2257}
2258
2259Return<void> RadioImpl::nvReadItem(int32_t serial, NvItem itemId) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002260#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002261 RLOGD("nvReadItem: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002262#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002263 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_NV_READ_ITEM);
2264 if (pRI == NULL) {
2265 return Void();
2266 }
2267
Jack Yu8e732d42017-04-14 00:08:06 -07002268 RIL_NV_ReadItem nvri = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002269 nvri.itemID = (RIL_NV_Item) itemId;
2270
Amit Mahajanb3a11bb2017-05-15 16:41:44 -07002271 CALL_ONREQUEST(pRI->pCI->requestNumber, &nvri, sizeof(nvri), pRI, mSlotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002272 return Void();
2273}
2274
2275Return<void> RadioImpl::nvWriteItem(int32_t serial, const NvWriteItem& item) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002276#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002277 RLOGD("nvWriteItem: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002278#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002279 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_NV_WRITE_ITEM);
2280 if (pRI == NULL) {
2281 return Void();
2282 }
2283
Jack Yu8e732d42017-04-14 00:08:06 -07002284 RIL_NV_WriteItem nvwi = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002285
2286 nvwi.itemID = (RIL_NV_Item) item.itemId;
2287
2288 if (!copyHidlStringToRil(&nvwi.value, item.value, pRI)) {
2289 return Void();
2290 }
2291
Amit Mahajanb3a11bb2017-05-15 16:41:44 -07002292 CALL_ONREQUEST(pRI->pCI->requestNumber, &nvwi, sizeof(nvwi), pRI, mSlotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002293
2294 memsetAndFreeStrings(1, nvwi.value);
2295 return Void();
2296}
2297
2298Return<void> RadioImpl::nvWriteCdmaPrl(int32_t serial, const hidl_vec<uint8_t>& prl) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002299#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002300 RLOGD("nvWriteCdmaPrl: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002301#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002302 dispatchRaw(serial, mSlotId, RIL_REQUEST_NV_WRITE_CDMA_PRL, prl);
2303 return Void();
2304}
2305
2306Return<void> RadioImpl::nvResetConfig(int32_t serial, ResetNvType resetType) {
Jayachandran C32763f02017-04-30 10:21:14 -07002307 int rilResetType = -1;
Jayachandran C572f2f42017-03-25 14:30:13 -07002308#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002309 RLOGD("nvResetConfig: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002310#endif
Jayachandran C32763f02017-04-30 10:21:14 -07002311 /* Convert ResetNvType to RIL.h values
2312 * RIL_REQUEST_NV_RESET_CONFIG
2313 * 1 - reload all NV items
2314 * 2 - erase NV reset (SCRTN)
2315 * 3 - factory reset (RTN)
2316 */
2317 switch(resetType) {
2318 case ResetNvType::RELOAD:
2319 rilResetType = 1;
2320 break;
2321 case ResetNvType::ERASE:
2322 rilResetType = 2;
2323 break;
2324 case ResetNvType::FACTORY_RESET:
2325 rilResetType = 3;
2326 break;
2327 }
2328 dispatchInts(serial, mSlotId, RIL_REQUEST_NV_RESET_CONFIG, 1, rilResetType);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002329 return Void();
2330}
2331
2332Return<void> RadioImpl::setUiccSubscription(int32_t serial, const SelectUiccSub& uiccSub) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002333#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002334 RLOGD("setUiccSubscription: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002335#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002336 RequestInfo *pRI = android::addRequestToList(serial, mSlotId,
2337 RIL_REQUEST_SET_UICC_SUBSCRIPTION);
2338 if (pRI == NULL) {
2339 return Void();
2340 }
2341
Jack Yuf68e0da2017-02-07 14:53:09 -08002342 RIL_SelectUiccSub rilUiccSub = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002343
2344 rilUiccSub.slot = uiccSub.slot;
2345 rilUiccSub.app_index = uiccSub.appIndex;
2346 rilUiccSub.sub_type = (RIL_SubscriptionType) uiccSub.subType;
2347 rilUiccSub.act_status = (RIL_UiccSubActStatus) uiccSub.actStatus;
2348
Amit Mahajanb3a11bb2017-05-15 16:41:44 -07002349 CALL_ONREQUEST(pRI->pCI->requestNumber, &rilUiccSub, sizeof(rilUiccSub), pRI, mSlotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002350 return Void();
2351}
2352
2353Return<void> RadioImpl::setDataAllowed(int32_t serial, bool allow) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002354#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002355 RLOGD("setDataAllowed: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002356#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002357 dispatchInts(serial, mSlotId, RIL_REQUEST_ALLOW_DATA, 1, BOOL_TO_INT(allow));
2358 return Void();
2359}
2360
2361Return<void> RadioImpl::getHardwareConfig(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002362#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002363 RLOGD("getHardwareConfig: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002364#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002365 dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_HARDWARE_CONFIG);
2366 return Void();
2367}
2368
2369Return<void> RadioImpl::requestIccSimAuthentication(int32_t serial, int32_t authContext,
2370 const hidl_string& authData, const hidl_string& aid) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002371#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002372 RLOGD("requestIccSimAuthentication: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002373#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002374 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_SIM_AUTHENTICATION);
2375 if (pRI == NULL) {
2376 return Void();
2377 }
2378
Jack Yu8e732d42017-04-14 00:08:06 -07002379 RIL_SimAuthentication pf = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002380
2381 pf.authContext = authContext;
2382
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002383 if (!copyHidlStringToRil(&pf.authData, authData, pRI)) {
2384 return Void();
2385 }
2386
2387 if (!copyHidlStringToRil(&pf.aid, aid, pRI)) {
2388 memsetAndFreeStrings(1, pf.authData);
2389 return Void();
2390 }
2391
Amit Mahajanb3a11bb2017-05-15 16:41:44 -07002392 CALL_ONREQUEST(pRI->pCI->requestNumber, &pf, sizeof(pf), pRI, mSlotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002393
2394 memsetAndFreeStrings(2, pf.authData, pf.aid);
2395 return Void();
2396}
2397
2398/**
Jack Yuffc06452017-02-13 11:21:00 -08002399 * @param numProfiles number of data profile
2400 * @param dataProfiles the pointer to the actual data profiles. The acceptable type is
2401 RIL_DataProfileInfo or RIL_DataProfileInfo_v15.
2402 * @param dataProfilePtrs the pointer to the pointers that point to each data profile structure
2403 * @param numfields number of string-type member in the data profile structure
2404 * @param ... the variadic parameters are pointers to each string-type member
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002405 **/
Jack Yuffc06452017-02-13 11:21:00 -08002406template <typename T>
2407void freeSetDataProfileData(int numProfiles, T *dataProfiles, T **dataProfilePtrs,
2408 int numfields, ...) {
2409 va_list args;
2410 va_start(args, numfields);
2411
2412 // Iterate through each string-type field that need to be free.
2413 for (int i = 0; i < numfields; i++) {
2414 // Iterate through each data profile and free that specific string-type field.
2415 // The type 'char *T::*' is a type of pointer to a 'char *' member inside T structure.
2416 char *T::*ptr = va_arg(args, char *T::*);
2417 for (int j = 0; j < numProfiles; j++) {
2418 memsetAndFreeStrings(1, dataProfiles[j].*ptr);
2419 }
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002420 }
2421
Jack Yuffc06452017-02-13 11:21:00 -08002422 va_end(args);
2423
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002424#ifdef MEMSET_FREED
Jack Yuffc06452017-02-13 11:21:00 -08002425 memset(dataProfiles, 0, numProfiles * sizeof(T));
2426 memset(dataProfilePtrs, 0, numProfiles * sizeof(T *));
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002427#endif
2428 free(dataProfiles);
2429 free(dataProfilePtrs);
2430}
2431
Jack Yuffc06452017-02-13 11:21:00 -08002432Return<void> RadioImpl::setDataProfile(int32_t serial, const hidl_vec<DataProfileInfo>& profiles,
2433 bool isRoaming) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002434#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002435 RLOGD("setDataProfile: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002436#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002437 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_SET_DATA_PROFILE);
2438 if (pRI == NULL) {
2439 return Void();
2440 }
2441
Jack Yuffc06452017-02-13 11:21:00 -08002442 size_t num = profiles.size();
2443 bool success = false;
2444
2445 if (s_vendorFunctions->version <= 14) {
2446
2447 RIL_DataProfileInfo *dataProfiles =
2448 (RIL_DataProfileInfo *) calloc(num, sizeof(RIL_DataProfileInfo));
2449
2450 if (dataProfiles == NULL) {
2451 RLOGE("Memory allocation failed for request %s",
2452 requestToString(pRI->pCI->requestNumber));
2453 sendErrorResponse(pRI, RIL_E_NO_MEMORY);
2454 return Void();
2455 }
2456
2457 RIL_DataProfileInfo **dataProfilePtrs =
2458 (RIL_DataProfileInfo **) calloc(num, sizeof(RIL_DataProfileInfo *));
2459 if (dataProfilePtrs == NULL) {
2460 RLOGE("Memory allocation failed for request %s",
2461 requestToString(pRI->pCI->requestNumber));
2462 free(dataProfiles);
2463 sendErrorResponse(pRI, RIL_E_NO_MEMORY);
2464 return Void();
2465 }
2466
2467 for (size_t i = 0; i < num; i++) {
2468 dataProfilePtrs[i] = &dataProfiles[i];
2469
2470 success = copyHidlStringToRil(&dataProfiles[i].apn, profiles[i].apn, pRI);
2471
2472 const hidl_string &protocol =
2473 (isRoaming ? profiles[i].roamingProtocol : profiles[i].protocol);
2474
2475 if (success && !copyHidlStringToRil(&dataProfiles[i].protocol, protocol, pRI)) {
2476 success = false;
2477 }
2478
2479 if (success && !copyHidlStringToRil(&dataProfiles[i].user, profiles[i].user, pRI)) {
2480 success = false;
2481 }
2482 if (success && !copyHidlStringToRil(&dataProfiles[i].password, profiles[i].password,
2483 pRI)) {
2484 success = false;
2485 }
2486
2487 if (!success) {
2488 freeSetDataProfileData(num, dataProfiles, dataProfilePtrs, 4,
2489 &RIL_DataProfileInfo::apn, &RIL_DataProfileInfo::protocol,
2490 &RIL_DataProfileInfo::user, &RIL_DataProfileInfo::password);
2491 return Void();
2492 }
2493
2494 dataProfiles[i].profileId = (RIL_DataProfile) profiles[i].profileId;
2495 dataProfiles[i].authType = (int) profiles[i].authType;
2496 dataProfiles[i].type = (int) profiles[i].type;
2497 dataProfiles[i].maxConnsTime = profiles[i].maxConnsTime;
2498 dataProfiles[i].maxConns = profiles[i].maxConns;
2499 dataProfiles[i].waitTime = profiles[i].waitTime;
2500 dataProfiles[i].enabled = BOOL_TO_INT(profiles[i].enabled);
2501 }
2502
Amit Mahajanb3a11bb2017-05-15 16:41:44 -07002503 CALL_ONREQUEST(RIL_REQUEST_SET_DATA_PROFILE, dataProfilePtrs,
2504 num * sizeof(RIL_DataProfileInfo *), pRI, mSlotId);
Jack Yuffc06452017-02-13 11:21:00 -08002505
2506 freeSetDataProfileData(num, dataProfiles, dataProfilePtrs, 4,
2507 &RIL_DataProfileInfo::apn, &RIL_DataProfileInfo::protocol,
2508 &RIL_DataProfileInfo::user, &RIL_DataProfileInfo::password);
2509 } else {
2510 RIL_DataProfileInfo_v15 *dataProfiles =
2511 (RIL_DataProfileInfo_v15 *) calloc(num, sizeof(RIL_DataProfileInfo_v15));
2512
2513 if (dataProfiles == NULL) {
2514 RLOGE("Memory allocation failed for request %s",
2515 requestToString(pRI->pCI->requestNumber));
2516 sendErrorResponse(pRI, RIL_E_NO_MEMORY);
2517 return Void();
2518 }
2519
2520 RIL_DataProfileInfo_v15 **dataProfilePtrs =
2521 (RIL_DataProfileInfo_v15 **) calloc(num, sizeof(RIL_DataProfileInfo_v15 *));
2522 if (dataProfilePtrs == NULL) {
2523 RLOGE("Memory allocation failed for request %s",
2524 requestToString(pRI->pCI->requestNumber));
2525 free(dataProfiles);
2526 sendErrorResponse(pRI, RIL_E_NO_MEMORY);
2527 return Void();
2528 }
2529
2530 for (size_t i = 0; i < num; i++) {
2531 dataProfilePtrs[i] = &dataProfiles[i];
2532
2533 success = copyHidlStringToRil(&dataProfiles[i].apn, profiles[i].apn, pRI);
2534 if (success && !copyHidlStringToRil(&dataProfiles[i].protocol, profiles[i].protocol,
2535 pRI)) {
2536 success = false;
2537 }
2538 if (success && !copyHidlStringToRil(&dataProfiles[i].roamingProtocol,
2539 profiles[i].roamingProtocol, pRI)) {
2540 success = false;
2541 }
2542 if (success && !copyHidlStringToRil(&dataProfiles[i].user, profiles[i].user, pRI)) {
2543 success = false;
2544 }
2545 if (success && !copyHidlStringToRil(&dataProfiles[i].password, profiles[i].password,
2546 pRI)) {
2547 success = false;
2548 }
2549
2550 if (success && !copyHidlStringToRil(&dataProfiles[i].mvnoMatchData,
2551 profiles[i].mvnoMatchData, pRI)) {
2552 success = false;
2553 }
2554
Jack Yuc13645e2017-04-13 20:55:03 -07002555 if (success && !convertMvnoTypeToString(profiles[i].mvnoType,
2556 dataProfiles[i].mvnoType)) {
2557 sendErrorResponse(pRI, RIL_E_INVALID_ARGUMENTS);
2558 success = false;
Jack Yuffc06452017-02-13 11:21:00 -08002559 }
2560
2561 if (!success) {
2562 freeSetDataProfileData(num, dataProfiles, dataProfilePtrs, 6,
2563 &RIL_DataProfileInfo_v15::apn, &RIL_DataProfileInfo_v15::protocol,
2564 &RIL_DataProfileInfo_v15::roamingProtocol, &RIL_DataProfileInfo_v15::user,
2565 &RIL_DataProfileInfo_v15::password, &RIL_DataProfileInfo_v15::mvnoMatchData);
2566 return Void();
2567 }
2568
2569 dataProfiles[i].profileId = (RIL_DataProfile) profiles[i].profileId;
2570 dataProfiles[i].authType = (int) profiles[i].authType;
2571 dataProfiles[i].type = (int) profiles[i].type;
2572 dataProfiles[i].maxConnsTime = profiles[i].maxConnsTime;
2573 dataProfiles[i].maxConns = profiles[i].maxConns;
2574 dataProfiles[i].waitTime = profiles[i].waitTime;
2575 dataProfiles[i].enabled = BOOL_TO_INT(profiles[i].enabled);
2576 dataProfiles[i].supportedTypesBitmask = profiles[i].supportedApnTypesBitmap;
2577 dataProfiles[i].bearerBitmask = profiles[i].bearerBitmap;
2578 dataProfiles[i].mtu = profiles[i].mtu;
2579 }
2580
Amit Mahajanb3a11bb2017-05-15 16:41:44 -07002581 CALL_ONREQUEST(RIL_REQUEST_SET_DATA_PROFILE, dataProfilePtrs,
2582 num * sizeof(RIL_DataProfileInfo_v15 *), pRI, mSlotId);
Jack Yuffc06452017-02-13 11:21:00 -08002583
2584 freeSetDataProfileData(num, dataProfiles, dataProfilePtrs, 6,
2585 &RIL_DataProfileInfo_v15::apn, &RIL_DataProfileInfo_v15::protocol,
2586 &RIL_DataProfileInfo_v15::roamingProtocol, &RIL_DataProfileInfo_v15::user,
2587 &RIL_DataProfileInfo_v15::password, &RIL_DataProfileInfo_v15::mvnoMatchData);
2588 }
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002589
2590 return Void();
2591}
2592
2593Return<void> RadioImpl::requestShutdown(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002594#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002595 RLOGD("requestShutdown: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002596#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002597 dispatchVoid(serial, mSlotId, RIL_REQUEST_SHUTDOWN);
2598 return Void();
2599}
2600
2601Return<void> RadioImpl::getRadioCapability(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002602#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002603 RLOGD("getRadioCapability: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002604#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002605 dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_RADIO_CAPABILITY);
2606 return Void();
2607}
2608
2609Return<void> RadioImpl::setRadioCapability(int32_t serial, const RadioCapability& rc) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002610#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002611 RLOGD("setRadioCapability: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002612#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002613 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_SET_RADIO_CAPABILITY);
2614 if (pRI == NULL) {
2615 return Void();
2616 }
2617
Jack Yu8e732d42017-04-14 00:08:06 -07002618 RIL_RadioCapability rilRc = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002619
2620 // TODO : set rilRc.version using HIDL version ?
2621 rilRc.session = rc.session;
2622 rilRc.phase = (int) rc.phase;
2623 rilRc.rat = (int) rc.raf;
2624 rilRc.status = (int) rc.status;
Scott Randolphc7213312017-04-03 14:06:40 -07002625 strncpy(rilRc.logicalModemUuid, rc.logicalModemUuid.c_str(), MAX_UUID_LENGTH);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002626
Amit Mahajanb3a11bb2017-05-15 16:41:44 -07002627 CALL_ONREQUEST(pRI->pCI->requestNumber, &rilRc, sizeof(rilRc), pRI, mSlotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002628
2629 return Void();
2630}
2631
2632Return<void> RadioImpl::startLceService(int32_t serial, int32_t reportInterval, bool pullMode) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002633#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002634 RLOGD("startLceService: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002635#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002636 dispatchInts(serial, mSlotId, RIL_REQUEST_START_LCE, 2, reportInterval,
2637 BOOL_TO_INT(pullMode));
2638 return Void();
2639}
2640
2641Return<void> RadioImpl::stopLceService(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002642#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002643 RLOGD("stopLceService: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002644#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002645 dispatchVoid(serial, mSlotId, RIL_REQUEST_STOP_LCE);
2646 return Void();
2647}
2648
2649Return<void> RadioImpl::pullLceData(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002650#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002651 RLOGD("pullLceData: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002652#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002653 dispatchVoid(serial, mSlotId, RIL_REQUEST_PULL_LCEDATA);
2654 return Void();
2655}
2656
2657Return<void> RadioImpl::getModemActivityInfo(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002658#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002659 RLOGD("getModemActivityInfo: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002660#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002661 dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_ACTIVITY_INFO);
2662 return Void();
2663}
2664
2665Return<void> RadioImpl::setAllowedCarriers(int32_t serial, bool allAllowed,
2666 const CarrierRestrictions& carriers) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002667#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002668 RLOGD("setAllowedCarriers: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002669#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002670 RequestInfo *pRI = android::addRequestToList(serial, mSlotId,
2671 RIL_REQUEST_SET_CARRIER_RESTRICTIONS);
2672 if (pRI == NULL) {
2673 return Void();
2674 }
2675
Jack Yuf68e0da2017-02-07 14:53:09 -08002676 RIL_CarrierRestrictions cr = {};
Jack Yu11ab4042017-02-21 17:08:01 -08002677 RIL_Carrier *allowedCarriers = NULL;
2678 RIL_Carrier *excludedCarriers = NULL;
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002679
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002680 cr.len_allowed_carriers = carriers.allowedCarriers.size();
2681 allowedCarriers = (RIL_Carrier *)calloc(cr.len_allowed_carriers, sizeof(RIL_Carrier));
2682 if (allowedCarriers == NULL) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08002683 RLOGE("setAllowedCarriers: Memory allocation failed for request %s",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002684 requestToString(pRI->pCI->requestNumber));
Jack Yuffc06452017-02-13 11:21:00 -08002685 sendErrorResponse(pRI, RIL_E_NO_MEMORY);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002686 return Void();
2687 }
2688 cr.allowed_carriers = allowedCarriers;
2689
2690 cr.len_excluded_carriers = carriers.excludedCarriers.size();
2691 excludedCarriers = (RIL_Carrier *)calloc(cr.len_excluded_carriers, sizeof(RIL_Carrier));
2692 if (excludedCarriers == NULL) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08002693 RLOGE("setAllowedCarriers: Memory allocation failed for request %s",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002694 requestToString(pRI->pCI->requestNumber));
Jack Yuffc06452017-02-13 11:21:00 -08002695 sendErrorResponse(pRI, RIL_E_NO_MEMORY);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002696#ifdef MEMSET_FREED
2697 memset(allowedCarriers, 0, cr.len_allowed_carriers * sizeof(RIL_Carrier));
2698#endif
2699 free(allowedCarriers);
2700 return Void();
2701 }
2702 cr.excluded_carriers = excludedCarriers;
2703
2704 for (int i = 0; i < cr.len_allowed_carriers; i++) {
Scott Randolphc7213312017-04-03 14:06:40 -07002705 allowedCarriers[i].mcc = carriers.allowedCarriers[i].mcc.c_str();
2706 allowedCarriers[i].mnc = carriers.allowedCarriers[i].mnc.c_str();
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002707 allowedCarriers[i].match_type = (RIL_CarrierMatchType) carriers.allowedCarriers[i].matchType;
Scott Randolphc7213312017-04-03 14:06:40 -07002708 allowedCarriers[i].match_data = carriers.allowedCarriers[i].matchData.c_str();
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002709 }
2710
Amit Mahajan3f510f62017-03-01 10:26:58 -08002711 for (int i = 0; i < cr.len_excluded_carriers; i++) {
Scott Randolphc7213312017-04-03 14:06:40 -07002712 excludedCarriers[i].mcc = carriers.excludedCarriers[i].mcc.c_str();
2713 excludedCarriers[i].mnc = carriers.excludedCarriers[i].mnc.c_str();
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002714 excludedCarriers[i].match_type =
2715 (RIL_CarrierMatchType) carriers.excludedCarriers[i].matchType;
Scott Randolphc7213312017-04-03 14:06:40 -07002716 excludedCarriers[i].match_data = carriers.excludedCarriers[i].matchData.c_str();
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002717 }
2718
Amit Mahajanb3a11bb2017-05-15 16:41:44 -07002719 CALL_ONREQUEST(pRI->pCI->requestNumber, &cr, sizeof(RIL_CarrierRestrictions), pRI, mSlotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002720
2721#ifdef MEMSET_FREED
2722 memset(allowedCarriers, 0, cr.len_allowed_carriers * sizeof(RIL_Carrier));
2723 memset(excludedCarriers, 0, cr.len_excluded_carriers * sizeof(RIL_Carrier));
2724#endif
2725 free(allowedCarriers);
2726 free(excludedCarriers);
2727 return Void();
2728}
2729
2730Return<void> RadioImpl::getAllowedCarriers(int32_t serial) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002731#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002732 RLOGD("getAllowedCarriers: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002733#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002734 dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_CARRIER_RESTRICTIONS);
2735 return Void();
2736}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002737
Jack Yu11ab4042017-02-21 17:08:01 -08002738Return<void> RadioImpl::sendDeviceState(int32_t serial, DeviceStateType deviceStateType,
2739 bool state) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002740#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002741 RLOGD("sendDeviceState: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002742#endif
Jack Yu11ab4042017-02-21 17:08:01 -08002743 if (s_vendorFunctions->version < 15) {
2744 if (deviceStateType == DeviceStateType::LOW_DATA_EXPECTED) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08002745 RLOGD("sendDeviceState: calling screen state %d", BOOL_TO_INT(!state));
Jack Yu11ab4042017-02-21 17:08:01 -08002746 dispatchInts(serial, mSlotId, RIL_REQUEST_SCREEN_STATE, 1, BOOL_TO_INT(!state));
2747 } else {
2748 RequestInfo *pRI = android::addRequestToList(serial, mSlotId,
2749 RIL_REQUEST_SEND_DEVICE_STATE);
2750 sendErrorResponse(pRI, RIL_E_REQUEST_NOT_SUPPORTED);
2751 }
2752 return Void();
2753 }
2754 dispatchInts(serial, mSlotId, RIL_REQUEST_SEND_DEVICE_STATE, 2, (int) deviceStateType,
2755 BOOL_TO_INT(state));
2756 return Void();
2757}
2758
2759Return<void> RadioImpl::setIndicationFilter(int32_t serial, int32_t indicationFilter) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002760#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002761 RLOGD("setIndicationFilter: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002762#endif
Jack Yu11ab4042017-02-21 17:08:01 -08002763 if (s_vendorFunctions->version < 15) {
2764 RequestInfo *pRI = android::addRequestToList(serial, mSlotId,
2765 RIL_REQUEST_SET_UNSOLICITED_RESPONSE_FILTER);
2766 sendErrorResponse(pRI, RIL_E_REQUEST_NOT_SUPPORTED);
2767 return Void();
2768 }
2769 dispatchInts(serial, mSlotId, RIL_REQUEST_SET_UNSOLICITED_RESPONSE_FILTER, 1, indicationFilter);
2770 return Void();
2771}
2772
Wileen Chiu718c0bf2017-01-04 11:37:19 -08002773Return<void> RadioImpl::setSimCardPower(int32_t serial, bool powerUp) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002774#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002775 RLOGD("setSimCardPower: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002776#endif
Wileen Chiu718c0bf2017-01-04 11:37:19 -08002777 dispatchInts(serial, mSlotId, RIL_REQUEST_SET_SIM_CARD_POWER, 1, BOOL_TO_INT(powerUp));
2778 return Void();
2779}
2780
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07002781Return<void> RadioImpl::setSimCardPower_1_1(int32_t serial, const V1_1::CardPowerState state) {
Grace Chen08eb6542017-03-23 18:39:48 -07002782#if VDBG
2783 RLOGD("setSimCardPower_1_1: serial %d state %d", serial, state);
2784#endif
2785 dispatchInts(serial, mSlotId, RIL_REQUEST_SET_SIM_CARD_POWER, 1, state);
2786 return Void();
2787}
2788
Sanket Padawef220dc52017-01-02 23:46:00 -08002789Return<void> RadioImpl::responseAcknowledgement() {
2790 android::releaseWakeLock();
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002791 return Void();
Sanket Padawef220dc52017-01-02 23:46:00 -08002792}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002793
Amit Mahajan439da362017-02-13 17:43:04 -08002794Return<void> OemHookImpl::setResponseFunctions(
2795 const ::android::sp<IOemHookResponse>& oemHookResponseParam,
2796 const ::android::sp<IOemHookIndication>& oemHookIndicationParam) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002797#if VDBG
Amit Mahajan439da362017-02-13 17:43:04 -08002798 RLOGD("OemHookImpl::setResponseFunctions");
Jayachandran C572f2f42017-03-25 14:30:13 -07002799#endif
Amit Mahajan439da362017-02-13 17:43:04 -08002800
2801 pthread_rwlock_t *radioServiceRwlockPtr = radio::getRadioServiceRwlock(mSlotId);
2802 int ret = pthread_rwlock_wrlock(radioServiceRwlockPtr);
2803 assert(ret == 0);
2804
2805 mOemHookResponse = oemHookResponseParam;
2806 mOemHookIndication = oemHookIndicationParam;
Amit Mahajand423d192017-03-16 17:04:01 -07002807 mCounterOemHook[mSlotId]++;
Amit Mahajan439da362017-02-13 17:43:04 -08002808
2809 ret = pthread_rwlock_unlock(radioServiceRwlockPtr);
2810 assert(ret == 0);
2811
2812 return Void();
2813}
2814
2815Return<void> OemHookImpl::sendRequestRaw(int32_t serial, const hidl_vec<uint8_t>& data) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002816#if VDBG
Amit Mahajan439da362017-02-13 17:43:04 -08002817 RLOGD("OemHookImpl::sendRequestRaw: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002818#endif
Amit Mahajan439da362017-02-13 17:43:04 -08002819 dispatchRaw(serial, mSlotId, RIL_REQUEST_OEM_HOOK_RAW, data);
2820 return Void();
2821}
2822
2823Return<void> OemHookImpl::sendRequestStrings(int32_t serial,
2824 const hidl_vec<hidl_string>& data) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002825#if VDBG
Amit Mahajan439da362017-02-13 17:43:04 -08002826 RLOGD("OemHookImpl::sendRequestStrings: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002827#endif
Amit Mahajan439da362017-02-13 17:43:04 -08002828 dispatchStrings(serial, mSlotId, RIL_REQUEST_OEM_HOOK_STRINGS, data);
2829 return Void();
2830}
2831
pkanwardb8e0942017-03-17 12:49:34 -07002832Return<void> RadioImpl::setCarrierInfoForImsiEncryption(int32_t serial,
2833 const ::android::hardware::hidl_vec<uint8_t>& carrierKey,
2834 const hidl_string& keyIdentifier) {
2835 RLOGD("setCarrierInfoForImsiEncryption: serial %d", serial);
2836 dispatchRaw(serial, mSlotId, RIL_REQUEST_SET_CARRIER_INFO_IMSI_ENCRYPTION, carrierKey);
2837 return Void();
2838}
2839
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002840/***************************************************************************************************
2841 * RESPONSE FUNCTIONS
2842 * Functions above are used for requests going from framework to vendor code. The ones below are
2843 * responses for those requests coming back from the vendor code.
2844 **************************************************************************************************/
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002845
Sanket Padawef220dc52017-01-02 23:46:00 -08002846void radio::acknowledgeRequest(int slotId, int serial) {
2847 if (radioService[slotId]->mRadioResponse != NULL) {
Amit Mahajan17249842017-01-19 15:05:45 -08002848 Return<void> retStatus = radioService[slotId]->mRadioResponse->acknowledgeRequest(serial);
2849 radioService[slotId]->checkReturnStatus(retStatus);
Sanket Padawef220dc52017-01-02 23:46:00 -08002850 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08002851 RLOGE("acknowledgeRequest: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawef220dc52017-01-02 23:46:00 -08002852 }
2853}
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002854
Sanket Padawef220dc52017-01-02 23:46:00 -08002855void populateResponseInfo(RadioResponseInfo& responseInfo, int serial, int responseType,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002856 RIL_Errno e) {
Sanket Padawef220dc52017-01-02 23:46:00 -08002857 responseInfo.serial = serial;
2858 switch (responseType) {
2859 case RESPONSE_SOLICITED:
2860 responseInfo.type = RadioResponseType::SOLICITED;
2861 break;
2862 case RESPONSE_SOLICITED_ACK_EXP:
2863 responseInfo.type = RadioResponseType::SOLICITED_ACK_EXP;
2864 break;
2865 }
2866 responseInfo.error = (RadioError) e;
2867}
2868
Naveen Kalla346bbc02017-03-16 12:55:55 -07002869int responseIntOrEmpty(RadioResponseInfo& responseInfo, int serial, int responseType, RIL_Errno e,
2870 void *response, size_t responseLen) {
2871 populateResponseInfo(responseInfo, serial, responseType, e);
2872 int ret = -1;
2873
2874 if (response == NULL && responseLen == 0) {
2875 // Earlier RILs did not send a response for some cases although the interface
2876 // expected an integer as response. Do not return error if response is empty. Instead
2877 // Return -1 in those cases to maintain backward compatibility.
2878 } else if (response == NULL || responseLen != sizeof(int)) {
2879 RLOGE("responseIntOrEmpty: Invalid response");
2880 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
2881 } else {
2882 int *p_int = (int *) response;
2883 ret = p_int[0];
2884 }
2885 return ret;
2886}
2887
Sanket Padawef220dc52017-01-02 23:46:00 -08002888int responseInt(RadioResponseInfo& responseInfo, int serial, int responseType, RIL_Errno e,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002889 void *response, size_t responseLen) {
Sanket Padawef220dc52017-01-02 23:46:00 -08002890 populateResponseInfo(responseInfo, serial, responseType, e);
2891 int ret = -1;
2892
2893 if (response == NULL || responseLen != sizeof(int)) {
2894 RLOGE("responseInt: Invalid response");
2895 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
2896 } else {
2897 int *p_int = (int *) response;
2898 ret = p_int[0];
2899 }
2900 return ret;
2901}
2902
Amit Mahajan759786a2017-03-03 17:35:47 -08002903int radio::getIccCardStatusResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002904 int responseType, int serial, RIL_Errno e,
2905 void *response, size_t responseLen) {
Sanket Padawef220dc52017-01-02 23:46:00 -08002906 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08002907 RadioResponseInfo responseInfo = {};
Sanket Padawef220dc52017-01-02 23:46:00 -08002908 populateResponseInfo(responseInfo, serial, responseType, e);
Jack Yuf68e0da2017-02-07 14:53:09 -08002909 CardStatus cardStatus = {};
Sanket Padawef220dc52017-01-02 23:46:00 -08002910 if (response == NULL || responseLen != sizeof(RIL_CardStatus_v6)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08002911 RLOGE("getIccCardStatusResponse: Invalid response");
Sanket Padawef220dc52017-01-02 23:46:00 -08002912 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002913 } else {
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002914 RIL_CardStatus_v6 *p_cur = ((RIL_CardStatus_v6 *) response);
2915 cardStatus.cardState = (CardState) p_cur->card_state;
2916 cardStatus.universalPinState = (PinState) p_cur->universal_pin_state;
2917 cardStatus.gsmUmtsSubscriptionAppIndex = p_cur->gsm_umts_subscription_app_index;
2918 cardStatus.cdmaSubscriptionAppIndex = p_cur->cdma_subscription_app_index;
2919 cardStatus.imsSubscriptionAppIndex = p_cur->ims_subscription_app_index;
2920
2921 RIL_AppStatus *rilAppStatus = p_cur->applications;
2922 cardStatus.applications.resize(p_cur->num_applications);
2923 AppStatus *appStatus = cardStatus.applications.data();
Jayachandran C572f2f42017-03-25 14:30:13 -07002924#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002925 RLOGD("getIccCardStatusResponse: num_applications %d", p_cur->num_applications);
Jayachandran C572f2f42017-03-25 14:30:13 -07002926#endif
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002927 for (int i = 0; i < p_cur->num_applications; i++) {
2928 appStatus[i].appType = (AppType) rilAppStatus[i].app_type;
2929 appStatus[i].appState = (AppState) rilAppStatus[i].app_state;
2930 appStatus[i].persoSubstate = (PersoSubstate) rilAppStatus[i].perso_substate;
2931 appStatus[i].aidPtr = convertCharPtrToHidlString(rilAppStatus[i].aid_ptr);
2932 appStatus[i].appLabelPtr = convertCharPtrToHidlString(
2933 rilAppStatus[i].app_label_ptr);
2934 appStatus[i].pin1Replaced = rilAppStatus[i].pin1_replaced;
2935 appStatus[i].pin1 = (PinState) rilAppStatus[i].pin1;
2936 appStatus[i].pin2 = (PinState) rilAppStatus[i].pin2;
2937 }
2938 }
2939
Amit Mahajan17249842017-01-19 15:05:45 -08002940 Return<void> retStatus = radioService[slotId]->mRadioResponse->
2941 getIccCardStatusResponse(responseInfo, cardStatus);
2942 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajancd77a5b2016-08-25 11:19:21 -07002943 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08002944 RLOGE("getIccCardStatusResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawef220dc52017-01-02 23:46:00 -08002945 }
2946
2947 return 0;
2948}
2949
Amit Mahajan759786a2017-03-03 17:35:47 -08002950int radio::supplyIccPinForAppResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002951 int responseType, int serial, RIL_Errno e,
2952 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002953#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002954 RLOGD("supplyIccPinForAppResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002955#endif
Sanket Padawef220dc52017-01-02 23:46:00 -08002956
2957 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08002958 RadioResponseInfo responseInfo = {};
Naveen Kalla346bbc02017-03-16 12:55:55 -07002959 int ret = responseIntOrEmpty(responseInfo, serial, responseType, e, response, responseLen);
Amit Mahajan17249842017-01-19 15:05:45 -08002960 Return<void> retStatus = radioService[slotId]->mRadioResponse->
2961 supplyIccPinForAppResponse(responseInfo, ret);
Amit Mahajanb3a11bb2017-05-15 16:41:44 -07002962 RLOGE("supplyIccPinForAppResponse: amit ret %d", ret);
Amit Mahajan17249842017-01-19 15:05:45 -08002963 radioService[slotId]->checkReturnStatus(retStatus);
Sanket Padawef220dc52017-01-02 23:46:00 -08002964 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08002965 RLOGE("supplyIccPinForAppResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawef220dc52017-01-02 23:46:00 -08002966 slotId);
2967 }
2968
2969 return 0;
2970}
2971
Amit Mahajan759786a2017-03-03 17:35:47 -08002972int radio::supplyIccPukForAppResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002973 int responseType, int serial, RIL_Errno e,
2974 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002975#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002976 RLOGD("supplyIccPukForAppResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002977#endif
Sanket Padawef220dc52017-01-02 23:46:00 -08002978
2979 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08002980 RadioResponseInfo responseInfo = {};
Naveen Kalla346bbc02017-03-16 12:55:55 -07002981 int ret = responseIntOrEmpty(responseInfo, serial, responseType, e, response, responseLen);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002982 Return<void> retStatus = radioService[slotId]->mRadioResponse->supplyIccPukForAppResponse(
2983 responseInfo, ret);
Amit Mahajan17249842017-01-19 15:05:45 -08002984 radioService[slotId]->checkReturnStatus(retStatus);
Sanket Padawef220dc52017-01-02 23:46:00 -08002985 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08002986 RLOGE("supplyIccPukForAppResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawef220dc52017-01-02 23:46:00 -08002987 slotId);
2988 }
2989
2990 return 0;
2991}
2992
Amit Mahajan759786a2017-03-03 17:35:47 -08002993int radio::supplyIccPin2ForAppResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08002994 int responseType, int serial, RIL_Errno e,
2995 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07002996#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08002997 RLOGD("supplyIccPin2ForAppResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07002998#endif
Sanket Padawef220dc52017-01-02 23:46:00 -08002999
3000 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003001 RadioResponseInfo responseInfo = {};
Naveen Kalla346bbc02017-03-16 12:55:55 -07003002 int ret = responseIntOrEmpty(responseInfo, serial, responseType, e, response, responseLen);
Amit Mahajan17249842017-01-19 15:05:45 -08003003 Return<void> retStatus = radioService[slotId]->mRadioResponse->
3004 supplyIccPin2ForAppResponse(responseInfo, ret);
3005 radioService[slotId]->checkReturnStatus(retStatus);
Sanket Padawef220dc52017-01-02 23:46:00 -08003006 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003007 RLOGE("supplyIccPin2ForAppResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawef220dc52017-01-02 23:46:00 -08003008 slotId);
3009 }
3010
3011 return 0;
3012}
3013
Amit Mahajan759786a2017-03-03 17:35:47 -08003014int radio::supplyIccPuk2ForAppResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003015 int responseType, int serial, RIL_Errno e,
3016 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003017#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003018 RLOGD("supplyIccPuk2ForAppResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003019#endif
Sanket Padawef220dc52017-01-02 23:46:00 -08003020
3021 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003022 RadioResponseInfo responseInfo = {};
Naveen Kalla346bbc02017-03-16 12:55:55 -07003023 int ret = responseIntOrEmpty(responseInfo, serial, responseType, e, response, responseLen);
Amit Mahajan17249842017-01-19 15:05:45 -08003024 Return<void> retStatus = radioService[slotId]->mRadioResponse->
3025 supplyIccPuk2ForAppResponse(responseInfo, ret);
3026 radioService[slotId]->checkReturnStatus(retStatus);
Sanket Padawef220dc52017-01-02 23:46:00 -08003027 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003028 RLOGE("supplyIccPuk2ForAppResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawef220dc52017-01-02 23:46:00 -08003029 slotId);
3030 }
3031
3032 return 0;
3033}
3034
Amit Mahajan759786a2017-03-03 17:35:47 -08003035int radio::changeIccPinForAppResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003036 int responseType, int serial, RIL_Errno e,
3037 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003038#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003039 RLOGD("changeIccPinForAppResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003040#endif
Sanket Padawef220dc52017-01-02 23:46:00 -08003041
3042 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003043 RadioResponseInfo responseInfo = {};
Naveen Kalla346bbc02017-03-16 12:55:55 -07003044 int ret = responseIntOrEmpty(responseInfo, serial, responseType, e, response, responseLen);
Amit Mahajan17249842017-01-19 15:05:45 -08003045 Return<void> retStatus = radioService[slotId]->mRadioResponse->
3046 changeIccPinForAppResponse(responseInfo, ret);
3047 radioService[slotId]->checkReturnStatus(retStatus);
Sanket Padawef220dc52017-01-02 23:46:00 -08003048 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003049 RLOGE("changeIccPinForAppResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawef220dc52017-01-02 23:46:00 -08003050 slotId);
3051 }
3052
3053 return 0;
3054}
3055
Amit Mahajan759786a2017-03-03 17:35:47 -08003056int radio::changeIccPin2ForAppResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003057 int responseType, int serial, RIL_Errno e,
3058 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003059#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003060 RLOGD("changeIccPin2ForAppResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003061#endif
Sanket Padawef220dc52017-01-02 23:46:00 -08003062
3063 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003064 RadioResponseInfo responseInfo = {};
Naveen Kalla346bbc02017-03-16 12:55:55 -07003065 int ret = responseIntOrEmpty(responseInfo, serial, responseType, e, response, responseLen);
Amit Mahajan17249842017-01-19 15:05:45 -08003066 Return<void> retStatus = radioService[slotId]->mRadioResponse->
3067 changeIccPin2ForAppResponse(responseInfo, ret);
3068 radioService[slotId]->checkReturnStatus(retStatus);
Sanket Padawef220dc52017-01-02 23:46:00 -08003069 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003070 RLOGE("changeIccPin2ForAppResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawef220dc52017-01-02 23:46:00 -08003071 slotId);
3072 }
3073
3074 return 0;
3075}
3076
Amit Mahajan759786a2017-03-03 17:35:47 -08003077int radio::supplyNetworkDepersonalizationResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003078 int responseType, int serial, RIL_Errno e,
3079 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003080#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003081 RLOGD("supplyNetworkDepersonalizationResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003082#endif
Sanket Padawef220dc52017-01-02 23:46:00 -08003083
3084 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003085 RadioResponseInfo responseInfo = {};
Naveen Kalla346bbc02017-03-16 12:55:55 -07003086 int ret = responseIntOrEmpty(responseInfo, serial, responseType, e, response, responseLen);
Amit Mahajan17249842017-01-19 15:05:45 -08003087 Return<void> retStatus = radioService[slotId]->mRadioResponse->
3088 supplyNetworkDepersonalizationResponse(responseInfo, ret);
3089 radioService[slotId]->checkReturnStatus(retStatus);
Sanket Padawef220dc52017-01-02 23:46:00 -08003090 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003091 RLOGE("supplyNetworkDepersonalizationResponse: radioService[%d]->mRadioResponse == "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003092 "NULL", slotId);
Sanket Padawef220dc52017-01-02 23:46:00 -08003093 }
3094
3095 return 0;
3096}
3097
Amit Mahajan759786a2017-03-03 17:35:47 -08003098int radio::getCurrentCallsResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003099 int responseType, int serial, RIL_Errno e,
3100 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003101#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003102 RLOGD("getCurrentCallsResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003103#endif
Sanket Padawef220dc52017-01-02 23:46:00 -08003104
3105 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003106 RadioResponseInfo responseInfo = {};
Sanket Padawef220dc52017-01-02 23:46:00 -08003107 populateResponseInfo(responseInfo, serial, responseType, e);
3108
3109 hidl_vec<Call> calls;
Amit Mahajan13058cb2017-06-07 23:10:27 -07003110 if ((response == NULL && responseLen != 0)
3111 || (responseLen % sizeof(RIL_Call *)) != 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003112 RLOGE("getCurrentCallsResponse: Invalid response");
Amit Mahajan5829a472016-12-28 17:28:07 -08003113 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
Sanket Padawef220dc52017-01-02 23:46:00 -08003114 } else {
3115 int num = responseLen / sizeof(RIL_Call *);
3116 calls.resize(num);
3117
3118 for (int i = 0 ; i < num ; i++) {
3119 RIL_Call *p_cur = ((RIL_Call **) response)[i];
3120 /* each call info */
3121 calls[i].state = (CallState) p_cur->state;
3122 calls[i].index = p_cur->index;
3123 calls[i].toa = p_cur->toa;
3124 calls[i].isMpty = p_cur->isMpty;
3125 calls[i].isMT = p_cur->isMT;
3126 calls[i].als = p_cur->als;
3127 calls[i].isVoice = p_cur->isVoice;
3128 calls[i].isVoicePrivacy = p_cur->isVoicePrivacy;
3129 calls[i].number = convertCharPtrToHidlString(p_cur->number);
3130 calls[i].numberPresentation = (CallPresentation) p_cur->numberPresentation;
3131 calls[i].name = convertCharPtrToHidlString(p_cur->name);
3132 calls[i].namePresentation = (CallPresentation) p_cur->namePresentation;
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003133 if (p_cur->uusInfo != NULL && p_cur->uusInfo->uusData != NULL) {
Sanket Padawef220dc52017-01-02 23:46:00 -08003134 RIL_UUS_Info *uusInfo = p_cur->uusInfo;
3135 calls[i].uusInfo[0].uusType = (UusType) uusInfo->uusType;
3136 calls[i].uusInfo[0].uusDcs = (UusDcs) uusInfo->uusDcs;
3137 // convert uusInfo->uusData to a null-terminated string
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003138 char *nullTermStr = strndup(uusInfo->uusData, uusInfo->uusLength);
3139 calls[i].uusInfo[0].uusData = nullTermStr;
3140 free(nullTermStr);
Sanket Padawef220dc52017-01-02 23:46:00 -08003141 }
3142 }
3143 }
3144
Amit Mahajan17249842017-01-19 15:05:45 -08003145 Return<void> retStatus = radioService[slotId]->mRadioResponse->
3146 getCurrentCallsResponse(responseInfo, calls);
3147 radioService[slotId]->checkReturnStatus(retStatus);
Sanket Padawef220dc52017-01-02 23:46:00 -08003148 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003149 RLOGE("getCurrentCallsResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawef220dc52017-01-02 23:46:00 -08003150 }
3151
3152 return 0;
3153}
3154
Amit Mahajan759786a2017-03-03 17:35:47 -08003155int radio::dialResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003156 int responseType, int serial, RIL_Errno e, void *response,
3157 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003158#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003159 RLOGD("dialResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003160#endif
Sanket Padawef220dc52017-01-02 23:46:00 -08003161
3162 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003163 RadioResponseInfo responseInfo = {};
Sanket Padawef220dc52017-01-02 23:46:00 -08003164 populateResponseInfo(responseInfo, serial, responseType, e);
Amit Mahajan17249842017-01-19 15:05:45 -08003165 Return<void> retStatus = radioService[slotId]->mRadioResponse->dialResponse(responseInfo);
3166 radioService[slotId]->checkReturnStatus(retStatus);
Sanket Padawef220dc52017-01-02 23:46:00 -08003167 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003168 RLOGE("dialResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Amit Mahajancd77a5b2016-08-25 11:19:21 -07003169 }
3170
3171 return 0;
3172}
3173
Amit Mahajan759786a2017-03-03 17:35:47 -08003174int radio::getIMSIForAppResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003175 int responseType, int serial, RIL_Errno e, void *response,
3176 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003177#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003178 RLOGD("getIMSIForAppResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003179#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003180
3181 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003182 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003183 populateResponseInfo(responseInfo, serial, responseType, e);
3184 Return<void> retStatus = radioService[slotId]->mRadioResponse->getIMSIForAppResponse(
3185 responseInfo, convertCharPtrToHidlString((char *) response));
3186 radioService[slotId]->checkReturnStatus(retStatus);
3187 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003188 RLOGE("getIMSIForAppResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003189 slotId);
3190 }
3191
3192 return 0;
3193}
3194
Amit Mahajan759786a2017-03-03 17:35:47 -08003195int radio::hangupConnectionResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003196 int responseType, int serial, RIL_Errno e,
3197 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003198#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003199 RLOGD("hangupConnectionResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003200#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003201
3202 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003203 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003204 populateResponseInfo(responseInfo, serial, responseType, e);
3205 Return<void> retStatus = radioService[slotId]->mRadioResponse->hangupConnectionResponse(
3206 responseInfo);
3207 radioService[slotId]->checkReturnStatus(retStatus);
3208 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003209 RLOGE("hangupConnectionResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003210 slotId);
3211 }
3212
3213 return 0;
3214}
3215
Amit Mahajan759786a2017-03-03 17:35:47 -08003216int radio::hangupWaitingOrBackgroundResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003217 int responseType, int serial, RIL_Errno e,
3218 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003219#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003220 RLOGD("hangupWaitingOrBackgroundResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003221#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003222
3223 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003224 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003225 populateResponseInfo(responseInfo, serial, responseType, e);
3226 Return<void> retStatus =
3227 radioService[slotId]->mRadioResponse->hangupWaitingOrBackgroundResponse(
3228 responseInfo);
3229 radioService[slotId]->checkReturnStatus(retStatus);
3230 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003231 RLOGE("hangupWaitingOrBackgroundResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003232 slotId);
3233 }
3234
3235 return 0;
3236}
3237
Amit Mahajan759786a2017-03-03 17:35:47 -08003238int radio::hangupForegroundResumeBackgroundResponse(int slotId, int responseType, int serial,
3239 RIL_Errno e, void *response,
3240 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003241#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003242 RLOGD("hangupWaitingOrBackgroundResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003243#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003244
3245 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003246 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003247 populateResponseInfo(responseInfo, serial, responseType, e);
3248 Return<void> retStatus =
3249 radioService[slotId]->mRadioResponse->hangupWaitingOrBackgroundResponse(
3250 responseInfo);
3251 radioService[slotId]->checkReturnStatus(retStatus);
3252 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003253 RLOGE("hangupWaitingOrBackgroundResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003254 slotId);
3255 }
3256
3257 return 0;
3258}
3259
Amit Mahajan759786a2017-03-03 17:35:47 -08003260int radio::switchWaitingOrHoldingAndActiveResponse(int slotId, int responseType, int serial,
3261 RIL_Errno e, void *response,
3262 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003263#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003264 RLOGD("switchWaitingOrHoldingAndActiveResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003265#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003266
3267 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003268 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003269 populateResponseInfo(responseInfo, serial, responseType, e);
3270 Return<void> retStatus =
3271 radioService[slotId]->mRadioResponse->switchWaitingOrHoldingAndActiveResponse(
3272 responseInfo);
3273 radioService[slotId]->checkReturnStatus(retStatus);
3274 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003275 RLOGE("switchWaitingOrHoldingAndActiveResponse: radioService[%d]->mRadioResponse "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003276 "== NULL", slotId);
3277 }
3278
3279 return 0;
3280}
3281
Amit Mahajan759786a2017-03-03 17:35:47 -08003282int radio::conferenceResponse(int slotId, int responseType,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003283 int serial, RIL_Errno e, void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003284#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003285 RLOGD("conferenceResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003286#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003287
3288 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003289 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003290 populateResponseInfo(responseInfo, serial, responseType, e);
3291 Return<void> retStatus = radioService[slotId]->mRadioResponse->conferenceResponse(
3292 responseInfo);
3293 radioService[slotId]->checkReturnStatus(retStatus);
3294 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003295 RLOGE("conferenceResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003296 slotId);
3297 }
3298
3299 return 0;
3300}
3301
Amit Mahajan759786a2017-03-03 17:35:47 -08003302int radio::rejectCallResponse(int slotId, int responseType,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003303 int serial, RIL_Errno e, void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003304#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003305 RLOGD("rejectCallResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003306#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003307
3308 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003309 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003310 populateResponseInfo(responseInfo, serial, responseType, e);
3311 Return<void> retStatus = radioService[slotId]->mRadioResponse->rejectCallResponse(
3312 responseInfo);
3313 radioService[slotId]->checkReturnStatus(retStatus);
3314 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003315 RLOGE("rejectCallResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003316 slotId);
3317 }
3318
3319 return 0;
3320}
3321
Amit Mahajan759786a2017-03-03 17:35:47 -08003322int radio::getLastCallFailCauseResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003323 int responseType, int serial, RIL_Errno e, void *response,
3324 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003325#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003326 RLOGD("getLastCallFailCauseResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003327#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003328
3329 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003330 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003331 populateResponseInfo(responseInfo, serial, responseType, e);
Jack Yuf68e0da2017-02-07 14:53:09 -08003332
3333 LastCallFailCauseInfo info = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003334 info.vendorCause = hidl_string();
3335 if (response == NULL) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003336 RLOGE("getCurrentCallsResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003337 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
3338 } else if (responseLen == sizeof(int)) {
3339 int *pInt = (int *) response;
3340 info.causeCode = (LastCallFailCause) pInt[0];
3341 } else if (responseLen == sizeof(RIL_LastCallFailCauseInfo)) {
3342 RIL_LastCallFailCauseInfo *pFailCauseInfo = (RIL_LastCallFailCauseInfo *) response;
3343 info.causeCode = (LastCallFailCause) pFailCauseInfo->cause_code;
3344 info.vendorCause = convertCharPtrToHidlString(pFailCauseInfo->vendor_cause);
3345 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003346 RLOGE("getCurrentCallsResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003347 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
3348 }
3349
3350 Return<void> retStatus = radioService[slotId]->mRadioResponse->getLastCallFailCauseResponse(
3351 responseInfo, info);
3352 radioService[slotId]->checkReturnStatus(retStatus);
3353 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003354 RLOGE("getLastCallFailCauseResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003355 slotId);
3356 }
3357
3358 return 0;
3359}
3360
Amit Mahajan759786a2017-03-03 17:35:47 -08003361int radio::getSignalStrengthResponse(int slotId,
Amit Mahajan3df62912017-02-10 01:35:55 +00003362 int responseType, int serial, RIL_Errno e,
3363 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003364#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003365 RLOGD("getSignalStrengthResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003366#endif
Amit Mahajan3df62912017-02-10 01:35:55 +00003367
3368 if (radioService[slotId]->mRadioResponse != NULL) {
Amit Mahajan3da9ac02017-02-13 13:41:28 -08003369 RadioResponseInfo responseInfo = {};
Amit Mahajan3df62912017-02-10 01:35:55 +00003370 populateResponseInfo(responseInfo, serial, responseType, e);
Amit Mahajan3da9ac02017-02-13 13:41:28 -08003371 SignalStrength signalStrength = {};
Amit Mahajan3df62912017-02-10 01:35:55 +00003372 if (response == NULL || responseLen != sizeof(RIL_SignalStrength_v10)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003373 RLOGE("getSignalStrengthResponse: Invalid response");
Amit Mahajan3df62912017-02-10 01:35:55 +00003374 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
3375 } else {
3376 convertRilSignalStrengthToHal(response, responseLen, signalStrength);
3377 }
3378
3379 Return<void> retStatus = radioService[slotId]->mRadioResponse->getSignalStrengthResponse(
3380 responseInfo, signalStrength);
3381 radioService[slotId]->checkReturnStatus(retStatus);
3382 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003383 RLOGE("getSignalStrengthResponse: radioService[%d]->mRadioResponse == NULL",
Amit Mahajan3df62912017-02-10 01:35:55 +00003384 slotId);
3385 }
3386
3387 return 0;
3388}
3389
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003390RIL_CellInfoType getCellInfoTypeRadioTechnology(char *rat) {
3391 if (rat == NULL) {
3392 return RIL_CELL_INFO_TYPE_NONE;
3393 }
3394
3395 int radioTech = atoi(rat);
3396
3397 switch(radioTech) {
3398
3399 case RADIO_TECH_GPRS:
3400 case RADIO_TECH_EDGE:
3401 case RADIO_TECH_GSM: {
3402 return RIL_CELL_INFO_TYPE_GSM;
3403 }
3404
3405 case RADIO_TECH_UMTS:
3406 case RADIO_TECH_HSDPA:
3407 case RADIO_TECH_HSUPA:
3408 case RADIO_TECH_HSPA:
3409 case RADIO_TECH_HSPAP: {
3410 return RIL_CELL_INFO_TYPE_WCDMA;
3411 }
3412
3413 case RADIO_TECH_IS95A:
3414 case RADIO_TECH_IS95B:
3415 case RADIO_TECH_1xRTT:
3416 case RADIO_TECH_EVDO_0:
3417 case RADIO_TECH_EVDO_A:
3418 case RADIO_TECH_EVDO_B:
3419 case RADIO_TECH_EHRPD: {
3420 return RIL_CELL_INFO_TYPE_CDMA;
3421 }
3422
3423 case RADIO_TECH_LTE:
3424 case RADIO_TECH_LTE_CA: {
3425 return RIL_CELL_INFO_TYPE_LTE;
3426 }
3427
3428 case RADIO_TECH_TD_SCDMA: {
3429 return RIL_CELL_INFO_TYPE_TD_SCDMA;
3430 }
3431
3432 default: {
3433 break;
3434 }
3435 }
3436
3437 return RIL_CELL_INFO_TYPE_NONE;
3438
3439}
3440
3441void fillCellIdentityResponse(CellIdentity &cellIdentity, RIL_CellIdentity_v16 &rilCellIdentity) {
3442
3443 cellIdentity.cellIdentityGsm.resize(0);
3444 cellIdentity.cellIdentityWcdma.resize(0);
3445 cellIdentity.cellIdentityCdma.resize(0);
3446 cellIdentity.cellIdentityTdscdma.resize(0);
3447 cellIdentity.cellIdentityLte.resize(0);
3448 cellIdentity.cellInfoType = (CellInfoType)rilCellIdentity.cellInfoType;
3449 switch(rilCellIdentity.cellInfoType) {
3450
3451 case RIL_CELL_INFO_TYPE_GSM: {
3452 cellIdentity.cellIdentityGsm.resize(1);
3453 cellIdentity.cellIdentityGsm[0].mcc =
3454 std::to_string(rilCellIdentity.cellIdentityGsm.mcc);
3455 cellIdentity.cellIdentityGsm[0].mnc =
3456 std::to_string(rilCellIdentity.cellIdentityGsm.mnc);
3457 cellIdentity.cellIdentityGsm[0].lac = rilCellIdentity.cellIdentityGsm.lac;
3458 cellIdentity.cellIdentityGsm[0].cid = rilCellIdentity.cellIdentityGsm.cid;
3459 cellIdentity.cellIdentityGsm[0].arfcn = rilCellIdentity.cellIdentityGsm.arfcn;
3460 cellIdentity.cellIdentityGsm[0].bsic = rilCellIdentity.cellIdentityGsm.bsic;
3461 break;
3462 }
3463
3464 case RIL_CELL_INFO_TYPE_WCDMA: {
3465 cellIdentity.cellIdentityWcdma.resize(1);
3466 cellIdentity.cellIdentityWcdma[0].mcc =
3467 std::to_string(rilCellIdentity.cellIdentityWcdma.mcc);
3468 cellIdentity.cellIdentityWcdma[0].mnc =
3469 std::to_string(rilCellIdentity.cellIdentityWcdma.mnc);
3470 cellIdentity.cellIdentityWcdma[0].lac = rilCellIdentity.cellIdentityWcdma.lac;
3471 cellIdentity.cellIdentityWcdma[0].cid = rilCellIdentity.cellIdentityWcdma.cid;
3472 cellIdentity.cellIdentityWcdma[0].psc = rilCellIdentity.cellIdentityWcdma.psc;
3473 cellIdentity.cellIdentityWcdma[0].uarfcn = rilCellIdentity.cellIdentityWcdma.uarfcn;
3474 break;
3475 }
3476
3477 case RIL_CELL_INFO_TYPE_CDMA: {
3478 cellIdentity.cellIdentityCdma.resize(1);
3479 cellIdentity.cellIdentityCdma[0].networkId = rilCellIdentity.cellIdentityCdma.networkId;
3480 cellIdentity.cellIdentityCdma[0].systemId = rilCellIdentity.cellIdentityCdma.systemId;
3481 cellIdentity.cellIdentityCdma[0].baseStationId =
3482 rilCellIdentity.cellIdentityCdma.basestationId;
3483 cellIdentity.cellIdentityCdma[0].longitude = rilCellIdentity.cellIdentityCdma.longitude;
3484 cellIdentity.cellIdentityCdma[0].latitude = rilCellIdentity.cellIdentityCdma.latitude;
3485 break;
3486 }
3487
3488 case RIL_CELL_INFO_TYPE_LTE: {
3489 cellIdentity.cellIdentityLte.resize(1);
3490 cellIdentity.cellIdentityLte[0].mcc =
3491 std::to_string(rilCellIdentity.cellIdentityLte.mcc);
3492 cellIdentity.cellIdentityLte[0].mnc =
3493 std::to_string(rilCellIdentity.cellIdentityLte.mnc);
3494 cellIdentity.cellIdentityLte[0].ci = rilCellIdentity.cellIdentityLte.ci;
3495 cellIdentity.cellIdentityLte[0].pci = rilCellIdentity.cellIdentityLte.pci;
3496 cellIdentity.cellIdentityLte[0].tac = rilCellIdentity.cellIdentityLte.tac;
3497 cellIdentity.cellIdentityLte[0].earfcn = rilCellIdentity.cellIdentityLte.earfcn;
3498 break;
3499 }
3500
3501 case RIL_CELL_INFO_TYPE_TD_SCDMA: {
3502 cellIdentity.cellIdentityTdscdma.resize(1);
3503 cellIdentity.cellIdentityTdscdma[0].mcc =
3504 std::to_string(rilCellIdentity.cellIdentityTdscdma.mcc);
3505 cellIdentity.cellIdentityTdscdma[0].mnc =
3506 std::to_string(rilCellIdentity.cellIdentityTdscdma.mnc);
3507 cellIdentity.cellIdentityTdscdma[0].lac = rilCellIdentity.cellIdentityTdscdma.lac;
3508 cellIdentity.cellIdentityTdscdma[0].cid = rilCellIdentity.cellIdentityTdscdma.cid;
3509 cellIdentity.cellIdentityTdscdma[0].cpid = rilCellIdentity.cellIdentityTdscdma.cpid;
3510 break;
3511 }
3512
3513 default: {
3514 break;
3515 }
3516 }
3517}
3518
3519int convertResponseStringEntryToInt(char **response, int index, int numStrings) {
3520 if ((response != NULL) && (numStrings > index) && (response[index] != NULL)) {
3521 return atoi(response[index]);
3522 }
3523
3524 return -1;
3525}
3526
Sooraj Sasindran758ee462017-06-07 16:30:18 -07003527int convertResponseHexStringEntryToInt(char **response, int index, int numStrings) {
3528 const int hexBase = 16;
3529 if ((response != NULL) && (numStrings > index) && (response[index] != NULL)) {
3530 return strtol(response[index], NULL, hexBase);
3531 }
3532
3533 return -1;
3534}
3535
3536/* Fill Cell Identity info from Voice Registration State Response.
3537 * This fucntion is applicable only for RIL Version < 15.
3538 * Response is a "char **".
3539 * First and Second entries are in hex string format
3540 * and rest are integers represented in ascii format. */
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003541void fillCellIdentityFromVoiceRegStateResponseString(CellIdentity &cellIdentity,
3542 int numStrings, char** response) {
3543
3544 RIL_CellIdentity_v16 rilCellIdentity;
Jack Yu8e732d42017-04-14 00:08:06 -07003545 memset(&rilCellIdentity, -1, sizeof(RIL_CellIdentity_v16));
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003546
3547 rilCellIdentity.cellInfoType = getCellInfoTypeRadioTechnology(response[3]);
3548 switch(rilCellIdentity.cellInfoType) {
3549
3550 case RIL_CELL_INFO_TYPE_GSM: {
Sooraj Sasindran758ee462017-06-07 16:30:18 -07003551 /* valid LAC are hexstrings in the range 0x0000 - 0xffff */
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003552 rilCellIdentity.cellIdentityGsm.lac =
Sooraj Sasindran758ee462017-06-07 16:30:18 -07003553 convertResponseHexStringEntryToInt(response, 1, numStrings);
3554
3555 /* valid CID are hexstrings in the range 0x00000000 - 0xffffffff */
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003556 rilCellIdentity.cellIdentityGsm.cid =
Sooraj Sasindran758ee462017-06-07 16:30:18 -07003557 convertResponseHexStringEntryToInt(response, 2, numStrings);
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003558 break;
3559 }
3560
3561 case RIL_CELL_INFO_TYPE_WCDMA: {
Sooraj Sasindran758ee462017-06-07 16:30:18 -07003562 /* valid LAC are hexstrings in the range 0x0000 - 0xffff */
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003563 rilCellIdentity.cellIdentityWcdma.lac =
Sooraj Sasindran758ee462017-06-07 16:30:18 -07003564 convertResponseHexStringEntryToInt(response, 1, numStrings);
3565
3566 /* valid CID are hexstrings in the range 0x00000000 - 0xffffffff */
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003567 rilCellIdentity.cellIdentityWcdma.cid =
Sooraj Sasindran758ee462017-06-07 16:30:18 -07003568 convertResponseHexStringEntryToInt(response, 2, numStrings);
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003569 rilCellIdentity.cellIdentityWcdma.psc =
3570 convertResponseStringEntryToInt(response, 14, numStrings);
3571 break;
3572 }
3573
3574 case RIL_CELL_INFO_TYPE_TD_SCDMA:{
Sooraj Sasindran758ee462017-06-07 16:30:18 -07003575 /* valid LAC are hexstrings in the range 0x0000 - 0xffff */
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003576 rilCellIdentity.cellIdentityTdscdma.lac =
Sooraj Sasindran758ee462017-06-07 16:30:18 -07003577 convertResponseHexStringEntryToInt(response, 1, numStrings);
3578
3579 /* valid CID are hexstrings in the range 0x00000000 - 0xffffffff */
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003580 rilCellIdentity.cellIdentityTdscdma.cid =
Sooraj Sasindran758ee462017-06-07 16:30:18 -07003581 convertResponseHexStringEntryToInt(response, 2, numStrings);
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003582 break;
3583 }
3584
3585 case RIL_CELL_INFO_TYPE_CDMA:{
3586 rilCellIdentity.cellIdentityCdma.basestationId =
3587 convertResponseStringEntryToInt(response, 4, numStrings);
3588 rilCellIdentity.cellIdentityCdma.longitude =
3589 convertResponseStringEntryToInt(response, 5, numStrings);
3590 rilCellIdentity.cellIdentityCdma.latitude =
3591 convertResponseStringEntryToInt(response, 6, numStrings);
3592 rilCellIdentity.cellIdentityCdma.systemId =
3593 convertResponseStringEntryToInt(response, 8, numStrings);
3594 rilCellIdentity.cellIdentityCdma.networkId =
3595 convertResponseStringEntryToInt(response, 9, numStrings);
3596 break;
3597 }
3598
Sooraj Sasindranf28e42a2017-03-06 23:07:22 -08003599 case RIL_CELL_INFO_TYPE_LTE:{
Sooraj Sasindran758ee462017-06-07 16:30:18 -07003600 /* valid TAC are hexstrings in the range 0x0000 - 0xffff */
Sooraj Sasindranf28e42a2017-03-06 23:07:22 -08003601 rilCellIdentity.cellIdentityLte.tac =
Sooraj Sasindran758ee462017-06-07 16:30:18 -07003602 convertResponseHexStringEntryToInt(response, 1, numStrings);
3603
3604 /* valid CID are hexstrings in the range 0x00000000 - 0xffffffff */
Sooraj Sasindranf28e42a2017-03-06 23:07:22 -08003605 rilCellIdentity.cellIdentityLte.ci =
Sooraj Sasindran758ee462017-06-07 16:30:18 -07003606 convertResponseHexStringEntryToInt(response, 2, numStrings);
Sooraj Sasindranf28e42a2017-03-06 23:07:22 -08003607 break;
3608 }
3609
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003610 default: {
3611 break;
3612 }
3613 }
3614
3615 fillCellIdentityResponse(cellIdentity, rilCellIdentity);
3616}
3617
Sooraj Sasindran758ee462017-06-07 16:30:18 -07003618/* Fill Cell Identity info from Data Registration State Response.
3619 * This fucntion is applicable only for RIL Version < 15.
3620 * Response is a "char **".
3621 * First and Second entries are in hex string format
3622 * and rest are integers represented in ascii format. */
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003623void fillCellIdentityFromDataRegStateResponseString(CellIdentity &cellIdentity,
3624 int numStrings, char** response) {
3625
3626 RIL_CellIdentity_v16 rilCellIdentity;
Jack Yu8e732d42017-04-14 00:08:06 -07003627 memset(&rilCellIdentity, -1, sizeof(RIL_CellIdentity_v16));
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003628
3629 rilCellIdentity.cellInfoType = getCellInfoTypeRadioTechnology(response[3]);
3630 switch(rilCellIdentity.cellInfoType) {
3631 case RIL_CELL_INFO_TYPE_GSM: {
Sooraj Sasindran758ee462017-06-07 16:30:18 -07003632 /* valid LAC are hexstrings in the range 0x0000 - 0xffff */
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003633 rilCellIdentity.cellIdentityGsm.lac =
Sooraj Sasindran758ee462017-06-07 16:30:18 -07003634 convertResponseHexStringEntryToInt(response, 1, numStrings);
3635
3636 /* valid CID are hexstrings in the range 0x00000000 - 0xffffffff */
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003637 rilCellIdentity.cellIdentityGsm.cid =
Sooraj Sasindran758ee462017-06-07 16:30:18 -07003638 convertResponseHexStringEntryToInt(response, 2, numStrings);
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003639 break;
3640 }
3641 case RIL_CELL_INFO_TYPE_WCDMA: {
Sooraj Sasindran758ee462017-06-07 16:30:18 -07003642 /* valid LAC are hexstrings in the range 0x0000 - 0xffff */
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003643 rilCellIdentity.cellIdentityWcdma.lac =
Sooraj Sasindran758ee462017-06-07 16:30:18 -07003644 convertResponseHexStringEntryToInt(response, 1, numStrings);
3645
3646 /* valid CID are hexstrings in the range 0x00000000 - 0xffffffff */
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003647 rilCellIdentity.cellIdentityWcdma.cid =
Sooraj Sasindran758ee462017-06-07 16:30:18 -07003648 convertResponseHexStringEntryToInt(response, 2, numStrings);
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003649 break;
3650 }
3651 case RIL_CELL_INFO_TYPE_TD_SCDMA:{
Sooraj Sasindran758ee462017-06-07 16:30:18 -07003652 /* valid LAC are hexstrings in the range 0x0000 - 0xffff */
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003653 rilCellIdentity.cellIdentityTdscdma.lac =
Sooraj Sasindran758ee462017-06-07 16:30:18 -07003654 convertResponseHexStringEntryToInt(response, 1, numStrings);
3655
3656 /* valid CID are hexstrings in the range 0x00000000 - 0xffffffff */
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003657 rilCellIdentity.cellIdentityTdscdma.cid =
Sooraj Sasindran758ee462017-06-07 16:30:18 -07003658 convertResponseHexStringEntryToInt(response, 2, numStrings);
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003659 break;
3660 }
3661 case RIL_CELL_INFO_TYPE_LTE: {
3662 rilCellIdentity.cellIdentityLte.tac =
3663 convertResponseStringEntryToInt(response, 6, numStrings);
3664 rilCellIdentity.cellIdentityLte.pci =
3665 convertResponseStringEntryToInt(response, 7, numStrings);
3666 rilCellIdentity.cellIdentityLte.ci =
3667 convertResponseStringEntryToInt(response, 8, numStrings);
3668 break;
3669 }
3670 default: {
3671 break;
3672 }
3673 }
3674
3675 fillCellIdentityResponse(cellIdentity, rilCellIdentity);
3676}
3677
Amit Mahajan759786a2017-03-03 17:35:47 -08003678int radio::getVoiceRegistrationStateResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003679 int responseType, int serial, RIL_Errno e,
3680 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003681#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003682 RLOGD("getVoiceRegistrationStateResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003683#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003684
3685 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003686 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003687 populateResponseInfo(responseInfo, serial, responseType, e);
3688
Jack Yuf68e0da2017-02-07 14:53:09 -08003689 VoiceRegStateResult voiceRegResponse = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003690 int numStrings = responseLen / sizeof(char *);
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003691 if (response == NULL) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003692 RLOGE("getVoiceRegistrationStateResponse Invalid response: NULL");
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003693 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
3694 } else if (s_vendorFunctions->version <= 14) {
3695 if (numStrings != 15) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003696 RLOGE("getVoiceRegistrationStateResponse Invalid response: NULL");
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003697 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
3698 } else {
3699 char **resp = (char **) response;
3700 voiceRegResponse.regState = (RegState) ATOI_NULL_HANDLED_DEF(resp[0], 4);
3701 voiceRegResponse.rat = ATOI_NULL_HANDLED(resp[3]);
3702 voiceRegResponse.cssSupported = ATOI_NULL_HANDLED_DEF(resp[7], 0);
3703 voiceRegResponse.roamingIndicator = ATOI_NULL_HANDLED(resp[10]);
3704 voiceRegResponse.systemIsInPrl = ATOI_NULL_HANDLED_DEF(resp[11], 0);
3705 voiceRegResponse.defaultRoamingIndicator = ATOI_NULL_HANDLED_DEF(resp[12], 0);
3706 voiceRegResponse.reasonForDenial = ATOI_NULL_HANDLED_DEF(resp[13], 0);
3707 fillCellIdentityFromVoiceRegStateResponseString(voiceRegResponse.cellIdentity,
3708 numStrings, resp);
3709 }
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003710 } else {
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003711 RIL_VoiceRegistrationStateResponse *voiceRegState =
3712 (RIL_VoiceRegistrationStateResponse *)response;
3713
3714 if (responseLen != sizeof(RIL_VoiceRegistrationStateResponse)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003715 RLOGE("getVoiceRegistrationStateResponse Invalid response: NULL");
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003716 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
3717 } else {
3718 voiceRegResponse.regState = (RegState) voiceRegState->regState;
3719 voiceRegResponse.rat = voiceRegState->rat;;
3720 voiceRegResponse.cssSupported = voiceRegState->cssSupported;
3721 voiceRegResponse.roamingIndicator = voiceRegState->roamingIndicator;
3722 voiceRegResponse.systemIsInPrl = voiceRegState->systemIsInPrl;
3723 voiceRegResponse.defaultRoamingIndicator = voiceRegState->defaultRoamingIndicator;
3724 voiceRegResponse.reasonForDenial = voiceRegState->reasonForDenial;
3725 fillCellIdentityResponse(voiceRegResponse.cellIdentity,
3726 voiceRegState->cellIdentity);
3727 }
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003728 }
3729
3730 Return<void> retStatus =
3731 radioService[slotId]->mRadioResponse->getVoiceRegistrationStateResponse(
3732 responseInfo, voiceRegResponse);
3733 radioService[slotId]->checkReturnStatus(retStatus);
3734 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003735 RLOGE("getVoiceRegistrationStateResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003736 slotId);
3737 }
3738
3739 return 0;
3740}
3741
Amit Mahajan759786a2017-03-03 17:35:47 -08003742int radio::getDataRegistrationStateResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003743 int responseType, int serial, RIL_Errno e,
3744 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003745#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003746 RLOGD("getDataRegistrationStateResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003747#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003748
3749 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003750 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003751 populateResponseInfo(responseInfo, serial, responseType, e);
Jack Yuf68e0da2017-02-07 14:53:09 -08003752 DataRegStateResult dataRegResponse = {};
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003753 if (response == NULL) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003754 RLOGE("getDataRegistrationStateResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003755 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003756 } else if (s_vendorFunctions->version <= 14) {
3757 int numStrings = responseLen / sizeof(char *);
3758 if ((numStrings != 6) && (numStrings != 11)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003759 RLOGE("getDataRegistrationStateResponse Invalid response: NULL");
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003760 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
3761 } else {
3762 char **resp = (char **) response;
3763 dataRegResponse.regState = (RegState) ATOI_NULL_HANDLED_DEF(resp[0], 4);
3764 dataRegResponse.rat = ATOI_NULL_HANDLED_DEF(resp[3], 0);
3765 dataRegResponse.reasonDataDenied = ATOI_NULL_HANDLED(resp[4]);
3766 dataRegResponse.maxDataCalls = ATOI_NULL_HANDLED_DEF(resp[5], 1);
3767 fillCellIdentityFromDataRegStateResponseString(dataRegResponse.cellIdentity,
3768 numStrings, resp);
3769 }
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003770 } else {
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003771 RIL_DataRegistrationStateResponse *dataRegState =
3772 (RIL_DataRegistrationStateResponse *)response;
3773
3774 if (responseLen != sizeof(RIL_DataRegistrationStateResponse)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003775 RLOGE("getDataRegistrationStateResponse Invalid response: NULL");
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08003776 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
3777 } else {
3778 dataRegResponse.regState = (RegState) dataRegState->regState;
3779 dataRegResponse.rat = dataRegState->rat;;
3780 dataRegResponse.reasonDataDenied = dataRegState->reasonDataDenied;
3781 dataRegResponse.maxDataCalls = dataRegState->maxDataCalls;
3782 fillCellIdentityResponse(dataRegResponse.cellIdentity, dataRegState->cellIdentity);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003783 }
3784 }
3785
3786 Return<void> retStatus =
3787 radioService[slotId]->mRadioResponse->getDataRegistrationStateResponse(responseInfo,
3788 dataRegResponse);
3789 radioService[slotId]->checkReturnStatus(retStatus);
3790 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003791 RLOGE("getDataRegistrationStateResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003792 slotId);
3793 }
3794
3795 return 0;
3796}
3797
Amit Mahajan759786a2017-03-03 17:35:47 -08003798int radio::getOperatorResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003799 int responseType, int serial, RIL_Errno e, void *response,
3800 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003801#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003802 RLOGD("getOperatorResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003803#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003804
3805 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003806 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003807 populateResponseInfo(responseInfo, serial, responseType, e);
3808 hidl_string longName;
3809 hidl_string shortName;
3810 hidl_string numeric;
3811 int numStrings = responseLen / sizeof(char *);
3812 if (response == NULL || numStrings != 3) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003813 RLOGE("getOperatorResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003814 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
3815
3816 } else {
3817 char **resp = (char **) response;
3818 longName = convertCharPtrToHidlString(resp[0]);
3819 shortName = convertCharPtrToHidlString(resp[1]);
3820 numeric = convertCharPtrToHidlString(resp[2]);
3821 }
3822 Return<void> retStatus = radioService[slotId]->mRadioResponse->getOperatorResponse(
3823 responseInfo, longName, shortName, numeric);
3824 radioService[slotId]->checkReturnStatus(retStatus);
3825 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003826 RLOGE("getOperatorResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003827 slotId);
3828 }
3829
3830 return 0;
3831}
3832
Amit Mahajan759786a2017-03-03 17:35:47 -08003833int radio::setRadioPowerResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003834 int responseType, int serial, RIL_Errno e, void *response,
3835 size_t responseLen) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003836 RLOGD("setRadioPowerResponse: serial %d", serial);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003837
3838 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003839 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003840 populateResponseInfo(responseInfo, serial, responseType, e);
3841 Return<void> retStatus = radioService[slotId]->mRadioResponse->setRadioPowerResponse(
3842 responseInfo);
3843 radioService[slotId]->checkReturnStatus(retStatus);
3844 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003845 RLOGE("setRadioPowerResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003846 slotId);
3847 }
3848
3849 return 0;
3850}
3851
Amit Mahajan759786a2017-03-03 17:35:47 -08003852int radio::sendDtmfResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003853 int responseType, int serial, RIL_Errno e, void *response,
3854 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003855#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003856 RLOGD("sendDtmfResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003857#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003858
3859 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003860 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003861 populateResponseInfo(responseInfo, serial, responseType, e);
3862 Return<void> retStatus = radioService[slotId]->mRadioResponse->sendDtmfResponse(
3863 responseInfo);
3864 radioService[slotId]->checkReturnStatus(retStatus);
3865 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003866 RLOGE("sendDtmfResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003867 slotId);
3868 }
3869
3870 return 0;
3871}
3872
3873SendSmsResult makeSendSmsResult(RadioResponseInfo& responseInfo, int serial, int responseType,
3874 RIL_Errno e, void *response, size_t responseLen) {
3875 populateResponseInfo(responseInfo, serial, responseType, e);
Jack Yuf68e0da2017-02-07 14:53:09 -08003876 SendSmsResult result = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003877
3878 if (response == NULL || responseLen != sizeof(RIL_SMS_Response)) {
3879 RLOGE("Invalid response: NULL");
3880 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003881 result.ackPDU = hidl_string();
3882 } else {
3883 RIL_SMS_Response *resp = (RIL_SMS_Response *) response;
3884 result.messageRef = resp->messageRef;
3885 result.ackPDU = convertCharPtrToHidlString(resp->ackPDU);
3886 result.errorCode = resp->errorCode;
3887 }
3888 return result;
3889}
3890
Amit Mahajan759786a2017-03-03 17:35:47 -08003891int radio::sendSmsResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003892 int responseType, int serial, RIL_Errno e, void *response,
3893 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003894#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003895 RLOGD("sendSmsResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003896#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003897
3898 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003899 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003900 SendSmsResult result = makeSendSmsResult(responseInfo, serial, responseType, e, response,
3901 responseLen);
3902
3903 Return<void> retStatus = radioService[slotId]->mRadioResponse->sendSmsResponse(responseInfo,
3904 result);
3905 radioService[slotId]->checkReturnStatus(retStatus);
3906 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003907 RLOGE("sendSmsResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003908 }
3909
3910 return 0;
3911}
3912
Amit Mahajan759786a2017-03-03 17:35:47 -08003913int radio::sendSMSExpectMoreResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003914 int responseType, int serial, RIL_Errno e, void *response,
3915 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003916#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003917 RLOGD("sendSMSExpectMoreResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003918#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003919
3920 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003921 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003922 SendSmsResult result = makeSendSmsResult(responseInfo, serial, responseType, e, response,
3923 responseLen);
3924
3925 Return<void> retStatus = radioService[slotId]->mRadioResponse->sendSMSExpectMoreResponse(
3926 responseInfo, result);
3927 radioService[slotId]->checkReturnStatus(retStatus);
3928 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003929 RLOGE("sendSMSExpectMoreResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003930 }
3931
3932 return 0;
3933}
3934
Amit Mahajan759786a2017-03-03 17:35:47 -08003935int radio::setupDataCallResponse(int slotId,
Amit Mahajan3df62912017-02-10 01:35:55 +00003936 int responseType, int serial, RIL_Errno e, void *response,
3937 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003938#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003939 RLOGD("setupDataCallResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003940#endif
Amit Mahajan3df62912017-02-10 01:35:55 +00003941
3942 if (radioService[slotId]->mRadioResponse != NULL) {
Amit Mahajan3da9ac02017-02-13 13:41:28 -08003943 RadioResponseInfo responseInfo = {};
Amit Mahajan3df62912017-02-10 01:35:55 +00003944 populateResponseInfo(responseInfo, serial, responseType, e);
3945
Amit Mahajan3da9ac02017-02-13 13:41:28 -08003946 SetupDataCallResult result = {};
Amit Mahajan13058cb2017-06-07 23:10:27 -07003947 if (response == NULL || (responseLen % sizeof(RIL_Data_Call_Response_v11)) != 0) {
3948 if (response != NULL) {
3949 RLOGE("setupDataCallResponse: Invalid response");
3950 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
3951 }
Jack Yu5079e182017-02-28 15:21:18 -08003952 result.status = DataCallFailCause::ERROR_UNSPECIFIED;
Amit Mahajan3da9ac02017-02-13 13:41:28 -08003953 result.type = hidl_string();
3954 result.ifname = hidl_string();
3955 result.addresses = hidl_string();
3956 result.dnses = hidl_string();
3957 result.gateways = hidl_string();
3958 result.pcscf = hidl_string();
Amit Mahajan3df62912017-02-10 01:35:55 +00003959 } else {
3960 convertRilDataCallToHal((RIL_Data_Call_Response_v11 *) response, result);
3961 }
3962
3963 Return<void> retStatus = radioService[slotId]->mRadioResponse->setupDataCallResponse(
3964 responseInfo, result);
3965 radioService[slotId]->checkReturnStatus(retStatus);
3966 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08003967 RLOGE("setupDataCallResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Amit Mahajan3df62912017-02-10 01:35:55 +00003968 }
3969
3970 return 0;
3971}
3972
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003973IccIoResult responseIccIo(RadioResponseInfo& responseInfo, int serial, int responseType,
3974 RIL_Errno e, void *response, size_t responseLen) {
3975 populateResponseInfo(responseInfo, serial, responseType, e);
Jack Yuf68e0da2017-02-07 14:53:09 -08003976 IccIoResult result = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003977
3978 if (response == NULL || responseLen != sizeof(RIL_SIM_IO_Response)) {
3979 RLOGE("Invalid response: NULL");
3980 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003981 result.simResponse = hidl_string();
3982 } else {
3983 RIL_SIM_IO_Response *resp = (RIL_SIM_IO_Response *) response;
3984 result.sw1 = resp->sw1;
3985 result.sw2 = resp->sw2;
3986 result.simResponse = convertCharPtrToHidlString(resp->simResponse);
3987 }
3988 return result;
3989}
3990
Amit Mahajan759786a2017-03-03 17:35:47 -08003991int radio::iccIOForAppResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003992 int responseType, int serial, RIL_Errno e, void *response,
3993 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07003994#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08003995 RLOGD("iccIOForAppResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07003996#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08003997
3998 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08003999 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004000 IccIoResult result = responseIccIo(responseInfo, serial, responseType, e, response,
4001 responseLen);
4002
4003 Return<void> retStatus = radioService[slotId]->mRadioResponse->iccIOForAppResponse(
4004 responseInfo, result);
4005 radioService[slotId]->checkReturnStatus(retStatus);
4006 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004007 RLOGE("iccIOForAppResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004008 }
4009
4010 return 0;
4011}
4012
Amit Mahajan759786a2017-03-03 17:35:47 -08004013int radio::sendUssdResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004014 int responseType, int serial, RIL_Errno e, void *response,
4015 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004016#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004017 RLOGD("sendUssdResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004018#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004019
4020 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004021 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004022 populateResponseInfo(responseInfo, serial, responseType, e);
4023 Return<void> retStatus = radioService[slotId]->mRadioResponse->sendUssdResponse(
4024 responseInfo);
4025 radioService[slotId]->checkReturnStatus(retStatus);
4026 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004027 RLOGE("sendUssdResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004028 slotId);
4029 }
4030
4031 return 0;
4032}
4033
Amit Mahajan759786a2017-03-03 17:35:47 -08004034int radio::cancelPendingUssdResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004035 int responseType, int serial, RIL_Errno e, void *response,
4036 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004037#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004038 RLOGD("cancelPendingUssdResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004039#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004040
4041 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004042 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004043 populateResponseInfo(responseInfo, serial, responseType, e);
4044 Return<void> retStatus = radioService[slotId]->mRadioResponse->cancelPendingUssdResponse(
4045 responseInfo);
4046 radioService[slotId]->checkReturnStatus(retStatus);
4047 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004048 RLOGE("cancelPendingUssdResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004049 slotId);
4050 }
4051
4052 return 0;
4053}
4054
Amit Mahajan759786a2017-03-03 17:35:47 -08004055int radio::getClirResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004056 int responseType, int serial, RIL_Errno e, void *response,
4057 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004058#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004059 RLOGD("getClirResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004060#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004061
4062 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004063 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004064 populateResponseInfo(responseInfo, serial, responseType, e);
4065 int n = -1, m = -1;
4066 int numInts = responseLen / sizeof(int);
4067 if (response == NULL || numInts != 2) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004068 RLOGE("getClirResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004069 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
4070 } else {
4071 int *pInt = (int *) response;
4072 n = pInt[0];
4073 m = pInt[1];
4074 }
4075 Return<void> retStatus = radioService[slotId]->mRadioResponse->getClirResponse(responseInfo,
4076 n, m);
4077 radioService[slotId]->checkReturnStatus(retStatus);
4078 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004079 RLOGE("getClirResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004080 }
4081
4082 return 0;
4083}
4084
Amit Mahajan759786a2017-03-03 17:35:47 -08004085int radio::setClirResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004086 int responseType, int serial, RIL_Errno e, void *response,
4087 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004088#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004089 RLOGD("setClirResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004090#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004091
4092 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004093 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004094 populateResponseInfo(responseInfo, serial, responseType, e);
4095 Return<void> retStatus = radioService[slotId]->mRadioResponse->setClirResponse(
4096 responseInfo);
4097 radioService[slotId]->checkReturnStatus(retStatus);
4098 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004099 RLOGE("setClirResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004100 }
4101
4102 return 0;
4103}
4104
Amit Mahajan759786a2017-03-03 17:35:47 -08004105int radio::getCallForwardStatusResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004106 int responseType, int serial, RIL_Errno e,
4107 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004108#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004109 RLOGD("getCallForwardStatusResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004110#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004111
4112 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004113 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004114 populateResponseInfo(responseInfo, serial, responseType, e);
4115 hidl_vec<CallForwardInfo> callForwardInfos;
4116
Amit Mahajan13058cb2017-06-07 23:10:27 -07004117 if ((response == NULL && responseLen != 0)
4118 || responseLen % sizeof(RIL_CallForwardInfo *) != 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004119 RLOGE("getCallForwardStatusResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004120 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
4121 } else {
4122 int num = responseLen / sizeof(RIL_CallForwardInfo *);
4123 callForwardInfos.resize(num);
4124 for (int i = 0 ; i < num; i++) {
4125 RIL_CallForwardInfo *resp = ((RIL_CallForwardInfo **) response)[i];
4126 callForwardInfos[i].status = (CallForwardInfoStatus) resp->status;
4127 callForwardInfos[i].reason = resp->reason;
4128 callForwardInfos[i].serviceClass = resp->serviceClass;
4129 callForwardInfos[i].toa = resp->toa;
4130 callForwardInfos[i].number = convertCharPtrToHidlString(resp->number);
4131 callForwardInfos[i].timeSeconds = resp->timeSeconds;
4132 }
4133 }
4134
4135 Return<void> retStatus = radioService[slotId]->mRadioResponse->getCallForwardStatusResponse(
4136 responseInfo, callForwardInfos);
4137 radioService[slotId]->checkReturnStatus(retStatus);
4138 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004139 RLOGE("getCallForwardStatusResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004140 slotId);
4141 }
4142
4143 return 0;
4144}
4145
Amit Mahajan759786a2017-03-03 17:35:47 -08004146int radio::setCallForwardResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004147 int responseType, int serial, RIL_Errno e, void *response,
4148 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004149#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004150 RLOGD("setCallForwardResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004151#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004152
4153 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004154 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004155 populateResponseInfo(responseInfo, serial, responseType, e);
4156 Return<void> retStatus = radioService[slotId]->mRadioResponse->setCallForwardResponse(
4157 responseInfo);
4158 radioService[slotId]->checkReturnStatus(retStatus);
4159 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004160 RLOGE("setCallForwardResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004161 }
4162
4163 return 0;
4164}
4165
Amit Mahajan759786a2017-03-03 17:35:47 -08004166int radio::getCallWaitingResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004167 int responseType, int serial, RIL_Errno e, void *response,
4168 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004169#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004170 RLOGD("getCallWaitingResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004171#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004172
4173 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004174 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004175 populateResponseInfo(responseInfo, serial, responseType, e);
4176 bool enable = false;
4177 int serviceClass = -1;
4178 int numInts = responseLen / sizeof(int);
4179 if (response == NULL || numInts != 2) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004180 RLOGE("getCallWaitingResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004181 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
4182 } else {
4183 int *pInt = (int *) response;
4184 enable = pInt[0] == 1 ? true : false;
4185 serviceClass = pInt[1];
4186 }
Sanket Padawe5375bfa2017-03-07 17:21:05 -08004187 Return<void> retStatus = radioService[slotId]->mRadioResponse->getCallWaitingResponse(
4188 responseInfo, enable, serviceClass);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004189 radioService[slotId]->checkReturnStatus(retStatus);
4190 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004191 RLOGE("getCallWaitingResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004192 }
4193
4194 return 0;
4195}
4196
Amit Mahajan759786a2017-03-03 17:35:47 -08004197int radio::setCallWaitingResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004198 int responseType, int serial, RIL_Errno e, void *response,
4199 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004200#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004201 RLOGD("setCallWaitingResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004202#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004203
4204 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004205 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004206 populateResponseInfo(responseInfo, serial, responseType, e);
4207 Return<void> retStatus = radioService[slotId]->mRadioResponse->setCallWaitingResponse(
4208 responseInfo);
4209 radioService[slotId]->checkReturnStatus(retStatus);
4210 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004211 RLOGE("setCallWaitingResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004212 }
4213
4214 return 0;
4215}
4216
Amit Mahajan759786a2017-03-03 17:35:47 -08004217int radio::acknowledgeLastIncomingGsmSmsResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004218 int responseType, int serial, RIL_Errno e,
4219 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004220#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004221 RLOGD("acknowledgeLastIncomingGsmSmsResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004222#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004223
4224 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004225 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004226 populateResponseInfo(responseInfo, serial, responseType, e);
4227 Return<void> retStatus =
4228 radioService[slotId]->mRadioResponse->acknowledgeLastIncomingGsmSmsResponse(
4229 responseInfo);
4230 radioService[slotId]->checkReturnStatus(retStatus);
4231 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004232 RLOGE("acknowledgeLastIncomingGsmSmsResponse: radioService[%d]->mRadioResponse "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004233 "== NULL", slotId);
4234 }
4235
4236 return 0;
4237}
4238
Amit Mahajan759786a2017-03-03 17:35:47 -08004239int radio::acceptCallResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004240 int responseType, int serial, RIL_Errno e,
4241 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004242#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004243 RLOGD("acceptCallResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004244#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004245
4246 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004247 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004248 populateResponseInfo(responseInfo, serial, responseType, e);
4249 Return<void> retStatus = radioService[slotId]->mRadioResponse->acceptCallResponse(
4250 responseInfo);
4251 radioService[slotId]->checkReturnStatus(retStatus);
4252 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004253 RLOGE("acceptCallResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004254 slotId);
4255 }
4256
4257 return 0;
4258}
4259
Amit Mahajan759786a2017-03-03 17:35:47 -08004260int radio::deactivateDataCallResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004261 int responseType, int serial, RIL_Errno e,
4262 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004263#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004264 RLOGD("deactivateDataCallResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004265#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004266
4267 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004268 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004269 populateResponseInfo(responseInfo, serial, responseType, e);
4270 Return<void> retStatus = radioService[slotId]->mRadioResponse->deactivateDataCallResponse(
4271 responseInfo);
4272 radioService[slotId]->checkReturnStatus(retStatus);
4273 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004274 RLOGE("deactivateDataCallResponse: 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::getFacilityLockForAppResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004282 int responseType, int serial, RIL_Errno e,
4283 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004284#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004285 RLOGD("getFacilityLockForAppResponse: 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 int ret = responseInt(responseInfo, serial, responseType, e, response, responseLen);
4291 Return<void> retStatus = radioService[slotId]->mRadioResponse->
4292 getFacilityLockForAppResponse(responseInfo, ret);
4293 radioService[slotId]->checkReturnStatus(retStatus);
4294 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004295 RLOGE("getFacilityLockForAppResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004296 slotId);
4297 }
4298
4299 return 0;
4300}
4301
Amit Mahajan759786a2017-03-03 17:35:47 -08004302int radio::setFacilityLockForAppResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004303 int responseType, int serial, RIL_Errno e,
4304 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004305#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004306 RLOGD("setFacilityLockForAppResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004307#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004308
4309 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004310 RadioResponseInfo responseInfo = {};
Naveen Kalla346bbc02017-03-16 12:55:55 -07004311 int ret = responseIntOrEmpty(responseInfo, serial, responseType, e, response, responseLen);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004312 Return<void> retStatus
4313 = radioService[slotId]->mRadioResponse->setFacilityLockForAppResponse(responseInfo,
4314 ret);
4315 radioService[slotId]->checkReturnStatus(retStatus);
4316 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004317 RLOGE("setFacilityLockForAppResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004318 slotId);
4319 }
4320
4321 return 0;
4322}
4323
Amit Mahajan759786a2017-03-03 17:35:47 -08004324int radio::setBarringPasswordResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004325 int responseType, int serial, RIL_Errno e,
4326 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004327#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004328 RLOGD("acceptCallResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004329#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004330
4331 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004332 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004333 populateResponseInfo(responseInfo, serial, responseType, e);
4334 Return<void> retStatus
4335 = radioService[slotId]->mRadioResponse->setBarringPasswordResponse(responseInfo);
4336 radioService[slotId]->checkReturnStatus(retStatus);
4337 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004338 RLOGE("setBarringPasswordResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004339 slotId);
4340 }
4341
4342 return 0;
4343}
4344
Amit Mahajan759786a2017-03-03 17:35:47 -08004345int radio::getNetworkSelectionModeResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004346 int responseType, int serial, RIL_Errno e, void *response,
4347 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004348#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004349 RLOGD("getNetworkSelectionModeResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004350#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004351
4352 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004353 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004354 populateResponseInfo(responseInfo, serial, responseType, e);
4355 bool manual = false;
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004356 if (response == NULL || responseLen != sizeof(int)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004357 RLOGE("getNetworkSelectionModeResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004358 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
4359 } else {
4360 int *pInt = (int *) response;
4361 manual = pInt[0] == 1 ? true : false;
4362 }
4363 Return<void> retStatus
4364 = radioService[slotId]->mRadioResponse->getNetworkSelectionModeResponse(
4365 responseInfo,
4366 manual);
4367 radioService[slotId]->checkReturnStatus(retStatus);
4368 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004369 RLOGE("getNetworkSelectionModeResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004370 slotId);
4371 }
4372
4373 return 0;
4374}
4375
Amit Mahajan759786a2017-03-03 17:35:47 -08004376int radio::setNetworkSelectionModeAutomaticResponse(int slotId, int responseType, int serial,
4377 RIL_Errno e, void *response,
4378 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004379#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004380 RLOGD("setNetworkSelectionModeAutomaticResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004381#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004382
4383 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004384 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004385 populateResponseInfo(responseInfo, serial, responseType, e);
4386 Return<void> retStatus
4387 = radioService[slotId]->mRadioResponse->setNetworkSelectionModeAutomaticResponse(
4388 responseInfo);
4389 radioService[slotId]->checkReturnStatus(retStatus);
4390 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004391 RLOGE("setNetworkSelectionModeAutomaticResponse: radioService[%d]->mRadioResponse "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004392 "== NULL", slotId);
4393 }
4394
4395 return 0;
4396}
4397
Amit Mahajan759786a2017-03-03 17:35:47 -08004398int radio::setNetworkSelectionModeManualResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004399 int responseType, int serial, RIL_Errno e,
4400 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004401#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004402 RLOGD("setNetworkSelectionModeManualResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004403#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004404
4405 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004406 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004407 populateResponseInfo(responseInfo, serial, responseType, e);
4408 Return<void> retStatus
4409 = radioService[slotId]->mRadioResponse->setNetworkSelectionModeManualResponse(
4410 responseInfo);
4411 radioService[slotId]->checkReturnStatus(retStatus);
4412 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004413 RLOGE("acceptCallResponse: radioService[%d]->setNetworkSelectionModeManualResponse "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004414 "== NULL", slotId);
4415 }
4416
4417 return 0;
4418}
4419
Jack Yuf68e0da2017-02-07 14:53:09 -08004420int convertOperatorStatusToInt(const char *str) {
4421 if (strncmp("unknown", str, 9) == 0) {
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004422 return (int) OperatorStatus::UNKNOWN;
Jack Yuf68e0da2017-02-07 14:53:09 -08004423 } else if (strncmp("available", str, 9) == 0) {
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004424 return (int) OperatorStatus::AVAILABLE;
Jack Yuf68e0da2017-02-07 14:53:09 -08004425 } else if (strncmp("current", str, 9) == 0) {
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004426 return (int) OperatorStatus::CURRENT;
Jack Yuf68e0da2017-02-07 14:53:09 -08004427 } else if (strncmp("forbidden", str, 9) == 0) {
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004428 return (int) OperatorStatus::FORBIDDEN;
4429 } else {
4430 return -1;
4431 }
4432}
4433
Amit Mahajan759786a2017-03-03 17:35:47 -08004434int radio::getAvailableNetworksResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004435 int responseType, int serial, RIL_Errno e, void *response,
4436 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004437#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004438 RLOGD("getAvailableNetworksResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004439#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004440
4441 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004442 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004443 populateResponseInfo(responseInfo, serial, responseType, e);
4444 hidl_vec<OperatorInfo> networks;
Amit Mahajan13058cb2017-06-07 23:10:27 -07004445 if ((response == NULL && responseLen != 0)
4446 || responseLen % (4 * sizeof(char *))!= 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004447 RLOGE("getAvailableNetworksResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004448 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
4449 } else {
4450 char **resp = (char **) response;
4451 int numStrings = responseLen / sizeof(char *);
4452 networks.resize(numStrings/4);
Jayachandran Ce0d755c2017-03-01 18:26:50 -08004453 for (int i = 0, j = 0; i < numStrings; i = i + 4, j++) {
4454 networks[j].alphaLong = convertCharPtrToHidlString(resp[i]);
4455 networks[j].alphaShort = convertCharPtrToHidlString(resp[i + 1]);
4456 networks[j].operatorNumeric = convertCharPtrToHidlString(resp[i + 2]);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004457 int status = convertOperatorStatusToInt(resp[i + 3]);
4458 if (status == -1) {
4459 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
4460 } else {
Jayachandran Ce0d755c2017-03-01 18:26:50 -08004461 networks[j].status = (OperatorStatus) status;
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004462 }
4463 }
4464 }
4465 Return<void> retStatus
4466 = radioService[slotId]->mRadioResponse->getAvailableNetworksResponse(responseInfo,
4467 networks);
4468 radioService[slotId]->checkReturnStatus(retStatus);
4469 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004470 RLOGE("getAvailableNetworksResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004471 slotId);
4472 }
4473
4474 return 0;
4475}
4476
Amit Mahajan759786a2017-03-03 17:35:47 -08004477int radio::startDtmfResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004478 int responseType, int serial, RIL_Errno e,
4479 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004480#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004481 RLOGD("startDtmfResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004482#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004483
4484 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004485 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004486 populateResponseInfo(responseInfo, serial, responseType, e);
4487 Return<void> retStatus
4488 = radioService[slotId]->mRadioResponse->startDtmfResponse(responseInfo);
4489 radioService[slotId]->checkReturnStatus(retStatus);
4490 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004491 RLOGE("startDtmfResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004492 }
4493
4494 return 0;
4495}
4496
Amit Mahajan759786a2017-03-03 17:35:47 -08004497int radio::stopDtmfResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004498 int responseType, int serial, RIL_Errno e,
4499 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004500#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004501 RLOGD("stopDtmfResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004502#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004503
4504 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004505 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004506 populateResponseInfo(responseInfo, serial, responseType, e);
4507 Return<void> retStatus
4508 = radioService[slotId]->mRadioResponse->stopDtmfResponse(responseInfo);
4509 radioService[slotId]->checkReturnStatus(retStatus);
4510 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004511 RLOGE("stopDtmfResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004512 }
4513
4514 return 0;
4515}
4516
Amit Mahajan759786a2017-03-03 17:35:47 -08004517int radio::getBasebandVersionResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004518 int responseType, int serial, RIL_Errno e,
4519 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004520#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004521 RLOGD("getBasebandVersionResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004522#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004523
4524 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004525 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004526 populateResponseInfo(responseInfo, serial, responseType, e);
4527 Return<void> retStatus
4528 = radioService[slotId]->mRadioResponse->getBasebandVersionResponse(responseInfo,
4529 convertCharPtrToHidlString((char *) response));
4530 radioService[slotId]->checkReturnStatus(retStatus);
4531 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004532 RLOGE("getBasebandVersionResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004533 }
4534
4535 return 0;
4536}
4537
Amit Mahajan759786a2017-03-03 17:35:47 -08004538int radio::separateConnectionResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004539 int responseType, int serial, RIL_Errno e,
4540 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004541#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004542 RLOGD("separateConnectionResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004543#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004544
4545 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004546 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004547 populateResponseInfo(responseInfo, serial, responseType, e);
4548 Return<void> retStatus
4549 = radioService[slotId]->mRadioResponse->separateConnectionResponse(responseInfo);
4550 radioService[slotId]->checkReturnStatus(retStatus);
4551 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004552 RLOGE("separateConnectionResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004553 slotId);
4554 }
4555
4556 return 0;
4557}
4558
Amit Mahajan759786a2017-03-03 17:35:47 -08004559int radio::setMuteResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004560 int responseType, int serial, RIL_Errno e,
4561 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004562#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004563 RLOGD("setMuteResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004564#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004565
4566 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004567 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004568 populateResponseInfo(responseInfo, serial, responseType, e);
4569 Return<void> retStatus
4570 = radioService[slotId]->mRadioResponse->setMuteResponse(responseInfo);
4571 radioService[slotId]->checkReturnStatus(retStatus);
4572 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004573 RLOGE("setMuteResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004574 }
4575
4576 return 0;
4577}
4578
Amit Mahajan759786a2017-03-03 17:35:47 -08004579int radio::getMuteResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004580 int responseType, int serial, RIL_Errno e, void *response,
4581 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004582#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004583 RLOGD("getMuteResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004584#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004585
4586 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004587 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004588 populateResponseInfo(responseInfo, serial, responseType, e);
4589 bool enable = false;
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004590 if (response == NULL || responseLen != sizeof(int)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004591 RLOGE("getMuteResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004592 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
4593 } else {
4594 int *pInt = (int *) response;
4595 enable = pInt[0] == 1 ? true : false;
4596 }
4597 Return<void> retStatus = radioService[slotId]->mRadioResponse->getMuteResponse(responseInfo,
4598 enable);
4599 radioService[slotId]->checkReturnStatus(retStatus);
4600 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004601 RLOGE("getMuteResponse: 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::getClipResponse(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("getClipResponse: 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 int ret = responseInt(responseInfo, serial, responseType, e, response, responseLen);
4617 Return<void> retStatus = radioService[slotId]->mRadioResponse->getClipResponse(responseInfo,
4618 (ClipStatus) ret);
4619 radioService[slotId]->checkReturnStatus(retStatus);
4620 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004621 RLOGE("getClipResponse: 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::getDataCallListResponse(int slotId,
Amit Mahajan3df62912017-02-10 01:35:55 +00004628 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("getDataCallListResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004632#endif
Amit Mahajan3df62912017-02-10 01:35:55 +00004633
4634 if (radioService[slotId]->mRadioResponse != NULL) {
Amit Mahajan3da9ac02017-02-13 13:41:28 -08004635 RadioResponseInfo responseInfo = {};
Amit Mahajan3df62912017-02-10 01:35:55 +00004636 populateResponseInfo(responseInfo, serial, responseType, e);
4637
4638 hidl_vec<SetupDataCallResult> ret;
Amit Mahajan13058cb2017-06-07 23:10:27 -07004639 if ((response == NULL && responseLen != 0)
4640 || responseLen % sizeof(RIL_Data_Call_Response_v11) != 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004641 RLOGE("getDataCallListResponse: invalid response");
Amit Mahajan3df62912017-02-10 01:35:55 +00004642 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
4643 } else {
4644 convertRilDataCallListToHal(response, responseLen, ret);
4645 }
4646
4647 Return<void> retStatus = radioService[slotId]->mRadioResponse->getDataCallListResponse(
4648 responseInfo, ret);
4649 radioService[slotId]->checkReturnStatus(retStatus);
4650 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004651 RLOGE("getDataCallListResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Amit Mahajan3df62912017-02-10 01:35:55 +00004652 }
4653
4654 return 0;
4655}
4656
Amit Mahajan759786a2017-03-03 17:35:47 -08004657int radio::setSuppServiceNotificationsResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004658 int responseType, int serial, RIL_Errno e,
4659 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004660#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004661 RLOGD("setSuppServiceNotificationsResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004662#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004663
4664 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004665 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004666 populateResponseInfo(responseInfo, serial, responseType, e);
4667 Return<void> retStatus
4668 = radioService[slotId]->mRadioResponse->setSuppServiceNotificationsResponse(
4669 responseInfo);
4670 radioService[slotId]->checkReturnStatus(retStatus);
4671 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004672 RLOGE("setSuppServiceNotificationsResponse: radioService[%d]->mRadioResponse "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004673 "== NULL", slotId);
4674 }
4675
4676 return 0;
4677}
4678
Amit Mahajan759786a2017-03-03 17:35:47 -08004679int radio::deleteSmsOnSimResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004680 int responseType, int serial, RIL_Errno e,
4681 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004682#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004683 RLOGD("deleteSmsOnSimResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004684#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004685
4686 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004687 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004688 populateResponseInfo(responseInfo, serial, responseType, e);
4689 Return<void> retStatus
4690 = radioService[slotId]->mRadioResponse->deleteSmsOnSimResponse(responseInfo);
4691 radioService[slotId]->checkReturnStatus(retStatus);
4692 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004693 RLOGE("deleteSmsOnSimResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004694 }
4695
4696 return 0;
4697}
4698
Amit Mahajan759786a2017-03-03 17:35:47 -08004699int radio::setBandModeResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004700 int responseType, int serial, RIL_Errno e,
4701 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004702#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004703 RLOGD("setBandModeResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004704#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004705
4706 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004707 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004708 populateResponseInfo(responseInfo, serial, responseType, e);
4709 Return<void> retStatus
4710 = radioService[slotId]->mRadioResponse->setBandModeResponse(responseInfo);
4711 radioService[slotId]->checkReturnStatus(retStatus);
4712 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004713 RLOGE("setBandModeResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004714 }
4715
4716 return 0;
4717}
4718
Amit Mahajan759786a2017-03-03 17:35:47 -08004719int radio::writeSmsToSimResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004720 int responseType, int serial, RIL_Errno e,
4721 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004722#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004723 RLOGD("writeSmsToSimResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004724#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004725
4726 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004727 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004728 int ret = responseInt(responseInfo, serial, responseType, e, response, responseLen);
4729 Return<void> retStatus
4730 = radioService[slotId]->mRadioResponse->writeSmsToSimResponse(responseInfo, ret);
4731 radioService[slotId]->checkReturnStatus(retStatus);
4732 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004733 RLOGE("writeSmsToSimResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004734 }
4735
4736 return 0;
4737}
4738
Amit Mahajan759786a2017-03-03 17:35:47 -08004739int radio::getAvailableBandModesResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004740 int responseType, int serial, RIL_Errno e, void *response,
4741 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004742#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004743 RLOGD("getAvailableBandModesResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004744#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004745
4746 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004747 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004748 populateResponseInfo(responseInfo, serial, responseType, e);
4749 hidl_vec<RadioBandMode> modes;
Amit Mahajan13058cb2017-06-07 23:10:27 -07004750 if ((response == NULL && responseLen != 0)|| responseLen % sizeof(int) != 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004751 RLOGE("getAvailableBandModesResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004752 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
4753 } else {
4754 int *pInt = (int *) response;
4755 int numInts = responseLen / sizeof(int);
4756 modes.resize(numInts);
4757 for (int i = 0; i < numInts; i++) {
4758 modes[i] = (RadioBandMode) pInt[i];
4759 }
4760 }
4761 Return<void> retStatus
4762 = radioService[slotId]->mRadioResponse->getAvailableBandModesResponse(responseInfo,
4763 modes);
4764 radioService[slotId]->checkReturnStatus(retStatus);
4765 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004766 RLOGE("getAvailableBandModesResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004767 slotId);
4768 }
4769
4770 return 0;
4771}
4772
Amit Mahajan759786a2017-03-03 17:35:47 -08004773int radio::sendEnvelopeResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004774 int responseType, int serial, RIL_Errno e,
4775 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004776#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004777 RLOGD("sendEnvelopeResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004778#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004779
4780 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004781 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004782 populateResponseInfo(responseInfo, serial, responseType, e);
4783 Return<void> retStatus
4784 = radioService[slotId]->mRadioResponse->sendEnvelopeResponse(responseInfo,
4785 convertCharPtrToHidlString((char *) response));
4786 radioService[slotId]->checkReturnStatus(retStatus);
4787 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004788 RLOGE("sendEnvelopeResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004789 }
4790
4791 return 0;
4792}
4793
Amit Mahajan759786a2017-03-03 17:35:47 -08004794int radio::sendTerminalResponseToSimResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004795 int responseType, int serial, RIL_Errno e,
4796 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004797#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004798 RLOGD("sendTerminalResponseToSimResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004799#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004800
4801 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004802 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004803 populateResponseInfo(responseInfo, serial, responseType, e);
4804 Return<void> retStatus
4805 = radioService[slotId]->mRadioResponse->sendTerminalResponseToSimResponse(
4806 responseInfo);
4807 radioService[slotId]->checkReturnStatus(retStatus);
4808 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004809 RLOGE("sendTerminalResponseToSimResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004810 slotId);
4811 }
4812
4813 return 0;
4814}
4815
Amit Mahajan759786a2017-03-03 17:35:47 -08004816int radio::handleStkCallSetupRequestFromSimResponse(int slotId,
4817 int responseType, int serial,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004818 RIL_Errno e, void *response,
4819 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004820#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004821 RLOGD("handleStkCallSetupRequestFromSimResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004822#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004823
4824 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004825 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004826 populateResponseInfo(responseInfo, serial, responseType, e);
4827 Return<void> retStatus
4828 = radioService[slotId]->mRadioResponse->handleStkCallSetupRequestFromSimResponse(
4829 responseInfo);
4830 radioService[slotId]->checkReturnStatus(retStatus);
4831 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004832 RLOGE("handleStkCallSetupRequestFromSimResponse: radioService[%d]->mRadioResponse "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004833 "== NULL", slotId);
4834 }
4835
4836 return 0;
4837}
4838
Amit Mahajan759786a2017-03-03 17:35:47 -08004839int radio::explicitCallTransferResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004840 int responseType, int serial, RIL_Errno e,
4841 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004842#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004843 RLOGD("explicitCallTransferResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004844#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004845
4846 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004847 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004848 populateResponseInfo(responseInfo, serial, responseType, e);
4849 Return<void> retStatus
4850 = radioService[slotId]->mRadioResponse->explicitCallTransferResponse(responseInfo);
4851 radioService[slotId]->checkReturnStatus(retStatus);
4852 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004853 RLOGE("explicitCallTransferResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004854 slotId);
4855 }
4856
4857 return 0;
4858}
4859
Amit Mahajan759786a2017-03-03 17:35:47 -08004860int radio::setPreferredNetworkTypeResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004861 int responseType, int serial, RIL_Errno e,
4862 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004863#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004864 RLOGD("setPreferredNetworkTypeResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004865#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004866
4867 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004868 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004869 populateResponseInfo(responseInfo, serial, responseType, e);
4870 Return<void> retStatus
4871 = radioService[slotId]->mRadioResponse->setPreferredNetworkTypeResponse(
4872 responseInfo);
4873 radioService[slotId]->checkReturnStatus(retStatus);
4874 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004875 RLOGE("setPreferredNetworkTypeResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004876 slotId);
4877 }
4878
4879 return 0;
4880}
4881
4882
Amit Mahajan759786a2017-03-03 17:35:47 -08004883int radio::getPreferredNetworkTypeResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004884 int responseType, int serial, RIL_Errno e,
4885 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004886#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004887 RLOGD("getPreferredNetworkTypeResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004888#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004889
4890 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004891 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004892 int ret = responseInt(responseInfo, serial, responseType, e, response, responseLen);
4893 Return<void> retStatus
4894 = radioService[slotId]->mRadioResponse->getPreferredNetworkTypeResponse(
4895 responseInfo, (PreferredNetworkType) ret);
4896 radioService[slotId]->checkReturnStatus(retStatus);
4897 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004898 RLOGE("getPreferredNetworkTypeResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004899 slotId);
4900 }
4901
4902 return 0;
4903}
4904
Amit Mahajan759786a2017-03-03 17:35:47 -08004905int radio::getNeighboringCidsResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004906 int responseType, int serial, RIL_Errno e,
4907 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004908#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004909 RLOGD("getNeighboringCidsResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004910#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004911
4912 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004913 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004914 populateResponseInfo(responseInfo, serial, responseType, e);
4915 hidl_vec<NeighboringCell> cells;
4916
Amit Mahajan13058cb2017-06-07 23:10:27 -07004917 if ((response == NULL && responseLen != 0)
4918 || responseLen % sizeof(RIL_NeighboringCell *) != 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004919 RLOGE("getNeighboringCidsResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004920 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
4921 } else {
4922 int num = responseLen / sizeof(RIL_NeighboringCell *);
4923 cells.resize(num);
4924 for (int i = 0 ; i < num; i++) {
4925 RIL_NeighboringCell *resp = ((RIL_NeighboringCell **) response)[i];
4926 cells[i].cid = convertCharPtrToHidlString(resp->cid);
4927 cells[i].rssi = resp->rssi;
4928 }
4929 }
4930
4931 Return<void> retStatus
4932 = radioService[slotId]->mRadioResponse->getNeighboringCidsResponse(responseInfo,
4933 cells);
4934 radioService[slotId]->checkReturnStatus(retStatus);
4935 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004936 RLOGE("getNeighboringCidsResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004937 slotId);
4938 }
4939
4940 return 0;
4941}
4942
Amit Mahajan759786a2017-03-03 17:35:47 -08004943int radio::setLocationUpdatesResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004944 int responseType, int serial, RIL_Errno e,
4945 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004946#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004947 RLOGD("setLocationUpdatesResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004948#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004949
4950 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004951 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004952 populateResponseInfo(responseInfo, serial, responseType, e);
4953 Return<void> retStatus
4954 = radioService[slotId]->mRadioResponse->setLocationUpdatesResponse(responseInfo);
4955 radioService[slotId]->checkReturnStatus(retStatus);
4956 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004957 RLOGE("setLocationUpdatesResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004958 slotId);
4959 }
4960
4961 return 0;
4962}
4963
Amit Mahajan759786a2017-03-03 17:35:47 -08004964int radio::setCdmaSubscriptionSourceResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004965 int responseType, int serial, RIL_Errno e,
4966 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004967#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004968 RLOGD("setCdmaSubscriptionSourceResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004969#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004970
4971 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004972 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004973 populateResponseInfo(responseInfo, serial, responseType, e);
4974 Return<void> retStatus
4975 = radioService[slotId]->mRadioResponse->setCdmaSubscriptionSourceResponse(
4976 responseInfo);
4977 radioService[slotId]->checkReturnStatus(retStatus);
4978 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08004979 RLOGE("setCdmaSubscriptionSourceResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004980 slotId);
4981 }
4982
4983 return 0;
4984}
4985
Amit Mahajan759786a2017-03-03 17:35:47 -08004986int radio::setCdmaRoamingPreferenceResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004987 int responseType, int serial, RIL_Errno e,
4988 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07004989#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08004990 RLOGD("setCdmaRoamingPreferenceResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07004991#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004992
4993 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08004994 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08004995 populateResponseInfo(responseInfo, serial, responseType, e);
4996 Return<void> retStatus
4997 = radioService[slotId]->mRadioResponse->setCdmaRoamingPreferenceResponse(
4998 responseInfo);
4999 radioService[slotId]->checkReturnStatus(retStatus);
5000 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005001 RLOGE("setCdmaRoamingPreferenceResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005002 slotId);
5003 }
5004
5005 return 0;
5006}
5007
Amit Mahajan759786a2017-03-03 17:35:47 -08005008int radio::getCdmaRoamingPreferenceResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005009 int responseType, int serial, RIL_Errno e,
5010 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005011#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005012 RLOGD("getCdmaRoamingPreferenceResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005013#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005014
5015 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005016 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005017 int ret = responseInt(responseInfo, serial, responseType, e, response, responseLen);
5018 Return<void> retStatus
5019 = radioService[slotId]->mRadioResponse->getCdmaRoamingPreferenceResponse(
5020 responseInfo, (CdmaRoamingType) ret);
5021 radioService[slotId]->checkReturnStatus(retStatus);
5022 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005023 RLOGE("getCdmaRoamingPreferenceResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005024 slotId);
5025 }
5026
5027 return 0;
5028}
5029
Amit Mahajan759786a2017-03-03 17:35:47 -08005030int radio::setTTYModeResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005031 int responseType, int serial, RIL_Errno e,
5032 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005033#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005034 RLOGD("setTTYModeResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005035#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005036
5037 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005038 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005039 populateResponseInfo(responseInfo, serial, responseType, e);
5040 Return<void> retStatus
5041 = radioService[slotId]->mRadioResponse->setTTYModeResponse(responseInfo);
5042 radioService[slotId]->checkReturnStatus(retStatus);
5043 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005044 RLOGE("setTTYModeResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005045 }
5046
5047 return 0;
5048}
5049
Amit Mahajan759786a2017-03-03 17:35:47 -08005050int radio::getTTYModeResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005051 int responseType, int serial, RIL_Errno e,
5052 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005053#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005054 RLOGD("getTTYModeResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005055#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005056
5057 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005058 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005059 int ret = responseInt(responseInfo, serial, responseType, e, response, responseLen);
5060 Return<void> retStatus
5061 = radioService[slotId]->mRadioResponse->getTTYModeResponse(responseInfo,
5062 (TtyMode) ret);
5063 radioService[slotId]->checkReturnStatus(retStatus);
5064 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005065 RLOGE("getTTYModeResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005066 }
5067
5068 return 0;
5069}
5070
Amit Mahajan759786a2017-03-03 17:35:47 -08005071int radio::setPreferredVoicePrivacyResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005072 int responseType, int serial, RIL_Errno e,
5073 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005074#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005075 RLOGD("setPreferredVoicePrivacyResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005076#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005077
5078 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005079 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005080 populateResponseInfo(responseInfo, serial, responseType, e);
5081 Return<void> retStatus
5082 = radioService[slotId]->mRadioResponse->setPreferredVoicePrivacyResponse(
5083 responseInfo);
5084 radioService[slotId]->checkReturnStatus(retStatus);
5085 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005086 RLOGE("setPreferredVoicePrivacyResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005087 slotId);
5088 }
5089
5090 return 0;
5091}
5092
Amit Mahajan759786a2017-03-03 17:35:47 -08005093int radio::getPreferredVoicePrivacyResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005094 int responseType, int serial, RIL_Errno e,
5095 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005096#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005097 RLOGD("getPreferredVoicePrivacyResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005098#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005099
5100 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005101 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005102 populateResponseInfo(responseInfo, serial, responseType, e);
5103 bool enable = false;
5104 int numInts = responseLen / sizeof(int);
5105 if (response == NULL || numInts != 1) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005106 RLOGE("getPreferredVoicePrivacyResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005107 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
5108 } else {
5109 int *pInt = (int *) response;
5110 enable = pInt[0] == 1 ? true : false;
5111 }
5112 Return<void> retStatus
5113 = radioService[slotId]->mRadioResponse->getPreferredVoicePrivacyResponse(
5114 responseInfo, enable);
5115 radioService[slotId]->checkReturnStatus(retStatus);
5116 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005117 RLOGE("getPreferredVoicePrivacyResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005118 slotId);
5119 }
5120
5121 return 0;
5122}
5123
Amit Mahajan759786a2017-03-03 17:35:47 -08005124int radio::sendCDMAFeatureCodeResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005125 int responseType, int serial, RIL_Errno e,
5126 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005127#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005128 RLOGD("sendCDMAFeatureCodeResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005129#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005130
5131 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005132 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005133 populateResponseInfo(responseInfo, serial, responseType, e);
5134 Return<void> retStatus
5135 = radioService[slotId]->mRadioResponse->sendCDMAFeatureCodeResponse(responseInfo);
5136 radioService[slotId]->checkReturnStatus(retStatus);
5137 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005138 RLOGE("sendCDMAFeatureCodeResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005139 slotId);
5140 }
5141
5142 return 0;
5143}
5144
Amit Mahajan759786a2017-03-03 17:35:47 -08005145int radio::sendBurstDtmfResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005146 int responseType, int serial, RIL_Errno e,
5147 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005148#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005149 RLOGD("sendBurstDtmfResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005150#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005151
5152 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005153 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005154 populateResponseInfo(responseInfo, serial, responseType, e);
5155 Return<void> retStatus
5156 = radioService[slotId]->mRadioResponse->sendBurstDtmfResponse(responseInfo);
5157 radioService[slotId]->checkReturnStatus(retStatus);
5158 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005159 RLOGE("sendBurstDtmfResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005160 }
5161
5162 return 0;
5163}
5164
Amit Mahajan759786a2017-03-03 17:35:47 -08005165int radio::sendCdmaSmsResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005166 int responseType, int serial, RIL_Errno e, void *response,
5167 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005168#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005169 RLOGD("sendCdmaSmsResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005170#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005171
5172 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005173 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005174 SendSmsResult result = makeSendSmsResult(responseInfo, serial, responseType, e, response,
5175 responseLen);
5176
5177 Return<void> retStatus
5178 = radioService[slotId]->mRadioResponse->sendCdmaSmsResponse(responseInfo, result);
5179 radioService[slotId]->checkReturnStatus(retStatus);
5180 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005181 RLOGE("sendCdmaSmsResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005182 }
5183
5184 return 0;
5185}
5186
Amit Mahajan759786a2017-03-03 17:35:47 -08005187int radio::acknowledgeLastIncomingCdmaSmsResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005188 int responseType, int serial, RIL_Errno e,
5189 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005190#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005191 RLOGD("acknowledgeLastIncomingCdmaSmsResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005192#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005193
5194 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005195 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005196 populateResponseInfo(responseInfo, serial, responseType, e);
5197 Return<void> retStatus
5198 = radioService[slotId]->mRadioResponse->acknowledgeLastIncomingCdmaSmsResponse(
5199 responseInfo);
5200 radioService[slotId]->checkReturnStatus(retStatus);
5201 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005202 RLOGE("acknowledgeLastIncomingCdmaSmsResponse: radioService[%d]->mRadioResponse "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005203 "== NULL", slotId);
5204 }
5205
5206 return 0;
5207}
5208
Amit Mahajan759786a2017-03-03 17:35:47 -08005209int radio::getGsmBroadcastConfigResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005210 int responseType, int serial, RIL_Errno e,
5211 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005212#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005213 RLOGD("getGsmBroadcastConfigResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005214#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005215
5216 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005217 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005218 populateResponseInfo(responseInfo, serial, responseType, e);
5219 hidl_vec<GsmBroadcastSmsConfigInfo> configs;
5220
Amit Mahajan13058cb2017-06-07 23:10:27 -07005221 if ((response == NULL && responseLen != 0)
5222 || responseLen % sizeof(RIL_GSM_BroadcastSmsConfigInfo *) != 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005223 RLOGE("getGsmBroadcastConfigResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005224 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
5225 } else {
5226 int num = responseLen / sizeof(RIL_GSM_BroadcastSmsConfigInfo *);
5227 configs.resize(num);
5228 for (int i = 0 ; i < num; i++) {
5229 RIL_GSM_BroadcastSmsConfigInfo *resp =
5230 ((RIL_GSM_BroadcastSmsConfigInfo **) response)[i];
5231 configs[i].fromServiceId = resp->fromServiceId;
5232 configs[i].toServiceId = resp->toServiceId;
5233 configs[i].fromCodeScheme = resp->fromCodeScheme;
5234 configs[i].toCodeScheme = resp->toCodeScheme;
5235 configs[i].selected = resp->selected == 1 ? true : false;
5236 }
5237 }
5238
5239 Return<void> retStatus
5240 = radioService[slotId]->mRadioResponse->getGsmBroadcastConfigResponse(responseInfo,
5241 configs);
5242 radioService[slotId]->checkReturnStatus(retStatus);
5243 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005244 RLOGE("getGsmBroadcastConfigResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005245 slotId);
5246 }
5247
5248 return 0;
5249}
5250
Amit Mahajan759786a2017-03-03 17:35:47 -08005251int radio::setGsmBroadcastConfigResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005252 int responseType, int serial, RIL_Errno e,
5253 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005254#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005255 RLOGD("setGsmBroadcastConfigResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005256#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005257
5258 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005259 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005260 populateResponseInfo(responseInfo, serial, responseType, e);
5261 Return<void> retStatus
5262 = radioService[slotId]->mRadioResponse->setGsmBroadcastConfigResponse(responseInfo);
5263 radioService[slotId]->checkReturnStatus(retStatus);
5264 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005265 RLOGE("setGsmBroadcastConfigResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005266 slotId);
5267 }
5268
5269 return 0;
5270}
5271
Amit Mahajan759786a2017-03-03 17:35:47 -08005272int radio::setGsmBroadcastActivationResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005273 int responseType, int serial, RIL_Errno e,
5274 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005275#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005276 RLOGD("setGsmBroadcastActivationResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005277#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005278
5279 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005280 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005281 populateResponseInfo(responseInfo, serial, responseType, e);
5282 Return<void> retStatus
5283 = radioService[slotId]->mRadioResponse->setGsmBroadcastActivationResponse(
5284 responseInfo);
5285 radioService[slotId]->checkReturnStatus(retStatus);
5286 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005287 RLOGE("setGsmBroadcastActivationResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005288 slotId);
5289 }
5290
5291 return 0;
5292}
5293
Amit Mahajan759786a2017-03-03 17:35:47 -08005294int radio::getCdmaBroadcastConfigResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005295 int responseType, int serial, RIL_Errno e,
5296 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005297#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005298 RLOGD("getCdmaBroadcastConfigResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005299#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005300
5301 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005302 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005303 populateResponseInfo(responseInfo, serial, responseType, e);
5304 hidl_vec<CdmaBroadcastSmsConfigInfo> configs;
5305
Amit Mahajan13058cb2017-06-07 23:10:27 -07005306 if ((response == NULL && responseLen != 0)
5307 || responseLen % sizeof(RIL_CDMA_BroadcastSmsConfigInfo *) != 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005308 RLOGE("getCdmaBroadcastConfigResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005309 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
5310 } else {
5311 int num = responseLen / sizeof(RIL_CDMA_BroadcastSmsConfigInfo *);
5312 configs.resize(num);
5313 for (int i = 0 ; i < num; i++) {
5314 RIL_CDMA_BroadcastSmsConfigInfo *resp =
5315 ((RIL_CDMA_BroadcastSmsConfigInfo **) response)[i];
5316 configs[i].serviceCategory = resp->service_category;
5317 configs[i].language = resp->language;
5318 configs[i].selected = resp->selected == 1 ? true : false;
5319 }
5320 }
5321
5322 Return<void> retStatus
5323 = radioService[slotId]->mRadioResponse->getCdmaBroadcastConfigResponse(responseInfo,
5324 configs);
5325 radioService[slotId]->checkReturnStatus(retStatus);
5326 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005327 RLOGE("getCdmaBroadcastConfigResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005328 slotId);
5329 }
5330
5331 return 0;
5332}
5333
Amit Mahajan759786a2017-03-03 17:35:47 -08005334int radio::setCdmaBroadcastConfigResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005335 int responseType, int serial, RIL_Errno e,
5336 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005337#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005338 RLOGD("setCdmaBroadcastConfigResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005339#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005340
5341 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005342 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005343 populateResponseInfo(responseInfo, serial, responseType, e);
5344 Return<void> retStatus
5345 = radioService[slotId]->mRadioResponse->setCdmaBroadcastConfigResponse(
5346 responseInfo);
5347 radioService[slotId]->checkReturnStatus(retStatus);
5348 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005349 RLOGE("setCdmaBroadcastConfigResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005350 slotId);
5351 }
5352
5353 return 0;
5354}
5355
Amit Mahajan759786a2017-03-03 17:35:47 -08005356int radio::setCdmaBroadcastActivationResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005357 int responseType, int serial, RIL_Errno e,
5358 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005359#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005360 RLOGD("setCdmaBroadcastActivationResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005361#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005362
5363 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005364 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005365 populateResponseInfo(responseInfo, serial, responseType, e);
5366 Return<void> retStatus
5367 = radioService[slotId]->mRadioResponse->setCdmaBroadcastActivationResponse(
5368 responseInfo);
5369 radioService[slotId]->checkReturnStatus(retStatus);
5370 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005371 RLOGE("setCdmaBroadcastActivationResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005372 slotId);
5373 }
5374
5375 return 0;
5376}
5377
Amit Mahajan759786a2017-03-03 17:35:47 -08005378int radio::getCDMASubscriptionResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005379 int responseType, int serial, RIL_Errno e, void *response,
5380 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005381#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005382 RLOGD("getCDMASubscriptionResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005383#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005384
5385 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005386 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005387 populateResponseInfo(responseInfo, serial, responseType, e);
5388
5389 int numStrings = responseLen / sizeof(char *);
5390 hidl_string emptyString;
5391 if (response == NULL || numStrings != 5) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005392 RLOGE("getOperatorResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005393 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
5394 Return<void> retStatus
5395 = radioService[slotId]->mRadioResponse->getCDMASubscriptionResponse(
5396 responseInfo, emptyString, emptyString, emptyString, emptyString, emptyString);
5397 radioService[slotId]->checkReturnStatus(retStatus);
5398 } else {
5399 char **resp = (char **) response;
5400 Return<void> retStatus
5401 = radioService[slotId]->mRadioResponse->getCDMASubscriptionResponse(
5402 responseInfo,
5403 convertCharPtrToHidlString(resp[0]),
5404 convertCharPtrToHidlString(resp[1]),
5405 convertCharPtrToHidlString(resp[2]),
5406 convertCharPtrToHidlString(resp[3]),
5407 convertCharPtrToHidlString(resp[4]));
5408 radioService[slotId]->checkReturnStatus(retStatus);
5409 }
5410 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005411 RLOGE("getCDMASubscriptionResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005412 slotId);
5413 }
5414
5415 return 0;
5416}
5417
Amit Mahajan759786a2017-03-03 17:35:47 -08005418int radio::writeSmsToRuimResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005419 int responseType, int serial, RIL_Errno e,
5420 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005421#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005422 RLOGD("writeSmsToRuimResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005423#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005424
5425 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005426 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005427 int ret = responseInt(responseInfo, serial, responseType, e, response, responseLen);
5428 Return<void> retStatus
5429 = radioService[slotId]->mRadioResponse->writeSmsToRuimResponse(responseInfo, ret);
5430 radioService[slotId]->checkReturnStatus(retStatus);
5431 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005432 RLOGE("writeSmsToRuimResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005433 }
5434
5435 return 0;
5436}
5437
Amit Mahajan759786a2017-03-03 17:35:47 -08005438int radio::deleteSmsOnRuimResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005439 int responseType, int serial, RIL_Errno e,
5440 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005441#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005442 RLOGD("deleteSmsOnRuimResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005443#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005444
5445 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005446 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005447 populateResponseInfo(responseInfo, serial, responseType, e);
5448 Return<void> retStatus
5449 = radioService[slotId]->mRadioResponse->deleteSmsOnRuimResponse(responseInfo);
5450 radioService[slotId]->checkReturnStatus(retStatus);
5451 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005452 RLOGE("deleteSmsOnRuimResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005453 }
5454
5455 return 0;
5456}
5457
Amit Mahajan759786a2017-03-03 17:35:47 -08005458int radio::getDeviceIdentityResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005459 int responseType, int serial, RIL_Errno e, void *response,
5460 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005461#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005462 RLOGD("getDeviceIdentityResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005463#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005464
5465 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005466 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005467 populateResponseInfo(responseInfo, serial, responseType, e);
5468
5469 int numStrings = responseLen / sizeof(char *);
5470 hidl_string emptyString;
5471 if (response == NULL || numStrings != 4) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005472 RLOGE("getDeviceIdentityResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005473 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
5474 Return<void> retStatus
5475 = radioService[slotId]->mRadioResponse->getDeviceIdentityResponse(responseInfo,
5476 emptyString, emptyString, emptyString, emptyString);
5477 radioService[slotId]->checkReturnStatus(retStatus);
5478 } else {
5479 char **resp = (char **) response;
5480 Return<void> retStatus
5481 = radioService[slotId]->mRadioResponse->getDeviceIdentityResponse(responseInfo,
5482 convertCharPtrToHidlString(resp[0]),
5483 convertCharPtrToHidlString(resp[1]),
5484 convertCharPtrToHidlString(resp[2]),
5485 convertCharPtrToHidlString(resp[3]));
5486 radioService[slotId]->checkReturnStatus(retStatus);
5487 }
5488 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005489 RLOGE("getDeviceIdentityResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005490 slotId);
5491 }
5492
5493 return 0;
5494}
5495
Amit Mahajan759786a2017-03-03 17:35:47 -08005496int radio::exitEmergencyCallbackModeResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005497 int responseType, int serial, RIL_Errno e,
5498 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005499#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005500 RLOGD("exitEmergencyCallbackModeResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005501#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005502
5503 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005504 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005505 populateResponseInfo(responseInfo, serial, responseType, e);
5506 Return<void> retStatus
5507 = radioService[slotId]->mRadioResponse->exitEmergencyCallbackModeResponse(
5508 responseInfo);
5509 radioService[slotId]->checkReturnStatus(retStatus);
5510 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005511 RLOGE("exitEmergencyCallbackModeResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005512 slotId);
5513 }
5514
5515 return 0;
5516}
5517
Amit Mahajan759786a2017-03-03 17:35:47 -08005518int radio::getSmscAddressResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005519 int responseType, int serial, RIL_Errno e,
5520 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005521#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005522 RLOGD("getSmscAddressResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005523#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005524
5525 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005526 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005527 populateResponseInfo(responseInfo, serial, responseType, e);
5528 Return<void> retStatus
5529 = radioService[slotId]->mRadioResponse->getSmscAddressResponse(responseInfo,
5530 convertCharPtrToHidlString((char *) response));
5531 radioService[slotId]->checkReturnStatus(retStatus);
5532 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005533 RLOGE("getSmscAddressResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005534 }
5535
5536 return 0;
5537}
5538
Amit Mahajan759786a2017-03-03 17:35:47 -08005539int radio::setSmscAddressResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005540 int responseType, int serial, RIL_Errno e,
5541 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005542#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005543 RLOGD("setSmscAddressResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005544#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005545
5546 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005547 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005548 populateResponseInfo(responseInfo, serial, responseType, e);
5549 Return<void> retStatus
5550 = radioService[slotId]->mRadioResponse->setSmscAddressResponse(responseInfo);
5551 radioService[slotId]->checkReturnStatus(retStatus);
5552 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005553 RLOGE("setSmscAddressResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005554 }
5555
5556 return 0;
5557}
5558
Amit Mahajan759786a2017-03-03 17:35:47 -08005559int radio::reportSmsMemoryStatusResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005560 int responseType, int serial, RIL_Errno e,
5561 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005562#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005563 RLOGD("reportSmsMemoryStatusResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005564#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005565
5566 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005567 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005568 populateResponseInfo(responseInfo, serial, responseType, e);
5569 Return<void> retStatus
5570 = radioService[slotId]->mRadioResponse->reportSmsMemoryStatusResponse(responseInfo);
5571 radioService[slotId]->checkReturnStatus(retStatus);
5572 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005573 RLOGE("reportSmsMemoryStatusResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005574 slotId);
5575 }
5576
5577 return 0;
5578}
5579
Amit Mahajan759786a2017-03-03 17:35:47 -08005580int radio::reportStkServiceIsRunningResponse(int slotId,
Amit Mahajan5007ffa2017-01-31 17:14:42 -08005581 int responseType, int serial, RIL_Errno e,
5582 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005583#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005584 RLOGD("reportStkServiceIsRunningResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005585#endif
Amit Mahajan5007ffa2017-01-31 17:14:42 -08005586
5587 if (radioService[slotId]->mRadioResponse != NULL) {
Amit Mahajan3da9ac02017-02-13 13:41:28 -08005588 RadioResponseInfo responseInfo = {};
Amit Mahajan5007ffa2017-01-31 17:14:42 -08005589 populateResponseInfo(responseInfo, serial, responseType, e);
5590 Return<void> retStatus = radioService[slotId]->mRadioResponse->
5591 reportStkServiceIsRunningResponse(responseInfo);
5592 radioService[slotId]->checkReturnStatus(retStatus);
5593 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005594 RLOGE("reportStkServiceIsRunningResponse: radioService[%d]->mRadioResponse == NULL",
Amit Mahajan5007ffa2017-01-31 17:14:42 -08005595 slotId);
5596 }
5597
5598 return 0;
5599}
5600
Amit Mahajan759786a2017-03-03 17:35:47 -08005601int radio::getCdmaSubscriptionSourceResponse(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("getCdmaSubscriptionSourceResponse: 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->getCdmaSubscriptionSourceResponse(
5613 responseInfo, (CdmaSubscriptionSource) ret);
5614 radioService[slotId]->checkReturnStatus(retStatus);
5615 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005616 RLOGE("getCdmaSubscriptionSourceResponse: 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::requestIsimAuthenticationResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005624 int responseType, int serial, RIL_Errno e,
5625 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005626#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005627 RLOGD("requestIsimAuthenticationResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005628#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005629
5630 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005631 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005632 populateResponseInfo(responseInfo, serial, responseType, e);
5633 Return<void> retStatus
5634 = radioService[slotId]->mRadioResponse->requestIsimAuthenticationResponse(
5635 responseInfo,
5636 convertCharPtrToHidlString((char *) response));
5637 radioService[slotId]->checkReturnStatus(retStatus);
5638 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005639 RLOGE("requestIsimAuthenticationResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005640 slotId);
5641 }
5642
5643 return 0;
5644}
5645
Amit Mahajan759786a2017-03-03 17:35:47 -08005646int radio::acknowledgeIncomingGsmSmsWithPduResponse(int slotId,
5647 int responseType,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005648 int serial, RIL_Errno e, void *response,
5649 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005650#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005651 RLOGD("acknowledgeIncomingGsmSmsWithPduResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005652#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005653
5654 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005655 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005656 populateResponseInfo(responseInfo, serial, responseType, e);
5657 Return<void> retStatus
5658 = radioService[slotId]->mRadioResponse->acknowledgeIncomingGsmSmsWithPduResponse(
5659 responseInfo);
5660 radioService[slotId]->checkReturnStatus(retStatus);
5661 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005662 RLOGE("acknowledgeIncomingGsmSmsWithPduResponse: radioService[%d]->mRadioResponse "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005663 "== NULL", slotId);
5664 }
5665
5666 return 0;
5667}
5668
Amit Mahajan759786a2017-03-03 17:35:47 -08005669int radio::sendEnvelopeWithStatusResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005670 int responseType, int serial, RIL_Errno e, void *response,
5671 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005672#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005673 RLOGD("sendEnvelopeWithStatusResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005674#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005675
5676 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005677 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005678 IccIoResult result = responseIccIo(responseInfo, serial, responseType, e,
5679 response, responseLen);
5680
5681 Return<void> retStatus
5682 = radioService[slotId]->mRadioResponse->sendEnvelopeWithStatusResponse(responseInfo,
5683 result);
5684 radioService[slotId]->checkReturnStatus(retStatus);
5685 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005686 RLOGE("sendEnvelopeWithStatusResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005687 slotId);
5688 }
5689
5690 return 0;
5691}
5692
Amit Mahajan759786a2017-03-03 17:35:47 -08005693int radio::getVoiceRadioTechnologyResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005694 int responseType, int serial, RIL_Errno e,
5695 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005696#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005697 RLOGD("getVoiceRadioTechnologyResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005698#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005699
5700 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005701 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005702 int ret = responseInt(responseInfo, serial, responseType, e, response, responseLen);
5703 Return<void> retStatus
5704 = radioService[slotId]->mRadioResponse->getVoiceRadioTechnologyResponse(
5705 responseInfo, (RadioTechnology) ret);
5706 radioService[slotId]->checkReturnStatus(retStatus);
5707 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005708 RLOGE("getVoiceRadioTechnologyResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005709 slotId);
5710 }
5711
5712 return 0;
5713}
5714
Amit Mahajan759786a2017-03-03 17:35:47 -08005715int radio::getCellInfoListResponse(int slotId,
5716 int responseType,
Amit Mahajan3df62912017-02-10 01:35:55 +00005717 int serial, RIL_Errno e, void *response,
5718 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005719#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005720 RLOGD("getCellInfoListResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005721#endif
Amit Mahajan3df62912017-02-10 01:35:55 +00005722
5723 if (radioService[slotId]->mRadioResponse != NULL) {
Amit Mahajan3da9ac02017-02-13 13:41:28 -08005724 RadioResponseInfo responseInfo = {};
Amit Mahajan3df62912017-02-10 01:35:55 +00005725 populateResponseInfo(responseInfo, serial, responseType, e);
5726
5727 hidl_vec<CellInfo> ret;
Amit Mahajan13058cb2017-06-07 23:10:27 -07005728 if ((response == NULL && responseLen != 0)
5729 || responseLen % sizeof(RIL_CellInfo_v12) != 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005730 RLOGE("getCellInfoListResponse: Invalid response");
Amit Mahajan3df62912017-02-10 01:35:55 +00005731 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
5732 } else {
5733 convertRilCellInfoListToHal(response, responseLen, ret);
5734 }
5735
5736 Return<void> retStatus = radioService[slotId]->mRadioResponse->getCellInfoListResponse(
5737 responseInfo, ret);
5738 radioService[slotId]->checkReturnStatus(retStatus);
5739 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005740 RLOGE("getCellInfoListResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Amit Mahajan3df62912017-02-10 01:35:55 +00005741 }
5742
5743 return 0;
5744}
5745
Amit Mahajan759786a2017-03-03 17:35:47 -08005746int radio::setCellInfoListRateResponse(int slotId,
5747 int responseType,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005748 int serial, RIL_Errno e, void *response,
5749 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005750#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005751 RLOGD("setCellInfoListRateResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005752#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005753
5754 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005755 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005756 populateResponseInfo(responseInfo, serial, responseType, e);
5757 Return<void> retStatus
5758 = radioService[slotId]->mRadioResponse->setCellInfoListRateResponse(responseInfo);
5759 radioService[slotId]->checkReturnStatus(retStatus);
5760 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005761 RLOGE("setCellInfoListRateResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005762 slotId);
5763 }
5764
5765 return 0;
5766}
5767
Amit Mahajan759786a2017-03-03 17:35:47 -08005768int radio::setInitialAttachApnResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005769 int responseType, int serial, RIL_Errno e,
5770 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005771#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005772 RLOGD("setInitialAttachApnResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005773#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005774
5775 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005776 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005777 populateResponseInfo(responseInfo, serial, responseType, e);
5778 Return<void> retStatus
5779 = radioService[slotId]->mRadioResponse->setInitialAttachApnResponse(responseInfo);
5780 radioService[slotId]->checkReturnStatus(retStatus);
5781 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005782 RLOGE("setInitialAttachApnResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005783 slotId);
5784 }
5785
5786 return 0;
5787}
5788
Amit Mahajan759786a2017-03-03 17:35:47 -08005789int radio::getImsRegistrationStateResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005790 int responseType, int serial, RIL_Errno e,
5791 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005792#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005793 RLOGD("getImsRegistrationStateResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005794#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005795
5796 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005797 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005798 populateResponseInfo(responseInfo, serial, responseType, e);
5799 bool isRegistered = false;
5800 int ratFamily = 0;
5801 int numInts = responseLen / sizeof(int);
5802 if (response == NULL || numInts != 2) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005803 RLOGE("getImsRegistrationStateResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005804 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
5805 } else {
5806 int *pInt = (int *) response;
5807 isRegistered = pInt[0] == 1 ? true : false;
5808 ratFamily = pInt[1];
5809 }
5810 Return<void> retStatus
5811 = radioService[slotId]->mRadioResponse->getImsRegistrationStateResponse(
5812 responseInfo, isRegistered, (RadioTechnologyFamily) ratFamily);
5813 radioService[slotId]->checkReturnStatus(retStatus);
5814 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005815 RLOGE("getImsRegistrationStateResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005816 slotId);
5817 }
5818
5819 return 0;
5820}
5821
Amit Mahajan759786a2017-03-03 17:35:47 -08005822int radio::sendImsSmsResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005823 int responseType, int serial, RIL_Errno e, void *response,
5824 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005825#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005826 RLOGD("sendImsSmsResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005827#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005828
5829 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005830 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005831 SendSmsResult result = makeSendSmsResult(responseInfo, serial, responseType, e, response,
5832 responseLen);
5833
5834 Return<void> retStatus
5835 = radioService[slotId]->mRadioResponse->sendImsSmsResponse(responseInfo, result);
5836 radioService[slotId]->checkReturnStatus(retStatus);
5837 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005838 RLOGE("sendSmsResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005839 }
5840
5841 return 0;
5842}
5843
Amit Mahajan759786a2017-03-03 17:35:47 -08005844int radio::iccTransmitApduBasicChannelResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005845 int responseType, int serial, RIL_Errno e,
5846 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005847#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005848 RLOGD("iccTransmitApduBasicChannelResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005849#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005850
5851 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005852 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005853 IccIoResult result = responseIccIo(responseInfo, serial, responseType, e, response,
5854 responseLen);
5855
5856 Return<void> retStatus
5857 = radioService[slotId]->mRadioResponse->iccTransmitApduBasicChannelResponse(
5858 responseInfo, result);
5859 radioService[slotId]->checkReturnStatus(retStatus);
5860 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005861 RLOGE("iccTransmitApduBasicChannelResponse: radioService[%d]->mRadioResponse "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005862 "== NULL", slotId);
5863 }
5864
5865 return 0;
5866}
5867
Amit Mahajan759786a2017-03-03 17:35:47 -08005868int radio::iccOpenLogicalChannelResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005869 int responseType, int serial, RIL_Errno e, void *response,
5870 size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005871#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005872 RLOGD("iccOpenLogicalChannelResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005873#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005874
5875 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005876 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005877 populateResponseInfo(responseInfo, serial, responseType, e);
5878 int channelId = -1;
5879 hidl_vec<int8_t> selectResponse;
5880 int numInts = responseLen / sizeof(int);
5881 if (response == NULL || responseLen % sizeof(int) != 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005882 RLOGE("iccOpenLogicalChannelResponse Invalid response: NULL");
Amit Mahajan13058cb2017-06-07 23:10:27 -07005883 if (response != NULL) {
5884 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
5885 }
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005886 } else {
5887 int *pInt = (int *) response;
5888 channelId = pInt[0];
5889 selectResponse.resize(numInts - 1);
5890 for (int i = 1; i < numInts; i++) {
5891 selectResponse[i - 1] = (int8_t) pInt[i];
5892 }
5893 }
5894 Return<void> retStatus
5895 = radioService[slotId]->mRadioResponse->iccOpenLogicalChannelResponse(responseInfo,
5896 channelId, selectResponse);
5897 radioService[slotId]->checkReturnStatus(retStatus);
5898 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005899 RLOGE("iccOpenLogicalChannelResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005900 slotId);
5901 }
5902
5903 return 0;
5904}
5905
Amit Mahajan759786a2017-03-03 17:35:47 -08005906int radio::iccCloseLogicalChannelResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005907 int responseType, int serial, RIL_Errno e,
5908 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005909#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005910 RLOGD("iccCloseLogicalChannelResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005911#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005912
5913 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005914 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005915 populateResponseInfo(responseInfo, serial, responseType, e);
5916 Return<void> retStatus
5917 = radioService[slotId]->mRadioResponse->iccCloseLogicalChannelResponse(
5918 responseInfo);
5919 radioService[slotId]->checkReturnStatus(retStatus);
5920 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005921 RLOGE("iccCloseLogicalChannelResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005922 slotId);
5923 }
5924
5925 return 0;
5926}
5927
Amit Mahajan759786a2017-03-03 17:35:47 -08005928int radio::iccTransmitApduLogicalChannelResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005929 int responseType, int serial, RIL_Errno e,
5930 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005931#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005932 RLOGD("iccTransmitApduLogicalChannelResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005933#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005934
5935 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005936 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005937 IccIoResult result = responseIccIo(responseInfo, serial, responseType, e, response,
5938 responseLen);
5939
5940 Return<void> retStatus
5941 = radioService[slotId]->mRadioResponse->iccTransmitApduLogicalChannelResponse(
5942 responseInfo, result);
5943 radioService[slotId]->checkReturnStatus(retStatus);
5944 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005945 RLOGE("iccTransmitApduLogicalChannelResponse: radioService[%d]->mRadioResponse "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005946 "== NULL", slotId);
5947 }
5948
5949 return 0;
5950}
5951
Amit Mahajan759786a2017-03-03 17:35:47 -08005952int radio::nvReadItemResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005953 int responseType, int serial, RIL_Errno e,
5954 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005955#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005956 RLOGD("nvReadItemResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005957#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005958
5959 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005960 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005961 populateResponseInfo(responseInfo, serial, responseType, e);
5962 Return<void> retStatus = radioService[slotId]->mRadioResponse->nvReadItemResponse(
5963 responseInfo,
5964 convertCharPtrToHidlString((char *) response));
5965 radioService[slotId]->checkReturnStatus(retStatus);
5966 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005967 RLOGE("nvReadItemResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005968 }
5969
5970 return 0;
5971}
5972
Amit Mahajan759786a2017-03-03 17:35:47 -08005973int radio::nvWriteItemResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005974 int responseType, int serial, RIL_Errno e,
5975 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005976#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005977 RLOGD("nvWriteItemResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005978#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005979
5980 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08005981 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005982 populateResponseInfo(responseInfo, serial, responseType, e);
5983 Return<void> retStatus
5984 = radioService[slotId]->mRadioResponse->nvWriteItemResponse(responseInfo);
5985 radioService[slotId]->checkReturnStatus(retStatus);
5986 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08005987 RLOGE("nvWriteItemResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005988 }
5989
5990 return 0;
5991}
5992
Amit Mahajan759786a2017-03-03 17:35:47 -08005993int radio::nvWriteCdmaPrlResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005994 int responseType, int serial, RIL_Errno e,
5995 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07005996#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08005997 RLOGD("nvWriteCdmaPrlResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07005998#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08005999
6000 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08006001 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006002 populateResponseInfo(responseInfo, serial, responseType, e);
6003 Return<void> retStatus
6004 = radioService[slotId]->mRadioResponse->nvWriteCdmaPrlResponse(responseInfo);
6005 radioService[slotId]->checkReturnStatus(retStatus);
6006 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006007 RLOGE("nvWriteCdmaPrlResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006008 }
6009
6010 return 0;
6011}
6012
Amit Mahajan759786a2017-03-03 17:35:47 -08006013int radio::nvResetConfigResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006014 int responseType, int serial, RIL_Errno e,
6015 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006016#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006017 RLOGD("nvResetConfigResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006018#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006019
6020 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08006021 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006022 populateResponseInfo(responseInfo, serial, responseType, e);
6023 Return<void> retStatus
6024 = radioService[slotId]->mRadioResponse->nvResetConfigResponse(responseInfo);
6025 radioService[slotId]->checkReturnStatus(retStatus);
6026 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006027 RLOGE("nvResetConfigResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006028 }
6029
6030 return 0;
6031}
6032
Amit Mahajan759786a2017-03-03 17:35:47 -08006033int radio::setUiccSubscriptionResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006034 int responseType, int serial, RIL_Errno e,
6035 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006036#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006037 RLOGD("setUiccSubscriptionResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006038#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006039
6040 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08006041 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006042 populateResponseInfo(responseInfo, serial, responseType, e);
6043 Return<void> retStatus
6044 = radioService[slotId]->mRadioResponse->setUiccSubscriptionResponse(responseInfo);
6045 radioService[slotId]->checkReturnStatus(retStatus);
6046 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006047 RLOGE("setUiccSubscriptionResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006048 slotId);
6049 }
6050
6051 return 0;
6052}
6053
Amit Mahajan759786a2017-03-03 17:35:47 -08006054int radio::setDataAllowedResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006055 int responseType, int serial, RIL_Errno e,
6056 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006057#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006058 RLOGD("setDataAllowedResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006059#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006060
6061 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08006062 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006063 populateResponseInfo(responseInfo, serial, responseType, e);
6064 Return<void> retStatus
6065 = radioService[slotId]->mRadioResponse->setDataAllowedResponse(responseInfo);
6066 radioService[slotId]->checkReturnStatus(retStatus);
6067 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006068 RLOGE("setDataAllowedResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006069 }
6070
6071 return 0;
6072}
6073
Amit Mahajan759786a2017-03-03 17:35:47 -08006074int radio::getHardwareConfigResponse(int slotId,
Amit Mahajan3df62912017-02-10 01:35:55 +00006075 int responseType, int serial, RIL_Errno e,
6076 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006077#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006078 RLOGD("getHardwareConfigResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006079#endif
Amit Mahajan3df62912017-02-10 01:35:55 +00006080
6081 if (radioService[slotId]->mRadioResponse != NULL) {
Amit Mahajan3da9ac02017-02-13 13:41:28 -08006082 RadioResponseInfo responseInfo = {};
Amit Mahajan3df62912017-02-10 01:35:55 +00006083 populateResponseInfo(responseInfo, serial, responseType, e);
6084
6085 hidl_vec<HardwareConfig> result;
Amit Mahajan13058cb2017-06-07 23:10:27 -07006086 if ((response == NULL && responseLen != 0)
6087 || responseLen % sizeof(RIL_HardwareConfig) != 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006088 RLOGE("hardwareConfigChangedInd: invalid response");
Amit Mahajan3df62912017-02-10 01:35:55 +00006089 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
6090 } else {
6091 convertRilHardwareConfigListToHal(response, responseLen, result);
6092 }
6093
6094 Return<void> retStatus = radioService[slotId]->mRadioResponse->getHardwareConfigResponse(
6095 responseInfo, result);
6096 radioService[slotId]->checkReturnStatus(retStatus);
6097 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006098 RLOGE("getHardwareConfigResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Amit Mahajan3df62912017-02-10 01:35:55 +00006099 }
6100
6101 return 0;
6102}
6103
Amit Mahajan759786a2017-03-03 17:35:47 -08006104int radio::requestIccSimAuthenticationResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006105 int responseType, int serial, RIL_Errno e,
6106 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006107#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006108 RLOGD("requestIccSimAuthenticationResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006109#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006110
6111 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08006112 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006113 IccIoResult result = responseIccIo(responseInfo, serial, responseType, e, response,
6114 responseLen);
6115
6116 Return<void> retStatus
6117 = radioService[slotId]->mRadioResponse->requestIccSimAuthenticationResponse(
6118 responseInfo, result);
6119 radioService[slotId]->checkReturnStatus(retStatus);
6120 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006121 RLOGE("requestIccSimAuthenticationResponse: radioService[%d]->mRadioResponse "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006122 "== NULL", slotId);
6123 }
6124
6125 return 0;
6126}
6127
Amit Mahajan759786a2017-03-03 17:35:47 -08006128int radio::setDataProfileResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006129 int responseType, int serial, RIL_Errno e,
6130 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006131#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006132 RLOGD("setDataProfileResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006133#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006134
6135 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08006136 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006137 populateResponseInfo(responseInfo, serial, responseType, e);
6138 Return<void> retStatus
6139 = radioService[slotId]->mRadioResponse->setDataProfileResponse(responseInfo);
6140 radioService[slotId]->checkReturnStatus(retStatus);
6141 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006142 RLOGE("setDataProfileResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006143 }
6144
6145 return 0;
6146}
6147
Amit Mahajan759786a2017-03-03 17:35:47 -08006148int radio::requestShutdownResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006149 int responseType, int serial, RIL_Errno e,
6150 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006151#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006152 RLOGD("requestShutdownResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006153#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006154
6155 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08006156 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006157 populateResponseInfo(responseInfo, serial, responseType, e);
6158 Return<void> retStatus
6159 = radioService[slotId]->mRadioResponse->requestShutdownResponse(responseInfo);
6160 radioService[slotId]->checkReturnStatus(retStatus);
6161 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006162 RLOGE("requestShutdownResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006163 }
6164
6165 return 0;
6166}
6167
Amit Mahajan3df62912017-02-10 01:35:55 +00006168void responseRadioCapability(RadioResponseInfo& responseInfo, int serial,
6169 int responseType, RIL_Errno e, void *response, size_t responseLen, RadioCapability& rc) {
6170 populateResponseInfo(responseInfo, serial, responseType, e);
6171
Amit Mahajan1fbff082017-02-24 11:24:39 -08006172 if (response == NULL || responseLen != sizeof(RIL_RadioCapability)) {
Amit Mahajan3df62912017-02-10 01:35:55 +00006173 RLOGE("responseRadioCapability: Invalid response");
6174 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
Amit Mahajan3da9ac02017-02-13 13:41:28 -08006175 rc.logicalModemUuid = hidl_string();
Amit Mahajan3df62912017-02-10 01:35:55 +00006176 } else {
6177 convertRilRadioCapabilityToHal(response, responseLen, rc);
6178 }
6179}
6180
Amit Mahajan759786a2017-03-03 17:35:47 -08006181int radio::getRadioCapabilityResponse(int slotId,
Amit Mahajan3df62912017-02-10 01:35:55 +00006182 int responseType, int serial, RIL_Errno e,
6183 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006184#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006185 RLOGD("getRadioCapabilityResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006186#endif
Amit Mahajan3df62912017-02-10 01:35:55 +00006187
6188 if (radioService[slotId]->mRadioResponse != NULL) {
Amit Mahajan3da9ac02017-02-13 13:41:28 -08006189 RadioResponseInfo responseInfo = {};
6190 RadioCapability result = {};
Amit Mahajan3df62912017-02-10 01:35:55 +00006191 responseRadioCapability(responseInfo, serial, responseType, e, response, responseLen,
6192 result);
6193 Return<void> retStatus = radioService[slotId]->mRadioResponse->getRadioCapabilityResponse(
6194 responseInfo, result);
6195 radioService[slotId]->checkReturnStatus(retStatus);
6196 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006197 RLOGE("getRadioCapabilityResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Amit Mahajan3df62912017-02-10 01:35:55 +00006198 }
6199
6200 return 0;
6201}
6202
Amit Mahajan759786a2017-03-03 17:35:47 -08006203int radio::setRadioCapabilityResponse(int slotId,
Amit Mahajan3df62912017-02-10 01:35:55 +00006204 int responseType, int serial, RIL_Errno e,
6205 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006206#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006207 RLOGD("setRadioCapabilityResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006208#endif
Amit Mahajan3df62912017-02-10 01:35:55 +00006209
6210 if (radioService[slotId]->mRadioResponse != NULL) {
Amit Mahajan3da9ac02017-02-13 13:41:28 -08006211 RadioResponseInfo responseInfo = {};
6212 RadioCapability result = {};
Amit Mahajan3df62912017-02-10 01:35:55 +00006213 responseRadioCapability(responseInfo, serial, responseType, e, response, responseLen,
6214 result);
6215 Return<void> retStatus = radioService[slotId]->mRadioResponse->setRadioCapabilityResponse(
6216 responseInfo, result);
6217 radioService[slotId]->checkReturnStatus(retStatus);
6218 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006219 RLOGE("setRadioCapabilityResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Amit Mahajan3df62912017-02-10 01:35:55 +00006220 }
6221
6222 return 0;
6223}
6224
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006225LceStatusInfo responseLceStatusInfo(RadioResponseInfo& responseInfo, int serial, int responseType,
6226 RIL_Errno e, void *response, size_t responseLen) {
6227 populateResponseInfo(responseInfo, serial, responseType, e);
Jack Yuf68e0da2017-02-07 14:53:09 -08006228 LceStatusInfo result = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006229
6230 if (response == NULL || responseLen != sizeof(RIL_LceStatusInfo)) {
6231 RLOGE("Invalid response: NULL");
6232 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006233 } else {
6234 RIL_LceStatusInfo *resp = (RIL_LceStatusInfo *) response;
6235 result.lceStatus = (LceStatus) resp->lce_status;
6236 result.actualIntervalMs = (uint8_t) resp->actual_interval_ms;
6237 }
6238 return result;
6239}
6240
Amit Mahajan759786a2017-03-03 17:35:47 -08006241int radio::startLceServiceResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006242 int responseType, int serial, RIL_Errno e,
6243 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006244#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006245 RLOGD("startLceServiceResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006246#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006247
6248 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08006249 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006250 LceStatusInfo result = responseLceStatusInfo(responseInfo, serial, responseType, e,
6251 response, responseLen);
6252
6253 Return<void> retStatus
6254 = radioService[slotId]->mRadioResponse->startLceServiceResponse(responseInfo,
6255 result);
6256 radioService[slotId]->checkReturnStatus(retStatus);
6257 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006258 RLOGE("startLceServiceResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006259 }
6260
6261 return 0;
6262}
6263
Amit Mahajan759786a2017-03-03 17:35:47 -08006264int radio::stopLceServiceResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006265 int responseType, int serial, RIL_Errno e,
6266 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006267#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006268 RLOGD("stopLceServiceResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006269#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006270
6271 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08006272 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006273 LceStatusInfo result = responseLceStatusInfo(responseInfo, serial, responseType, e,
6274 response, responseLen);
6275
6276 Return<void> retStatus
6277 = radioService[slotId]->mRadioResponse->stopLceServiceResponse(responseInfo,
6278 result);
6279 radioService[slotId]->checkReturnStatus(retStatus);
6280 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006281 RLOGE("stopLceServiceResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006282 }
6283
6284 return 0;
6285}
6286
Amit Mahajan759786a2017-03-03 17:35:47 -08006287int radio::pullLceDataResponse(int slotId,
Amit Mahajan3df62912017-02-10 01:35:55 +00006288 int responseType, int serial, RIL_Errno e,
6289 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006290#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006291 RLOGD("pullLceDataResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006292#endif
Amit Mahajan3df62912017-02-10 01:35:55 +00006293
6294 if (radioService[slotId]->mRadioResponse != NULL) {
Amit Mahajan3da9ac02017-02-13 13:41:28 -08006295 RadioResponseInfo responseInfo = {};
Amit Mahajan3df62912017-02-10 01:35:55 +00006296 populateResponseInfo(responseInfo, serial, responseType, e);
6297
Amit Mahajan3da9ac02017-02-13 13:41:28 -08006298 LceDataInfo result = {};
Amit Mahajan3df62912017-02-10 01:35:55 +00006299 if (response == NULL || responseLen != sizeof(RIL_LceDataInfo)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006300 RLOGE("pullLceDataResponse: Invalid response");
Amit Mahajan3df62912017-02-10 01:35:55 +00006301 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
Amit Mahajan3df62912017-02-10 01:35:55 +00006302 } else {
6303 convertRilLceDataInfoToHal(response, responseLen, result);
6304 }
6305
6306 Return<void> retStatus = radioService[slotId]->mRadioResponse->pullLceDataResponse(
6307 responseInfo, result);
6308 radioService[slotId]->checkReturnStatus(retStatus);
6309 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006310 RLOGE("pullLceDataResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Amit Mahajan3df62912017-02-10 01:35:55 +00006311 }
6312
6313 return 0;
6314}
6315
Amit Mahajan759786a2017-03-03 17:35:47 -08006316int radio::getModemActivityInfoResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006317 int responseType, int serial, RIL_Errno e,
6318 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006319#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006320 RLOGD("getModemActivityInfoResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006321#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006322
6323 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08006324 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006325 populateResponseInfo(responseInfo, serial, responseType, e);
6326 ActivityStatsInfo info;
6327 if (response == NULL || responseLen != sizeof(RIL_ActivityStatsInfo)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006328 RLOGE("getModemActivityInfoResponse Invalid response: NULL");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006329 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006330 } else {
6331 RIL_ActivityStatsInfo *resp = (RIL_ActivityStatsInfo *)response;
6332 info.sleepModeTimeMs = resp->sleep_mode_time_ms;
6333 info.idleModeTimeMs = resp->idle_mode_time_ms;
6334 for(int i = 0; i < RIL_NUM_TX_POWER_LEVELS; i++) {
6335 info.txmModetimeMs[i] = resp->tx_mode_time_ms[i];
6336 }
6337 info.rxModeTimeMs = resp->rx_mode_time_ms;
6338 }
6339
6340 Return<void> retStatus
6341 = radioService[slotId]->mRadioResponse->getModemActivityInfoResponse(responseInfo,
6342 info);
6343 radioService[slotId]->checkReturnStatus(retStatus);
6344 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006345 RLOGE("getModemActivityInfoResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006346 slotId);
6347 }
6348
6349 return 0;
6350}
6351
Amit Mahajan759786a2017-03-03 17:35:47 -08006352int radio::setAllowedCarriersResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006353 int responseType, int serial, RIL_Errno e,
6354 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006355#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006356 RLOGD("setAllowedCarriersResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006357#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006358
6359 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08006360 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006361 int ret = responseInt(responseInfo, serial, responseType, e, response, responseLen);
6362 Return<void> retStatus
6363 = radioService[slotId]->mRadioResponse->setAllowedCarriersResponse(responseInfo,
6364 ret);
6365 radioService[slotId]->checkReturnStatus(retStatus);
6366 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006367 RLOGE("setAllowedCarriersResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006368 slotId);
6369 }
6370
6371 return 0;
6372}
6373
Amit Mahajan759786a2017-03-03 17:35:47 -08006374int radio::getAllowedCarriersResponse(int slotId,
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006375 int responseType, int serial, RIL_Errno e,
6376 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006377#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006378 RLOGD("getAllowedCarriersResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006379#endif
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006380
6381 if (radioService[slotId]->mRadioResponse != NULL) {
Jack Yuf68e0da2017-02-07 14:53:09 -08006382 RadioResponseInfo responseInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006383 populateResponseInfo(responseInfo, serial, responseType, e);
Jack Yuf68e0da2017-02-07 14:53:09 -08006384 CarrierRestrictions carrierInfo = {};
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006385 bool allAllowed = true;
Jayachandran C70f7d2e2017-04-28 00:57:13 -07006386 if (response == NULL) {
6387#if VDBG
6388 RLOGD("getAllowedCarriersResponse response is NULL: all allowed");
6389#endif
6390 carrierInfo.allowedCarriers.resize(0);
6391 carrierInfo.excludedCarriers.resize(0);
6392 } else if (responseLen != sizeof(RIL_CarrierRestrictions)) {
6393 RLOGE("getAllowedCarriersResponse Invalid response");
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006394 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
6395 } else {
6396 RIL_CarrierRestrictions *pCr = (RIL_CarrierRestrictions *)response;
6397 if (pCr->len_allowed_carriers > 0 || pCr->len_excluded_carriers > 0) {
6398 allAllowed = false;
6399 }
6400
6401 carrierInfo.allowedCarriers.resize(pCr->len_allowed_carriers);
6402 for(int i = 0; i < pCr->len_allowed_carriers; i++) {
6403 RIL_Carrier *carrier = pCr->allowed_carriers + i;
6404 carrierInfo.allowedCarriers[i].mcc = convertCharPtrToHidlString(carrier->mcc);
6405 carrierInfo.allowedCarriers[i].mnc = convertCharPtrToHidlString(carrier->mnc);
6406 carrierInfo.allowedCarriers[i].matchType = (CarrierMatchType) carrier->match_type;
6407 carrierInfo.allowedCarriers[i].matchData =
6408 convertCharPtrToHidlString(carrier->match_data);
6409 }
6410
6411 carrierInfo.excludedCarriers.resize(pCr->len_excluded_carriers);
6412 for(int i = 0; i < pCr->len_excluded_carriers; i++) {
6413 RIL_Carrier *carrier = pCr->excluded_carriers + i;
6414 carrierInfo.excludedCarriers[i].mcc = convertCharPtrToHidlString(carrier->mcc);
6415 carrierInfo.excludedCarriers[i].mnc = convertCharPtrToHidlString(carrier->mnc);
6416 carrierInfo.excludedCarriers[i].matchType = (CarrierMatchType) carrier->match_type;
6417 carrierInfo.excludedCarriers[i].matchData =
6418 convertCharPtrToHidlString(carrier->match_data);
6419 }
6420 }
6421
6422 Return<void> retStatus
6423 = radioService[slotId]->mRadioResponse->getAllowedCarriersResponse(responseInfo,
6424 allAllowed, carrierInfo);
6425 radioService[slotId]->checkReturnStatus(retStatus);
6426 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006427 RLOGE("getAllowedCarriersResponse: radioService[%d]->mRadioResponse == NULL",
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006428 slotId);
6429 }
6430
6431 return 0;
6432}
6433
Amit Mahajan759786a2017-03-03 17:35:47 -08006434int radio::sendDeviceStateResponse(int slotId,
Jack Yu11ab4042017-02-21 17:08:01 -08006435 int responseType, int serial, RIL_Errno e,
6436 void *response, size_t responselen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006437#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006438 RLOGD("sendDeviceStateResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006439#endif
Jack Yu11ab4042017-02-21 17:08:01 -08006440
6441 if (radioService[slotId]->mRadioResponse != NULL) {
6442 RadioResponseInfo responseInfo = {};
6443 populateResponseInfo(responseInfo, serial, responseType, e);
6444 Return<void> retStatus
6445 = radioService[slotId]->mRadioResponse->sendDeviceStateResponse(responseInfo);
6446 radioService[slotId]->checkReturnStatus(retStatus);
6447 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006448 RLOGE("sendDeviceStateResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Jack Yu11ab4042017-02-21 17:08:01 -08006449 }
6450
6451 return 0;
6452}
6453
pkanwardb8e0942017-03-17 12:49:34 -07006454int radio::setCarrierInfoForImsiEncryptionResponse(int slotId,
6455 int responseType, int serial, RIL_Errno e,
6456 void *response, size_t responseLen) {
6457 RLOGD("setCarrierInfoForImsiEncryptionResponse: serial %d", serial);
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07006458 if (radioService[slotId]->mRadioResponseV1_1 != NULL) {
pkanwardb8e0942017-03-17 12:49:34 -07006459 RadioResponseInfo responseInfo = {};
6460 populateResponseInfo(responseInfo, serial, responseType, e);
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07006461 Return<void> retStatus = radioService[slotId]->mRadioResponseV1_1->
6462 setCarrierInfoForImsiEncryptionResponse(responseInfo);
6463 radioService[slotId]->checkReturnStatus(retStatus);
pkanwardb8e0942017-03-17 12:49:34 -07006464 } else {
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07006465 RLOGE("setCarrierInfoForImsiEncryptionResponse: radioService[%d]->mRadioResponseV1_1 == "
6466 "NULL", slotId);
pkanwardb8e0942017-03-17 12:49:34 -07006467 }
6468 return 0;
6469}
6470
Amit Mahajan759786a2017-03-03 17:35:47 -08006471int radio::setIndicationFilterResponse(int slotId,
Jack Yu11ab4042017-02-21 17:08:01 -08006472 int responseType, int serial, RIL_Errno e,
6473 void *response, size_t responselen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006474#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006475 RLOGD("setIndicationFilterResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006476#endif
Jack Yu11ab4042017-02-21 17:08:01 -08006477
6478 if (radioService[slotId]->mRadioResponse != NULL) {
6479 RadioResponseInfo responseInfo = {};
6480 populateResponseInfo(responseInfo, serial, responseType, e);
6481 Return<void> retStatus
6482 = radioService[slotId]->mRadioResponse->setIndicationFilterResponse(responseInfo);
6483 radioService[slotId]->checkReturnStatus(retStatus);
6484 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006485 RLOGE("setIndicationFilterResponse: radioService[%d]->mRadioResponse == NULL",
Jack Yu11ab4042017-02-21 17:08:01 -08006486 slotId);
6487 }
6488
6489 return 0;
6490}
6491
Amit Mahajan759786a2017-03-03 17:35:47 -08006492int radio::setSimCardPowerResponse(int slotId,
Wileen Chiu718c0bf2017-01-04 11:37:19 -08006493 int responseType, int serial, RIL_Errno e,
6494 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006495#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006496 RLOGD("setSimCardPowerResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006497#endif
Wileen Chiu718c0bf2017-01-04 11:37:19 -08006498
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07006499 if (radioService[slotId]->mRadioResponse != NULL
6500 || radioService[slotId]->mRadioResponseV1_1 != NULL) {
Wileen Chiu718c0bf2017-01-04 11:37:19 -08006501 RadioResponseInfo responseInfo = {};
6502 populateResponseInfo(responseInfo, serial, responseType, e);
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07006503 if (radioService[slotId]->mRadioResponseV1_1 != NULL) {
6504 Return<void> retStatus = radioService[slotId]->mRadioResponseV1_1->
6505 setSimCardPowerResponse_1_1(responseInfo);
Grace Chen08eb6542017-03-23 18:39:48 -07006506 radioService[slotId]->checkReturnStatus(retStatus);
6507 } else {
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07006508 RLOGD("setSimCardPowerResponse: radioService[%d]->mRadioResponseV1_1 == NULL",
Grace Chen08eb6542017-03-23 18:39:48 -07006509 slotId);
6510 Return<void> retStatus
6511 = radioService[slotId]->mRadioResponse->setSimCardPowerResponse(responseInfo);
6512 radioService[slotId]->checkReturnStatus(retStatus);
6513 }
Wileen Chiu718c0bf2017-01-04 11:37:19 -08006514 } else {
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07006515 RLOGE("setSimCardPowerResponse: radioService[%d]->mRadioResponse == NULL && "
6516 "radioService[%d]->mRadioResponseV1_1 == NULL", slotId, slotId);
Wileen Chiu718c0bf2017-01-04 11:37:19 -08006517 }
Wileen Chiu718c0bf2017-01-04 11:37:19 -08006518 return 0;
6519}
6520
yinxu8688abd2017-05-22 11:26:45 -07006521int radio::startNetworkScanResponse(int slotId, int responseType, int serial, RIL_Errno e,
6522 void *response, size_t responseLen) {
6523#if VDBG
6524 RLOGD("startNetworkScanResponse: serial %d", serial);
6525#endif
6526
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07006527 if (radioService[slotId]->mRadioResponseV1_1 != NULL) {
yinxu8688abd2017-05-22 11:26:45 -07006528 RadioResponseInfo responseInfo = {};
6529 populateResponseInfo(responseInfo, serial, responseType, e);
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07006530 Return<void> retStatus
6531 = radioService[slotId]->mRadioResponseV1_1->startNetworkScanResponse(responseInfo);
6532 radioService[slotId]->checkReturnStatus(retStatus);
yinxu8688abd2017-05-22 11:26:45 -07006533 } else {
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07006534 RLOGE("startNetworkScanResponse: radioService[%d]->mRadioResponseV1_1 == NULL", slotId);
yinxu8688abd2017-05-22 11:26:45 -07006535 }
6536
6537 return 0;
6538}
6539
6540int radio::stopNetworkScanResponse(int slotId, int responseType, int serial, RIL_Errno e,
6541 void *response, size_t responseLen) {
6542#if VDBG
6543 RLOGD("stopNetworkScanResponse: serial %d", serial);
6544#endif
6545
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07006546 if (radioService[slotId]->mRadioResponseV1_1 != NULL) {
yinxu8688abd2017-05-22 11:26:45 -07006547 RadioResponseInfo responseInfo = {};
6548 populateResponseInfo(responseInfo, serial, responseType, e);
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07006549 Return<void> retStatus
6550 = radioService[slotId]->mRadioResponseV1_1->stopNetworkScanResponse(responseInfo);
6551 radioService[slotId]->checkReturnStatus(retStatus);
yinxu8688abd2017-05-22 11:26:45 -07006552 } else {
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07006553 RLOGE("stopNetworkScanResponse: radioService[%d]->mRadioResponseV1_1 == NULL", slotId);
yinxu8688abd2017-05-22 11:26:45 -07006554 }
6555
6556 return 0;
6557}
6558
Amit Mahajan759786a2017-03-03 17:35:47 -08006559int radio::sendRequestRawResponse(int slotId,
Amit Mahajan439da362017-02-13 17:43:04 -08006560 int responseType, int serial, RIL_Errno e,
6561 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006562#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006563 RLOGD("sendRequestRawResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006564#endif
Amit Mahajan439da362017-02-13 17:43:04 -08006565
6566 if (oemHookService[slotId]->mOemHookResponse != NULL) {
6567 RadioResponseInfo responseInfo = {};
6568 populateResponseInfo(responseInfo, serial, responseType, e);
6569 hidl_vec<uint8_t> data;
6570
6571 if (response == NULL) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006572 RLOGE("sendRequestRawResponse: Invalid response");
Amit Mahajan439da362017-02-13 17:43:04 -08006573 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
6574 } else {
6575 data.setToExternal((uint8_t *) response, responseLen);
6576 }
6577 Return<void> retStatus = oemHookService[slotId]->mOemHookResponse->
6578 sendRequestRawResponse(responseInfo, data);
Amit Mahajand423d192017-03-16 17:04:01 -07006579 checkReturnStatus(slotId, retStatus, false);
Amit Mahajan439da362017-02-13 17:43:04 -08006580 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006581 RLOGE("sendRequestRawResponse: oemHookService[%d]->mOemHookResponse == NULL",
Amit Mahajan439da362017-02-13 17:43:04 -08006582 slotId);
6583 }
6584
6585 return 0;
6586}
6587
Amit Mahajan759786a2017-03-03 17:35:47 -08006588int radio::sendRequestStringsResponse(int slotId,
Amit Mahajan439da362017-02-13 17:43:04 -08006589 int responseType, int serial, RIL_Errno e,
6590 void *response, size_t responseLen) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006591#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006592 RLOGD("sendRequestStringsResponse: serial %d", serial);
Jayachandran C572f2f42017-03-25 14:30:13 -07006593#endif
Amit Mahajan439da362017-02-13 17:43:04 -08006594
6595 if (oemHookService[slotId]->mOemHookResponse != NULL) {
6596 RadioResponseInfo responseInfo = {};
6597 populateResponseInfo(responseInfo, serial, responseType, e);
6598 hidl_vec<hidl_string> data;
6599
Amit Mahajan13058cb2017-06-07 23:10:27 -07006600 if ((response == NULL && responseLen != 0) || responseLen % sizeof(char *) != 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006601 RLOGE("sendRequestStringsResponse Invalid response: NULL");
Amit Mahajan439da362017-02-13 17:43:04 -08006602 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
6603 } else {
6604 char **resp = (char **) response;
6605 int numStrings = responseLen / sizeof(char *);
6606 data.resize(numStrings);
6607 for (int i = 0; i < numStrings; i++) {
6608 data[i] = convertCharPtrToHidlString(resp[i]);
6609 }
6610 }
6611 Return<void> retStatus
6612 = oemHookService[slotId]->mOemHookResponse->sendRequestStringsResponse(
6613 responseInfo, data);
Amit Mahajand423d192017-03-16 17:04:01 -07006614 checkReturnStatus(slotId, retStatus, false);
Amit Mahajan439da362017-02-13 17:43:04 -08006615 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006616 RLOGE("sendRequestStringsResponse: oemHookService[%d]->mOemHookResponse == "
Amit Mahajan439da362017-02-13 17:43:04 -08006617 "NULL", slotId);
6618 }
6619
6620 return 0;
6621}
6622
Sanket Padawe378ccdd2017-01-24 14:11:12 -08006623// Radio Indication functions
6624
Amit Mahajan5829a472016-12-28 17:28:07 -08006625RadioIndicationType convertIntToRadioIndicationType(int indicationType) {
6626 return indicationType == RESPONSE_UNSOLICITED ? (RadioIndicationType::UNSOLICITED) :
6627 (RadioIndicationType::UNSOLICITED_ACK_EXP);
6628}
6629
Amit Mahajan759786a2017-03-03 17:35:47 -08006630int radio::radioStateChangedInd(int slotId,
Amit Mahajan1f652692017-03-01 12:08:46 -08006631 int indicationType, int token, RIL_Errno e, void *response,
6632 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08006633 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajanb3a11bb2017-05-15 16:41:44 -07006634 RadioState radioState =
6635 (RadioState) CALL_ONSTATEREQUEST(slotId);
Amit Mahajan111ddca2017-03-03 12:05:13 -08006636 RLOGD("radioStateChangedInd: radioState %d", radioState);
Amit Mahajan17249842017-01-19 15:05:45 -08006637 Return<void> retStatus = radioService[slotId]->mRadioIndication->radioStateChanged(
Amit Mahajan1f652692017-03-01 12:08:46 -08006638 convertIntToRadioIndicationType(indicationType), radioState);
Amit Mahajan17249842017-01-19 15:05:45 -08006639 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajancd77a5b2016-08-25 11:19:21 -07006640 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006641 RLOGE("radioStateChangedInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajancd77a5b2016-08-25 11:19:21 -07006642 }
Amit Mahajan1f652692017-03-01 12:08:46 -08006643
6644 return 0;
Amit Mahajancd77a5b2016-08-25 11:19:21 -07006645}
6646
Amit Mahajan759786a2017-03-03 17:35:47 -08006647int radio::callStateChangedInd(int slotId,
Amit Mahajan5829a472016-12-28 17:28:07 -08006648 int indicationType, int token, RIL_Errno e, void *response,
6649 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08006650 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006651#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006652 RLOGD("callStateChangedInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07006653#endif
Amit Mahajan17249842017-01-19 15:05:45 -08006654 Return<void> retStatus = radioService[slotId]->mRadioIndication->callStateChanged(
Amit Mahajan5829a472016-12-28 17:28:07 -08006655 convertIntToRadioIndicationType(indicationType));
Amit Mahajan17249842017-01-19 15:05:45 -08006656 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08006657 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006658 RLOGE("callStateChangedInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08006659 }
6660
6661 return 0;
6662}
6663
Amit Mahajan759786a2017-03-03 17:35:47 -08006664int radio::networkStateChangedInd(int slotId,
Amit Mahajan1f652692017-03-01 12:08:46 -08006665 int indicationType, int token, RIL_Errno e, void *response,
6666 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08006667 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Jayachandran C572f2f42017-03-25 14:30:13 -07006668#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006669 RLOGD("networkStateChangedInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07006670#endif
Jack Yu06181bb2017-01-10 12:10:41 -08006671 Return<void> retStatus = radioService[slotId]->mRadioIndication->networkStateChanged(
Amit Mahajan5829a472016-12-28 17:28:07 -08006672 convertIntToRadioIndicationType(indicationType));
Amit Mahajan17249842017-01-19 15:05:45 -08006673 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08006674 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006675 RLOGE("networkStateChangedInd: radioService[%d]->mRadioIndication == NULL",
Amit Mahajan2fa9e632017-01-06 16:55:33 -08006676 slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08006677 }
6678
6679 return 0;
6680}
6681
6682uint8_t hexCharToInt(uint8_t c) {
6683 if (c >= '0' && c <= '9') return (c - '0');
6684 if (c >= 'A' && c <= 'F') return (c - 'A' + 10);
6685 if (c >= 'a' && c <= 'f') return (c - 'a' + 10);
6686
6687 return INVALID_HEX_CHAR;
6688}
6689
6690uint8_t * convertHexStringToBytes(void *response, size_t responseLen) {
6691 if (responseLen % 2 != 0) {
6692 return NULL;
6693 }
6694
6695 uint8_t *bytes = (uint8_t *)calloc(responseLen/2, sizeof(uint8_t));
6696 if (bytes == NULL) {
6697 RLOGE("convertHexStringToBytes: cannot allocate memory for bytes string");
6698 return NULL;
6699 }
6700 uint8_t *hexString = (uint8_t *)response;
6701
Wei Wang100ac9b2017-02-03 14:18:07 -08006702 for (size_t i = 0; i < responseLen; i += 2) {
Amit Mahajan5829a472016-12-28 17:28:07 -08006703 uint8_t hexChar1 = hexCharToInt(hexString[i]);
6704 uint8_t hexChar2 = hexCharToInt(hexString[i + 1]);
6705
6706 if (hexChar1 == INVALID_HEX_CHAR || hexChar2 == INVALID_HEX_CHAR) {
6707 RLOGE("convertHexStringToBytes: invalid hex char %d %d",
6708 hexString[i], hexString[i + 1]);
6709 free(bytes);
6710 return NULL;
6711 }
6712 bytes[i/2] = ((hexChar1 << 4) | hexChar2);
6713 }
6714
6715 return bytes;
6716}
6717
Amit Mahajan759786a2017-03-03 17:35:47 -08006718int radio::newSmsInd(int slotId, int indicationType,
Amit Mahajan5829a472016-12-28 17:28:07 -08006719 int token, RIL_Errno e, void *response, size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08006720 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan5829a472016-12-28 17:28:07 -08006721 if (response == NULL || responseLen == 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006722 RLOGE("newSmsInd: invalid response");
Amit Mahajan5829a472016-12-28 17:28:07 -08006723 return 0;
6724 }
6725
6726 uint8_t *bytes = convertHexStringToBytes(response, responseLen);
6727 if (bytes == NULL) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006728 RLOGE("newSmsInd: convertHexStringToBytes failed");
Amit Mahajan5829a472016-12-28 17:28:07 -08006729 return 0;
6730 }
6731
6732 hidl_vec<uint8_t> pdu;
6733 pdu.setToExternal(bytes, responseLen/2);
Jayachandran C572f2f42017-03-25 14:30:13 -07006734#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006735 RLOGD("newSmsInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07006736#endif
Amit Mahajan17249842017-01-19 15:05:45 -08006737 Return<void> retStatus = radioService[slotId]->mRadioIndication->newSms(
Amit Mahajan5829a472016-12-28 17:28:07 -08006738 convertIntToRadioIndicationType(indicationType), pdu);
Amit Mahajan17249842017-01-19 15:05:45 -08006739 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08006740 free(bytes);
6741 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006742 RLOGE("newSmsInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08006743 }
6744
6745 return 0;
6746}
6747
Amit Mahajan759786a2017-03-03 17:35:47 -08006748int radio::newSmsStatusReportInd(int slotId,
Amit Mahajan5829a472016-12-28 17:28:07 -08006749 int indicationType, int token, RIL_Errno e, void *response,
6750 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08006751 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan5829a472016-12-28 17:28:07 -08006752 if (response == NULL || responseLen == 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006753 RLOGE("newSmsStatusReportInd: invalid response");
Amit Mahajan5829a472016-12-28 17:28:07 -08006754 return 0;
6755 }
6756
6757 uint8_t *bytes = convertHexStringToBytes(response, responseLen);
6758 if (bytes == NULL) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006759 RLOGE("newSmsStatusReportInd: convertHexStringToBytes failed");
Amit Mahajan5829a472016-12-28 17:28:07 -08006760 return 0;
6761 }
6762
6763 hidl_vec<uint8_t> pdu;
6764 pdu.setToExternal(bytes, responseLen/2);
Jayachandran C572f2f42017-03-25 14:30:13 -07006765#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006766 RLOGD("newSmsStatusReportInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07006767#endif
Amit Mahajan17249842017-01-19 15:05:45 -08006768 Return<void> retStatus = radioService[slotId]->mRadioIndication->newSmsStatusReport(
Amit Mahajan5829a472016-12-28 17:28:07 -08006769 convertIntToRadioIndicationType(indicationType), pdu);
Amit Mahajan17249842017-01-19 15:05:45 -08006770 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08006771 free(bytes);
6772 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006773 RLOGE("newSmsStatusReportInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08006774 }
6775
6776 return 0;
6777}
6778
Amit Mahajan759786a2017-03-03 17:35:47 -08006779int radio::newSmsOnSimInd(int slotId, int indicationType,
Amit Mahajan5829a472016-12-28 17:28:07 -08006780 int token, RIL_Errno e, void *response, size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08006781 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan5829a472016-12-28 17:28:07 -08006782 if (response == NULL || responseLen != sizeof(int)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006783 RLOGE("newSmsOnSimInd: invalid response");
Amit Mahajan5829a472016-12-28 17:28:07 -08006784 return 0;
6785 }
6786 int32_t recordNumber = ((int32_t *) response)[0];
Jayachandran C572f2f42017-03-25 14:30:13 -07006787#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006788 RLOGD("newSmsOnSimInd: slotIndex %d", recordNumber);
Jayachandran C572f2f42017-03-25 14:30:13 -07006789#endif
Amit Mahajan17249842017-01-19 15:05:45 -08006790 Return<void> retStatus = radioService[slotId]->mRadioIndication->newSmsOnSim(
Amit Mahajan5829a472016-12-28 17:28:07 -08006791 convertIntToRadioIndicationType(indicationType), recordNumber);
Amit Mahajan17249842017-01-19 15:05:45 -08006792 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08006793 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006794 RLOGE("newSmsOnSimInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08006795 }
6796
6797 return 0;
6798}
6799
Amit Mahajan759786a2017-03-03 17:35:47 -08006800int radio::onUssdInd(int slotId, int indicationType,
Amit Mahajan5829a472016-12-28 17:28:07 -08006801 int token, RIL_Errno e, void *response, size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08006802 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan5829a472016-12-28 17:28:07 -08006803 if (response == NULL || responseLen != 2 * sizeof(char *)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006804 RLOGE("onUssdInd: invalid response");
Amit Mahajan5829a472016-12-28 17:28:07 -08006805 return 0;
6806 }
6807 char **strings = (char **) response;
6808 char *mode = strings[0];
6809 hidl_string msg = convertCharPtrToHidlString(strings[1]);
6810 UssdModeType modeType = (UssdModeType) atoi(mode);
Jayachandran C572f2f42017-03-25 14:30:13 -07006811#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006812 RLOGD("onUssdInd: mode %s", mode);
Jayachandran C572f2f42017-03-25 14:30:13 -07006813#endif
Amit Mahajan17249842017-01-19 15:05:45 -08006814 Return<void> retStatus = radioService[slotId]->mRadioIndication->onUssd(
Amit Mahajan5829a472016-12-28 17:28:07 -08006815 convertIntToRadioIndicationType(indicationType), modeType, msg);
Amit Mahajan17249842017-01-19 15:05:45 -08006816 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08006817 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006818 RLOGE("onUssdInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08006819 }
6820
6821 return 0;
6822}
6823
Amit Mahajan759786a2017-03-03 17:35:47 -08006824int radio::nitzTimeReceivedInd(int slotId,
Amit Mahajan5829a472016-12-28 17:28:07 -08006825 int indicationType, int token, RIL_Errno e, void *response,
6826 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08006827 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan5829a472016-12-28 17:28:07 -08006828 if (response == NULL || responseLen == 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006829 RLOGE("nitzTimeReceivedInd: invalid response");
Amit Mahajan5829a472016-12-28 17:28:07 -08006830 return 0;
6831 }
6832 hidl_string nitzTime = convertCharPtrToHidlString((char *) response);
6833 int64_t timeReceived = android::elapsedRealtime();
Jayachandran C572f2f42017-03-25 14:30:13 -07006834#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006835 RLOGD("nitzTimeReceivedInd: nitzTime %s receivedTime %" PRId64, nitzTime.c_str(),
Amit Mahajan2fa9e632017-01-06 16:55:33 -08006836 timeReceived);
Jayachandran C572f2f42017-03-25 14:30:13 -07006837#endif
Amit Mahajan17249842017-01-19 15:05:45 -08006838 Return<void> retStatus = radioService[slotId]->mRadioIndication->nitzTimeReceived(
Amit Mahajan5829a472016-12-28 17:28:07 -08006839 convertIntToRadioIndicationType(indicationType), nitzTime, timeReceived);
Amit Mahajan17249842017-01-19 15:05:45 -08006840 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08006841 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006842 RLOGE("nitzTimeReceivedInd: radioService[%d]->mRadioIndication == NULL", slotId);
Weilun Dud2c30932017-02-09 12:32:42 -08006843 return -1;
Amit Mahajan5829a472016-12-28 17:28:07 -08006844 }
6845
6846 return 0;
6847}
6848
Amit Mahajan2fa9e632017-01-06 16:55:33 -08006849void convertRilSignalStrengthToHal(void *response, size_t responseLen,
6850 SignalStrength& signalStrength) {
6851 RIL_SignalStrength_v10 *rilSignalStrength = (RIL_SignalStrength_v10 *) response;
6852
6853 // Fixup LTE for backwards compatibility
6854 // signalStrength: -1 -> 99
6855 if (rilSignalStrength->LTE_SignalStrength.signalStrength == -1) {
6856 rilSignalStrength->LTE_SignalStrength.signalStrength = 99;
6857 }
6858 // rsrp: -1 -> INT_MAX all other negative value to positive.
6859 // So remap here
6860 if (rilSignalStrength->LTE_SignalStrength.rsrp == -1) {
6861 rilSignalStrength->LTE_SignalStrength.rsrp = INT_MAX;
6862 } else if (rilSignalStrength->LTE_SignalStrength.rsrp < -1) {
6863 rilSignalStrength->LTE_SignalStrength.rsrp = -rilSignalStrength->LTE_SignalStrength.rsrp;
6864 }
6865 // rsrq: -1 -> INT_MAX
6866 if (rilSignalStrength->LTE_SignalStrength.rsrq == -1) {
6867 rilSignalStrength->LTE_SignalStrength.rsrq = INT_MAX;
6868 }
6869 // Not remapping rssnr is already using INT_MAX
6870 // cqi: -1 -> INT_MAX
6871 if (rilSignalStrength->LTE_SignalStrength.cqi == -1) {
6872 rilSignalStrength->LTE_SignalStrength.cqi = INT_MAX;
6873 }
6874
6875 signalStrength.gw.signalStrength = rilSignalStrength->GW_SignalStrength.signalStrength;
6876 signalStrength.gw.bitErrorRate = rilSignalStrength->GW_SignalStrength.bitErrorRate;
6877 signalStrength.cdma.dbm = rilSignalStrength->CDMA_SignalStrength.dbm;
6878 signalStrength.cdma.ecio = rilSignalStrength->CDMA_SignalStrength.ecio;
6879 signalStrength.evdo.dbm = rilSignalStrength->EVDO_SignalStrength.dbm;
6880 signalStrength.evdo.ecio = rilSignalStrength->EVDO_SignalStrength.ecio;
6881 signalStrength.evdo.signalNoiseRatio =
6882 rilSignalStrength->EVDO_SignalStrength.signalNoiseRatio;
6883 signalStrength.lte.signalStrength = rilSignalStrength->LTE_SignalStrength.signalStrength;
6884 signalStrength.lte.rsrp = rilSignalStrength->LTE_SignalStrength.rsrp;
6885 signalStrength.lte.rsrq = rilSignalStrength->LTE_SignalStrength.rsrq;
6886 signalStrength.lte.rssnr = rilSignalStrength->LTE_SignalStrength.rssnr;
6887 signalStrength.lte.cqi = rilSignalStrength->LTE_SignalStrength.cqi;
6888 signalStrength.lte.timingAdvance = rilSignalStrength->LTE_SignalStrength.timingAdvance;
6889 signalStrength.tdScdma.rscp = rilSignalStrength->TD_SCDMA_SignalStrength.rscp;
6890}
6891
Amit Mahajan759786a2017-03-03 17:35:47 -08006892int radio::currentSignalStrengthInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08006893 int indicationType, int token, RIL_Errno e,
6894 void *response, size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08006895 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan2fa9e632017-01-06 16:55:33 -08006896 if (response == NULL || responseLen != sizeof(RIL_SignalStrength_v10)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006897 RLOGE("currentSignalStrengthInd: invalid response");
Amit Mahajan2fa9e632017-01-06 16:55:33 -08006898 return 0;
6899 }
6900
Jack Yuf68e0da2017-02-07 14:53:09 -08006901 SignalStrength signalStrength = {};
Amit Mahajan2fa9e632017-01-06 16:55:33 -08006902 convertRilSignalStrengthToHal(response, responseLen, signalStrength);
6903
Jayachandran C572f2f42017-03-25 14:30:13 -07006904#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006905 RLOGD("currentSignalStrengthInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07006906#endif
Amit Mahajan17249842017-01-19 15:05:45 -08006907 Return<void> retStatus = radioService[slotId]->mRadioIndication->currentSignalStrength(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08006908 convertIntToRadioIndicationType(indicationType), signalStrength);
Amit Mahajan17249842017-01-19 15:05:45 -08006909 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08006910 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006911 RLOGE("currentSignalStrengthInd: radioService[%d]->mRadioIndication == NULL",
Amit Mahajan2fa9e632017-01-06 16:55:33 -08006912 slotId);
6913 }
6914
6915 return 0;
6916}
6917
Amit Mahajan5829a472016-12-28 17:28:07 -08006918void convertRilDataCallToHal(RIL_Data_Call_Response_v11 *dcResponse,
6919 SetupDataCallResult& dcResult) {
Jack Yu5079e182017-02-28 15:21:18 -08006920 dcResult.status = (DataCallFailCause) dcResponse->status;
Amit Mahajan5829a472016-12-28 17:28:07 -08006921 dcResult.suggestedRetryTime = dcResponse->suggestedRetryTime;
6922 dcResult.cid = dcResponse->cid;
6923 dcResult.active = dcResponse->active;
6924 dcResult.type = convertCharPtrToHidlString(dcResponse->type);
6925 dcResult.ifname = convertCharPtrToHidlString(dcResponse->ifname);
6926 dcResult.addresses = convertCharPtrToHidlString(dcResponse->addresses);
6927 dcResult.dnses = convertCharPtrToHidlString(dcResponse->dnses);
6928 dcResult.gateways = convertCharPtrToHidlString(dcResponse->gateways);
6929 dcResult.pcscf = convertCharPtrToHidlString(dcResponse->pcscf);
6930 dcResult.mtu = dcResponse->mtu;
6931}
6932
6933void convertRilDataCallListToHal(void *response, size_t responseLen,
6934 hidl_vec<SetupDataCallResult>& dcResultList) {
6935 int num = responseLen / sizeof(RIL_Data_Call_Response_v11);
6936
6937 RIL_Data_Call_Response_v11 *dcResponse = (RIL_Data_Call_Response_v11 *) response;
6938 dcResultList.resize(num);
6939 for (int i = 0; i < num; i++) {
6940 convertRilDataCallToHal(&dcResponse[i], dcResultList[i]);
6941 }
6942}
6943
Amit Mahajan759786a2017-03-03 17:35:47 -08006944int radio::dataCallListChangedInd(int slotId,
Amit Mahajan5829a472016-12-28 17:28:07 -08006945 int indicationType, int token, RIL_Errno e, void *response,
6946 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08006947 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan13058cb2017-06-07 23:10:27 -07006948 if ((response == NULL && responseLen != 0)
6949 || responseLen % sizeof(RIL_Data_Call_Response_v11) != 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006950 RLOGE("dataCallListChangedInd: invalid response");
Amit Mahajan5829a472016-12-28 17:28:07 -08006951 return 0;
6952 }
6953 hidl_vec<SetupDataCallResult> dcList;
6954 convertRilDataCallListToHal(response, responseLen, dcList);
Jayachandran C572f2f42017-03-25 14:30:13 -07006955#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006956 RLOGD("dataCallListChangedInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07006957#endif
Amit Mahajan17249842017-01-19 15:05:45 -08006958 Return<void> retStatus = radioService[slotId]->mRadioIndication->dataCallListChanged(
Amit Mahajan5829a472016-12-28 17:28:07 -08006959 convertIntToRadioIndicationType(indicationType), dcList);
Amit Mahajan17249842017-01-19 15:05:45 -08006960 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08006961 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006962 RLOGE("dataCallListChangedInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08006963 }
6964
6965 return 0;
6966}
6967
Amit Mahajan759786a2017-03-03 17:35:47 -08006968int radio::suppSvcNotifyInd(int slotId, int indicationType,
Amit Mahajan5829a472016-12-28 17:28:07 -08006969 int token, RIL_Errno e, void *response, size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08006970 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan5829a472016-12-28 17:28:07 -08006971 if (response == NULL || responseLen != sizeof(RIL_SuppSvcNotification)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006972 RLOGE("suppSvcNotifyInd: invalid response");
Amit Mahajan5829a472016-12-28 17:28:07 -08006973 return 0;
6974 }
6975
Jack Yuf68e0da2017-02-07 14:53:09 -08006976 SuppSvcNotification suppSvc = {};
Amit Mahajan5829a472016-12-28 17:28:07 -08006977 RIL_SuppSvcNotification *ssn = (RIL_SuppSvcNotification *) response;
6978 suppSvc.isMT = ssn->notificationType;
6979 suppSvc.code = ssn->code;
6980 suppSvc.index = ssn->index;
6981 suppSvc.type = ssn->type;
6982 suppSvc.number = convertCharPtrToHidlString(ssn->number);
6983
Jayachandran C572f2f42017-03-25 14:30:13 -07006984#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08006985 RLOGD("suppSvcNotifyInd: isMT %d code %d index %d type %d",
Amit Mahajan5829a472016-12-28 17:28:07 -08006986 suppSvc.isMT, suppSvc.code, suppSvc.index, suppSvc.type);
Jayachandran C572f2f42017-03-25 14:30:13 -07006987#endif
Amit Mahajan17249842017-01-19 15:05:45 -08006988 Return<void> retStatus = radioService[slotId]->mRadioIndication->suppSvcNotify(
Amit Mahajan5829a472016-12-28 17:28:07 -08006989 convertIntToRadioIndicationType(indicationType), suppSvc);
Amit Mahajan17249842017-01-19 15:05:45 -08006990 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08006991 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08006992 RLOGE("suppSvcNotifyInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08006993 }
6994
6995 return 0;
6996}
6997
Amit Mahajan759786a2017-03-03 17:35:47 -08006998int radio::stkSessionEndInd(int slotId, int indicationType,
Amit Mahajan5829a472016-12-28 17:28:07 -08006999 int token, RIL_Errno e, void *response, size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007000 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Jayachandran C572f2f42017-03-25 14:30:13 -07007001#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007002 RLOGD("stkSessionEndInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07007003#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007004 Return<void> retStatus = radioService[slotId]->mRadioIndication->stkSessionEnd(
Amit Mahajan5829a472016-12-28 17:28:07 -08007005 convertIntToRadioIndicationType(indicationType));
Amit Mahajan17249842017-01-19 15:05:45 -08007006 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08007007 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007008 RLOGE("stkSessionEndInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08007009 }
7010
7011 return 0;
7012}
7013
Amit Mahajan759786a2017-03-03 17:35:47 -08007014int radio::stkProactiveCommandInd(int slotId,
Amit Mahajan5829a472016-12-28 17:28:07 -08007015 int indicationType, int token, RIL_Errno e, void *response,
7016 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007017 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan5829a472016-12-28 17:28:07 -08007018 if (response == NULL || responseLen == 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007019 RLOGE("stkProactiveCommandInd: invalid response");
Amit Mahajan5829a472016-12-28 17:28:07 -08007020 return 0;
7021 }
Jayachandran C572f2f42017-03-25 14:30:13 -07007022#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007023 RLOGD("stkProactiveCommandInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07007024#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007025 Return<void> retStatus = radioService[slotId]->mRadioIndication->stkProactiveCommand(
Amit Mahajan5829a472016-12-28 17:28:07 -08007026 convertIntToRadioIndicationType(indicationType),
7027 convertCharPtrToHidlString((char *) response));
Amit Mahajan17249842017-01-19 15:05:45 -08007028 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08007029 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007030 RLOGE("stkProactiveCommandInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08007031 }
7032
7033 return 0;
7034}
7035
Amit Mahajan759786a2017-03-03 17:35:47 -08007036int radio::stkEventNotifyInd(int slotId, int indicationType,
Amit Mahajan5829a472016-12-28 17:28:07 -08007037 int token, RIL_Errno e, void *response, size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007038 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan5829a472016-12-28 17:28:07 -08007039 if (response == NULL || responseLen == 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007040 RLOGE("stkEventNotifyInd: invalid response");
Amit Mahajan5829a472016-12-28 17:28:07 -08007041 return 0;
7042 }
Jayachandran C572f2f42017-03-25 14:30:13 -07007043#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007044 RLOGD("stkEventNotifyInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07007045#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007046 Return<void> retStatus = radioService[slotId]->mRadioIndication->stkEventNotify(
Amit Mahajan5829a472016-12-28 17:28:07 -08007047 convertIntToRadioIndicationType(indicationType),
7048 convertCharPtrToHidlString((char *) response));
Amit Mahajan17249842017-01-19 15:05:45 -08007049 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08007050 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007051 RLOGE("stkEventNotifyInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08007052 }
7053
7054 return 0;
7055}
7056
Amit Mahajan759786a2017-03-03 17:35:47 -08007057int radio::stkCallSetupInd(int slotId, int indicationType,
Amit Mahajan5829a472016-12-28 17:28:07 -08007058 int token, RIL_Errno e, void *response, size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007059 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan5829a472016-12-28 17:28:07 -08007060 if (response == NULL || responseLen != sizeof(int)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007061 RLOGE("stkCallSetupInd: invalid response");
Amit Mahajan5829a472016-12-28 17:28:07 -08007062 return 0;
7063 }
7064 int32_t timeout = ((int32_t *) response)[0];
Jayachandran C572f2f42017-03-25 14:30:13 -07007065#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007066 RLOGD("stkCallSetupInd: timeout %d", timeout);
Jayachandran C572f2f42017-03-25 14:30:13 -07007067#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007068 Return<void> retStatus = radioService[slotId]->mRadioIndication->stkCallSetup(
Amit Mahajan5829a472016-12-28 17:28:07 -08007069 convertIntToRadioIndicationType(indicationType), timeout);
Amit Mahajan17249842017-01-19 15:05:45 -08007070 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08007071 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007072 RLOGE("stkCallSetupInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08007073 }
7074
7075 return 0;
7076}
7077
Amit Mahajan759786a2017-03-03 17:35:47 -08007078int radio::simSmsStorageFullInd(int slotId,
Amit Mahajan5829a472016-12-28 17:28:07 -08007079 int indicationType, int token, RIL_Errno e, void *response,
7080 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007081 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Jayachandran C572f2f42017-03-25 14:30:13 -07007082#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007083 RLOGD("simSmsStorageFullInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07007084#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007085 Return<void> retStatus = radioService[slotId]->mRadioIndication->simSmsStorageFull(
Amit Mahajan5829a472016-12-28 17:28:07 -08007086 convertIntToRadioIndicationType(indicationType));
Amit Mahajan17249842017-01-19 15:05:45 -08007087 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08007088 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007089 RLOGE("simSmsStorageFullInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08007090 }
7091
7092 return 0;
7093}
7094
Amit Mahajan759786a2017-03-03 17:35:47 -08007095int radio::simRefreshInd(int slotId, int indicationType,
Amit Mahajan5829a472016-12-28 17:28:07 -08007096 int token, RIL_Errno e, void *response, size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007097 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan5829a472016-12-28 17:28:07 -08007098 if (response == NULL || responseLen != sizeof(RIL_SimRefreshResponse_v7)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007099 RLOGE("simRefreshInd: invalid response");
Amit Mahajan5829a472016-12-28 17:28:07 -08007100 return 0;
7101 }
7102
Jack Yuf68e0da2017-02-07 14:53:09 -08007103 SimRefreshResult refreshResult = {};
Amit Mahajan5829a472016-12-28 17:28:07 -08007104 RIL_SimRefreshResponse_v7 *simRefreshResponse = ((RIL_SimRefreshResponse_v7 *) response);
7105 refreshResult.type =
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07007106 (V1_0::SimRefreshType) simRefreshResponse->result;
Amit Mahajan5829a472016-12-28 17:28:07 -08007107 refreshResult.efId = simRefreshResponse->ef_id;
7108 refreshResult.aid = convertCharPtrToHidlString(simRefreshResponse->aid);
7109
Jayachandran C572f2f42017-03-25 14:30:13 -07007110#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007111 RLOGD("simRefreshInd: type %d efId %d", refreshResult.type, refreshResult.efId);
Jayachandran C572f2f42017-03-25 14:30:13 -07007112#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007113 Return<void> retStatus = radioService[slotId]->mRadioIndication->simRefresh(
Amit Mahajan5829a472016-12-28 17:28:07 -08007114 convertIntToRadioIndicationType(indicationType), refreshResult);
Amit Mahajan17249842017-01-19 15:05:45 -08007115 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08007116 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007117 RLOGE("simRefreshInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08007118 }
7119
7120 return 0;
7121}
7122
7123void convertRilCdmaSignalInfoRecordToHal(RIL_CDMA_SignalInfoRecord *signalInfoRecord,
7124 CdmaSignalInfoRecord& record) {
7125 record.isPresent = signalInfoRecord->isPresent;
7126 record.signalType = signalInfoRecord->signalType;
7127 record.alertPitch = signalInfoRecord->alertPitch;
7128 record.signal = signalInfoRecord->signal;
7129}
7130
Amit Mahajan759786a2017-03-03 17:35:47 -08007131int radio::callRingInd(int slotId, int indicationType,
Amit Mahajan5829a472016-12-28 17:28:07 -08007132 int token, RIL_Errno e, void *response, size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007133 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan5829a472016-12-28 17:28:07 -08007134 bool isGsm;
Jack Yuf68e0da2017-02-07 14:53:09 -08007135 CdmaSignalInfoRecord record = {};
Amit Mahajan5829a472016-12-28 17:28:07 -08007136 if (response == NULL || responseLen == 0) {
7137 isGsm = true;
7138 } else {
7139 isGsm = false;
7140 if (responseLen != sizeof (RIL_CDMA_SignalInfoRecord)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007141 RLOGE("callRingInd: invalid response");
Amit Mahajan5829a472016-12-28 17:28:07 -08007142 return 0;
7143 }
7144 convertRilCdmaSignalInfoRecordToHal((RIL_CDMA_SignalInfoRecord *) response, record);
7145 }
7146
Jayachandran C572f2f42017-03-25 14:30:13 -07007147#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007148 RLOGD("callRingInd: isGsm %d", isGsm);
Jayachandran C572f2f42017-03-25 14:30:13 -07007149#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007150 Return<void> retStatus = radioService[slotId]->mRadioIndication->callRing(
Amit Mahajan5829a472016-12-28 17:28:07 -08007151 convertIntToRadioIndicationType(indicationType), isGsm, record);
Amit Mahajan17249842017-01-19 15:05:45 -08007152 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08007153 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007154 RLOGE("callRingInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08007155 }
7156
7157 return 0;
7158}
7159
Amit Mahajan759786a2017-03-03 17:35:47 -08007160int radio::simStatusChangedInd(int slotId,
Amit Mahajan5829a472016-12-28 17:28:07 -08007161 int indicationType, int token, RIL_Errno e, void *response,
7162 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007163 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Jayachandran C572f2f42017-03-25 14:30:13 -07007164#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007165 RLOGD("simStatusChangedInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07007166#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007167 Return<void> retStatus = radioService[slotId]->mRadioIndication->simStatusChanged(
Amit Mahajan5829a472016-12-28 17:28:07 -08007168 convertIntToRadioIndicationType(indicationType));
Amit Mahajan17249842017-01-19 15:05:45 -08007169 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08007170 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007171 RLOGE("simStatusChangedInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08007172 }
7173
7174 return 0;
7175}
7176
Amit Mahajan759786a2017-03-03 17:35:47 -08007177int radio::cdmaNewSmsInd(int slotId, int indicationType,
Amit Mahajan5829a472016-12-28 17:28:07 -08007178 int token, RIL_Errno e, void *response, size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007179 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan5829a472016-12-28 17:28:07 -08007180 if (response == NULL || responseLen != sizeof(RIL_CDMA_SMS_Message)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007181 RLOGE("cdmaNewSmsInd: invalid response");
Amit Mahajan5829a472016-12-28 17:28:07 -08007182 return 0;
7183 }
7184
Jack Yuf68e0da2017-02-07 14:53:09 -08007185 CdmaSmsMessage msg = {};
Amit Mahajan5829a472016-12-28 17:28:07 -08007186 RIL_CDMA_SMS_Message *rilMsg = (RIL_CDMA_SMS_Message *) response;
7187 msg.teleserviceId = rilMsg->uTeleserviceID;
7188 msg.isServicePresent = rilMsg->bIsServicePresent;
7189 msg.serviceCategory = rilMsg->uServicecategory;
7190 msg.address.digitMode =
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07007191 (V1_0::CdmaSmsDigitMode) rilMsg->sAddress.digit_mode;
Amit Mahajan5829a472016-12-28 17:28:07 -08007192 msg.address.numberMode =
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07007193 (V1_0::CdmaSmsNumberMode) rilMsg->sAddress.number_mode;
Amit Mahajan5829a472016-12-28 17:28:07 -08007194 msg.address.numberType =
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07007195 (V1_0::CdmaSmsNumberType) rilMsg->sAddress.number_type;
Amit Mahajan5829a472016-12-28 17:28:07 -08007196 msg.address.numberPlan =
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07007197 (V1_0::CdmaSmsNumberPlan) rilMsg->sAddress.number_plan;
Amit Mahajan5829a472016-12-28 17:28:07 -08007198
7199 int digitLimit = MIN((rilMsg->sAddress.number_of_digits), RIL_CDMA_SMS_ADDRESS_MAX);
7200 msg.address.digits.setToExternal(rilMsg->sAddress.digits, digitLimit);
7201
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07007202 msg.subAddress.subaddressType = (V1_0::CdmaSmsSubaddressType)
Amit Mahajan5829a472016-12-28 17:28:07 -08007203 rilMsg->sSubAddress.subaddressType;
7204 msg.subAddress.odd = rilMsg->sSubAddress.odd;
7205
7206 digitLimit= MIN((rilMsg->sSubAddress.number_of_digits), RIL_CDMA_SMS_SUBADDRESS_MAX);
7207 msg.subAddress.digits.setToExternal(rilMsg->sSubAddress.digits, digitLimit);
7208
7209 digitLimit = MIN((rilMsg->uBearerDataLen), RIL_CDMA_SMS_BEARER_DATA_MAX);
7210 msg.bearerData.setToExternal(rilMsg->aBearerData, digitLimit);
7211
Jayachandran C572f2f42017-03-25 14:30:13 -07007212#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007213 RLOGD("cdmaNewSmsInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07007214#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007215 Return<void> retStatus = radioService[slotId]->mRadioIndication->cdmaNewSms(
Amit Mahajan5829a472016-12-28 17:28:07 -08007216 convertIntToRadioIndicationType(indicationType), msg);
Amit Mahajan17249842017-01-19 15:05:45 -08007217 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan5829a472016-12-28 17:28:07 -08007218 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007219 RLOGE("cdmaNewSmsInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan5829a472016-12-28 17:28:07 -08007220 }
7221
7222 return 0;
7223}
7224
Amit Mahajan759786a2017-03-03 17:35:47 -08007225int radio::newBroadcastSmsInd(int slotId,
Amit Mahajan1955c742016-12-29 07:07:54 -08007226 int indicationType, int token, RIL_Errno e, void *response,
7227 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007228 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan1955c742016-12-29 07:07:54 -08007229 if (response == NULL || responseLen == 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007230 RLOGE("newBroadcastSmsInd: invalid response");
Amit Mahajan1955c742016-12-29 07:07:54 -08007231 return 0;
7232 }
7233
7234 hidl_vec<uint8_t> data;
7235 data.setToExternal((uint8_t *) response, responseLen);
Jayachandran C572f2f42017-03-25 14:30:13 -07007236#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007237 RLOGD("newBroadcastSmsInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07007238#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007239 Return<void> retStatus = radioService[slotId]->mRadioIndication->newBroadcastSms(
Amit Mahajan1955c742016-12-29 07:07:54 -08007240 convertIntToRadioIndicationType(indicationType), data);
Amit Mahajan17249842017-01-19 15:05:45 -08007241 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan1955c742016-12-29 07:07:54 -08007242 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007243 RLOGE("newBroadcastSmsInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan1955c742016-12-29 07:07:54 -08007244 }
7245
7246 return 0;
7247}
7248
Amit Mahajan759786a2017-03-03 17:35:47 -08007249int radio::cdmaRuimSmsStorageFullInd(int slotId,
Amit Mahajan1955c742016-12-29 07:07:54 -08007250 int indicationType, int token, RIL_Errno e, void *response,
7251 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007252 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Jayachandran C572f2f42017-03-25 14:30:13 -07007253#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007254 RLOGD("cdmaRuimSmsStorageFullInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07007255#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007256 Return<void> retStatus = radioService[slotId]->mRadioIndication->cdmaRuimSmsStorageFull(
Amit Mahajan1955c742016-12-29 07:07:54 -08007257 convertIntToRadioIndicationType(indicationType));
Amit Mahajan17249842017-01-19 15:05:45 -08007258 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan1955c742016-12-29 07:07:54 -08007259 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007260 RLOGE("cdmaRuimSmsStorageFullInd: radioService[%d]->mRadioIndication == NULL",
Amit Mahajan1955c742016-12-29 07:07:54 -08007261 slotId);
7262 }
7263
7264 return 0;
7265}
7266
Amit Mahajan759786a2017-03-03 17:35:47 -08007267int radio::restrictedStateChangedInd(int slotId,
Amit Mahajan1955c742016-12-29 07:07:54 -08007268 int indicationType, int token, RIL_Errno e, void *response,
7269 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007270 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan1955c742016-12-29 07:07:54 -08007271 if (response == NULL || responseLen != sizeof(int)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007272 RLOGE("restrictedStateChangedInd: invalid response");
Amit Mahajan1955c742016-12-29 07:07:54 -08007273 return 0;
7274 }
7275 int32_t state = ((int32_t *) response)[0];
Jayachandran C572f2f42017-03-25 14:30:13 -07007276#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007277 RLOGD("restrictedStateChangedInd: state %d", state);
Jayachandran C572f2f42017-03-25 14:30:13 -07007278#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007279 Return<void> retStatus = radioService[slotId]->mRadioIndication->restrictedStateChanged(
Amit Mahajan1955c742016-12-29 07:07:54 -08007280 convertIntToRadioIndicationType(indicationType), (PhoneRestrictedState) state);
Amit Mahajan17249842017-01-19 15:05:45 -08007281 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan1955c742016-12-29 07:07:54 -08007282 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007283 RLOGE("restrictedStateChangedInd: radioService[%d]->mRadioIndication == NULL",
Amit Mahajan1955c742016-12-29 07:07:54 -08007284 slotId);
7285 }
7286
7287 return 0;
7288}
7289
Amit Mahajan759786a2017-03-03 17:35:47 -08007290int radio::enterEmergencyCallbackModeInd(int slotId,
Amit Mahajan1955c742016-12-29 07:07:54 -08007291 int indicationType, int token, RIL_Errno e, void *response,
7292 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007293 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Jayachandran C572f2f42017-03-25 14:30:13 -07007294#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007295 RLOGD("enterEmergencyCallbackModeInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07007296#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007297 Return<void> retStatus = radioService[slotId]->mRadioIndication->enterEmergencyCallbackMode(
Amit Mahajan1955c742016-12-29 07:07:54 -08007298 convertIntToRadioIndicationType(indicationType));
Amit Mahajan17249842017-01-19 15:05:45 -08007299 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan1955c742016-12-29 07:07:54 -08007300 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007301 RLOGE("enterEmergencyCallbackModeInd: radioService[%d]->mRadioIndication == NULL",
Amit Mahajan1955c742016-12-29 07:07:54 -08007302 slotId);
7303 }
7304
7305 return 0;
7306}
7307
Amit Mahajan759786a2017-03-03 17:35:47 -08007308int radio::cdmaCallWaitingInd(int slotId,
Amit Mahajan1955c742016-12-29 07:07:54 -08007309 int indicationType, int token, RIL_Errno e, void *response,
7310 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007311 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan1955c742016-12-29 07:07:54 -08007312 if (response == NULL || responseLen != sizeof(RIL_CDMA_CallWaiting_v6)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007313 RLOGE("cdmaCallWaitingInd: invalid response");
Amit Mahajan1955c742016-12-29 07:07:54 -08007314 return 0;
7315 }
7316
Jack Yuf68e0da2017-02-07 14:53:09 -08007317 CdmaCallWaiting callWaitingRecord = {};
Amit Mahajan1955c742016-12-29 07:07:54 -08007318 RIL_CDMA_CallWaiting_v6 *callWaitingRil = ((RIL_CDMA_CallWaiting_v6 *) response);
7319 callWaitingRecord.number = convertCharPtrToHidlString(callWaitingRil->number);
7320 callWaitingRecord.numberPresentation =
7321 (CdmaCallWaitingNumberPresentation) callWaitingRil->numberPresentation;
7322 callWaitingRecord.name = convertCharPtrToHidlString(callWaitingRil->name);
7323 convertRilCdmaSignalInfoRecordToHal(&callWaitingRil->signalInfoRecord,
7324 callWaitingRecord.signalInfoRecord);
7325 callWaitingRecord.numberType = (CdmaCallWaitingNumberType) callWaitingRil->number_type;
7326 callWaitingRecord.numberPlan = (CdmaCallWaitingNumberPlan) callWaitingRil->number_plan;
7327
Jayachandran C572f2f42017-03-25 14:30:13 -07007328#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007329 RLOGD("cdmaCallWaitingInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07007330#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007331 Return<void> retStatus = radioService[slotId]->mRadioIndication->cdmaCallWaiting(
Amit Mahajan1955c742016-12-29 07:07:54 -08007332 convertIntToRadioIndicationType(indicationType), callWaitingRecord);
Amit Mahajan17249842017-01-19 15:05:45 -08007333 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan1955c742016-12-29 07:07:54 -08007334 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007335 RLOGE("cdmaCallWaitingInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan1955c742016-12-29 07:07:54 -08007336 }
7337
7338 return 0;
7339}
7340
Amit Mahajan759786a2017-03-03 17:35:47 -08007341int radio::cdmaOtaProvisionStatusInd(int slotId,
Amit Mahajan1955c742016-12-29 07:07:54 -08007342 int indicationType, int token, RIL_Errno e, void *response,
7343 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007344 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan1955c742016-12-29 07:07:54 -08007345 if (response == NULL || responseLen != sizeof(int)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007346 RLOGE("cdmaOtaProvisionStatusInd: invalid response");
Amit Mahajan1955c742016-12-29 07:07:54 -08007347 return 0;
7348 }
7349 int32_t status = ((int32_t *) response)[0];
Jayachandran C572f2f42017-03-25 14:30:13 -07007350#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007351 RLOGD("cdmaOtaProvisionStatusInd: status %d", status);
Jayachandran C572f2f42017-03-25 14:30:13 -07007352#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007353 Return<void> retStatus = radioService[slotId]->mRadioIndication->cdmaOtaProvisionStatus(
Amit Mahajan1955c742016-12-29 07:07:54 -08007354 convertIntToRadioIndicationType(indicationType), (CdmaOtaProvisionStatus) status);
Amit Mahajan17249842017-01-19 15:05:45 -08007355 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan1955c742016-12-29 07:07:54 -08007356 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007357 RLOGE("cdmaOtaProvisionStatusInd: radioService[%d]->mRadioIndication == NULL",
Amit Mahajan1955c742016-12-29 07:07:54 -08007358 slotId);
7359 }
7360
7361 return 0;
7362}
7363
Amit Mahajan759786a2017-03-03 17:35:47 -08007364int radio::cdmaInfoRecInd(int slotId,
Amit Mahajan1955c742016-12-29 07:07:54 -08007365 int indicationType, int token, RIL_Errno e, void *response,
7366 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007367 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan1955c742016-12-29 07:07:54 -08007368 if (response == NULL || responseLen != sizeof(RIL_CDMA_InformationRecords)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007369 RLOGE("cdmaInfoRecInd: invalid response");
Amit Mahajan1955c742016-12-29 07:07:54 -08007370 return 0;
7371 }
7372
Jack Yuf68e0da2017-02-07 14:53:09 -08007373 CdmaInformationRecords records = {};
Amit Mahajan1955c742016-12-29 07:07:54 -08007374 RIL_CDMA_InformationRecords *recordsRil = (RIL_CDMA_InformationRecords *) response;
7375
7376 char* string8 = NULL;
7377 int num = MIN(recordsRil->numberOfInfoRecs, RIL_CDMA_MAX_NUMBER_OF_INFO_RECS);
7378 if (recordsRil->numberOfInfoRecs > RIL_CDMA_MAX_NUMBER_OF_INFO_RECS) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007379 RLOGE("cdmaInfoRecInd: received %d recs which is more than %d, dropping "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08007380 "additional ones", recordsRil->numberOfInfoRecs,
Amit Mahajan1955c742016-12-29 07:07:54 -08007381 RIL_CDMA_MAX_NUMBER_OF_INFO_RECS);
7382 }
7383 records.infoRec.resize(num);
7384 for (int i = 0 ; i < num ; i++) {
7385 CdmaInformationRecord *record = &records.infoRec[i];
7386 RIL_CDMA_InformationRecord *infoRec = &recordsRil->infoRec[i];
7387 record->name = (CdmaInfoRecName) infoRec->name;
Sanket Padawe378ccdd2017-01-24 14:11:12 -08007388 // All vectors should be size 0 except one which will be size 1. Set everything to
7389 // size 0 initially.
7390 record->display.resize(0);
7391 record->number.resize(0);
7392 record->signal.resize(0);
7393 record->redir.resize(0);
7394 record->lineCtrl.resize(0);
7395 record->clir.resize(0);
7396 record->audioCtrl.resize(0);
Amit Mahajan1955c742016-12-29 07:07:54 -08007397 switch (infoRec->name) {
7398 case RIL_CDMA_DISPLAY_INFO_REC:
7399 case RIL_CDMA_EXTENDED_DISPLAY_INFO_REC: {
7400 if (infoRec->rec.display.alpha_len > CDMA_ALPHA_INFO_BUFFER_LENGTH) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007401 RLOGE("cdmaInfoRecInd: invalid display info response length %d "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08007402 "expected not more than %d", (int) infoRec->rec.display.alpha_len,
Amit Mahajan1955c742016-12-29 07:07:54 -08007403 CDMA_ALPHA_INFO_BUFFER_LENGTH);
7404 return 0;
7405 }
7406 string8 = (char*) malloc((infoRec->rec.display.alpha_len + 1) * sizeof(char));
7407 if (string8 == NULL) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007408 RLOGE("cdmaInfoRecInd: Memory allocation failed for "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08007409 "responseCdmaInformationRecords");
Amit Mahajan1955c742016-12-29 07:07:54 -08007410 return 0;
7411 }
7412 memcpy(string8, infoRec->rec.display.alpha_buf, infoRec->rec.display.alpha_len);
7413 string8[(int)infoRec->rec.display.alpha_len] = '\0';
7414
7415 record->display.resize(1);
7416 record->display[0].alphaBuf = string8;
7417 free(string8);
7418 string8 = NULL;
7419 break;
7420 }
7421
7422 case RIL_CDMA_CALLED_PARTY_NUMBER_INFO_REC:
7423 case RIL_CDMA_CALLING_PARTY_NUMBER_INFO_REC:
7424 case RIL_CDMA_CONNECTED_NUMBER_INFO_REC: {
7425 if (infoRec->rec.number.len > CDMA_NUMBER_INFO_BUFFER_LENGTH) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007426 RLOGE("cdmaInfoRecInd: invalid display info response length %d "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08007427 "expected not more than %d", (int) infoRec->rec.number.len,
Amit Mahajan1955c742016-12-29 07:07:54 -08007428 CDMA_NUMBER_INFO_BUFFER_LENGTH);
7429 return 0;
7430 }
7431 string8 = (char*) malloc((infoRec->rec.number.len + 1) * sizeof(char));
7432 if (string8 == NULL) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007433 RLOGE("cdmaInfoRecInd: Memory allocation failed for "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08007434 "responseCdmaInformationRecords");
Amit Mahajan1955c742016-12-29 07:07:54 -08007435 return 0;
7436 }
7437 memcpy(string8, infoRec->rec.number.buf, infoRec->rec.number.len);
7438 string8[(int)infoRec->rec.number.len] = '\0';
7439
7440 record->number.resize(1);
7441 record->number[0].number = string8;
7442 free(string8);
7443 string8 = NULL;
7444 record->number[0].numberType = infoRec->rec.number.number_type;
7445 record->number[0].numberPlan = infoRec->rec.number.number_plan;
7446 record->number[0].pi = infoRec->rec.number.pi;
7447 record->number[0].si = infoRec->rec.number.si;
7448 break;
7449 }
7450
7451 case RIL_CDMA_SIGNAL_INFO_REC: {
7452 record->signal.resize(1);
7453 record->signal[0].isPresent = infoRec->rec.signal.isPresent;
7454 record->signal[0].signalType = infoRec->rec.signal.signalType;
7455 record->signal[0].alertPitch = infoRec->rec.signal.alertPitch;
7456 record->signal[0].signal = infoRec->rec.signal.signal;
7457 break;
7458 }
7459
7460 case RIL_CDMA_REDIRECTING_NUMBER_INFO_REC: {
7461 if (infoRec->rec.redir.redirectingNumber.len >
7462 CDMA_NUMBER_INFO_BUFFER_LENGTH) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007463 RLOGE("cdmaInfoRecInd: invalid display info response length %d "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08007464 "expected not more than %d\n",
Amit Mahajan1955c742016-12-29 07:07:54 -08007465 (int)infoRec->rec.redir.redirectingNumber.len,
7466 CDMA_NUMBER_INFO_BUFFER_LENGTH);
7467 return 0;
7468 }
7469 string8 = (char*) malloc((infoRec->rec.redir.redirectingNumber.len + 1) *
7470 sizeof(char));
7471 if (string8 == NULL) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007472 RLOGE("cdmaInfoRecInd: Memory allocation failed for "
Sanket Padawe378ccdd2017-01-24 14:11:12 -08007473 "responseCdmaInformationRecords");
Amit Mahajan1955c742016-12-29 07:07:54 -08007474 return 0;
7475 }
7476 memcpy(string8, infoRec->rec.redir.redirectingNumber.buf,
7477 infoRec->rec.redir.redirectingNumber.len);
7478 string8[(int)infoRec->rec.redir.redirectingNumber.len] = '\0';
7479
7480 record->redir.resize(1);
7481 record->redir[0].redirectingNumber.number = string8;
7482 free(string8);
7483 string8 = NULL;
7484 record->redir[0].redirectingNumber.numberType =
7485 infoRec->rec.redir.redirectingNumber.number_type;
7486 record->redir[0].redirectingNumber.numberPlan =
7487 infoRec->rec.redir.redirectingNumber.number_plan;
7488 record->redir[0].redirectingNumber.pi = infoRec->rec.redir.redirectingNumber.pi;
7489 record->redir[0].redirectingNumber.si = infoRec->rec.redir.redirectingNumber.si;
7490 record->redir[0].redirectingReason =
7491 (CdmaRedirectingReason) infoRec->rec.redir.redirectingReason;
7492 break;
7493 }
7494
7495 case RIL_CDMA_LINE_CONTROL_INFO_REC: {
7496 record->lineCtrl.resize(1);
7497 record->lineCtrl[0].lineCtrlPolarityIncluded =
7498 infoRec->rec.lineCtrl.lineCtrlPolarityIncluded;
7499 record->lineCtrl[0].lineCtrlToggle = infoRec->rec.lineCtrl.lineCtrlToggle;
7500 record->lineCtrl[0].lineCtrlReverse = infoRec->rec.lineCtrl.lineCtrlReverse;
7501 record->lineCtrl[0].lineCtrlPowerDenial =
7502 infoRec->rec.lineCtrl.lineCtrlPowerDenial;
7503 break;
7504 }
7505
7506 case RIL_CDMA_T53_CLIR_INFO_REC: {
7507 record->clir.resize(1);
7508 record->clir[0].cause = infoRec->rec.clir.cause;
7509 break;
7510 }
7511
7512 case RIL_CDMA_T53_AUDIO_CONTROL_INFO_REC: {
7513 record->audioCtrl.resize(1);
7514 record->audioCtrl[0].upLink = infoRec->rec.audioCtrl.upLink;
7515 record->audioCtrl[0].downLink = infoRec->rec.audioCtrl.downLink;
7516 break;
7517 }
7518
7519 case RIL_CDMA_T53_RELEASE_INFO_REC:
Amit Mahajan111ddca2017-03-03 12:05:13 -08007520 RLOGE("cdmaInfoRecInd: RIL_CDMA_T53_RELEASE_INFO_REC: INVALID");
Amit Mahajan1955c742016-12-29 07:07:54 -08007521 return 0;
7522
7523 default:
Amit Mahajan111ddca2017-03-03 12:05:13 -08007524 RLOGE("cdmaInfoRecInd: Incorrect name value");
Amit Mahajan1955c742016-12-29 07:07:54 -08007525 return 0;
7526 }
7527 }
7528
Jayachandran C572f2f42017-03-25 14:30:13 -07007529#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007530 RLOGD("cdmaInfoRecInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07007531#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007532 Return<void> retStatus = radioService[slotId]->mRadioIndication->cdmaInfoRec(
Amit Mahajan1955c742016-12-29 07:07:54 -08007533 convertIntToRadioIndicationType(indicationType), records);
Amit Mahajan17249842017-01-19 15:05:45 -08007534 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan1955c742016-12-29 07:07:54 -08007535 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007536 RLOGE("cdmaInfoRecInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan1955c742016-12-29 07:07:54 -08007537 }
7538
7539 return 0;
7540}
7541
Amit Mahajan759786a2017-03-03 17:35:47 -08007542int radio::indicateRingbackToneInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007543 int indicationType, int token, RIL_Errno e, void *response,
7544 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007545 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007546 if (response == NULL || responseLen != sizeof(int)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007547 RLOGE("indicateRingbackToneInd: invalid response");
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007548 return 0;
7549 }
7550 bool start = ((int32_t *) response)[0];
Jayachandran C572f2f42017-03-25 14:30:13 -07007551#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007552 RLOGD("indicateRingbackToneInd: start %d", start);
Jayachandran C572f2f42017-03-25 14:30:13 -07007553#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007554 Return<void> retStatus = radioService[slotId]->mRadioIndication->indicateRingbackTone(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007555 convertIntToRadioIndicationType(indicationType), start);
Amit Mahajan17249842017-01-19 15:05:45 -08007556 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007557 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007558 RLOGE("indicateRingbackToneInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007559 }
7560
7561 return 0;
7562}
7563
Amit Mahajan759786a2017-03-03 17:35:47 -08007564int radio::resendIncallMuteInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007565 int indicationType, int token, RIL_Errno e, void *response,
7566 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007567 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Jayachandran C572f2f42017-03-25 14:30:13 -07007568#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007569 RLOGD("resendIncallMuteInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07007570#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007571 Return<void> retStatus = radioService[slotId]->mRadioIndication->resendIncallMute(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007572 convertIntToRadioIndicationType(indicationType));
Amit Mahajan17249842017-01-19 15:05:45 -08007573 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007574 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007575 RLOGE("resendIncallMuteInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007576 }
7577
7578 return 0;
7579}
7580
Amit Mahajan759786a2017-03-03 17:35:47 -08007581int radio::cdmaSubscriptionSourceChangedInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007582 int indicationType, int token, RIL_Errno e,
7583 void *response, size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007584 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007585 if (response == NULL || responseLen != sizeof(int)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007586 RLOGE("cdmaSubscriptionSourceChangedInd: invalid response");
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007587 return 0;
7588 }
7589 int32_t cdmaSource = ((int32_t *) response)[0];
Jayachandran C572f2f42017-03-25 14:30:13 -07007590#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007591 RLOGD("cdmaSubscriptionSourceChangedInd: cdmaSource %d", cdmaSource);
Jayachandran C572f2f42017-03-25 14:30:13 -07007592#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007593 Return<void> retStatus = radioService[slotId]->mRadioIndication->
7594 cdmaSubscriptionSourceChanged(convertIntToRadioIndicationType(indicationType),
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007595 (CdmaSubscriptionSource) cdmaSource);
Amit Mahajan17249842017-01-19 15:05:45 -08007596 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007597 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007598 RLOGE("cdmaSubscriptionSourceChangedInd: radioService[%d]->mRadioIndication == NULL",
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007599 slotId);
7600 }
7601
7602 return 0;
7603}
7604
Amit Mahajan759786a2017-03-03 17:35:47 -08007605int radio::cdmaPrlChangedInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007606 int indicationType, int token, RIL_Errno e, void *response,
7607 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007608 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007609 if (response == NULL || responseLen != sizeof(int)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007610 RLOGE("cdmaPrlChangedInd: invalid response");
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007611 return 0;
7612 }
7613 int32_t version = ((int32_t *) response)[0];
Jayachandran C572f2f42017-03-25 14:30:13 -07007614#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007615 RLOGD("cdmaPrlChangedInd: version %d", version);
Jayachandran C572f2f42017-03-25 14:30:13 -07007616#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007617 Return<void> retStatus = radioService[slotId]->mRadioIndication->cdmaPrlChanged(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007618 convertIntToRadioIndicationType(indicationType), version);
Amit Mahajan17249842017-01-19 15:05:45 -08007619 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007620 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007621 RLOGE("cdmaPrlChangedInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007622 }
7623
7624 return 0;
7625}
7626
Amit Mahajan759786a2017-03-03 17:35:47 -08007627int radio::exitEmergencyCallbackModeInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007628 int indicationType, int token, RIL_Errno e, void *response,
7629 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007630 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Jayachandran C572f2f42017-03-25 14:30:13 -07007631#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007632 RLOGD("exitEmergencyCallbackModeInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07007633#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007634 Return<void> retStatus = radioService[slotId]->mRadioIndication->exitEmergencyCallbackMode(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007635 convertIntToRadioIndicationType(indicationType));
Amit Mahajan17249842017-01-19 15:05:45 -08007636 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007637 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007638 RLOGE("exitEmergencyCallbackModeInd: radioService[%d]->mRadioIndication == NULL",
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007639 slotId);
7640 }
7641
7642 return 0;
7643}
7644
Amit Mahajan759786a2017-03-03 17:35:47 -08007645int radio::rilConnectedInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007646 int indicationType, int token, RIL_Errno e, void *response,
7647 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007648 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007649 RLOGD("rilConnectedInd");
Amit Mahajan17249842017-01-19 15:05:45 -08007650 Return<void> retStatus = radioService[slotId]->mRadioIndication->rilConnected(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007651 convertIntToRadioIndicationType(indicationType));
Amit Mahajan17249842017-01-19 15:05:45 -08007652 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007653 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007654 RLOGE("rilConnectedInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007655 }
7656
7657 return 0;
7658}
7659
Amit Mahajan759786a2017-03-03 17:35:47 -08007660int radio::voiceRadioTechChangedInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007661 int indicationType, int token, RIL_Errno e, void *response,
7662 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007663 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007664 if (response == NULL || responseLen != sizeof(int)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007665 RLOGE("voiceRadioTechChangedInd: invalid response");
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007666 return 0;
7667 }
7668 int32_t rat = ((int32_t *) response)[0];
Jayachandran C572f2f42017-03-25 14:30:13 -07007669#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007670 RLOGD("voiceRadioTechChangedInd: rat %d", rat);
Jayachandran C572f2f42017-03-25 14:30:13 -07007671#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007672 Return<void> retStatus = radioService[slotId]->mRadioIndication->voiceRadioTechChanged(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007673 convertIntToRadioIndicationType(indicationType), (RadioTechnology) rat);
Amit Mahajan17249842017-01-19 15:05:45 -08007674 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007675 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007676 RLOGE("voiceRadioTechChangedInd: radioService[%d]->mRadioIndication == NULL",
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007677 slotId);
7678 }
7679
7680 return 0;
7681}
7682
7683void convertRilCellInfoListToHal(void *response, size_t responseLen, hidl_vec<CellInfo>& records) {
7684 int num = responseLen / sizeof(RIL_CellInfo_v12);
7685 records.resize(num);
7686
7687 RIL_CellInfo_v12 *rillCellInfo = (RIL_CellInfo_v12 *) response;
7688 for (int i = 0; i < num; i++) {
7689 records[i].cellInfoType = (CellInfoType) rillCellInfo->cellInfoType;
7690 records[i].registered = rillCellInfo->registered;
7691 records[i].timeStampType = (TimeStampType) rillCellInfo->timeStampType;
7692 records[i].timeStamp = rillCellInfo->timeStamp;
Sanket Padawe378ccdd2017-01-24 14:11:12 -08007693 // All vectors should be size 0 except one which will be size 1. Set everything to
7694 // size 0 initially.
7695 records[i].gsm.resize(0);
7696 records[i].wcdma.resize(0);
7697 records[i].cdma.resize(0);
7698 records[i].lte.resize(0);
7699 records[i].tdscdma.resize(0);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007700 switch(rillCellInfo->cellInfoType) {
7701 case RIL_CELL_INFO_TYPE_GSM: {
7702 records[i].gsm.resize(1);
7703 CellInfoGsm *cellInfoGsm = &records[i].gsm[0];
7704 cellInfoGsm->cellIdentityGsm.mcc =
7705 std::to_string(rillCellInfo->CellInfo.gsm.cellIdentityGsm.mcc);
7706 cellInfoGsm->cellIdentityGsm.mnc =
7707 std::to_string(rillCellInfo->CellInfo.gsm.cellIdentityGsm.mnc);
7708 cellInfoGsm->cellIdentityGsm.lac =
7709 rillCellInfo->CellInfo.gsm.cellIdentityGsm.lac;
7710 cellInfoGsm->cellIdentityGsm.cid =
7711 rillCellInfo->CellInfo.gsm.cellIdentityGsm.cid;
7712 cellInfoGsm->cellIdentityGsm.arfcn =
7713 rillCellInfo->CellInfo.gsm.cellIdentityGsm.arfcn;
7714 cellInfoGsm->cellIdentityGsm.bsic =
7715 rillCellInfo->CellInfo.gsm.cellIdentityGsm.bsic;
7716 cellInfoGsm->signalStrengthGsm.signalStrength =
7717 rillCellInfo->CellInfo.gsm.signalStrengthGsm.signalStrength;
7718 cellInfoGsm->signalStrengthGsm.bitErrorRate =
7719 rillCellInfo->CellInfo.gsm.signalStrengthGsm.bitErrorRate;
7720 cellInfoGsm->signalStrengthGsm.timingAdvance =
7721 rillCellInfo->CellInfo.gsm.signalStrengthGsm.timingAdvance;
7722 break;
7723 }
7724
7725 case RIL_CELL_INFO_TYPE_WCDMA: {
7726 records[i].wcdma.resize(1);
7727 CellInfoWcdma *cellInfoWcdma = &records[i].wcdma[0];
7728 cellInfoWcdma->cellIdentityWcdma.mcc =
7729 std::to_string(rillCellInfo->CellInfo.wcdma.cellIdentityWcdma.mcc);
7730 cellInfoWcdma->cellIdentityWcdma.mnc =
7731 std::to_string(rillCellInfo->CellInfo.wcdma.cellIdentityWcdma.mnc);
7732 cellInfoWcdma->cellIdentityWcdma.lac =
7733 rillCellInfo->CellInfo.wcdma.cellIdentityWcdma.lac;
7734 cellInfoWcdma->cellIdentityWcdma.cid =
7735 rillCellInfo->CellInfo.wcdma.cellIdentityWcdma.cid;
7736 cellInfoWcdma->cellIdentityWcdma.psc =
7737 rillCellInfo->CellInfo.wcdma.cellIdentityWcdma.psc;
7738 cellInfoWcdma->cellIdentityWcdma.uarfcn =
7739 rillCellInfo->CellInfo.wcdma.cellIdentityWcdma.uarfcn;
7740 cellInfoWcdma->signalStrengthWcdma.signalStrength =
7741 rillCellInfo->CellInfo.wcdma.signalStrengthWcdma.signalStrength;
7742 cellInfoWcdma->signalStrengthWcdma.bitErrorRate =
7743 rillCellInfo->CellInfo.wcdma.signalStrengthWcdma.bitErrorRate;
7744 break;
7745 }
7746
7747 case RIL_CELL_INFO_TYPE_CDMA: {
7748 records[i].cdma.resize(1);
7749 CellInfoCdma *cellInfoCdma = &records[i].cdma[0];
7750 cellInfoCdma->cellIdentityCdma.networkId =
7751 rillCellInfo->CellInfo.cdma.cellIdentityCdma.networkId;
7752 cellInfoCdma->cellIdentityCdma.systemId =
7753 rillCellInfo->CellInfo.cdma.cellIdentityCdma.systemId;
7754 cellInfoCdma->cellIdentityCdma.baseStationId =
7755 rillCellInfo->CellInfo.cdma.cellIdentityCdma.basestationId;
7756 cellInfoCdma->cellIdentityCdma.longitude =
7757 rillCellInfo->CellInfo.cdma.cellIdentityCdma.longitude;
7758 cellInfoCdma->cellIdentityCdma.latitude =
7759 rillCellInfo->CellInfo.cdma.cellIdentityCdma.latitude;
7760 cellInfoCdma->signalStrengthCdma.dbm =
7761 rillCellInfo->CellInfo.cdma.signalStrengthCdma.dbm;
7762 cellInfoCdma->signalStrengthCdma.ecio =
7763 rillCellInfo->CellInfo.cdma.signalStrengthCdma.ecio;
7764 cellInfoCdma->signalStrengthEvdo.dbm =
7765 rillCellInfo->CellInfo.cdma.signalStrengthEvdo.dbm;
7766 cellInfoCdma->signalStrengthEvdo.ecio =
7767 rillCellInfo->CellInfo.cdma.signalStrengthEvdo.ecio;
7768 cellInfoCdma->signalStrengthEvdo.signalNoiseRatio =
7769 rillCellInfo->CellInfo.cdma.signalStrengthEvdo.signalNoiseRatio;
7770 break;
7771 }
7772
7773 case RIL_CELL_INFO_TYPE_LTE: {
7774 records[i].lte.resize(1);
7775 CellInfoLte *cellInfoLte = &records[i].lte[0];
7776 cellInfoLte->cellIdentityLte.mcc =
7777 std::to_string(rillCellInfo->CellInfo.lte.cellIdentityLte.mcc);
7778 cellInfoLte->cellIdentityLte.mnc =
7779 std::to_string(rillCellInfo->CellInfo.lte.cellIdentityLte.mnc);
7780 cellInfoLte->cellIdentityLte.ci =
7781 rillCellInfo->CellInfo.lte.cellIdentityLte.ci;
7782 cellInfoLte->cellIdentityLte.pci =
7783 rillCellInfo->CellInfo.lte.cellIdentityLte.pci;
7784 cellInfoLte->cellIdentityLte.tac =
7785 rillCellInfo->CellInfo.lte.cellIdentityLte.tac;
7786 cellInfoLte->cellIdentityLte.earfcn =
7787 rillCellInfo->CellInfo.lte.cellIdentityLte.earfcn;
7788 cellInfoLte->signalStrengthLte.signalStrength =
7789 rillCellInfo->CellInfo.lte.signalStrengthLte.signalStrength;
7790 cellInfoLte->signalStrengthLte.rsrp =
7791 rillCellInfo->CellInfo.lte.signalStrengthLte.rsrp;
7792 cellInfoLte->signalStrengthLte.rsrq =
7793 rillCellInfo->CellInfo.lte.signalStrengthLte.rsrq;
7794 cellInfoLte->signalStrengthLte.rssnr =
7795 rillCellInfo->CellInfo.lte.signalStrengthLte.rssnr;
7796 cellInfoLte->signalStrengthLte.cqi =
7797 rillCellInfo->CellInfo.lte.signalStrengthLte.cqi;
7798 cellInfoLte->signalStrengthLte.timingAdvance =
7799 rillCellInfo->CellInfo.lte.signalStrengthLte.timingAdvance;
7800 break;
7801 }
7802
7803 case RIL_CELL_INFO_TYPE_TD_SCDMA: {
7804 records[i].tdscdma.resize(1);
7805 CellInfoTdscdma *cellInfoTdscdma = &records[i].tdscdma[0];
7806 cellInfoTdscdma->cellIdentityTdscdma.mcc =
7807 std::to_string(rillCellInfo->CellInfo.tdscdma.cellIdentityTdscdma.mcc);
7808 cellInfoTdscdma->cellIdentityTdscdma.mnc =
7809 std::to_string(rillCellInfo->CellInfo.tdscdma.cellIdentityTdscdma.mnc);
7810 cellInfoTdscdma->cellIdentityTdscdma.lac =
7811 rillCellInfo->CellInfo.tdscdma.cellIdentityTdscdma.lac;
7812 cellInfoTdscdma->cellIdentityTdscdma.cid =
7813 rillCellInfo->CellInfo.tdscdma.cellIdentityTdscdma.cid;
7814 cellInfoTdscdma->cellIdentityTdscdma.cpid =
7815 rillCellInfo->CellInfo.tdscdma.cellIdentityTdscdma.cpid;
7816 cellInfoTdscdma->signalStrengthTdscdma.rscp =
7817 rillCellInfo->CellInfo.tdscdma.signalStrengthTdscdma.rscp;
7818 break;
7819 }
Sooraj Sasindrand8db60c2016-11-30 18:36:03 -08007820 default: {
7821 break;
7822 }
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007823 }
7824 rillCellInfo += 1;
7825 }
7826}
7827
Amit Mahajan759786a2017-03-03 17:35:47 -08007828int radio::cellInfoListInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007829 int indicationType, int token, RIL_Errno e, void *response,
7830 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007831 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan13058cb2017-06-07 23:10:27 -07007832 if ((response == NULL && responseLen != 0) || responseLen % sizeof(RIL_CellInfo_v12) != 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007833 RLOGE("cellInfoListInd: invalid response");
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007834 return 0;
7835 }
7836
7837 hidl_vec<CellInfo> records;
7838 convertRilCellInfoListToHal(response, responseLen, records);
7839
Jayachandran C572f2f42017-03-25 14:30:13 -07007840#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007841 RLOGD("cellInfoListInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07007842#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007843 Return<void> retStatus = radioService[slotId]->mRadioIndication->cellInfoList(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007844 convertIntToRadioIndicationType(indicationType), records);
Amit Mahajan17249842017-01-19 15:05:45 -08007845 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007846 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007847 RLOGE("cellInfoListInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007848 }
7849
7850 return 0;
7851}
7852
Amit Mahajan759786a2017-03-03 17:35:47 -08007853int radio::imsNetworkStateChangedInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007854 int indicationType, int token, RIL_Errno e, void *response,
7855 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007856 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Jayachandran C572f2f42017-03-25 14:30:13 -07007857#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007858 RLOGD("imsNetworkStateChangedInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07007859#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007860 Return<void> retStatus = radioService[slotId]->mRadioIndication->imsNetworkStateChanged(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007861 convertIntToRadioIndicationType(indicationType));
Amit Mahajan17249842017-01-19 15:05:45 -08007862 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007863 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007864 RLOGE("imsNetworkStateChangedInd: radioService[%d]->mRadioIndication == NULL",
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007865 slotId);
7866 }
7867
7868 return 0;
7869}
7870
Amit Mahajan759786a2017-03-03 17:35:47 -08007871int radio::subscriptionStatusChangedInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007872 int indicationType, int token, RIL_Errno e, void *response,
7873 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007874 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007875 if (response == NULL || responseLen != sizeof(int)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007876 RLOGE("subscriptionStatusChangedInd: invalid response");
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007877 return 0;
7878 }
7879 bool activate = ((int32_t *) response)[0];
Jayachandran C572f2f42017-03-25 14:30:13 -07007880#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007881 RLOGD("subscriptionStatusChangedInd: activate %d", activate);
Jayachandran C572f2f42017-03-25 14:30:13 -07007882#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007883 Return<void> retStatus = radioService[slotId]->mRadioIndication->subscriptionStatusChanged(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007884 convertIntToRadioIndicationType(indicationType), activate);
Amit Mahajan17249842017-01-19 15:05:45 -08007885 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007886 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007887 RLOGE("subscriptionStatusChangedInd: radioService[%d]->mRadioIndication == NULL",
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007888 slotId);
7889 }
7890
7891 return 0;
7892}
7893
Amit Mahajan759786a2017-03-03 17:35:47 -08007894int radio::srvccStateNotifyInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007895 int indicationType, int token, RIL_Errno e, void *response,
7896 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007897 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007898 if (response == NULL || responseLen != sizeof(int)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007899 RLOGE("srvccStateNotifyInd: invalid response");
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007900 return 0;
7901 }
7902 int32_t state = ((int32_t *) response)[0];
Jayachandran C572f2f42017-03-25 14:30:13 -07007903#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007904 RLOGD("srvccStateNotifyInd: rat %d", state);
Jayachandran C572f2f42017-03-25 14:30:13 -07007905#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007906 Return<void> retStatus = radioService[slotId]->mRadioIndication->srvccStateNotify(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007907 convertIntToRadioIndicationType(indicationType), (SrvccState) state);
Amit Mahajan17249842017-01-19 15:05:45 -08007908 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007909 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007910 RLOGE("srvccStateNotifyInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007911 }
7912
7913 return 0;
7914}
7915
7916void convertRilHardwareConfigListToHal(void *response, size_t responseLen,
7917 hidl_vec<HardwareConfig>& records) {
7918 int num = responseLen / sizeof(RIL_HardwareConfig);
7919 records.resize(num);
7920
7921 RIL_HardwareConfig *rilHardwareConfig = (RIL_HardwareConfig *) response;
7922 for (int i = 0; i < num; i++) {
7923 records[i].type = (HardwareConfigType) rilHardwareConfig[i].type;
7924 records[i].uuid = convertCharPtrToHidlString(rilHardwareConfig[i].uuid);
7925 records[i].state = (HardwareConfigState) rilHardwareConfig[i].state;
7926 switch (rilHardwareConfig[i].type) {
7927 case RIL_HARDWARE_CONFIG_MODEM: {
7928 records[i].modem.resize(1);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08007929 records[i].sim.resize(0);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007930 HardwareConfigModem *hwConfigModem = &records[i].modem[0];
7931 hwConfigModem->rat = rilHardwareConfig[i].cfg.modem.rat;
7932 hwConfigModem->maxVoice = rilHardwareConfig[i].cfg.modem.maxVoice;
7933 hwConfigModem->maxData = rilHardwareConfig[i].cfg.modem.maxData;
7934 hwConfigModem->maxStandby = rilHardwareConfig[i].cfg.modem.maxStandby;
7935 break;
7936 }
7937
7938 case RIL_HARDWARE_CONFIG_SIM: {
7939 records[i].sim.resize(1);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08007940 records[i].modem.resize(0);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007941 records[i].sim[0].modemUuid =
7942 convertCharPtrToHidlString(rilHardwareConfig[i].cfg.sim.modemUuid);
7943 break;
7944 }
7945 }
7946 }
7947}
7948
Amit Mahajan759786a2017-03-03 17:35:47 -08007949int radio::hardwareConfigChangedInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007950 int indicationType, int token, RIL_Errno e, void *response,
7951 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007952 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan13058cb2017-06-07 23:10:27 -07007953 if ((response == NULL && responseLen != 0)
7954 || responseLen % sizeof(RIL_HardwareConfig) != 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007955 RLOGE("hardwareConfigChangedInd: invalid response");
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007956 return 0;
7957 }
7958
7959 hidl_vec<HardwareConfig> configs;
7960 convertRilHardwareConfigListToHal(response, responseLen, configs);
7961
Jayachandran C572f2f42017-03-25 14:30:13 -07007962#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007963 RLOGD("hardwareConfigChangedInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07007964#endif
Amit Mahajan17249842017-01-19 15:05:45 -08007965 Return<void> retStatus = radioService[slotId]->mRadioIndication->hardwareConfigChanged(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007966 convertIntToRadioIndicationType(indicationType), configs);
Amit Mahajan17249842017-01-19 15:05:45 -08007967 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007968 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007969 RLOGE("hardwareConfigChangedInd: radioService[%d]->mRadioIndication == NULL",
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007970 slotId);
7971 }
7972
7973 return 0;
7974}
7975
7976void convertRilRadioCapabilityToHal(void *response, size_t responseLen, RadioCapability& rc) {
7977 RIL_RadioCapability *rilRadioCapability = (RIL_RadioCapability *) response;
7978 rc.session = rilRadioCapability->session;
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07007979 rc.phase = (V1_0::RadioCapabilityPhase) rilRadioCapability->phase;
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007980 rc.raf = rilRadioCapability->rat;
7981 rc.logicalModemUuid = convertCharPtrToHidlString(rilRadioCapability->logicalModemUuid);
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07007982 rc.status = (V1_0::RadioCapabilityStatus) rilRadioCapability->status;
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007983}
7984
Amit Mahajan759786a2017-03-03 17:35:47 -08007985int radio::radioCapabilityIndicationInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007986 int indicationType, int token, RIL_Errno e, void *response,
7987 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08007988 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007989 if (response == NULL || responseLen != sizeof(RIL_RadioCapability)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08007990 RLOGE("radioCapabilityIndicationInd: invalid response");
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007991 return 0;
7992 }
7993
Jack Yuf68e0da2017-02-07 14:53:09 -08007994 RadioCapability rc = {};
Amit Mahajan2fa9e632017-01-06 16:55:33 -08007995 convertRilRadioCapabilityToHal(response, responseLen, rc);
7996
Jayachandran C572f2f42017-03-25 14:30:13 -07007997#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08007998 RLOGD("radioCapabilityIndicationInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07007999#endif
Amit Mahajan17249842017-01-19 15:05:45 -08008000 Return<void> retStatus = radioService[slotId]->mRadioIndication->radioCapabilityIndication(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008001 convertIntToRadioIndicationType(indicationType), rc);
Amit Mahajan17249842017-01-19 15:05:45 -08008002 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008003 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008004 RLOGE("radioCapabilityIndicationInd: radioService[%d]->mRadioIndication == NULL",
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008005 slotId);
8006 }
8007
8008 return 0;
8009}
8010
8011bool isServiceTypeCfQuery(RIL_SsServiceType serType, RIL_SsRequestType reqType) {
8012 if ((reqType == SS_INTERROGATION) &&
8013 (serType == SS_CFU ||
8014 serType == SS_CF_BUSY ||
8015 serType == SS_CF_NO_REPLY ||
8016 serType == SS_CF_NOT_REACHABLE ||
8017 serType == SS_CF_ALL ||
8018 serType == SS_CF_ALL_CONDITIONAL)) {
8019 return true;
8020 }
8021 return false;
8022}
8023
Amit Mahajan759786a2017-03-03 17:35:47 -08008024int radio::onSupplementaryServiceIndicationInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008025 int indicationType, int token, RIL_Errno e,
8026 void *response, size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08008027 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008028 if (response == NULL || responseLen != sizeof(RIL_StkCcUnsolSsResponse)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008029 RLOGE("onSupplementaryServiceIndicationInd: invalid response");
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008030 return 0;
8031 }
8032
8033 RIL_StkCcUnsolSsResponse *rilSsResponse = (RIL_StkCcUnsolSsResponse *) response;
Jack Yuf68e0da2017-02-07 14:53:09 -08008034 StkCcUnsolSsResult ss = {};
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008035 ss.serviceType = (SsServiceType) rilSsResponse->serviceType;
8036 ss.requestType = (SsRequestType) rilSsResponse->requestType;
8037 ss.teleserviceType = (SsTeleserviceType) rilSsResponse->teleserviceType;
8038 ss.serviceClass = rilSsResponse->serviceClass;
8039 ss.result = (RadioError) rilSsResponse->result;
8040
8041 if (isServiceTypeCfQuery(rilSsResponse->serviceType, rilSsResponse->requestType)) {
Jayachandran C572f2f42017-03-25 14:30:13 -07008042#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08008043 RLOGD("onSupplementaryServiceIndicationInd CF type, num of Cf elements %d",
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008044 rilSsResponse->cfData.numValidIndexes);
Jayachandran C572f2f42017-03-25 14:30:13 -07008045#endif
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008046 if (rilSsResponse->cfData.numValidIndexes > NUM_SERVICE_CLASSES) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008047 RLOGE("onSupplementaryServiceIndicationInd numValidIndexes is greater than "
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008048 "max value %d, truncating it to max value", NUM_SERVICE_CLASSES);
8049 rilSsResponse->cfData.numValidIndexes = NUM_SERVICE_CLASSES;
8050 }
8051
8052 ss.cfData.resize(1);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08008053 ss.ssInfo.resize(0);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008054
8055 /* number of call info's */
8056 ss.cfData[0].cfInfo.resize(rilSsResponse->cfData.numValidIndexes);
8057
8058 for (int i = 0; i < rilSsResponse->cfData.numValidIndexes; i++) {
8059 RIL_CallForwardInfo cf = rilSsResponse->cfData.cfInfo[i];
8060 CallForwardInfo *cfInfo = &ss.cfData[0].cfInfo[i];
8061
8062 cfInfo->status = (CallForwardInfoStatus) cf.status;
8063 cfInfo->reason = cf.reason;
8064 cfInfo->serviceClass = cf.serviceClass;
8065 cfInfo->toa = cf.toa;
8066 cfInfo->number = convertCharPtrToHidlString(cf.number);
8067 cfInfo->timeSeconds = cf.timeSeconds;
Jayachandran C572f2f42017-03-25 14:30:13 -07008068#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08008069 RLOGD("onSupplementaryServiceIndicationInd: "
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008070 "Data: %d,reason=%d,cls=%d,toa=%d,num=%s,tout=%d],", cf.status,
8071 cf.reason, cf.serviceClass, cf.toa, (char*)cf.number, cf.timeSeconds);
Jayachandran C572f2f42017-03-25 14:30:13 -07008072#endif
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008073 }
8074 } else {
8075 ss.ssInfo.resize(1);
Sanket Padawe378ccdd2017-01-24 14:11:12 -08008076 ss.cfData.resize(0);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008077
8078 /* each int */
8079 ss.ssInfo[0].ssInfo.resize(SS_INFO_MAX);
8080 for (int i = 0; i < SS_INFO_MAX; i++) {
Jayachandran C572f2f42017-03-25 14:30:13 -07008081#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08008082 RLOGD("onSupplementaryServiceIndicationInd: Data: %d",
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008083 rilSsResponse->ssInfo[i]);
Jayachandran C572f2f42017-03-25 14:30:13 -07008084#endif
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008085 ss.ssInfo[0].ssInfo[i] = rilSsResponse->ssInfo[i];
8086 }
8087 }
8088
Jayachandran C572f2f42017-03-25 14:30:13 -07008089#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08008090 RLOGD("onSupplementaryServiceIndicationInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07008091#endif
Amit Mahajan17249842017-01-19 15:05:45 -08008092 Return<void> retStatus = radioService[slotId]->mRadioIndication->
8093 onSupplementaryServiceIndication(convertIntToRadioIndicationType(indicationType),
8094 ss);
8095 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008096 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008097 RLOGE("onSupplementaryServiceIndicationInd: "
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008098 "radioService[%d]->mRadioIndication == NULL", slotId);
8099 }
8100
8101 return 0;
8102}
8103
Amit Mahajan759786a2017-03-03 17:35:47 -08008104int radio::stkCallControlAlphaNotifyInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008105 int indicationType, int token, RIL_Errno e, void *response,
8106 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08008107 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008108 if (response == NULL || responseLen == 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008109 RLOGE("stkCallControlAlphaNotifyInd: invalid response");
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008110 return 0;
8111 }
Jayachandran C572f2f42017-03-25 14:30:13 -07008112#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08008113 RLOGD("stkCallControlAlphaNotifyInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07008114#endif
Amit Mahajan17249842017-01-19 15:05:45 -08008115 Return<void> retStatus = radioService[slotId]->mRadioIndication->stkCallControlAlphaNotify(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008116 convertIntToRadioIndicationType(indicationType),
8117 convertCharPtrToHidlString((char *) response));
Amit Mahajan17249842017-01-19 15:05:45 -08008118 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008119 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008120 RLOGE("stkCallControlAlphaNotifyInd: radioService[%d]->mRadioIndication == NULL",
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008121 slotId);
8122 }
8123
8124 return 0;
8125}
8126
8127void convertRilLceDataInfoToHal(void *response, size_t responseLen, LceDataInfo& lce) {
8128 RIL_LceDataInfo *rilLceDataInfo = (RIL_LceDataInfo *)response;
8129 lce.lastHopCapacityKbps = rilLceDataInfo->last_hop_capacity_kbps;
8130 lce.confidenceLevel = rilLceDataInfo->confidence_level;
8131 lce.lceSuspended = rilLceDataInfo->lce_suspended;
8132}
8133
Amit Mahajan759786a2017-03-03 17:35:47 -08008134int radio::lceDataInd(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 != sizeof(RIL_LceDataInfo)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008139 RLOGE("lceDataInd: invalid response");
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008140 return 0;
8141 }
8142
Jack Yuf68e0da2017-02-07 14:53:09 -08008143 LceDataInfo lce = {};
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008144 convertRilLceDataInfoToHal(response, responseLen, lce);
Jayachandran C572f2f42017-03-25 14:30:13 -07008145#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08008146 RLOGD("lceDataInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07008147#endif
Amit Mahajan17249842017-01-19 15:05:45 -08008148 Return<void> retStatus = radioService[slotId]->mRadioIndication->lceData(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008149 convertIntToRadioIndicationType(indicationType), lce);
Amit Mahajan17249842017-01-19 15:05:45 -08008150 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008151 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008152 RLOGE("lceDataInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008153 }
8154
8155 return 0;
8156}
8157
Amit Mahajan759786a2017-03-03 17:35:47 -08008158int radio::pcoDataInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008159 int indicationType, int token, RIL_Errno e, void *response,
8160 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08008161 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008162 if (response == NULL || responseLen != sizeof(RIL_PCO_Data)) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008163 RLOGE("pcoDataInd: invalid response");
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008164 return 0;
8165 }
8166
Jack Yuf68e0da2017-02-07 14:53:09 -08008167 PcoDataInfo pco = {};
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008168 RIL_PCO_Data *rilPcoData = (RIL_PCO_Data *)response;
8169 pco.cid = rilPcoData->cid;
8170 pco.bearerProto = convertCharPtrToHidlString(rilPcoData->bearer_proto);
8171 pco.pcoId = rilPcoData->pco_id;
8172 pco.contents.setToExternal((uint8_t *) rilPcoData->contents, rilPcoData->contents_length);
8173
Jayachandran C572f2f42017-03-25 14:30:13 -07008174#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08008175 RLOGD("pcoDataInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07008176#endif
Amit Mahajan17249842017-01-19 15:05:45 -08008177 Return<void> retStatus = radioService[slotId]->mRadioIndication->pcoData(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008178 convertIntToRadioIndicationType(indicationType), pco);
Amit Mahajan17249842017-01-19 15:05:45 -08008179 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008180 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008181 RLOGE("pcoDataInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008182 }
8183
8184 return 0;
8185}
8186
Amit Mahajan759786a2017-03-03 17:35:47 -08008187int radio::modemResetInd(int slotId,
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008188 int indicationType, int token, RIL_Errno e, void *response,
8189 size_t responseLen) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08008190 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008191 if (response == NULL || responseLen == 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008192 RLOGE("modemResetInd: invalid response");
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008193 return 0;
8194 }
Jayachandran C572f2f42017-03-25 14:30:13 -07008195#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08008196 RLOGD("modemResetInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07008197#endif
Amit Mahajan17249842017-01-19 15:05:45 -08008198 Return<void> retStatus = radioService[slotId]->mRadioIndication->modemReset(
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008199 convertIntToRadioIndicationType(indicationType),
8200 convertCharPtrToHidlString((char *) response));
Amit Mahajan17249842017-01-19 15:05:45 -08008201 radioService[slotId]->checkReturnStatus(retStatus);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008202 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008203 RLOGE("modemResetInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajan2fa9e632017-01-06 16:55:33 -08008204 }
8205
8206 return 0;
8207}
8208
yinxu3abe7c72017-05-03 15:15:19 -07008209int radio::networkScanResultInd(int slotId,
8210 int indicationType, int token, RIL_Errno e, void *response,
yinxu8688abd2017-05-22 11:26:45 -07008211 size_t responseLen) {
yinxu3abe7c72017-05-03 15:15:19 -07008212#if VDBG
8213 RLOGD("networkScanResultInd");
8214#endif
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07008215 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndicationV1_1 != NULL) {
yinxu8688abd2017-05-22 11:26:45 -07008216 if (response == NULL || responseLen == 0) {
8217 RLOGE("networkScanResultInd: invalid response");
8218 return 0;
8219 }
8220 RLOGD("networkScanResultInd");
8221
8222#if VDBG
8223 RLOGD("networkScanResultInd");
8224#endif
8225
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07008226 RIL_NetworkScanResult *networkScanResult = (RIL_NetworkScanResult *) response;
yinxu8688abd2017-05-22 11:26:45 -07008227
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07008228 V1_1::NetworkScanResult result;
8229 result.status = (V1_1::ScanStatus) networkScanResult->status;
8230 result.error = (RadioError) e;
8231 convertRilCellInfoListToHal(
8232 networkScanResult->network_infos,
8233 networkScanResult->network_infos_length * sizeof(RIL_CellInfo_v12),
8234 result.networkInfos);
yinxu8688abd2017-05-22 11:26:45 -07008235
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07008236 Return<void> retStatus = radioService[slotId]->mRadioIndicationV1_1->networkScanResult(
8237 convertIntToRadioIndicationType(indicationType), result);
8238 radioService[slotId]->checkReturnStatus(retStatus);
yinxu8688abd2017-05-22 11:26:45 -07008239 } else {
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07008240 RLOGE("networkScanResultInd: radioService[%d]->mRadioIndicationV1_1 == NULL", slotId);
yinxu8688abd2017-05-22 11:26:45 -07008241 }
yinxu3abe7c72017-05-03 15:15:19 -07008242 return 0;
8243}
8244
pkanwardb8e0942017-03-17 12:49:34 -07008245int radio::carrierInfoForImsiEncryption(int slotId,
8246 int indicationType, int token, RIL_Errno e, void *response,
8247 size_t responseLen) {
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07008248 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndicationV1_1 != NULL) {
pkanwardb8e0942017-03-17 12:49:34 -07008249 if (response == NULL || responseLen == 0) {
8250 RLOGE("carrierInfoForImsiEncryption: invalid response");
8251 return 0;
8252 }
8253 RLOGD("carrierInfoForImsiEncryption");
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07008254 Return<void> retStatus = radioService[slotId]->mRadioIndicationV1_1->
8255 carrierInfoForImsiEncryption(convertIntToRadioIndicationType(indicationType));
8256 radioService[slotId]->checkReturnStatus(retStatus);
pkanwardb8e0942017-03-17 12:49:34 -07008257 } else {
Amit Mahajanccb6d7f2017-06-09 10:44:54 -07008258 RLOGE("carrierInfoForImsiEncryption: radioService[%d]->mRadioIndicationV1_1 == NULL",
8259 slotId);
pkanwardb8e0942017-03-17 12:49:34 -07008260 }
8261
8262 return 0;
8263}
8264
Amit Mahajan759786a2017-03-03 17:35:47 -08008265int radio::oemHookRawInd(int slotId,
Amit Mahajan439da362017-02-13 17:43:04 -08008266 int indicationType, int token, RIL_Errno e, void *response,
8267 size_t responseLen) {
8268 if (oemHookService[slotId] != NULL && oemHookService[slotId]->mOemHookIndication != NULL) {
8269 if (response == NULL || responseLen == 0) {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008270 RLOGE("oemHookRawInd: invalid response");
Amit Mahajan439da362017-02-13 17:43:04 -08008271 return 0;
8272 }
8273
8274 hidl_vec<uint8_t> data;
8275 data.setToExternal((uint8_t *) response, responseLen);
Jayachandran C572f2f42017-03-25 14:30:13 -07008276#if VDBG
Amit Mahajan111ddca2017-03-03 12:05:13 -08008277 RLOGD("oemHookRawInd");
Jayachandran C572f2f42017-03-25 14:30:13 -07008278#endif
Amit Mahajan439da362017-02-13 17:43:04 -08008279 Return<void> retStatus = oemHookService[slotId]->mOemHookIndication->oemHookRaw(
8280 convertIntToRadioIndicationType(indicationType), data);
Amit Mahajand423d192017-03-16 17:04:01 -07008281 checkReturnStatus(slotId, retStatus, false);
Amit Mahajan439da362017-02-13 17:43:04 -08008282 } else {
Amit Mahajan111ddca2017-03-03 12:05:13 -08008283 RLOGE("oemHookRawInd: oemHookService[%d]->mOemHookIndication == NULL", slotId);
Amit Mahajan439da362017-02-13 17:43:04 -08008284 }
8285
8286 return 0;
8287}
8288
Amit Mahajancd77a5b2016-08-25 11:19:21 -07008289void radio::registerService(RIL_RadioFunctions *callbacks, CommandInfo *commands) {
8290 using namespace android::hardware;
8291 int simCount = 1;
Amit Mahajan439da362017-02-13 17:43:04 -08008292 const char *serviceNames[] = {
Amit Mahajan7955c432017-03-28 11:17:55 -07008293 android::RIL_getServiceName()
Amit Mahajancd77a5b2016-08-25 11:19:21 -07008294 #if (SIM_COUNT >= 2)
Amit Mahajan7955c432017-03-28 11:17:55 -07008295 , RIL2_SERVICE_NAME
Amit Mahajancd77a5b2016-08-25 11:19:21 -07008296 #if (SIM_COUNT >= 3)
Amit Mahajan7955c432017-03-28 11:17:55 -07008297 , RIL3_SERVICE_NAME
Amit Mahajancd77a5b2016-08-25 11:19:21 -07008298 #if (SIM_COUNT >= 4)
Amit Mahajan7955c432017-03-28 11:17:55 -07008299 , RIL4_SERVICE_NAME
Amit Mahajan439da362017-02-13 17:43:04 -08008300 #endif
8301 #endif
8302 #endif
8303 };
8304
Amit Mahajancd77a5b2016-08-25 11:19:21 -07008305 #if (SIM_COUNT >= 2)
8306 simCount = SIM_COUNT;
8307 #endif
8308
8309 configureRpcThreadpool(1, true /* callerWillJoin */);
8310 for (int i = 0; i < simCount; i++) {
Amit Mahajan932e08e2017-01-24 05:45:02 -08008311 pthread_rwlock_t *radioServiceRwlockPtr = getRadioServiceRwlock(i);
8312 int ret = pthread_rwlock_wrlock(radioServiceRwlockPtr);
8313 assert(ret == 0);
8314
Amit Mahajancd77a5b2016-08-25 11:19:21 -07008315 radioService[i] = new RadioImpl;
Sanket Padawef220dc52017-01-02 23:46:00 -08008316 radioService[i]->mSlotId = i;
Amit Mahajan439da362017-02-13 17:43:04 -08008317 oemHookService[i] = new OemHookImpl;
8318 oemHookService[i]->mSlotId = i;
pkanwardb8e0942017-03-17 12:49:34 -07008319 RLOGD("registerService: starting android::hardware::radio::V1_1::IRadio %s",
8320 serviceNames[i]);
Amit Mahajancd77a5b2016-08-25 11:19:21 -07008321 android::status_t status = radioService[i]->registerAsService(serviceNames[i]);
Amit Mahajan7955c432017-03-28 11:17:55 -07008322 status = oemHookService[i]->registerAsService(serviceNames[i]);
Amit Mahajan932e08e2017-01-24 05:45:02 -08008323
8324 ret = pthread_rwlock_unlock(radioServiceRwlockPtr);
8325 assert(ret == 0);
Amit Mahajancd77a5b2016-08-25 11:19:21 -07008326 }
8327
Sanket Padawe378ccdd2017-01-24 14:11:12 -08008328 s_vendorFunctions = callbacks;
Amit Mahajancd77a5b2016-08-25 11:19:21 -07008329 s_commands = commands;
8330}
8331
8332void rilc_thread_pool() {
8333 joinRpcThreadpool();
Amit Mahajan932e08e2017-01-24 05:45:02 -08008334}
8335
8336pthread_rwlock_t * radio::getRadioServiceRwlock(int slotId) {
8337 pthread_rwlock_t *radioServiceRwlockPtr = &radioServiceRwlock;
8338
8339 #if (SIM_COUNT >= 2)
8340 if (slotId == 2) radioServiceRwlockPtr = &radioServiceRwlock2;
8341 #if (SIM_COUNT >= 3)
8342 if (slotId == 3) radioServiceRwlockPtr = &radioServiceRwlock3;
8343 #if (SIM_COUNT >= 4)
8344 if (slotId == 4) radioServiceRwlockPtr = &radioServiceRwlock4;
8345 #endif
8346 #endif
8347 #endif
8348
8349 return radioServiceRwlockPtr;
Sanket Padawe0de29d12017-02-10 13:19:47 -08008350}