blob: 665bc764104cfad04e08e5f3c920a2f5a7a0cc38 [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
17#include <android/hardware/radio/1.0/IRadio.h>
18
19#include <hwbinder/IPCThreadState.h>
20#include <hwbinder/ProcessState.h>
21#include <ril_service.h>
22#include <hidl/HidlTransportSupport.h>
Amit Mahajan5829a472016-12-28 17:28:07 -080023#include <utils/SystemClock.h>
24
25#define INVALID_HEX_CHAR 16
Amit Mahajancd77a5b2016-08-25 11:19:21 -070026
27using namespace android::hardware::radio::V1_0;
28using ::android::hardware::configureRpcThreadpool;
29using ::android::hardware::joinRpcThreadpool;
30using ::android::hardware::Return;
31using ::android::hardware::Status;
32using ::android::hardware::hidl_string;
33using ::android::hardware::hidl_vec;
34using ::android::hardware::hidl_array;
35using ::android::hardware::Void;
36using android::CommandInfo;
37using android::RequestInfo;
38using android::requestToString;
39using android::sp;
40
41RIL_RadioFunctions *s_callbacks = NULL;
42static CommandInfo *s_commands;
43
44struct RadioImpl;
45
46#if (SIM_COUNT >= 2)
47sp<RadioImpl> radioService[SIM_COUNT];
48#else
49sp<RadioImpl> radioService[1];
50#endif
51
52struct RadioImpl : public IRadio {
Sanket Padawef220dc52017-01-02 23:46:00 -080053 int32_t mSlotId;
54 sp<IRadioResponse> mRadioResponse;
55 sp<IRadioIndication> mRadioIndication;
Amit Mahajancd77a5b2016-08-25 11:19:21 -070056
57 Return<void> setResponseFunctions(
58 const ::android::sp<IRadioResponse>& radioResponse,
59 const ::android::sp<IRadioIndication>& radioIndication);
60
61 Return<void> getIccCardStatus(int32_t serial);
62
Sanket Padawef220dc52017-01-02 23:46:00 -080063 Return<void> supplyIccPinForApp(int32_t serial, const hidl_string& pin,
64 const hidl_string& aid);
Amit Mahajancd77a5b2016-08-25 11:19:21 -070065
Sanket Padawef220dc52017-01-02 23:46:00 -080066 Return<void> supplyIccPukForApp(int32_t serial, const hidl_string& puk,
67 const hidl_string& pin, const hidl_string& aid);
Amit Mahajancd77a5b2016-08-25 11:19:21 -070068
69 Return<void> supplyIccPin2ForApp(int32_t serial,
Sanket Padawef220dc52017-01-02 23:46:00 -080070 const hidl_string& pin2,
71 const hidl_string& aid);
Amit Mahajancd77a5b2016-08-25 11:19:21 -070072
Sanket Padawef220dc52017-01-02 23:46:00 -080073 Return<void> supplyIccPuk2ForApp(int32_t serial, const hidl_string& puk2,
74 const hidl_string& pin2, const hidl_string& aid);
Amit Mahajancd77a5b2016-08-25 11:19:21 -070075
Sanket Padawef220dc52017-01-02 23:46:00 -080076 Return<void> changeIccPinForApp(int32_t serial, const hidl_string& oldPin,
77 const hidl_string& newPin, const hidl_string& aid);
Amit Mahajancd77a5b2016-08-25 11:19:21 -070078
Sanket Padawef220dc52017-01-02 23:46:00 -080079 Return<void> changeIccPin2ForApp(int32_t serial, const hidl_string& oldPin2,
80 const hidl_string& newPin2, const hidl_string& aid);
Amit Mahajancd77a5b2016-08-25 11:19:21 -070081
Sanket Padawef220dc52017-01-02 23:46:00 -080082 Return<void> supplyNetworkDepersonalization(int32_t serial, const hidl_string& netPin);
Amit Mahajancd77a5b2016-08-25 11:19:21 -070083
84 Return<void> getCurrentCalls(int32_t serial);
85
Sanket Padawef220dc52017-01-02 23:46:00 -080086 Return<void> dial(int32_t serial, const Dial& dialInfo);
Amit Mahajancd77a5b2016-08-25 11:19:21 -070087
88 Return<void> getImsiForApp(int32_t serial,
89 const ::android::hardware::hidl_string& aid);
90
91 Return<void> hangup(int32_t serial, int32_t gsmIndex);
92
93 Return<void> hangupWaitingOrBackground(int32_t serial);
94
95 Return<void> hangupForegroundResumeBackground(int32_t serial);
96
97 Return<void> switchWaitingOrHoldingAndActive(int32_t serial);
98
99 Return<void> conference(int32_t serial);
100
101 Return<void> rejectCall(int32_t serial);
102
103 Return<void> getLastCallFailCause(int32_t serial);
104
105 Return<void> getSignalStrength(int32_t serial);
106
107 Return<void> getVoiceRegistrationState(int32_t serial);
108
109 Return<void> getDataRegistrationState(int32_t serial);
110
111 Return<void> getOperator(int32_t serial);
112
113 Return<void> setRadioPower(int32_t serial, bool on);
114
115 Return<void> sendDtmf(int32_t serial,
116 const ::android::hardware::hidl_string& s);
117
118 Return<void> sendSms(int32_t serial, const GsmSmsMessage& message);
119
120 Return<void> sendSMSExpectMore(int32_t serial, const GsmSmsMessage& message);
121
122 Return<void> setupDataCall(int32_t serial,
123 int32_t radioTechnology,
124 int32_t profile,
125 const ::android::hardware::hidl_string& apn,
126 const ::android::hardware::hidl_string& user,
127 const ::android::hardware::hidl_string& password,
128 ApnAuthType authType,
129 const ::android::hardware::hidl_string& protocol);
130
131 Return<void> iccIOForApp(int32_t serial,
132 const IccIo& iccIo);
133
134 Return<void> sendUssd(int32_t serial,
135 const ::android::hardware::hidl_string& ussd);
136
137 Return<void> cancelPendingUssd(int32_t serial);
138
139 Return<void> getClir(int32_t serial);
140
141 Return<void> setClir(int32_t serial, int32_t status);
142
143 Return<void> getCallForwardStatus(int32_t serial,
144 const CallForwardInfo& callInfo);
145
146 Return<void> setCallForward(int32_t serial,
147 const CallForwardInfo& callInfo);
148
149 Return<void> getCallWaiting(int32_t serial, int32_t serviceClass);
150
151 Return<void> setCallWaiting(int32_t serial, bool enable, int32_t serviceClass);
152
153 Return<void> acknowledgeLastIncomingGsmSms(int32_t serial,
154 bool success, SmsAcknowledgeFailCause cause);
155
156 Return<void> acceptCall(int32_t serial);
157
158 Return<void> deactivateDataCall(int32_t serial,
159 int32_t cid, bool reasonRadioShutDown);
160
161 Return<void> getFacilityLockForApp(int32_t serial,
162 const ::android::hardware::hidl_string& facility,
163 const ::android::hardware::hidl_string& password,
164 int32_t serviceClass,
165 const ::android::hardware::hidl_string& appId);
166
167 Return<void> setFacilityLockForApp(int32_t serial,
168 const ::android::hardware::hidl_string& facility,
169 bool lockState,
170 const ::android::hardware::hidl_string& password,
171 int32_t serviceClass,
172 const ::android::hardware::hidl_string& appId);
173
174 Return<void> setBarringPassword(int32_t serial,
175 const ::android::hardware::hidl_string& facility,
176 const ::android::hardware::hidl_string& oldPassword,
177 const ::android::hardware::hidl_string& newPassword);
178
179 Return<void> getNetworkSelectionMode(int32_t serial);
180
181 Return<void> setNetworkSelectionModeAutomatic(int32_t serial);
182
183 Return<void> setNetworkSelectionModeManual(int32_t serial,
184 const ::android::hardware::hidl_string& operatorNumeric);
185
186 Return<void> getAvailableNetworks(int32_t serial);
187
188 Return<void> startDtmf(int32_t serial,
189 const ::android::hardware::hidl_string& s);
190
191 Return<void> stopDtmf(int32_t serial);
192
193 Return<void> getBasebandVersion(int32_t serial);
194
195 Return<void> separateConnection(int32_t serial, int32_t gsmIndex);
196
197 Return<void> setMute(int32_t serial, bool enable);
198
199 Return<void> getMute(int32_t serial);
200
201 Return<void> getClip(int32_t serial);
202
203 Return<void> getDataCallList(int32_t serial);
204
205 Return<void> sendOemRadioRequestRaw(int32_t serial,
206 const ::android::hardware::hidl_vec<uint8_t>& data);
207
208 Return<void> sendOemRadioRequestStrings(int32_t serial,
209 const ::android::hardware::hidl_vec<::android::hardware::hidl_string>& data);
210
211 Return<void> sendScreenState(int32_t serial, bool enable);
212
213 Return<void> setSuppServiceNotifications(int32_t serial, bool enable);
214
215 Return<void> writeSmsToSim(int32_t serial,
216 const SmsWriteArgs& smsWriteArgs);
217
218 Return<void> deleteSmsOnSim(int32_t serial, int32_t index);
219
220 Return<void> setBandMode(int32_t serial, RadioBandMode mode);
221
222 Return<void> getAvailableBandModes(int32_t serial);
223
224 Return<void> sendEnvelope(int32_t serial,
225 const ::android::hardware::hidl_string& command);
226
227 Return<void> sendTerminalResponseToSim(int32_t serial,
228 const ::android::hardware::hidl_string& commandResponse);
229
230 Return<void> handleStkCallSetupRequestFromSim(int32_t serial, bool accept);
231
232 Return<void> explicitCallTransfer(int32_t serial);
233
234 Return<void> setPreferredNetworkType(int32_t serial, PreferredNetworkType nwType);
235
236 Return<void> getPreferredNetworkType(int32_t serial);
237
238 Return<void> getNeighboringCids(int32_t serial);
239
240 Return<void> setLocationUpdates(int32_t serial, bool enable);
241
242 Return<void> setCdmaSubscriptionSource(int32_t serial,
243 CdmaSubscriptionSource cdmaSub);
244
245 Return<void> setCdmaRoamingPreference(int32_t serial, CdmaRoamingType type);
246
247 Return<void> getCdmaRoamingPreference(int32_t serial);
248
249 Return<void> setTTYMode(int32_t serial, TtyMode mode);
250
251 Return<void> getTTYMode(int32_t serial);
252
253 Return<void> setPreferredVoicePrivacy(int32_t serial, bool enable);
254
255 Return<void> getPreferredVoicePrivacy(int32_t serial);
256
257 Return<void> sendCDMAFeatureCode(int32_t serial,
258 const ::android::hardware::hidl_string& featureCode);
259
260 Return<void> sendBurstDtmf(int32_t serial,
261 const ::android::hardware::hidl_string& dtmf,
262 int32_t on,
263 int32_t off);
264
265 Return<void> sendCdmaSms(int32_t serial, const CdmaSmsMessage& sms);
266
267 Return<void> acknowledgeLastIncomingCdmaSms(int32_t serial,
268 const CdmaSmsAck& smsAck);
269
270 Return<void> getGsmBroadcastConfig(int32_t serial);
271
272 Return<void> setGsmBroadcastConfig(int32_t serial,
273 const hidl_vec<GsmBroadcastSmsConfigInfo>& configInfo);
274
275 Return<void> setGsmBroadcastActivation(int32_t serial, bool activate);
276
277 Return<void> getCdmaBroadcastConfig(int32_t serial);
278
279 Return<void> setCdmaBroadcastConfig(int32_t serial,
280 const hidl_vec<CdmaBroadcastSmsConfigInfo>& configInfo);
281
282 Return<void> setCdmaBroadcastActivation(int32_t serial, bool activate);
283
284 Return<void> getCDMASubscription(int32_t serial);
285
286 Return<void> writeSmsToRuim(int32_t serial, const CdmaSmsWriteArgs& cdmaSms);
287
288 Return<void> deleteSmsOnRuim(int32_t serial, int32_t index);
289
290 Return<void> getDeviceIdentity(int32_t serial);
291
292 Return<void> exitEmergencyCallbackMode(int32_t serial);
293
294 Return<void> getSmscAddress(int32_t serial);
295
296 Return<void> setSmscAddress(int32_t serial,
297 const ::android::hardware::hidl_string& smsc);
298
299 Return<void> reportSmsMemoryStatus(int32_t serial, bool available);
300
301 Return<void> reportStkServiceIsRunning(int32_t serial);
302
303 Return<void> getCdmaSubscriptionSource(int32_t serial);
304
305 Return<void> requestIsimAuthentication(int32_t serial,
306 const ::android::hardware::hidl_string& challenge);
307
308 Return<void> acknowledgeIncomingGsmSmsWithPdu(int32_t serial,
309 bool success,
310 const ::android::hardware::hidl_string& ackPdu);
311
312 Return<void> sendEnvelopeWithStatus(int32_t serial,
313 const ::android::hardware::hidl_string& contents);
314
315 Return<void> getVoiceRadioTechnology(int32_t serial);
316
317 Return<void> getCellInfoList(int32_t serial);
318
319 Return<void> setCellInfoListRate(int32_t serial, int32_t rate);
320
321 Return<void> setInitialAttachApn(int32_t serial,
322 const ::android::hardware::hidl_string& apn,
323 const ::android::hardware::hidl_string& protocol,
324 ApnAuthType authType,
325 const ::android::hardware::hidl_string& username,
326 const ::android::hardware::hidl_string& password);
327
328 Return<void> getImsRegistrationState(int32_t serial);
329
330 Return<void> sendImsSms(int32_t serial, const ImsSmsMessage& message);
331
332 Return<void> iccTransmitApduBasicChannel(int32_t serial, const SimApdu& message);
333
334 Return<void> iccOpenLogicalChannel(int32_t serial,
335 const ::android::hardware::hidl_string& aid);
336
337 Return<void> iccCloseLogicalChannel(int32_t serial, int32_t channelId);
338
339 Return<void> iccTransmitApduLogicalChannel(int32_t serial, const SimApdu& message);
340
341 Return<void> nvReadItem(int32_t serial, NvItem itemId);
342
343 Return<void> nvWriteItem(int32_t serial, const NvWriteItem& item);
344
345 Return<void> nvWriteCdmaPrl(int32_t serial,
346 const ::android::hardware::hidl_vec<uint8_t>& prl);
347
348 Return<void> nvResetConfig(int32_t serial, ResetNvType resetType);
349
350 Return<void> setUiccSubscription(int32_t serial, const SelectUiccSub& uiccSub);
351
352 Return<void> setDataAllowed(int32_t serial, bool allow);
353
354 Return<void> getHardwareConfig(int32_t serial);
355
356 Return<void> requestIccSimAuthentication(int32_t serial,
357 int32_t authContext,
358 const ::android::hardware::hidl_string& authData,
359 const ::android::hardware::hidl_string& aid);
360
361 Return<void> setDataProfile(int32_t serial,
362 const ::android::hardware::hidl_vec<DataProfileInfo>& profiles);
363
364 Return<void> requestShutdown(int32_t serial);
365
366 Return<void> getRadioCapability(int32_t serial);
367
368 Return<void> setRadioCapability(int32_t serial, const RadioCapability& rc);
369
370 Return<void> startLceService(int32_t serial, int32_t reportInterval, bool pullMode);
371
372 Return<void> stopLceService(int32_t serial);
373
374 Return<void> pullLceData(int32_t serial);
375
376 Return<void> getModemActivityInfo(int32_t serial);
377
378 Return<void> setAllowedCarriers(int32_t serial,
379 bool allAllowed,
380 const CarrierRestrictions& carriers);
381
382 Return<void> getAllowedCarriers(int32_t serial);
383
384 Return<void> responseAcknowledgement();
385};
386
Sanket Padawef220dc52017-01-02 23:46:00 -0800387void dispatchStrings(RequestInfo *pRI, int countStrings, ...) {
388 char **pStrings;
389 android::Parcel p; // TODO: should delete this after translation of all commands is complete
390 pStrings = (char **)calloc(countStrings, sizeof(char *));
391 if (pStrings == NULL) {
392 RLOGE("Memory allocation failed for request %s",
393 requestToString(pRI->pCI->requestNumber));
394 pRI->pCI->responseFunction(p, (int) pRI->socket_id, pRI->pCI->requestNumber,
395 (int) RadioResponseType::SOLICITED, pRI->token, RIL_E_NO_MEMORY, NULL, 0);
396 return;
397 }
398 va_list ap;
399 va_start(ap, countStrings);
400 for (int i = 0; i < countStrings; i++) {
401 const char* str = va_arg(ap, const char *);
402 int len = strlen(str);
403 pStrings[i] = (char *) calloc(len + 1, sizeof(char));
404 if (pStrings[i] == NULL) {
405 RLOGE("Memory allocation failed for request %s",
406 requestToString(pRI->pCI->requestNumber));
407 va_end(ap);
408 pRI->pCI->responseFunction(p, (int) pRI->socket_id, pRI->pCI->requestNumber,
409 (int) RadioResponseType::SOLICITED, pRI->token, RIL_E_NO_MEMORY, NULL, 0);
410 for (int j = 0; j < i; j++) {
411#ifdef MEMSET_FREED
412 memsetString (pStrings[j]);
413#endif
414 free(pStrings[j]);
415 }
416 free(pStrings);
417 return;
418 }
419 strncpy(pStrings[i], str, len + 1);
420 }
421 va_end(ap);
422
423 s_callbacks->onRequest(pRI->pCI->requestNumber, pStrings, countStrings * sizeof(char *), pRI);
424
425 if (pStrings != NULL) {
426 for (int i = 0 ; i < countStrings ; i++) {
427#ifdef MEMSET_FREED
428 memsetString (pStrings[i]);
429#endif
430 free(pStrings[i]);
431 }
432
433#ifdef MEMSET_FREED
434 memset(pStrings, 0, countStrings * sizeof(char *));
435#endif
436 free(pStrings);
437 }
438}
439
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700440Return<void> RadioImpl::setResponseFunctions(
441 const ::android::sp<IRadioResponse>& radioResponseParam,
442 const ::android::sp<IRadioIndication>& radioIndicationParam) {
443 RLOGD("RadioImpl::setResponseFunctions");
Sanket Padawef220dc52017-01-02 23:46:00 -0800444 mRadioResponse = radioResponseParam;
445 mRadioIndication = radioIndicationParam;
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700446 return Status::ok();
447}
448
449Return<void> RadioImpl::getIccCardStatus(int32_t serial) {
450 RLOGD("RadioImpl::getIccCardStatus: serial %d", serial);
Sanket Padawef220dc52017-01-02 23:46:00 -0800451 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_GET_SIM_STATUS);
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700452 if (pRI == NULL) {
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700453 return Void();
454 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700455 s_callbacks->onRequest(RIL_REQUEST_GET_SIM_STATUS, NULL, 0, pRI);
456
457 return Status::ok();
458}
459
Sanket Padawef220dc52017-01-02 23:46:00 -0800460Return<void> RadioImpl::supplyIccPinForApp(int32_t serial, const hidl_string& pin,
461 const hidl_string& aid) {
462 RLOGD("RadioImpl::supplyIccPinForApp: serial %d", serial);
463 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_ENTER_SIM_PIN);
464 if (pRI == NULL) {
465 return Void();
466 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700467
Sanket Padawef220dc52017-01-02 23:46:00 -0800468 dispatchStrings(pRI, 2, (const char *)pin, (const char *)aid);
469 return Status::ok();
470}
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700471
Sanket Padawef220dc52017-01-02 23:46:00 -0800472Return<void> RadioImpl::supplyIccPukForApp(int32_t serial, const hidl_string& puk,
473 const hidl_string& pin, const hidl_string& aid) {
474 RLOGD("RadioImpl::supplyIccPukForApp: serial %d", serial);
475 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_ENTER_SIM_PUK);
476 if (pRI == NULL) {
477 return Void();
478 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700479
Sanket Padawef220dc52017-01-02 23:46:00 -0800480 dispatchStrings(pRI, 3, (const char *)puk, (const char *)pin, (const char *)aid);
481 return Status::ok();
482}
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700483
Sanket Padawef220dc52017-01-02 23:46:00 -0800484Return<void> RadioImpl::supplyIccPin2ForApp(int32_t serial, const hidl_string& pin2,
485 const hidl_string& aid) {
486 RLOGD("RadioImpl::supplyIccPin2ForApp: serial %d", serial);
487 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_ENTER_SIM_PIN2);
488 if (pRI == NULL) {
489 return Void();
490 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700491
Sanket Padawef220dc52017-01-02 23:46:00 -0800492 dispatchStrings(pRI, 2, (const char *)pin2, (const char *)aid);
493 return Status::ok();
494}
495
496Return<void> RadioImpl::supplyIccPuk2ForApp(int32_t serial, const hidl_string& puk2,
497 const hidl_string& pin2, const hidl_string& aid) {
498 RLOGD("RadioImpl::supplyIccPuk2ForApp: serial %d", serial);
499 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_ENTER_SIM_PUK2);
500 if (pRI == NULL) {
501 return Void();
502 }
503
504 dispatchStrings(pRI, 3, (const char *)puk2, (const char *)pin2, (const char *)aid);
505 return Status::ok();
506}
507
508Return<void> RadioImpl::changeIccPinForApp(int32_t serial, const hidl_string& oldPin,
509 const hidl_string& newPin, const hidl_string& aid) {
510 RLOGD("RadioImpl::changeIccPinForApp: serial %d", serial);
511 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_CHANGE_SIM_PIN);
512 if (pRI == NULL) {
513 return Void();
514 }
515
516 dispatchStrings(pRI, 3, (const char *)oldPin, (const char *)newPin,
517 (const char *)aid);
518 return Status::ok();
519}
520
521Return<void> RadioImpl::changeIccPin2ForApp(int32_t serial, const hidl_string& oldPin2,
522 const hidl_string& newPin2, const hidl_string& aid) {
523 RLOGD("RadioImpl::changeIccPin2ForApp: serial %d", serial);
524 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_CHANGE_SIM_PIN2);
525 if (pRI == NULL) {
526 return Void();
527 }
528
529 dispatchStrings(pRI, 3, (const char *)oldPin2, (const char *)newPin2,
530 (const char *)aid);
531 return Status::ok();
532}
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700533
534Return<void> RadioImpl::supplyNetworkDepersonalization(int32_t serial,
Sanket Padawef220dc52017-01-02 23:46:00 -0800535 const hidl_string& netPin) {
536 RLOGD("RadioImpl::supplyNetworkDepersonalization: serial %d", serial);
537 RequestInfo *pRI = android::addRequestToList(serial, mSlotId,
538 RIL_REQUEST_ENTER_NETWORK_DEPERSONALIZATION);
539 if (pRI == NULL) {
540 return Void();
541 }
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700542
Sanket Padawef220dc52017-01-02 23:46:00 -0800543 dispatchStrings(pRI, 1, (const char *)netPin);
544 return Status::ok();
545}
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700546
Sanket Padawef220dc52017-01-02 23:46:00 -0800547Return<void> RadioImpl::getCurrentCalls(int32_t serial) {
548 RLOGD("RadioImpl::getCurrentCalls: serial %d", serial);
549 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_GET_CURRENT_CALLS);
550 if (pRI == NULL) {
551 return Void();
552 }
553
554 s_callbacks->onRequest(RIL_REQUEST_GET_CURRENT_CALLS, NULL, 0, pRI);
555 return Status::ok();
556}
557
558Return<void> RadioImpl::dial(int32_t serial, const Dial& dialInfo) {
559 RLOGD("RadioImpl::dial: serial %d", serial);
560 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_DIAL);
561 if (pRI == NULL) {
562 return Void();
563 }
564 RIL_Dial dial;
565 RIL_UUS_Info uusInfo;
566 int32_t sizeOfDial = sizeof(dial);
567
568 memset (&dial, 0, sizeOfDial);
569
570 dial.address = (char *) calloc(dialInfo.address.size() + 1, sizeof(char));
571 if (dial.address == NULL) {
572 android::Parcel p;
573 RLOGE("Memory allocation failed for request %s", requestToString(pRI->pCI->requestNumber));
574 pRI->pCI->responseFunction(p, (int) pRI->socket_id, pRI->pCI->requestNumber,
575 (int) RadioResponseType::SOLICITED, pRI->token, RIL_E_NO_MEMORY, NULL, 0);
576 return Void();
577 }
578 strcpy(dial.address, dialInfo.address.c_str());
579 dial.clir = (int)dialInfo.clir;
580
581 memset(&uusInfo, 0, sizeof(RIL_UUS_Info));
582 if (dialInfo.uusInfo.size() != 0) {
583 int32_t len;
584
585 uusInfo.uusType = (RIL_UUS_Type) dialInfo.uusInfo[0].uusType;
586 uusInfo.uusDcs = (RIL_UUS_DCS) dialInfo.uusInfo[0].uusDcs;
587
588 if (dialInfo.uusInfo[0].uusData.size() == 0) {
589 uusInfo.uusData = NULL;
590 len = 0;
591 } else {
592 len = dialInfo.uusInfo[0].uusData.size();
593 uusInfo.uusData = (char*) calloc(len + 1, sizeof(char));
594 // check if the length is invalid
595 if (uusInfo.uusData == NULL) {
596 RLOGE("Memory allocation failed for request %s",
597 requestToString(pRI->pCI->requestNumber));
598 android::Parcel p;
599 pRI->pCI->responseFunction(p, (int) pRI->socket_id, pRI->pCI->requestNumber,
600 (int) RadioResponseType::SOLICITED, pRI->token, RIL_E_NO_MEMORY, NULL, 0);
601 free(dial.address);
602 return Void();
603 }
604 strcpy(uusInfo.uusData, dialInfo.uusInfo[0].uusData.c_str());
605 }
606
607 uusInfo.uusLength = len;
608 dial.uusInfo = &uusInfo;
609 }
610
611 s_callbacks->onRequest(RIL_REQUEST_DIAL, &dial, sizeOfDial, pRI);
612
613#ifdef MEMSET_FREED
614 memsetString (dial.address);
615#endif
616 free (dial.address);
617
618#ifdef MEMSET_FREED
619 memsetString (uusInfo.uusData);
620#endif
621 if (uusInfo.uusData != NULL) {
622 free(uusInfo.uusData);
623 }
624
625 return Status::ok();
626}
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700627
628Return<void> RadioImpl::getImsiForApp(int32_t serial,
Sanket Padawef220dc52017-01-02 23:46:00 -0800629 const hidl_string& aid) {return Status::ok();}
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700630
631Return<void> RadioImpl::hangup(int32_t serial, int32_t gsmIndex) {return Status::ok();}
632
633Return<void> RadioImpl::hangupWaitingOrBackground(int32_t serial) {return Status::ok();}
634
635Return<void> RadioImpl::hangupForegroundResumeBackground(int32_t serial) {return Status::ok();}
636
637Return<void> RadioImpl::switchWaitingOrHoldingAndActive(int32_t serial) {return Status::ok();}
638
639Return<void> RadioImpl::conference(int32_t serial) {return Status::ok();}
640
641Return<void> RadioImpl::rejectCall(int32_t serial) {return Status::ok();}
642
643Return<void> RadioImpl::getLastCallFailCause(int32_t serial) {return Status::ok();}
644
645Return<void> RadioImpl::getSignalStrength(int32_t serial) {return Status::ok();}
646
647Return<void> RadioImpl::getVoiceRegistrationState(int32_t serial) {return Status::ok();}
648
649Return<void> RadioImpl::getDataRegistrationState(int32_t serial) {return Status::ok();}
650
651Return<void> RadioImpl::getOperator(int32_t serial) {return Status::ok();}
652
653Return<void> RadioImpl::setRadioPower(int32_t serial, bool on) {return Status::ok();}
654
655Return<void> RadioImpl::sendDtmf(int32_t serial,
656 const ::android::hardware::hidl_string& s) {return Status::ok();}
657
658Return<void> RadioImpl::sendSms(int32_t serial, const GsmSmsMessage& message) {return Status::ok();}
659
660Return<void> RadioImpl::sendSMSExpectMore(int32_t serial, const GsmSmsMessage& message) {return Status::ok();}
661
662Return<void> RadioImpl::setupDataCall(int32_t serial,
663 int32_t radioTechnology,
664 int32_t profile,
665 const ::android::hardware::hidl_string& apn,
666 const ::android::hardware::hidl_string& user,
667 const ::android::hardware::hidl_string& password,
668 ApnAuthType authType,
669 const ::android::hardware::hidl_string& protocol) {return Status::ok();}
670
671Return<void> RadioImpl::iccIOForApp(int32_t serial,
672 const IccIo& iccIo) {return Status::ok();}
673
674Return<void> RadioImpl::sendUssd(int32_t serial,
675 const ::android::hardware::hidl_string& ussd) {return Status::ok();}
676
677Return<void> RadioImpl::cancelPendingUssd(int32_t serial) {return Status::ok();}
678
679Return<void> RadioImpl::getClir(int32_t serial) {return Status::ok();}
680
681Return<void> RadioImpl::setClir(int32_t serial, int32_t status) {return Status::ok();}
682
683Return<void> RadioImpl::getCallForwardStatus(int32_t serial,
684 const CallForwardInfo& callInfo) {return Status::ok();}
685
686Return<void> RadioImpl::setCallForward(int32_t serial,
687 const CallForwardInfo& callInfo) {return Status::ok();}
688
689Return<void> RadioImpl::getCallWaiting(int32_t serial, int32_t serviceClass) {return Status::ok();}
690
691Return<void> RadioImpl::setCallWaiting(int32_t serial, bool enable, int32_t serviceClass) {return Status::ok();}
692
693Return<void> RadioImpl::acknowledgeLastIncomingGsmSms(int32_t serial,
694 bool success, SmsAcknowledgeFailCause cause) {return Status::ok();}
695
696Return<void> RadioImpl::acceptCall(int32_t serial) {return Status::ok();}
697
698Return<void> RadioImpl::deactivateDataCall(int32_t serial,
699 int32_t cid, bool reasonRadioShutDown) {return Status::ok();}
700
701Return<void> RadioImpl::getFacilityLockForApp(int32_t serial,
702 const ::android::hardware::hidl_string& facility,
703 const ::android::hardware::hidl_string& password,
704 int32_t serviceClass,
705 const ::android::hardware::hidl_string& appId) {return Status::ok();}
706
707Return<void> RadioImpl::setFacilityLockForApp(int32_t serial,
708 const ::android::hardware::hidl_string& facility,
709 bool lockState,
710 const ::android::hardware::hidl_string& password,
711 int32_t serviceClass,
712 const ::android::hardware::hidl_string& appId) {return Status::ok();}
713
714Return<void> RadioImpl::setBarringPassword(int32_t serial,
715 const ::android::hardware::hidl_string& facility,
716 const ::android::hardware::hidl_string& oldPassword,
717 const ::android::hardware::hidl_string& newPassword) {return Status::ok();}
718
719Return<void> RadioImpl::getNetworkSelectionMode(int32_t serial) {return Status::ok();}
720
721Return<void> RadioImpl::setNetworkSelectionModeAutomatic(int32_t serial) {return Status::ok();}
722
723Return<void> RadioImpl::setNetworkSelectionModeManual(int32_t serial,
724 const ::android::hardware::hidl_string& operatorNumeric) {return Status::ok();}
725
726Return<void> RadioImpl::getAvailableNetworks(int32_t serial) {return Status::ok();}
727
728Return<void> RadioImpl::startDtmf(int32_t serial,
729 const ::android::hardware::hidl_string& s) {return Status::ok();}
730
731Return<void> RadioImpl::stopDtmf(int32_t serial) {return Status::ok();}
732
733Return<void> RadioImpl::getBasebandVersion(int32_t serial) {return Status::ok();}
734
735Return<void> RadioImpl::separateConnection(int32_t serial, int32_t gsmIndex) {return Status::ok();}
736
737Return<void> RadioImpl::setMute(int32_t serial, bool enable) {return Status::ok();}
738
739Return<void> RadioImpl::getMute(int32_t serial) {return Status::ok();}
740
741Return<void> RadioImpl::getClip(int32_t serial) {return Status::ok();}
742
743Return<void> RadioImpl::getDataCallList(int32_t serial) {return Status::ok();}
744
745Return<void> RadioImpl::sendOemRadioRequestRaw(int32_t serial,
746 const ::android::hardware::hidl_vec<uint8_t>& data) {return Status::ok();}
747
748Return<void> RadioImpl::sendOemRadioRequestStrings(int32_t serial,
749 const ::android::hardware::hidl_vec<::android::hardware::hidl_string>& data) {return Status::ok();}
750
751Return<void> RadioImpl::sendScreenState(int32_t serial, bool enable) {return Status::ok();}
752
753Return<void> RadioImpl::setSuppServiceNotifications(int32_t serial, bool enable) {return Status::ok();}
754
755Return<void> RadioImpl::writeSmsToSim(int32_t serial,
756 const SmsWriteArgs& smsWriteArgs) {return Status::ok();}
757
758Return<void> RadioImpl::deleteSmsOnSim(int32_t serial, int32_t index) {return Status::ok();}
759
760Return<void> RadioImpl::setBandMode(int32_t serial, RadioBandMode mode) {return Status::ok();}
761
762Return<void> RadioImpl::getAvailableBandModes(int32_t serial) {return Status::ok();}
763
764Return<void> RadioImpl::sendEnvelope(int32_t serial,
765 const ::android::hardware::hidl_string& command) {return Status::ok();}
766
767Return<void> RadioImpl::sendTerminalResponseToSim(int32_t serial,
768 const ::android::hardware::hidl_string& commandResponse) {return Status::ok();}
769
770Return<void> RadioImpl::handleStkCallSetupRequestFromSim(int32_t serial, bool accept) {return Status::ok();}
771
772Return<void> RadioImpl::explicitCallTransfer(int32_t serial) {return Status::ok();}
773
774Return<void> RadioImpl::setPreferredNetworkType(int32_t serial, PreferredNetworkType nwType) {return Status::ok();}
775
776Return<void> RadioImpl::getPreferredNetworkType(int32_t serial) {return Status::ok();}
777
778Return<void> RadioImpl::getNeighboringCids(int32_t serial) {return Status::ok();}
779
780Return<void> RadioImpl::setLocationUpdates(int32_t serial, bool enable) {return Status::ok();}
781
782Return<void> RadioImpl::setCdmaSubscriptionSource(int32_t serial, CdmaSubscriptionSource cdmaSub) {return Status::ok();}
783
784Return<void> RadioImpl::setCdmaRoamingPreference(int32_t serial, CdmaRoamingType type) {return Status::ok();}
785
786Return<void> RadioImpl::getCdmaRoamingPreference(int32_t serial) {return Status::ok();}
787
788Return<void> RadioImpl::setTTYMode(int32_t serial, TtyMode mode) {return Status::ok();}
789
790Return<void> RadioImpl::getTTYMode(int32_t serial) {return Status::ok();}
791
792Return<void> RadioImpl::setPreferredVoicePrivacy(int32_t serial, bool enable) {return Status::ok();}
793
794Return<void> RadioImpl::getPreferredVoicePrivacy(int32_t serial) {return Status::ok();}
795
796Return<void> RadioImpl::sendCDMAFeatureCode(int32_t serial,
797 const ::android::hardware::hidl_string& featureCode) {return Status::ok();}
798
799Return<void> RadioImpl::sendBurstDtmf(int32_t serial,
800 const ::android::hardware::hidl_string& dtmf,
801 int32_t on,
802 int32_t off) {return Status::ok();}
803
804Return<void> RadioImpl::sendCdmaSms(int32_t serial, const CdmaSmsMessage& sms) {return Status::ok();}
805
806Return<void> RadioImpl::acknowledgeLastIncomingCdmaSms(int32_t serial, const CdmaSmsAck& smsAck) {return Status::ok();}
807
808Return<void> RadioImpl::getGsmBroadcastConfig(int32_t serial) {return Status::ok();}
809
810Return<void> RadioImpl::setGsmBroadcastConfig(int32_t serial,
811 const hidl_vec<GsmBroadcastSmsConfigInfo>& configInfo) {return Status::ok();}
812
813Return<void> RadioImpl::setGsmBroadcastActivation(int32_t serial, bool activate) {return Status::ok();}
814
815Return<void> RadioImpl::getCdmaBroadcastConfig(int32_t serial) {return Status::ok();}
816
817Return<void> RadioImpl::setCdmaBroadcastConfig(int32_t serial,
818 const hidl_vec<CdmaBroadcastSmsConfigInfo>& configInfo) {return Status::ok();}
819
820Return<void> RadioImpl::setCdmaBroadcastActivation(int32_t serial, bool activate) {return Status::ok();}
821
822Return<void> RadioImpl::getCDMASubscription(int32_t serial) {return Status::ok();}
823
824Return<void> RadioImpl::writeSmsToRuim(int32_t serial, const CdmaSmsWriteArgs& cdmaSms) {return Status::ok();}
825
826Return<void> RadioImpl::deleteSmsOnRuim(int32_t serial, int32_t index) {return Status::ok();}
827
828Return<void> RadioImpl::getDeviceIdentity(int32_t serial) {return Status::ok();}
829
830Return<void> RadioImpl::exitEmergencyCallbackMode(int32_t serial) {return Status::ok();}
831
832Return<void> RadioImpl::getSmscAddress(int32_t serial) {return Status::ok();}
833
834Return<void> RadioImpl::setSmscAddress(int32_t serial,
835 const ::android::hardware::hidl_string& smsc) {return Status::ok();}
836
837Return<void> RadioImpl::reportSmsMemoryStatus(int32_t serial, bool available) {return Status::ok();}
838
839Return<void> RadioImpl::reportStkServiceIsRunning(int32_t serial) {return Status::ok();}
840
841Return<void> RadioImpl::getCdmaSubscriptionSource(int32_t serial) {return Status::ok();}
842
843Return<void> RadioImpl::requestIsimAuthentication(int32_t serial,
844 const ::android::hardware::hidl_string& challenge) {return Status::ok();}
845
846Return<void> RadioImpl::acknowledgeIncomingGsmSmsWithPdu(int32_t serial,
847 bool success,
848 const ::android::hardware::hidl_string& ackPdu) {return Status::ok();}
849
850Return<void> RadioImpl::sendEnvelopeWithStatus(int32_t serial,
851 const ::android::hardware::hidl_string& contents) {return Status::ok();}
852
853Return<void> RadioImpl::getVoiceRadioTechnology(int32_t serial) {return Status::ok();}
854
855Return<void> RadioImpl::getCellInfoList(int32_t serial) {return Status::ok();}
856
857Return<void> RadioImpl::setCellInfoListRate(int32_t serial, int32_t rate) {return Status::ok();}
858
859Return<void> RadioImpl::setInitialAttachApn(int32_t serial,
860 const ::android::hardware::hidl_string& apn,
861 const ::android::hardware::hidl_string& protocol,
862 ApnAuthType authType,
863 const ::android::hardware::hidl_string& username,
864 const ::android::hardware::hidl_string& password) {return Status::ok();}
865
866Return<void> RadioImpl::getImsRegistrationState(int32_t serial) {return Status::ok();}
867
868Return<void> RadioImpl::sendImsSms(int32_t serial, const ImsSmsMessage& message) {return Status::ok();}
869
870Return<void> RadioImpl::iccTransmitApduBasicChannel(int32_t serial, const SimApdu& message) {return Status::ok();}
871
872Return<void> RadioImpl::iccOpenLogicalChannel(int32_t serial,
873 const ::android::hardware::hidl_string& aid) {return Status::ok();}
874
875Return<void> RadioImpl::iccCloseLogicalChannel(int32_t serial, int32_t channelId) {return Status::ok();}
876
877Return<void> RadioImpl::iccTransmitApduLogicalChannel(int32_t serial, const SimApdu& message) {return Status::ok();}
878
879Return<void> RadioImpl::nvReadItem(int32_t serial, NvItem itemId) {return Status::ok();}
880
881Return<void> RadioImpl::nvWriteItem(int32_t serial, const NvWriteItem& item) {return Status::ok();}
882
883Return<void> RadioImpl::nvWriteCdmaPrl(int32_t serial,
884 const ::android::hardware::hidl_vec<uint8_t>& prl) {return Status::ok();}
885
886Return<void> RadioImpl::nvResetConfig(int32_t serial, ResetNvType resetType) {return Status::ok();}
887
888Return<void> RadioImpl::setUiccSubscription(int32_t serial, const SelectUiccSub& uiccSub) {return Status::ok();}
889
890Return<void> RadioImpl::setDataAllowed(int32_t serial, bool allow) {return Status::ok();}
891
892Return<void> RadioImpl::getHardwareConfig(int32_t serial) {return Status::ok();}
893
894Return<void> RadioImpl::requestIccSimAuthentication(int32_t serial,
895 int32_t authContext,
896 const ::android::hardware::hidl_string& authData,
897 const ::android::hardware::hidl_string& aid) {return Status::ok();}
898
899Return<void> RadioImpl::setDataProfile(int32_t serial,
900 const ::android::hardware::hidl_vec<DataProfileInfo>& profiles) {return Status::ok();}
901
902Return<void> RadioImpl::requestShutdown(int32_t serial) {return Status::ok();}
903
904Return<void> RadioImpl::getRadioCapability(int32_t serial) {return Status::ok();}
905
906Return<void> RadioImpl::setRadioCapability(int32_t serial, const RadioCapability& rc) {return Status::ok();}
907
908Return<void> RadioImpl::startLceService(int32_t serial, int32_t reportInterval, bool pullMode) {return Status::ok();}
909
910Return<void> RadioImpl::stopLceService(int32_t serial) {return Status::ok();}
911
912Return<void> RadioImpl::pullLceData(int32_t serial) {return Status::ok();}
913
914Return<void> RadioImpl::getModemActivityInfo(int32_t serial) {return Status::ok();}
915
916Return<void> RadioImpl::setAllowedCarriers(int32_t serial,
917 bool allAllowed,
918 const CarrierRestrictions& carriers) {return Status::ok();}
919
920Return<void> RadioImpl::getAllowedCarriers(int32_t serial) {return Status::ok();}
921
Sanket Padawef220dc52017-01-02 23:46:00 -0800922Return<void> RadioImpl::responseAcknowledgement() {
923 android::releaseWakeLock();
924 return Status::ok();
925}
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700926
927hidl_string convertCharPtrToHidlString(char *ptr) {
928 hidl_string ret;
929 if (ptr != NULL) {
930 ret.setToExternal(ptr, strlen(ptr));
931 }
932 return ret;
933}
934
Sanket Padawef220dc52017-01-02 23:46:00 -0800935void radio::acknowledgeRequest(int slotId, int serial) {
936 if (radioService[slotId]->mRadioResponse != NULL) {
937 radioService[slotId]->mRadioResponse->acknowledgeRequest(serial);
938 } else {
Amit Mahajan5829a472016-12-28 17:28:07 -0800939 RLOGE("radio::acknowledgeRequest: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawef220dc52017-01-02 23:46:00 -0800940 }
941}
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700942
Sanket Padawef220dc52017-01-02 23:46:00 -0800943void populateResponseInfo(RadioResponseInfo& responseInfo, int serial, int responseType,
944 RIL_Errno e) {
945 responseInfo.serial = serial;
946 switch (responseType) {
947 case RESPONSE_SOLICITED:
948 responseInfo.type = RadioResponseType::SOLICITED;
949 break;
950 case RESPONSE_SOLICITED_ACK_EXP:
951 responseInfo.type = RadioResponseType::SOLICITED_ACK_EXP;
952 break;
953 }
954 responseInfo.error = (RadioError) e;
955}
956
957int responseInt(RadioResponseInfo& responseInfo, int serial, int responseType, RIL_Errno e,
958 void *response, size_t responseLen) {
959 populateResponseInfo(responseInfo, serial, responseType, e);
960 int ret = -1;
961
962 if (response == NULL || responseLen != sizeof(int)) {
963 RLOGE("responseInt: Invalid response");
964 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
965 } else {
966 int *p_int = (int *) response;
967 ret = p_int[0];
968 }
969 return ret;
970}
971
972int radio::getIccCardStatusResponse(android::Parcel &p, int slotId, int requestNumber,
973 int responseType, int serial, RIL_Errno e, void *response, size_t responseLen) {
974 RLOGD("radio::getIccCardStatusResponse: serial %d", serial);
975
976 if (radioService[slotId]->mRadioResponse != NULL) {
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700977 RadioResponseInfo responseInfo;
Sanket Padawef220dc52017-01-02 23:46:00 -0800978 populateResponseInfo(responseInfo, serial, responseType, e);
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700979 CardStatus cardStatus;
Sanket Padawef220dc52017-01-02 23:46:00 -0800980 if (response == NULL || responseLen != sizeof(RIL_CardStatus_v6)) {
981 RLOGE("radio::getIccCardStatusResponse: Invalid response");
982 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
983 memset(&cardStatus, 0, sizeof(cardStatus));
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700984 } else {
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700985 RIL_CardStatus_v6 *p_cur = ((RIL_CardStatus_v6 *) response);
986 cardStatus.cardState = (CardState) p_cur->card_state;
987 cardStatus.universalPinState = (PinState) p_cur->universal_pin_state;
988 cardStatus.gsmUmtsSubscriptionAppIndex = p_cur->gsm_umts_subscription_app_index;
989 cardStatus.cdmaSubscriptionAppIndex = p_cur->cdma_subscription_app_index;
990 cardStatus.imsSubscriptionAppIndex = p_cur->ims_subscription_app_index;
991
992 RIL_AppStatus *rilAppStatus = p_cur->applications;
993 cardStatus.applications.resize(p_cur->num_applications);
994 AppStatus *appStatus = cardStatus.applications.data();
Sanket Padawef220dc52017-01-02 23:46:00 -0800995 RLOGD("radio::getIccCardStatusResponse: num_applications %d", p_cur->num_applications);
Amit Mahajancd77a5b2016-08-25 11:19:21 -0700996 for (int i = 0; i < p_cur->num_applications; i++) {
997 appStatus[i].appType = (AppType) rilAppStatus[i].app_type;
998 appStatus[i].appState = (AppState) rilAppStatus[i].app_state;
999 appStatus[i].persoSubstate = (PersoSubstate) rilAppStatus[i].perso_substate;
1000 appStatus[i].aidPtr = convertCharPtrToHidlString(rilAppStatus[i].aid_ptr);
1001 appStatus[i].appLabelPtr = convertCharPtrToHidlString(
1002 rilAppStatus[i].app_label_ptr);
1003 appStatus[i].pin1Replaced = rilAppStatus[i].pin1_replaced;
1004 appStatus[i].pin1 = (PinState) rilAppStatus[i].pin1;
1005 appStatus[i].pin2 = (PinState) rilAppStatus[i].pin2;
1006 }
1007 }
1008
Sanket Padawef220dc52017-01-02 23:46:00 -08001009 radioService[slotId]->mRadioResponse->getIccCardStatusResponse(responseInfo, cardStatus);
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001010 } else {
Sanket Padawef220dc52017-01-02 23:46:00 -08001011 RLOGE("radio::getIccCardStatusResponse: radioService[%d]->mRadioResponse == NULL", slotId);
1012 }
1013
1014 return 0;
1015}
1016
1017int radio::supplyIccPinForAppResponse(android::Parcel &p, int slotId, int requestNumber,
1018 int responseType, int serial, RIL_Errno e, void *response, size_t responseLen) {
1019 RLOGD("radio::supplyIccPinForAppResponse: serial %d", serial);
1020
1021 if (radioService[slotId]->mRadioResponse != NULL) {
1022 RadioResponseInfo responseInfo;
1023 int ret = responseInt(responseInfo, serial, responseType, e, response, responseLen);
1024 radioService[slotId]->mRadioResponse->supplyIccPinForAppResponse(responseInfo, ret);
1025 } else {
1026 RLOGE("radio::supplyIccPinForAppResponse: radioService[%d]->mRadioResponse == NULL",
1027 slotId);
1028 }
1029
1030 return 0;
1031}
1032
1033int radio::supplyIccPukForAppResponse(android::Parcel &p, int slotId, int requestNumber,
1034 int responseType, int serial, RIL_Errno e, void *response, size_t responseLen) {
1035 RLOGD("radio::supplyIccPukForAppResponse: serial %d", serial);
1036
1037 if (radioService[slotId]->mRadioResponse != NULL) {
1038 RadioResponseInfo responseInfo;
1039 int ret = responseInt(responseInfo, serial, responseType, e, response, responseLen);
1040 radioService[slotId]->mRadioResponse->supplyIccPukForAppResponse(responseInfo, ret);
1041 } else {
1042 RLOGE("radio::supplyIccPukForAppResponse: radioService[%d]->mRadioResponse == NULL",
1043 slotId);
1044 }
1045
1046 return 0;
1047}
1048
1049int radio::supplyIccPin2ForAppResponse(android::Parcel &p, int slotId, int requestNumber,
1050 int responseType, int serial, RIL_Errno e, void *response, size_t responseLen) {
1051 RLOGD("radio::supplyIccPin2ForAppResponse: serial %d", serial);
1052
1053 if (radioService[slotId]->mRadioResponse != NULL) {
1054 RadioResponseInfo responseInfo;
1055 int ret = responseInt(responseInfo, serial, responseType, e, response, responseLen);
1056 radioService[slotId]->mRadioResponse->supplyIccPin2ForAppResponse(responseInfo, ret);
1057 } else {
1058 RLOGE("radio::supplyIccPin2ForAppResponse: radioService[%d]->mRadioResponse == NULL",
1059 slotId);
1060 }
1061
1062 return 0;
1063}
1064
1065int radio::supplyIccPuk2ForAppResponse(android::Parcel &p, int slotId, int requestNumber,
1066 int responseType, int serial, RIL_Errno e, void *response, size_t responseLen) {
1067 RLOGD("radio::supplyIccPuk2ForAppResponse: serial %d", serial);
1068
1069 if (radioService[slotId]->mRadioResponse != NULL) {
1070 RadioResponseInfo responseInfo;
1071 int ret = responseInt(responseInfo, serial, responseType, e, response, responseLen);
1072 radioService[slotId]->mRadioResponse->supplyIccPuk2ForAppResponse(responseInfo, ret);
1073 } else {
1074 RLOGE("radio::supplyIccPuk2ForAppResponse: radioService[%d]->mRadioResponse == NULL",
1075 slotId);
1076 }
1077
1078 return 0;
1079}
1080
1081int radio::changeIccPinForAppResponse(android::Parcel &p, int slotId, int requestNumber,
1082 int responseType, int serial, RIL_Errno e, void *response, size_t responseLen) {
1083 RLOGD("radio::changeIccPinForAppResponse: serial %d", serial);
1084
1085 if (radioService[slotId]->mRadioResponse != NULL) {
1086 RadioResponseInfo responseInfo;
1087 int ret = responseInt(responseInfo, serial, responseType, e, response, responseLen);
1088 radioService[slotId]->mRadioResponse->changeIccPinForAppResponse(responseInfo, ret);
1089 } else {
1090 RLOGE("radio::changeIccPinForAppResponse: radioService[%d]->mRadioResponse == NULL",
1091 slotId);
1092 }
1093
1094 return 0;
1095}
1096
1097int radio::changeIccPin2ForAppResponse(android::Parcel &p, int slotId, int requestNumber,
1098 int responseType, int serial, RIL_Errno e, void *response, size_t responseLen) {
1099 RLOGD("radio::changeIccPin2ForAppResponse: serial %d", serial);
1100
1101 if (radioService[slotId]->mRadioResponse != NULL) {
1102 RadioResponseInfo responseInfo;
1103 int ret = responseInt(responseInfo, serial, responseType, e, response, responseLen);
1104 radioService[slotId]->mRadioResponse->changeIccPin2ForAppResponse(responseInfo, ret);
1105 } else {
1106 RLOGE("radio::changeIccPin2ForAppResponse: radioService[%d]->mRadioResponse == NULL",
1107 slotId);
1108 }
1109
1110 return 0;
1111}
1112
1113int radio::supplyNetworkDepersonalizationResponse(android::Parcel &p, int slotId, int requestNumber,
1114 int responseType, int serial, RIL_Errno e, void *response, size_t responseLen) {
1115 RLOGD("radio::supplyNetworkDepersonalizationResponse: serial %d", serial);
1116
1117 if (radioService[slotId]->mRadioResponse != NULL) {
1118 RadioResponseInfo responseInfo;
1119 int ret = responseInt(responseInfo, serial, responseType, e, response, responseLen);
1120 radioService[slotId]->mRadioResponse->supplyNetworkDepersonalizationResponse(responseInfo,
1121 ret);
1122 } else {
1123 RLOGE("radio::supplyNetworkDepersonalizationResponse: radioService[%d]->mRadioResponse == \
1124 NULL", slotId);
1125 }
1126
1127 return 0;
1128}
1129
1130int radio::getCurrentCallsResponse(android::Parcel &p, int slotId, int requestNumber,
1131 int responseType, int serial, RIL_Errno e, void *response, size_t responseLen) {
1132 RLOGD("radio::getCurrentCallsResponse: serial %d", serial);
1133
1134 if (radioService[slotId]->mRadioResponse != NULL) {
1135 RadioResponseInfo responseInfo;
1136 populateResponseInfo(responseInfo, serial, responseType, e);
1137
1138 hidl_vec<Call> calls;
1139 if (response == NULL || (responseLen % sizeof(RIL_Call *)) != 0) {
1140 RLOGE("radio::getCurrentCallsResponse: Invalid response");
Amit Mahajan5829a472016-12-28 17:28:07 -08001141 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
Sanket Padawef220dc52017-01-02 23:46:00 -08001142 } else {
1143 int num = responseLen / sizeof(RIL_Call *);
1144 calls.resize(num);
1145
1146 for (int i = 0 ; i < num ; i++) {
1147 RIL_Call *p_cur = ((RIL_Call **) response)[i];
1148 /* each call info */
1149 calls[i].state = (CallState) p_cur->state;
1150 calls[i].index = p_cur->index;
1151 calls[i].toa = p_cur->toa;
1152 calls[i].isMpty = p_cur->isMpty;
1153 calls[i].isMT = p_cur->isMT;
1154 calls[i].als = p_cur->als;
1155 calls[i].isVoice = p_cur->isVoice;
1156 calls[i].isVoicePrivacy = p_cur->isVoicePrivacy;
1157 calls[i].number = convertCharPtrToHidlString(p_cur->number);
1158 calls[i].numberPresentation = (CallPresentation) p_cur->numberPresentation;
1159 calls[i].name = convertCharPtrToHidlString(p_cur->name);
1160 calls[i].namePresentation = (CallPresentation) p_cur->namePresentation;
1161 if (!(p_cur->uusInfo == NULL || p_cur->uusInfo->uusData == NULL)) {
1162 RIL_UUS_Info *uusInfo = p_cur->uusInfo;
1163 calls[i].uusInfo[0].uusType = (UusType) uusInfo->uusType;
1164 calls[i].uusInfo[0].uusDcs = (UusDcs) uusInfo->uusDcs;
1165 // convert uusInfo->uusData to a null-terminated string
1166 if (uusInfo->uusData != NULL) {
1167 char *nullTermStr = strndup(uusInfo->uusData, uusInfo->uusLength);
1168 calls[i].uusInfo[0].uusData = nullTermStr;
1169 free(nullTermStr);
1170 } else {
1171 hidl_string emptyString;
1172 calls[i].uusInfo[0].uusData = emptyString;
1173 }
1174 }
1175 }
1176 }
1177
1178 radioService[slotId]->mRadioResponse->getCurrentCallsResponse(responseInfo, calls);
1179 } else {
Amit Mahajan5829a472016-12-28 17:28:07 -08001180 RLOGE("radio::getCurrentCallsResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Sanket Padawef220dc52017-01-02 23:46:00 -08001181 }
1182
1183 return 0;
1184}
1185
1186int radio::dialResponse(android::Parcel &p, int slotId, int requestNumber,
1187 int responseType, int serial, RIL_Errno e, void *response, size_t responseLen) {
1188 RLOGD("radio::dialResponse: serial %d", serial);
1189
1190 if (radioService[slotId]->mRadioResponse != NULL) {
1191 RadioResponseInfo responseInfo;
1192 populateResponseInfo(responseInfo, serial, responseType, e);
1193 radioService[slotId]->mRadioResponse->dialResponse(responseInfo);
1194 } else {
1195 RLOGE("radio::dialResponse: radioService[%d]->mRadioResponse == NULL", slotId);
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001196 }
1197
1198 return 0;
1199}
1200
Amit Mahajan5829a472016-12-28 17:28:07 -08001201RadioIndicationType convertIntToRadioIndicationType(int indicationType) {
1202 return indicationType == RESPONSE_UNSOLICITED ? (RadioIndicationType::UNSOLICITED) :
1203 (RadioIndicationType::UNSOLICITED_ACK_EXP);
1204}
1205
1206void radio::radioStateChangedInd(int slotId, int indicationType, RIL_RadioState radioState) {
Sanket Padawef220dc52017-01-02 23:46:00 -08001207 if (radioService[slotId]->mRadioIndication != NULL) {
Amit Mahajan5829a472016-12-28 17:28:07 -08001208 RLOGD("radio::radioStateChangedInd: radioState %d", radioState);
1209 radioService[slotId]->mRadioIndication->radioStateChanged(
1210 convertIntToRadioIndicationType(indicationType), (RadioState) radioState);
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001211 } else {
Amit Mahajan5829a472016-12-28 17:28:07 -08001212 RLOGE("radio::radioStateChangedInd: radioService[%d]->mRadioIndication == NULL", slotId);
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001213 }
1214}
1215
Amit Mahajan5829a472016-12-28 17:28:07 -08001216int radio::callStateChangedInd(android::Parcel &p, int slotId, int requestNumber,
1217 int indicationType, int token, RIL_Errno e, void *response,
1218 size_t responseLen) {
1219 if (radioService[slotId]->mRadioIndication != NULL) {
1220 RLOGD("radio::callStateChangedInd");
1221 radioService[slotId]->mRadioIndication->callStateChanged(
1222 convertIntToRadioIndicationType(indicationType));
1223 } else {
1224 RLOGE("radio::callStateChangedInd: radioService[%d]->mRadioIndication == NULL", slotId);
1225 }
1226
1227 return 0;
1228}
1229
1230int radio::voiceNetworkStateChangedInd(android::Parcel &p, int slotId, int requestNumber,
1231 int indicationType, int token, RIL_Errno e, void *response,
1232 size_t responseLen) {
1233 if (radioService[slotId]->mRadioIndication != NULL) {
1234 RLOGD("radio::voiceNetworkStateChangedInd");
1235 radioService[slotId]->mRadioIndication->voiceNetworkStateChanged(
1236 convertIntToRadioIndicationType(indicationType));
1237 } else {
1238 RLOGE("radio::voiceNetworkStateChangedInd: radioService[%d]->mRadioIndication == NULL", slotId);
1239 }
1240
1241 return 0;
1242}
1243
1244uint8_t hexCharToInt(uint8_t c) {
1245 if (c >= '0' && c <= '9') return (c - '0');
1246 if (c >= 'A' && c <= 'F') return (c - 'A' + 10);
1247 if (c >= 'a' && c <= 'f') return (c - 'a' + 10);
1248
1249 return INVALID_HEX_CHAR;
1250}
1251
1252uint8_t * convertHexStringToBytes(void *response, size_t responseLen) {
1253 if (responseLen % 2 != 0) {
1254 return NULL;
1255 }
1256
1257 uint8_t *bytes = (uint8_t *)calloc(responseLen/2, sizeof(uint8_t));
1258 if (bytes == NULL) {
1259 RLOGE("convertHexStringToBytes: cannot allocate memory for bytes string");
1260 return NULL;
1261 }
1262 uint8_t *hexString = (uint8_t *)response;
1263
1264 for (int i = 0; i < responseLen; i += 2) {
1265 uint8_t hexChar1 = hexCharToInt(hexString[i]);
1266 uint8_t hexChar2 = hexCharToInt(hexString[i + 1]);
1267
1268 if (hexChar1 == INVALID_HEX_CHAR || hexChar2 == INVALID_HEX_CHAR) {
1269 RLOGE("convertHexStringToBytes: invalid hex char %d %d",
1270 hexString[i], hexString[i + 1]);
1271 free(bytes);
1272 return NULL;
1273 }
1274 bytes[i/2] = ((hexChar1 << 4) | hexChar2);
1275 }
1276
1277 return bytes;
1278}
1279
1280int radio::newSmsInd(android::Parcel &p, int slotId, int requestNumber, int indicationType,
1281 int token, RIL_Errno e, void *response, size_t responseLen) {
1282 if (radioService[slotId]->mRadioIndication != NULL) {
1283 if (response == NULL || responseLen == 0) {
1284 RLOGE("radio::newSmsInd: invalid response");
1285 return 0;
1286 }
1287
1288 uint8_t *bytes = convertHexStringToBytes(response, responseLen);
1289 if (bytes == NULL) {
1290 RLOGE("radio::newSmsInd: convertHexStringToBytes failed");
1291 return 0;
1292 }
1293
1294 hidl_vec<uint8_t> pdu;
1295 pdu.setToExternal(bytes, responseLen/2);
1296 RLOGD("radio::newSmsInd");
1297 radioService[slotId]->mRadioIndication->newSms(
1298 convertIntToRadioIndicationType(indicationType), pdu);
1299 free(bytes);
1300 } else {
1301 RLOGE("radio::newSmsInd: radioService[%d]->mRadioIndication == NULL", slotId);
1302 }
1303
1304 return 0;
1305}
1306
1307int radio::newSmsStatusReportInd(android::Parcel &p, int slotId, int requestNumber,
1308 int indicationType, int token, RIL_Errno e, void *response,
1309 size_t responseLen) {
1310 if (radioService[slotId]->mRadioIndication != NULL) {
1311 if (response == NULL || responseLen == 0) {
1312 RLOGE("radio::newSmsStatusReportInd: invalid response");
1313 return 0;
1314 }
1315
1316 uint8_t *bytes = convertHexStringToBytes(response, responseLen);
1317 if (bytes == NULL) {
1318 RLOGE("radio::newSmsStatusReportInd: convertHexStringToBytes failed");
1319 return 0;
1320 }
1321
1322 hidl_vec<uint8_t> pdu;
1323 pdu.setToExternal(bytes, responseLen/2);
1324 RLOGD("radio::newSmsStatusReportInd");
1325 radioService[slotId]->mRadioIndication->newSmsStatusReport(
1326 convertIntToRadioIndicationType(indicationType), pdu);
1327 free(bytes);
1328 } else {
1329 RLOGE("radio::newSmsStatusReportInd: radioService[%d]->mRadioIndication == NULL", slotId);
1330 }
1331
1332 return 0;
1333}
1334
1335int radio::newSmsOnSimInd(android::Parcel &p, int slotId, int requestNumber, int indicationType,
1336 int token, RIL_Errno e, void *response, size_t responseLen) {
1337 if (radioService[slotId]->mRadioIndication != NULL) {
1338 if (response == NULL || responseLen != sizeof(int)) {
1339 RLOGE("radio::newSmsOnSimInd: invalid response");
1340 return 0;
1341 }
1342 int32_t recordNumber = ((int32_t *) response)[0];
1343 RLOGD("radio::newSmsOnSimInd: slotIndex %d", recordNumber);
1344 radioService[slotId]->mRadioIndication->newSmsOnSim(
1345 convertIntToRadioIndicationType(indicationType), recordNumber);
1346 } else {
1347 RLOGE("radio::newSmsOnSimInd: radioService[%d]->mRadioIndication == NULL", slotId);
1348 }
1349
1350 return 0;
1351}
1352
1353int radio::onUssdInd(android::Parcel &p, int slotId, int requestNumber, int indicationType,
1354 int token, RIL_Errno e, void *response, size_t responseLen) {
1355 if (radioService[slotId]->mRadioIndication != NULL) {
1356 if (response == NULL || responseLen != 2 * sizeof(char *)) {
1357 RLOGE("radio::onUssdInd: invalid response");
1358 return 0;
1359 }
1360 char **strings = (char **) response;
1361 char *mode = strings[0];
1362 hidl_string msg = convertCharPtrToHidlString(strings[1]);
1363 UssdModeType modeType = (UssdModeType) atoi(mode);
1364 RLOGD("radio::onUssdInd: mode %s", mode);
1365 radioService[slotId]->mRadioIndication->onUssd(
1366 convertIntToRadioIndicationType(indicationType), modeType, msg);
1367 } else {
1368 RLOGE("radio::onUssdInd: radioService[%d]->mRadioIndication == NULL", slotId);
1369 }
1370
1371 return 0;
1372}
1373
1374int radio::nitzTimeReceivedInd(android::Parcel &p, int slotId, int requestNumber,
1375 int indicationType, int token, RIL_Errno e, void *response,
1376 size_t responseLen) {
1377 if (radioService[slotId]->mRadioIndication != NULL) {
1378 if (response == NULL || responseLen == 0) {
1379 RLOGE("radio::nitzTimeReceivedInd: invalid response");
1380 return 0;
1381 }
1382 hidl_string nitzTime = convertCharPtrToHidlString((char *) response);
1383 int64_t timeReceived = android::elapsedRealtime();
1384 RLOGD("radio::nitzTimeReceivedInd: nitzTime %s receivedTime %ld", nitzTime.c_str(), timeReceived);
1385 radioService[slotId]->mRadioIndication->nitzTimeReceived(
1386 convertIntToRadioIndicationType(indicationType), nitzTime, timeReceived);
1387 } else {
1388 RLOGE("radio::nitzTimeReceivedInd: radioService[%d]->mRadioIndication == NULL", slotId);
1389 }
1390
1391 return 0;
1392}
1393
1394void convertRilDataCallToHal(RIL_Data_Call_Response_v11 *dcResponse,
1395 SetupDataCallResult& dcResult) {
1396 dcResult.status = dcResponse->status;
1397 dcResult.suggestedRetryTime = dcResponse->suggestedRetryTime;
1398 dcResult.cid = dcResponse->cid;
1399 dcResult.active = dcResponse->active;
1400 dcResult.type = convertCharPtrToHidlString(dcResponse->type);
1401 dcResult.ifname = convertCharPtrToHidlString(dcResponse->ifname);
1402 dcResult.addresses = convertCharPtrToHidlString(dcResponse->addresses);
1403 dcResult.dnses = convertCharPtrToHidlString(dcResponse->dnses);
1404 dcResult.gateways = convertCharPtrToHidlString(dcResponse->gateways);
1405 dcResult.pcscf = convertCharPtrToHidlString(dcResponse->pcscf);
1406 dcResult.mtu = dcResponse->mtu;
1407}
1408
1409void convertRilDataCallListToHal(void *response, size_t responseLen,
1410 hidl_vec<SetupDataCallResult>& dcResultList) {
1411 int num = responseLen / sizeof(RIL_Data_Call_Response_v11);
1412
1413 RIL_Data_Call_Response_v11 *dcResponse = (RIL_Data_Call_Response_v11 *) response;
1414 dcResultList.resize(num);
1415 for (int i = 0; i < num; i++) {
1416 convertRilDataCallToHal(&dcResponse[i], dcResultList[i]);
1417 }
1418}
1419
1420int radio::dataCallListChangedInd(android::Parcel &p, int slotId, int requestNumber,
1421 int indicationType, int token, RIL_Errno e, void *response,
1422 size_t responseLen) {
1423 if (radioService[slotId]->mRadioIndication != NULL) {
1424 if (response == NULL || responseLen % sizeof(RIL_Data_Call_Response_v11) != 0) {
1425 RLOGE("radio::dataCallListChangedInd: invalid response");
1426 return 0;
1427 }
1428 hidl_vec<SetupDataCallResult> dcList;
1429 convertRilDataCallListToHal(response, responseLen, dcList);
1430 RLOGD("radio::dataCallListChangedInd");
1431 radioService[slotId]->mRadioIndication->dataCallListChanged(
1432 convertIntToRadioIndicationType(indicationType), dcList);
1433 } else {
1434 RLOGE("radio::dataCallListChangedInd: radioService[%d]->mRadioIndication == NULL", slotId);
1435 }
1436
1437 return 0;
1438}
1439
1440int radio::suppSvcNotifyInd(android::Parcel &p, int slotId, int requestNumber, int indicationType,
1441 int token, RIL_Errno e, void *response, size_t responseLen) {
1442 if (radioService[slotId]->mRadioIndication != NULL) {
1443 if (response == NULL || responseLen != sizeof(RIL_SuppSvcNotification)) {
1444 RLOGE("radio::suppSvcNotifyInd: invalid response");
1445 return 0;
1446 }
1447
1448 SuppSvcNotification suppSvc;
1449 RIL_SuppSvcNotification *ssn = (RIL_SuppSvcNotification *) response;
1450 suppSvc.isMT = ssn->notificationType;
1451 suppSvc.code = ssn->code;
1452 suppSvc.index = ssn->index;
1453 suppSvc.type = ssn->type;
1454 suppSvc.number = convertCharPtrToHidlString(ssn->number);
1455
1456 RLOGD("radio::suppSvcNotifyInd: isMT %d code %d index %d type %d",
1457 suppSvc.isMT, suppSvc.code, suppSvc.index, suppSvc.type);
1458 radioService[slotId]->mRadioIndication->suppSvcNotify(
1459 convertIntToRadioIndicationType(indicationType), suppSvc);
1460 } else {
1461 RLOGE("radio::suppSvcNotifyInd: radioService[%d]->mRadioIndication == NULL", slotId);
1462 }
1463
1464 return 0;
1465}
1466
1467int radio::stkSessionEndInd(android::Parcel &p, int slotId, int requestNumber, int indicationType,
1468 int token, RIL_Errno e, void *response, size_t responseLen) {
1469 if (radioService[slotId]->mRadioIndication != NULL) {
1470 RLOGD("radio::stkSessionEndInd");
1471 radioService[slotId]->mRadioIndication->stkSessionEnd(
1472 convertIntToRadioIndicationType(indicationType));
1473 } else {
1474 RLOGE("radio::stkSessionEndInd: radioService[%d]->mRadioIndication == NULL", slotId);
1475 }
1476
1477 return 0;
1478}
1479
1480int radio::stkProactiveCommandInd(android::Parcel &p, int slotId, int requestNumber,
1481 int indicationType, int token, RIL_Errno e, void *response,
1482 size_t responseLen) {
1483 if (radioService[slotId]->mRadioIndication != NULL) {
1484 if (response == NULL || responseLen == 0) {
1485 RLOGE("radio::stkProactiveCommandInd: invalid response");
1486 return 0;
1487 }
1488 RLOGD("radio::stkProactiveCommandInd");
1489 radioService[slotId]->mRadioIndication->stkProactiveCommand(
1490 convertIntToRadioIndicationType(indicationType),
1491 convertCharPtrToHidlString((char *) response));
1492 } else {
1493 RLOGE("radio::stkProactiveCommandInd: radioService[%d]->mRadioIndication == NULL", slotId);
1494 }
1495
1496 return 0;
1497}
1498
1499int radio::stkEventNotifyInd(android::Parcel &p, int slotId, int requestNumber, int indicationType,
1500 int token, RIL_Errno e, void *response, size_t responseLen) {
1501 if (radioService[slotId]->mRadioIndication != NULL) {
1502 if (response == NULL || responseLen == 0) {
1503 RLOGE("radio::stkEventNotifyInd: invalid response");
1504 return 0;
1505 }
1506 RLOGD("radio::stkEventNotifyInd");
1507 radioService[slotId]->mRadioIndication->stkEventNotify(
1508 convertIntToRadioIndicationType(indicationType),
1509 convertCharPtrToHidlString((char *) response));
1510 } else {
1511 RLOGE("radio::stkEventNotifyInd: radioService[%d]->mRadioIndication == NULL", slotId);
1512 }
1513
1514 return 0;
1515}
1516
1517int radio::stkCallSetupInd(android::Parcel &p, int slotId, int requestNumber, int indicationType,
1518 int token, RIL_Errno e, void *response, size_t responseLen) {
1519 if (radioService[slotId]->mRadioIndication != NULL) {
1520 if (response == NULL || responseLen != sizeof(int)) {
1521 RLOGE("radio::stkCallSetupInd: invalid response");
1522 return 0;
1523 }
1524 int32_t timeout = ((int32_t *) response)[0];
1525 RLOGD("radio::stkCallSetupInd: timeout %d", timeout);
1526 radioService[slotId]->mRadioIndication->stkCallSetup(
1527 convertIntToRadioIndicationType(indicationType), timeout);
1528 } else {
1529 RLOGE("radio::stkCallSetupInd: radioService[%d]->mRadioIndication == NULL", slotId);
1530 }
1531
1532 return 0;
1533}
1534
1535int radio::simSmsStorageFullInd(android::Parcel &p, int slotId, int requestNumber,
1536 int indicationType, int token, RIL_Errno e, void *response,
1537 size_t responseLen) {
1538 if (radioService[slotId]->mRadioIndication != NULL) {
1539 RLOGD("radio::simSmsStorageFullInd");
1540 radioService[slotId]->mRadioIndication->simSmsStorageFull(
1541 convertIntToRadioIndicationType(indicationType));
1542 } else {
1543 RLOGE("radio::simSmsStorageFullInd: radioService[%d]->mRadioIndication == NULL", slotId);
1544 }
1545
1546 return 0;
1547}
1548
1549int radio::simRefreshInd(android::Parcel &p, int slotId, int requestNumber, int indicationType,
1550 int token, RIL_Errno e, void *response, size_t responseLen) {
1551 if (radioService[slotId]->mRadioIndication != NULL) {
1552 if (response == NULL || responseLen != sizeof(RIL_SimRefreshResponse_v7)) {
1553 RLOGE("radio::simRefreshInd: invalid response");
1554 return 0;
1555 }
1556
1557 SimRefreshResult refreshResult;
1558 RIL_SimRefreshResponse_v7 *simRefreshResponse = ((RIL_SimRefreshResponse_v7 *) response);
1559 refreshResult.type =
1560 (android::hardware::radio::V1_0::SimRefreshType) simRefreshResponse->result;
1561 refreshResult.efId = simRefreshResponse->ef_id;
1562 refreshResult.aid = convertCharPtrToHidlString(simRefreshResponse->aid);
1563
1564 RLOGD("radio::simRefreshInd: type %d efId %d", refreshResult.type, refreshResult.efId);
1565 radioService[slotId]->mRadioIndication->simRefresh(
1566 convertIntToRadioIndicationType(indicationType), refreshResult);
1567 } else {
1568 RLOGE("radio::simRefreshInd: radioService[%d]->mRadioIndication == NULL", slotId);
1569 }
1570
1571 return 0;
1572}
1573
1574void convertRilCdmaSignalInfoRecordToHal(RIL_CDMA_SignalInfoRecord *signalInfoRecord,
1575 CdmaSignalInfoRecord& record) {
1576 record.isPresent = signalInfoRecord->isPresent;
1577 record.signalType = signalInfoRecord->signalType;
1578 record.alertPitch = signalInfoRecord->alertPitch;
1579 record.signal = signalInfoRecord->signal;
1580}
1581
1582int radio::callRingInd(android::Parcel &p, int slotId, int requestNumber, int indicationType,
1583 int token, RIL_Errno e, void *response, size_t responseLen) {
1584 if (radioService[slotId]->mRadioIndication != NULL) {
1585 bool isGsm;
1586 CdmaSignalInfoRecord record;
1587 if (response == NULL || responseLen == 0) {
1588 isGsm = true;
1589 } else {
1590 isGsm = false;
1591 if (responseLen != sizeof (RIL_CDMA_SignalInfoRecord)) {
1592 RLOGE("radio::callRingInd: invalid response");
1593 return 0;
1594 }
1595 convertRilCdmaSignalInfoRecordToHal((RIL_CDMA_SignalInfoRecord *) response, record);
1596 }
1597
1598 RLOGD("radio::callRingInd: isGsm %d", isGsm);
1599 radioService[slotId]->mRadioIndication->callRing(
1600 convertIntToRadioIndicationType(indicationType), isGsm, record);
1601 } else {
1602 RLOGE("radio::callRingInd: radioService[%d]->mRadioIndication == NULL", slotId);
1603 }
1604
1605 return 0;
1606}
1607
1608int radio::simStatusChangedInd(android::Parcel &p, int slotId, int requestNumber,
1609 int indicationType, int token, RIL_Errno e, void *response,
1610 size_t responseLen) {
1611 if (radioService[slotId]->mRadioIndication != NULL) {
1612 RLOGD("radio::simStatusChangedInd");
1613 radioService[slotId]->mRadioIndication->simStatusChanged(
1614 convertIntToRadioIndicationType(indicationType));
1615 } else {
1616 RLOGE("radio::simStatusChangedInd: radioService[%d]->mRadioIndication == NULL", slotId);
1617 }
1618
1619 return 0;
1620}
1621
1622int radio::cdmaNewSmsInd(android::Parcel &p, int slotId, int requestNumber, int indicationType,
1623 int token, RIL_Errno e, void *response, size_t responseLen) {
1624 if (radioService[slotId]->mRadioIndication != NULL) {
1625 if (response == NULL || responseLen != sizeof(RIL_CDMA_SMS_Message)) {
1626 RLOGE("radio::cdmaNewSmsInd: invalid response");
1627 return 0;
1628 }
1629
1630 CdmaSmsMessage msg;
1631 RIL_CDMA_SMS_Message *rilMsg = (RIL_CDMA_SMS_Message *) response;
1632 msg.teleserviceId = rilMsg->uTeleserviceID;
1633 msg.isServicePresent = rilMsg->bIsServicePresent;
1634 msg.serviceCategory = rilMsg->uServicecategory;
1635 msg.address.digitMode =
1636 (android::hardware::radio::V1_0::CdmaSmsDigitMode) rilMsg->sAddress.digit_mode;
1637 msg.address.numberMode =
1638 (android::hardware::radio::V1_0::CdmaSmsNumberMode) rilMsg->sAddress.number_mode;
1639 msg.address.numberType =
1640 (android::hardware::radio::V1_0::CdmaSmsNumberType) rilMsg->sAddress.number_type;
1641 msg.address.numberPlan =
1642 (android::hardware::radio::V1_0::CdmaSmsNumberPlan) rilMsg->sAddress.number_plan;
1643
1644 int digitLimit = MIN((rilMsg->sAddress.number_of_digits), RIL_CDMA_SMS_ADDRESS_MAX);
1645 msg.address.digits.setToExternal(rilMsg->sAddress.digits, digitLimit);
1646
1647 msg.subAddress.subaddressType = (android::hardware::radio::V1_0::CdmaSmsSubaddressType)
1648 rilMsg->sSubAddress.subaddressType;
1649 msg.subAddress.odd = rilMsg->sSubAddress.odd;
1650
1651 digitLimit= MIN((rilMsg->sSubAddress.number_of_digits), RIL_CDMA_SMS_SUBADDRESS_MAX);
1652 msg.subAddress.digits.setToExternal(rilMsg->sSubAddress.digits, digitLimit);
1653
1654 digitLimit = MIN((rilMsg->uBearerDataLen), RIL_CDMA_SMS_BEARER_DATA_MAX);
1655 msg.bearerData.setToExternal(rilMsg->aBearerData, digitLimit);
1656
1657 RLOGD("radio::cdmaNewSmsInd");
1658 radioService[slotId]->mRadioIndication->cdmaNewSms(
1659 convertIntToRadioIndicationType(indicationType), msg);
1660 } else {
1661 RLOGE("radio::cdmaNewSmsInd: radioService[%d]->mRadioIndication == NULL", slotId);
1662 }
1663
1664 return 0;
1665}
1666
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001667void radio::registerService(RIL_RadioFunctions *callbacks, CommandInfo *commands) {
1668 using namespace android::hardware;
1669 int simCount = 1;
1670 char *serviceNames[] = {
1671 android::RIL_getRilSocketName()
1672 #if (SIM_COUNT >= 2)
1673 , SOCKET2_NAME_RIL
1674 #if (SIM_COUNT >= 3)
1675 , SOCKET3_NAME_RIL
1676 #if (SIM_COUNT >= 4)
1677 , SOCKET4_NAME_RIL
1678 #endif
1679 #endif
1680 #endif
1681 };
1682
1683 #if (SIM_COUNT >= 2)
1684 simCount = SIM_COUNT;
1685 #endif
1686
1687 configureRpcThreadpool(1, true /* callerWillJoin */);
1688 for (int i = 0; i < simCount; i++) {
1689 radioService[i] = new RadioImpl;
Sanket Padawef220dc52017-01-02 23:46:00 -08001690 radioService[i]->mSlotId = i;
Amit Mahajan5829a472016-12-28 17:28:07 -08001691 RLOGD("radio::registerService: starting IRadio %s", serviceNames[i]);
Amit Mahajancd77a5b2016-08-25 11:19:21 -07001692 android::status_t status = radioService[i]->registerAsService(serviceNames[i]);
1693 }
1694
1695 s_callbacks = callbacks;
1696 s_commands = commands;
1697}
1698
1699void rilc_thread_pool() {
1700 joinRpcThreadpool();
1701}