1 /* 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 #define LOG_TAG "RILC" 18 19 #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> 22 #include <android/hardware/radio/1.1/types.h> 23 24 #include <android/hardware/radio/deprecated/1.0/IOemHook.h> 25 26 #include <hwbinder/IPCThreadState.h> 27 #include <hwbinder/ProcessState.h> 28 #include <ril_service.h> 29 #include <hidl/HidlTransportSupport.h> 30 #include <utils/SystemClock.h> 31 #include <inttypes.h> 32 33 #define INVALID_HEX_CHAR 16 34 35 using namespace android::hardware::radio; 36 using namespace android::hardware::radio::V1_0; 37 using namespace android::hardware::radio::deprecated::V1_0; 38 using ::android::hardware::configureRpcThreadpool; 39 using ::android::hardware::joinRpcThreadpool; 40 using ::android::hardware::Return; 41 using ::android::hardware::hidl_string; 42 using ::android::hardware::hidl_vec; 43 using ::android::hardware::hidl_array; 44 using ::android::hardware::Void; 45 using android::CommandInfo; 46 using android::RequestInfo; 47 using android::requestToString; 48 using android::sp; 49 50 #define BOOL_TO_INT(x) (x ? 1 : 0) 51 #define ATOI_NULL_HANDLED(x) (x ? atoi(x) : -1) 52 #define ATOI_NULL_HANDLED_DEF(x, defaultVal) (x ? atoi(x) : defaultVal) 53 54 #if defined(ANDROID_MULTI_SIM) 55 #define CALL_ONREQUEST(a, b, c, d, e) \ 56 s_vendorFunctions->onRequest((a), (b), (c), (d), ((RIL_SOCKET_ID)(e))) 57 #define CALL_ONSTATEREQUEST(a) s_vendorFunctions->onStateRequest((RIL_SOCKET_ID)(a)) 58 #else 59 #define CALL_ONREQUEST(a, b, c, d, e) s_vendorFunctions->onRequest((a), (b), (c), (d)) 60 #define CALL_ONSTATEREQUEST(a) s_vendorFunctions->onStateRequest() 61 #endif 62 63 RIL_RadioFunctions *s_vendorFunctions = NULL; 64 static CommandInfo *s_commands; 65 66 struct RadioImpl; 67 struct OemHookImpl; 68 69 #if (SIM_COUNT >= 2) 70 sp<RadioImpl> radioService[SIM_COUNT]; 71 sp<OemHookImpl> oemHookService[SIM_COUNT]; 72 // counter used for synchronization. It is incremented every time response callbacks are updated. 73 volatile int32_t mCounterRadio[SIM_COUNT]; 74 volatile int32_t mCounterOemHook[SIM_COUNT]; 75 #else 76 sp<RadioImpl> radioService[1]; 77 sp<OemHookImpl> oemHookService[1]; 78 // counter used for synchronization. It is incremented every time response callbacks are updated. 79 volatile int32_t mCounterRadio[1]; 80 volatile int32_t mCounterOemHook[1]; 81 #endif 82 83 static pthread_rwlock_t radioServiceRwlock = PTHREAD_RWLOCK_INITIALIZER; 84 85 #if (SIM_COUNT >= 2) 86 static pthread_rwlock_t radioServiceRwlock2 = PTHREAD_RWLOCK_INITIALIZER; 87 #if (SIM_COUNT >= 3) 88 static pthread_rwlock_t radioServiceRwlock3 = PTHREAD_RWLOCK_INITIALIZER; 89 #if (SIM_COUNT >= 4) 90 static pthread_rwlock_t radioServiceRwlock4 = PTHREAD_RWLOCK_INITIALIZER; 91 #endif 92 #endif 93 #endif 94 95 void convertRilHardwareConfigListToHal(void *response, size_t responseLen, 96 hidl_vec<HardwareConfig>& records); 97 98 void convertRilRadioCapabilityToHal(void *response, size_t responseLen, RadioCapability& rc); 99 100 void convertRilLceDataInfoToHal(void *response, size_t responseLen, LceDataInfo& lce); 101 102 void convertRilSignalStrengthToHal(void *response, size_t responseLen, 103 SignalStrength& signalStrength); 104 105 void convertRilDataCallToHal(RIL_Data_Call_Response_v11 *dcResponse, 106 SetupDataCallResult& dcResult); 107 108 void convertRilDataCallListToHal(void *response, size_t responseLen, 109 hidl_vec<SetupDataCallResult>& dcResultList); 110 111 void convertRilCellInfoListToHal(void *response, size_t responseLen, hidl_vec<CellInfo>& records); 112 113 struct RadioImpl : public V1_1::IRadio { 114 int32_t mSlotId; 115 sp<IRadioResponse> mRadioResponse; 116 sp<IRadioIndication> mRadioIndication; 117 sp<V1_1::IRadioResponse> mRadioResponseV1_1; 118 sp<V1_1::IRadioIndication> mRadioIndicationV1_1; 119 120 Return<void> setResponseFunctions( 121 const ::android::sp<IRadioResponse>& radioResponse, 122 const ::android::sp<IRadioIndication>& radioIndication); 123 124 Return<void> getIccCardStatus(int32_t serial); 125 126 Return<void> supplyIccPinForApp(int32_t serial, const hidl_string& pin, 127 const hidl_string& aid); 128 129 Return<void> supplyIccPukForApp(int32_t serial, const hidl_string& puk, 130 const hidl_string& pin, const hidl_string& aid); 131 132 Return<void> supplyIccPin2ForApp(int32_t serial, 133 const hidl_string& pin2, 134 const hidl_string& aid); 135 136 Return<void> supplyIccPuk2ForApp(int32_t serial, const hidl_string& puk2, 137 const hidl_string& pin2, const hidl_string& aid); 138 139 Return<void> changeIccPinForApp(int32_t serial, const hidl_string& oldPin, 140 const hidl_string& newPin, const hidl_string& aid); 141 142 Return<void> changeIccPin2ForApp(int32_t serial, const hidl_string& oldPin2, 143 const hidl_string& newPin2, const hidl_string& aid); 144 145 Return<void> supplyNetworkDepersonalization(int32_t serial, const hidl_string& netPin); 146 147 Return<void> getCurrentCalls(int32_t serial); 148 149 Return<void> dial(int32_t serial, const Dial& dialInfo); 150 151 Return<void> getImsiForApp(int32_t serial, 152 const ::android::hardware::hidl_string& aid); 153 154 Return<void> hangup(int32_t serial, int32_t gsmIndex); 155 156 Return<void> hangupWaitingOrBackground(int32_t serial); 157 158 Return<void> hangupForegroundResumeBackground(int32_t serial); 159 160 Return<void> switchWaitingOrHoldingAndActive(int32_t serial); 161 162 Return<void> conference(int32_t serial); 163 164 Return<void> rejectCall(int32_t serial); 165 166 Return<void> getLastCallFailCause(int32_t serial); 167 168 Return<void> getSignalStrength(int32_t serial); 169 170 Return<void> getVoiceRegistrationState(int32_t serial); 171 172 Return<void> getDataRegistrationState(int32_t serial); 173 174 Return<void> getOperator(int32_t serial); 175 176 Return<void> setRadioPower(int32_t serial, bool on); 177 178 Return<void> sendDtmf(int32_t serial, 179 const ::android::hardware::hidl_string& s); 180 181 Return<void> sendSms(int32_t serial, const GsmSmsMessage& message); 182 183 Return<void> sendSMSExpectMore(int32_t serial, const GsmSmsMessage& message); 184 185 Return<void> setupDataCall(int32_t serial, 186 RadioTechnology radioTechnology, 187 const DataProfileInfo& profileInfo, 188 bool modemCognitive, 189 bool roamingAllowed, 190 bool isRoaming); 191 192 Return<void> iccIOForApp(int32_t serial, 193 const IccIo& iccIo); 194 195 Return<void> sendUssd(int32_t serial, 196 const ::android::hardware::hidl_string& ussd); 197 198 Return<void> cancelPendingUssd(int32_t serial); 199 200 Return<void> getClir(int32_t serial); 201 202 Return<void> setClir(int32_t serial, int32_t status); 203 204 Return<void> getCallForwardStatus(int32_t serial, 205 const CallForwardInfo& callInfo); 206 207 Return<void> setCallForward(int32_t serial, 208 const CallForwardInfo& callInfo); 209 210 Return<void> getCallWaiting(int32_t serial, int32_t serviceClass); 211 212 Return<void> setCallWaiting(int32_t serial, bool enable, int32_t serviceClass); 213 214 Return<void> acknowledgeLastIncomingGsmSms(int32_t serial, 215 bool success, SmsAcknowledgeFailCause cause); 216 217 Return<void> acceptCall(int32_t serial); 218 219 Return<void> deactivateDataCall(int32_t serial, 220 int32_t cid, bool reasonRadioShutDown); 221 222 Return<void> getFacilityLockForApp(int32_t serial, 223 const ::android::hardware::hidl_string& facility, 224 const ::android::hardware::hidl_string& password, 225 int32_t serviceClass, 226 const ::android::hardware::hidl_string& appId); 227 228 Return<void> setFacilityLockForApp(int32_t serial, 229 const ::android::hardware::hidl_string& facility, 230 bool lockState, 231 const ::android::hardware::hidl_string& password, 232 int32_t serviceClass, 233 const ::android::hardware::hidl_string& appId); 234 235 Return<void> setBarringPassword(int32_t serial, 236 const ::android::hardware::hidl_string& facility, 237 const ::android::hardware::hidl_string& oldPassword, 238 const ::android::hardware::hidl_string& newPassword); 239 240 Return<void> getNetworkSelectionMode(int32_t serial); 241 242 Return<void> setNetworkSelectionModeAutomatic(int32_t serial); 243 244 Return<void> setNetworkSelectionModeManual(int32_t serial, 245 const ::android::hardware::hidl_string& operatorNumeric); 246 247 Return<void> getAvailableNetworks(int32_t serial); 248 249 Return<void> startNetworkScan(int32_t serial, const V1_1::NetworkScanRequest& request); 250 251 Return<void> stopNetworkScan(int32_t serial); 252 253 Return<void> startDtmf(int32_t serial, 254 const ::android::hardware::hidl_string& s); 255 256 Return<void> stopDtmf(int32_t serial); 257 258 Return<void> getBasebandVersion(int32_t serial); 259 260 Return<void> separateConnection(int32_t serial, int32_t gsmIndex); 261 262 Return<void> setMute(int32_t serial, bool enable); 263 264 Return<void> getMute(int32_t serial); 265 266 Return<void> getClip(int32_t serial); 267 268 Return<void> getDataCallList(int32_t serial); 269 270 Return<void> setSuppServiceNotifications(int32_t serial, bool enable); 271 272 Return<void> writeSmsToSim(int32_t serial, 273 const SmsWriteArgs& smsWriteArgs); 274 275 Return<void> deleteSmsOnSim(int32_t serial, int32_t index); 276 277 Return<void> setBandMode(int32_t serial, RadioBandMode mode); 278 279 Return<void> getAvailableBandModes(int32_t serial); 280 281 Return<void> sendEnvelope(int32_t serial, 282 const ::android::hardware::hidl_string& command); 283 284 Return<void> sendTerminalResponseToSim(int32_t serial, 285 const ::android::hardware::hidl_string& commandResponse); 286 287 Return<void> handleStkCallSetupRequestFromSim(int32_t serial, bool accept); 288 289 Return<void> explicitCallTransfer(int32_t serial); 290 291 Return<void> setPreferredNetworkType(int32_t serial, PreferredNetworkType nwType); 292 293 Return<void> getPreferredNetworkType(int32_t serial); 294 295 Return<void> getNeighboringCids(int32_t serial); 296 297 Return<void> setLocationUpdates(int32_t serial, bool enable); 298 299 Return<void> setCdmaSubscriptionSource(int32_t serial, 300 CdmaSubscriptionSource cdmaSub); 301 302 Return<void> setCdmaRoamingPreference(int32_t serial, CdmaRoamingType type); 303 304 Return<void> getCdmaRoamingPreference(int32_t serial); 305 306 Return<void> setTTYMode(int32_t serial, TtyMode mode); 307 308 Return<void> getTTYMode(int32_t serial); 309 310 Return<void> setPreferredVoicePrivacy(int32_t serial, bool enable); 311 312 Return<void> getPreferredVoicePrivacy(int32_t serial); 313 314 Return<void> sendCDMAFeatureCode(int32_t serial, 315 const ::android::hardware::hidl_string& featureCode); 316 317 Return<void> sendBurstDtmf(int32_t serial, 318 const ::android::hardware::hidl_string& dtmf, 319 int32_t on, 320 int32_t off); 321 322 Return<void> sendCdmaSms(int32_t serial, const CdmaSmsMessage& sms); 323 324 Return<void> acknowledgeLastIncomingCdmaSms(int32_t serial, 325 const CdmaSmsAck& smsAck); 326 327 Return<void> getGsmBroadcastConfig(int32_t serial); 328 329 Return<void> setGsmBroadcastConfig(int32_t serial, 330 const hidl_vec<GsmBroadcastSmsConfigInfo>& configInfo); 331 332 Return<void> setGsmBroadcastActivation(int32_t serial, bool activate); 333 334 Return<void> getCdmaBroadcastConfig(int32_t serial); 335 336 Return<void> setCdmaBroadcastConfig(int32_t serial, 337 const hidl_vec<CdmaBroadcastSmsConfigInfo>& configInfo); 338 339 Return<void> setCdmaBroadcastActivation(int32_t serial, bool activate); 340 341 Return<void> getCDMASubscription(int32_t serial); 342 343 Return<void> writeSmsToRuim(int32_t serial, const CdmaSmsWriteArgs& cdmaSms); 344 345 Return<void> deleteSmsOnRuim(int32_t serial, int32_t index); 346 347 Return<void> getDeviceIdentity(int32_t serial); 348 349 Return<void> exitEmergencyCallbackMode(int32_t serial); 350 351 Return<void> getSmscAddress(int32_t serial); 352 353 Return<void> setSmscAddress(int32_t serial, 354 const ::android::hardware::hidl_string& smsc); 355 356 Return<void> reportSmsMemoryStatus(int32_t serial, bool available); 357 358 Return<void> reportStkServiceIsRunning(int32_t serial); 359 360 Return<void> getCdmaSubscriptionSource(int32_t serial); 361 362 Return<void> requestIsimAuthentication(int32_t serial, 363 const ::android::hardware::hidl_string& challenge); 364 365 Return<void> acknowledgeIncomingGsmSmsWithPdu(int32_t serial, 366 bool success, 367 const ::android::hardware::hidl_string& ackPdu); 368 369 Return<void> sendEnvelopeWithStatus(int32_t serial, 370 const ::android::hardware::hidl_string& contents); 371 372 Return<void> getVoiceRadioTechnology(int32_t serial); 373 374 Return<void> getCellInfoList(int32_t serial); 375 376 Return<void> setCellInfoListRate(int32_t serial, int32_t rate); 377 378 Return<void> setInitialAttachApn(int32_t serial, const DataProfileInfo& dataProfileInfo, 379 bool modemCognitive, bool isRoaming); 380 381 Return<void> getImsRegistrationState(int32_t serial); 382 383 Return<void> sendImsSms(int32_t serial, const ImsSmsMessage& message); 384 385 Return<void> iccTransmitApduBasicChannel(int32_t serial, const SimApdu& message); 386 387 Return<void> iccOpenLogicalChannel(int32_t serial, 388 const ::android::hardware::hidl_string& aid, int32_t p2); 389 390 Return<void> iccCloseLogicalChannel(int32_t serial, int32_t channelId); 391 392 Return<void> iccTransmitApduLogicalChannel(int32_t serial, const SimApdu& message); 393 394 Return<void> nvReadItem(int32_t serial, NvItem itemId); 395 396 Return<void> nvWriteItem(int32_t serial, const NvWriteItem& item); 397 398 Return<void> nvWriteCdmaPrl(int32_t serial, 399 const ::android::hardware::hidl_vec<uint8_t>& prl); 400 401 Return<void> nvResetConfig(int32_t serial, ResetNvType resetType); 402 403 Return<void> setUiccSubscription(int32_t serial, const SelectUiccSub& uiccSub); 404 405 Return<void> setDataAllowed(int32_t serial, bool allow); 406 407 Return<void> getHardwareConfig(int32_t serial); 408 409 Return<void> requestIccSimAuthentication(int32_t serial, 410 int32_t authContext, 411 const ::android::hardware::hidl_string& authData, 412 const ::android::hardware::hidl_string& aid); 413 414 Return<void> setDataProfile(int32_t serial, 415 const ::android::hardware::hidl_vec<DataProfileInfo>& profiles, bool isRoaming); 416 417 Return<void> requestShutdown(int32_t serial); 418 419 Return<void> getRadioCapability(int32_t serial); 420 421 Return<void> setRadioCapability(int32_t serial, const RadioCapability& rc); 422 423 Return<void> startLceService(int32_t serial, int32_t reportInterval, bool pullMode); 424 425 Return<void> stopLceService(int32_t serial); 426 427 Return<void> pullLceData(int32_t serial); 428 429 Return<void> getModemActivityInfo(int32_t serial); 430 431 Return<void> setAllowedCarriers(int32_t serial, 432 bool allAllowed, 433 const CarrierRestrictions& carriers); 434 435 Return<void> getAllowedCarriers(int32_t serial); 436 437 Return<void> sendDeviceState(int32_t serial, DeviceStateType deviceStateType, bool state); 438 439 Return<void> setIndicationFilter(int32_t serial, int32_t indicationFilter); 440 441 Return<void> startKeepalive(int32_t serial, const V1_1::KeepaliveRequest& keepalive); 442 443 Return<void> stopKeepalive(int32_t serial, int32_t sessionHandle); 444 445 Return<void> setSimCardPower(int32_t serial, bool powerUp); 446 Return<void> setSimCardPower_1_1(int32_t serial, 447 const V1_1::CardPowerState state); 448 449 Return<void> responseAcknowledgement(); 450 451 Return<void> setCarrierInfoForImsiEncryption(int32_t serial, 452 const V1_1::ImsiEncryptionInfo& message); 453 454 void checkReturnStatus(Return<void>& ret); 455 }; 456 457 struct OemHookImpl : public IOemHook { 458 int32_t mSlotId; 459 sp<IOemHookResponse> mOemHookResponse; 460 sp<IOemHookIndication> mOemHookIndication; 461 462 Return<void> setResponseFunctions( 463 const ::android::sp<IOemHookResponse>& oemHookResponse, 464 const ::android::sp<IOemHookIndication>& oemHookIndication); 465 466 Return<void> sendRequestRaw(int32_t serial, 467 const ::android::hardware::hidl_vec<uint8_t>& data); 468 469 Return<void> sendRequestStrings(int32_t serial, 470 const ::android::hardware::hidl_vec<::android::hardware::hidl_string>& data); 471 }; 472 473 void memsetAndFreeStrings(int numPointers, ...) { 474 va_list ap; 475 va_start(ap, numPointers); 476 for (int i = 0; i < numPointers; i++) { 477 char *ptr = va_arg(ap, char *); 478 if (ptr) { 479 #ifdef MEMSET_FREED 480 #define MAX_STRING_LENGTH 4096 481 memset(ptr, 0, strnlen(ptr, MAX_STRING_LENGTH)); 482 #endif 483 free(ptr); 484 } 485 } 486 va_end(ap); 487 } 488 489 void sendErrorResponse(RequestInfo *pRI, RIL_Errno err) { 490 pRI->pCI->responseFunction((int) pRI->socket_id, 491 (int) RadioResponseType::SOLICITED, pRI->token, err, NULL, 0); 492 } 493 494 /** 495 * Copies over src to dest. If memory allocation fails, responseFunction() is called for the 496 * request with error RIL_E_NO_MEMORY. 497 * Returns true on success, and false on failure. 498 */ 499 bool copyHidlStringToRil(char **dest, const hidl_string &src, RequestInfo *pRI) { 500 size_t len = src.size(); 501 if (len == 0) { 502 *dest = NULL; 503 return true; 504 } 505 *dest = (char *) calloc(len + 1, sizeof(char)); 506 if (*dest == NULL) { 507 RLOGE("Memory allocation failed for request %s", requestToString(pRI->pCI->requestNumber)); 508 sendErrorResponse(pRI, RIL_E_NO_MEMORY); 509 return false; 510 } 511 strncpy(*dest, src.c_str(), len + 1); 512 return true; 513 } 514 515 hidl_string convertCharPtrToHidlString(const char *ptr) { 516 hidl_string ret; 517 if (ptr != NULL) { 518 // TODO: replace this with strnlen 519 ret.setToExternal(ptr, strlen(ptr)); 520 } 521 return ret; 522 } 523 524 bool dispatchVoid(int serial, int slotId, int request) { 525 RequestInfo *pRI = android::addRequestToList(serial, slotId, request); 526 if (pRI == NULL) { 527 return false; 528 } 529 CALL_ONREQUEST(request, NULL, 0, pRI, slotId); 530 return true; 531 } 532 533 bool dispatchString(int serial, int slotId, int request, const char * str) { 534 RequestInfo *pRI = android::addRequestToList(serial, slotId, request); 535 if (pRI == NULL) { 536 return false; 537 } 538 539 char *pString; 540 if (!copyHidlStringToRil(&pString, str, pRI)) { 541 return false; 542 } 543 544 CALL_ONREQUEST(request, pString, sizeof(char *), pRI, slotId); 545 546 memsetAndFreeStrings(1, pString); 547 return true; 548 } 549 550 bool dispatchStrings(int serial, int slotId, int request, int countStrings, ...) { 551 RequestInfo *pRI = android::addRequestToList(serial, slotId, request); 552 if (pRI == NULL) { 553 return false; 554 } 555 556 char **pStrings; 557 pStrings = (char **)calloc(countStrings, sizeof(char *)); 558 if (pStrings == NULL) { 559 RLOGE("Memory allocation failed for request %s", requestToString(request)); 560 sendErrorResponse(pRI, RIL_E_NO_MEMORY); 561 return false; 562 } 563 va_list ap; 564 va_start(ap, countStrings); 565 for (int i = 0; i < countStrings; i++) { 566 const char* str = va_arg(ap, const char *); 567 if (!copyHidlStringToRil(&pStrings[i], hidl_string(str), pRI)) { 568 va_end(ap); 569 for (int j = 0; j < i; j++) { 570 memsetAndFreeStrings(1, pStrings[j]); 571 } 572 free(pStrings); 573 return false; 574 } 575 } 576 va_end(ap); 577 578 CALL_ONREQUEST(request, pStrings, countStrings * sizeof(char *), pRI, slotId); 579 580 if (pStrings != NULL) { 581 for (int i = 0 ; i < countStrings ; i++) { 582 memsetAndFreeStrings(1, pStrings[i]); 583 } 584 585 #ifdef MEMSET_FREED 586 memset(pStrings, 0, countStrings * sizeof(char *)); 587 #endif 588 free(pStrings); 589 } 590 return true; 591 } 592 593 bool dispatchStrings(int serial, int slotId, int request, const hidl_vec<hidl_string>& data) { 594 RequestInfo *pRI = android::addRequestToList(serial, slotId, request); 595 if (pRI == NULL) { 596 return false; 597 } 598 599 int countStrings = data.size(); 600 char **pStrings; 601 pStrings = (char **)calloc(countStrings, sizeof(char *)); 602 if (pStrings == NULL) { 603 RLOGE("Memory allocation failed for request %s", requestToString(request)); 604 sendErrorResponse(pRI, RIL_E_NO_MEMORY); 605 return false; 606 } 607 608 for (int i = 0; i < countStrings; i++) { 609 if (!copyHidlStringToRil(&pStrings[i], data[i], pRI)) { 610 for (int j = 0; j < i; j++) { 611 memsetAndFreeStrings(1, pStrings[j]); 612 } 613 free(pStrings); 614 return false; 615 } 616 } 617 618 CALL_ONREQUEST(request, pStrings, countStrings * sizeof(char *), pRI, slotId); 619 620 if (pStrings != NULL) { 621 for (int i = 0 ; i < countStrings ; i++) { 622 memsetAndFreeStrings(1, pStrings[i]); 623 } 624 625 #ifdef MEMSET_FREED 626 memset(pStrings, 0, countStrings * sizeof(char *)); 627 #endif 628 free(pStrings); 629 } 630 return true; 631 } 632 633 bool dispatchInts(int serial, int slotId, int request, int countInts, ...) { 634 RequestInfo *pRI = android::addRequestToList(serial, slotId, request); 635 if (pRI == NULL) { 636 return false; 637 } 638 639 int *pInts = (int *)calloc(countInts, sizeof(int)); 640 641 if (pInts == NULL) { 642 RLOGE("Memory allocation failed for request %s", requestToString(request)); 643 sendErrorResponse(pRI, RIL_E_NO_MEMORY); 644 return false; 645 } 646 va_list ap; 647 va_start(ap, countInts); 648 for (int i = 0; i < countInts; i++) { 649 pInts[i] = va_arg(ap, int); 650 } 651 va_end(ap); 652 653 CALL_ONREQUEST(request, pInts, countInts * sizeof(int), pRI, slotId); 654 655 if (pInts != NULL) { 656 #ifdef MEMSET_FREED 657 memset(pInts, 0, countInts * sizeof(int)); 658 #endif 659 free(pInts); 660 } 661 return true; 662 } 663 664 bool dispatchCallForwardStatus(int serial, int slotId, int request, 665 const CallForwardInfo& callInfo) { 666 RequestInfo *pRI = android::addRequestToList(serial, slotId, request); 667 if (pRI == NULL) { 668 return false; 669 } 670 671 RIL_CallForwardInfo cf; 672 cf.status = (int) callInfo.status; 673 cf.reason = callInfo.reason; 674 cf.serviceClass = callInfo.serviceClass; 675 cf.toa = callInfo.toa; 676 cf.timeSeconds = callInfo.timeSeconds; 677 678 if (!copyHidlStringToRil(&cf.number, callInfo.number, pRI)) { 679 return false; 680 } 681 682 CALL_ONREQUEST(request, &cf, sizeof(cf), pRI, slotId); 683 684 memsetAndFreeStrings(1, cf.number); 685 686 return true; 687 } 688 689 bool dispatchRaw(int serial, int slotId, int request, const hidl_vec<uint8_t>& rawBytes) { 690 RequestInfo *pRI = android::addRequestToList(serial, slotId, request); 691 if (pRI == NULL) { 692 return false; 693 } 694 695 const uint8_t *uData = rawBytes.data(); 696 697 CALL_ONREQUEST(request, (void *) uData, rawBytes.size(), pRI, slotId); 698 699 return true; 700 } 701 702 bool dispatchIccApdu(int serial, int slotId, int request, const SimApdu& message) { 703 RequestInfo *pRI = android::addRequestToList(serial, slotId, request); 704 if (pRI == NULL) { 705 return false; 706 } 707 708 RIL_SIM_APDU apdu = {}; 709 710 apdu.sessionid = message.sessionId; 711 apdu.cla = message.cla; 712 apdu.instruction = message.instruction; 713 apdu.p1 = message.p1; 714 apdu.p2 = message.p2; 715 apdu.p3 = message.p3; 716 717 if (!copyHidlStringToRil(&apdu.data, message.data, pRI)) { 718 return false; 719 } 720 721 CALL_ONREQUEST(request, &apdu, sizeof(apdu), pRI, slotId); 722 723 memsetAndFreeStrings(1, apdu.data); 724 725 return true; 726 } 727 728 void checkReturnStatus(int32_t slotId, Return<void>& ret, bool isRadioService) { 729 if (ret.isOk() == false) { 730 RLOGE("checkReturnStatus: unable to call response/indication callback"); 731 // Remote process hosting the callbacks must be dead. Reset the callback objects; 732 // there's no other recovery to be done here. When the client process is back up, it will 733 // call setResponseFunctions() 734 735 // Caller should already hold rdlock, release that first 736 // note the current counter to avoid overwriting updates made by another thread before 737 // write lock is acquired. 738 int counter = isRadioService ? mCounterRadio[slotId] : mCounterOemHook[slotId]; 739 pthread_rwlock_t *radioServiceRwlockPtr = radio::getRadioServiceRwlock(slotId); 740 int ret = pthread_rwlock_unlock(radioServiceRwlockPtr); 741 assert(ret == 0); 742 743 // acquire wrlock 744 ret = pthread_rwlock_wrlock(radioServiceRwlockPtr); 745 assert(ret == 0); 746 747 // make sure the counter value has not changed 748 if (counter == (isRadioService ? mCounterRadio[slotId] : mCounterOemHook[slotId])) { 749 if (isRadioService) { 750 radioService[slotId]->mRadioResponse = NULL; 751 radioService[slotId]->mRadioIndication = NULL; 752 radioService[slotId]->mRadioResponseV1_1 = NULL; 753 radioService[slotId]->mRadioIndicationV1_1 = NULL; 754 } else { 755 oemHookService[slotId]->mOemHookResponse = NULL; 756 oemHookService[slotId]->mOemHookIndication = NULL; 757 } 758 isRadioService ? mCounterRadio[slotId]++ : mCounterOemHook[slotId]++; 759 } else { 760 RLOGE("checkReturnStatus: not resetting responseFunctions as they likely " 761 "got updated on another thread"); 762 } 763 764 // release wrlock 765 ret = pthread_rwlock_unlock(radioServiceRwlockPtr); 766 assert(ret == 0); 767 768 // Reacquire rdlock 769 ret = pthread_rwlock_rdlock(radioServiceRwlockPtr); 770 assert(ret == 0); 771 } 772 } 773 774 void RadioImpl::checkReturnStatus(Return<void>& ret) { 775 ::checkReturnStatus(mSlotId, ret, true); 776 } 777 778 Return<void> RadioImpl::setResponseFunctions( 779 const ::android::sp<IRadioResponse>& radioResponseParam, 780 const ::android::sp<IRadioIndication>& radioIndicationParam) { 781 RLOGD("setResponseFunctions"); 782 783 pthread_rwlock_t *radioServiceRwlockPtr = radio::getRadioServiceRwlock(mSlotId); 784 int ret = pthread_rwlock_wrlock(radioServiceRwlockPtr); 785 assert(ret == 0); 786 787 mRadioResponse = radioResponseParam; 788 mRadioIndication = radioIndicationParam; 789 mRadioResponseV1_1 = V1_1::IRadioResponse::castFrom(mRadioResponse).withDefault(nullptr); 790 mRadioIndicationV1_1 = V1_1::IRadioIndication::castFrom(mRadioIndication).withDefault(nullptr); 791 if (mRadioResponseV1_1 == nullptr || mRadioIndicationV1_1 == nullptr) { 792 mRadioResponseV1_1 = nullptr; 793 mRadioIndicationV1_1 = nullptr; 794 } 795 796 mCounterRadio[mSlotId]++; 797 798 ret = pthread_rwlock_unlock(radioServiceRwlockPtr); 799 assert(ret == 0); 800 801 // client is connected. Send initial indications. 802 android::onNewCommandConnect((RIL_SOCKET_ID) mSlotId); 803 804 return Void(); 805 } 806 807 Return<void> RadioImpl::getIccCardStatus(int32_t serial) { 808 #if VDBG 809 RLOGD("getIccCardStatus: serial %d", serial); 810 #endif 811 dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_SIM_STATUS); 812 return Void(); 813 } 814 815 Return<void> RadioImpl::supplyIccPinForApp(int32_t serial, const hidl_string& pin, 816 const hidl_string& aid) { 817 #if VDBG 818 RLOGD("supplyIccPinForApp: serial %d", serial); 819 #endif 820 dispatchStrings(serial, mSlotId, RIL_REQUEST_ENTER_SIM_PIN, 821 2, pin.c_str(), aid.c_str()); 822 return Void(); 823 } 824 825 Return<void> RadioImpl::supplyIccPukForApp(int32_t serial, const hidl_string& puk, 826 const hidl_string& pin, const hidl_string& aid) { 827 #if VDBG 828 RLOGD("supplyIccPukForApp: serial %d", serial); 829 #endif 830 dispatchStrings(serial, mSlotId, RIL_REQUEST_ENTER_SIM_PUK, 831 3, puk.c_str(), pin.c_str(), aid.c_str()); 832 return Void(); 833 } 834 835 Return<void> RadioImpl::supplyIccPin2ForApp(int32_t serial, const hidl_string& pin2, 836 const hidl_string& aid) { 837 #if VDBG 838 RLOGD("supplyIccPin2ForApp: serial %d", serial); 839 #endif 840 dispatchStrings(serial, mSlotId, RIL_REQUEST_ENTER_SIM_PIN2, 841 2, pin2.c_str(), aid.c_str()); 842 return Void(); 843 } 844 845 Return<void> RadioImpl::supplyIccPuk2ForApp(int32_t serial, const hidl_string& puk2, 846 const hidl_string& pin2, const hidl_string& aid) { 847 #if VDBG 848 RLOGD("supplyIccPuk2ForApp: serial %d", serial); 849 #endif 850 dispatchStrings(serial, mSlotId, RIL_REQUEST_ENTER_SIM_PUK2, 851 3, puk2.c_str(), pin2.c_str(), aid.c_str()); 852 return Void(); 853 } 854 855 Return<void> RadioImpl::changeIccPinForApp(int32_t serial, const hidl_string& oldPin, 856 const hidl_string& newPin, const hidl_string& aid) { 857 #if VDBG 858 RLOGD("changeIccPinForApp: serial %d", serial); 859 #endif 860 dispatchStrings(serial, mSlotId, RIL_REQUEST_CHANGE_SIM_PIN, 861 3, oldPin.c_str(), newPin.c_str(), aid.c_str()); 862 return Void(); 863 } 864 865 Return<void> RadioImpl::changeIccPin2ForApp(int32_t serial, const hidl_string& oldPin2, 866 const hidl_string& newPin2, const hidl_string& aid) { 867 #if VDBG 868 RLOGD("changeIccPin2ForApp: serial %d", serial); 869 #endif 870 dispatchStrings(serial, mSlotId, RIL_REQUEST_CHANGE_SIM_PIN2, 871 3, oldPin2.c_str(), newPin2.c_str(), aid.c_str()); 872 return Void(); 873 } 874 875 Return<void> RadioImpl::supplyNetworkDepersonalization(int32_t serial, 876 const hidl_string& netPin) { 877 #if VDBG 878 RLOGD("supplyNetworkDepersonalization: serial %d", serial); 879 #endif 880 dispatchStrings(serial, mSlotId, RIL_REQUEST_ENTER_NETWORK_DEPERSONALIZATION, 881 1, netPin.c_str()); 882 return Void(); 883 } 884 885 Return<void> RadioImpl::getCurrentCalls(int32_t serial) { 886 #if VDBG 887 RLOGD("getCurrentCalls: serial %d", serial); 888 #endif 889 dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_CURRENT_CALLS); 890 return Void(); 891 } 892 893 Return<void> RadioImpl::dial(int32_t serial, const Dial& dialInfo) { 894 #if VDBG 895 RLOGD("dial: serial %d", serial); 896 #endif 897 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_DIAL); 898 if (pRI == NULL) { 899 return Void(); 900 } 901 RIL_Dial dial = {}; 902 RIL_UUS_Info uusInfo = {}; 903 int32_t sizeOfDial = sizeof(dial); 904 905 if (!copyHidlStringToRil(&dial.address, dialInfo.address, pRI)) { 906 return Void(); 907 } 908 dial.clir = (int) dialInfo.clir; 909 910 if (dialInfo.uusInfo.size() != 0) { 911 uusInfo.uusType = (RIL_UUS_Type) dialInfo.uusInfo[0].uusType; 912 uusInfo.uusDcs = (RIL_UUS_DCS) dialInfo.uusInfo[0].uusDcs; 913 914 if (dialInfo.uusInfo[0].uusData.size() == 0) { 915 uusInfo.uusData = NULL; 916 uusInfo.uusLength = 0; 917 } else { 918 if (!copyHidlStringToRil(&uusInfo.uusData, dialInfo.uusInfo[0].uusData, pRI)) { 919 memsetAndFreeStrings(1, dial.address); 920 return Void(); 921 } 922 uusInfo.uusLength = dialInfo.uusInfo[0].uusData.size(); 923 } 924 925 dial.uusInfo = &uusInfo; 926 } 927 928 CALL_ONREQUEST(RIL_REQUEST_DIAL, &dial, sizeOfDial, pRI, mSlotId); 929 930 memsetAndFreeStrings(2, dial.address, uusInfo.uusData); 931 932 return Void(); 933 } 934 935 Return<void> RadioImpl::getImsiForApp(int32_t serial, const hidl_string& aid) { 936 #if VDBG 937 RLOGD("getImsiForApp: serial %d", serial); 938 #endif 939 dispatchStrings(serial, mSlotId, RIL_REQUEST_GET_IMSI, 940 1, aid.c_str()); 941 return Void(); 942 } 943 944 Return<void> RadioImpl::hangup(int32_t serial, int32_t gsmIndex) { 945 #if VDBG 946 RLOGD("hangup: serial %d", serial); 947 #endif 948 dispatchInts(serial, mSlotId, RIL_REQUEST_HANGUP, 1, gsmIndex); 949 return Void(); 950 } 951 952 Return<void> RadioImpl::hangupWaitingOrBackground(int32_t serial) { 953 #if VDBG 954 RLOGD("hangupWaitingOrBackground: serial %d", serial); 955 #endif 956 dispatchVoid(serial, mSlotId, RIL_REQUEST_HANGUP_WAITING_OR_BACKGROUND); 957 return Void(); 958 } 959 960 Return<void> RadioImpl::hangupForegroundResumeBackground(int32_t serial) { 961 #if VDBG 962 RLOGD("hangupForegroundResumeBackground: serial %d", serial); 963 #endif 964 dispatchVoid(serial, mSlotId, RIL_REQUEST_HANGUP_FOREGROUND_RESUME_BACKGROUND); 965 return Void(); 966 } 967 968 Return<void> RadioImpl::switchWaitingOrHoldingAndActive(int32_t serial) { 969 #if VDBG 970 RLOGD("switchWaitingOrHoldingAndActive: serial %d", serial); 971 #endif 972 dispatchVoid(serial, mSlotId, RIL_REQUEST_SWITCH_WAITING_OR_HOLDING_AND_ACTIVE); 973 return Void(); 974 } 975 976 Return<void> RadioImpl::conference(int32_t serial) { 977 #if VDBG 978 RLOGD("conference: serial %d", serial); 979 #endif 980 dispatchVoid(serial, mSlotId, RIL_REQUEST_CONFERENCE); 981 return Void(); 982 } 983 984 Return<void> RadioImpl::rejectCall(int32_t serial) { 985 #if VDBG 986 RLOGD("rejectCall: serial %d", serial); 987 #endif 988 dispatchVoid(serial, mSlotId, RIL_REQUEST_UDUB); 989 return Void(); 990 } 991 992 Return<void> RadioImpl::getLastCallFailCause(int32_t serial) { 993 #if VDBG 994 RLOGD("getLastCallFailCause: serial %d", serial); 995 #endif 996 dispatchVoid(serial, mSlotId, RIL_REQUEST_LAST_CALL_FAIL_CAUSE); 997 return Void(); 998 } 999 1000 Return<void> RadioImpl::getSignalStrength(int32_t serial) { 1001 #if VDBG 1002 RLOGD("getSignalStrength: serial %d", serial); 1003 #endif 1004 dispatchVoid(serial, mSlotId, RIL_REQUEST_SIGNAL_STRENGTH); 1005 return Void(); 1006 } 1007 1008 Return<void> RadioImpl::getVoiceRegistrationState(int32_t serial) { 1009 #if VDBG 1010 RLOGD("getVoiceRegistrationState: serial %d", serial); 1011 #endif 1012 dispatchVoid(serial, mSlotId, RIL_REQUEST_VOICE_REGISTRATION_STATE); 1013 return Void(); 1014 } 1015 1016 Return<void> RadioImpl::getDataRegistrationState(int32_t serial) { 1017 #if VDBG 1018 RLOGD("getDataRegistrationState: serial %d", serial); 1019 #endif 1020 dispatchVoid(serial, mSlotId, RIL_REQUEST_DATA_REGISTRATION_STATE); 1021 return Void(); 1022 } 1023 1024 Return<void> RadioImpl::getOperator(int32_t serial) { 1025 #if VDBG 1026 RLOGD("getOperator: serial %d", serial); 1027 #endif 1028 dispatchVoid(serial, mSlotId, RIL_REQUEST_OPERATOR); 1029 return Void(); 1030 } 1031 1032 Return<void> RadioImpl::setRadioPower(int32_t serial, bool on) { 1033 RLOGD("setRadioPower: serial %d on %d", serial, on); 1034 dispatchInts(serial, mSlotId, RIL_REQUEST_RADIO_POWER, 1, BOOL_TO_INT(on)); 1035 return Void(); 1036 } 1037 1038 Return<void> RadioImpl::sendDtmf(int32_t serial, const hidl_string& s) { 1039 #if VDBG 1040 RLOGD("sendDtmf: serial %d", serial); 1041 #endif 1042 dispatchString(serial, mSlotId, RIL_REQUEST_DTMF, s.c_str()); 1043 return Void(); 1044 } 1045 1046 Return<void> RadioImpl::sendSms(int32_t serial, const GsmSmsMessage& message) { 1047 #if VDBG 1048 RLOGD("sendSms: serial %d", serial); 1049 #endif 1050 dispatchStrings(serial, mSlotId, RIL_REQUEST_SEND_SMS, 1051 2, message.smscPdu.c_str(), message.pdu.c_str()); 1052 return Void(); 1053 } 1054 1055 Return<void> RadioImpl::sendSMSExpectMore(int32_t serial, const GsmSmsMessage& message) { 1056 #if VDBG 1057 RLOGD("sendSMSExpectMore: serial %d", serial); 1058 #endif 1059 dispatchStrings(serial, mSlotId, RIL_REQUEST_SEND_SMS_EXPECT_MORE, 1060 2, message.smscPdu.c_str(), message.pdu.c_str()); 1061 return Void(); 1062 } 1063 1064 static bool convertMvnoTypeToString(MvnoType type, char *&str) { 1065 switch (type) { 1066 case MvnoType::IMSI: 1067 str = (char *)"imsi"; 1068 return true; 1069 case MvnoType::GID: 1070 str = (char *)"gid"; 1071 return true; 1072 case MvnoType::SPN: 1073 str = (char *)"spn"; 1074 return true; 1075 case MvnoType::NONE: 1076 str = (char *)""; 1077 return true; 1078 } 1079 return false; 1080 } 1081 1082 Return<void> RadioImpl::setupDataCall(int32_t serial, RadioTechnology radioTechnology, 1083 const DataProfileInfo& dataProfileInfo, bool modemCognitive, 1084 bool roamingAllowed, bool isRoaming) { 1085 1086 #if VDBG 1087 RLOGD("setupDataCall: serial %d", serial); 1088 #endif 1089 1090 if (s_vendorFunctions->version >= 4 && s_vendorFunctions->version <= 14) { 1091 const hidl_string &protocol = 1092 (isRoaming ? dataProfileInfo.roamingProtocol : dataProfileInfo.protocol); 1093 dispatchStrings(serial, mSlotId, RIL_REQUEST_SETUP_DATA_CALL, 7, 1094 std::to_string((int) radioTechnology + 2).c_str(), 1095 std::to_string((int) dataProfileInfo.profileId).c_str(), 1096 dataProfileInfo.apn.c_str(), 1097 dataProfileInfo.user.c_str(), 1098 dataProfileInfo.password.c_str(), 1099 std::to_string((int) dataProfileInfo.authType).c_str(), 1100 protocol.c_str()); 1101 } else if (s_vendorFunctions->version >= 15) { 1102 char *mvnoTypeStr = NULL; 1103 if (!convertMvnoTypeToString(dataProfileInfo.mvnoType, mvnoTypeStr)) { 1104 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, 1105 RIL_REQUEST_SETUP_DATA_CALL); 1106 if (pRI != NULL) { 1107 sendErrorResponse(pRI, RIL_E_INVALID_ARGUMENTS); 1108 } 1109 return Void(); 1110 } 1111 dispatchStrings(serial, mSlotId, RIL_REQUEST_SETUP_DATA_CALL, 15, 1112 std::to_string((int) radioTechnology + 2).c_str(), 1113 std::to_string((int) dataProfileInfo.profileId).c_str(), 1114 dataProfileInfo.apn.c_str(), 1115 dataProfileInfo.user.c_str(), 1116 dataProfileInfo.password.c_str(), 1117 std::to_string((int) dataProfileInfo.authType).c_str(), 1118 dataProfileInfo.protocol.c_str(), 1119 dataProfileInfo.roamingProtocol.c_str(), 1120 std::to_string(dataProfileInfo.supportedApnTypesBitmap).c_str(), 1121 std::to_string(dataProfileInfo.bearerBitmap).c_str(), 1122 modemCognitive ? "1" : "0", 1123 std::to_string(dataProfileInfo.mtu).c_str(), 1124 mvnoTypeStr, 1125 dataProfileInfo.mvnoMatchData.c_str(), 1126 roamingAllowed ? "1" : "0"); 1127 } else { 1128 RLOGE("Unsupported RIL version %d, min version expected 4", s_vendorFunctions->version); 1129 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, 1130 RIL_REQUEST_SETUP_DATA_CALL); 1131 if (pRI != NULL) { 1132 sendErrorResponse(pRI, RIL_E_REQUEST_NOT_SUPPORTED); 1133 } 1134 } 1135 return Void(); 1136 } 1137 1138 Return<void> RadioImpl::iccIOForApp(int32_t serial, const IccIo& iccIo) { 1139 #if VDBG 1140 RLOGD("iccIOForApp: serial %d", serial); 1141 #endif 1142 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_SIM_IO); 1143 if (pRI == NULL) { 1144 return Void(); 1145 } 1146 1147 RIL_SIM_IO_v6 rilIccIo = {}; 1148 rilIccIo.command = iccIo.command; 1149 rilIccIo.fileid = iccIo.fileId; 1150 if (!copyHidlStringToRil(&rilIccIo.path, iccIo.path, pRI)) { 1151 return Void(); 1152 } 1153 1154 rilIccIo.p1 = iccIo.p1; 1155 rilIccIo.p2 = iccIo.p2; 1156 rilIccIo.p3 = iccIo.p3; 1157 1158 if (!copyHidlStringToRil(&rilIccIo.data, iccIo.data, pRI)) { 1159 memsetAndFreeStrings(1, rilIccIo.path); 1160 return Void(); 1161 } 1162 1163 if (!copyHidlStringToRil(&rilIccIo.pin2, iccIo.pin2, pRI)) { 1164 memsetAndFreeStrings(2, rilIccIo.path, rilIccIo.data); 1165 return Void(); 1166 } 1167 1168 if (!copyHidlStringToRil(&rilIccIo.aidPtr, iccIo.aid, pRI)) { 1169 memsetAndFreeStrings(3, rilIccIo.path, rilIccIo.data, rilIccIo.pin2); 1170 return Void(); 1171 } 1172 1173 CALL_ONREQUEST(RIL_REQUEST_SIM_IO, &rilIccIo, sizeof(rilIccIo), pRI, mSlotId); 1174 1175 memsetAndFreeStrings(4, rilIccIo.path, rilIccIo.data, rilIccIo.pin2, rilIccIo.aidPtr); 1176 1177 return Void(); 1178 } 1179 1180 Return<void> RadioImpl::sendUssd(int32_t serial, const hidl_string& ussd) { 1181 #if VDBG 1182 RLOGD("sendUssd: serial %d", serial); 1183 #endif 1184 dispatchString(serial, mSlotId, RIL_REQUEST_SEND_USSD, ussd.c_str()); 1185 return Void(); 1186 } 1187 1188 Return<void> RadioImpl::cancelPendingUssd(int32_t serial) { 1189 #if VDBG 1190 RLOGD("cancelPendingUssd: serial %d", serial); 1191 #endif 1192 dispatchVoid(serial, mSlotId, RIL_REQUEST_CANCEL_USSD); 1193 return Void(); 1194 } 1195 1196 Return<void> RadioImpl::getClir(int32_t serial) { 1197 #if VDBG 1198 RLOGD("getClir: serial %d", serial); 1199 #endif 1200 dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_CLIR); 1201 return Void(); 1202 } 1203 1204 Return<void> RadioImpl::setClir(int32_t serial, int32_t status) { 1205 #if VDBG 1206 RLOGD("setClir: serial %d", serial); 1207 #endif 1208 dispatchInts(serial, mSlotId, RIL_REQUEST_SET_CLIR, 1, status); 1209 return Void(); 1210 } 1211 1212 Return<void> RadioImpl::getCallForwardStatus(int32_t serial, const CallForwardInfo& callInfo) { 1213 #if VDBG 1214 RLOGD("getCallForwardStatus: serial %d", serial); 1215 #endif 1216 dispatchCallForwardStatus(serial, mSlotId, RIL_REQUEST_QUERY_CALL_FORWARD_STATUS, 1217 callInfo); 1218 return Void(); 1219 } 1220 1221 Return<void> RadioImpl::setCallForward(int32_t serial, const CallForwardInfo& callInfo) { 1222 #if VDBG 1223 RLOGD("setCallForward: serial %d", serial); 1224 #endif 1225 dispatchCallForwardStatus(serial, mSlotId, RIL_REQUEST_SET_CALL_FORWARD, 1226 callInfo); 1227 return Void(); 1228 } 1229 1230 Return<void> RadioImpl::getCallWaiting(int32_t serial, int32_t serviceClass) { 1231 #if VDBG 1232 RLOGD("getCallWaiting: serial %d", serial); 1233 #endif 1234 dispatchInts(serial, mSlotId, RIL_REQUEST_QUERY_CALL_WAITING, 1, serviceClass); 1235 return Void(); 1236 } 1237 1238 Return<void> RadioImpl::setCallWaiting(int32_t serial, bool enable, int32_t serviceClass) { 1239 #if VDBG 1240 RLOGD("setCallWaiting: serial %d", serial); 1241 #endif 1242 dispatchInts(serial, mSlotId, RIL_REQUEST_SET_CALL_WAITING, 2, BOOL_TO_INT(enable), 1243 serviceClass); 1244 return Void(); 1245 } 1246 1247 Return<void> RadioImpl::acknowledgeLastIncomingGsmSms(int32_t serial, 1248 bool success, SmsAcknowledgeFailCause cause) { 1249 #if VDBG 1250 RLOGD("acknowledgeLastIncomingGsmSms: serial %d", serial); 1251 #endif 1252 dispatchInts(serial, mSlotId, RIL_REQUEST_SMS_ACKNOWLEDGE, 2, BOOL_TO_INT(success), 1253 cause); 1254 return Void(); 1255 } 1256 1257 Return<void> RadioImpl::acceptCall(int32_t serial) { 1258 #if VDBG 1259 RLOGD("acceptCall: serial %d", serial); 1260 #endif 1261 dispatchVoid(serial, mSlotId, RIL_REQUEST_ANSWER); 1262 return Void(); 1263 } 1264 1265 Return<void> RadioImpl::deactivateDataCall(int32_t serial, 1266 int32_t cid, bool reasonRadioShutDown) { 1267 #if VDBG 1268 RLOGD("deactivateDataCall: serial %d", serial); 1269 #endif 1270 dispatchStrings(serial, mSlotId, RIL_REQUEST_DEACTIVATE_DATA_CALL, 1271 2, (std::to_string(cid)).c_str(), reasonRadioShutDown ? "1" : "0"); 1272 return Void(); 1273 } 1274 1275 Return<void> RadioImpl::getFacilityLockForApp(int32_t serial, const hidl_string& facility, 1276 const hidl_string& password, int32_t serviceClass, 1277 const hidl_string& appId) { 1278 #if VDBG 1279 RLOGD("getFacilityLockForApp: serial %d", serial); 1280 #endif 1281 dispatchStrings(serial, mSlotId, RIL_REQUEST_QUERY_FACILITY_LOCK, 1282 4, facility.c_str(), password.c_str(), 1283 (std::to_string(serviceClass)).c_str(), appId.c_str()); 1284 return Void(); 1285 } 1286 1287 Return<void> RadioImpl::setFacilityLockForApp(int32_t serial, const hidl_string& facility, 1288 bool lockState, const hidl_string& password, 1289 int32_t serviceClass, const hidl_string& appId) { 1290 #if VDBG 1291 RLOGD("setFacilityLockForApp: serial %d", serial); 1292 #endif 1293 dispatchStrings(serial, mSlotId, RIL_REQUEST_SET_FACILITY_LOCK, 1294 5, facility.c_str(), lockState ? "1" : "0", password.c_str(), 1295 (std::to_string(serviceClass)).c_str(), appId.c_str() ); 1296 return Void(); 1297 } 1298 1299 Return<void> RadioImpl::setBarringPassword(int32_t serial, const hidl_string& facility, 1300 const hidl_string& oldPassword, 1301 const hidl_string& newPassword) { 1302 #if VDBG 1303 RLOGD("setBarringPassword: serial %d", serial); 1304 #endif 1305 dispatchStrings(serial, mSlotId, RIL_REQUEST_CHANGE_BARRING_PASSWORD, 1306 3, facility.c_str(), oldPassword.c_str(), newPassword.c_str()); 1307 return Void(); 1308 } 1309 1310 Return<void> RadioImpl::getNetworkSelectionMode(int32_t serial) { 1311 #if VDBG 1312 RLOGD("getNetworkSelectionMode: serial %d", serial); 1313 #endif 1314 dispatchVoid(serial, mSlotId, RIL_REQUEST_QUERY_NETWORK_SELECTION_MODE); 1315 return Void(); 1316 } 1317 1318 Return<void> RadioImpl::setNetworkSelectionModeAutomatic(int32_t serial) { 1319 #if VDBG 1320 RLOGD("setNetworkSelectionModeAutomatic: serial %d", serial); 1321 #endif 1322 dispatchVoid(serial, mSlotId, RIL_REQUEST_SET_NETWORK_SELECTION_AUTOMATIC); 1323 return Void(); 1324 } 1325 1326 Return<void> RadioImpl::setNetworkSelectionModeManual(int32_t serial, 1327 const hidl_string& operatorNumeric) { 1328 #if VDBG 1329 RLOGD("setNetworkSelectionModeManual: serial %d", serial); 1330 #endif 1331 dispatchString(serial, mSlotId, RIL_REQUEST_SET_NETWORK_SELECTION_MANUAL, 1332 operatorNumeric.c_str()); 1333 return Void(); 1334 } 1335 1336 Return<void> RadioImpl::getAvailableNetworks(int32_t serial) { 1337 #if VDBG 1338 RLOGD("getAvailableNetworks: serial %d", serial); 1339 #endif 1340 dispatchVoid(serial, mSlotId, RIL_REQUEST_QUERY_AVAILABLE_NETWORKS); 1341 return Void(); 1342 } 1343 1344 Return<void> RadioImpl::startNetworkScan(int32_t serial, const V1_1::NetworkScanRequest& request) { 1345 #if VDBG 1346 RLOGD("startNetworkScan: serial %d", serial); 1347 #endif 1348 1349 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_START_NETWORK_SCAN); 1350 if (pRI == NULL) { 1351 return Void(); 1352 } 1353 1354 if (request.specifiers.size() > MAX_RADIO_ACCESS_NETWORKS) { 1355 sendErrorResponse(pRI, RIL_E_INVALID_ARGUMENTS); 1356 return Void(); 1357 } 1358 1359 RIL_NetworkScanRequest scan_request = {}; 1360 1361 scan_request.type = (RIL_ScanType) request.type; 1362 scan_request.interval = request.interval; 1363 scan_request.specifiers_length = request.specifiers.size(); 1364 for (size_t i = 0; i < request.specifiers.size(); ++i) { 1365 if (request.specifiers[i].geranBands.size() > MAX_BANDS || 1366 request.specifiers[i].utranBands.size() > MAX_BANDS || 1367 request.specifiers[i].eutranBands.size() > MAX_BANDS || 1368 request.specifiers[i].channels.size() > MAX_CHANNELS) { 1369 sendErrorResponse(pRI, RIL_E_INVALID_ARGUMENTS); 1370 return Void(); 1371 } 1372 const V1_1::RadioAccessSpecifier& ras_from = 1373 request.specifiers[i]; 1374 RIL_RadioAccessSpecifier& ras_to = scan_request.specifiers[i]; 1375 1376 ras_to.radio_access_network = (RIL_RadioAccessNetworks) ras_from.radioAccessNetwork; 1377 ras_to.channels_length = ras_from.channels.size(); 1378 1379 std::copy(ras_from.channels.begin(), ras_from.channels.end(), ras_to.channels); 1380 const std::vector<uint32_t> * bands = nullptr; 1381 switch (request.specifiers[i].radioAccessNetwork) { 1382 case V1_1::RadioAccessNetworks::GERAN: 1383 ras_to.bands_length = ras_from.geranBands.size(); 1384 bands = (std::vector<uint32_t> *) &ras_from.geranBands; 1385 break; 1386 case V1_1::RadioAccessNetworks::UTRAN: 1387 ras_to.bands_length = ras_from.utranBands.size(); 1388 bands = (std::vector<uint32_t> *) &ras_from.utranBands; 1389 break; 1390 case V1_1::RadioAccessNetworks::EUTRAN: 1391 ras_to.bands_length = ras_from.eutranBands.size(); 1392 bands = (std::vector<uint32_t> *) &ras_from.eutranBands; 1393 break; 1394 default: 1395 sendErrorResponse(pRI, RIL_E_INVALID_ARGUMENTS); 1396 return Void(); 1397 } 1398 // safe to copy to geran_bands because it's a union member 1399 for (size_t idx = 0; idx < ras_to.bands_length; ++idx) { 1400 ras_to.bands.geran_bands[idx] = (RIL_GeranBands) (*bands)[idx]; 1401 } 1402 } 1403 1404 CALL_ONREQUEST(RIL_REQUEST_START_NETWORK_SCAN, &scan_request, sizeof(scan_request), pRI, 1405 mSlotId); 1406 1407 return Void(); 1408 } 1409 1410 Return<void> RadioImpl::stopNetworkScan(int32_t serial) { 1411 #if VDBG 1412 RLOGD("stopNetworkScan: serial %d", serial); 1413 #endif 1414 dispatchVoid(serial, mSlotId, RIL_REQUEST_STOP_NETWORK_SCAN); 1415 return Void(); 1416 } 1417 1418 Return<void> RadioImpl::startDtmf(int32_t serial, const hidl_string& s) { 1419 #if VDBG 1420 RLOGD("startDtmf: serial %d", serial); 1421 #endif 1422 dispatchString(serial, mSlotId, RIL_REQUEST_DTMF_START, 1423 s.c_str()); 1424 return Void(); 1425 } 1426 1427 Return<void> RadioImpl::stopDtmf(int32_t serial) { 1428 #if VDBG 1429 RLOGD("stopDtmf: serial %d", serial); 1430 #endif 1431 dispatchVoid(serial, mSlotId, RIL_REQUEST_DTMF_STOP); 1432 return Void(); 1433 } 1434 1435 Return<void> RadioImpl::getBasebandVersion(int32_t serial) { 1436 #if VDBG 1437 RLOGD("getBasebandVersion: serial %d", serial); 1438 #endif 1439 dispatchVoid(serial, mSlotId, RIL_REQUEST_BASEBAND_VERSION); 1440 return Void(); 1441 } 1442 1443 Return<void> RadioImpl::separateConnection(int32_t serial, int32_t gsmIndex) { 1444 #if VDBG 1445 RLOGD("separateConnection: serial %d", serial); 1446 #endif 1447 dispatchInts(serial, mSlotId, RIL_REQUEST_SEPARATE_CONNECTION, 1, gsmIndex); 1448 return Void(); 1449 } 1450 1451 Return<void> RadioImpl::setMute(int32_t serial, bool enable) { 1452 #if VDBG 1453 RLOGD("setMute: serial %d", serial); 1454 #endif 1455 dispatchInts(serial, mSlotId, RIL_REQUEST_SET_MUTE, 1, BOOL_TO_INT(enable)); 1456 return Void(); 1457 } 1458 1459 Return<void> RadioImpl::getMute(int32_t serial) { 1460 #if VDBG 1461 RLOGD("getMute: serial %d", serial); 1462 #endif 1463 dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_MUTE); 1464 return Void(); 1465 } 1466 1467 Return<void> RadioImpl::getClip(int32_t serial) { 1468 #if VDBG 1469 RLOGD("getClip: serial %d", serial); 1470 #endif 1471 dispatchVoid(serial, mSlotId, RIL_REQUEST_QUERY_CLIP); 1472 return Void(); 1473 } 1474 1475 Return<void> RadioImpl::getDataCallList(int32_t serial) { 1476 #if VDBG 1477 RLOGD("getDataCallList: serial %d", serial); 1478 #endif 1479 dispatchVoid(serial, mSlotId, RIL_REQUEST_DATA_CALL_LIST); 1480 return Void(); 1481 } 1482 1483 Return<void> RadioImpl::setSuppServiceNotifications(int32_t serial, bool enable) { 1484 #if VDBG 1485 RLOGD("setSuppServiceNotifications: serial %d", serial); 1486 #endif 1487 dispatchInts(serial, mSlotId, RIL_REQUEST_SET_SUPP_SVC_NOTIFICATION, 1, 1488 BOOL_TO_INT(enable)); 1489 return Void(); 1490 } 1491 1492 Return<void> RadioImpl::writeSmsToSim(int32_t serial, const SmsWriteArgs& smsWriteArgs) { 1493 #if VDBG 1494 RLOGD("writeSmsToSim: serial %d", serial); 1495 #endif 1496 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_WRITE_SMS_TO_SIM); 1497 if (pRI == NULL) { 1498 return Void(); 1499 } 1500 1501 RIL_SMS_WriteArgs args; 1502 args.status = (int) smsWriteArgs.status; 1503 1504 if (!copyHidlStringToRil(&args.pdu, smsWriteArgs.pdu, pRI)) { 1505 return Void(); 1506 } 1507 1508 if (!copyHidlStringToRil(&args.smsc, smsWriteArgs.smsc, pRI)) { 1509 memsetAndFreeStrings(1, args.pdu); 1510 return Void(); 1511 } 1512 1513 CALL_ONREQUEST(RIL_REQUEST_WRITE_SMS_TO_SIM, &args, sizeof(args), pRI, mSlotId); 1514 1515 memsetAndFreeStrings(2, args.smsc, args.pdu); 1516 1517 return Void(); 1518 } 1519 1520 Return<void> RadioImpl::deleteSmsOnSim(int32_t serial, int32_t index) { 1521 #if VDBG 1522 RLOGD("deleteSmsOnSim: serial %d", serial); 1523 #endif 1524 dispatchInts(serial, mSlotId, RIL_REQUEST_DELETE_SMS_ON_SIM, 1, index); 1525 return Void(); 1526 } 1527 1528 Return<void> RadioImpl::setBandMode(int32_t serial, RadioBandMode mode) { 1529 #if VDBG 1530 RLOGD("setBandMode: serial %d", serial); 1531 #endif 1532 dispatchInts(serial, mSlotId, RIL_REQUEST_SET_BAND_MODE, 1, mode); 1533 return Void(); 1534 } 1535 1536 Return<void> RadioImpl::getAvailableBandModes(int32_t serial) { 1537 #if VDBG 1538 RLOGD("getAvailableBandModes: serial %d", serial); 1539 #endif 1540 dispatchVoid(serial, mSlotId, RIL_REQUEST_QUERY_AVAILABLE_BAND_MODE); 1541 return Void(); 1542 } 1543 1544 Return<void> RadioImpl::sendEnvelope(int32_t serial, const hidl_string& command) { 1545 #if VDBG 1546 RLOGD("sendEnvelope: serial %d", serial); 1547 #endif 1548 dispatchString(serial, mSlotId, RIL_REQUEST_STK_SEND_ENVELOPE_COMMAND, 1549 command.c_str()); 1550 return Void(); 1551 } 1552 1553 Return<void> RadioImpl::sendTerminalResponseToSim(int32_t serial, 1554 const hidl_string& commandResponse) { 1555 #if VDBG 1556 RLOGD("sendTerminalResponseToSim: serial %d", serial); 1557 #endif 1558 dispatchString(serial, mSlotId, RIL_REQUEST_STK_SEND_TERMINAL_RESPONSE, 1559 commandResponse.c_str()); 1560 return Void(); 1561 } 1562 1563 Return<void> RadioImpl::handleStkCallSetupRequestFromSim(int32_t serial, bool accept) { 1564 #if VDBG 1565 RLOGD("handleStkCallSetupRequestFromSim: serial %d", serial); 1566 #endif 1567 dispatchInts(serial, mSlotId, RIL_REQUEST_STK_HANDLE_CALL_SETUP_REQUESTED_FROM_SIM, 1568 1, BOOL_TO_INT(accept)); 1569 return Void(); 1570 } 1571 1572 Return<void> RadioImpl::explicitCallTransfer(int32_t serial) { 1573 #if VDBG 1574 RLOGD("explicitCallTransfer: serial %d", serial); 1575 #endif 1576 dispatchVoid(serial, mSlotId, RIL_REQUEST_EXPLICIT_CALL_TRANSFER); 1577 return Void(); 1578 } 1579 1580 Return<void> RadioImpl::setPreferredNetworkType(int32_t serial, PreferredNetworkType nwType) { 1581 #if VDBG 1582 RLOGD("setPreferredNetworkType: serial %d", serial); 1583 #endif 1584 dispatchInts(serial, mSlotId, RIL_REQUEST_SET_PREFERRED_NETWORK_TYPE, 1, nwType); 1585 return Void(); 1586 } 1587 1588 Return<void> RadioImpl::getPreferredNetworkType(int32_t serial) { 1589 #if VDBG 1590 RLOGD("getPreferredNetworkType: serial %d", serial); 1591 #endif 1592 dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_PREFERRED_NETWORK_TYPE); 1593 return Void(); 1594 } 1595 1596 Return<void> RadioImpl::getNeighboringCids(int32_t serial) { 1597 #if VDBG 1598 RLOGD("getNeighboringCids: serial %d", serial); 1599 #endif 1600 dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_NEIGHBORING_CELL_IDS); 1601 return Void(); 1602 } 1603 1604 Return<void> RadioImpl::setLocationUpdates(int32_t serial, bool enable) { 1605 #if VDBG 1606 RLOGD("setLocationUpdates: serial %d", serial); 1607 #endif 1608 dispatchInts(serial, mSlotId, RIL_REQUEST_SET_LOCATION_UPDATES, 1, BOOL_TO_INT(enable)); 1609 return Void(); 1610 } 1611 1612 Return<void> RadioImpl::setCdmaSubscriptionSource(int32_t serial, CdmaSubscriptionSource cdmaSub) { 1613 #if VDBG 1614 RLOGD("setCdmaSubscriptionSource: serial %d", serial); 1615 #endif 1616 dispatchInts(serial, mSlotId, RIL_REQUEST_CDMA_SET_SUBSCRIPTION_SOURCE, 1, cdmaSub); 1617 return Void(); 1618 } 1619 1620 Return<void> RadioImpl::setCdmaRoamingPreference(int32_t serial, CdmaRoamingType type) { 1621 #if VDBG 1622 RLOGD("setCdmaRoamingPreference: serial %d", serial); 1623 #endif 1624 dispatchInts(serial, mSlotId, RIL_REQUEST_CDMA_SET_ROAMING_PREFERENCE, 1, type); 1625 return Void(); 1626 } 1627 1628 Return<void> RadioImpl::getCdmaRoamingPreference(int32_t serial) { 1629 #if VDBG 1630 RLOGD("getCdmaRoamingPreference: serial %d", serial); 1631 #endif 1632 dispatchVoid(serial, mSlotId, RIL_REQUEST_CDMA_QUERY_ROAMING_PREFERENCE); 1633 return Void(); 1634 } 1635 1636 Return<void> RadioImpl::setTTYMode(int32_t serial, TtyMode mode) { 1637 #if VDBG 1638 RLOGD("setTTYMode: serial %d", serial); 1639 #endif 1640 dispatchInts(serial, mSlotId, RIL_REQUEST_SET_TTY_MODE, 1, mode); 1641 return Void(); 1642 } 1643 1644 Return<void> RadioImpl::getTTYMode(int32_t serial) { 1645 #if VDBG 1646 RLOGD("getTTYMode: serial %d", serial); 1647 #endif 1648 dispatchVoid(serial, mSlotId, RIL_REQUEST_QUERY_TTY_MODE); 1649 return Void(); 1650 } 1651 1652 Return<void> RadioImpl::setPreferredVoicePrivacy(int32_t serial, bool enable) { 1653 #if VDBG 1654 RLOGD("setPreferredVoicePrivacy: serial %d", serial); 1655 #endif 1656 dispatchInts(serial, mSlotId, RIL_REQUEST_CDMA_SET_PREFERRED_VOICE_PRIVACY_MODE, 1657 1, BOOL_TO_INT(enable)); 1658 return Void(); 1659 } 1660 1661 Return<void> RadioImpl::getPreferredVoicePrivacy(int32_t serial) { 1662 #if VDBG 1663 RLOGD("getPreferredVoicePrivacy: serial %d", serial); 1664 #endif 1665 dispatchVoid(serial, mSlotId, RIL_REQUEST_CDMA_QUERY_PREFERRED_VOICE_PRIVACY_MODE); 1666 return Void(); 1667 } 1668 1669 Return<void> RadioImpl::sendCDMAFeatureCode(int32_t serial, const hidl_string& featureCode) { 1670 #if VDBG 1671 RLOGD("sendCDMAFeatureCode: serial %d", serial); 1672 #endif 1673 dispatchString(serial, mSlotId, RIL_REQUEST_CDMA_FLASH, 1674 featureCode.c_str()); 1675 return Void(); 1676 } 1677 1678 Return<void> RadioImpl::sendBurstDtmf(int32_t serial, const hidl_string& dtmf, int32_t on, 1679 int32_t off) { 1680 #if VDBG 1681 RLOGD("sendBurstDtmf: serial %d", serial); 1682 #endif 1683 dispatchStrings(serial, mSlotId, RIL_REQUEST_CDMA_BURST_DTMF, 1684 3, dtmf.c_str(), (std::to_string(on)).c_str(), 1685 (std::to_string(off)).c_str()); 1686 return Void(); 1687 } 1688 1689 void constructCdmaSms(RIL_CDMA_SMS_Message &rcsm, const CdmaSmsMessage& sms) { 1690 rcsm.uTeleserviceID = sms.teleserviceId; 1691 rcsm.bIsServicePresent = BOOL_TO_INT(sms.isServicePresent); 1692 rcsm.uServicecategory = sms.serviceCategory; 1693 rcsm.sAddress.digit_mode = (RIL_CDMA_SMS_DigitMode) sms.address.digitMode; 1694 rcsm.sAddress.number_mode = (RIL_CDMA_SMS_NumberMode) sms.address.numberMode; 1695 rcsm.sAddress.number_type = (RIL_CDMA_SMS_NumberType) sms.address.numberType; 1696 rcsm.sAddress.number_plan = (RIL_CDMA_SMS_NumberPlan) sms.address.numberPlan; 1697 1698 rcsm.sAddress.number_of_digits = sms.address.digits.size(); 1699 int digitLimit= MIN((rcsm.sAddress.number_of_digits), RIL_CDMA_SMS_ADDRESS_MAX); 1700 for (int i = 0; i < digitLimit; i++) { 1701 rcsm.sAddress.digits[i] = sms.address.digits[i]; 1702 } 1703 1704 rcsm.sSubAddress.subaddressType = (RIL_CDMA_SMS_SubaddressType) sms.subAddress.subaddressType; 1705 rcsm.sSubAddress.odd = BOOL_TO_INT(sms.subAddress.odd); 1706 1707 rcsm.sSubAddress.number_of_digits = sms.subAddress.digits.size(); 1708 digitLimit= MIN((rcsm.sSubAddress.number_of_digits), RIL_CDMA_SMS_SUBADDRESS_MAX); 1709 for (int i = 0; i < digitLimit; i++) { 1710 rcsm.sSubAddress.digits[i] = sms.subAddress.digits[i]; 1711 } 1712 1713 rcsm.uBearerDataLen = sms.bearerData.size(); 1714 digitLimit= MIN((rcsm.uBearerDataLen), RIL_CDMA_SMS_BEARER_DATA_MAX); 1715 for (int i = 0; i < digitLimit; i++) { 1716 rcsm.aBearerData[i] = sms.bearerData[i]; 1717 } 1718 } 1719 1720 Return<void> RadioImpl::sendCdmaSms(int32_t serial, const CdmaSmsMessage& sms) { 1721 #if VDBG 1722 RLOGD("sendCdmaSms: serial %d", serial); 1723 #endif 1724 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_CDMA_SEND_SMS); 1725 if (pRI == NULL) { 1726 return Void(); 1727 } 1728 1729 RIL_CDMA_SMS_Message rcsm = {}; 1730 constructCdmaSms(rcsm, sms); 1731 1732 CALL_ONREQUEST(pRI->pCI->requestNumber, &rcsm, sizeof(rcsm), pRI, mSlotId); 1733 return Void(); 1734 } 1735 1736 Return<void> RadioImpl::acknowledgeLastIncomingCdmaSms(int32_t serial, const CdmaSmsAck& smsAck) { 1737 #if VDBG 1738 RLOGD("acknowledgeLastIncomingCdmaSms: serial %d", serial); 1739 #endif 1740 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_CDMA_SMS_ACKNOWLEDGE); 1741 if (pRI == NULL) { 1742 return Void(); 1743 } 1744 1745 RIL_CDMA_SMS_Ack rcsa = {}; 1746 1747 rcsa.uErrorClass = (RIL_CDMA_SMS_ErrorClass) smsAck.errorClass; 1748 rcsa.uSMSCauseCode = smsAck.smsCauseCode; 1749 1750 CALL_ONREQUEST(pRI->pCI->requestNumber, &rcsa, sizeof(rcsa), pRI, mSlotId); 1751 return Void(); 1752 } 1753 1754 Return<void> RadioImpl::getGsmBroadcastConfig(int32_t serial) { 1755 #if VDBG 1756 RLOGD("getGsmBroadcastConfig: serial %d", serial); 1757 #endif 1758 dispatchVoid(serial, mSlotId, RIL_REQUEST_GSM_GET_BROADCAST_SMS_CONFIG); 1759 return Void(); 1760 } 1761 1762 Return<void> RadioImpl::setGsmBroadcastConfig(int32_t serial, 1763 const hidl_vec<GsmBroadcastSmsConfigInfo>& 1764 configInfo) { 1765 #if VDBG 1766 RLOGD("setGsmBroadcastConfig: serial %d", serial); 1767 #endif 1768 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, 1769 RIL_REQUEST_GSM_SET_BROADCAST_SMS_CONFIG); 1770 if (pRI == NULL) { 1771 return Void(); 1772 } 1773 1774 int num = configInfo.size(); 1775 RIL_GSM_BroadcastSmsConfigInfo gsmBci[num]; 1776 RIL_GSM_BroadcastSmsConfigInfo *gsmBciPtrs[num]; 1777 1778 for (int i = 0 ; i < num ; i++ ) { 1779 gsmBciPtrs[i] = &gsmBci[i]; 1780 gsmBci[i].fromServiceId = configInfo[i].fromServiceId; 1781 gsmBci[i].toServiceId = configInfo[i].toServiceId; 1782 gsmBci[i].fromCodeScheme = configInfo[i].fromCodeScheme; 1783 gsmBci[i].toCodeScheme = configInfo[i].toCodeScheme; 1784 gsmBci[i].selected = BOOL_TO_INT(configInfo[i].selected); 1785 } 1786 1787 CALL_ONREQUEST(pRI->pCI->requestNumber, gsmBciPtrs, 1788 num * sizeof(RIL_GSM_BroadcastSmsConfigInfo *), pRI, mSlotId); 1789 return Void(); 1790 } 1791 1792 Return<void> RadioImpl::setGsmBroadcastActivation(int32_t serial, bool activate) { 1793 #if VDBG 1794 RLOGD("setGsmBroadcastActivation: serial %d", serial); 1795 #endif 1796 dispatchInts(serial, mSlotId, RIL_REQUEST_GSM_SMS_BROADCAST_ACTIVATION, 1797 1, BOOL_TO_INT(!activate)); 1798 return Void(); 1799 } 1800 1801 Return<void> RadioImpl::getCdmaBroadcastConfig(int32_t serial) { 1802 #if VDBG 1803 RLOGD("getCdmaBroadcastConfig: serial %d", serial); 1804 #endif 1805 dispatchVoid(serial, mSlotId, RIL_REQUEST_CDMA_GET_BROADCAST_SMS_CONFIG); 1806 return Void(); 1807 } 1808 1809 Return<void> RadioImpl::setCdmaBroadcastConfig(int32_t serial, 1810 const hidl_vec<CdmaBroadcastSmsConfigInfo>& 1811 configInfo) { 1812 #if VDBG 1813 RLOGD("setCdmaBroadcastConfig: serial %d", serial); 1814 #endif 1815 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, 1816 RIL_REQUEST_CDMA_SET_BROADCAST_SMS_CONFIG); 1817 if (pRI == NULL) { 1818 return Void(); 1819 } 1820 1821 int num = configInfo.size(); 1822 RIL_CDMA_BroadcastSmsConfigInfo cdmaBci[num]; 1823 RIL_CDMA_BroadcastSmsConfigInfo *cdmaBciPtrs[num]; 1824 1825 for (int i = 0 ; i < num ; i++ ) { 1826 cdmaBciPtrs[i] = &cdmaBci[i]; 1827 cdmaBci[i].service_category = configInfo[i].serviceCategory; 1828 cdmaBci[i].language = configInfo[i].language; 1829 cdmaBci[i].selected = BOOL_TO_INT(configInfo[i].selected); 1830 } 1831 1832 CALL_ONREQUEST(pRI->pCI->requestNumber, cdmaBciPtrs, 1833 num * sizeof(RIL_CDMA_BroadcastSmsConfigInfo *), pRI, mSlotId); 1834 return Void(); 1835 } 1836 1837 Return<void> RadioImpl::setCdmaBroadcastActivation(int32_t serial, bool activate) { 1838 #if VDBG 1839 RLOGD("setCdmaBroadcastActivation: serial %d", serial); 1840 #endif 1841 dispatchInts(serial, mSlotId, RIL_REQUEST_CDMA_SMS_BROADCAST_ACTIVATION, 1842 1, BOOL_TO_INT(!activate)); 1843 return Void(); 1844 } 1845 1846 Return<void> RadioImpl::getCDMASubscription(int32_t serial) { 1847 #if VDBG 1848 RLOGD("getCDMASubscription: serial %d", serial); 1849 #endif 1850 dispatchVoid(serial, mSlotId, RIL_REQUEST_CDMA_SUBSCRIPTION); 1851 return Void(); 1852 } 1853 1854 Return<void> RadioImpl::writeSmsToRuim(int32_t serial, const CdmaSmsWriteArgs& cdmaSms) { 1855 #if VDBG 1856 RLOGD("writeSmsToRuim: serial %d", serial); 1857 #endif 1858 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, 1859 RIL_REQUEST_CDMA_WRITE_SMS_TO_RUIM); 1860 if (pRI == NULL) { 1861 return Void(); 1862 } 1863 1864 RIL_CDMA_SMS_WriteArgs rcsw = {}; 1865 rcsw.status = (int) cdmaSms.status; 1866 constructCdmaSms(rcsw.message, cdmaSms.message); 1867 1868 CALL_ONREQUEST(pRI->pCI->requestNumber, &rcsw, sizeof(rcsw), pRI, mSlotId); 1869 return Void(); 1870 } 1871 1872 Return<void> RadioImpl::deleteSmsOnRuim(int32_t serial, int32_t index) { 1873 #if VDBG 1874 RLOGD("deleteSmsOnRuim: serial %d", serial); 1875 #endif 1876 dispatchInts(serial, mSlotId, RIL_REQUEST_CDMA_DELETE_SMS_ON_RUIM, 1, index); 1877 return Void(); 1878 } 1879 1880 Return<void> RadioImpl::getDeviceIdentity(int32_t serial) { 1881 #if VDBG 1882 RLOGD("getDeviceIdentity: serial %d", serial); 1883 #endif 1884 dispatchVoid(serial, mSlotId, RIL_REQUEST_DEVICE_IDENTITY); 1885 return Void(); 1886 } 1887 1888 Return<void> RadioImpl::exitEmergencyCallbackMode(int32_t serial) { 1889 #if VDBG 1890 RLOGD("exitEmergencyCallbackMode: serial %d", serial); 1891 #endif 1892 dispatchVoid(serial, mSlotId, RIL_REQUEST_EXIT_EMERGENCY_CALLBACK_MODE); 1893 return Void(); 1894 } 1895 1896 Return<void> RadioImpl::getSmscAddress(int32_t serial) { 1897 #if VDBG 1898 RLOGD("getSmscAddress: serial %d", serial); 1899 #endif 1900 dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_SMSC_ADDRESS); 1901 return Void(); 1902 } 1903 1904 Return<void> RadioImpl::setSmscAddress(int32_t serial, const hidl_string& smsc) { 1905 #if VDBG 1906 RLOGD("setSmscAddress: serial %d", serial); 1907 #endif 1908 dispatchString(serial, mSlotId, RIL_REQUEST_SET_SMSC_ADDRESS, 1909 smsc.c_str()); 1910 return Void(); 1911 } 1912 1913 Return<void> RadioImpl::reportSmsMemoryStatus(int32_t serial, bool available) { 1914 #if VDBG 1915 RLOGD("reportSmsMemoryStatus: serial %d", serial); 1916 #endif 1917 dispatchInts(serial, mSlotId, RIL_REQUEST_REPORT_SMS_MEMORY_STATUS, 1, 1918 BOOL_TO_INT(available)); 1919 return Void(); 1920 } 1921 1922 Return<void> RadioImpl::reportStkServiceIsRunning(int32_t serial) { 1923 #if VDBG 1924 RLOGD("reportStkServiceIsRunning: serial %d", serial); 1925 #endif 1926 dispatchVoid(serial, mSlotId, RIL_REQUEST_REPORT_STK_SERVICE_IS_RUNNING); 1927 return Void(); 1928 } 1929 1930 Return<void> RadioImpl::getCdmaSubscriptionSource(int32_t serial) { 1931 #if VDBG 1932 RLOGD("getCdmaSubscriptionSource: serial %d", serial); 1933 #endif 1934 dispatchVoid(serial, mSlotId, RIL_REQUEST_CDMA_GET_SUBSCRIPTION_SOURCE); 1935 return Void(); 1936 } 1937 1938 Return<void> RadioImpl::requestIsimAuthentication(int32_t serial, const hidl_string& challenge) { 1939 #if VDBG 1940 RLOGD("requestIsimAuthentication: serial %d", serial); 1941 #endif 1942 dispatchString(serial, mSlotId, RIL_REQUEST_ISIM_AUTHENTICATION, 1943 challenge.c_str()); 1944 return Void(); 1945 } 1946 1947 Return<void> RadioImpl::acknowledgeIncomingGsmSmsWithPdu(int32_t serial, bool success, 1948 const hidl_string& ackPdu) { 1949 #if VDBG 1950 RLOGD("acknowledgeIncomingGsmSmsWithPdu: serial %d", serial); 1951 #endif 1952 dispatchStrings(serial, mSlotId, RIL_REQUEST_ACKNOWLEDGE_INCOMING_GSM_SMS_WITH_PDU, 1953 2, success ? "1" : "0", ackPdu.c_str()); 1954 return Void(); 1955 } 1956 1957 Return<void> RadioImpl::sendEnvelopeWithStatus(int32_t serial, const hidl_string& contents) { 1958 #if VDBG 1959 RLOGD("sendEnvelopeWithStatus: serial %d", serial); 1960 #endif 1961 dispatchString(serial, mSlotId, RIL_REQUEST_STK_SEND_ENVELOPE_WITH_STATUS, 1962 contents.c_str()); 1963 return Void(); 1964 } 1965 1966 Return<void> RadioImpl::getVoiceRadioTechnology(int32_t serial) { 1967 #if VDBG 1968 RLOGD("getVoiceRadioTechnology: serial %d", serial); 1969 #endif 1970 dispatchVoid(serial, mSlotId, RIL_REQUEST_VOICE_RADIO_TECH); 1971 return Void(); 1972 } 1973 1974 Return<void> RadioImpl::getCellInfoList(int32_t serial) { 1975 #if VDBG 1976 RLOGD("getCellInfoList: serial %d", serial); 1977 #endif 1978 dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_CELL_INFO_LIST); 1979 return Void(); 1980 } 1981 1982 Return<void> RadioImpl::setCellInfoListRate(int32_t serial, int32_t rate) { 1983 #if VDBG 1984 RLOGD("setCellInfoListRate: serial %d", serial); 1985 #endif 1986 dispatchInts(serial, mSlotId, RIL_REQUEST_SET_UNSOL_CELL_INFO_LIST_RATE, 1, rate); 1987 return Void(); 1988 } 1989 1990 Return<void> RadioImpl::setInitialAttachApn(int32_t serial, const DataProfileInfo& dataProfileInfo, 1991 bool modemCognitive, bool isRoaming) { 1992 #if VDBG 1993 RLOGD("setInitialAttachApn: serial %d", serial); 1994 #endif 1995 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, 1996 RIL_REQUEST_SET_INITIAL_ATTACH_APN); 1997 if (pRI == NULL) { 1998 return Void(); 1999 } 2000 2001 if (s_vendorFunctions->version <= 14) { 2002 RIL_InitialAttachApn iaa = {}; 2003 2004 if (dataProfileInfo.apn.size() == 0) { 2005 iaa.apn = (char *) calloc(1, sizeof(char)); 2006 if (iaa.apn == NULL) { 2007 RLOGE("Memory allocation failed for request %s", 2008 requestToString(pRI->pCI->requestNumber)); 2009 sendErrorResponse(pRI, RIL_E_NO_MEMORY); 2010 return Void(); 2011 } 2012 iaa.apn[0] = '\0'; 2013 } else { 2014 if (!copyHidlStringToRil(&iaa.apn, dataProfileInfo.apn, pRI)) { 2015 return Void(); 2016 } 2017 } 2018 2019 const hidl_string &protocol = 2020 (isRoaming ? dataProfileInfo.roamingProtocol : dataProfileInfo.protocol); 2021 2022 if (!copyHidlStringToRil(&iaa.protocol, protocol, pRI)) { 2023 memsetAndFreeStrings(1, iaa.apn); 2024 return Void(); 2025 } 2026 iaa.authtype = (int) dataProfileInfo.authType; 2027 if (!copyHidlStringToRil(&iaa.username, dataProfileInfo.user, pRI)) { 2028 memsetAndFreeStrings(2, iaa.apn, iaa.protocol); 2029 return Void(); 2030 } 2031 if (!copyHidlStringToRil(&iaa.password, dataProfileInfo.password, pRI)) { 2032 memsetAndFreeStrings(3, iaa.apn, iaa.protocol, iaa.username); 2033 return Void(); 2034 } 2035 2036 CALL_ONREQUEST(RIL_REQUEST_SET_INITIAL_ATTACH_APN, &iaa, sizeof(iaa), pRI, mSlotId); 2037 2038 memsetAndFreeStrings(4, iaa.apn, iaa.protocol, iaa.username, iaa.password); 2039 } else { 2040 RIL_InitialAttachApn_v15 iaa = {}; 2041 2042 if (dataProfileInfo.apn.size() == 0) { 2043 iaa.apn = (char *) calloc(1, sizeof(char)); 2044 if (iaa.apn == NULL) { 2045 RLOGE("Memory allocation failed for request %s", 2046 requestToString(pRI->pCI->requestNumber)); 2047 sendErrorResponse(pRI, RIL_E_NO_MEMORY); 2048 return Void(); 2049 } 2050 iaa.apn[0] = '\0'; 2051 } else { 2052 if (!copyHidlStringToRil(&iaa.apn, dataProfileInfo.apn, pRI)) { 2053 return Void(); 2054 } 2055 } 2056 2057 if (!copyHidlStringToRil(&iaa.protocol, dataProfileInfo.protocol, pRI)) { 2058 memsetAndFreeStrings(1, iaa.apn); 2059 return Void(); 2060 } 2061 if (!copyHidlStringToRil(&iaa.roamingProtocol, dataProfileInfo.roamingProtocol, pRI)) { 2062 memsetAndFreeStrings(2, iaa.apn, iaa.protocol); 2063 return Void(); 2064 } 2065 iaa.authtype = (int) dataProfileInfo.authType; 2066 if (!copyHidlStringToRil(&iaa.username, dataProfileInfo.user, pRI)) { 2067 memsetAndFreeStrings(3, iaa.apn, iaa.protocol, iaa.roamingProtocol); 2068 return Void(); 2069 } 2070 if (!copyHidlStringToRil(&iaa.password, dataProfileInfo.password, pRI)) { 2071 memsetAndFreeStrings(4, iaa.apn, iaa.protocol, iaa.roamingProtocol, iaa.username); 2072 return Void(); 2073 } 2074 iaa.supportedTypesBitmask = dataProfileInfo.supportedApnTypesBitmap; 2075 iaa.bearerBitmask = dataProfileInfo.bearerBitmap; 2076 iaa.modemCognitive = BOOL_TO_INT(modemCognitive); 2077 iaa.mtu = dataProfileInfo.mtu; 2078 2079 if (!convertMvnoTypeToString(dataProfileInfo.mvnoType, iaa.mvnoType)) { 2080 sendErrorResponse(pRI, RIL_E_INVALID_ARGUMENTS); 2081 memsetAndFreeStrings(5, iaa.apn, iaa.protocol, iaa.roamingProtocol, iaa.username, 2082 iaa.password); 2083 return Void(); 2084 } 2085 2086 if (!copyHidlStringToRil(&iaa.mvnoMatchData, dataProfileInfo.mvnoMatchData, pRI)) { 2087 memsetAndFreeStrings(5, iaa.apn, iaa.protocol, iaa.roamingProtocol, iaa.username, 2088 iaa.password); 2089 return Void(); 2090 } 2091 2092 CALL_ONREQUEST(RIL_REQUEST_SET_INITIAL_ATTACH_APN, &iaa, sizeof(iaa), pRI, mSlotId); 2093 2094 memsetAndFreeStrings(6, iaa.apn, iaa.protocol, iaa.roamingProtocol, iaa.username, 2095 iaa.password, iaa.mvnoMatchData); 2096 } 2097 2098 return Void(); 2099 } 2100 2101 Return<void> RadioImpl::getImsRegistrationState(int32_t serial) { 2102 #if VDBG 2103 RLOGD("getImsRegistrationState: serial %d", serial); 2104 #endif 2105 dispatchVoid(serial, mSlotId, RIL_REQUEST_IMS_REGISTRATION_STATE); 2106 return Void(); 2107 } 2108 2109 bool dispatchImsGsmSms(const ImsSmsMessage& message, RequestInfo *pRI) { 2110 RIL_IMS_SMS_Message rism = {}; 2111 char **pStrings; 2112 int countStrings = 2; 2113 int dataLen = sizeof(char *) * countStrings; 2114 2115 rism.tech = RADIO_TECH_3GPP; 2116 rism.retry = BOOL_TO_INT(message.retry); 2117 rism.messageRef = message.messageRef; 2118 2119 if (message.gsmMessage.size() != 1) { 2120 RLOGE("dispatchImsGsmSms: Invalid len %s", requestToString(pRI->pCI->requestNumber)); 2121 sendErrorResponse(pRI, RIL_E_INVALID_ARGUMENTS); 2122 return false; 2123 } 2124 2125 pStrings = (char **)calloc(countStrings, sizeof(char *)); 2126 if (pStrings == NULL) { 2127 RLOGE("dispatchImsGsmSms: Memory allocation failed for request %s", 2128 requestToString(pRI->pCI->requestNumber)); 2129 sendErrorResponse(pRI, RIL_E_NO_MEMORY); 2130 return false; 2131 } 2132 2133 if (!copyHidlStringToRil(&pStrings[0], message.gsmMessage[0].smscPdu, pRI)) { 2134 #ifdef MEMSET_FREED 2135 memset(pStrings, 0, dataLen); 2136 #endif 2137 free(pStrings); 2138 return false; 2139 } 2140 2141 if (!copyHidlStringToRil(&pStrings[1], message.gsmMessage[0].pdu, pRI)) { 2142 memsetAndFreeStrings(1, pStrings[0]); 2143 #ifdef MEMSET_FREED 2144 memset(pStrings, 0, dataLen); 2145 #endif 2146 free(pStrings); 2147 return false; 2148 } 2149 2150 rism.message.gsmMessage = pStrings; 2151 CALL_ONREQUEST(pRI->pCI->requestNumber, &rism, sizeof(RIL_RadioTechnologyFamily) + 2152 sizeof(uint8_t) + sizeof(int32_t) + dataLen, pRI, pRI->socket_id); 2153 2154 for (int i = 0 ; i < countStrings ; i++) { 2155 memsetAndFreeStrings(1, pStrings[i]); 2156 } 2157 2158 #ifdef MEMSET_FREED 2159 memset(pStrings, 0, dataLen); 2160 #endif 2161 free(pStrings); 2162 2163 return true; 2164 } 2165 2166 struct ImsCdmaSms { 2167 RIL_IMS_SMS_Message imsSms; 2168 RIL_CDMA_SMS_Message cdmaSms; 2169 }; 2170 2171 bool dispatchImsCdmaSms(const ImsSmsMessage& message, RequestInfo *pRI) { 2172 ImsCdmaSms temp = {}; 2173 2174 if (message.cdmaMessage.size() != 1) { 2175 RLOGE("dispatchImsCdmaSms: Invalid len %s", requestToString(pRI->pCI->requestNumber)); 2176 sendErrorResponse(pRI, RIL_E_INVALID_ARGUMENTS); 2177 return false; 2178 } 2179 2180 temp.imsSms.tech = RADIO_TECH_3GPP2; 2181 temp.imsSms.retry = BOOL_TO_INT(message.retry); 2182 temp.imsSms.messageRef = message.messageRef; 2183 temp.imsSms.message.cdmaMessage = &temp.cdmaSms; 2184 2185 constructCdmaSms(temp.cdmaSms, message.cdmaMessage[0]); 2186 2187 // Vendor code expects payload length to include actual msg payload 2188 // (sizeof(RIL_CDMA_SMS_Message)) instead of (RIL_CDMA_SMS_Message *) + size of other fields in 2189 // RIL_IMS_SMS_Message 2190 int payloadLen = sizeof(RIL_RadioTechnologyFamily) + sizeof(uint8_t) + sizeof(int32_t) 2191 + sizeof(RIL_CDMA_SMS_Message); 2192 2193 CALL_ONREQUEST(pRI->pCI->requestNumber, &temp.imsSms, payloadLen, pRI, pRI->socket_id); 2194 2195 return true; 2196 } 2197 2198 Return<void> RadioImpl::sendImsSms(int32_t serial, const ImsSmsMessage& message) { 2199 #if VDBG 2200 RLOGD("sendImsSms: serial %d", serial); 2201 #endif 2202 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_IMS_SEND_SMS); 2203 if (pRI == NULL) { 2204 return Void(); 2205 } 2206 2207 RIL_RadioTechnologyFamily format = (RIL_RadioTechnologyFamily) message.tech; 2208 2209 if (RADIO_TECH_3GPP == format) { 2210 dispatchImsGsmSms(message, pRI); 2211 } else if (RADIO_TECH_3GPP2 == format) { 2212 dispatchImsCdmaSms(message, pRI); 2213 } else { 2214 RLOGE("sendImsSms: Invalid radio tech %s", 2215 requestToString(pRI->pCI->requestNumber)); 2216 sendErrorResponse(pRI, RIL_E_INVALID_ARGUMENTS); 2217 } 2218 return Void(); 2219 } 2220 2221 Return<void> RadioImpl::iccTransmitApduBasicChannel(int32_t serial, const SimApdu& message) { 2222 #if VDBG 2223 RLOGD("iccTransmitApduBasicChannel: serial %d", serial); 2224 #endif 2225 dispatchIccApdu(serial, mSlotId, RIL_REQUEST_SIM_TRANSMIT_APDU_BASIC, message); 2226 return Void(); 2227 } 2228 2229 Return<void> RadioImpl::iccOpenLogicalChannel(int32_t serial, const hidl_string& aid, int32_t p2) { 2230 #if VDBG 2231 RLOGD("iccOpenLogicalChannel: serial %d", serial); 2232 #endif 2233 if (s_vendorFunctions->version < 15) { 2234 dispatchString(serial, mSlotId, RIL_REQUEST_SIM_OPEN_CHANNEL, aid.c_str()); 2235 } else { 2236 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_SIM_OPEN_CHANNEL); 2237 if (pRI == NULL) { 2238 return Void(); 2239 } 2240 2241 RIL_OpenChannelParams params = {}; 2242 2243 params.p2 = p2; 2244 2245 if (!copyHidlStringToRil(¶ms.aidPtr, aid, pRI)) { 2246 return Void(); 2247 } 2248 2249 CALL_ONREQUEST(pRI->pCI->requestNumber, ¶ms, sizeof(params), pRI, mSlotId); 2250 2251 memsetAndFreeStrings(1, params.aidPtr); 2252 } 2253 return Void(); 2254 } 2255 2256 Return<void> RadioImpl::iccCloseLogicalChannel(int32_t serial, int32_t channelId) { 2257 #if VDBG 2258 RLOGD("iccCloseLogicalChannel: serial %d", serial); 2259 #endif 2260 dispatchInts(serial, mSlotId, RIL_REQUEST_SIM_CLOSE_CHANNEL, 1, channelId); 2261 return Void(); 2262 } 2263 2264 Return<void> RadioImpl::iccTransmitApduLogicalChannel(int32_t serial, const SimApdu& message) { 2265 #if VDBG 2266 RLOGD("iccTransmitApduLogicalChannel: serial %d", serial); 2267 #endif 2268 dispatchIccApdu(serial, mSlotId, RIL_REQUEST_SIM_TRANSMIT_APDU_CHANNEL, message); 2269 return Void(); 2270 } 2271 2272 Return<void> RadioImpl::nvReadItem(int32_t serial, NvItem itemId) { 2273 #if VDBG 2274 RLOGD("nvReadItem: serial %d", serial); 2275 #endif 2276 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_NV_READ_ITEM); 2277 if (pRI == NULL) { 2278 return Void(); 2279 } 2280 2281 RIL_NV_ReadItem nvri = {}; 2282 nvri.itemID = (RIL_NV_Item) itemId; 2283 2284 CALL_ONREQUEST(pRI->pCI->requestNumber, &nvri, sizeof(nvri), pRI, mSlotId); 2285 return Void(); 2286 } 2287 2288 Return<void> RadioImpl::nvWriteItem(int32_t serial, const NvWriteItem& item) { 2289 #if VDBG 2290 RLOGD("nvWriteItem: serial %d", serial); 2291 #endif 2292 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_NV_WRITE_ITEM); 2293 if (pRI == NULL) { 2294 return Void(); 2295 } 2296 2297 RIL_NV_WriteItem nvwi = {}; 2298 2299 nvwi.itemID = (RIL_NV_Item) item.itemId; 2300 2301 if (!copyHidlStringToRil(&nvwi.value, item.value, pRI)) { 2302 return Void(); 2303 } 2304 2305 CALL_ONREQUEST(pRI->pCI->requestNumber, &nvwi, sizeof(nvwi), pRI, mSlotId); 2306 2307 memsetAndFreeStrings(1, nvwi.value); 2308 return Void(); 2309 } 2310 2311 Return<void> RadioImpl::nvWriteCdmaPrl(int32_t serial, const hidl_vec<uint8_t>& prl) { 2312 #if VDBG 2313 RLOGD("nvWriteCdmaPrl: serial %d", serial); 2314 #endif 2315 dispatchRaw(serial, mSlotId, RIL_REQUEST_NV_WRITE_CDMA_PRL, prl); 2316 return Void(); 2317 } 2318 2319 Return<void> RadioImpl::nvResetConfig(int32_t serial, ResetNvType resetType) { 2320 int rilResetType = -1; 2321 #if VDBG 2322 RLOGD("nvResetConfig: serial %d", serial); 2323 #endif 2324 /* Convert ResetNvType to RIL.h values 2325 * RIL_REQUEST_NV_RESET_CONFIG 2326 * 1 - reload all NV items 2327 * 2 - erase NV reset (SCRTN) 2328 * 3 - factory reset (RTN) 2329 */ 2330 switch(resetType) { 2331 case ResetNvType::RELOAD: 2332 rilResetType = 1; 2333 break; 2334 case ResetNvType::ERASE: 2335 rilResetType = 2; 2336 break; 2337 case ResetNvType::FACTORY_RESET: 2338 rilResetType = 3; 2339 break; 2340 } 2341 dispatchInts(serial, mSlotId, RIL_REQUEST_NV_RESET_CONFIG, 1, rilResetType); 2342 return Void(); 2343 } 2344 2345 Return<void> RadioImpl::setUiccSubscription(int32_t serial, const SelectUiccSub& uiccSub) { 2346 #if VDBG 2347 RLOGD("setUiccSubscription: serial %d", serial); 2348 #endif 2349 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, 2350 RIL_REQUEST_SET_UICC_SUBSCRIPTION); 2351 if (pRI == NULL) { 2352 return Void(); 2353 } 2354 2355 RIL_SelectUiccSub rilUiccSub = {}; 2356 2357 rilUiccSub.slot = uiccSub.slot; 2358 rilUiccSub.app_index = uiccSub.appIndex; 2359 rilUiccSub.sub_type = (RIL_SubscriptionType) uiccSub.subType; 2360 rilUiccSub.act_status = (RIL_UiccSubActStatus) uiccSub.actStatus; 2361 2362 CALL_ONREQUEST(pRI->pCI->requestNumber, &rilUiccSub, sizeof(rilUiccSub), pRI, mSlotId); 2363 return Void(); 2364 } 2365 2366 Return<void> RadioImpl::setDataAllowed(int32_t serial, bool allow) { 2367 #if VDBG 2368 RLOGD("setDataAllowed: serial %d", serial); 2369 #endif 2370 dispatchInts(serial, mSlotId, RIL_REQUEST_ALLOW_DATA, 1, BOOL_TO_INT(allow)); 2371 return Void(); 2372 } 2373 2374 Return<void> RadioImpl::getHardwareConfig(int32_t serial) { 2375 #if VDBG 2376 RLOGD("getHardwareConfig: serial %d", serial); 2377 #endif 2378 dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_HARDWARE_CONFIG); 2379 return Void(); 2380 } 2381 2382 Return<void> RadioImpl::requestIccSimAuthentication(int32_t serial, int32_t authContext, 2383 const hidl_string& authData, const hidl_string& aid) { 2384 #if VDBG 2385 RLOGD("requestIccSimAuthentication: serial %d", serial); 2386 #endif 2387 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_SIM_AUTHENTICATION); 2388 if (pRI == NULL) { 2389 return Void(); 2390 } 2391 2392 RIL_SimAuthentication pf = {}; 2393 2394 pf.authContext = authContext; 2395 2396 if (!copyHidlStringToRil(&pf.authData, authData, pRI)) { 2397 return Void(); 2398 } 2399 2400 if (!copyHidlStringToRil(&pf.aid, aid, pRI)) { 2401 memsetAndFreeStrings(1, pf.authData); 2402 return Void(); 2403 } 2404 2405 CALL_ONREQUEST(pRI->pCI->requestNumber, &pf, sizeof(pf), pRI, mSlotId); 2406 2407 memsetAndFreeStrings(2, pf.authData, pf.aid); 2408 return Void(); 2409 } 2410 2411 /** 2412 * @param numProfiles number of data profile 2413 * @param dataProfiles the pointer to the actual data profiles. The acceptable type is 2414 RIL_DataProfileInfo or RIL_DataProfileInfo_v15. 2415 * @param dataProfilePtrs the pointer to the pointers that point to each data profile structure 2416 * @param numfields number of string-type member in the data profile structure 2417 * @param ... the variadic parameters are pointers to each string-type member 2418 **/ 2419 template <typename T> 2420 void freeSetDataProfileData(int numProfiles, T *dataProfiles, T **dataProfilePtrs, 2421 int numfields, ...) { 2422 va_list args; 2423 va_start(args, numfields); 2424 2425 // Iterate through each string-type field that need to be free. 2426 for (int i = 0; i < numfields; i++) { 2427 // Iterate through each data profile and free that specific string-type field. 2428 // The type 'char *T::*' is a type of pointer to a 'char *' member inside T structure. 2429 char *T::*ptr = va_arg(args, char *T::*); 2430 for (int j = 0; j < numProfiles; j++) { 2431 memsetAndFreeStrings(1, dataProfiles[j].*ptr); 2432 } 2433 } 2434 2435 va_end(args); 2436 2437 #ifdef MEMSET_FREED 2438 memset(dataProfiles, 0, numProfiles * sizeof(T)); 2439 memset(dataProfilePtrs, 0, numProfiles * sizeof(T *)); 2440 #endif 2441 free(dataProfiles); 2442 free(dataProfilePtrs); 2443 } 2444 2445 Return<void> RadioImpl::setDataProfile(int32_t serial, const hidl_vec<DataProfileInfo>& profiles, 2446 bool isRoaming) { 2447 #if VDBG 2448 RLOGD("setDataProfile: serial %d", serial); 2449 #endif 2450 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_SET_DATA_PROFILE); 2451 if (pRI == NULL) { 2452 return Void(); 2453 } 2454 2455 size_t num = profiles.size(); 2456 bool success = false; 2457 2458 if (s_vendorFunctions->version <= 14) { 2459 2460 RIL_DataProfileInfo *dataProfiles = 2461 (RIL_DataProfileInfo *) calloc(num, sizeof(RIL_DataProfileInfo)); 2462 2463 if (dataProfiles == NULL) { 2464 RLOGE("Memory allocation failed for request %s", 2465 requestToString(pRI->pCI->requestNumber)); 2466 sendErrorResponse(pRI, RIL_E_NO_MEMORY); 2467 return Void(); 2468 } 2469 2470 RIL_DataProfileInfo **dataProfilePtrs = 2471 (RIL_DataProfileInfo **) calloc(num, sizeof(RIL_DataProfileInfo *)); 2472 if (dataProfilePtrs == NULL) { 2473 RLOGE("Memory allocation failed for request %s", 2474 requestToString(pRI->pCI->requestNumber)); 2475 free(dataProfiles); 2476 sendErrorResponse(pRI, RIL_E_NO_MEMORY); 2477 return Void(); 2478 } 2479 2480 for (size_t i = 0; i < num; i++) { 2481 dataProfilePtrs[i] = &dataProfiles[i]; 2482 2483 success = copyHidlStringToRil(&dataProfiles[i].apn, profiles[i].apn, pRI); 2484 2485 const hidl_string &protocol = 2486 (isRoaming ? profiles[i].roamingProtocol : profiles[i].protocol); 2487 2488 if (success && !copyHidlStringToRil(&dataProfiles[i].protocol, protocol, pRI)) { 2489 success = false; 2490 } 2491 2492 if (success && !copyHidlStringToRil(&dataProfiles[i].user, profiles[i].user, pRI)) { 2493 success = false; 2494 } 2495 if (success && !copyHidlStringToRil(&dataProfiles[i].password, profiles[i].password, 2496 pRI)) { 2497 success = false; 2498 } 2499 2500 if (!success) { 2501 freeSetDataProfileData(num, dataProfiles, dataProfilePtrs, 4, 2502 &RIL_DataProfileInfo::apn, &RIL_DataProfileInfo::protocol, 2503 &RIL_DataProfileInfo::user, &RIL_DataProfileInfo::password); 2504 return Void(); 2505 } 2506 2507 dataProfiles[i].profileId = (RIL_DataProfile) profiles[i].profileId; 2508 dataProfiles[i].authType = (int) profiles[i].authType; 2509 dataProfiles[i].type = (int) profiles[i].type; 2510 dataProfiles[i].maxConnsTime = profiles[i].maxConnsTime; 2511 dataProfiles[i].maxConns = profiles[i].maxConns; 2512 dataProfiles[i].waitTime = profiles[i].waitTime; 2513 dataProfiles[i].enabled = BOOL_TO_INT(profiles[i].enabled); 2514 } 2515 2516 CALL_ONREQUEST(RIL_REQUEST_SET_DATA_PROFILE, dataProfilePtrs, 2517 num * sizeof(RIL_DataProfileInfo *), pRI, mSlotId); 2518 2519 freeSetDataProfileData(num, dataProfiles, dataProfilePtrs, 4, 2520 &RIL_DataProfileInfo::apn, &RIL_DataProfileInfo::protocol, 2521 &RIL_DataProfileInfo::user, &RIL_DataProfileInfo::password); 2522 } else { 2523 RIL_DataProfileInfo_v15 *dataProfiles = 2524 (RIL_DataProfileInfo_v15 *) calloc(num, sizeof(RIL_DataProfileInfo_v15)); 2525 2526 if (dataProfiles == NULL) { 2527 RLOGE("Memory allocation failed for request %s", 2528 requestToString(pRI->pCI->requestNumber)); 2529 sendErrorResponse(pRI, RIL_E_NO_MEMORY); 2530 return Void(); 2531 } 2532 2533 RIL_DataProfileInfo_v15 **dataProfilePtrs = 2534 (RIL_DataProfileInfo_v15 **) calloc(num, sizeof(RIL_DataProfileInfo_v15 *)); 2535 if (dataProfilePtrs == NULL) { 2536 RLOGE("Memory allocation failed for request %s", 2537 requestToString(pRI->pCI->requestNumber)); 2538 free(dataProfiles); 2539 sendErrorResponse(pRI, RIL_E_NO_MEMORY); 2540 return Void(); 2541 } 2542 2543 for (size_t i = 0; i < num; i++) { 2544 dataProfilePtrs[i] = &dataProfiles[i]; 2545 2546 success = copyHidlStringToRil(&dataProfiles[i].apn, profiles[i].apn, pRI); 2547 if (success && !copyHidlStringToRil(&dataProfiles[i].protocol, profiles[i].protocol, 2548 pRI)) { 2549 success = false; 2550 } 2551 if (success && !copyHidlStringToRil(&dataProfiles[i].roamingProtocol, 2552 profiles[i].roamingProtocol, pRI)) { 2553 success = false; 2554 } 2555 if (success && !copyHidlStringToRil(&dataProfiles[i].user, profiles[i].user, pRI)) { 2556 success = false; 2557 } 2558 if (success && !copyHidlStringToRil(&dataProfiles[i].password, profiles[i].password, 2559 pRI)) { 2560 success = false; 2561 } 2562 if (success && !copyHidlStringToRil(&dataProfiles[i].mvnoMatchData, 2563 profiles[i].mvnoMatchData, pRI)) { 2564 success = false; 2565 } 2566 2567 if (success && !convertMvnoTypeToString(profiles[i].mvnoType, 2568 dataProfiles[i].mvnoType)) { 2569 sendErrorResponse(pRI, RIL_E_INVALID_ARGUMENTS); 2570 success = false; 2571 } 2572 2573 if (!success) { 2574 freeSetDataProfileData(num, dataProfiles, dataProfilePtrs, 6, 2575 &RIL_DataProfileInfo_v15::apn, &RIL_DataProfileInfo_v15::protocol, 2576 &RIL_DataProfileInfo_v15::roamingProtocol, &RIL_DataProfileInfo_v15::user, 2577 &RIL_DataProfileInfo_v15::password, &RIL_DataProfileInfo_v15::mvnoMatchData); 2578 return Void(); 2579 } 2580 2581 dataProfiles[i].profileId = (RIL_DataProfile) profiles[i].profileId; 2582 dataProfiles[i].authType = (int) profiles[i].authType; 2583 dataProfiles[i].type = (int) profiles[i].type; 2584 dataProfiles[i].maxConnsTime = profiles[i].maxConnsTime; 2585 dataProfiles[i].maxConns = profiles[i].maxConns; 2586 dataProfiles[i].waitTime = profiles[i].waitTime; 2587 dataProfiles[i].enabled = BOOL_TO_INT(profiles[i].enabled); 2588 dataProfiles[i].supportedTypesBitmask = profiles[i].supportedApnTypesBitmap; 2589 dataProfiles[i].bearerBitmask = profiles[i].bearerBitmap; 2590 dataProfiles[i].mtu = profiles[i].mtu; 2591 } 2592 2593 CALL_ONREQUEST(RIL_REQUEST_SET_DATA_PROFILE, dataProfilePtrs, 2594 num * sizeof(RIL_DataProfileInfo_v15 *), pRI, mSlotId); 2595 2596 freeSetDataProfileData(num, dataProfiles, dataProfilePtrs, 6, 2597 &RIL_DataProfileInfo_v15::apn, &RIL_DataProfileInfo_v15::protocol, 2598 &RIL_DataProfileInfo_v15::roamingProtocol, &RIL_DataProfileInfo_v15::user, 2599 &RIL_DataProfileInfo_v15::password, &RIL_DataProfileInfo_v15::mvnoMatchData); 2600 } 2601 2602 return Void(); 2603 } 2604 2605 Return<void> RadioImpl::requestShutdown(int32_t serial) { 2606 #if VDBG 2607 RLOGD("requestShutdown: serial %d", serial); 2608 #endif 2609 dispatchVoid(serial, mSlotId, RIL_REQUEST_SHUTDOWN); 2610 return Void(); 2611 } 2612 2613 Return<void> RadioImpl::getRadioCapability(int32_t serial) { 2614 #if VDBG 2615 RLOGD("getRadioCapability: serial %d", serial); 2616 #endif 2617 dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_RADIO_CAPABILITY); 2618 return Void(); 2619 } 2620 2621 Return<void> RadioImpl::setRadioCapability(int32_t serial, const RadioCapability& rc) { 2622 #if VDBG 2623 RLOGD("setRadioCapability: serial %d", serial); 2624 #endif 2625 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_SET_RADIO_CAPABILITY); 2626 if (pRI == NULL) { 2627 return Void(); 2628 } 2629 2630 RIL_RadioCapability rilRc = {}; 2631 2632 // TODO : set rilRc.version using HIDL version ? 2633 rilRc.session = rc.session; 2634 rilRc.phase = (int) rc.phase; 2635 rilRc.rat = (int) rc.raf; 2636 rilRc.status = (int) rc.status; 2637 strncpy(rilRc.logicalModemUuid, rc.logicalModemUuid.c_str(), MAX_UUID_LENGTH); 2638 2639 CALL_ONREQUEST(pRI->pCI->requestNumber, &rilRc, sizeof(rilRc), pRI, mSlotId); 2640 2641 return Void(); 2642 } 2643 2644 Return<void> RadioImpl::startLceService(int32_t serial, int32_t reportInterval, bool pullMode) { 2645 #if VDBG 2646 RLOGD("startLceService: serial %d", serial); 2647 #endif 2648 dispatchInts(serial, mSlotId, RIL_REQUEST_START_LCE, 2, reportInterval, 2649 BOOL_TO_INT(pullMode)); 2650 return Void(); 2651 } 2652 2653 Return<void> RadioImpl::stopLceService(int32_t serial) { 2654 #if VDBG 2655 RLOGD("stopLceService: serial %d", serial); 2656 #endif 2657 dispatchVoid(serial, mSlotId, RIL_REQUEST_STOP_LCE); 2658 return Void(); 2659 } 2660 2661 Return<void> RadioImpl::pullLceData(int32_t serial) { 2662 #if VDBG 2663 RLOGD("pullLceData: serial %d", serial); 2664 #endif 2665 dispatchVoid(serial, mSlotId, RIL_REQUEST_PULL_LCEDATA); 2666 return Void(); 2667 } 2668 2669 Return<void> RadioImpl::getModemActivityInfo(int32_t serial) { 2670 #if VDBG 2671 RLOGD("getModemActivityInfo: serial %d", serial); 2672 #endif 2673 dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_ACTIVITY_INFO); 2674 return Void(); 2675 } 2676 2677 Return<void> RadioImpl::setAllowedCarriers(int32_t serial, bool allAllowed, 2678 const CarrierRestrictions& carriers) { 2679 #if VDBG 2680 RLOGD("setAllowedCarriers: serial %d", serial); 2681 #endif 2682 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, 2683 RIL_REQUEST_SET_CARRIER_RESTRICTIONS); 2684 if (pRI == NULL) { 2685 return Void(); 2686 } 2687 2688 RIL_CarrierRestrictions cr = {}; 2689 RIL_Carrier *allowedCarriers = NULL; 2690 RIL_Carrier *excludedCarriers = NULL; 2691 2692 cr.len_allowed_carriers = carriers.allowedCarriers.size(); 2693 allowedCarriers = (RIL_Carrier *)calloc(cr.len_allowed_carriers, sizeof(RIL_Carrier)); 2694 if (allowedCarriers == NULL) { 2695 RLOGE("setAllowedCarriers: Memory allocation failed for request %s", 2696 requestToString(pRI->pCI->requestNumber)); 2697 sendErrorResponse(pRI, RIL_E_NO_MEMORY); 2698 return Void(); 2699 } 2700 cr.allowed_carriers = allowedCarriers; 2701 2702 cr.len_excluded_carriers = carriers.excludedCarriers.size(); 2703 excludedCarriers = (RIL_Carrier *)calloc(cr.len_excluded_carriers, sizeof(RIL_Carrier)); 2704 if (excludedCarriers == NULL) { 2705 RLOGE("setAllowedCarriers: Memory allocation failed for request %s", 2706 requestToString(pRI->pCI->requestNumber)); 2707 sendErrorResponse(pRI, RIL_E_NO_MEMORY); 2708 #ifdef MEMSET_FREED 2709 memset(allowedCarriers, 0, cr.len_allowed_carriers * sizeof(RIL_Carrier)); 2710 #endif 2711 free(allowedCarriers); 2712 return Void(); 2713 } 2714 cr.excluded_carriers = excludedCarriers; 2715 2716 for (int i = 0; i < cr.len_allowed_carriers; i++) { 2717 allowedCarriers[i].mcc = carriers.allowedCarriers[i].mcc.c_str(); 2718 allowedCarriers[i].mnc = carriers.allowedCarriers[i].mnc.c_str(); 2719 allowedCarriers[i].match_type = (RIL_CarrierMatchType) carriers.allowedCarriers[i].matchType; 2720 allowedCarriers[i].match_data = carriers.allowedCarriers[i].matchData.c_str(); 2721 } 2722 2723 for (int i = 0; i < cr.len_excluded_carriers; i++) { 2724 excludedCarriers[i].mcc = carriers.excludedCarriers[i].mcc.c_str(); 2725 excludedCarriers[i].mnc = carriers.excludedCarriers[i].mnc.c_str(); 2726 excludedCarriers[i].match_type = 2727 (RIL_CarrierMatchType) carriers.excludedCarriers[i].matchType; 2728 excludedCarriers[i].match_data = carriers.excludedCarriers[i].matchData.c_str(); 2729 } 2730 2731 CALL_ONREQUEST(pRI->pCI->requestNumber, &cr, sizeof(RIL_CarrierRestrictions), pRI, mSlotId); 2732 2733 #ifdef MEMSET_FREED 2734 memset(allowedCarriers, 0, cr.len_allowed_carriers * sizeof(RIL_Carrier)); 2735 memset(excludedCarriers, 0, cr.len_excluded_carriers * sizeof(RIL_Carrier)); 2736 #endif 2737 free(allowedCarriers); 2738 free(excludedCarriers); 2739 return Void(); 2740 } 2741 2742 Return<void> RadioImpl::getAllowedCarriers(int32_t serial) { 2743 #if VDBG 2744 RLOGD("getAllowedCarriers: serial %d", serial); 2745 #endif 2746 dispatchVoid(serial, mSlotId, RIL_REQUEST_GET_CARRIER_RESTRICTIONS); 2747 return Void(); 2748 } 2749 2750 Return<void> RadioImpl::sendDeviceState(int32_t serial, DeviceStateType deviceStateType, 2751 bool state) { 2752 #if VDBG 2753 RLOGD("sendDeviceState: serial %d", serial); 2754 #endif 2755 if (s_vendorFunctions->version < 15) { 2756 if (deviceStateType == DeviceStateType::LOW_DATA_EXPECTED) { 2757 RLOGD("sendDeviceState: calling screen state %d", BOOL_TO_INT(!state)); 2758 dispatchInts(serial, mSlotId, RIL_REQUEST_SCREEN_STATE, 1, BOOL_TO_INT(!state)); 2759 } else { 2760 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, 2761 RIL_REQUEST_SEND_DEVICE_STATE); 2762 sendErrorResponse(pRI, RIL_E_REQUEST_NOT_SUPPORTED); 2763 } 2764 return Void(); 2765 } 2766 dispatchInts(serial, mSlotId, RIL_REQUEST_SEND_DEVICE_STATE, 2, (int) deviceStateType, 2767 BOOL_TO_INT(state)); 2768 return Void(); 2769 } 2770 2771 Return<void> RadioImpl::setIndicationFilter(int32_t serial, int32_t indicationFilter) { 2772 #if VDBG 2773 RLOGD("setIndicationFilter: serial %d", serial); 2774 #endif 2775 if (s_vendorFunctions->version < 15) { 2776 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, 2777 RIL_REQUEST_SET_UNSOLICITED_RESPONSE_FILTER); 2778 sendErrorResponse(pRI, RIL_E_REQUEST_NOT_SUPPORTED); 2779 return Void(); 2780 } 2781 dispatchInts(serial, mSlotId, RIL_REQUEST_SET_UNSOLICITED_RESPONSE_FILTER, 1, indicationFilter); 2782 return Void(); 2783 } 2784 2785 Return<void> RadioImpl::setSimCardPower(int32_t serial, bool powerUp) { 2786 #if VDBG 2787 RLOGD("setSimCardPower: serial %d", serial); 2788 #endif 2789 dispatchInts(serial, mSlotId, RIL_REQUEST_SET_SIM_CARD_POWER, 1, BOOL_TO_INT(powerUp)); 2790 return Void(); 2791 } 2792 2793 Return<void> RadioImpl::setSimCardPower_1_1(int32_t serial, const V1_1::CardPowerState state) { 2794 #if VDBG 2795 RLOGD("setSimCardPower_1_1: serial %d state %d", serial, state); 2796 #endif 2797 dispatchInts(serial, mSlotId, RIL_REQUEST_SET_SIM_CARD_POWER, 1, state); 2798 return Void(); 2799 } 2800 2801 Return<void> RadioImpl::setCarrierInfoForImsiEncryption(int32_t serial, 2802 const V1_1::ImsiEncryptionInfo& data) { 2803 #if VDBG 2804 RLOGD("setCarrierInfoForImsiEncryption: serial %d", serial); 2805 #endif 2806 RequestInfo *pRI = android::addRequestToList( 2807 serial, mSlotId, RIL_REQUEST_SET_CARRIER_INFO_IMSI_ENCRYPTION); 2808 if (pRI == NULL) { 2809 return Void(); 2810 } 2811 2812 RIL_CarrierInfoForImsiEncryption imsiEncryption = {}; 2813 2814 if (!copyHidlStringToRil(&imsiEncryption.mnc, data.mnc, pRI)) { 2815 return Void(); 2816 } 2817 if (!copyHidlStringToRil(&imsiEncryption.mcc, data.mcc, pRI)) { 2818 memsetAndFreeStrings(1, imsiEncryption.mnc); 2819 return Void(); 2820 } 2821 if (!copyHidlStringToRil(&imsiEncryption.keyIdentifier, data.keyIdentifier, pRI)) { 2822 memsetAndFreeStrings(2, imsiEncryption.mnc, imsiEncryption.mcc); 2823 return Void(); 2824 } 2825 int32_t lSize = data.carrierKey.size(); 2826 imsiEncryption.carrierKey = new uint8_t[lSize]; 2827 memcpy(imsiEncryption.carrierKey, data.carrierKey.data(), lSize); 2828 imsiEncryption.expirationTime = data.expirationTime; 2829 CALL_ONREQUEST(pRI->pCI->requestNumber, &imsiEncryption, 2830 sizeof(RIL_CarrierInfoForImsiEncryption), pRI, mSlotId); 2831 delete(imsiEncryption.carrierKey); 2832 return Void(); 2833 } 2834 2835 Return<void> RadioImpl::startKeepalive(int32_t serial, const V1_1::KeepaliveRequest& keepalive) { 2836 #if VDBG 2837 RLOGD("%s(): %d", __FUNCTION__, serial); 2838 #endif 2839 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_START_KEEPALIVE); 2840 if (pRI == NULL) { 2841 return Void(); 2842 } 2843 2844 RIL_KeepaliveRequest kaReq = {}; 2845 2846 kaReq.type = static_cast<RIL_KeepaliveType>(keepalive.type); 2847 switch(kaReq.type) { 2848 case NATT_IPV4: 2849 if (keepalive.sourceAddress.size() != 4 || 2850 keepalive.destinationAddress.size() != 4) { 2851 RLOGE("Invalid address for keepalive!"); 2852 sendErrorResponse(pRI, RIL_E_INVALID_ARGUMENTS); 2853 return Void(); 2854 } 2855 break; 2856 case NATT_IPV6: 2857 if (keepalive.sourceAddress.size() != 16 || 2858 keepalive.destinationAddress.size() != 16) { 2859 RLOGE("Invalid address for keepalive!"); 2860 sendErrorResponse(pRI, RIL_E_INVALID_ARGUMENTS); 2861 return Void(); 2862 } 2863 break; 2864 default: 2865 RLOGE("Unknown packet keepalive type!"); 2866 sendErrorResponse(pRI, RIL_E_INVALID_ARGUMENTS); 2867 return Void(); 2868 } 2869 2870 ::memcpy(kaReq.sourceAddress, keepalive.sourceAddress.data(), keepalive.sourceAddress.size()); 2871 kaReq.sourcePort = keepalive.sourcePort; 2872 2873 ::memcpy(kaReq.destinationAddress, 2874 keepalive.destinationAddress.data(), keepalive.destinationAddress.size()); 2875 kaReq.destinationPort = keepalive.destinationPort; 2876 2877 kaReq.maxKeepaliveIntervalMillis = keepalive.maxKeepaliveIntervalMillis; 2878 kaReq.cid = keepalive.cid; // This is the context ID of the data call 2879 2880 CALL_ONREQUEST(pRI->pCI->requestNumber, &kaReq, sizeof(RIL_KeepaliveRequest), pRI, mSlotId); 2881 return Void(); 2882 } 2883 2884 Return<void> RadioImpl::stopKeepalive(int32_t serial, int32_t sessionHandle) { 2885 #if VDBG 2886 RLOGD("%s(): %d", __FUNCTION__, serial); 2887 #endif 2888 RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_STOP_KEEPALIVE); 2889 if (pRI == NULL) { 2890 return Void(); 2891 } 2892 2893 CALL_ONREQUEST(pRI->pCI->requestNumber, &sessionHandle, sizeof(uint32_t), pRI, mSlotId); 2894 return Void(); 2895 } 2896 2897 Return<void> RadioImpl::responseAcknowledgement() { 2898 android::releaseWakeLock(); 2899 return Void(); 2900 } 2901 2902 Return<void> OemHookImpl::setResponseFunctions( 2903 const ::android::sp<IOemHookResponse>& oemHookResponseParam, 2904 const ::android::sp<IOemHookIndication>& oemHookIndicationParam) { 2905 #if VDBG 2906 RLOGD("OemHookImpl::setResponseFunctions"); 2907 #endif 2908 2909 pthread_rwlock_t *radioServiceRwlockPtr = radio::getRadioServiceRwlock(mSlotId); 2910 int ret = pthread_rwlock_wrlock(radioServiceRwlockPtr); 2911 assert(ret == 0); 2912 2913 mOemHookResponse = oemHookResponseParam; 2914 mOemHookIndication = oemHookIndicationParam; 2915 mCounterOemHook[mSlotId]++; 2916 2917 ret = pthread_rwlock_unlock(radioServiceRwlockPtr); 2918 assert(ret == 0); 2919 2920 return Void(); 2921 } 2922 2923 Return<void> OemHookImpl::sendRequestRaw(int32_t serial, const hidl_vec<uint8_t>& data) { 2924 #if VDBG 2925 RLOGD("OemHookImpl::sendRequestRaw: serial %d", serial); 2926 #endif 2927 dispatchRaw(serial, mSlotId, RIL_REQUEST_OEM_HOOK_RAW, data); 2928 return Void(); 2929 } 2930 2931 Return<void> OemHookImpl::sendRequestStrings(int32_t serial, 2932 const hidl_vec<hidl_string>& data) { 2933 #if VDBG 2934 RLOGD("OemHookImpl::sendRequestStrings: serial %d", serial); 2935 #endif 2936 dispatchStrings(serial, mSlotId, RIL_REQUEST_OEM_HOOK_STRINGS, data); 2937 return Void(); 2938 } 2939 2940 /*************************************************************************************************** 2941 * RESPONSE FUNCTIONS 2942 * Functions above are used for requests going from framework to vendor code. The ones below are 2943 * responses for those requests coming back from the vendor code. 2944 **************************************************************************************************/ 2945 2946 void radio::acknowledgeRequest(int slotId, int serial) { 2947 if (radioService[slotId]->mRadioResponse != NULL) { 2948 Return<void> retStatus = radioService[slotId]->mRadioResponse->acknowledgeRequest(serial); 2949 radioService[slotId]->checkReturnStatus(retStatus); 2950 } else { 2951 RLOGE("acknowledgeRequest: radioService[%d]->mRadioResponse == NULL", slotId); 2952 } 2953 } 2954 2955 void populateResponseInfo(RadioResponseInfo& responseInfo, int serial, int responseType, 2956 RIL_Errno e) { 2957 responseInfo.serial = serial; 2958 switch (responseType) { 2959 case RESPONSE_SOLICITED: 2960 responseInfo.type = RadioResponseType::SOLICITED; 2961 break; 2962 case RESPONSE_SOLICITED_ACK_EXP: 2963 responseInfo.type = RadioResponseType::SOLICITED_ACK_EXP; 2964 break; 2965 } 2966 responseInfo.error = (RadioError) e; 2967 } 2968 2969 int responseIntOrEmpty(RadioResponseInfo& responseInfo, int serial, int responseType, RIL_Errno e, 2970 void *response, size_t responseLen) { 2971 populateResponseInfo(responseInfo, serial, responseType, e); 2972 int ret = -1; 2973 2974 if (response == NULL && responseLen == 0) { 2975 // Earlier RILs did not send a response for some cases although the interface 2976 // expected an integer as response. Do not return error if response is empty. Instead 2977 // Return -1 in those cases to maintain backward compatibility. 2978 } else if (response == NULL || responseLen != sizeof(int)) { 2979 RLOGE("responseIntOrEmpty: Invalid response"); 2980 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE; 2981 } else { 2982 int *p_int = (int *) response; 2983 ret = p_int[0]; 2984 } 2985 return ret; 2986 } 2987 2988 int responseInt(RadioResponseInfo& responseInfo, int serial, int responseType, RIL_Errno e, 2989 void *response, size_t responseLen) { 2990 populateResponseInfo(responseInfo, serial, responseType, e); 2991 int ret = -1; 2992 2993 if (response == NULL || responseLen != sizeof(int)) { 2994 RLOGE("responseInt: Invalid response"); 2995 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE; 2996 } else { 2997 int *p_int = (int *) response; 2998 ret = p_int[0]; 2999 } 3000 return ret; 3001 } 3002 3003 int radio::getIccCardStatusResponse(int slotId, 3004 int responseType, int serial, RIL_Errno e, 3005 void *response, size_t responseLen) { 3006 if (radioService[slotId]->mRadioResponse != NULL) { 3007 RadioResponseInfo responseInfo = {}; 3008 populateResponseInfo(responseInfo, serial, responseType, e); 3009 CardStatus cardStatus = {}; 3010 RIL_CardStatus_v6 *p_cur = ((RIL_CardStatus_v6 *) response); 3011 if (response == NULL || responseLen != sizeof(RIL_CardStatus_v6) 3012 || p_cur->gsm_umts_subscription_app_index >= p_cur->num_applications 3013 || p_cur->cdma_subscription_app_index >= p_cur->num_applications 3014 || p_cur->ims_subscription_app_index >= p_cur->num_applications) { 3015 RLOGE("getIccCardStatusResponse: Invalid response"); 3016 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE; 3017 } else { 3018 cardStatus.cardState = (CardState) p_cur->card_state; 3019 cardStatus.universalPinState = (PinState) p_cur->universal_pin_state; 3020 cardStatus.gsmUmtsSubscriptionAppIndex = p_cur->gsm_umts_subscription_app_index; 3021 cardStatus.cdmaSubscriptionAppIndex = p_cur->cdma_subscription_app_index; 3022 cardStatus.imsSubscriptionAppIndex = p_cur->ims_subscription_app_index; 3023 3024 RIL_AppStatus *rilAppStatus = p_cur->applications; 3025 cardStatus.applications.resize(p_cur->num_applications); 3026 AppStatus *appStatus = cardStatus.applications.data(); 3027 #if VDBG 3028 RLOGD("getIccCardStatusResponse: num_applications %d", p_cur->num_applications); 3029 #endif 3030 for (int i = 0; i < p_cur->num_applications; i++) { 3031 appStatus[i].appType = (AppType) rilAppStatus[i].app_type; 3032 appStatus[i].appState = (AppState) rilAppStatus[i].app_state; 3033 appStatus[i].persoSubstate = (PersoSubstate) rilAppStatus[i].perso_substate; 3034 appStatus[i].aidPtr = convertCharPtrToHidlString(rilAppStatus[i].aid_ptr); 3035 appStatus[i].appLabelPtr = convertCharPtrToHidlString( 3036 rilAppStatus[i].app_label_ptr); 3037 appStatus[i].pin1Replaced = rilAppStatus[i].pin1_replaced; 3038 appStatus[i].pin1 = (PinState) rilAppStatus[i].pin1; 3039 appStatus[i].pin2 = (PinState) rilAppStatus[i].pin2; 3040 } 3041 } 3042 3043 Return<void> retStatus = radioService[slotId]->mRadioResponse-> 3044 getIccCardStatusResponse(responseInfo, cardStatus); 3045 radioService[slotId]->checkReturnStatus(retStatus); 3046 } else { 3047 RLOGE("getIccCardStatusResponse: radioService[%d]->mRadioResponse == NULL", slotId); 3048 } 3049 3050 return 0; 3051 } 3052 3053 int radio::supplyIccPinForAppResponse(int slotId, 3054 int responseType, int serial, RIL_Errno e, 3055 void *response, size_t responseLen) { 3056 #if VDBG 3057 RLOGD("supplyIccPinForAppResponse: serial %d", serial); 3058 #endif 3059 3060 if (radioService[slotId]->mRadioResponse != NULL) { 3061 RadioResponseInfo responseInfo = {}; 3062 int ret = responseIntOrEmpty(responseInfo, serial, responseType, e, response, responseLen); 3063 Return<void> retStatus = radioService[slotId]->mRadioResponse-> 3064 supplyIccPinForAppResponse(responseInfo, ret); 3065 RLOGE("supplyIccPinForAppResponse: amit ret %d", ret); 3066 radioService[slotId]->checkReturnStatus(retStatus); 3067 } else { 3068 RLOGE("supplyIccPinForAppResponse: radioService[%d]->mRadioResponse == NULL", 3069 slotId); 3070 } 3071 3072 return 0; 3073 } 3074 3075 int radio::supplyIccPukForAppResponse(int slotId, 3076 int responseType, int serial, RIL_Errno e, 3077 void *response, size_t responseLen) { 3078 #if VDBG 3079 RLOGD("supplyIccPukForAppResponse: serial %d", serial); 3080 #endif 3081 3082 if (radioService[slotId]->mRadioResponse != NULL) { 3083 RadioResponseInfo responseInfo = {}; 3084 int ret = responseIntOrEmpty(responseInfo, serial, responseType, e, response, responseLen); 3085 Return<void> retStatus = radioService[slotId]->mRadioResponse->supplyIccPukForAppResponse( 3086 responseInfo, ret); 3087 radioService[slotId]->checkReturnStatus(retStatus); 3088 } else { 3089 RLOGE("supplyIccPukForAppResponse: radioService[%d]->mRadioResponse == NULL", 3090 slotId); 3091 } 3092 3093 return 0; 3094 } 3095 3096 int radio::supplyIccPin2ForAppResponse(int slotId, 3097 int responseType, int serial, RIL_Errno e, 3098 void *response, size_t responseLen) { 3099 #if VDBG 3100 RLOGD("supplyIccPin2ForAppResponse: serial %d", serial); 3101 #endif 3102 3103 if (radioService[slotId]->mRadioResponse != NULL) { 3104 RadioResponseInfo responseInfo = {}; 3105 int ret = responseIntOrEmpty(responseInfo, serial, responseType, e, response, responseLen); 3106 Return<void> retStatus = radioService[slotId]->mRadioResponse-> 3107 supplyIccPin2ForAppResponse(responseInfo, ret); 3108 radioService[slotId]->checkReturnStatus(retStatus); 3109 } else { 3110 RLOGE("supplyIccPin2ForAppResponse: radioService[%d]->mRadioResponse == NULL", 3111 slotId); 3112 } 3113 3114 return 0; 3115 } 3116 3117 int radio::supplyIccPuk2ForAppResponse(int slotId, 3118 int responseType, int serial, RIL_Errno e, 3119 void *response, size_t responseLen) { 3120 #if VDBG 3121 RLOGD("supplyIccPuk2ForAppResponse: serial %d", serial); 3122 #endif 3123 3124 if (radioService[slotId]->mRadioResponse != NULL) { 3125 RadioResponseInfo responseInfo = {}; 3126 int ret = responseIntOrEmpty(responseInfo, serial, responseType, e, response, responseLen); 3127 Return<void> retStatus = radioService[slotId]->mRadioResponse-> 3128 supplyIccPuk2ForAppResponse(responseInfo, ret); 3129 radioService[slotId]->checkReturnStatus(retStatus); 3130 } else { 3131 RLOGE("supplyIccPuk2ForAppResponse: radioService[%d]->mRadioResponse == NULL", 3132 slotId); 3133 } 3134 3135 return 0; 3136 } 3137 3138 int radio::changeIccPinForAppResponse(int slotId, 3139 int responseType, int serial, RIL_Errno e, 3140 void *response, size_t responseLen) { 3141 #if VDBG 3142 RLOGD("changeIccPinForAppResponse: serial %d", serial); 3143 #endif 3144 3145 if (radioService[slotId]->mRadioResponse != NULL) { 3146 RadioResponseInfo responseInfo = {}; 3147 int ret = responseIntOrEmpty(responseInfo, serial, responseType, e, response, responseLen); 3148 Return<void> retStatus = radioService[slotId]->mRadioResponse-> 3149 changeIccPinForAppResponse(responseInfo, ret); 3150 radioService[slotId]->checkReturnStatus(retStatus); 3151 } else { 3152 RLOGE("changeIccPinForAppResponse: radioService[%d]->mRadioResponse == NULL", 3153 slotId); 3154 } 3155 3156 return 0; 3157 } 3158 3159 int radio::changeIccPin2ForAppResponse(int slotId, 3160 int responseType, int serial, RIL_Errno e, 3161 void *response, size_t responseLen) { 3162 #if VDBG 3163 RLOGD("changeIccPin2ForAppResponse: serial %d", serial); 3164 #endif 3165 3166 if (radioService[slotId]->mRadioResponse != NULL) { 3167 RadioResponseInfo responseInfo = {}; 3168 int ret = responseIntOrEmpty(responseInfo, serial, responseType, e, response, responseLen); 3169 Return<void> retStatus = radioService[slotId]->mRadioResponse-> 3170 changeIccPin2ForAppResponse(responseInfo, ret); 3171 radioService[slotId]->checkReturnStatus(retStatus); 3172 } else { 3173 RLOGE("changeIccPin2ForAppResponse: radioService[%d]->mRadioResponse == NULL", 3174 slotId); 3175 } 3176 3177 return 0; 3178 } 3179 3180 int radio::supplyNetworkDepersonalizationResponse(int slotId, 3181 int responseType, int serial, RIL_Errno e, 3182 void *response, size_t responseLen) { 3183 #if VDBG 3184 RLOGD("supplyNetworkDepersonalizationResponse: serial %d", serial); 3185 #endif 3186 3187 if (radioService[slotId]->mRadioResponse != NULL) { 3188 RadioResponseInfo responseInfo = {}; 3189 int ret = responseIntOrEmpty(responseInfo, serial, responseType, e, response, responseLen); 3190 Return<void> retStatus = radioService[slotId]->mRadioResponse-> 3191 supplyNetworkDepersonalizationResponse(responseInfo, ret); 3192 radioService[slotId]->checkReturnStatus(retStatus); 3193 } else { 3194 RLOGE("supplyNetworkDepersonalizationResponse: radioService[%d]->mRadioResponse == " 3195 "NULL", slotId); 3196 } 3197 3198 return 0; 3199 } 3200 3201 int radio::getCurrentCallsResponse(int slotId, 3202 int responseType, int serial, RIL_Errno e, 3203 void *response, size_t responseLen) { 3204 #if VDBG 3205 RLOGD("getCurrentCallsResponse: serial %d", serial); 3206 #endif 3207 3208 if (radioService[slotId]->mRadioResponse != NULL) { 3209 RadioResponseInfo responseInfo = {}; 3210 populateResponseInfo(responseInfo, serial, responseType, e); 3211 3212 hidl_vec<Call> calls; 3213 if ((response == NULL && responseLen != 0) 3214 || (responseLen % sizeof(RIL_Call *)) != 0) { 3215 RLOGE("getCurrentCallsResponse: Invalid response"); 3216 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE; 3217 } else { 3218 int num = responseLen / sizeof(RIL_Call *); 3219 calls.resize(num); 3220 3221 for (int i = 0 ; i < num ; i++) { 3222 RIL_Call *p_cur = ((RIL_Call **) response)[i]; 3223 /* each call info */ 3224 calls[i].state = (CallState) p_cur->state; 3225 calls[i].index = p_cur->index; 3226 calls[i].toa = p_cur->toa; 3227 calls[i].isMpty = p_cur->isMpty; 3228 calls[i].isMT = p_cur->isMT; 3229 calls[i].als = p_cur->als; 3230 calls[i].isVoice = p_cur->isVoice; 3231 calls[i].isVoicePrivacy = p_cur->isVoicePrivacy; 3232 calls[i].number = convertCharPtrToHidlString(p_cur->number); 3233 calls[i].numberPresentation = (CallPresentation) p_cur->numberPresentation; 3234 calls[i].name = convertCharPtrToHidlString(p_cur->name); 3235 calls[i].namePresentation = (CallPresentation) p_cur->namePresentation; 3236 if (p_cur->uusInfo != NULL && p_cur->uusInfo->uusData != NULL) { 3237 RIL_UUS_Info *uusInfo = p_cur->uusInfo; 3238 calls[i].uusInfo[0].uusType = (UusType) uusInfo->uusType; 3239 calls[i].uusInfo[0].uusDcs = (UusDcs) uusInfo->uusDcs; 3240 // convert uusInfo->uusData to a null-terminated string 3241 char *nullTermStr = strndup(uusInfo->uusData, uusInfo->uusLength); 3242 calls[i].uusInfo[0].uusData = nullTermStr; 3243 free(nullTermStr); 3244 } 3245 } 3246 } 3247 3248 Return<void> retStatus = radioService[slotId]->mRadioResponse-> 3249 getCurrentCallsResponse(responseInfo, calls); 3250 radioService[slotId]->checkReturnStatus(retStatus); 3251 } else { 3252 RLOGE("getCurrentCallsResponse: radioService[%d]->mRadioResponse == NULL", slotId); 3253 } 3254 3255 return 0; 3256 } 3257 3258 int radio::dialResponse(int slotId, 3259 int responseType, int serial, RIL_Errno e, void *response, 3260 size_t responseLen) { 3261 #if VDBG 3262 RLOGD("dialResponse: serial %d", serial); 3263 #endif 3264 3265 if (radioService[slotId]->mRadioResponse != NULL) { 3266 RadioResponseInfo responseInfo = {}; 3267 populateResponseInfo(responseInfo, serial, responseType, e); 3268 Return<void> retStatus = radioService[slotId]->mRadioResponse->dialResponse(responseInfo); 3269 radioService[slotId]->checkReturnStatus(retStatus); 3270 } else { 3271 RLOGE("dialResponse: radioService[%d]->mRadioResponse == NULL", slotId); 3272 } 3273 3274 return 0; 3275 } 3276 3277 int radio::getIMSIForAppResponse(int slotId, 3278 int responseType, int serial, RIL_Errno e, void *response, 3279 size_t responseLen) { 3280 #if VDBG 3281 RLOGD("getIMSIForAppResponse: serial %d", serial); 3282 #endif 3283 3284 if (radioService[slotId]->mRadioResponse != NULL) { 3285 RadioResponseInfo responseInfo = {}; 3286 populateResponseInfo(responseInfo, serial, responseType, e); 3287 Return<void> retStatus = radioService[slotId]->mRadioResponse->getIMSIForAppResponse( 3288 responseInfo, convertCharPtrToHidlString((char *) response)); 3289 radioService[slotId]->checkReturnStatus(retStatus); 3290 } else { 3291 RLOGE("getIMSIForAppResponse: radioService[%d]->mRadioResponse == NULL", 3292 slotId); 3293 } 3294 3295 return 0; 3296 } 3297 3298 int radio::hangupConnectionResponse(int slotId, 3299 int responseType, int serial, RIL_Errno e, 3300 void *response, size_t responseLen) { 3301 #if VDBG 3302 RLOGD("hangupConnectionResponse: serial %d", serial); 3303 #endif 3304 3305 if (radioService[slotId]->mRadioResponse != NULL) { 3306 RadioResponseInfo responseInfo = {}; 3307 populateResponseInfo(responseInfo, serial, responseType, e); 3308 Return<void> retStatus = radioService[slotId]->mRadioResponse->hangupConnectionResponse( 3309 responseInfo); 3310 radioService[slotId]->checkReturnStatus(retStatus); 3311 } else { 3312 RLOGE("hangupConnectionResponse: radioService[%d]->mRadioResponse == NULL", 3313 slotId); 3314 } 3315 3316 return 0; 3317 } 3318 3319 int radio::hangupWaitingOrBackgroundResponse(int slotId, 3320 int responseType, int serial, RIL_Errno e, 3321 void *response, size_t responseLen) { 3322 #if VDBG 3323 RLOGD("hangupWaitingOrBackgroundResponse: serial %d", serial); 3324 #endif 3325 3326 if (radioService[slotId]->mRadioResponse != NULL) { 3327 RadioResponseInfo responseInfo = {}; 3328 populateResponseInfo(responseInfo, serial, responseType, e); 3329 Return<void> retStatus = 3330 radioService[slotId]->mRadioResponse->hangupWaitingOrBackgroundResponse( 3331 responseInfo); 3332 radioService[slotId]->checkReturnStatus(retStatus); 3333 } else { 3334 RLOGE("hangupWaitingOrBackgroundResponse: radioService[%d]->mRadioResponse == NULL", 3335 slotId); 3336 } 3337 3338 return 0; 3339 } 3340 3341 int radio::hangupForegroundResumeBackgroundResponse(int slotId, int responseType, int serial, 3342 RIL_Errno e, void *response, 3343 size_t responseLen) { 3344 #if VDBG 3345 RLOGD("hangupWaitingOrBackgroundResponse: serial %d", serial); 3346 #endif 3347 3348 if (radioService[slotId]->mRadioResponse != NULL) { 3349 RadioResponseInfo responseInfo = {}; 3350 populateResponseInfo(responseInfo, serial, responseType, e); 3351 Return<void> retStatus = 3352 radioService[slotId]->mRadioResponse->hangupWaitingOrBackgroundResponse( 3353 responseInfo); 3354 radioService[slotId]->checkReturnStatus(retStatus); 3355 } else { 3356 RLOGE("hangupWaitingOrBackgroundResponse: radioService[%d]->mRadioResponse == NULL", 3357 slotId); 3358 } 3359 3360 return 0; 3361 } 3362 3363 int radio::switchWaitingOrHoldingAndActiveResponse(int slotId, int responseType, int serial, 3364 RIL_Errno e, void *response, 3365 size_t responseLen) { 3366 #if VDBG 3367 RLOGD("switchWaitingOrHoldingAndActiveResponse: serial %d", serial); 3368 #endif 3369 3370 if (radioService[slotId]->mRadioResponse != NULL) { 3371 RadioResponseInfo responseInfo = {}; 3372 populateResponseInfo(responseInfo, serial, responseType, e); 3373 Return<void> retStatus = 3374 radioService[slotId]->mRadioResponse->switchWaitingOrHoldingAndActiveResponse( 3375 responseInfo); 3376 radioService[slotId]->checkReturnStatus(retStatus); 3377 } else { 3378 RLOGE("switchWaitingOrHoldingAndActiveResponse: radioService[%d]->mRadioResponse " 3379 "== NULL", slotId); 3380 } 3381 3382 return 0; 3383 } 3384 3385 int radio::conferenceResponse(int slotId, int responseType, 3386 int serial, RIL_Errno e, void *response, size_t responseLen) { 3387 #if VDBG 3388 RLOGD("conferenceResponse: serial %d", serial); 3389 #endif 3390 3391 if (radioService[slotId]->mRadioResponse != NULL) { 3392 RadioResponseInfo responseInfo = {}; 3393 populateResponseInfo(responseInfo, serial, responseType, e); 3394 Return<void> retStatus = radioService[slotId]->mRadioResponse->conferenceResponse( 3395 responseInfo); 3396 radioService[slotId]->checkReturnStatus(retStatus); 3397 } else { 3398 RLOGE("conferenceResponse: radioService[%d]->mRadioResponse == NULL", 3399 slotId); 3400 } 3401 3402 return 0; 3403 } 3404 3405 int radio::rejectCallResponse(int slotId, int responseType, 3406 int serial, RIL_Errno e, void *response, size_t responseLen) { 3407 #if VDBG 3408 RLOGD("rejectCallResponse: serial %d", serial); 3409 #endif 3410 3411 if (radioService[slotId]->mRadioResponse != NULL) { 3412 RadioResponseInfo responseInfo = {}; 3413 populateResponseInfo(responseInfo, serial, responseType, e); 3414 Return<void> retStatus = radioService[slotId]->mRadioResponse->rejectCallResponse( 3415 responseInfo); 3416 radioService[slotId]->checkReturnStatus(retStatus); 3417 } else { 3418 RLOGE("rejectCallResponse: radioService[%d]->mRadioResponse == NULL", 3419 slotId); 3420 } 3421 3422 return 0; 3423 } 3424 3425 int radio::getLastCallFailCauseResponse(int slotId, 3426 int responseType, int serial, RIL_Errno e, void *response, 3427 size_t responseLen) { 3428 #if VDBG 3429 RLOGD("getLastCallFailCauseResponse: serial %d", serial); 3430 #endif 3431 3432 if (radioService[slotId]->mRadioResponse != NULL) { 3433 RadioResponseInfo responseInfo = {}; 3434 populateResponseInfo(responseInfo, serial, responseType, e); 3435 3436 LastCallFailCauseInfo info = {}; 3437 info.vendorCause = hidl_string(); 3438 if (response == NULL) { 3439 RLOGE("getCurrentCallsResponse Invalid response: NULL"); 3440 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE; 3441 } else if (responseLen == sizeof(int)) { 3442 int *pInt = (int *) response; 3443 info.causeCode = (LastCallFailCause) pInt[0]; 3444 } else if (responseLen == sizeof(RIL_LastCallFailCauseInfo)) { 3445 RIL_LastCallFailCauseInfo *pFailCauseInfo = (RIL_LastCallFailCauseInfo *) response; 3446 info.causeCode = (LastCallFailCause) pFailCauseInfo->cause_code; 3447 info.vendorCause = convertCharPtrToHidlString(pFailCauseInfo->vendor_cause); 3448 } else { 3449 RLOGE("getCurrentCallsResponse Invalid response: NULL"); 3450 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE; 3451 } 3452 3453 Return<void> retStatus = radioService[slotId]->mRadioResponse->getLastCallFailCauseResponse( 3454 responseInfo, info); 3455 radioService[slotId]->checkReturnStatus(retStatus); 3456 } else { 3457 RLOGE("getLastCallFailCauseResponse: radioService[%d]->mRadioResponse == NULL", 3458 slotId); 3459 } 3460 3461 return 0; 3462 } 3463 3464 int radio::getSignalStrengthResponse(int slotId, 3465 int responseType, int serial, RIL_Errno e, 3466 void *response, size_t responseLen) { 3467 #if VDBG 3468 RLOGD("getSignalStrengthResponse: serial %d", serial); 3469 #endif 3470 3471 if (radioService[slotId]->mRadioResponse != NULL) { 3472 RadioResponseInfo responseInfo = {}; 3473 populateResponseInfo(responseInfo, serial, responseType, e); 3474 SignalStrength signalStrength = {}; 3475 if (response == NULL || responseLen != sizeof(RIL_SignalStrength_v10)) { 3476 RLOGE("getSignalStrengthResponse: Invalid response"); 3477 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE; 3478 } else { 3479 convertRilSignalStrengthToHal(response, responseLen, signalStrength); 3480 } 3481 3482 Return<void> retStatus = radioService[slotId]->mRadioResponse->getSignalStrengthResponse( 3483 responseInfo, signalStrength); 3484 radioService[slotId]->checkReturnStatus(retStatus); 3485 } else { 3486 RLOGE("getSignalStrengthResponse: radioService[%d]->mRadioResponse == NULL", 3487 slotId); 3488 } 3489 3490 return 0; 3491 } 3492 3493 RIL_CellInfoType getCellInfoTypeRadioTechnology(char *rat) { 3494 if (rat == NULL) { 3495 return RIL_CELL_INFO_TYPE_NONE; 3496 } 3497 3498 int radioTech = atoi(rat); 3499 3500 switch(radioTech) { 3501 3502 case RADIO_TECH_GPRS: 3503 case RADIO_TECH_EDGE: 3504 case RADIO_TECH_GSM: { 3505 return RIL_CELL_INFO_TYPE_GSM; 3506 } 3507 3508 case RADIO_TECH_UMTS: 3509 case RADIO_TECH_HSDPA: 3510 case RADIO_TECH_HSUPA: 3511 case RADIO_TECH_HSPA: 3512 case RADIO_TECH_HSPAP: { 3513 return RIL_CELL_INFO_TYPE_WCDMA; 3514 } 3515 3516 case RADIO_TECH_IS95A: 3517 case RADIO_TECH_IS95B: 3518 case RADIO_TECH_1xRTT: 3519 case RADIO_TECH_EVDO_0: 3520 case RADIO_TECH_EVDO_A: 3521 case RADIO_TECH_EVDO_B: 3522 case RADIO_TECH_EHRPD: { 3523 return RIL_CELL_INFO_TYPE_CDMA; 3524 } 3525 3526 case RADIO_TECH_LTE: 3527 case RADIO_TECH_LTE_CA: { 3528 return RIL_CELL_INFO_TYPE_LTE; 3529 } 3530 3531 case RADIO_TECH_TD_SCDMA: { 3532 return RIL_CELL_INFO_TYPE_TD_SCDMA; 3533 } 3534 3535 default: { 3536 break; 3537 } 3538 } 3539 3540 return RIL_CELL_INFO_TYPE_NONE; 3541 3542 } 3543 3544 void fillCellIdentityResponse(CellIdentity &cellIdentity, RIL_CellIdentity_v16 &rilCellIdentity) { 3545 3546 cellIdentity.cellIdentityGsm.resize(0); 3547 cellIdentity.cellIdentityWcdma.resize(0); 3548 cellIdentity.cellIdentityCdma.resize(0); 3549 cellIdentity.cellIdentityTdscdma.resize(0); 3550 cellIdentity.cellIdentityLte.resize(0); 3551 cellIdentity.cellInfoType = (CellInfoType)rilCellIdentity.cellInfoType; 3552 switch(rilCellIdentity.cellInfoType) { 3553 3554 case RIL_CELL_INFO_TYPE_GSM: { 3555 cellIdentity.cellIdentityGsm.resize(1); 3556 cellIdentity.cellIdentityGsm[0].mcc = 3557 std::to_string(rilCellIdentity.cellIdentityGsm.mcc); 3558 cellIdentity.cellIdentityGsm[0].mnc = 3559 std::to_string(rilCellIdentity.cellIdentityGsm.mnc); 3560 cellIdentity.cellIdentityGsm[0].lac = rilCellIdentity.cellIdentityGsm.lac; 3561 cellIdentity.cellIdentityGsm[0].cid = rilCellIdentity.cellIdentityGsm.cid; 3562 cellIdentity.cellIdentityGsm[0].arfcn = rilCellIdentity.cellIdentityGsm.arfcn; 3563 cellIdentity.cellIdentityGsm[0].bsic = rilCellIdentity.cellIdentityGsm.bsic; 3564 break; 3565 } 3566 3567 case RIL_CELL_INFO_TYPE_WCDMA: { 3568 cellIdentity.cellIdentityWcdma.resize(1); 3569 cellIdentity.cellIdentityWcdma[0].mcc = 3570 std::to_string(rilCellIdentity.cellIdentityWcdma.mcc); 3571 cellIdentity.cellIdentityWcdma[0].mnc = 3572 std::to_string(rilCellIdentity.cellIdentityWcdma.mnc); 3573 cellIdentity.cellIdentityWcdma[0].lac = rilCellIdentity.cellIdentityWcdma.lac; 3574 cellIdentity.cellIdentityWcdma[0].cid = rilCellIdentity.cellIdentityWcdma.cid; 3575 cellIdentity.cellIdentityWcdma[0].psc = rilCellIdentity.cellIdentityWcdma.psc; 3576 cellIdentity.cellIdentityWcdma[0].uarfcn = rilCellIdentity.cellIdentityWcdma.uarfcn; 3577 break; 3578 } 3579 3580 case RIL_CELL_INFO_TYPE_CDMA: { 3581 cellIdentity.cellIdentityCdma.resize(1); 3582 cellIdentity.cellIdentityCdma[0].networkId = rilCellIdentity.cellIdentityCdma.networkId; 3583 cellIdentity.cellIdentityCdma[0].systemId = rilCellIdentity.cellIdentityCdma.systemId; 3584 cellIdentity.cellIdentityCdma[0].baseStationId = 3585 rilCellIdentity.cellIdentityCdma.basestationId; 3586 cellIdentity.cellIdentityCdma[0].longitude = rilCellIdentity.cellIdentityCdma.longitude; 3587 cellIdentity.cellIdentityCdma[0].latitude = rilCellIdentity.cellIdentityCdma.latitude; 3588 break; 3589 } 3590 3591 case RIL_CELL_INFO_TYPE_LTE: { 3592 cellIdentity.cellIdentityLte.resize(1); 3593 cellIdentity.cellIdentityLte[0].mcc = 3594 std::to_string(rilCellIdentity.cellIdentityLte.mcc); 3595 cellIdentity.cellIdentityLte[0].mnc = 3596 std::to_string(rilCellIdentity.cellIdentityLte.mnc); 3597 cellIdentity.cellIdentityLte[0].ci = rilCellIdentity.cellIdentityLte.ci; 3598 cellIdentity.cellIdentityLte[0].pci = rilCellIdentity.cellIdentityLte.pci; 3599 cellIdentity.cellIdentityLte[0].tac = rilCellIdentity.cellIdentityLte.tac; 3600 cellIdentity.cellIdentityLte[0].earfcn = rilCellIdentity.cellIdentityLte.earfcn; 3601 break; 3602 } 3603 3604 case RIL_CELL_INFO_TYPE_TD_SCDMA: { 3605 cellIdentity.cellIdentityTdscdma.resize(1); 3606 cellIdentity.cellIdentityTdscdma[0].mcc = 3607 std::to_string(rilCellIdentity.cellIdentityTdscdma.mcc); 3608 cellIdentity.cellIdentityTdscdma[0].mnc = 3609 std::to_string(rilCellIdentity.cellIdentityTdscdma.mnc); 3610 cellIdentity.cellIdentityTdscdma[0].lac = rilCellIdentity.cellIdentityTdscdma.lac; 3611 cellIdentity.cellIdentityTdscdma[0].cid = rilCellIdentity.cellIdentityTdscdma.cid; 3612 cellIdentity.cellIdentityTdscdma[0].cpid = rilCellIdentity.cellIdentityTdscdma.cpid; 3613 break; 3614 } 3615 3616 default: { 3617 break; 3618 } 3619 } 3620 } 3621 3622 int convertResponseStringEntryToInt(char **response, int index, int numStrings) { 3623 if ((response != NULL) && (numStrings > index) && (response[index] != NULL)) { 3624 return atoi(response[index]); 3625 } 3626 3627 return -1; 3628 } 3629 3630 int convertResponseHexStringEntryToInt(char **response, int index, int numStrings) { 3631 const int hexBase = 16; 3632 if ((response != NULL) && (numStrings > index) && (response[index] != NULL)) { 3633 return strtol(response[index], NULL, hexBase); 3634 } 3635 3636 return -1; 3637 } 3638 3639 /* Fill Cell Identity info from Voice Registration State Response. 3640 * This fucntion is applicable only for RIL Version < 15. 3641 * Response is a "char **". 3642 * First and Second entries are in hex string format 3643 * and rest are integers represented in ascii format. */ 3644 void fillCellIdentityFromVoiceRegStateResponseString(CellIdentity &cellIdentity, 3645 int numStrings, char** response) { 3646 3647 RIL_CellIdentity_v16 rilCellIdentity; 3648 memset(&rilCellIdentity, -1, sizeof(RIL_CellIdentity_v16)); 3649 3650 rilCellIdentity.cellInfoType = getCellInfoTypeRadioTechnology(response[3]); 3651 switch(rilCellIdentity.cellInfoType) { 3652 3653 case RIL_CELL_INFO_TYPE_GSM: { 3654 /* valid LAC are hexstrings in the range 0x0000 - 0xffff */ 3655 rilCellIdentity.cellIdentityGsm.lac = 3656 convertResponseHexStringEntryToInt(response, 1, numStrings); 3657 3658 /* valid CID are hexstrings in the range 0x00000000 - 0xffffffff */ 3659 rilCellIdentity.cellIdentityGsm.cid = 3660 convertResponseHexStringEntryToInt(response, 2, numStrings); 3661 break; 3662 } 3663 3664 case RIL_CELL_INFO_TYPE_WCDMA: { 3665 /* valid LAC are hexstrings in the range 0x0000 - 0xffff */ 3666 rilCellIdentity.cellIdentityWcdma.lac = 3667 convertResponseHexStringEntryToInt(response, 1, numStrings); 3668 3669 /* valid CID are hexstrings in the range 0x00000000 - 0xffffffff */ 3670 rilCellIdentity.cellIdentityWcdma.cid = 3671 convertResponseHexStringEntryToInt(response, 2, numStrings); 3672 rilCellIdentity.cellIdentityWcdma.psc = 3673 convertResponseStringEntryToInt(response, 14, numStrings); 3674 break; 3675 } 3676 3677 case RIL_CELL_INFO_TYPE_TD_SCDMA:{ 3678 /* valid LAC are hexstrings in the range 0x0000 - 0xffff */ 3679 rilCellIdentity.cellIdentityTdscdma.lac = 3680 convertResponseHexStringEntryToInt(response, 1, numStrings); 3681 3682 /* valid CID are hexstrings in the range 0x00000000 - 0xffffffff */ 3683 rilCellIdentity.cellIdentityTdscdma.cid = 3684 convertResponseHexStringEntryToInt(response, 2, numStrings); 3685 break; 3686 } 3687 3688 case RIL_CELL_INFO_TYPE_CDMA:{ 3689 rilCellIdentity.cellIdentityCdma.basestationId = 3690 convertResponseStringEntryToInt(response, 4, numStrings); 3691 /* Order of Lat. and Long. swapped between RIL and HIDL interface versions. */ 3692 rilCellIdentity.cellIdentityCdma.latitude = 3693 convertResponseStringEntryToInt(response, 5, numStrings); 3694 rilCellIdentity.cellIdentityCdma.longitude = 3695 convertResponseStringEntryToInt(response, 6, numStrings); 3696 rilCellIdentity.cellIdentityCdma.systemId = 3697 convertResponseStringEntryToInt(response, 8, numStrings); 3698 rilCellIdentity.cellIdentityCdma.networkId = 3699 convertResponseStringEntryToInt(response, 9, numStrings); 3700 break; 3701 } 3702 3703 case RIL_CELL_INFO_TYPE_LTE:{ 3704 /* valid TAC are hexstrings in the range 0x0000 - 0xffff */ 3705 rilCellIdentity.cellIdentityLte.tac = 3706 convertResponseHexStringEntryToInt(response, 1, numStrings); 3707 3708 /* valid CID are hexstrings in the range 0x00000000 - 0xffffffff */ 3709 rilCellIdentity.cellIdentityLte.ci = 3710 convertResponseHexStringEntryToInt(response, 2, numStrings); 3711 break; 3712 } 3713 3714 default: { 3715 break; 3716 } 3717 } 3718 3719 fillCellIdentityResponse(cellIdentity, rilCellIdentity); 3720 } 3721 3722 /* Fill Cell Identity info from Data Registration State Response. 3723 * This fucntion is applicable only for RIL Version < 15. 3724 * Response is a "char **". 3725 * First and Second entries are in hex string format 3726 * and rest are integers represented in ascii format. */ 3727 void fillCellIdentityFromDataRegStateResponseString(CellIdentity &cellIdentity, 3728 int numStrings, char** response) { 3729 3730 RIL_CellIdentity_v16 rilCellIdentity; 3731 memset(&rilCellIdentity, -1, sizeof(RIL_CellIdentity_v16)); 3732 3733 rilCellIdentity.cellInfoType = getCellInfoTypeRadioTechnology(response[3]); 3734 switch(rilCellIdentity.cellInfoType) { 3735 case RIL_CELL_INFO_TYPE_GSM: { 3736 /* valid LAC are hexstrings in the range 0x0000 - 0xffff */ 3737 rilCellIdentity.cellIdentityGsm.lac = 3738 convertResponseHexStringEntryToInt(response, 1, numStrings); 3739 3740 /* valid CID are hexstrings in the range 0x00000000 - 0xffffffff */ 3741 rilCellIdentity.cellIdentityGsm.cid = 3742 convertResponseHexStringEntryToInt(response, 2, numStrings); 3743 break; 3744 } 3745 case RIL_CELL_INFO_TYPE_WCDMA: { 3746 /* valid LAC are hexstrings in the range 0x0000 - 0xffff */ 3747 rilCellIdentity.cellIdentityWcdma.lac = 3748 convertResponseHexStringEntryToInt(response, 1, numStrings); 3749 3750 /* valid CID are hexstrings in the range 0x00000000 - 0xffffffff */ 3751 rilCellIdentity.cellIdentityWcdma.cid = 3752 convertResponseHexStringEntryToInt(response, 2, numStrings); 3753 break; 3754 } 3755 case RIL_CELL_INFO_TYPE_TD_SCDMA:{ 3756 /* valid LAC are hexstrings in the range 0x0000 - 0xffff */ 3757 rilCellIdentity.cellIdentityTdscdma.lac = 3758 convertResponseHexStringEntryToInt(response, 1, numStrings); 3759 3760 /* valid CID are hexstrings in the range 0x00000000 - 0xffffffff */ 3761 rilCellIdentity.cellIdentityTdscdma.cid = 3762 convertResponseHexStringEntryToInt(response, 2, numStrings); 3763 break; 3764 } 3765 case RIL_CELL_INFO_TYPE_LTE: { 3766 rilCellIdentity.cellIdentityLte.tac = 3767 convertResponseStringEntryToInt(response, 6, numStrings); 3768 rilCellIdentity.cellIdentityLte.pci = 3769 convertResponseStringEntryToInt(response, 7, numStrings); 3770 rilCellIdentity.cellIdentityLte.ci = 3771 convertResponseStringEntryToInt(response, 8, numStrings); 3772 break; 3773 } 3774 default: { 3775 break; 3776 } 3777 } 3778 3779 fillCellIdentityResponse(cellIdentity, rilCellIdentity); 3780 } 3781 3782 int radio::getVoiceRegistrationStateResponse(int slotId, 3783 int responseType, int serial, RIL_Errno e, 3784 void *response, size_t responseLen) { 3785 #if VDBG 3786 RLOGD("getVoiceRegistrationStateResponse: serial %d", serial); 3787 #endif 3788 3789 if (radioService[slotId]->mRadioResponse != NULL) { 3790 RadioResponseInfo responseInfo = {}; 3791 populateResponseInfo(responseInfo, serial, responseType, e); 3792 3793 VoiceRegStateResult voiceRegResponse = {}; 3794 int numStrings = responseLen / sizeof(char *); 3795 if (response == NULL) { 3796 RLOGE("getVoiceRegistrationStateResponse Invalid response: NULL"); 3797 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE; 3798 } else if (s_vendorFunctions->version <= 14) { 3799 if (numStrings != 15) { 3800 RLOGE("getVoiceRegistrationStateResponse Invalid response: NULL"); 3801 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE; 3802 } else { 3803 char **resp = (char **) response; 3804 voiceRegResponse.regState = (RegState) ATOI_NULL_HANDLED_DEF(resp[0], 4); 3805 voiceRegResponse.rat = ATOI_NULL_HANDLED(resp[3]); 3806 voiceRegResponse.cssSupported = ATOI_NULL_HANDLED_DEF(resp[7], 0); 3807 voiceRegResponse.roamingIndicator = ATOI_NULL_HANDLED(resp[10]); 3808 voiceRegResponse.systemIsInPrl = ATOI_NULL_HANDLED_DEF(resp[11], 0); 3809 voiceRegResponse.defaultRoamingIndicator = ATOI_NULL_HANDLED_DEF(resp[12], 0); 3810 voiceRegResponse.reasonForDenial = ATOI_NULL_HANDLED_DEF(resp[13], 0); 3811 fillCellIdentityFromVoiceRegStateResponseString(voiceRegResponse.cellIdentity, 3812 numStrings, resp); 3813 } 3814 } else { 3815 RIL_VoiceRegistrationStateResponse *voiceRegState = 3816 (RIL_VoiceRegistrationStateResponse *)response; 3817 3818 if (responseLen != sizeof(RIL_VoiceRegistrationStateResponse)) { 3819 RLOGE("getVoiceRegistrationStateResponse Invalid response: NULL"); 3820 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE; 3821 } else { 3822 voiceRegResponse.regState = (RegState) voiceRegState->regState; 3823 voiceRegResponse.rat = voiceRegState->rat;; 3824 voiceRegResponse.cssSupported = voiceRegState->cssSupported; 3825 voiceRegResponse.roamingIndicator = voiceRegState->roamingIndicator; 3826 voiceRegResponse.systemIsInPrl = voiceRegState->systemIsInPrl; 3827 voiceRegResponse.defaultRoamingIndicator = voiceRegState->defaultRoamingIndicator; 3828 voiceRegResponse.reasonForDenial = voiceRegState->reasonForDenial; 3829 fillCellIdentityResponse(voiceRegResponse.cellIdentity, 3830 voiceRegState->cellIdentity); 3831 } 3832 } 3833 3834 Return<void> retStatus = 3835 radioService[slotId]->mRadioResponse->getVoiceRegistrationStateResponse( 3836 responseInfo, voiceRegResponse); 3837 radioService[slotId]->checkReturnStatus(retStatus); 3838 } else { 3839 RLOGE("getVoiceRegistrationStateResponse: radioService[%d]->mRadioResponse == NULL", 3840 slotId); 3841 } 3842 3843 return 0; 3844 } 3845 3846 int radio::getDataRegistrationStateResponse(int slotId, 3847 int responseType, int serial, RIL_Errno e, 3848 void *response, size_t responseLen) { 3849 #if VDBG 3850 RLOGD("getDataRegistrationStateResponse: serial %d", serial); 3851 #endif 3852 3853 if (radioService[slotId]->mRadioResponse != NULL) { 3854 RadioResponseInfo responseInfo = {}; 3855 populateResponseInfo(responseInfo, serial, responseType, e); 3856 DataRegStateResult dataRegResponse = {}; 3857 if (response == NULL) { 3858 RLOGE("getDataRegistrationStateResponse Invalid response: NULL"); 3859 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE; 3860 } else if (s_vendorFunctions->version <= 14) { 3861 int numStrings = responseLen / sizeof(char *); 3862 if ((numStrings != 6) && (numStrings != 11)) { 3863 RLOGE("getDataRegistrationStateResponse Invalid response: NULL"); 3864 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE; 3865 } else { 3866 char **resp = (char **) response; 3867 dataRegResponse.regState = (RegState) ATOI_NULL_HANDLED_DEF(resp[0], 4); 3868 dataRegResponse.rat = ATOI_NULL_HANDLED_DEF(resp[3], 0); 3869 dataRegResponse.reasonDataDenied = ATOI_NULL_HANDLED(resp[4]); 3870 dataRegResponse.maxDataCalls = ATOI_NULL_HANDLED_DEF(resp[5], 1); 3871 fillCellIdentityFromDataRegStateResponseString(dataRegResponse.cellIdentity, 3872 numStrings, resp); 3873 } 3874 } else { 3875 RIL_DataRegistrationStateResponse *dataRegState = 3876 (RIL_DataRegistrationStateResponse *)response; 3877 3878 if (responseLen != sizeof(RIL_DataRegistrationStateResponse)) { 3879 RLOGE("getDataRegistrationStateResponse Invalid response: NULL"); 3880 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE; 3881 } else { 3882 dataRegResponse.regState = (RegState) dataRegState->regState; 3883 dataRegResponse.rat = dataRegState->rat;; 3884 dataRegResponse.reasonDataDenied = dataRegState->reasonDataDenied; 3885 dataRegResponse.maxDataCalls = dataRegState->maxDataCalls; 3886 fillCellIdentityResponse(dataRegResponse.cellIdentity, dataRegState->cellIdentity); 3887 } 3888 } 3889 3890 Return<void> retStatus = 3891 radioService[slotId]->mRadioResponse->getDataRegistrationStateResponse(responseInfo, 3892 dataRegResponse); 3893 radioService[slotId]->checkReturnStatus(retStatus); 3894 } else { 3895 RLOGE("getDataRegistrationStateResponse: radioService[%d]->mRadioResponse == NULL", 3896 slotId); 3897 } 3898 3899 return 0; 3900 } 3901 3902 int radio::getOperatorResponse(int slotId, 3903 int responseType, int serial, RIL_Errno e, void *response, 3904 size_t responseLen) { 3905 #if VDBG 3906 RLOGD("getOperatorResponse: serial %d", serial); 3907 #endif 3908 3909 if (radioService[slotId]->mRadioResponse != NULL) { 3910 RadioResponseInfo responseInfo = {}; 3911 populateResponseInfo(responseInfo, serial, responseType, e); 3912 hidl_string longName; 3913 hidl_string shortName; 3914 hidl_string numeric; 3915 int numStrings = responseLen / sizeof(char *); 3916 if (response == NULL || numStrings != 3) { 3917 RLOGE("getOperatorResponse Invalid response: NULL"); 3918 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE; 3919 3920 } else { 3921 char **resp = (char **) response; 3922 longName = convertCharPtrToHidlString(resp[0]); 3923 shortName = convertCharPtrToHidlString(resp[1]); 3924 numeric = convertCharPtrToHidlString(resp[2]); 3925 } 3926 Return<void> retStatus = radioService[slotId]->mRadioResponse->getOperatorResponse( 3927 responseInfo, longName, shortName, numeric); 3928 radioService[slotId]->checkReturnStatus(retStatus); 3929 } else { 3930 RLOGE("getOperatorResponse: radioService[%d]->mRadioResponse == NULL", 3931 slotId); 3932 } 3933 3934 return 0; 3935 } 3936 3937 int radio::setRadioPowerResponse(int slotId, 3938 int responseType, int serial, RIL_Errno e, void *response, 3939 size_t responseLen) { 3940 RLOGD("setRadioPowerResponse: serial %d", serial); 3941 3942 if (radioService[slotId]->mRadioResponse != NULL) { 3943 RadioResponseInfo responseInfo = {}; 3944 populateResponseInfo(responseInfo, serial, responseType, e); 3945 Return<void> retStatus = radioService[slotId]->mRadioResponse->setRadioPowerResponse( 3946 responseInfo); 3947 radioService[slotId]->checkReturnStatus(retStatus); 3948 } else { 3949 RLOGE("setRadioPowerResponse: radioService[%d]->mRadioResponse == NULL", 3950 slotId); 3951 } 3952 3953 return 0; 3954 } 3955 3956 int radio::sendDtmfResponse(int slotId, 3957 int responseType, int serial, RIL_Errno e, void *response, 3958 size_t responseLen) { 3959 #if VDBG 3960 RLOGD("sendDtmfResponse: serial %d", serial); 3961 #endif 3962 3963 if (radioService[slotId]->mRadioResponse != NULL) { 3964 RadioResponseInfo responseInfo = {}; 3965 populateResponseInfo(responseInfo, serial, responseType, e); 3966 Return<void> retStatus = radioService[slotId]->mRadioResponse->sendDtmfResponse( 3967 responseInfo); 3968 radioService[slotId]->checkReturnStatus(retStatus); 3969 } else { 3970 RLOGE("sendDtmfResponse: radioService[%d]->mRadioResponse == NULL", 3971 slotId); 3972 } 3973 3974 return 0; 3975 } 3976 3977 SendSmsResult makeSendSmsResult(RadioResponseInfo& responseInfo, int serial, int responseType, 3978 RIL_Errno e, void *response, size_t responseLen) { 3979 populateResponseInfo(responseInfo, serial, responseType, e); 3980 SendSmsResult result = {}; 3981 3982 if (response == NULL || responseLen != sizeof(RIL_SMS_Response)) { 3983 RLOGE("Invalid response: NULL"); 3984 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE; 3985 result.ackPDU = hidl_string(); 3986 } else { 3987 RIL_SMS_Response *resp = (RIL_SMS_Response *) response; 3988 result.messageRef = resp->messageRef; 3989 result.ackPDU = convertCharPtrToHidlString(resp->ackPDU); 3990 result.errorCode = resp->errorCode; 3991 } 3992 return result; 3993 } 3994 3995 int radio::sendSmsResponse(int slotId, 3996 int responseType, int serial, RIL_Errno e, void *response, 3997 size_t responseLen) { 3998 #if VDBG 3999 RLOGD("sendSmsResponse: serial %d", serial); 4000 #endif 4001 4002 if (radioService[slotId]->mRadioResponse != NULL) { 4003 RadioResponseInfo responseInfo = {}; 4004 SendSmsResult result = makeSendSmsResult(responseInfo, serial, responseType, e, response, 4005 responseLen); 4006 4007 Return<void> retStatus = radioService[slotId]->mRadioResponse->sendSmsResponse(responseInfo, 4008 result); 4009 radioService[slotId]->checkReturnStatus(retStatus); 4010 } else { 4011 RLOGE("sendSmsResponse: radioService[%d]->mRadioResponse == NULL", slotId); 4012 } 4013 4014 return 0; 4015 } 4016 4017 int radio::sendSMSExpectMoreResponse(int slotId, 4018 int responseType, int serial, RIL_Errno e, void *response, 4019 size_t responseLen) { 4020 #if VDBG 4021 RLOGD("sendSMSExpectMoreResponse: serial %d", serial); 4022 #endif 4023 4024 if (radioService[slotId]->mRadioResponse != NULL) { 4025 RadioResponseInfo responseInfo = {}; 4026 SendSmsResult result = makeSendSmsResult(responseInfo, serial, responseType, e, response, 4027 responseLen); 4028 4029 Return<void> retStatus = radioService[slotId]->mRadioResponse->sendSMSExpectMoreResponse( 4030 responseInfo, result); 4031 radioService[slotId]->checkReturnStatus(retStatus); 4032 } else { 4033 RLOGE("sendSMSExpectMoreResponse: radioService[%d]->mRadioResponse == NULL", slotId); 4034 } 4035 4036 return 0; 4037 } 4038 4039 int radio::setupDataCallResponse(int slotId, 4040 int responseType, int serial, RIL_Errno e, void *response, 4041 size_t responseLen) { 4042 #if VDBG 4043 RLOGD("setupDataCallResponse: serial %d", serial); 4044 #endif 4045 4046 if (radioService[slotId]->mRadioResponse != NULL) { 4047 RadioResponseInfo responseInfo = {}; 4048 populateResponseInfo(responseInfo, serial, responseType, e); 4049 4050 SetupDataCallResult result = {}; 4051 if (response == NULL || (responseLen % sizeof(RIL_Data_Call_Response_v11)) != 0) { 4052 if (response != NULL) { 4053 RLOGE("setupDataCallResponse: Invalid response"); 4054 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE; 4055 } 4056 result.status = DataCallFailCause::ERROR_UNSPECIFIED; 4057 result.type = hidl_string(); 4058 result.ifname = hidl_string(); 4059 result.addresses = hidl_string(); 4060 result.dnses = hidl_string(); 4061 result.gateways = hidl_string(); 4062 result.pcscf = hidl_string(); 4063 } else { 4064 convertRilDataCallToHal((RIL_Data_Call_Response_v11 *) response, result); 4065 } 4066 4067 Return<void> retStatus = radioService[slotId]->mRadioResponse->setupDataCallResponse( 4068 responseInfo, result); 4069 radioService[slotId]->checkReturnStatus(retStatus); 4070 } else { 4071 RLOGE("setupDataCallResponse: radioService[%d]->mRadioResponse == NULL", slotId); 4072 } 4073 4074 return 0; 4075 } 4076 4077 IccIoResult responseIccIo(RadioResponseInfo& responseInfo, int serial, int responseType, 4078 RIL_Errno e, void *response, size_t responseLen) { 4079 populateResponseInfo(responseInfo, serial, responseType, e); 4080 IccIoResult result = {}; 4081 4082 if (response == NULL || responseLen != sizeof(RIL_SIM_IO_Response)) { 4083 RLOGE("Invalid response: NULL"); 4084 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE; 4085 result.simResponse = hidl_string(); 4086 } else { 4087 RIL_SIM_IO_Response *resp = (RIL_SIM_IO_Response *) response; 4088 result.sw1 = resp->sw1; 4089 result.sw2 = resp->sw2; 4090 result.simResponse = convertCharPtrToHidlString(resp->simResponse); 4091 } 4092 return result; 4093 } 4094 4095 int radio::iccIOForAppResponse(int slotId, 4096 int responseType, int serial, RIL_Errno e, void *response, 4097 size_t responseLen) { 4098 #if VDBG 4099 RLOGD("iccIOForAppResponse: serial %d", serial); 4100 #endif 4101 4102 if (radioService[slotId]->mRadioResponse != NULL) { 4103 RadioResponseInfo responseInfo = {}; 4104 IccIoResult result = responseIccIo(responseInfo, serial, responseType, e, response, 4105 responseLen); 4106 4107 Return<void> retStatus = radioService[slotId]->mRadioResponse->iccIOForAppResponse( 4108 responseInfo, result); 4109 radioService[slotId]->checkReturnStatus(retStatus); 4110 } else { 4111 RLOGE("iccIOForAppResponse: radioService[%d]->mRadioResponse == NULL", slotId); 4112 } 4113 4114 return 0; 4115 } 4116 4117 int radio::sendUssdResponse(int slotId, 4118 int responseType, int serial, RIL_Errno e, void *response, 4119 size_t responseLen) { 4120 #if VDBG 4121 RLOGD("sendUssdResponse: serial %d", serial); 4122 #endif 4123 4124 if (radioService[slotId]->mRadioResponse != NULL) { 4125 RadioResponseInfo responseInfo = {}; 4126 populateResponseInfo(responseInfo, serial, responseType, e); 4127 Return<void> retStatus = radioService[slotId]->mRadioResponse->sendUssdResponse( 4128 responseInfo); 4129 radioService[slotId]->checkReturnStatus(retStatus); 4130 } else { 4131 RLOGE("sendUssdResponse: radioService[%d]->mRadioResponse == NULL", 4132 slotId); 4133 } 4134 4135 return 0; 4136 } 4137 4138 int radio::cancelPendingUssdResponse(int slotId, 4139 int responseType, int serial, RIL_Errno e, void *response, 4140 size_t responseLen) { 4141 #if VDBG 4142 RLOGD("cancelPendingUssdResponse: serial %d", serial); 4143 #endif 4144 4145 if (radioService[slotId]->mRadioResponse != NULL) { 4146 RadioResponseInfo responseInfo = {}; 4147 populateResponseInfo(responseInfo, serial, responseType, e); 4148 Return<void> retStatus = radioService[slotId]->mRadioResponse->cancelPendingUssdResponse( 4149 responseInfo); 4150 radioService[slotId]->checkReturnStatus(retStatus); 4151 } else { 4152 RLOGE("cancelPendingUssdResponse: radioService[%d]->mRadioResponse == NULL", 4153 slotId); 4154 } 4155 4156 return 0; 4157 } 4158 4159 int radio::getClirResponse(int slotId, 4160 int responseType, int serial, RIL_Errno e, void *response, 4161 size_t responseLen) { 4162 #if VDBG 4163 RLOGD("getClirResponse: serial %d", serial); 4164 #endif 4165 4166 if (radioService[slotId]->mRadioResponse != NULL) { 4167 RadioResponseInfo responseInfo = {}; 4168 populateResponseInfo(responseInfo, serial, responseType, e); 4169 int n = -1, m = -1; 4170 int numInts = responseLen / sizeof(int); 4171 if (response == NULL || numInts != 2) { 4172 RLOGE("getClirResponse Invalid response: NULL"); 4173 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE; 4174 } else { 4175 int *pInt = (int *) response; 4176 n = pInt[0]; 4177 m = pInt[1]; 4178 } 4179 Return<void> retStatus = radioService[slotId]->mRadioResponse->getClirResponse(responseInfo, 4180 n, m); 4181 radioService[slotId]->checkReturnStatus(retStatus); 4182 } else { 4183 RLOGE("getClirResponse: radioService[%d]->mRadioResponse == NULL", slotId); 4184 } 4185 4186 return 0; 4187 } 4188 4189 int radio::setClirResponse(int slotId, 4190 int responseType, int serial, RIL_Errno e, void *response, 4191 size_t responseLen) { 4192 #if VDBG 4193 RLOGD("setClirResponse: serial %d", serial); 4194 #endif 4195 4196 if (radioService[slotId]->mRadioResponse != NULL) { 4197 RadioResponseInfo responseInfo = {}; 4198 populateResponseInfo(responseInfo, serial, responseType, e); 4199 Return<void> retStatus = radioService[slotId]->mRadioResponse->setClirResponse( 4200 responseInfo); 4201 radioService[slotId]->checkReturnStatus(retStatus); 4202 } else { 4203 RLOGE("setClirResponse: radioService[%d]->mRadioResponse == NULL", slotId); 4204 } 4205 4206 return 0; 4207 } 4208 4209 int radio::getCallForwardStatusResponse(int slotId, 4210 int responseType, int serial, RIL_Errno e, 4211 void *response, size_t responseLen) { 4212 #if VDBG 4213 RLOGD("getCallForwardStatusResponse: serial %d", serial); 4214 #endif 4215 4216 if (radioService[slotId]->mRadioResponse != NULL) { 4217 RadioResponseInfo responseInfo = {}; 4218 populateResponseInfo(responseInfo, serial, responseType, e); 4219 hidl_vec<CallForwardInfo> callForwardInfos; 4220 4221 if ((response == NULL && responseLen != 0) 4222 || responseLen % sizeof(RIL_CallForwardInfo *) != 0) { 4223 RLOGE("getCallForwardStatusResponse Invalid response: NULL"); 4224 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE; 4225 } else { 4226 int num = responseLen / sizeof(RIL_CallForwardInfo *); 4227 callForwardInfos.resize(num); 4228 for (int i = 0 ; i < num; i++) { 4229 RIL_CallForwardInfo *resp = ((RIL_CallForwardInfo **) response)[i]; 4230 callForwardInfos[i].status = (CallForwardInfoStatus) resp->status; 4231 callForwardInfos[i].reason = resp->reason; 4232 callForwardInfos[i].serviceClass = resp->serviceClass; 4233 callForwardInfos[i].toa = resp->toa; 4234 callForwardInfos[i].number = convertCharPtrToHidlString(resp->number); 4235 callForwardInfos[i].timeSeconds = resp->timeSeconds; 4236 } 4237 } 4238 4239 Return<void> retStatus = radioService[slotId]->mRadioResponse->getCallForwardStatusResponse( 4240 responseInfo, callForwardInfos); 4241 radioService[slotId]->checkReturnStatus(retStatus); 4242 } else { 4243 RLOGE("getCallForwardStatusResponse: radioService[%d]->mRadioResponse == NULL", 4244 slotId); 4245 } 4246 4247 return 0; 4248 } 4249 4250 int radio::setCallForwardResponse(int slotId, 4251 int responseType, int serial, RIL_Errno e, void *response, 4252 size_t responseLen) { 4253 #if VDBG 4254 RLOGD("setCallForwardResponse: serial %d", serial); 4255 #endif 4256 4257 if (radioService[slotId]->mRadioResponse != NULL) { 4258 RadioResponseInfo responseInfo = {}; 4259 populateResponseInfo(responseInfo, serial, responseType, e); 4260 Return<void> retStatus = radioService[slotId]->mRadioResponse->setCallForwardResponse( 4261 responseInfo); 4262 radioService[slotId]->checkReturnStatus(retStatus); 4263 } else { 4264 RLOGE("setCallForwardResponse: radioService[%d]->mRadioResponse == NULL", slotId); 4265 } 4266 4267 return 0; 4268 } 4269 4270 int radio::getCallWaitingResponse(int slotId, 4271 int responseType, int serial, RIL_Errno e, void *response, 4272 size_t responseLen) { 4273 #if VDBG 4274 RLOGD("getCallWaitingResponse: serial %d", serial); 4275 #endif 4276 4277 if (radioService[slotId]->mRadioResponse != NULL) { 4278 RadioResponseInfo responseInfo = {}; 4279 populateResponseInfo(responseInfo, serial, responseType, e); 4280 bool enable = false; 4281 int serviceClass = -1; 4282 int numInts = responseLen / sizeof(int); 4283 if (response == NULL || numInts != 2) { 4284 RLOGE("getCallWaitingResponse Invalid response: NULL"); 4285 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE; 4286 } else { 4287 int *pInt = (int *) response; 4288 enable = pInt[0] == 1 ? true : false; 4289 serviceClass = pInt[1]; 4290 } 4291 Return<void> retStatus = radioService[slotId]->mRadioResponse->getCallWaitingResponse( 4292 responseInfo, enable, serviceClass); 4293 radioService[slotId]->checkReturnStatus(retStatus); 4294 } else { 4295 RLOGE("getCallWaitingResponse: radioService[%d]->mRadioResponse == NULL", slotId); 4296 } 4297 4298 return 0; 4299 } 4300 4301 int radio::setCallWaitingResponse(int slotId, 4302 int responseType, int serial, RIL_Errno e, void *response, 4303 size_t responseLen) { 4304 #if VDBG 4305 RLOGD("setCallWaitingResponse: serial %d", serial); 4306 #endif 4307 4308 if (radioService[slotId]->mRadioResponse != NULL) { 4309 RadioResponseInfo responseInfo = {}; 4310 populateResponseInfo(responseInfo, serial, responseType, e); 4311 Return<void> retStatus = radioService[slotId]->mRadioResponse->setCallWaitingResponse( 4312 responseInfo); 4313 radioService[slotId]->checkReturnStatus(retStatus); 4314 } else { 4315 RLOGE("setCallWaitingResponse: radioService[%d]->mRadioResponse == NULL", slotId); 4316 } 4317 4318 return 0; 4319 } 4320 4321 int radio::acknowledgeLastIncomingGsmSmsResponse(int slotId, 4322 int responseType, int serial, RIL_Errno e, 4323 void *response, size_t responseLen) { 4324 #if VDBG 4325 RLOGD("acknowledgeLastIncomingGsmSmsResponse: serial %d", serial); 4326 #endif 4327 4328 if (radioService[slotId]->mRadioResponse != NULL) { 4329 RadioResponseInfo responseInfo = {}; 4330 populateResponseInfo(responseInfo, serial, responseType, e); 4331 Return<void> retStatus = 4332 radioService[slotId]->mRadioResponse->acknowledgeLastIncomingGsmSmsResponse( 4333 responseInfo); 4334 radioService[slotId]->checkReturnStatus(retStatus); 4335 } else { 4336 RLOGE("acknowledgeLastIncomingGsmSmsResponse: radioService[%d]->mRadioResponse " 4337 "== NULL", slotId); 4338 } 4339 4340 return 0; 4341 } 4342 4343 int radio::acceptCallResponse(int slotId, 4344 int responseType, int serial, RIL_Errno e, 4345 void *response, size_t responseLen) { 4346 #if VDBG 4347 RLOGD("acceptCallResponse: serial %d", serial); 4348 #endif 4349 4350 if (radioService[slotId]->mRadioResponse != NULL) { 4351 RadioResponseInfo responseInfo = {}; 4352 populateResponseInfo(responseInfo, serial, responseType, e); 4353 Return<void> retStatus = radioService[slotId]->mRadioResponse->acceptCallResponse( 4354 responseInfo); 4355 radioService[slotId]->checkReturnStatus(retStatus); 4356 } else { 4357 RLOGE("acceptCallResponse: radioService[%d]->mRadioResponse == NULL", 4358 slotId); 4359 } 4360 4361 return 0; 4362 } 4363 4364 int radio::deactivateDataCallResponse(int slotId, 4365 int responseType, int serial, RIL_Errno e, 4366 void *response, size_t responseLen) { 4367 #if VDBG 4368 RLOGD("deactivateDataCallResponse: serial %d", serial); 4369 #endif 4370 4371 if (radioService[slotId]->mRadioResponse != NULL) { 4372 RadioResponseInfo responseInfo = {}; 4373 populateResponseInfo(responseInfo, serial, responseType, e); 4374 Return<void> retStatus = radioService[slotId]->mRadioResponse->deactivateDataCallResponse( 4375 responseInfo); 4376 radioService[slotId]->checkReturnStatus(retStatus); 4377 } else { 4378 RLOGE("deactivateDataCallResponse: radioService[%d]->mRadioResponse == NULL", 4379 slotId); 4380 } 4381 4382 return 0; 4383 } 4384 4385 int radio::getFacilityLockForAppResponse(int slotId, 4386 int responseType, int serial, RIL_Errno e, 4387 void *response, size_t responseLen) { 4388 #if VDBG 4389 RLOGD("getFacilityLockForAppResponse: serial %d", serial); 4390 #endif 4391 4392 if (radioService[slotId]->mRadioResponse != NULL) { 4393 RadioResponseInfo responseInfo = {}; 4394 int ret = responseInt(responseInfo, serial, responseType, e, response, responseLen); 4395 Return<void> retStatus = radioService[slotId]->mRadioResponse-> 4396 getFacilityLockForAppResponse(responseInfo, ret); 4397 radioService[slotId]->checkReturnStatus(retStatus); 4398 } else { 4399 RLOGE("getFacilityLockForAppResponse: radioService[%d]->mRadioResponse == NULL", 4400 slotId); 4401 } 4402 4403 return 0; 4404 } 4405 4406 int radio::setFacilityLockForAppResponse(int slotId, 4407 int responseType, int serial, RIL_Errno e, 4408 void *response, size_t responseLen) { 4409 #if VDBG 4410 RLOGD("setFacilityLockForAppResponse: serial %d", serial); 4411 #endif 4412 4413 if (radioService[slotId]->mRadioResponse != NULL) { 4414 RadioResponseInfo responseInfo = {}; 4415 int ret = responseIntOrEmpty(responseInfo, serial, responseType, e, response, responseLen); 4416 Return<void> retStatus 4417 = radioService[slotId]->mRadioResponse->setFacilityLockForAppResponse(responseInfo, 4418 ret); 4419 radioService[slotId]->checkReturnStatus(retStatus); 4420 } else { 4421 RLOGE("setFacilityLockForAppResponse: radioService[%d]->mRadioResponse == NULL", 4422 slotId); 4423 } 4424 4425 return 0; 4426 } 4427 4428 int radio::setBarringPasswordResponse(int slotId, 4429 int responseType, int serial, RIL_Errno e, 4430 void *response, size_t responseLen) { 4431 #if VDBG 4432 RLOGD("acceptCallResponse: serial %d", serial); 4433 #endif 4434 4435 if (radioService[slotId]->mRadioResponse != NULL) { 4436 RadioResponseInfo responseInfo = {}; 4437 populateResponseInfo(responseInfo, serial, responseType, e); 4438 Return<void> retStatus 4439 = radioService[slotId]->mRadioResponse->setBarringPasswordResponse(responseInfo); 4440 radioService[slotId]->checkReturnStatus(retStatus); 4441 } else { 4442 RLOGE("setBarringPasswordResponse: radioService[%d]->mRadioResponse == NULL", 4443 slotId); 4444 } 4445 4446 return 0; 4447 } 4448 4449 int radio::getNetworkSelectionModeResponse(int slotId, 4450 int responseType, int serial, RIL_Errno e, void *response, 4451 size_t responseLen) { 4452 #if VDBG 4453 RLOGD("getNetworkSelectionModeResponse: serial %d", serial); 4454 #endif 4455 4456 if (radioService[slotId]->mRadioResponse != NULL) { 4457 RadioResponseInfo responseInfo = {}; 4458 populateResponseInfo(responseInfo, serial, responseType, e); 4459 bool manual = false; 4460 if (response == NULL || responseLen != sizeof(int)) { 4461 RLOGE("getNetworkSelectionModeResponse Invalid response: NULL"); 4462 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE; 4463 } else { 4464 int *pInt = (int *) response; 4465 manual = pInt[0] == 1 ? true : false; 4466 } 4467 Return<void> retStatus 4468 = radioService[slotId]->mRadioResponse->getNetworkSelectionModeResponse( 4469 responseInfo, 4470 manual); 4471 radioService[slotId]->checkReturnStatus(retStatus); 4472 } else { 4473 RLOGE("getNetworkSelectionModeResponse: radioService[%d]->mRadioResponse == NULL", 4474 slotId); 4475 } 4476 4477 return 0; 4478 } 4479 4480 int radio::setNetworkSelectionModeAutomaticResponse(int slotId, int responseType, int serial, 4481 RIL_Errno e, void *response, 4482 size_t responseLen) { 4483 #if VDBG 4484 RLOGD("setNetworkSelectionModeAutomaticResponse: serial %d", serial); 4485 #endif 4486 4487 if (radioService[slotId]->mRadioResponse != NULL) { 4488 RadioResponseInfo responseInfo = {}; 4489 populateResponseInfo(responseInfo, serial, responseType, e); 4490 Return<void> retStatus 4491 = radioService[slotId]->mRadioResponse->setNetworkSelectionModeAutomaticResponse( 4492 responseInfo); 4493 radioService[slotId]->checkReturnStatus(retStatus); 4494 } else { 4495 RLOGE("setNetworkSelectionModeAutomaticResponse: radioService[%d]->mRadioResponse " 4496 "== NULL", slotId); 4497 } 4498 4499 return 0; 4500 } 4501 4502 int radio::setNetworkSelectionModeManualResponse(int slotId, 4503 int responseType, int serial, RIL_Errno e, 4504 void *response, size_t responseLen) { 4505 #if VDBG 4506 RLOGD("setNetworkSelectionModeManualResponse: serial %d", serial); 4507 #endif 4508 4509 if (radioService[slotId]->mRadioResponse != NULL) { 4510 RadioResponseInfo responseInfo = {}; 4511 populateResponseInfo(responseInfo, serial, responseType, e); 4512 Return<void> retStatus 4513 = radioService[slotId]->mRadioResponse->setNetworkSelectionModeManualResponse( 4514 responseInfo); 4515 radioService[slotId]->checkReturnStatus(retStatus); 4516 } else { 4517 RLOGE("acceptCallResponse: radioService[%d]->setNetworkSelectionModeManualResponse " 4518 "== NULL", slotId); 4519 } 4520 4521 return 0; 4522 } 4523 4524 int convertOperatorStatusToInt(const char *str) { 4525 if (strncmp("unknown", str, 9) == 0) { 4526 return (int) OperatorStatus::UNKNOWN; 4527 } else if (strncmp("available", str, 9) == 0) { 4528 return (int) OperatorStatus::AVAILABLE; 4529 } else if (strncmp("current", str, 9) == 0) { 4530 return (int) OperatorStatus::CURRENT; 4531 } else if (strncmp("forbidden", str, 9) == 0) { 4532 return (int) OperatorStatus::FORBIDDEN; 4533 } else { 4534 return -1; 4535 } 4536 } 4537 4538 int radio::getAvailableNetworksResponse(int slotId, 4539 int responseType, int serial, RIL_Errno e, void *response, 4540 size_t responseLen) { 4541 #if VDBG 4542 RLOGD("getAvailableNetworksResponse: serial %d", serial); 4543 #endif 4544 4545 if (radioService[slotId]->mRadioResponse != NULL) { 4546 RadioResponseInfo responseInfo = {}; 4547 populateResponseInfo(responseInfo, serial, responseType, e); 4548 hidl_vec<OperatorInfo> networks; 4549 if ((response == NULL && responseLen != 0) 4550 || responseLen % (4 * sizeof(char *))!= 0) { 4551 RLOGE("getAvailableNetworksResponse Invalid response: NULL"); 4552 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE; 4553 } else { 4554 char **resp = (char **) response; 4555 int numStrings = responseLen / sizeof(char *); 4556 networks.resize(numStrings/4); 4557 for (int i = 0, j = 0; i < numStrings; i = i + 4, j++) { 4558 networks[j].alphaLong = convertCharPtrToHidlString(resp[i]); 4559 networks[j].alphaShort = convertCharPtrToHidlString(resp[i + 1]); 4560 networks[j].operatorNumeric = convertCharPtrToHidlString(resp[i + 2]); 4561 int status = convertOperatorStatusToInt(resp[i + 3]); 4562 if (status == -1) { 4563 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE; 4564 } else { 4565 networks[j].status = (OperatorStatus) status; 4566 } 4567 } 4568 } 4569 Return<void> retStatus 4570 = radioService[slotId]->mRadioResponse->getAvailableNetworksResponse(responseInfo, 4571 networks); 4572 radioService[slotId]->checkReturnStatus(retStatus); 4573 } else { 4574 RLOGE("getAvailableNetworksResponse: radioService[%d]->mRadioResponse == NULL", 4575 slotId); 4576 } 4577 4578 return 0; 4579 } 4580 4581 int radio::startDtmfResponse(int slotId, 4582 int responseType, int serial, RIL_Errno e, 4583 void *response, size_t responseLen) { 4584 #if VDBG 4585 RLOGD("startDtmfResponse: serial %d", serial); 4586 #endif 4587 4588 if (radioService[slotId]->mRadioResponse != NULL) { 4589 RadioResponseInfo responseInfo = {}; 4590 populateResponseInfo(responseInfo, serial, responseType, e); 4591 Return<void> retStatus 4592 = radioService[slotId]->mRadioResponse->startDtmfResponse(responseInfo); 4593 radioService[slotId]->checkReturnStatus(retStatus); 4594 } else { 4595 RLOGE("startDtmfResponse: radioService[%d]->mRadioResponse == NULL", slotId); 4596 } 4597 4598 return 0; 4599 } 4600 4601 int radio::stopDtmfResponse(int slotId, 4602 int responseType, int serial, RIL_Errno e, 4603 void *response, size_t responseLen) { 4604 #if VDBG 4605 RLOGD("stopDtmfResponse: serial %d", serial); 4606 #endif 4607 4608 if (radioService[slotId]->mRadioResponse != NULL) { 4609 RadioResponseInfo responseInfo = {}; 4610 populateResponseInfo(responseInfo, serial, responseType, e); 4611 Return<void> retStatus 4612 = radioService[slotId]->mRadioResponse->stopDtmfResponse(responseInfo); 4613 radioService[slotId]->checkReturnStatus(retStatus); 4614 } else { 4615 RLOGE("stopDtmfResponse: radioService[%d]->mRadioResponse == NULL", slotId); 4616 } 4617 4618 return 0; 4619 } 4620 4621 int radio::getBasebandVersionResponse(int slotId, 4622 int responseType, int serial, RIL_Errno e, 4623 void *response, size_t responseLen) { 4624 #if VDBG 4625 RLOGD("getBasebandVersionResponse: serial %d", serial); 4626 #endif 4627 4628 if (radioService[slotId]->mRadioResponse != NULL) { 4629 RadioResponseInfo responseInfo = {}; 4630 populateResponseInfo(responseInfo, serial, responseType, e); 4631 Return<void> retStatus 4632 = radioService[slotId]->mRadioResponse->getBasebandVersionResponse(responseInfo, 4633 convertCharPtrToHidlString((char *) response)); 4634 radioService[slotId]->checkReturnStatus(retStatus); 4635 } else { 4636 RLOGE("getBasebandVersionResponse: radioService[%d]->mRadioResponse == NULL", slotId); 4637 } 4638 4639 return 0; 4640 } 4641 4642 int radio::separateConnectionResponse(int slotId, 4643 int responseType, int serial, RIL_Errno e, 4644 void *response, size_t responseLen) { 4645 #if VDBG 4646 RLOGD("separateConnectionResponse: serial %d", serial); 4647 #endif 4648 4649 if (radioService[slotId]->mRadioResponse != NULL) { 4650 RadioResponseInfo responseInfo = {}; 4651 populateResponseInfo(responseInfo, serial, responseType, e); 4652 Return<void> retStatus 4653 = radioService[slotId]->mRadioResponse->separateConnectionResponse(responseInfo); 4654 radioService[slotId]->checkReturnStatus(retStatus); 4655 } else { 4656 RLOGE("separateConnectionResponse: radioService[%d]->mRadioResponse == NULL", 4657 slotId); 4658 } 4659 4660 return 0; 4661 } 4662 4663 int radio::setMuteResponse(int slotId, 4664 int responseType, int serial, RIL_Errno e, 4665 void *response, size_t responseLen) { 4666 #if VDBG 4667 RLOGD("setMuteResponse: serial %d", serial); 4668 #endif 4669 4670 if (radioService[slotId]->mRadioResponse != NULL) { 4671 RadioResponseInfo responseInfo = {}; 4672 populateResponseInfo(responseInfo, serial, responseType, e); 4673 Return<void> retStatus 4674 = radioService[slotId]->mRadioResponse->setMuteResponse(responseInfo); 4675 radioService[slotId]->checkReturnStatus(retStatus); 4676 } else { 4677 RLOGE("setMuteResponse: radioService[%d]->mRadioResponse == NULL", slotId); 4678 } 4679 4680 return 0; 4681 } 4682 4683 int radio::getMuteResponse(int slotId, 4684 int responseType, int serial, RIL_Errno e, void *response, 4685 size_t responseLen) { 4686 #if VDBG 4687 RLOGD("getMuteResponse: serial %d", serial); 4688 #endif 4689 4690 if (radioService[slotId]->mRadioResponse != NULL) { 4691 RadioResponseInfo responseInfo = {}; 4692 populateResponseInfo(responseInfo, serial, responseType, e); 4693 bool enable = false; 4694 if (response == NULL || responseLen != sizeof(int)) { 4695 RLOGE("getMuteResponse Invalid response: NULL"); 4696 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE; 4697 } else { 4698 int *pInt = (int *) response; 4699 enable = pInt[0] == 1 ? true : false; 4700 } 4701 Return<void> retStatus = radioService[slotId]->mRadioResponse->getMuteResponse(responseInfo, 4702 enable); 4703 radioService[slotId]->checkReturnStatus(retStatus); 4704 } else { 4705 RLOGE("getMuteResponse: radioService[%d]->mRadioResponse == NULL", slotId); 4706 } 4707 4708 return 0; 4709 } 4710 4711 int radio::getClipResponse(int slotId, 4712 int responseType, int serial, RIL_Errno e, 4713 void *response, size_t responseLen) { 4714 #if VDBG 4715 RLOGD("getClipResponse: serial %d", serial); 4716 #endif 4717 4718 if (radioService[slotId]->mRadioResponse != NULL) { 4719 RadioResponseInfo responseInfo = {}; 4720 int ret = responseInt(responseInfo, serial, responseType, e, response, responseLen); 4721 Return<void> retStatus = radioService[slotId]->mRadioResponse->getClipResponse(responseInfo, 4722 (ClipStatus) ret); 4723 radioService[slotId]->checkReturnStatus(retStatus); 4724 } else { 4725 RLOGE("getClipResponse: radioService[%d]->mRadioResponse == NULL", slotId); 4726 } 4727 4728 return 0; 4729 } 4730 4731 int radio::getDataCallListResponse(int slotId, 4732 int responseType, int serial, RIL_Errno e, 4733 void *response, size_t responseLen) { 4734 #if VDBG 4735 RLOGD("getDataCallListResponse: serial %d", serial); 4736 #endif 4737 4738 if (radioService[slotId]->mRadioResponse != NULL) { 4739 RadioResponseInfo responseInfo = {}; 4740 populateResponseInfo(responseInfo, serial, responseType, e); 4741 4742 hidl_vec<SetupDataCallResult> ret; 4743 if ((response == NULL && responseLen != 0) 4744 || responseLen % sizeof(RIL_Data_Call_Response_v11) != 0) { 4745 RLOGE("getDataCallListResponse: invalid response"); 4746 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE; 4747 } else { 4748 convertRilDataCallListToHal(response, responseLen, ret); 4749 } 4750 4751 Return<void> retStatus = radioService[slotId]->mRadioResponse->getDataCallListResponse( 4752 responseInfo, ret); 4753 radioService[slotId]->checkReturnStatus(retStatus); 4754 } else { 4755 RLOGE("getDataCallListResponse: radioService[%d]->mRadioResponse == NULL", slotId); 4756 } 4757 4758 return 0; 4759 } 4760 4761 int radio::setSuppServiceNotificationsResponse(int slotId, 4762 int responseType, int serial, RIL_Errno e, 4763 void *response, size_t responseLen) { 4764 #if VDBG 4765 RLOGD("setSuppServiceNotificationsResponse: serial %d", serial); 4766 #endif 4767 4768 if (radioService[slotId]->mRadioResponse != NULL) { 4769 RadioResponseInfo responseInfo = {}; 4770 populateResponseInfo(responseInfo, serial, responseType, e); 4771 Return<void> retStatus 4772 = radioService[slotId]->mRadioResponse->setSuppServiceNotificationsResponse( 4773 responseInfo); 4774 radioService[slotId]->checkReturnStatus(retStatus); 4775 } else { 4776 RLOGE("setSuppServiceNotificationsResponse: radioService[%d]->mRadioResponse " 4777 "== NULL", slotId); 4778 } 4779 4780 return 0; 4781 } 4782 4783 int radio::deleteSmsOnSimResponse(int slotId, 4784 int responseType, int serial, RIL_Errno e, 4785 void *response, size_t responseLen) { 4786 #if VDBG 4787 RLOGD("deleteSmsOnSimResponse: serial %d", serial); 4788 #endif 4789 4790 if (radioService[slotId]->mRadioResponse != NULL) { 4791 RadioResponseInfo responseInfo = {}; 4792 populateResponseInfo(responseInfo, serial, responseType, e); 4793 Return<void> retStatus 4794 = radioService[slotId]->mRadioResponse->deleteSmsOnSimResponse(responseInfo); 4795 radioService[slotId]->checkReturnStatus(retStatus); 4796 } else { 4797 RLOGE("deleteSmsOnSimResponse: radioService[%d]->mRadioResponse == NULL", slotId); 4798 } 4799 4800 return 0; 4801 } 4802 4803 int radio::setBandModeResponse(int slotId, 4804 int responseType, int serial, RIL_Errno e, 4805 void *response, size_t responseLen) { 4806 #if VDBG 4807 RLOGD("setBandModeResponse: serial %d", serial); 4808 #endif 4809 4810 if (radioService[slotId]->mRadioResponse != NULL) { 4811 RadioResponseInfo responseInfo = {}; 4812 populateResponseInfo(responseInfo, serial, responseType, e); 4813 Return<void> retStatus 4814 = radioService[slotId]->mRadioResponse->setBandModeResponse(responseInfo); 4815 radioService[slotId]->checkReturnStatus(retStatus); 4816 } else { 4817 RLOGE("setBandModeResponse: radioService[%d]->mRadioResponse == NULL", slotId); 4818 } 4819 4820 return 0; 4821 } 4822 4823 int radio::writeSmsToSimResponse(int slotId, 4824 int responseType, int serial, RIL_Errno e, 4825 void *response, size_t responseLen) { 4826 #if VDBG 4827 RLOGD("writeSmsToSimResponse: serial %d", serial); 4828 #endif 4829 4830 if (radioService[slotId]->mRadioResponse != NULL) { 4831 RadioResponseInfo responseInfo = {}; 4832 int ret = responseInt(responseInfo, serial, responseType, e, response, responseLen); 4833 Return<void> retStatus 4834 = radioService[slotId]->mRadioResponse->writeSmsToSimResponse(responseInfo, ret); 4835 radioService[slotId]->checkReturnStatus(retStatus); 4836 } else { 4837 RLOGE("writeSmsToSimResponse: radioService[%d]->mRadioResponse == NULL", slotId); 4838 } 4839 4840 return 0; 4841 } 4842 4843 int radio::getAvailableBandModesResponse(int slotId, 4844 int responseType, int serial, RIL_Errno e, void *response, 4845 size_t responseLen) { 4846 #if VDBG 4847 RLOGD("getAvailableBandModesResponse: serial %d", serial); 4848 #endif 4849 4850 if (radioService[slotId]->mRadioResponse != NULL) { 4851 RadioResponseInfo responseInfo = {}; 4852 populateResponseInfo(responseInfo, serial, responseType, e); 4853 hidl_vec<RadioBandMode> modes; 4854 if ((response == NULL && responseLen != 0)|| responseLen % sizeof(int) != 0) { 4855 RLOGE("getAvailableBandModesResponse Invalid response: NULL"); 4856 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE; 4857 } else { 4858 int *pInt = (int *) response; 4859 int numInts = responseLen / sizeof(int); 4860 modes.resize(numInts); 4861 for (int i = 0; i < numInts; i++) { 4862 modes[i] = (RadioBandMode) pInt[i]; 4863 } 4864 } 4865 Return<void> retStatus 4866 = radioService[slotId]->mRadioResponse->getAvailableBandModesResponse(responseInfo, 4867 modes); 4868 radioService[slotId]->checkReturnStatus(retStatus); 4869 } else { 4870 RLOGE("getAvailableBandModesResponse: radioService[%d]->mRadioResponse == NULL", 4871 slotId); 4872 } 4873 4874 return 0; 4875 } 4876 4877 int radio::sendEnvelopeResponse(int slotId, 4878 int responseType, int serial, RIL_Errno e, 4879 void *response, size_t responseLen) { 4880 #if VDBG 4881 RLOGD("sendEnvelopeResponse: serial %d", serial); 4882 #endif 4883 4884 if (radioService[slotId]->mRadioResponse != NULL) { 4885 RadioResponseInfo responseInfo = {}; 4886 populateResponseInfo(responseInfo, serial, responseType, e); 4887 Return<void> retStatus 4888 = radioService[slotId]->mRadioResponse->sendEnvelopeResponse(responseInfo, 4889 convertCharPtrToHidlString((char *) response)); 4890 radioService[slotId]->checkReturnStatus(retStatus); 4891 } else { 4892 RLOGE("sendEnvelopeResponse: radioService[%d]->mRadioResponse == NULL", slotId); 4893 } 4894 4895 return 0; 4896 } 4897 4898 int radio::sendTerminalResponseToSimResponse(int slotId, 4899 int responseType, int serial, RIL_Errno e, 4900 void *response, size_t responseLen) { 4901 #if VDBG 4902 RLOGD("sendTerminalResponseToSimResponse: serial %d", serial); 4903 #endif 4904 4905 if (radioService[slotId]->mRadioResponse != NULL) { 4906 RadioResponseInfo responseInfo = {}; 4907 populateResponseInfo(responseInfo, serial, responseType, e); 4908 Return<void> retStatus 4909 = radioService[slotId]->mRadioResponse->sendTerminalResponseToSimResponse( 4910 responseInfo); 4911 radioService[slotId]->checkReturnStatus(retStatus); 4912 } else { 4913 RLOGE("sendTerminalResponseToSimResponse: radioService[%d]->mRadioResponse == NULL", 4914 slotId); 4915 } 4916 4917 return 0; 4918 } 4919 4920 int radio::handleStkCallSetupRequestFromSimResponse(int slotId, 4921 int responseType, int serial, 4922 RIL_Errno e, void *response, 4923 size_t responseLen) { 4924 #if VDBG 4925 RLOGD("handleStkCallSetupRequestFromSimResponse: serial %d", serial); 4926 #endif 4927 4928 if (radioService[slotId]->mRadioResponse != NULL) { 4929 RadioResponseInfo responseInfo = {}; 4930 populateResponseInfo(responseInfo, serial, responseType, e); 4931 Return<void> retStatus 4932 = radioService[slotId]->mRadioResponse->handleStkCallSetupRequestFromSimResponse( 4933 responseInfo); 4934 radioService[slotId]->checkReturnStatus(retStatus); 4935 } else { 4936 RLOGE("handleStkCallSetupRequestFromSimResponse: radioService[%d]->mRadioResponse " 4937 "== NULL", slotId); 4938 } 4939 4940 return 0; 4941 } 4942 4943 int radio::explicitCallTransferResponse(int slotId, 4944 int responseType, int serial, RIL_Errno e, 4945 void *response, size_t responseLen) { 4946 #if VDBG 4947 RLOGD("explicitCallTransferResponse: serial %d", serial); 4948 #endif 4949 4950 if (radioService[slotId]->mRadioResponse != NULL) { 4951 RadioResponseInfo responseInfo = {}; 4952 populateResponseInfo(responseInfo, serial, responseType, e); 4953 Return<void> retStatus 4954 = radioService[slotId]->mRadioResponse->explicitCallTransferResponse(responseInfo); 4955 radioService[slotId]->checkReturnStatus(retStatus); 4956 } else { 4957 RLOGE("explicitCallTransferResponse: radioService[%d]->mRadioResponse == NULL", 4958 slotId); 4959 } 4960 4961 return 0; 4962 } 4963 4964 int radio::setPreferredNetworkTypeResponse(int slotId, 4965 int responseType, int serial, RIL_Errno e, 4966 void *response, size_t responseLen) { 4967 #if VDBG 4968 RLOGD("setPreferredNetworkTypeResponse: serial %d", serial); 4969 #endif 4970 4971 if (radioService[slotId]->mRadioResponse != NULL) { 4972 RadioResponseInfo responseInfo = {}; 4973 populateResponseInfo(responseInfo, serial, responseType, e); 4974 Return<void> retStatus 4975 = radioService[slotId]->mRadioResponse->setPreferredNetworkTypeResponse( 4976 responseInfo); 4977 radioService[slotId]->checkReturnStatus(retStatus); 4978 } else { 4979 RLOGE("setPreferredNetworkTypeResponse: radioService[%d]->mRadioResponse == NULL", 4980 slotId); 4981 } 4982 4983 return 0; 4984 } 4985 4986 4987 int radio::getPreferredNetworkTypeResponse(int slotId, 4988 int responseType, int serial, RIL_Errno e, 4989 void *response, size_t responseLen) { 4990 #if VDBG 4991 RLOGD("getPreferredNetworkTypeResponse: serial %d", serial); 4992 #endif 4993 4994 if (radioService[slotId]->mRadioResponse != NULL) { 4995 RadioResponseInfo responseInfo = {}; 4996 int ret = responseInt(responseInfo, serial, responseType, e, response, responseLen); 4997 Return<void> retStatus 4998 = radioService[slotId]->mRadioResponse->getPreferredNetworkTypeResponse( 4999 responseInfo, (PreferredNetworkType) ret); 5000 radioService[slotId]->checkReturnStatus(retStatus); 5001 } else { 5002 RLOGE("getPreferredNetworkTypeResponse: radioService[%d]->mRadioResponse == NULL", 5003 slotId); 5004 } 5005 5006 return 0; 5007 } 5008 5009 int radio::getNeighboringCidsResponse(int slotId, 5010 int responseType, int serial, RIL_Errno e, 5011 void *response, size_t responseLen) { 5012 #if VDBG 5013 RLOGD("getNeighboringCidsResponse: serial %d", serial); 5014 #endif 5015 5016 if (radioService[slotId]->mRadioResponse != NULL) { 5017 RadioResponseInfo responseInfo = {}; 5018 populateResponseInfo(responseInfo, serial, responseType, e); 5019 hidl_vec<NeighboringCell> cells; 5020 5021 if ((response == NULL && responseLen != 0) 5022 || responseLen % sizeof(RIL_NeighboringCell *) != 0) { 5023 RLOGE("getNeighboringCidsResponse Invalid response: NULL"); 5024 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE; 5025 } else { 5026 int num = responseLen / sizeof(RIL_NeighboringCell *); 5027 cells.resize(num); 5028 for (int i = 0 ; i < num; i++) { 5029 RIL_NeighboringCell *resp = ((RIL_NeighboringCell **) response)[i]; 5030 cells[i].cid = convertCharPtrToHidlString(resp->cid); 5031 cells[i].rssi = resp->rssi; 5032 } 5033 } 5034 5035 Return<void> retStatus 5036 = radioService[slotId]->mRadioResponse->getNeighboringCidsResponse(responseInfo, 5037 cells); 5038 radioService[slotId]->checkReturnStatus(retStatus); 5039 } else { 5040 RLOGE("getNeighboringCidsResponse: radioService[%d]->mRadioResponse == NULL", 5041 slotId); 5042 } 5043 5044 return 0; 5045 } 5046 5047 int radio::setLocationUpdatesResponse(int slotId, 5048 int responseType, int serial, RIL_Errno e, 5049 void *response, size_t responseLen) { 5050 #if VDBG 5051 RLOGD("setLocationUpdatesResponse: serial %d", serial); 5052 #endif 5053 5054 if (radioService[slotId]->mRadioResponse != NULL) { 5055 RadioResponseInfo responseInfo = {}; 5056 populateResponseInfo(responseInfo, serial, responseType, e); 5057 Return<void> retStatus 5058 = radioService[slotId]->mRadioResponse->setLocationUpdatesResponse(responseInfo); 5059 radioService[slotId]->checkReturnStatus(retStatus); 5060 } else { 5061 RLOGE("setLocationUpdatesResponse: radioService[%d]->mRadioResponse == NULL", 5062 slotId); 5063 } 5064 5065 return 0; 5066 } 5067 5068 int radio::setCdmaSubscriptionSourceResponse(int slotId, 5069 int responseType, int serial, RIL_Errno e, 5070 void *response, size_t responseLen) { 5071 #if VDBG 5072 RLOGD("setCdmaSubscriptionSourceResponse: serial %d", serial); 5073 #endif 5074 5075 if (radioService[slotId]->mRadioResponse != NULL) { 5076 RadioResponseInfo responseInfo = {}; 5077 populateResponseInfo(responseInfo, serial, responseType, e); 5078 Return<void> retStatus 5079 = radioService[slotId]->mRadioResponse->setCdmaSubscriptionSourceResponse( 5080 responseInfo); 5081 radioService[slotId]->checkReturnStatus(retStatus); 5082 } else { 5083 RLOGE("setCdmaSubscriptionSourceResponse: radioService[%d]->mRadioResponse == NULL", 5084 slotId); 5085 } 5086 5087 return 0; 5088 } 5089 5090 int radio::setCdmaRoamingPreferenceResponse(int slotId, 5091 int responseType, int serial, RIL_Errno e, 5092 void *response, size_t responseLen) { 5093 #if VDBG 5094 RLOGD("setCdmaRoamingPreferenceResponse: serial %d", serial); 5095 #endif 5096 5097 if (radioService[slotId]->mRadioResponse != NULL) { 5098 RadioResponseInfo responseInfo = {}; 5099 populateResponseInfo(responseInfo, serial, responseType, e); 5100 Return<void> retStatus 5101 = radioService[slotId]->mRadioResponse->setCdmaRoamingPreferenceResponse( 5102 responseInfo); 5103 radioService[slotId]->checkReturnStatus(retStatus); 5104 } else { 5105 RLOGE("setCdmaRoamingPreferenceResponse: radioService[%d]->mRadioResponse == NULL", 5106 slotId); 5107 } 5108 5109 return 0; 5110 } 5111 5112 int radio::getCdmaRoamingPreferenceResponse(int slotId, 5113 int responseType, int serial, RIL_Errno e, 5114 void *response, size_t responseLen) { 5115 #if VDBG 5116 RLOGD("getCdmaRoamingPreferenceResponse: serial %d", serial); 5117 #endif 5118 5119 if (radioService[slotId]->mRadioResponse != NULL) { 5120 RadioResponseInfo responseInfo = {}; 5121 int ret = responseInt(responseInfo, serial, responseType, e, response, responseLen); 5122 Return<void> retStatus 5123 = radioService[slotId]->mRadioResponse->getCdmaRoamingPreferenceResponse( 5124 responseInfo, (CdmaRoamingType) ret); 5125 radioService[slotId]->checkReturnStatus(retStatus); 5126 } else { 5127 RLOGE("getCdmaRoamingPreferenceResponse: radioService[%d]->mRadioResponse == NULL", 5128 slotId); 5129 } 5130 5131 return 0; 5132 } 5133 5134 int radio::setTTYModeResponse(int slotId, 5135 int responseType, int serial, RIL_Errno e, 5136 void *response, size_t responseLen) { 5137 #if VDBG 5138 RLOGD("setTTYModeResponse: serial %d", serial); 5139 #endif 5140 5141 if (radioService[slotId]->mRadioResponse != NULL) { 5142 RadioResponseInfo responseInfo = {}; 5143 populateResponseInfo(responseInfo, serial, responseType, e); 5144 Return<void> retStatus 5145 = radioService[slotId]->mRadioResponse->setTTYModeResponse(responseInfo); 5146 radioService[slotId]->checkReturnStatus(retStatus); 5147 } else { 5148 RLOGE("setTTYModeResponse: radioService[%d]->mRadioResponse == NULL", slotId); 5149 } 5150 5151 return 0; 5152 } 5153 5154 int radio::getTTYModeResponse(int slotId, 5155 int responseType, int serial, RIL_Errno e, 5156 void *response, size_t responseLen) { 5157 #if VDBG 5158 RLOGD("getTTYModeResponse: serial %d", serial); 5159 #endif 5160 5161 if (radioService[slotId]->mRadioResponse != NULL) { 5162 RadioResponseInfo responseInfo = {}; 5163 int ret = responseInt(responseInfo, serial, responseType, e, response, responseLen); 5164 Return<void> retStatus 5165 = radioService[slotId]->mRadioResponse->getTTYModeResponse(responseInfo, 5166 (TtyMode) ret); 5167 radioService[slotId]->checkReturnStatus(retStatus); 5168 } else { 5169 RLOGE("getTTYModeResponse: radioService[%d]->mRadioResponse == NULL", slotId); 5170 } 5171 5172 return 0; 5173 } 5174 5175 int radio::setPreferredVoicePrivacyResponse(int slotId, 5176 int responseType, int serial, RIL_Errno e, 5177 void *response, size_t responseLen) { 5178 #if VDBG 5179 RLOGD("setPreferredVoicePrivacyResponse: serial %d", serial); 5180 #endif 5181 5182 if (radioService[slotId]->mRadioResponse != NULL) { 5183 RadioResponseInfo responseInfo = {}; 5184 populateResponseInfo(responseInfo, serial, responseType, e); 5185 Return<void> retStatus 5186 = radioService[slotId]->mRadioResponse->setPreferredVoicePrivacyResponse( 5187 responseInfo); 5188 radioService[slotId]->checkReturnStatus(retStatus); 5189 } else { 5190 RLOGE("setPreferredVoicePrivacyResponse: radioService[%d]->mRadioResponse == NULL", 5191 slotId); 5192 } 5193 5194 return 0; 5195 } 5196 5197 int radio::getPreferredVoicePrivacyResponse(int slotId, 5198 int responseType, int serial, RIL_Errno e, 5199 void *response, size_t responseLen) { 5200 #if VDBG 5201 RLOGD("getPreferredVoicePrivacyResponse: serial %d", serial); 5202 #endif 5203 5204 if (radioService[slotId]->mRadioResponse != NULL) { 5205 RadioResponseInfo responseInfo = {}; 5206 populateResponseInfo(responseInfo, serial, responseType, e); 5207 bool enable = false; 5208 int numInts = responseLen / sizeof(int); 5209 if (response == NULL || numInts != 1) { 5210 RLOGE("getPreferredVoicePrivacyResponse Invalid response: NULL"); 5211 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE; 5212 } else { 5213 int *pInt = (int *) response; 5214 enable = pInt[0] == 1 ? true : false; 5215 } 5216 Return<void> retStatus 5217 = radioService[slotId]->mRadioResponse->getPreferredVoicePrivacyResponse( 5218 responseInfo, enable); 5219 radioService[slotId]->checkReturnStatus(retStatus); 5220 } else { 5221 RLOGE("getPreferredVoicePrivacyResponse: radioService[%d]->mRadioResponse == NULL", 5222 slotId); 5223 } 5224 5225 return 0; 5226 } 5227 5228 int radio::sendCDMAFeatureCodeResponse(int slotId, 5229 int responseType, int serial, RIL_Errno e, 5230 void *response, size_t responseLen) { 5231 #if VDBG 5232 RLOGD("sendCDMAFeatureCodeResponse: serial %d", serial); 5233 #endif 5234 5235 if (radioService[slotId]->mRadioResponse != NULL) { 5236 RadioResponseInfo responseInfo = {}; 5237 populateResponseInfo(responseInfo, serial, responseType, e); 5238 Return<void> retStatus 5239 = radioService[slotId]->mRadioResponse->sendCDMAFeatureCodeResponse(responseInfo); 5240 radioService[slotId]->checkReturnStatus(retStatus); 5241 } else { 5242 RLOGE("sendCDMAFeatureCodeResponse: radioService[%d]->mRadioResponse == NULL", 5243 slotId); 5244 } 5245 5246 return 0; 5247 } 5248 5249 int radio::sendBurstDtmfResponse(int slotId, 5250 int responseType, int serial, RIL_Errno e, 5251 void *response, size_t responseLen) { 5252 #if VDBG 5253 RLOGD("sendBurstDtmfResponse: serial %d", serial); 5254 #endif 5255 5256 if (radioService[slotId]->mRadioResponse != NULL) { 5257 RadioResponseInfo responseInfo = {}; 5258 populateResponseInfo(responseInfo, serial, responseType, e); 5259 Return<void> retStatus 5260 = radioService[slotId]->mRadioResponse->sendBurstDtmfResponse(responseInfo); 5261 radioService[slotId]->checkReturnStatus(retStatus); 5262 } else { 5263 RLOGE("sendBurstDtmfResponse: radioService[%d]->mRadioResponse == NULL", slotId); 5264 } 5265 5266 return 0; 5267 } 5268 5269 int radio::sendCdmaSmsResponse(int slotId, 5270 int responseType, int serial, RIL_Errno e, void *response, 5271 size_t responseLen) { 5272 #if VDBG 5273 RLOGD("sendCdmaSmsResponse: serial %d", serial); 5274 #endif 5275 5276 if (radioService[slotId]->mRadioResponse != NULL) { 5277 RadioResponseInfo responseInfo = {}; 5278 SendSmsResult result = makeSendSmsResult(responseInfo, serial, responseType, e, response, 5279 responseLen); 5280 5281 Return<void> retStatus 5282 = radioService[slotId]->mRadioResponse->sendCdmaSmsResponse(responseInfo, result); 5283 radioService[slotId]->checkReturnStatus(retStatus); 5284 } else { 5285 RLOGE("sendCdmaSmsResponse: radioService[%d]->mRadioResponse == NULL", slotId); 5286 } 5287 5288 return 0; 5289 } 5290 5291 int radio::acknowledgeLastIncomingCdmaSmsResponse(int slotId, 5292 int responseType, int serial, RIL_Errno e, 5293 void *response, size_t responseLen) { 5294 #if VDBG 5295 RLOGD("acknowledgeLastIncomingCdmaSmsResponse: serial %d", serial); 5296 #endif 5297 5298 if (radioService[slotId]->mRadioResponse != NULL) { 5299 RadioResponseInfo responseInfo = {}; 5300 populateResponseInfo(responseInfo, serial, responseType, e); 5301 Return<void> retStatus 5302 = radioService[slotId]->mRadioResponse->acknowledgeLastIncomingCdmaSmsResponse( 5303 responseInfo); 5304 radioService[slotId]->checkReturnStatus(retStatus); 5305 } else { 5306 RLOGE("acknowledgeLastIncomingCdmaSmsResponse: radioService[%d]->mRadioResponse " 5307 "== NULL", slotId); 5308 } 5309 5310 return 0; 5311 } 5312 5313 int radio::getGsmBroadcastConfigResponse(int slotId, 5314 int responseType, int serial, RIL_Errno e, 5315 void *response, size_t responseLen) { 5316 #if VDBG 5317 RLOGD("getGsmBroadcastConfigResponse: serial %d", serial); 5318 #endif 5319 5320 if (radioService[slotId]->mRadioResponse != NULL) { 5321 RadioResponseInfo responseInfo = {}; 5322 populateResponseInfo(responseInfo, serial, responseType, e); 5323 hidl_vec<GsmBroadcastSmsConfigInfo> configs; 5324 5325 if ((response == NULL && responseLen != 0) 5326 || responseLen % sizeof(RIL_GSM_BroadcastSmsConfigInfo *) != 0) { 5327 RLOGE("getGsmBroadcastConfigResponse Invalid response: NULL"); 5328 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE; 5329 } else { 5330 int num = responseLen / sizeof(RIL_GSM_BroadcastSmsConfigInfo *); 5331 configs.resize(num); 5332 for (int i = 0 ; i < num; i++) { 5333 RIL_GSM_BroadcastSmsConfigInfo *resp = 5334 ((RIL_GSM_BroadcastSmsConfigInfo **) response)[i]; 5335 configs[i].fromServiceId = resp->fromServiceId; 5336 configs[i].toServiceId = resp->toServiceId; 5337 configs[i].fromCodeScheme = resp->fromCodeScheme; 5338 configs[i].toCodeScheme = resp->toCodeScheme; 5339 configs[i].selected = resp->selected == 1 ? true : false; 5340 } 5341 } 5342 5343 Return<void> retStatus 5344 = radioService[slotId]->mRadioResponse->getGsmBroadcastConfigResponse(responseInfo, 5345 configs); 5346 radioService[slotId]->checkReturnStatus(retStatus); 5347 } else { 5348 RLOGE("getGsmBroadcastConfigResponse: radioService[%d]->mRadioResponse == NULL", 5349 slotId); 5350 } 5351 5352 return 0; 5353 } 5354 5355 int radio::setGsmBroadcastConfigResponse(int slotId, 5356 int responseType, int serial, RIL_Errno e, 5357 void *response, size_t responseLen) { 5358 #if VDBG 5359 RLOGD("setGsmBroadcastConfigResponse: serial %d", serial); 5360 #endif 5361 5362 if (radioService[slotId]->mRadioResponse != NULL) { 5363 RadioResponseInfo responseInfo = {}; 5364 populateResponseInfo(responseInfo, serial, responseType, e); 5365 Return<void> retStatus 5366 = radioService[slotId]->mRadioResponse->setGsmBroadcastConfigResponse(responseInfo); 5367 radioService[slotId]->checkReturnStatus(retStatus); 5368 } else { 5369 RLOGE("setGsmBroadcastConfigResponse: radioService[%d]->mRadioResponse == NULL", 5370 slotId); 5371 } 5372 5373 return 0; 5374 } 5375 5376 int radio::setGsmBroadcastActivationResponse(int slotId, 5377 int responseType, int serial, RIL_Errno e, 5378 void *response, size_t responseLen) { 5379 #if VDBG 5380 RLOGD("setGsmBroadcastActivationResponse: serial %d", serial); 5381 #endif 5382 5383 if (radioService[slotId]->mRadioResponse != NULL) { 5384 RadioResponseInfo responseInfo = {}; 5385 populateResponseInfo(responseInfo, serial, responseType, e); 5386 Return<void> retStatus 5387 = radioService[slotId]->mRadioResponse->setGsmBroadcastActivationResponse( 5388 responseInfo); 5389 radioService[slotId]->checkReturnStatus(retStatus); 5390 } else { 5391 RLOGE("setGsmBroadcastActivationResponse: radioService[%d]->mRadioResponse == NULL", 5392 slotId); 5393 } 5394 5395 return 0; 5396 } 5397 5398 int radio::getCdmaBroadcastConfigResponse(int slotId, 5399 int responseType, int serial, RIL_Errno e, 5400 void *response, size_t responseLen) { 5401 #if VDBG 5402 RLOGD("getCdmaBroadcastConfigResponse: serial %d", serial); 5403 #endif 5404 5405 if (radioService[slotId]->mRadioResponse != NULL) { 5406 RadioResponseInfo responseInfo = {}; 5407 populateResponseInfo(responseInfo, serial, responseType, e); 5408 hidl_vec<CdmaBroadcastSmsConfigInfo> configs; 5409 5410 if ((response == NULL && responseLen != 0) 5411 || responseLen % sizeof(RIL_CDMA_BroadcastSmsConfigInfo *) != 0) { 5412 RLOGE("getCdmaBroadcastConfigResponse Invalid response: NULL"); 5413 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE; 5414 } else { 5415 int num = responseLen / sizeof(RIL_CDMA_BroadcastSmsConfigInfo *); 5416 configs.resize(num); 5417 for (int i = 0 ; i < num; i++) { 5418 RIL_CDMA_BroadcastSmsConfigInfo *resp = 5419 ((RIL_CDMA_BroadcastSmsConfigInfo **) response)[i]; 5420 configs[i].serviceCategory = resp->service_category; 5421 configs[i].language = resp->language; 5422 configs[i].selected = resp->selected == 1 ? true : false; 5423 } 5424 } 5425 5426 Return<void> retStatus 5427 = radioService[slotId]->mRadioResponse->getCdmaBroadcastConfigResponse(responseInfo, 5428 configs); 5429 radioService[slotId]->checkReturnStatus(retStatus); 5430 } else { 5431 RLOGE("getCdmaBroadcastConfigResponse: radioService[%d]->mRadioResponse == NULL", 5432 slotId); 5433 } 5434 5435 return 0; 5436 } 5437 5438 int radio::setCdmaBroadcastConfigResponse(int slotId, 5439 int responseType, int serial, RIL_Errno e, 5440 void *response, size_t responseLen) { 5441 #if VDBG 5442 RLOGD("setCdmaBroadcastConfigResponse: serial %d", serial); 5443 #endif 5444 5445 if (radioService[slotId]->mRadioResponse != NULL) { 5446 RadioResponseInfo responseInfo = {}; 5447 populateResponseInfo(responseInfo, serial, responseType, e); 5448 Return<void> retStatus 5449 = radioService[slotId]->mRadioResponse->setCdmaBroadcastConfigResponse( 5450 responseInfo); 5451 radioService[slotId]->checkReturnStatus(retStatus); 5452 } else { 5453 RLOGE("setCdmaBroadcastConfigResponse: radioService[%d]->mRadioResponse == NULL", 5454 slotId); 5455 } 5456 5457 return 0; 5458 } 5459 5460 int radio::setCdmaBroadcastActivationResponse(int slotId, 5461 int responseType, int serial, RIL_Errno e, 5462 void *response, size_t responseLen) { 5463 #if VDBG 5464 RLOGD("setCdmaBroadcastActivationResponse: serial %d", serial); 5465 #endif 5466 5467 if (radioService[slotId]->mRadioResponse != NULL) { 5468 RadioResponseInfo responseInfo = {}; 5469 populateResponseInfo(responseInfo, serial, responseType, e); 5470 Return<void> retStatus 5471 = radioService[slotId]->mRadioResponse->setCdmaBroadcastActivationResponse( 5472 responseInfo); 5473 radioService[slotId]->checkReturnStatus(retStatus); 5474 } else { 5475 RLOGE("setCdmaBroadcastActivationResponse: radioService[%d]->mRadioResponse == NULL", 5476 slotId); 5477 } 5478 5479 return 0; 5480 } 5481 5482 int radio::getCDMASubscriptionResponse(int slotId, 5483 int responseType, int serial, RIL_Errno e, void *response, 5484 size_t responseLen) { 5485 #if VDBG 5486 RLOGD("getCDMASubscriptionResponse: serial %d", serial); 5487 #endif 5488 5489 if (radioService[slotId]->mRadioResponse != NULL) { 5490 RadioResponseInfo responseInfo = {}; 5491 populateResponseInfo(responseInfo, serial, responseType, e); 5492 5493 int numStrings = responseLen / sizeof(char *); 5494 hidl_string emptyString; 5495 if (response == NULL || numStrings != 5) { 5496 RLOGE("getOperatorResponse Invalid response: NULL"); 5497 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE; 5498 Return<void> retStatus 5499 = radioService[slotId]->mRadioResponse->getCDMASubscriptionResponse( 5500 responseInfo, emptyString, emptyString, emptyString, emptyString, emptyString); 5501 radioService[slotId]->checkReturnStatus(retStatus); 5502 } else { 5503 char **resp = (char **) response; 5504 Return<void> retStatus 5505 = radioService[slotId]->mRadioResponse->getCDMASubscriptionResponse( 5506 responseInfo, 5507 convertCharPtrToHidlString(resp[0]), 5508 convertCharPtrToHidlString(resp[1]), 5509 convertCharPtrToHidlString(resp[2]), 5510 convertCharPtrToHidlString(resp[3]), 5511 convertCharPtrToHidlString(resp[4])); 5512 radioService[slotId]->checkReturnStatus(retStatus); 5513 } 5514 } else { 5515 RLOGE("getCDMASubscriptionResponse: radioService[%d]->mRadioResponse == NULL", 5516 slotId); 5517 } 5518 5519 return 0; 5520 } 5521 5522 int radio::writeSmsToRuimResponse(int slotId, 5523 int responseType, int serial, RIL_Errno e, 5524 void *response, size_t responseLen) { 5525 #if VDBG 5526 RLOGD("writeSmsToRuimResponse: serial %d", serial); 5527 #endif 5528 5529 if (radioService[slotId]->mRadioResponse != NULL) { 5530 RadioResponseInfo responseInfo = {}; 5531 int ret = responseInt(responseInfo, serial, responseType, e, response, responseLen); 5532 Return<void> retStatus 5533 = radioService[slotId]->mRadioResponse->writeSmsToRuimResponse(responseInfo, ret); 5534 radioService[slotId]->checkReturnStatus(retStatus); 5535 } else { 5536 RLOGE("writeSmsToRuimResponse: radioService[%d]->mRadioResponse == NULL", slotId); 5537 } 5538 5539 return 0; 5540 } 5541 5542 int radio::deleteSmsOnRuimResponse(int slotId, 5543 int responseType, int serial, RIL_Errno e, 5544 void *response, size_t responseLen) { 5545 #if VDBG 5546 RLOGD("deleteSmsOnRuimResponse: serial %d", serial); 5547 #endif 5548 5549 if (radioService[slotId]->mRadioResponse != NULL) { 5550 RadioResponseInfo responseInfo = {}; 5551 populateResponseInfo(responseInfo, serial, responseType, e); 5552 Return<void> retStatus 5553 = radioService[slotId]->mRadioResponse->deleteSmsOnRuimResponse(responseInfo); 5554 radioService[slotId]->checkReturnStatus(retStatus); 5555 } else { 5556 RLOGE("deleteSmsOnRuimResponse: radioService[%d]->mRadioResponse == NULL", slotId); 5557 } 5558 5559 return 0; 5560 } 5561 5562 int radio::getDeviceIdentityResponse(int slotId, 5563 int responseType, int serial, RIL_Errno e, void *response, 5564 size_t responseLen) { 5565 #if VDBG 5566 RLOGD("getDeviceIdentityResponse: serial %d", serial); 5567 #endif 5568 5569 if (radioService[slotId]->mRadioResponse != NULL) { 5570 RadioResponseInfo responseInfo = {}; 5571 populateResponseInfo(responseInfo, serial, responseType, e); 5572 5573 int numStrings = responseLen / sizeof(char *); 5574 hidl_string emptyString; 5575 if (response == NULL || numStrings != 4) { 5576 RLOGE("getDeviceIdentityResponse Invalid response: NULL"); 5577 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE; 5578 Return<void> retStatus 5579 = radioService[slotId]->mRadioResponse->getDeviceIdentityResponse(responseInfo, 5580 emptyString, emptyString, emptyString, emptyString); 5581 radioService[slotId]->checkReturnStatus(retStatus); 5582 } else { 5583 char **resp = (char **) response; 5584 Return<void> retStatus 5585 = radioService[slotId]->mRadioResponse->getDeviceIdentityResponse(responseInfo, 5586 convertCharPtrToHidlString(resp[0]), 5587 convertCharPtrToHidlString(resp[1]), 5588 convertCharPtrToHidlString(resp[2]), 5589 convertCharPtrToHidlString(resp[3])); 5590 radioService[slotId]->checkReturnStatus(retStatus); 5591 } 5592 } else { 5593 RLOGE("getDeviceIdentityResponse: radioService[%d]->mRadioResponse == NULL", 5594 slotId); 5595 } 5596 5597 return 0; 5598 } 5599 5600 int radio::exitEmergencyCallbackModeResponse(int slotId, 5601 int responseType, int serial, RIL_Errno e, 5602 void *response, size_t responseLen) { 5603 #if VDBG 5604 RLOGD("exitEmergencyCallbackModeResponse: serial %d", serial); 5605 #endif 5606 5607 if (radioService[slotId]->mRadioResponse != NULL) { 5608 RadioResponseInfo responseInfo = {}; 5609 populateResponseInfo(responseInfo, serial, responseType, e); 5610 Return<void> retStatus 5611 = radioService[slotId]->mRadioResponse->exitEmergencyCallbackModeResponse( 5612 responseInfo); 5613 radioService[slotId]->checkReturnStatus(retStatus); 5614 } else { 5615 RLOGE("exitEmergencyCallbackModeResponse: radioService[%d]->mRadioResponse == NULL", 5616 slotId); 5617 } 5618 5619 return 0; 5620 } 5621 5622 int radio::getSmscAddressResponse(int slotId, 5623 int responseType, int serial, RIL_Errno e, 5624 void *response, size_t responseLen) { 5625 #if VDBG 5626 RLOGD("getSmscAddressResponse: serial %d", serial); 5627 #endif 5628 5629 if (radioService[slotId]->mRadioResponse != NULL) { 5630 RadioResponseInfo responseInfo = {}; 5631 populateResponseInfo(responseInfo, serial, responseType, e); 5632 Return<void> retStatus 5633 = radioService[slotId]->mRadioResponse->getSmscAddressResponse(responseInfo, 5634 convertCharPtrToHidlString((char *) response)); 5635 radioService[slotId]->checkReturnStatus(retStatus); 5636 } else { 5637 RLOGE("getSmscAddressResponse: radioService[%d]->mRadioResponse == NULL", slotId); 5638 } 5639 5640 return 0; 5641 } 5642 5643 int radio::setSmscAddressResponse(int slotId, 5644 int responseType, int serial, RIL_Errno e, 5645 void *response, size_t responseLen) { 5646 #if VDBG 5647 RLOGD("setSmscAddressResponse: serial %d", serial); 5648 #endif 5649 5650 if (radioService[slotId]->mRadioResponse != NULL) { 5651 RadioResponseInfo responseInfo = {}; 5652 populateResponseInfo(responseInfo, serial, responseType, e); 5653 Return<void> retStatus 5654 = radioService[slotId]->mRadioResponse->setSmscAddressResponse(responseInfo); 5655 radioService[slotId]->checkReturnStatus(retStatus); 5656 } else { 5657 RLOGE("setSmscAddressResponse: radioService[%d]->mRadioResponse == NULL", slotId); 5658 } 5659 5660 return 0; 5661 } 5662 5663 int radio::reportSmsMemoryStatusResponse(int slotId, 5664 int responseType, int serial, RIL_Errno e, 5665 void *response, size_t responseLen) { 5666 #if VDBG 5667 RLOGD("reportSmsMemoryStatusResponse: serial %d", serial); 5668 #endif 5669 5670 if (radioService[slotId]->mRadioResponse != NULL) { 5671 RadioResponseInfo responseInfo = {}; 5672 populateResponseInfo(responseInfo, serial, responseType, e); 5673 Return<void> retStatus 5674 = radioService[slotId]->mRadioResponse->reportSmsMemoryStatusResponse(responseInfo); 5675 radioService[slotId]->checkReturnStatus(retStatus); 5676 } else { 5677 RLOGE("reportSmsMemoryStatusResponse: radioService[%d]->mRadioResponse == NULL", 5678 slotId); 5679 } 5680 5681 return 0; 5682 } 5683 5684 int radio::reportStkServiceIsRunningResponse(int slotId, 5685 int responseType, int serial, RIL_Errno e, 5686 void *response, size_t responseLen) { 5687 #if VDBG 5688 RLOGD("reportStkServiceIsRunningResponse: serial %d", serial); 5689 #endif 5690 5691 if (radioService[slotId]->mRadioResponse != NULL) { 5692 RadioResponseInfo responseInfo = {}; 5693 populateResponseInfo(responseInfo, serial, responseType, e); 5694 Return<void> retStatus = radioService[slotId]->mRadioResponse-> 5695 reportStkServiceIsRunningResponse(responseInfo); 5696 radioService[slotId]->checkReturnStatus(retStatus); 5697 } else { 5698 RLOGE("reportStkServiceIsRunningResponse: radioService[%d]->mRadioResponse == NULL", 5699 slotId); 5700 } 5701 5702 return 0; 5703 } 5704 5705 int radio::getCdmaSubscriptionSourceResponse(int slotId, 5706 int responseType, int serial, RIL_Errno e, 5707 void *response, size_t responseLen) { 5708 #if VDBG 5709 RLOGD("getCdmaSubscriptionSourceResponse: serial %d", serial); 5710 #endif 5711 5712 if (radioService[slotId]->mRadioResponse != NULL) { 5713 RadioResponseInfo responseInfo = {}; 5714 int ret = responseInt(responseInfo, serial, responseType, e, response, responseLen); 5715 Return<void> retStatus 5716 = radioService[slotId]->mRadioResponse->getCdmaSubscriptionSourceResponse( 5717 responseInfo, (CdmaSubscriptionSource) ret); 5718 radioService[slotId]->checkReturnStatus(retStatus); 5719 } else { 5720 RLOGE("getCdmaSubscriptionSourceResponse: radioService[%d]->mRadioResponse == NULL", 5721 slotId); 5722 } 5723 5724 return 0; 5725 } 5726 5727 int radio::requestIsimAuthenticationResponse(int slotId, 5728 int responseType, int serial, RIL_Errno e, 5729 void *response, size_t responseLen) { 5730 #if VDBG 5731 RLOGD("requestIsimAuthenticationResponse: serial %d", serial); 5732 #endif 5733 5734 if (radioService[slotId]->mRadioResponse != NULL) { 5735 RadioResponseInfo responseInfo = {}; 5736 populateResponseInfo(responseInfo, serial, responseType, e); 5737 Return<void> retStatus 5738 = radioService[slotId]->mRadioResponse->requestIsimAuthenticationResponse( 5739 responseInfo, 5740 convertCharPtrToHidlString((char *) response)); 5741 radioService[slotId]->checkReturnStatus(retStatus); 5742 } else { 5743 RLOGE("requestIsimAuthenticationResponse: radioService[%d]->mRadioResponse == NULL", 5744 slotId); 5745 } 5746 5747 return 0; 5748 } 5749 5750 int radio::acknowledgeIncomingGsmSmsWithPduResponse(int slotId, 5751 int responseType, 5752 int serial, RIL_Errno e, void *response, 5753 size_t responseLen) { 5754 #if VDBG 5755 RLOGD("acknowledgeIncomingGsmSmsWithPduResponse: serial %d", serial); 5756 #endif 5757 5758 if (radioService[slotId]->mRadioResponse != NULL) { 5759 RadioResponseInfo responseInfo = {}; 5760 populateResponseInfo(responseInfo, serial, responseType, e); 5761 Return<void> retStatus 5762 = radioService[slotId]->mRadioResponse->acknowledgeIncomingGsmSmsWithPduResponse( 5763 responseInfo); 5764 radioService[slotId]->checkReturnStatus(retStatus); 5765 } else { 5766 RLOGE("acknowledgeIncomingGsmSmsWithPduResponse: radioService[%d]->mRadioResponse " 5767 "== NULL", slotId); 5768 } 5769 5770 return 0; 5771 } 5772 5773 int radio::sendEnvelopeWithStatusResponse(int slotId, 5774 int responseType, int serial, RIL_Errno e, void *response, 5775 size_t responseLen) { 5776 #if VDBG 5777 RLOGD("sendEnvelopeWithStatusResponse: serial %d", serial); 5778 #endif 5779 5780 if (radioService[slotId]->mRadioResponse != NULL) { 5781 RadioResponseInfo responseInfo = {}; 5782 IccIoResult result = responseIccIo(responseInfo, serial, responseType, e, 5783 response, responseLen); 5784 5785 Return<void> retStatus 5786 = radioService[slotId]->mRadioResponse->sendEnvelopeWithStatusResponse(responseInfo, 5787 result); 5788 radioService[slotId]->checkReturnStatus(retStatus); 5789 } else { 5790 RLOGE("sendEnvelopeWithStatusResponse: radioService[%d]->mRadioResponse == NULL", 5791 slotId); 5792 } 5793 5794 return 0; 5795 } 5796 5797 int radio::getVoiceRadioTechnologyResponse(int slotId, 5798 int responseType, int serial, RIL_Errno e, 5799 void *response, size_t responseLen) { 5800 #if VDBG 5801 RLOGD("getVoiceRadioTechnologyResponse: serial %d", serial); 5802 #endif 5803 5804 if (radioService[slotId]->mRadioResponse != NULL) { 5805 RadioResponseInfo responseInfo = {}; 5806 int ret = responseInt(responseInfo, serial, responseType, e, response, responseLen); 5807 Return<void> retStatus 5808 = radioService[slotId]->mRadioResponse->getVoiceRadioTechnologyResponse( 5809 responseInfo, (RadioTechnology) ret); 5810 radioService[slotId]->checkReturnStatus(retStatus); 5811 } else { 5812 RLOGE("getVoiceRadioTechnologyResponse: radioService[%d]->mRadioResponse == NULL", 5813 slotId); 5814 } 5815 5816 return 0; 5817 } 5818 5819 int radio::getCellInfoListResponse(int slotId, 5820 int responseType, 5821 int serial, RIL_Errno e, void *response, 5822 size_t responseLen) { 5823 #if VDBG 5824 RLOGD("getCellInfoListResponse: serial %d", serial); 5825 #endif 5826 5827 if (radioService[slotId]->mRadioResponse != NULL) { 5828 RadioResponseInfo responseInfo = {}; 5829 populateResponseInfo(responseInfo, serial, responseType, e); 5830 5831 hidl_vec<CellInfo> ret; 5832 if ((response == NULL && responseLen != 0) 5833 || responseLen % sizeof(RIL_CellInfo_v12) != 0) { 5834 RLOGE("getCellInfoListResponse: Invalid response"); 5835 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE; 5836 } else { 5837 convertRilCellInfoListToHal(response, responseLen, ret); 5838 } 5839 5840 Return<void> retStatus = radioService[slotId]->mRadioResponse->getCellInfoListResponse( 5841 responseInfo, ret); 5842 radioService[slotId]->checkReturnStatus(retStatus); 5843 } else { 5844 RLOGE("getCellInfoListResponse: radioService[%d]->mRadioResponse == NULL", slotId); 5845 } 5846 5847 return 0; 5848 } 5849 5850 int radio::setCellInfoListRateResponse(int slotId, 5851 int responseType, 5852 int serial, RIL_Errno e, void *response, 5853 size_t responseLen) { 5854 #if VDBG 5855 RLOGD("setCellInfoListRateResponse: serial %d", serial); 5856 #endif 5857 5858 if (radioService[slotId]->mRadioResponse != NULL) { 5859 RadioResponseInfo responseInfo = {}; 5860 populateResponseInfo(responseInfo, serial, responseType, e); 5861 Return<void> retStatus 5862 = radioService[slotId]->mRadioResponse->setCellInfoListRateResponse(responseInfo); 5863 radioService[slotId]->checkReturnStatus(retStatus); 5864 } else { 5865 RLOGE("setCellInfoListRateResponse: radioService[%d]->mRadioResponse == NULL", 5866 slotId); 5867 } 5868 5869 return 0; 5870 } 5871 5872 int radio::setInitialAttachApnResponse(int slotId, 5873 int responseType, int serial, RIL_Errno e, 5874 void *response, size_t responseLen) { 5875 #if VDBG 5876 RLOGD("setInitialAttachApnResponse: serial %d", serial); 5877 #endif 5878 5879 if (radioService[slotId]->mRadioResponse != NULL) { 5880 RadioResponseInfo responseInfo = {}; 5881 populateResponseInfo(responseInfo, serial, responseType, e); 5882 Return<void> retStatus 5883 = radioService[slotId]->mRadioResponse->setInitialAttachApnResponse(responseInfo); 5884 radioService[slotId]->checkReturnStatus(retStatus); 5885 } else { 5886 RLOGE("setInitialAttachApnResponse: radioService[%d]->mRadioResponse == NULL", 5887 slotId); 5888 } 5889 5890 return 0; 5891 } 5892 5893 int radio::getImsRegistrationStateResponse(int slotId, 5894 int responseType, int serial, RIL_Errno e, 5895 void *response, size_t responseLen) { 5896 #if VDBG 5897 RLOGD("getImsRegistrationStateResponse: serial %d", serial); 5898 #endif 5899 5900 if (radioService[slotId]->mRadioResponse != NULL) { 5901 RadioResponseInfo responseInfo = {}; 5902 populateResponseInfo(responseInfo, serial, responseType, e); 5903 bool isRegistered = false; 5904 int ratFamily = 0; 5905 int numInts = responseLen / sizeof(int); 5906 if (response == NULL || numInts != 2) { 5907 RLOGE("getImsRegistrationStateResponse Invalid response: NULL"); 5908 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE; 5909 } else { 5910 int *pInt = (int *) response; 5911 isRegistered = pInt[0] == 1 ? true : false; 5912 ratFamily = pInt[1]; 5913 } 5914 Return<void> retStatus 5915 = radioService[slotId]->mRadioResponse->getImsRegistrationStateResponse( 5916 responseInfo, isRegistered, (RadioTechnologyFamily) ratFamily); 5917 radioService[slotId]->checkReturnStatus(retStatus); 5918 } else { 5919 RLOGE("getImsRegistrationStateResponse: radioService[%d]->mRadioResponse == NULL", 5920 slotId); 5921 } 5922 5923 return 0; 5924 } 5925 5926 int radio::sendImsSmsResponse(int slotId, 5927 int responseType, int serial, RIL_Errno e, void *response, 5928 size_t responseLen) { 5929 #if VDBG 5930 RLOGD("sendImsSmsResponse: serial %d", serial); 5931 #endif 5932 5933 if (radioService[slotId]->mRadioResponse != NULL) { 5934 RadioResponseInfo responseInfo = {}; 5935 SendSmsResult result = makeSendSmsResult(responseInfo, serial, responseType, e, response, 5936 responseLen); 5937 5938 Return<void> retStatus 5939 = radioService[slotId]->mRadioResponse->sendImsSmsResponse(responseInfo, result); 5940 radioService[slotId]->checkReturnStatus(retStatus); 5941 } else { 5942 RLOGE("sendSmsResponse: radioService[%d]->mRadioResponse == NULL", slotId); 5943 } 5944 5945 return 0; 5946 } 5947 5948 int radio::iccTransmitApduBasicChannelResponse(int slotId, 5949 int responseType, int serial, RIL_Errno e, 5950 void *response, size_t responseLen) { 5951 #if VDBG 5952 RLOGD("iccTransmitApduBasicChannelResponse: serial %d", serial); 5953 #endif 5954 5955 if (radioService[slotId]->mRadioResponse != NULL) { 5956 RadioResponseInfo responseInfo = {}; 5957 IccIoResult result = responseIccIo(responseInfo, serial, responseType, e, response, 5958 responseLen); 5959 5960 Return<void> retStatus 5961 = radioService[slotId]->mRadioResponse->iccTransmitApduBasicChannelResponse( 5962 responseInfo, result); 5963 radioService[slotId]->checkReturnStatus(retStatus); 5964 } else { 5965 RLOGE("iccTransmitApduBasicChannelResponse: radioService[%d]->mRadioResponse " 5966 "== NULL", slotId); 5967 } 5968 5969 return 0; 5970 } 5971 5972 int radio::iccOpenLogicalChannelResponse(int slotId, 5973 int responseType, int serial, RIL_Errno e, void *response, 5974 size_t responseLen) { 5975 #if VDBG 5976 RLOGD("iccOpenLogicalChannelResponse: serial %d", serial); 5977 #endif 5978 5979 if (radioService[slotId]->mRadioResponse != NULL) { 5980 RadioResponseInfo responseInfo = {}; 5981 populateResponseInfo(responseInfo, serial, responseType, e); 5982 int channelId = -1; 5983 hidl_vec<int8_t> selectResponse; 5984 int numInts = responseLen / sizeof(int); 5985 if (response == NULL || responseLen % sizeof(int) != 0) { 5986 RLOGE("iccOpenLogicalChannelResponse Invalid response: NULL"); 5987 if (response != NULL) { 5988 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE; 5989 } 5990 } else { 5991 int *pInt = (int *) response; 5992 channelId = pInt[0]; 5993 selectResponse.resize(numInts - 1); 5994 for (int i = 1; i < numInts; i++) { 5995 selectResponse[i - 1] = (int8_t) pInt[i]; 5996 } 5997 } 5998 Return<void> retStatus 5999 = radioService[slotId]->mRadioResponse->iccOpenLogicalChannelResponse(responseInfo, 6000 channelId, selectResponse); 6001 radioService[slotId]->checkReturnStatus(retStatus); 6002 } else { 6003 RLOGE("iccOpenLogicalChannelResponse: radioService[%d]->mRadioResponse == NULL", 6004 slotId); 6005 } 6006 6007 return 0; 6008 } 6009 6010 int radio::iccCloseLogicalChannelResponse(int slotId, 6011 int responseType, int serial, RIL_Errno e, 6012 void *response, size_t responseLen) { 6013 #if VDBG 6014 RLOGD("iccCloseLogicalChannelResponse: serial %d", serial); 6015 #endif 6016 6017 if (radioService[slotId]->mRadioResponse != NULL) { 6018 RadioResponseInfo responseInfo = {}; 6019 populateResponseInfo(responseInfo, serial, responseType, e); 6020 Return<void> retStatus 6021 = radioService[slotId]->mRadioResponse->iccCloseLogicalChannelResponse( 6022 responseInfo); 6023 radioService[slotId]->checkReturnStatus(retStatus); 6024 } else { 6025 RLOGE("iccCloseLogicalChannelResponse: radioService[%d]->mRadioResponse == NULL", 6026 slotId); 6027 } 6028 6029 return 0; 6030 } 6031 6032 int radio::iccTransmitApduLogicalChannelResponse(int slotId, 6033 int responseType, int serial, RIL_Errno e, 6034 void *response, size_t responseLen) { 6035 #if VDBG 6036 RLOGD("iccTransmitApduLogicalChannelResponse: serial %d", serial); 6037 #endif 6038 6039 if (radioService[slotId]->mRadioResponse != NULL) { 6040 RadioResponseInfo responseInfo = {}; 6041 IccIoResult result = responseIccIo(responseInfo, serial, responseType, e, response, 6042 responseLen); 6043 6044 Return<void> retStatus 6045 = radioService[slotId]->mRadioResponse->iccTransmitApduLogicalChannelResponse( 6046 responseInfo, result); 6047 radioService[slotId]->checkReturnStatus(retStatus); 6048 } else { 6049 RLOGE("iccTransmitApduLogicalChannelResponse: radioService[%d]->mRadioResponse " 6050 "== NULL", slotId); 6051 } 6052 6053 return 0; 6054 } 6055 6056 int radio::nvReadItemResponse(int slotId, 6057 int responseType, int serial, RIL_Errno e, 6058 void *response, size_t responseLen) { 6059 #if VDBG 6060 RLOGD("nvReadItemResponse: serial %d", serial); 6061 #endif 6062 6063 if (radioService[slotId]->mRadioResponse != NULL) { 6064 RadioResponseInfo responseInfo = {}; 6065 populateResponseInfo(responseInfo, serial, responseType, e); 6066 Return<void> retStatus = radioService[slotId]->mRadioResponse->nvReadItemResponse( 6067 responseInfo, 6068 convertCharPtrToHidlString((char *) response)); 6069 radioService[slotId]->checkReturnStatus(retStatus); 6070 } else { 6071 RLOGE("nvReadItemResponse: radioService[%d]->mRadioResponse == NULL", slotId); 6072 } 6073 6074 return 0; 6075 } 6076 6077 int radio::nvWriteItemResponse(int slotId, 6078 int responseType, int serial, RIL_Errno e, 6079 void *response, size_t responseLen) { 6080 #if VDBG 6081 RLOGD("nvWriteItemResponse: serial %d", serial); 6082 #endif 6083 6084 if (radioService[slotId]->mRadioResponse != NULL) { 6085 RadioResponseInfo responseInfo = {}; 6086 populateResponseInfo(responseInfo, serial, responseType, e); 6087 Return<void> retStatus 6088 = radioService[slotId]->mRadioResponse->nvWriteItemResponse(responseInfo); 6089 radioService[slotId]->checkReturnStatus(retStatus); 6090 } else { 6091 RLOGE("nvWriteItemResponse: radioService[%d]->mRadioResponse == NULL", slotId); 6092 } 6093 6094 return 0; 6095 } 6096 6097 int radio::nvWriteCdmaPrlResponse(int slotId, 6098 int responseType, int serial, RIL_Errno e, 6099 void *response, size_t responseLen) { 6100 #if VDBG 6101 RLOGD("nvWriteCdmaPrlResponse: serial %d", serial); 6102 #endif 6103 6104 if (radioService[slotId]->mRadioResponse != NULL) { 6105 RadioResponseInfo responseInfo = {}; 6106 populateResponseInfo(responseInfo, serial, responseType, e); 6107 Return<void> retStatus 6108 = radioService[slotId]->mRadioResponse->nvWriteCdmaPrlResponse(responseInfo); 6109 radioService[slotId]->checkReturnStatus(retStatus); 6110 } else { 6111 RLOGE("nvWriteCdmaPrlResponse: radioService[%d]->mRadioResponse == NULL", slotId); 6112 } 6113 6114 return 0; 6115 } 6116 6117 int radio::nvResetConfigResponse(int slotId, 6118 int responseType, int serial, RIL_Errno e, 6119 void *response, size_t responseLen) { 6120 #if VDBG 6121 RLOGD("nvResetConfigResponse: serial %d", serial); 6122 #endif 6123 6124 if (radioService[slotId]->mRadioResponse != NULL) { 6125 RadioResponseInfo responseInfo = {}; 6126 populateResponseInfo(responseInfo, serial, responseType, e); 6127 Return<void> retStatus 6128 = radioService[slotId]->mRadioResponse->nvResetConfigResponse(responseInfo); 6129 radioService[slotId]->checkReturnStatus(retStatus); 6130 } else { 6131 RLOGE("nvResetConfigResponse: radioService[%d]->mRadioResponse == NULL", slotId); 6132 } 6133 6134 return 0; 6135 } 6136 6137 int radio::setUiccSubscriptionResponse(int slotId, 6138 int responseType, int serial, RIL_Errno e, 6139 void *response, size_t responseLen) { 6140 #if VDBG 6141 RLOGD("setUiccSubscriptionResponse: serial %d", serial); 6142 #endif 6143 6144 if (radioService[slotId]->mRadioResponse != NULL) { 6145 RadioResponseInfo responseInfo = {}; 6146 populateResponseInfo(responseInfo, serial, responseType, e); 6147 Return<void> retStatus 6148 = radioService[slotId]->mRadioResponse->setUiccSubscriptionResponse(responseInfo); 6149 radioService[slotId]->checkReturnStatus(retStatus); 6150 } else { 6151 RLOGE("setUiccSubscriptionResponse: radioService[%d]->mRadioResponse == NULL", 6152 slotId); 6153 } 6154 6155 return 0; 6156 } 6157 6158 int radio::setDataAllowedResponse(int slotId, 6159 int responseType, int serial, RIL_Errno e, 6160 void *response, size_t responseLen) { 6161 #if VDBG 6162 RLOGD("setDataAllowedResponse: serial %d", serial); 6163 #endif 6164 6165 if (radioService[slotId]->mRadioResponse != NULL) { 6166 RadioResponseInfo responseInfo = {}; 6167 populateResponseInfo(responseInfo, serial, responseType, e); 6168 Return<void> retStatus 6169 = radioService[slotId]->mRadioResponse->setDataAllowedResponse(responseInfo); 6170 radioService[slotId]->checkReturnStatus(retStatus); 6171 } else { 6172 RLOGE("setDataAllowedResponse: radioService[%d]->mRadioResponse == NULL", slotId); 6173 } 6174 6175 return 0; 6176 } 6177 6178 int radio::getHardwareConfigResponse(int slotId, 6179 int responseType, int serial, RIL_Errno e, 6180 void *response, size_t responseLen) { 6181 #if VDBG 6182 RLOGD("getHardwareConfigResponse: serial %d", serial); 6183 #endif 6184 6185 if (radioService[slotId]->mRadioResponse != NULL) { 6186 RadioResponseInfo responseInfo = {}; 6187 populateResponseInfo(responseInfo, serial, responseType, e); 6188 6189 hidl_vec<HardwareConfig> result; 6190 if ((response == NULL && responseLen != 0) 6191 || responseLen % sizeof(RIL_HardwareConfig) != 0) { 6192 RLOGE("hardwareConfigChangedInd: invalid response"); 6193 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE; 6194 } else { 6195 convertRilHardwareConfigListToHal(response, responseLen, result); 6196 } 6197 6198 Return<void> retStatus = radioService[slotId]->mRadioResponse->getHardwareConfigResponse( 6199 responseInfo, result); 6200 radioService[slotId]->checkReturnStatus(retStatus); 6201 } else { 6202 RLOGE("getHardwareConfigResponse: radioService[%d]->mRadioResponse == NULL", slotId); 6203 } 6204 6205 return 0; 6206 } 6207 6208 int radio::requestIccSimAuthenticationResponse(int slotId, 6209 int responseType, int serial, RIL_Errno e, 6210 void *response, size_t responseLen) { 6211 #if VDBG 6212 RLOGD("requestIccSimAuthenticationResponse: serial %d", serial); 6213 #endif 6214 6215 if (radioService[slotId]->mRadioResponse != NULL) { 6216 RadioResponseInfo responseInfo = {}; 6217 IccIoResult result = responseIccIo(responseInfo, serial, responseType, e, response, 6218 responseLen); 6219 6220 Return<void> retStatus 6221 = radioService[slotId]->mRadioResponse->requestIccSimAuthenticationResponse( 6222 responseInfo, result); 6223 radioService[slotId]->checkReturnStatus(retStatus); 6224 } else { 6225 RLOGE("requestIccSimAuthenticationResponse: radioService[%d]->mRadioResponse " 6226 "== NULL", slotId); 6227 } 6228 6229 return 0; 6230 } 6231 6232 int radio::setDataProfileResponse(int slotId, 6233 int responseType, int serial, RIL_Errno e, 6234 void *response, size_t responseLen) { 6235 #if VDBG 6236 RLOGD("setDataProfileResponse: serial %d", serial); 6237 #endif 6238 6239 if (radioService[slotId]->mRadioResponse != NULL) { 6240 RadioResponseInfo responseInfo = {}; 6241 populateResponseInfo(responseInfo, serial, responseType, e); 6242 Return<void> retStatus 6243 = radioService[slotId]->mRadioResponse->setDataProfileResponse(responseInfo); 6244 radioService[slotId]->checkReturnStatus(retStatus); 6245 } else { 6246 RLOGE("setDataProfileResponse: radioService[%d]->mRadioResponse == NULL", slotId); 6247 } 6248 6249 return 0; 6250 } 6251 6252 int radio::requestShutdownResponse(int slotId, 6253 int responseType, int serial, RIL_Errno e, 6254 void *response, size_t responseLen) { 6255 #if VDBG 6256 RLOGD("requestShutdownResponse: serial %d", serial); 6257 #endif 6258 6259 if (radioService[slotId]->mRadioResponse != NULL) { 6260 RadioResponseInfo responseInfo = {}; 6261 populateResponseInfo(responseInfo, serial, responseType, e); 6262 Return<void> retStatus 6263 = radioService[slotId]->mRadioResponse->requestShutdownResponse(responseInfo); 6264 radioService[slotId]->checkReturnStatus(retStatus); 6265 } else { 6266 RLOGE("requestShutdownResponse: radioService[%d]->mRadioResponse == NULL", slotId); 6267 } 6268 6269 return 0; 6270 } 6271 6272 void responseRadioCapability(RadioResponseInfo& responseInfo, int serial, 6273 int responseType, RIL_Errno e, void *response, size_t responseLen, RadioCapability& rc) { 6274 populateResponseInfo(responseInfo, serial, responseType, e); 6275 6276 if (response == NULL || responseLen != sizeof(RIL_RadioCapability)) { 6277 RLOGE("responseRadioCapability: Invalid response"); 6278 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE; 6279 rc.logicalModemUuid = hidl_string(); 6280 } else { 6281 convertRilRadioCapabilityToHal(response, responseLen, rc); 6282 } 6283 } 6284 6285 int radio::getRadioCapabilityResponse(int slotId, 6286 int responseType, int serial, RIL_Errno e, 6287 void *response, size_t responseLen) { 6288 #if VDBG 6289 RLOGD("getRadioCapabilityResponse: serial %d", serial); 6290 #endif 6291 6292 if (radioService[slotId]->mRadioResponse != NULL) { 6293 RadioResponseInfo responseInfo = {}; 6294 RadioCapability result = {}; 6295 responseRadioCapability(responseInfo, serial, responseType, e, response, responseLen, 6296 result); 6297 Return<void> retStatus = radioService[slotId]->mRadioResponse->getRadioCapabilityResponse( 6298 responseInfo, result); 6299 radioService[slotId]->checkReturnStatus(retStatus); 6300 } else { 6301 RLOGE("getRadioCapabilityResponse: radioService[%d]->mRadioResponse == NULL", slotId); 6302 } 6303 6304 return 0; 6305 } 6306 6307 int radio::setRadioCapabilityResponse(int slotId, 6308 int responseType, int serial, RIL_Errno e, 6309 void *response, size_t responseLen) { 6310 #if VDBG 6311 RLOGD("setRadioCapabilityResponse: serial %d", serial); 6312 #endif 6313 6314 if (radioService[slotId]->mRadioResponse != NULL) { 6315 RadioResponseInfo responseInfo = {}; 6316 RadioCapability result = {}; 6317 responseRadioCapability(responseInfo, serial, responseType, e, response, responseLen, 6318 result); 6319 Return<void> retStatus = radioService[slotId]->mRadioResponse->setRadioCapabilityResponse( 6320 responseInfo, result); 6321 radioService[slotId]->checkReturnStatus(retStatus); 6322 } else { 6323 RLOGE("setRadioCapabilityResponse: radioService[%d]->mRadioResponse == NULL", slotId); 6324 } 6325 6326 return 0; 6327 } 6328 6329 LceStatusInfo responseLceStatusInfo(RadioResponseInfo& responseInfo, int serial, int responseType, 6330 RIL_Errno e, void *response, size_t responseLen) { 6331 populateResponseInfo(responseInfo, serial, responseType, e); 6332 LceStatusInfo result = {}; 6333 6334 if (response == NULL || responseLen != sizeof(RIL_LceStatusInfo)) { 6335 RLOGE("Invalid response: NULL"); 6336 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE; 6337 } else { 6338 RIL_LceStatusInfo *resp = (RIL_LceStatusInfo *) response; 6339 result.lceStatus = (LceStatus) resp->lce_status; 6340 result.actualIntervalMs = (uint8_t) resp->actual_interval_ms; 6341 } 6342 return result; 6343 } 6344 6345 int radio::startLceServiceResponse(int slotId, 6346 int responseType, int serial, RIL_Errno e, 6347 void *response, size_t responseLen) { 6348 #if VDBG 6349 RLOGD("startLceServiceResponse: serial %d", serial); 6350 #endif 6351 6352 if (radioService[slotId]->mRadioResponse != NULL) { 6353 RadioResponseInfo responseInfo = {}; 6354 LceStatusInfo result = responseLceStatusInfo(responseInfo, serial, responseType, e, 6355 response, responseLen); 6356 6357 Return<void> retStatus 6358 = radioService[slotId]->mRadioResponse->startLceServiceResponse(responseInfo, 6359 result); 6360 radioService[slotId]->checkReturnStatus(retStatus); 6361 } else { 6362 RLOGE("startLceServiceResponse: radioService[%d]->mRadioResponse == NULL", slotId); 6363 } 6364 6365 return 0; 6366 } 6367 6368 int radio::stopLceServiceResponse(int slotId, 6369 int responseType, int serial, RIL_Errno e, 6370 void *response, size_t responseLen) { 6371 #if VDBG 6372 RLOGD("stopLceServiceResponse: serial %d", serial); 6373 #endif 6374 6375 if (radioService[slotId]->mRadioResponse != NULL) { 6376 RadioResponseInfo responseInfo = {}; 6377 LceStatusInfo result = responseLceStatusInfo(responseInfo, serial, responseType, e, 6378 response, responseLen); 6379 6380 Return<void> retStatus 6381 = radioService[slotId]->mRadioResponse->stopLceServiceResponse(responseInfo, 6382 result); 6383 radioService[slotId]->checkReturnStatus(retStatus); 6384 } else { 6385 RLOGE("stopLceServiceResponse: radioService[%d]->mRadioResponse == NULL", slotId); 6386 } 6387 6388 return 0; 6389 } 6390 6391 int radio::pullLceDataResponse(int slotId, 6392 int responseType, int serial, RIL_Errno e, 6393 void *response, size_t responseLen) { 6394 #if VDBG 6395 RLOGD("pullLceDataResponse: serial %d", serial); 6396 #endif 6397 6398 if (radioService[slotId]->mRadioResponse != NULL) { 6399 RadioResponseInfo responseInfo = {}; 6400 populateResponseInfo(responseInfo, serial, responseType, e); 6401 6402 LceDataInfo result = {}; 6403 if (response == NULL || responseLen != sizeof(RIL_LceDataInfo)) { 6404 RLOGE("pullLceDataResponse: Invalid response"); 6405 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE; 6406 } else { 6407 convertRilLceDataInfoToHal(response, responseLen, result); 6408 } 6409 6410 Return<void> retStatus = radioService[slotId]->mRadioResponse->pullLceDataResponse( 6411 responseInfo, result); 6412 radioService[slotId]->checkReturnStatus(retStatus); 6413 } else { 6414 RLOGE("pullLceDataResponse: radioService[%d]->mRadioResponse == NULL", slotId); 6415 } 6416 6417 return 0; 6418 } 6419 6420 int radio::getModemActivityInfoResponse(int slotId, 6421 int responseType, int serial, RIL_Errno e, 6422 void *response, size_t responseLen) { 6423 #if VDBG 6424 RLOGD("getModemActivityInfoResponse: serial %d", serial); 6425 #endif 6426 6427 if (radioService[slotId]->mRadioResponse != NULL) { 6428 RadioResponseInfo responseInfo = {}; 6429 populateResponseInfo(responseInfo, serial, responseType, e); 6430 ActivityStatsInfo info; 6431 if (response == NULL || responseLen != sizeof(RIL_ActivityStatsInfo)) { 6432 RLOGE("getModemActivityInfoResponse Invalid response: NULL"); 6433 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE; 6434 } else { 6435 RIL_ActivityStatsInfo *resp = (RIL_ActivityStatsInfo *)response; 6436 info.sleepModeTimeMs = resp->sleep_mode_time_ms; 6437 info.idleModeTimeMs = resp->idle_mode_time_ms; 6438 for(int i = 0; i < RIL_NUM_TX_POWER_LEVELS; i++) { 6439 info.txmModetimeMs[i] = resp->tx_mode_time_ms[i]; 6440 } 6441 info.rxModeTimeMs = resp->rx_mode_time_ms; 6442 } 6443 6444 Return<void> retStatus 6445 = radioService[slotId]->mRadioResponse->getModemActivityInfoResponse(responseInfo, 6446 info); 6447 radioService[slotId]->checkReturnStatus(retStatus); 6448 } else { 6449 RLOGE("getModemActivityInfoResponse: radioService[%d]->mRadioResponse == NULL", 6450 slotId); 6451 } 6452 6453 return 0; 6454 } 6455 6456 int radio::setAllowedCarriersResponse(int slotId, 6457 int responseType, int serial, RIL_Errno e, 6458 void *response, size_t responseLen) { 6459 #if VDBG 6460 RLOGD("setAllowedCarriersResponse: serial %d", serial); 6461 #endif 6462 6463 if (radioService[slotId]->mRadioResponse != NULL) { 6464 RadioResponseInfo responseInfo = {}; 6465 int ret = responseInt(responseInfo, serial, responseType, e, response, responseLen); 6466 Return<void> retStatus 6467 = radioService[slotId]->mRadioResponse->setAllowedCarriersResponse(responseInfo, 6468 ret); 6469 radioService[slotId]->checkReturnStatus(retStatus); 6470 } else { 6471 RLOGE("setAllowedCarriersResponse: radioService[%d]->mRadioResponse == NULL", 6472 slotId); 6473 } 6474 6475 return 0; 6476 } 6477 6478 int radio::getAllowedCarriersResponse(int slotId, 6479 int responseType, int serial, RIL_Errno e, 6480 void *response, size_t responseLen) { 6481 #if VDBG 6482 RLOGD("getAllowedCarriersResponse: serial %d", serial); 6483 #endif 6484 6485 if (radioService[slotId]->mRadioResponse != NULL) { 6486 RadioResponseInfo responseInfo = {}; 6487 populateResponseInfo(responseInfo, serial, responseType, e); 6488 CarrierRestrictions carrierInfo = {}; 6489 bool allAllowed = true; 6490 if (response == NULL) { 6491 #if VDBG 6492 RLOGD("getAllowedCarriersResponse response is NULL: all allowed"); 6493 #endif 6494 carrierInfo.allowedCarriers.resize(0); 6495 carrierInfo.excludedCarriers.resize(0); 6496 } else if (responseLen != sizeof(RIL_CarrierRestrictions)) { 6497 RLOGE("getAllowedCarriersResponse Invalid response"); 6498 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE; 6499 } else { 6500 RIL_CarrierRestrictions *pCr = (RIL_CarrierRestrictions *)response; 6501 if (pCr->len_allowed_carriers > 0 || pCr->len_excluded_carriers > 0) { 6502 allAllowed = false; 6503 } 6504 6505 carrierInfo.allowedCarriers.resize(pCr->len_allowed_carriers); 6506 for(int i = 0; i < pCr->len_allowed_carriers; i++) { 6507 RIL_Carrier *carrier = pCr->allowed_carriers + i; 6508 carrierInfo.allowedCarriers[i].mcc = convertCharPtrToHidlString(carrier->mcc); 6509 carrierInfo.allowedCarriers[i].mnc = convertCharPtrToHidlString(carrier->mnc); 6510 carrierInfo.allowedCarriers[i].matchType = (CarrierMatchType) carrier->match_type; 6511 carrierInfo.allowedCarriers[i].matchData = 6512 convertCharPtrToHidlString(carrier->match_data); 6513 } 6514 6515 carrierInfo.excludedCarriers.resize(pCr->len_excluded_carriers); 6516 for(int i = 0; i < pCr->len_excluded_carriers; i++) { 6517 RIL_Carrier *carrier = pCr->excluded_carriers + i; 6518 carrierInfo.excludedCarriers[i].mcc = convertCharPtrToHidlString(carrier->mcc); 6519 carrierInfo.excludedCarriers[i].mnc = convertCharPtrToHidlString(carrier->mnc); 6520 carrierInfo.excludedCarriers[i].matchType = (CarrierMatchType) carrier->match_type; 6521 carrierInfo.excludedCarriers[i].matchData = 6522 convertCharPtrToHidlString(carrier->match_data); 6523 } 6524 } 6525 6526 Return<void> retStatus 6527 = radioService[slotId]->mRadioResponse->getAllowedCarriersResponse(responseInfo, 6528 allAllowed, carrierInfo); 6529 radioService[slotId]->checkReturnStatus(retStatus); 6530 } else { 6531 RLOGE("getAllowedCarriersResponse: radioService[%d]->mRadioResponse == NULL", 6532 slotId); 6533 } 6534 6535 return 0; 6536 } 6537 6538 int radio::sendDeviceStateResponse(int slotId, 6539 int responseType, int serial, RIL_Errno e, 6540 void *response, size_t responselen) { 6541 #if VDBG 6542 RLOGD("sendDeviceStateResponse: serial %d", serial); 6543 #endif 6544 6545 if (radioService[slotId]->mRadioResponse != NULL) { 6546 RadioResponseInfo responseInfo = {}; 6547 populateResponseInfo(responseInfo, serial, responseType, e); 6548 Return<void> retStatus 6549 = radioService[slotId]->mRadioResponse->sendDeviceStateResponse(responseInfo); 6550 radioService[slotId]->checkReturnStatus(retStatus); 6551 } else { 6552 RLOGE("sendDeviceStateResponse: radioService[%d]->mRadioResponse == NULL", slotId); 6553 } 6554 6555 return 0; 6556 } 6557 6558 int radio::setCarrierInfoForImsiEncryptionResponse(int slotId, 6559 int responseType, int serial, RIL_Errno e, 6560 void *response, size_t responseLen) { 6561 RLOGD("setCarrierInfoForImsiEncryptionResponse: serial %d", serial); 6562 if (radioService[slotId]->mRadioResponseV1_1 != NULL) { 6563 RadioResponseInfo responseInfo = {}; 6564 populateResponseInfo(responseInfo, serial, responseType, e); 6565 Return<void> retStatus = radioService[slotId]->mRadioResponseV1_1-> 6566 setCarrierInfoForImsiEncryptionResponse(responseInfo); 6567 radioService[slotId]->checkReturnStatus(retStatus); 6568 } else { 6569 RLOGE("setCarrierInfoForImsiEncryptionResponse: radioService[%d]->mRadioResponseV1_1 == " 6570 "NULL", slotId); 6571 } 6572 return 0; 6573 } 6574 6575 int radio::setIndicationFilterResponse(int slotId, 6576 int responseType, int serial, RIL_Errno e, 6577 void *response, size_t responselen) { 6578 #if VDBG 6579 RLOGD("setIndicationFilterResponse: serial %d", serial); 6580 #endif 6581 6582 if (radioService[slotId]->mRadioResponse != NULL) { 6583 RadioResponseInfo responseInfo = {}; 6584 populateResponseInfo(responseInfo, serial, responseType, e); 6585 Return<void> retStatus 6586 = radioService[slotId]->mRadioResponse->setIndicationFilterResponse(responseInfo); 6587 radioService[slotId]->checkReturnStatus(retStatus); 6588 } else { 6589 RLOGE("setIndicationFilterResponse: radioService[%d]->mRadioResponse == NULL", 6590 slotId); 6591 } 6592 6593 return 0; 6594 } 6595 6596 int radio::setSimCardPowerResponse(int slotId, 6597 int responseType, int serial, RIL_Errno e, 6598 void *response, size_t responseLen) { 6599 #if VDBG 6600 RLOGD("setSimCardPowerResponse: serial %d", serial); 6601 #endif 6602 6603 if (radioService[slotId]->mRadioResponse != NULL 6604 || radioService[slotId]->mRadioResponseV1_1 != NULL) { 6605 RadioResponseInfo responseInfo = {}; 6606 populateResponseInfo(responseInfo, serial, responseType, e); 6607 if (radioService[slotId]->mRadioResponseV1_1 != NULL) { 6608 Return<void> retStatus = radioService[slotId]->mRadioResponseV1_1-> 6609 setSimCardPowerResponse_1_1(responseInfo); 6610 radioService[slotId]->checkReturnStatus(retStatus); 6611 } else { 6612 RLOGD("setSimCardPowerResponse: radioService[%d]->mRadioResponseV1_1 == NULL", 6613 slotId); 6614 Return<void> retStatus 6615 = radioService[slotId]->mRadioResponse->setSimCardPowerResponse(responseInfo); 6616 radioService[slotId]->checkReturnStatus(retStatus); 6617 } 6618 } else { 6619 RLOGE("setSimCardPowerResponse: radioService[%d]->mRadioResponse == NULL && " 6620 "radioService[%d]->mRadioResponseV1_1 == NULL", slotId, slotId); 6621 } 6622 return 0; 6623 } 6624 6625 int radio::startNetworkScanResponse(int slotId, int responseType, int serial, RIL_Errno e, 6626 void *response, size_t responseLen) { 6627 #if VDBG 6628 RLOGD("startNetworkScanResponse: serial %d", serial); 6629 #endif 6630 6631 if (radioService[slotId]->mRadioResponseV1_1 != NULL) { 6632 RadioResponseInfo responseInfo = {}; 6633 populateResponseInfo(responseInfo, serial, responseType, e); 6634 Return<void> retStatus 6635 = radioService[slotId]->mRadioResponseV1_1->startNetworkScanResponse(responseInfo); 6636 radioService[slotId]->checkReturnStatus(retStatus); 6637 } else { 6638 RLOGE("startNetworkScanResponse: radioService[%d]->mRadioResponseV1_1 == NULL", slotId); 6639 } 6640 6641 return 0; 6642 } 6643 6644 int radio::stopNetworkScanResponse(int slotId, int responseType, int serial, RIL_Errno e, 6645 void *response, size_t responseLen) { 6646 #if VDBG 6647 RLOGD("stopNetworkScanResponse: serial %d", serial); 6648 #endif 6649 6650 if (radioService[slotId]->mRadioResponseV1_1 != NULL) { 6651 RadioResponseInfo responseInfo = {}; 6652 populateResponseInfo(responseInfo, serial, responseType, e); 6653 Return<void> retStatus 6654 = radioService[slotId]->mRadioResponseV1_1->stopNetworkScanResponse(responseInfo); 6655 radioService[slotId]->checkReturnStatus(retStatus); 6656 } else { 6657 RLOGE("stopNetworkScanResponse: radioService[%d]->mRadioResponseV1_1 == NULL", slotId); 6658 } 6659 6660 return 0; 6661 } 6662 6663 void convertRilKeepaliveStatusToHal(const RIL_KeepaliveStatus *rilStatus, 6664 V1_1::KeepaliveStatus& halStatus) { 6665 halStatus.sessionHandle = rilStatus->sessionHandle; 6666 halStatus.code = static_cast<V1_1::KeepaliveStatusCode>(rilStatus->code); 6667 } 6668 6669 int radio::startKeepaliveResponse(int slotId, int responseType, int serial, RIL_Errno e, 6670 void *response, size_t responseLen) { 6671 #if VDBG 6672 RLOGD("%s(): %d", __FUNCTION__, serial); 6673 #endif 6674 RadioResponseInfo responseInfo = {}; 6675 populateResponseInfo(responseInfo, serial, responseType, e); 6676 6677 // If we don't have a radio service, there's nothing we can do 6678 if (radioService[slotId]->mRadioResponseV1_1 == NULL) { 6679 RLOGE("%s: radioService[%d]->mRadioResponseV1_1 == NULL", __FUNCTION__, slotId); 6680 return 0; 6681 } 6682 6683 V1_1::KeepaliveStatus ks = {}; 6684 if (response == NULL || responseLen != sizeof(V1_1::KeepaliveStatus)) { 6685 RLOGE("%s: invalid response - %d", __FUNCTION__, static_cast<int>(e)); 6686 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE; 6687 } else { 6688 convertRilKeepaliveStatusToHal(static_cast<RIL_KeepaliveStatus*>(response), ks); 6689 } 6690 6691 Return<void> retStatus = 6692 radioService[slotId]->mRadioResponseV1_1->startKeepaliveResponse(responseInfo, ks); 6693 radioService[slotId]->checkReturnStatus(retStatus); 6694 return 0; 6695 } 6696 6697 int radio::stopKeepaliveResponse(int slotId, int responseType, int serial, RIL_Errno e, 6698 void *response, size_t responseLen) { 6699 #if VDBG 6700 RLOGD("%s(): %d", __FUNCTION__, serial); 6701 #endif 6702 RadioResponseInfo responseInfo = {}; 6703 populateResponseInfo(responseInfo, serial, responseType, e); 6704 6705 // If we don't have a radio service, there's nothing we can do 6706 if (radioService[slotId]->mRadioResponseV1_1 == NULL) { 6707 RLOGE("%s: radioService[%d]->mRadioResponseV1_1 == NULL", __FUNCTION__, slotId); 6708 return 0; 6709 } 6710 6711 Return<void> retStatus = 6712 radioService[slotId]->mRadioResponseV1_1->stopKeepaliveResponse(responseInfo); 6713 radioService[slotId]->checkReturnStatus(retStatus); 6714 return 0; 6715 } 6716 6717 int radio::sendRequestRawResponse(int slotId, 6718 int responseType, int serial, RIL_Errno e, 6719 void *response, size_t responseLen) { 6720 #if VDBG 6721 RLOGD("sendRequestRawResponse: serial %d", serial); 6722 #endif 6723 6724 if (oemHookService[slotId]->mOemHookResponse != NULL) { 6725 RadioResponseInfo responseInfo = {}; 6726 populateResponseInfo(responseInfo, serial, responseType, e); 6727 hidl_vec<uint8_t> data; 6728 6729 if (response == NULL) { 6730 RLOGE("sendRequestRawResponse: Invalid response"); 6731 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE; 6732 } else { 6733 data.setToExternal((uint8_t *) response, responseLen); 6734 } 6735 Return<void> retStatus = oemHookService[slotId]->mOemHookResponse-> 6736 sendRequestRawResponse(responseInfo, data); 6737 checkReturnStatus(slotId, retStatus, false); 6738 } else { 6739 RLOGE("sendRequestRawResponse: oemHookService[%d]->mOemHookResponse == NULL", 6740 slotId); 6741 } 6742 6743 return 0; 6744 } 6745 6746 int radio::sendRequestStringsResponse(int slotId, 6747 int responseType, int serial, RIL_Errno e, 6748 void *response, size_t responseLen) { 6749 #if VDBG 6750 RLOGD("sendRequestStringsResponse: serial %d", serial); 6751 #endif 6752 6753 if (oemHookService[slotId]->mOemHookResponse != NULL) { 6754 RadioResponseInfo responseInfo = {}; 6755 populateResponseInfo(responseInfo, serial, responseType, e); 6756 hidl_vec<hidl_string> data; 6757 6758 if ((response == NULL && responseLen != 0) || responseLen % sizeof(char *) != 0) { 6759 RLOGE("sendRequestStringsResponse Invalid response: NULL"); 6760 if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE; 6761 } else { 6762 char **resp = (char **) response; 6763 int numStrings = responseLen / sizeof(char *); 6764 data.resize(numStrings); 6765 for (int i = 0; i < numStrings; i++) { 6766 data[i] = convertCharPtrToHidlString(resp[i]); 6767 } 6768 } 6769 Return<void> retStatus 6770 = oemHookService[slotId]->mOemHookResponse->sendRequestStringsResponse( 6771 responseInfo, data); 6772 checkReturnStatus(slotId, retStatus, false); 6773 } else { 6774 RLOGE("sendRequestStringsResponse: oemHookService[%d]->mOemHookResponse == " 6775 "NULL", slotId); 6776 } 6777 6778 return 0; 6779 } 6780 6781 /*************************************************************************************************** 6782 * INDICATION FUNCTIONS 6783 * The below function handle unsolicited messages coming from the Radio 6784 * (messages for which there is no pending request) 6785 **************************************************************************************************/ 6786 6787 RadioIndicationType convertIntToRadioIndicationType(int indicationType) { 6788 return indicationType == RESPONSE_UNSOLICITED ? (RadioIndicationType::UNSOLICITED) : 6789 (RadioIndicationType::UNSOLICITED_ACK_EXP); 6790 } 6791 6792 int radio::radioStateChangedInd(int slotId, 6793 int indicationType, int token, RIL_Errno e, void *response, 6794 size_t responseLen) { 6795 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) { 6796 RadioState radioState = 6797 (RadioState) CALL_ONSTATEREQUEST(slotId); 6798 RLOGD("radioStateChangedInd: radioState %d", radioState); 6799 Return<void> retStatus = radioService[slotId]->mRadioIndication->radioStateChanged( 6800 convertIntToRadioIndicationType(indicationType), radioState); 6801 radioService[slotId]->checkReturnStatus(retStatus); 6802 } else { 6803 RLOGE("radioStateChangedInd: radioService[%d]->mRadioIndication == NULL", slotId); 6804 } 6805 6806 return 0; 6807 } 6808 6809 int radio::callStateChangedInd(int slotId, 6810 int indicationType, int token, RIL_Errno e, void *response, 6811 size_t responseLen) { 6812 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) { 6813 #if VDBG 6814 RLOGD("callStateChangedInd"); 6815 #endif 6816 Return<void> retStatus = radioService[slotId]->mRadioIndication->callStateChanged( 6817 convertIntToRadioIndicationType(indicationType)); 6818 radioService[slotId]->checkReturnStatus(retStatus); 6819 } else { 6820 RLOGE("callStateChangedInd: radioService[%d]->mRadioIndication == NULL", slotId); 6821 } 6822 6823 return 0; 6824 } 6825 6826 int radio::networkStateChangedInd(int slotId, 6827 int indicationType, int token, RIL_Errno e, void *response, 6828 size_t responseLen) { 6829 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) { 6830 #if VDBG 6831 RLOGD("networkStateChangedInd"); 6832 #endif 6833 Return<void> retStatus = radioService[slotId]->mRadioIndication->networkStateChanged( 6834 convertIntToRadioIndicationType(indicationType)); 6835 radioService[slotId]->checkReturnStatus(retStatus); 6836 } else { 6837 RLOGE("networkStateChangedInd: radioService[%d]->mRadioIndication == NULL", 6838 slotId); 6839 } 6840 6841 return 0; 6842 } 6843 6844 uint8_t hexCharToInt(uint8_t c) { 6845 if (c >= '0' && c <= '9') return (c - '0'); 6846 if (c >= 'A' && c <= 'F') return (c - 'A' + 10); 6847 if (c >= 'a' && c <= 'f') return (c - 'a' + 10); 6848 6849 return INVALID_HEX_CHAR; 6850 } 6851 6852 uint8_t * convertHexStringToBytes(void *response, size_t responseLen) { 6853 if (responseLen % 2 != 0) { 6854 return NULL; 6855 } 6856 6857 uint8_t *bytes = (uint8_t *)calloc(responseLen/2, sizeof(uint8_t)); 6858 if (bytes == NULL) { 6859 RLOGE("convertHexStringToBytes: cannot allocate memory for bytes string"); 6860 return NULL; 6861 } 6862 uint8_t *hexString = (uint8_t *)response; 6863 6864 for (size_t i = 0; i < responseLen; i += 2) { 6865 uint8_t hexChar1 = hexCharToInt(hexString[i]); 6866 uint8_t hexChar2 = hexCharToInt(hexString[i + 1]); 6867 6868 if (hexChar1 == INVALID_HEX_CHAR || hexChar2 == INVALID_HEX_CHAR) { 6869 RLOGE("convertHexStringToBytes: invalid hex char %d %d", 6870 hexString[i], hexString[i + 1]); 6871 free(bytes); 6872 return NULL; 6873 } 6874 bytes[i/2] = ((hexChar1 << 4) | hexChar2); 6875 } 6876 6877 return bytes; 6878 } 6879 6880 int radio::newSmsInd(int slotId, int indicationType, 6881 int token, RIL_Errno e, void *response, size_t responseLen) { 6882 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) { 6883 if (response == NULL || responseLen == 0) { 6884 RLOGE("newSmsInd: invalid response"); 6885 return 0; 6886 } 6887 6888 uint8_t *bytes = convertHexStringToBytes(response, responseLen); 6889 if (bytes == NULL) { 6890 RLOGE("newSmsInd: convertHexStringToBytes failed"); 6891 return 0; 6892 } 6893 6894 hidl_vec<uint8_t> pdu; 6895 pdu.setToExternal(bytes, responseLen/2); 6896 #if VDBG 6897 RLOGD("newSmsInd"); 6898 #endif 6899 Return<void> retStatus = radioService[slotId]->mRadioIndication->newSms( 6900 convertIntToRadioIndicationType(indicationType), pdu); 6901 radioService[slotId]->checkReturnStatus(retStatus); 6902 free(bytes); 6903 } else { 6904 RLOGE("newSmsInd: radioService[%d]->mRadioIndication == NULL", slotId); 6905 } 6906 6907 return 0; 6908 } 6909 6910 int radio::newSmsStatusReportInd(int slotId, 6911 int indicationType, int token, RIL_Errno e, void *response, 6912 size_t responseLen) { 6913 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) { 6914 if (response == NULL || responseLen == 0) { 6915 RLOGE("newSmsStatusReportInd: invalid response"); 6916 return 0; 6917 } 6918 6919 uint8_t *bytes = convertHexStringToBytes(response, responseLen); 6920 if (bytes == NULL) { 6921 RLOGE("newSmsStatusReportInd: convertHexStringToBytes failed"); 6922 return 0; 6923 } 6924 6925 hidl_vec<uint8_t> pdu; 6926 pdu.setToExternal(bytes, responseLen/2); 6927 #if VDBG 6928 RLOGD("newSmsStatusReportInd"); 6929 #endif 6930 Return<void> retStatus = radioService[slotId]->mRadioIndication->newSmsStatusReport( 6931 convertIntToRadioIndicationType(indicationType), pdu); 6932 radioService[slotId]->checkReturnStatus(retStatus); 6933 free(bytes); 6934 } else { 6935 RLOGE("newSmsStatusReportInd: radioService[%d]->mRadioIndication == NULL", slotId); 6936 } 6937 6938 return 0; 6939 } 6940 6941 int radio::newSmsOnSimInd(int slotId, int indicationType, 6942 int token, RIL_Errno e, void *response, size_t responseLen) { 6943 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) { 6944 if (response == NULL || responseLen != sizeof(int)) { 6945 RLOGE("newSmsOnSimInd: invalid response"); 6946 return 0; 6947 } 6948 int32_t recordNumber = ((int32_t *) response)[0]; 6949 #if VDBG 6950 RLOGD("newSmsOnSimInd: slotIndex %d", recordNumber); 6951 #endif 6952 Return<void> retStatus = radioService[slotId]->mRadioIndication->newSmsOnSim( 6953 convertIntToRadioIndicationType(indicationType), recordNumber); 6954 radioService[slotId]->checkReturnStatus(retStatus); 6955 } else { 6956 RLOGE("newSmsOnSimInd: radioService[%d]->mRadioIndication == NULL", slotId); 6957 } 6958 6959 return 0; 6960 } 6961 6962 int radio::onUssdInd(int slotId, int indicationType, 6963 int token, RIL_Errno e, void *response, size_t responseLen) { 6964 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) { 6965 if (response == NULL || responseLen != 2 * sizeof(char *)) { 6966 RLOGE("onUssdInd: invalid response"); 6967 return 0; 6968 } 6969 char **strings = (char **) response; 6970 char *mode = strings[0]; 6971 hidl_string msg = convertCharPtrToHidlString(strings[1]); 6972 UssdModeType modeType = (UssdModeType) atoi(mode); 6973 #if VDBG 6974 RLOGD("onUssdInd: mode %s", mode); 6975 #endif 6976 Return<void> retStatus = radioService[slotId]->mRadioIndication->onUssd( 6977 convertIntToRadioIndicationType(indicationType), modeType, msg); 6978 radioService[slotId]->checkReturnStatus(retStatus); 6979 } else { 6980 RLOGE("onUssdInd: radioService[%d]->mRadioIndication == NULL", slotId); 6981 } 6982 6983 return 0; 6984 } 6985 6986 int radio::nitzTimeReceivedInd(int slotId, 6987 int indicationType, int token, RIL_Errno e, void *response, 6988 size_t responseLen) { 6989 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) { 6990 if (response == NULL || responseLen == 0) { 6991 RLOGE("nitzTimeReceivedInd: invalid response"); 6992 return 0; 6993 } 6994 hidl_string nitzTime = convertCharPtrToHidlString((char *) response); 6995 int64_t timeReceived = android::elapsedRealtime(); 6996 #if VDBG 6997 RLOGD("nitzTimeReceivedInd: nitzTime %s receivedTime %" PRId64, nitzTime.c_str(), 6998 timeReceived); 6999 #endif 7000 Return<void> retStatus = radioService[slotId]->mRadioIndication->nitzTimeReceived( 7001 convertIntToRadioIndicationType(indicationType), nitzTime, timeReceived); 7002 radioService[slotId]->checkReturnStatus(retStatus); 7003 } else { 7004 RLOGE("nitzTimeReceivedInd: radioService[%d]->mRadioIndication == NULL", slotId); 7005 return -1; 7006 } 7007 7008 return 0; 7009 } 7010 7011 void convertRilSignalStrengthToHal(void *response, size_t responseLen, 7012 SignalStrength& signalStrength) { 7013 RIL_SignalStrength_v10 *rilSignalStrength = (RIL_SignalStrength_v10 *) response; 7014 7015 // Fixup LTE for backwards compatibility 7016 // signalStrength: -1 -> 99 7017 if (rilSignalStrength->LTE_SignalStrength.signalStrength == -1) { 7018 rilSignalStrength->LTE_SignalStrength.signalStrength = 99; 7019 } 7020 // rsrp: -1 -> INT_MAX all other negative value to positive. 7021 // So remap here 7022 if (rilSignalStrength->LTE_SignalStrength.rsrp == -1) { 7023 rilSignalStrength->LTE_SignalStrength.rsrp = INT_MAX; 7024 } else if (rilSignalStrength->LTE_SignalStrength.rsrp < -1) { 7025 rilSignalStrength->LTE_SignalStrength.rsrp = -rilSignalStrength->LTE_SignalStrength.rsrp; 7026 } 7027 // rsrq: -1 -> INT_MAX 7028 if (rilSignalStrength->LTE_SignalStrength.rsrq == -1) { 7029 rilSignalStrength->LTE_SignalStrength.rsrq = INT_MAX; 7030 } 7031 // Not remapping rssnr is already using INT_MAX 7032 // cqi: -1 -> INT_MAX 7033 if (rilSignalStrength->LTE_SignalStrength.cqi == -1) { 7034 rilSignalStrength->LTE_SignalStrength.cqi = INT_MAX; 7035 } 7036 7037 signalStrength.gw.signalStrength = rilSignalStrength->GW_SignalStrength.signalStrength; 7038 signalStrength.gw.bitErrorRate = rilSignalStrength->GW_SignalStrength.bitErrorRate; 7039 signalStrength.cdma.dbm = rilSignalStrength->CDMA_SignalStrength.dbm; 7040 signalStrength.cdma.ecio = rilSignalStrength->CDMA_SignalStrength.ecio; 7041 signalStrength.evdo.dbm = rilSignalStrength->EVDO_SignalStrength.dbm; 7042 signalStrength.evdo.ecio = rilSignalStrength->EVDO_SignalStrength.ecio; 7043 signalStrength.evdo.signalNoiseRatio = 7044 rilSignalStrength->EVDO_SignalStrength.signalNoiseRatio; 7045 signalStrength.lte.signalStrength = rilSignalStrength->LTE_SignalStrength.signalStrength; 7046 signalStrength.lte.rsrp = rilSignalStrength->LTE_SignalStrength.rsrp; 7047 signalStrength.lte.rsrq = rilSignalStrength->LTE_SignalStrength.rsrq; 7048 signalStrength.lte.rssnr = rilSignalStrength->LTE_SignalStrength.rssnr; 7049 signalStrength.lte.cqi = rilSignalStrength->LTE_SignalStrength.cqi; 7050 signalStrength.lte.timingAdvance = rilSignalStrength->LTE_SignalStrength.timingAdvance; 7051 signalStrength.tdScdma.rscp = rilSignalStrength->TD_SCDMA_SignalStrength.rscp; 7052 } 7053 7054 int radio::currentSignalStrengthInd(int slotId, 7055 int indicationType, int token, RIL_Errno e, 7056 void *response, size_t responseLen) { 7057 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) { 7058 if (response == NULL || responseLen != sizeof(RIL_SignalStrength_v10)) { 7059 RLOGE("currentSignalStrengthInd: invalid response"); 7060 return 0; 7061 } 7062 7063 SignalStrength signalStrength = {}; 7064 convertRilSignalStrengthToHal(response, responseLen, signalStrength); 7065 7066 #if VDBG 7067 RLOGD("currentSignalStrengthInd"); 7068 #endif 7069 Return<void> retStatus = radioService[slotId]->mRadioIndication->currentSignalStrength( 7070 convertIntToRadioIndicationType(indicationType), signalStrength); 7071 radioService[slotId]->checkReturnStatus(retStatus); 7072 } else { 7073 RLOGE("currentSignalStrengthInd: radioService[%d]->mRadioIndication == NULL", 7074 slotId); 7075 } 7076 7077 return 0; 7078 } 7079 7080 void convertRilDataCallToHal(RIL_Data_Call_Response_v11 *dcResponse, 7081 SetupDataCallResult& dcResult) { 7082 dcResult.status = (DataCallFailCause) dcResponse->status; 7083 dcResult.suggestedRetryTime = dcResponse->suggestedRetryTime; 7084 dcResult.cid = dcResponse->cid; 7085 dcResult.active = dcResponse->active; 7086 dcResult.type = convertCharPtrToHidlString(dcResponse->type); 7087 dcResult.ifname = convertCharPtrToHidlString(dcResponse->ifname); 7088 dcResult.addresses = convertCharPtrToHidlString(dcResponse->addresses); 7089 dcResult.dnses = convertCharPtrToHidlString(dcResponse->dnses); 7090 dcResult.gateways = convertCharPtrToHidlString(dcResponse->gateways); 7091 dcResult.pcscf = convertCharPtrToHidlString(dcResponse->pcscf); 7092 dcResult.mtu = dcResponse->mtu; 7093 } 7094 7095 void convertRilDataCallListToHal(void *response, size_t responseLen, 7096 hidl_vec<SetupDataCallResult>& dcResultList) { 7097 int num = responseLen / sizeof(RIL_Data_Call_Response_v11); 7098 7099 RIL_Data_Call_Response_v11 *dcResponse = (RIL_Data_Call_Response_v11 *) response; 7100 dcResultList.resize(num); 7101 for (int i = 0; i < num; i++) { 7102 convertRilDataCallToHal(&dcResponse[i], dcResultList[i]); 7103 } 7104 } 7105 7106 int radio::dataCallListChangedInd(int slotId, 7107 int indicationType, int token, RIL_Errno e, void *response, 7108 size_t responseLen) { 7109 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) { 7110 if ((response == NULL && responseLen != 0) 7111 || responseLen % sizeof(RIL_Data_Call_Response_v11) != 0) { 7112 RLOGE("dataCallListChangedInd: invalid response"); 7113 return 0; 7114 } 7115 hidl_vec<SetupDataCallResult> dcList; 7116 convertRilDataCallListToHal(response, responseLen, dcList); 7117 #if VDBG 7118 RLOGD("dataCallListChangedInd"); 7119 #endif 7120 Return<void> retStatus = radioService[slotId]->mRadioIndication->dataCallListChanged( 7121 convertIntToRadioIndicationType(indicationType), dcList); 7122 radioService[slotId]->checkReturnStatus(retStatus); 7123 } else { 7124 RLOGE("dataCallListChangedInd: radioService[%d]->mRadioIndication == NULL", slotId); 7125 } 7126 7127 return 0; 7128 } 7129 7130 int radio::suppSvcNotifyInd(int slotId, int indicationType, 7131 int token, RIL_Errno e, void *response, size_t responseLen) { 7132 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) { 7133 if (response == NULL || responseLen != sizeof(RIL_SuppSvcNotification)) { 7134 RLOGE("suppSvcNotifyInd: invalid response"); 7135 return 0; 7136 } 7137 7138 SuppSvcNotification suppSvc = {}; 7139 RIL_SuppSvcNotification *ssn = (RIL_SuppSvcNotification *) response; 7140 suppSvc.isMT = ssn->notificationType; 7141 suppSvc.code = ssn->code; 7142 suppSvc.index = ssn->index; 7143 suppSvc.type = ssn->type; 7144 suppSvc.number = convertCharPtrToHidlString(ssn->number); 7145 7146 #if VDBG 7147 RLOGD("suppSvcNotifyInd: isMT %d code %d index %d type %d", 7148 suppSvc.isMT, suppSvc.code, suppSvc.index, suppSvc.type); 7149 #endif 7150 Return<void> retStatus = radioService[slotId]->mRadioIndication->suppSvcNotify( 7151 convertIntToRadioIndicationType(indicationType), suppSvc); 7152 radioService[slotId]->checkReturnStatus(retStatus); 7153 } else { 7154 RLOGE("suppSvcNotifyInd: radioService[%d]->mRadioIndication == NULL", slotId); 7155 } 7156 7157 return 0; 7158 } 7159 7160 int radio::stkSessionEndInd(int slotId, int indicationType, 7161 int token, RIL_Errno e, void *response, size_t responseLen) { 7162 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) { 7163 #if VDBG 7164 RLOGD("stkSessionEndInd"); 7165 #endif 7166 Return<void> retStatus = radioService[slotId]->mRadioIndication->stkSessionEnd( 7167 convertIntToRadioIndicationType(indicationType)); 7168 radioService[slotId]->checkReturnStatus(retStatus); 7169 } else { 7170 RLOGE("stkSessionEndInd: radioService[%d]->mRadioIndication == NULL", slotId); 7171 } 7172 7173 return 0; 7174 } 7175 7176 int radio::stkProactiveCommandInd(int slotId, 7177 int indicationType, int token, RIL_Errno e, void *response, 7178 size_t responseLen) { 7179 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) { 7180 if (response == NULL || responseLen == 0) { 7181 RLOGE("stkProactiveCommandInd: invalid response"); 7182 return 0; 7183 } 7184 #if VDBG 7185 RLOGD("stkProactiveCommandInd"); 7186 #endif 7187 Return<void> retStatus = radioService[slotId]->mRadioIndication->stkProactiveCommand( 7188 convertIntToRadioIndicationType(indicationType), 7189 convertCharPtrToHidlString((char *) response)); 7190 radioService[slotId]->checkReturnStatus(retStatus); 7191 } else { 7192 RLOGE("stkProactiveCommandInd: radioService[%d]->mRadioIndication == NULL", slotId); 7193 } 7194 7195 return 0; 7196 } 7197 7198 int radio::stkEventNotifyInd(int slotId, int indicationType, 7199 int token, RIL_Errno e, void *response, size_t responseLen) { 7200 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) { 7201 if (response == NULL || responseLen == 0) { 7202 RLOGE("stkEventNotifyInd: invalid response"); 7203 return 0; 7204 } 7205 #if VDBG 7206 RLOGD("stkEventNotifyInd"); 7207 #endif 7208 Return<void> retStatus = radioService[slotId]->mRadioIndication->stkEventNotify( 7209 convertIntToRadioIndicationType(indicationType), 7210 convertCharPtrToHidlString((char *) response)); 7211 radioService[slotId]->checkReturnStatus(retStatus); 7212 } else { 7213 RLOGE("stkEventNotifyInd: radioService[%d]->mRadioIndication == NULL", slotId); 7214 } 7215 7216 return 0; 7217 } 7218 7219 int radio::stkCallSetupInd(int slotId, int indicationType, 7220 int token, RIL_Errno e, void *response, size_t responseLen) { 7221 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) { 7222 if (response == NULL || responseLen != sizeof(int)) { 7223 RLOGE("stkCallSetupInd: invalid response"); 7224 return 0; 7225 } 7226 int32_t timeout = ((int32_t *) response)[0]; 7227 #if VDBG 7228 RLOGD("stkCallSetupInd: timeout %d", timeout); 7229 #endif 7230 Return<void> retStatus = radioService[slotId]->mRadioIndication->stkCallSetup( 7231 convertIntToRadioIndicationType(indicationType), timeout); 7232 radioService[slotId]->checkReturnStatus(retStatus); 7233 } else { 7234 RLOGE("stkCallSetupInd: radioService[%d]->mRadioIndication == NULL", slotId); 7235 } 7236 7237 return 0; 7238 } 7239 7240 int radio::simSmsStorageFullInd(int slotId, 7241 int indicationType, int token, RIL_Errno e, void *response, 7242 size_t responseLen) { 7243 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) { 7244 #if VDBG 7245 RLOGD("simSmsStorageFullInd"); 7246 #endif 7247 Return<void> retStatus = radioService[slotId]->mRadioIndication->simSmsStorageFull( 7248 convertIntToRadioIndicationType(indicationType)); 7249 radioService[slotId]->checkReturnStatus(retStatus); 7250 } else { 7251 RLOGE("simSmsStorageFullInd: radioService[%d]->mRadioIndication == NULL", slotId); 7252 } 7253 7254 return 0; 7255 } 7256 7257 int radio::simRefreshInd(int slotId, int indicationType, 7258 int token, RIL_Errno e, void *response, size_t responseLen) { 7259 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) { 7260 if (response == NULL || responseLen != sizeof(RIL_SimRefreshResponse_v7)) { 7261 RLOGE("simRefreshInd: invalid response"); 7262 return 0; 7263 } 7264 7265 SimRefreshResult refreshResult = {}; 7266 RIL_SimRefreshResponse_v7 *simRefreshResponse = ((RIL_SimRefreshResponse_v7 *) response); 7267 refreshResult.type = 7268 (V1_0::SimRefreshType) simRefreshResponse->result; 7269 refreshResult.efId = simRefreshResponse->ef_id; 7270 refreshResult.aid = convertCharPtrToHidlString(simRefreshResponse->aid); 7271 7272 #if VDBG 7273 RLOGD("simRefreshInd: type %d efId %d", refreshResult.type, refreshResult.efId); 7274 #endif 7275 Return<void> retStatus = radioService[slotId]->mRadioIndication->simRefresh( 7276 convertIntToRadioIndicationType(indicationType), refreshResult); 7277 radioService[slotId]->checkReturnStatus(retStatus); 7278 } else { 7279 RLOGE("simRefreshInd: radioService[%d]->mRadioIndication == NULL", slotId); 7280 } 7281 7282 return 0; 7283 } 7284 7285 void convertRilCdmaSignalInfoRecordToHal(RIL_CDMA_SignalInfoRecord *signalInfoRecord, 7286 CdmaSignalInfoRecord& record) { 7287 record.isPresent = signalInfoRecord->isPresent; 7288 record.signalType = signalInfoRecord->signalType; 7289 record.alertPitch = signalInfoRecord->alertPitch; 7290 record.signal = signalInfoRecord->signal; 7291 } 7292 7293 int radio::callRingInd(int slotId, int indicationType, 7294 int token, RIL_Errno e, void *response, size_t responseLen) { 7295 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) { 7296 bool isGsm; 7297 CdmaSignalInfoRecord record = {}; 7298 if (response == NULL || responseLen == 0) { 7299 isGsm = true; 7300 } else { 7301 isGsm = false; 7302 if (responseLen != sizeof (RIL_CDMA_SignalInfoRecord)) { 7303 RLOGE("callRingInd: invalid response"); 7304 return 0; 7305 } 7306 convertRilCdmaSignalInfoRecordToHal((RIL_CDMA_SignalInfoRecord *) response, record); 7307 } 7308 7309 #if VDBG 7310 RLOGD("callRingInd: isGsm %d", isGsm); 7311 #endif 7312 Return<void> retStatus = radioService[slotId]->mRadioIndication->callRing( 7313 convertIntToRadioIndicationType(indicationType), isGsm, record); 7314 radioService[slotId]->checkReturnStatus(retStatus); 7315 } else { 7316 RLOGE("callRingInd: radioService[%d]->mRadioIndication == NULL", slotId); 7317 } 7318 7319 return 0; 7320 } 7321 7322 int radio::simStatusChangedInd(int slotId, 7323 int indicationType, int token, RIL_Errno e, void *response, 7324 size_t responseLen) { 7325 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) { 7326 #if VDBG 7327 RLOGD("simStatusChangedInd"); 7328 #endif 7329 Return<void> retStatus = radioService[slotId]->mRadioIndication->simStatusChanged( 7330 convertIntToRadioIndicationType(indicationType)); 7331 radioService[slotId]->checkReturnStatus(retStatus); 7332 } else { 7333 RLOGE("simStatusChangedInd: radioService[%d]->mRadioIndication == NULL", slotId); 7334 } 7335 7336 return 0; 7337 } 7338 7339 int radio::cdmaNewSmsInd(int slotId, int indicationType, 7340 int token, RIL_Errno e, void *response, size_t responseLen) { 7341 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) { 7342 if (response == NULL || responseLen != sizeof(RIL_CDMA_SMS_Message)) { 7343 RLOGE("cdmaNewSmsInd: invalid response"); 7344 return 0; 7345 } 7346 7347 CdmaSmsMessage msg = {}; 7348 RIL_CDMA_SMS_Message *rilMsg = (RIL_CDMA_SMS_Message *) response; 7349 msg.teleserviceId = rilMsg->uTeleserviceID; 7350 msg.isServicePresent = rilMsg->bIsServicePresent; 7351 msg.serviceCategory = rilMsg->uServicecategory; 7352 msg.address.digitMode = 7353 (V1_0::CdmaSmsDigitMode) rilMsg->sAddress.digit_mode; 7354 msg.address.numberMode = 7355 (V1_0::CdmaSmsNumberMode) rilMsg->sAddress.number_mode; 7356 msg.address.numberType = 7357 (V1_0::CdmaSmsNumberType) rilMsg->sAddress.number_type; 7358 msg.address.numberPlan = 7359 (V1_0::CdmaSmsNumberPlan) rilMsg->sAddress.number_plan; 7360 7361 int digitLimit = MIN((rilMsg->sAddress.number_of_digits), RIL_CDMA_SMS_ADDRESS_MAX); 7362 msg.address.digits.setToExternal(rilMsg->sAddress.digits, digitLimit); 7363 7364 msg.subAddress.subaddressType = (V1_0::CdmaSmsSubaddressType) 7365 rilMsg->sSubAddress.subaddressType; 7366 msg.subAddress.odd = rilMsg->sSubAddress.odd; 7367 7368 digitLimit= MIN((rilMsg->sSubAddress.number_of_digits), RIL_CDMA_SMS_SUBADDRESS_MAX); 7369 msg.subAddress.digits.setToExternal(rilMsg->sSubAddress.digits, digitLimit); 7370 7371 digitLimit = MIN((rilMsg->uBearerDataLen), RIL_CDMA_SMS_BEARER_DATA_MAX); 7372 msg.bearerData.setToExternal(rilMsg->aBearerData, digitLimit); 7373 7374 #if VDBG 7375 RLOGD("cdmaNewSmsInd"); 7376 #endif 7377 Return<void> retStatus = radioService[slotId]->mRadioIndication->cdmaNewSms( 7378 convertIntToRadioIndicationType(indicationType), msg); 7379 radioService[slotId]->checkReturnStatus(retStatus); 7380 } else { 7381 RLOGE("cdmaNewSmsInd: radioService[%d]->mRadioIndication == NULL", slotId); 7382 } 7383 7384 return 0; 7385 } 7386 7387 int radio::newBroadcastSmsInd(int slotId, 7388 int indicationType, int token, RIL_Errno e, void *response, 7389 size_t responseLen) { 7390 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) { 7391 if (response == NULL || responseLen == 0) { 7392 RLOGE("newBroadcastSmsInd: invalid response"); 7393 return 0; 7394 } 7395 7396 hidl_vec<uint8_t> data; 7397 data.setToExternal((uint8_t *) response, responseLen); 7398 #if VDBG 7399 RLOGD("newBroadcastSmsInd"); 7400 #endif 7401 Return<void> retStatus = radioService[slotId]->mRadioIndication->newBroadcastSms( 7402 convertIntToRadioIndicationType(indicationType), data); 7403 radioService[slotId]->checkReturnStatus(retStatus); 7404 } else { 7405 RLOGE("newBroadcastSmsInd: radioService[%d]->mRadioIndication == NULL", slotId); 7406 } 7407 7408 return 0; 7409 } 7410 7411 int radio::cdmaRuimSmsStorageFullInd(int slotId, 7412 int indicationType, int token, RIL_Errno e, void *response, 7413 size_t responseLen) { 7414 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) { 7415 #if VDBG 7416 RLOGD("cdmaRuimSmsStorageFullInd"); 7417 #endif 7418 Return<void> retStatus = radioService[slotId]->mRadioIndication->cdmaRuimSmsStorageFull( 7419 convertIntToRadioIndicationType(indicationType)); 7420 radioService[slotId]->checkReturnStatus(retStatus); 7421 } else { 7422 RLOGE("cdmaRuimSmsStorageFullInd: radioService[%d]->mRadioIndication == NULL", 7423 slotId); 7424 } 7425 7426 return 0; 7427 } 7428 7429 int radio::restrictedStateChangedInd(int slotId, 7430 int indicationType, int token, RIL_Errno e, void *response, 7431 size_t responseLen) { 7432 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) { 7433 if (response == NULL || responseLen != sizeof(int)) { 7434 RLOGE("restrictedStateChangedInd: invalid response"); 7435 return 0; 7436 } 7437 int32_t state = ((int32_t *) response)[0]; 7438 #if VDBG 7439 RLOGD("restrictedStateChangedInd: state %d", state); 7440 #endif 7441 Return<void> retStatus = radioService[slotId]->mRadioIndication->restrictedStateChanged( 7442 convertIntToRadioIndicationType(indicationType), (PhoneRestrictedState) state); 7443 radioService[slotId]->checkReturnStatus(retStatus); 7444 } else { 7445 RLOGE("restrictedStateChangedInd: radioService[%d]->mRadioIndication == NULL", 7446 slotId); 7447 } 7448 7449 return 0; 7450 } 7451 7452 int radio::enterEmergencyCallbackModeInd(int slotId, 7453 int indicationType, int token, RIL_Errno e, void *response, 7454 size_t responseLen) { 7455 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) { 7456 #if VDBG 7457 RLOGD("enterEmergencyCallbackModeInd"); 7458 #endif 7459 Return<void> retStatus = radioService[slotId]->mRadioIndication->enterEmergencyCallbackMode( 7460 convertIntToRadioIndicationType(indicationType)); 7461 radioService[slotId]->checkReturnStatus(retStatus); 7462 } else { 7463 RLOGE("enterEmergencyCallbackModeInd: radioService[%d]->mRadioIndication == NULL", 7464 slotId); 7465 } 7466 7467 return 0; 7468 } 7469 7470 int radio::cdmaCallWaitingInd(int slotId, 7471 int indicationType, int token, RIL_Errno e, void *response, 7472 size_t responseLen) { 7473 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) { 7474 if (response == NULL || responseLen != sizeof(RIL_CDMA_CallWaiting_v6)) { 7475 RLOGE("cdmaCallWaitingInd: invalid response"); 7476 return 0; 7477 } 7478 7479 CdmaCallWaiting callWaitingRecord = {}; 7480 RIL_CDMA_CallWaiting_v6 *callWaitingRil = ((RIL_CDMA_CallWaiting_v6 *) response); 7481 callWaitingRecord.number = convertCharPtrToHidlString(callWaitingRil->number); 7482 callWaitingRecord.numberPresentation = 7483 (CdmaCallWaitingNumberPresentation) callWaitingRil->numberPresentation; 7484 callWaitingRecord.name = convertCharPtrToHidlString(callWaitingRil->name); 7485 convertRilCdmaSignalInfoRecordToHal(&callWaitingRil->signalInfoRecord, 7486 callWaitingRecord.signalInfoRecord); 7487 callWaitingRecord.numberType = (CdmaCallWaitingNumberType) callWaitingRil->number_type; 7488 callWaitingRecord.numberPlan = (CdmaCallWaitingNumberPlan) callWaitingRil->number_plan; 7489 7490 #if VDBG 7491 RLOGD("cdmaCallWaitingInd"); 7492 #endif 7493 Return<void> retStatus = radioService[slotId]->mRadioIndication->cdmaCallWaiting( 7494 convertIntToRadioIndicationType(indicationType), callWaitingRecord); 7495 radioService[slotId]->checkReturnStatus(retStatus); 7496 } else { 7497 RLOGE("cdmaCallWaitingInd: radioService[%d]->mRadioIndication == NULL", slotId); 7498 } 7499 7500 return 0; 7501 } 7502 7503 int radio::cdmaOtaProvisionStatusInd(int slotId, 7504 int indicationType, int token, RIL_Errno e, void *response, 7505 size_t responseLen) { 7506 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) { 7507 if (response == NULL || responseLen != sizeof(int)) { 7508 RLOGE("cdmaOtaProvisionStatusInd: invalid response"); 7509 return 0; 7510 } 7511 int32_t status = ((int32_t *) response)[0]; 7512 #if VDBG 7513 RLOGD("cdmaOtaProvisionStatusInd: status %d", status); 7514 #endif 7515 Return<void> retStatus = radioService[slotId]->mRadioIndication->cdmaOtaProvisionStatus( 7516 convertIntToRadioIndicationType(indicationType), (CdmaOtaProvisionStatus) status); 7517 radioService[slotId]->checkReturnStatus(retStatus); 7518 } else { 7519 RLOGE("cdmaOtaProvisionStatusInd: radioService[%d]->mRadioIndication == NULL", 7520 slotId); 7521 } 7522 7523 return 0; 7524 } 7525 7526 int radio::cdmaInfoRecInd(int slotId, 7527 int indicationType, int token, RIL_Errno e, void *response, 7528 size_t responseLen) { 7529 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) { 7530 if (response == NULL || responseLen != sizeof(RIL_CDMA_InformationRecords)) { 7531 RLOGE("cdmaInfoRecInd: invalid response"); 7532 return 0; 7533 } 7534 7535 CdmaInformationRecords records = {}; 7536 RIL_CDMA_InformationRecords *recordsRil = (RIL_CDMA_InformationRecords *) response; 7537 7538 char* string8 = NULL; 7539 int num = MIN(recordsRil->numberOfInfoRecs, RIL_CDMA_MAX_NUMBER_OF_INFO_RECS); 7540 if (recordsRil->numberOfInfoRecs > RIL_CDMA_MAX_NUMBER_OF_INFO_RECS) { 7541 RLOGE("cdmaInfoRecInd: received %d recs which is more than %d, dropping " 7542 "additional ones", recordsRil->numberOfInfoRecs, 7543 RIL_CDMA_MAX_NUMBER_OF_INFO_RECS); 7544 } 7545 records.infoRec.resize(num); 7546 for (int i = 0 ; i < num ; i++) { 7547 CdmaInformationRecord *record = &records.infoRec[i]; 7548 RIL_CDMA_InformationRecord *infoRec = &recordsRil->infoRec[i]; 7549 record->name = (CdmaInfoRecName) infoRec->name; 7550 // All vectors should be size 0 except one which will be size 1. Set everything to 7551 // size 0 initially. 7552 record->display.resize(0); 7553 record->number.resize(0); 7554 record->signal.resize(0); 7555 record->redir.resize(0); 7556 record->lineCtrl.resize(0); 7557 record->clir.resize(0); 7558 record->audioCtrl.resize(0); 7559 switch (infoRec->name) { 7560 case RIL_CDMA_DISPLAY_INFO_REC: 7561 case RIL_CDMA_EXTENDED_DISPLAY_INFO_REC: { 7562 if (infoRec->rec.display.alpha_len > CDMA_ALPHA_INFO_BUFFER_LENGTH) { 7563 RLOGE("cdmaInfoRecInd: invalid display info response length %d " 7564 "expected not more than %d", (int) infoRec->rec.display.alpha_len, 7565 CDMA_ALPHA_INFO_BUFFER_LENGTH); 7566 return 0; 7567 } 7568 string8 = (char*) malloc((infoRec->rec.display.alpha_len + 1) * sizeof(char)); 7569 if (string8 == NULL) { 7570 RLOGE("cdmaInfoRecInd: Memory allocation failed for " 7571 "responseCdmaInformationRecords"); 7572 return 0; 7573 } 7574 memcpy(string8, infoRec->rec.display.alpha_buf, infoRec->rec.display.alpha_len); 7575 string8[(int)infoRec->rec.display.alpha_len] = '\0'; 7576 7577 record->display.resize(1); 7578 record->display[0].alphaBuf = string8; 7579 free(string8); 7580 string8 = NULL; 7581 break; 7582 } 7583 7584 case RIL_CDMA_CALLED_PARTY_NUMBER_INFO_REC: 7585 case RIL_CDMA_CALLING_PARTY_NUMBER_INFO_REC: 7586 case RIL_CDMA_CONNECTED_NUMBER_INFO_REC: { 7587 if (infoRec->rec.number.len > CDMA_NUMBER_INFO_BUFFER_LENGTH) { 7588 RLOGE("cdmaInfoRecInd: invalid display info response length %d " 7589 "expected not more than %d", (int) infoRec->rec.number.len, 7590 CDMA_NUMBER_INFO_BUFFER_LENGTH); 7591 return 0; 7592 } 7593 string8 = (char*) malloc((infoRec->rec.number.len + 1) * sizeof(char)); 7594 if (string8 == NULL) { 7595 RLOGE("cdmaInfoRecInd: Memory allocation failed for " 7596 "responseCdmaInformationRecords"); 7597 return 0; 7598 } 7599 memcpy(string8, infoRec->rec.number.buf, infoRec->rec.number.len); 7600 string8[(int)infoRec->rec.number.len] = '\0'; 7601 7602 record->number.resize(1); 7603 record->number[0].number = string8; 7604 free(string8); 7605 string8 = NULL; 7606 record->number[0].numberType = infoRec->rec.number.number_type; 7607 record->number[0].numberPlan = infoRec->rec.number.number_plan; 7608 record->number[0].pi = infoRec->rec.number.pi; 7609 record->number[0].si = infoRec->rec.number.si; 7610 break; 7611 } 7612 7613 case RIL_CDMA_SIGNAL_INFO_REC: { 7614 record->signal.resize(1); 7615 record->signal[0].isPresent = infoRec->rec.signal.isPresent; 7616 record->signal[0].signalType = infoRec->rec.signal.signalType; 7617 record->signal[0].alertPitch = infoRec->rec.signal.alertPitch; 7618 record->signal[0].signal = infoRec->rec.signal.signal; 7619 break; 7620 } 7621 7622 case RIL_CDMA_REDIRECTING_NUMBER_INFO_REC: { 7623 if (infoRec->rec.redir.redirectingNumber.len > 7624 CDMA_NUMBER_INFO_BUFFER_LENGTH) { 7625 RLOGE("cdmaInfoRecInd: invalid display info response length %d " 7626 "expected not more than %d\n", 7627 (int)infoRec->rec.redir.redirectingNumber.len, 7628 CDMA_NUMBER_INFO_BUFFER_LENGTH); 7629 return 0; 7630 } 7631 string8 = (char*) malloc((infoRec->rec.redir.redirectingNumber.len + 1) * 7632 sizeof(char)); 7633 if (string8 == NULL) { 7634 RLOGE("cdmaInfoRecInd: Memory allocation failed for " 7635 "responseCdmaInformationRecords"); 7636 return 0; 7637 } 7638 memcpy(string8, infoRec->rec.redir.redirectingNumber.buf, 7639 infoRec->rec.redir.redirectingNumber.len); 7640 string8[(int)infoRec->rec.redir.redirectingNumber.len] = '\0'; 7641 7642 record->redir.resize(1); 7643 record->redir[0].redirectingNumber.number = string8; 7644 free(string8); 7645 string8 = NULL; 7646 record->redir[0].redirectingNumber.numberType = 7647 infoRec->rec.redir.redirectingNumber.number_type; 7648 record->redir[0].redirectingNumber.numberPlan = 7649 infoRec->rec.redir.redirectingNumber.number_plan; 7650 record->redir[0].redirectingNumber.pi = infoRec->rec.redir.redirectingNumber.pi; 7651 record->redir[0].redirectingNumber.si = infoRec->rec.redir.redirectingNumber.si; 7652 record->redir[0].redirectingReason = 7653 (CdmaRedirectingReason) infoRec->rec.redir.redirectingReason; 7654 break; 7655 } 7656 7657 case RIL_CDMA_LINE_CONTROL_INFO_REC: { 7658 record->lineCtrl.resize(1); 7659 record->lineCtrl[0].lineCtrlPolarityIncluded = 7660 infoRec->rec.lineCtrl.lineCtrlPolarityIncluded; 7661 record->lineCtrl[0].lineCtrlToggle = infoRec->rec.lineCtrl.lineCtrlToggle; 7662 record->lineCtrl[0].lineCtrlReverse = infoRec->rec.lineCtrl.lineCtrlReverse; 7663 record->lineCtrl[0].lineCtrlPowerDenial = 7664 infoRec->rec.lineCtrl.lineCtrlPowerDenial; 7665 break; 7666 } 7667 7668 case RIL_CDMA_T53_CLIR_INFO_REC: { 7669 record->clir.resize(1); 7670 record->clir[0].cause = infoRec->rec.clir.cause; 7671 break; 7672 } 7673 7674 case RIL_CDMA_T53_AUDIO_CONTROL_INFO_REC: { 7675 record->audioCtrl.resize(1); 7676 record->audioCtrl[0].upLink = infoRec->rec.audioCtrl.upLink; 7677 record->audioCtrl[0].downLink = infoRec->rec.audioCtrl.downLink; 7678 break; 7679 } 7680 7681 case RIL_CDMA_T53_RELEASE_INFO_REC: 7682 RLOGE("cdmaInfoRecInd: RIL_CDMA_T53_RELEASE_INFO_REC: INVALID"); 7683 return 0; 7684 7685 default: 7686 RLOGE("cdmaInfoRecInd: Incorrect name value"); 7687 return 0; 7688 } 7689 } 7690 7691 #if VDBG 7692 RLOGD("cdmaInfoRecInd"); 7693 #endif 7694 Return<void> retStatus = radioService[slotId]->mRadioIndication->cdmaInfoRec( 7695 convertIntToRadioIndicationType(indicationType), records); 7696 radioService[slotId]->checkReturnStatus(retStatus); 7697 } else { 7698 RLOGE("cdmaInfoRecInd: radioService[%d]->mRadioIndication == NULL", slotId); 7699 } 7700 7701 return 0; 7702 } 7703 7704 int radio::indicateRingbackToneInd(int slotId, 7705 int indicationType, int token, RIL_Errno e, void *response, 7706 size_t responseLen) { 7707 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) { 7708 if (response == NULL || responseLen != sizeof(int)) { 7709 RLOGE("indicateRingbackToneInd: invalid response"); 7710 return 0; 7711 } 7712 bool start = ((int32_t *) response)[0]; 7713 #if VDBG 7714 RLOGD("indicateRingbackToneInd: start %d", start); 7715 #endif 7716 Return<void> retStatus = radioService[slotId]->mRadioIndication->indicateRingbackTone( 7717 convertIntToRadioIndicationType(indicationType), start); 7718 radioService[slotId]->checkReturnStatus(retStatus); 7719 } else { 7720 RLOGE("indicateRingbackToneInd: radioService[%d]->mRadioIndication == NULL", slotId); 7721 } 7722 7723 return 0; 7724 } 7725 7726 int radio::resendIncallMuteInd(int slotId, 7727 int indicationType, int token, RIL_Errno e, void *response, 7728 size_t responseLen) { 7729 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) { 7730 #if VDBG 7731 RLOGD("resendIncallMuteInd"); 7732 #endif 7733 Return<void> retStatus = radioService[slotId]->mRadioIndication->resendIncallMute( 7734 convertIntToRadioIndicationType(indicationType)); 7735 radioService[slotId]->checkReturnStatus(retStatus); 7736 } else { 7737 RLOGE("resendIncallMuteInd: radioService[%d]->mRadioIndication == NULL", slotId); 7738 } 7739 7740 return 0; 7741 } 7742 7743 int radio::cdmaSubscriptionSourceChangedInd(int slotId, 7744 int indicationType, int token, RIL_Errno e, 7745 void *response, size_t responseLen) { 7746 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) { 7747 if (response == NULL || responseLen != sizeof(int)) { 7748 RLOGE("cdmaSubscriptionSourceChangedInd: invalid response"); 7749 return 0; 7750 } 7751 int32_t cdmaSource = ((int32_t *) response)[0]; 7752 #if VDBG 7753 RLOGD("cdmaSubscriptionSourceChangedInd: cdmaSource %d", cdmaSource); 7754 #endif 7755 Return<void> retStatus = radioService[slotId]->mRadioIndication-> 7756 cdmaSubscriptionSourceChanged(convertIntToRadioIndicationType(indicationType), 7757 (CdmaSubscriptionSource) cdmaSource); 7758 radioService[slotId]->checkReturnStatus(retStatus); 7759 } else { 7760 RLOGE("cdmaSubscriptionSourceChangedInd: radioService[%d]->mRadioIndication == NULL", 7761 slotId); 7762 } 7763 7764 return 0; 7765 } 7766 7767 int radio::cdmaPrlChangedInd(int slotId, 7768 int indicationType, int token, RIL_Errno e, void *response, 7769 size_t responseLen) { 7770 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) { 7771 if (response == NULL || responseLen != sizeof(int)) { 7772 RLOGE("cdmaPrlChangedInd: invalid response"); 7773 return 0; 7774 } 7775 int32_t version = ((int32_t *) response)[0]; 7776 #if VDBG 7777 RLOGD("cdmaPrlChangedInd: version %d", version); 7778 #endif 7779 Return<void> retStatus = radioService[slotId]->mRadioIndication->cdmaPrlChanged( 7780 convertIntToRadioIndicationType(indicationType), version); 7781 radioService[slotId]->checkReturnStatus(retStatus); 7782 } else { 7783 RLOGE("cdmaPrlChangedInd: radioService[%d]->mRadioIndication == NULL", slotId); 7784 } 7785 7786 return 0; 7787 } 7788 7789 int radio::exitEmergencyCallbackModeInd(int slotId, 7790 int indicationType, int token, RIL_Errno e, void *response, 7791 size_t responseLen) { 7792 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) { 7793 #if VDBG 7794 RLOGD("exitEmergencyCallbackModeInd"); 7795 #endif 7796 Return<void> retStatus = radioService[slotId]->mRadioIndication->exitEmergencyCallbackMode( 7797 convertIntToRadioIndicationType(indicationType)); 7798 radioService[slotId]->checkReturnStatus(retStatus); 7799 } else { 7800 RLOGE("exitEmergencyCallbackModeInd: radioService[%d]->mRadioIndication == NULL", 7801 slotId); 7802 } 7803 7804 return 0; 7805 } 7806 7807 int radio::rilConnectedInd(int slotId, 7808 int indicationType, int token, RIL_Errno e, void *response, 7809 size_t responseLen) { 7810 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) { 7811 RLOGD("rilConnectedInd"); 7812 Return<void> retStatus = radioService[slotId]->mRadioIndication->rilConnected( 7813 convertIntToRadioIndicationType(indicationType)); 7814 radioService[slotId]->checkReturnStatus(retStatus); 7815 } else { 7816 RLOGE("rilConnectedInd: radioService[%d]->mRadioIndication == NULL", slotId); 7817 } 7818 7819 return 0; 7820 } 7821 7822 int radio::voiceRadioTechChangedInd(int slotId, 7823 int indicationType, int token, RIL_Errno e, void *response, 7824 size_t responseLen) { 7825 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) { 7826 if (response == NULL || responseLen != sizeof(int)) { 7827 RLOGE("voiceRadioTechChangedInd: invalid response"); 7828 return 0; 7829 } 7830 int32_t rat = ((int32_t *) response)[0]; 7831 #if VDBG 7832 RLOGD("voiceRadioTechChangedInd: rat %d", rat); 7833 #endif 7834 Return<void> retStatus = radioService[slotId]->mRadioIndication->voiceRadioTechChanged( 7835 convertIntToRadioIndicationType(indicationType), (RadioTechnology) rat); 7836 radioService[slotId]->checkReturnStatus(retStatus); 7837 } else { 7838 RLOGE("voiceRadioTechChangedInd: radioService[%d]->mRadioIndication == NULL", 7839 slotId); 7840 } 7841 7842 return 0; 7843 } 7844 7845 void convertRilCellInfoListToHal(void *response, size_t responseLen, hidl_vec<CellInfo>& records) { 7846 int num = responseLen / sizeof(RIL_CellInfo_v12); 7847 records.resize(num); 7848 7849 RIL_CellInfo_v12 *rillCellInfo = (RIL_CellInfo_v12 *) response; 7850 for (int i = 0; i < num; i++) { 7851 records[i].cellInfoType = (CellInfoType) rillCellInfo->cellInfoType; 7852 records[i].registered = rillCellInfo->registered; 7853 records[i].timeStampType = (TimeStampType) rillCellInfo->timeStampType; 7854 records[i].timeStamp = rillCellInfo->timeStamp; 7855 // All vectors should be size 0 except one which will be size 1. Set everything to 7856 // size 0 initially. 7857 records[i].gsm.resize(0); 7858 records[i].wcdma.resize(0); 7859 records[i].cdma.resize(0); 7860 records[i].lte.resize(0); 7861 records[i].tdscdma.resize(0); 7862 switch(rillCellInfo->cellInfoType) { 7863 case RIL_CELL_INFO_TYPE_GSM: { 7864 records[i].gsm.resize(1); 7865 CellInfoGsm *cellInfoGsm = &records[i].gsm[0]; 7866 cellInfoGsm->cellIdentityGsm.mcc = 7867 std::to_string(rillCellInfo->CellInfo.gsm.cellIdentityGsm.mcc); 7868 cellInfoGsm->cellIdentityGsm.mnc = 7869 std::to_string(rillCellInfo->CellInfo.gsm.cellIdentityGsm.mnc); 7870 cellInfoGsm->cellIdentityGsm.lac = 7871 rillCellInfo->CellInfo.gsm.cellIdentityGsm.lac; 7872 cellInfoGsm->cellIdentityGsm.cid = 7873 rillCellInfo->CellInfo.gsm.cellIdentityGsm.cid; 7874 cellInfoGsm->cellIdentityGsm.arfcn = 7875 rillCellInfo->CellInfo.gsm.cellIdentityGsm.arfcn; 7876 cellInfoGsm->cellIdentityGsm.bsic = 7877 rillCellInfo->CellInfo.gsm.cellIdentityGsm.bsic; 7878 cellInfoGsm->signalStrengthGsm.signalStrength = 7879 rillCellInfo->CellInfo.gsm.signalStrengthGsm.signalStrength; 7880 cellInfoGsm->signalStrengthGsm.bitErrorRate = 7881 rillCellInfo->CellInfo.gsm.signalStrengthGsm.bitErrorRate; 7882 cellInfoGsm->signalStrengthGsm.timingAdvance = 7883 rillCellInfo->CellInfo.gsm.signalStrengthGsm.timingAdvance; 7884 break; 7885 } 7886 7887 case RIL_CELL_INFO_TYPE_WCDMA: { 7888 records[i].wcdma.resize(1); 7889 CellInfoWcdma *cellInfoWcdma = &records[i].wcdma[0]; 7890 cellInfoWcdma->cellIdentityWcdma.mcc = 7891 std::to_string(rillCellInfo->CellInfo.wcdma.cellIdentityWcdma.mcc); 7892 cellInfoWcdma->cellIdentityWcdma.mnc = 7893 std::to_string(rillCellInfo->CellInfo.wcdma.cellIdentityWcdma.mnc); 7894 cellInfoWcdma->cellIdentityWcdma.lac = 7895 rillCellInfo->CellInfo.wcdma.cellIdentityWcdma.lac; 7896 cellInfoWcdma->cellIdentityWcdma.cid = 7897 rillCellInfo->CellInfo.wcdma.cellIdentityWcdma.cid; 7898 cellInfoWcdma->cellIdentityWcdma.psc = 7899 rillCellInfo->CellInfo.wcdma.cellIdentityWcdma.psc; 7900 cellInfoWcdma->cellIdentityWcdma.uarfcn = 7901 rillCellInfo->CellInfo.wcdma.cellIdentityWcdma.uarfcn; 7902 cellInfoWcdma->signalStrengthWcdma.signalStrength = 7903 rillCellInfo->CellInfo.wcdma.signalStrengthWcdma.signalStrength; 7904 cellInfoWcdma->signalStrengthWcdma.bitErrorRate = 7905 rillCellInfo->CellInfo.wcdma.signalStrengthWcdma.bitErrorRate; 7906 break; 7907 } 7908 7909 case RIL_CELL_INFO_TYPE_CDMA: { 7910 records[i].cdma.resize(1); 7911 CellInfoCdma *cellInfoCdma = &records[i].cdma[0]; 7912 cellInfoCdma->cellIdentityCdma.networkId = 7913 rillCellInfo->CellInfo.cdma.cellIdentityCdma.networkId; 7914 cellInfoCdma->cellIdentityCdma.systemId = 7915 rillCellInfo->CellInfo.cdma.cellIdentityCdma.systemId; 7916 cellInfoCdma->cellIdentityCdma.baseStationId = 7917 rillCellInfo->CellInfo.cdma.cellIdentityCdma.basestationId; 7918 cellInfoCdma->cellIdentityCdma.longitude = 7919 rillCellInfo->CellInfo.cdma.cellIdentityCdma.longitude; 7920 cellInfoCdma->cellIdentityCdma.latitude = 7921 rillCellInfo->CellInfo.cdma.cellIdentityCdma.latitude; 7922 cellInfoCdma->signalStrengthCdma.dbm = 7923 rillCellInfo->CellInfo.cdma.signalStrengthCdma.dbm; 7924 cellInfoCdma->signalStrengthCdma.ecio = 7925 rillCellInfo->CellInfo.cdma.signalStrengthCdma.ecio; 7926 cellInfoCdma->signalStrengthEvdo.dbm = 7927 rillCellInfo->CellInfo.cdma.signalStrengthEvdo.dbm; 7928 cellInfoCdma->signalStrengthEvdo.ecio = 7929 rillCellInfo->CellInfo.cdma.signalStrengthEvdo.ecio; 7930 cellInfoCdma->signalStrengthEvdo.signalNoiseRatio = 7931 rillCellInfo->CellInfo.cdma.signalStrengthEvdo.signalNoiseRatio; 7932 break; 7933 } 7934 7935 case RIL_CELL_INFO_TYPE_LTE: { 7936 records[i].lte.resize(1); 7937 CellInfoLte *cellInfoLte = &records[i].lte[0]; 7938 cellInfoLte->cellIdentityLte.mcc = 7939 std::to_string(rillCellInfo->CellInfo.lte.cellIdentityLte.mcc); 7940 cellInfoLte->cellIdentityLte.mnc = 7941 std::to_string(rillCellInfo->CellInfo.lte.cellIdentityLte.mnc); 7942 cellInfoLte->cellIdentityLte.ci = 7943 rillCellInfo->CellInfo.lte.cellIdentityLte.ci; 7944 cellInfoLte->cellIdentityLte.pci = 7945 rillCellInfo->CellInfo.lte.cellIdentityLte.pci; 7946 cellInfoLte->cellIdentityLte.tac = 7947 rillCellInfo->CellInfo.lte.cellIdentityLte.tac; 7948 cellInfoLte->cellIdentityLte.earfcn = 7949 rillCellInfo->CellInfo.lte.cellIdentityLte.earfcn; 7950 cellInfoLte->signalStrengthLte.signalStrength = 7951 rillCellInfo->CellInfo.lte.signalStrengthLte.signalStrength; 7952 cellInfoLte->signalStrengthLte.rsrp = 7953 rillCellInfo->CellInfo.lte.signalStrengthLte.rsrp; 7954 cellInfoLte->signalStrengthLte.rsrq = 7955 rillCellInfo->CellInfo.lte.signalStrengthLte.rsrq; 7956 cellInfoLte->signalStrengthLte.rssnr = 7957 rillCellInfo->CellInfo.lte.signalStrengthLte.rssnr; 7958 cellInfoLte->signalStrengthLte.cqi = 7959 rillCellInfo->CellInfo.lte.signalStrengthLte.cqi; 7960 cellInfoLte->signalStrengthLte.timingAdvance = 7961 rillCellInfo->CellInfo.lte.signalStrengthLte.timingAdvance; 7962 break; 7963 } 7964 7965 case RIL_CELL_INFO_TYPE_TD_SCDMA: { 7966 records[i].tdscdma.resize(1); 7967 CellInfoTdscdma *cellInfoTdscdma = &records[i].tdscdma[0]; 7968 cellInfoTdscdma->cellIdentityTdscdma.mcc = 7969 std::to_string(rillCellInfo->CellInfo.tdscdma.cellIdentityTdscdma.mcc); 7970 cellInfoTdscdma->cellIdentityTdscdma.mnc = 7971 std::to_string(rillCellInfo->CellInfo.tdscdma.cellIdentityTdscdma.mnc); 7972 cellInfoTdscdma->cellIdentityTdscdma.lac = 7973 rillCellInfo->CellInfo.tdscdma.cellIdentityTdscdma.lac; 7974 cellInfoTdscdma->cellIdentityTdscdma.cid = 7975 rillCellInfo->CellInfo.tdscdma.cellIdentityTdscdma.cid; 7976 cellInfoTdscdma->cellIdentityTdscdma.cpid = 7977 rillCellInfo->CellInfo.tdscdma.cellIdentityTdscdma.cpid; 7978 cellInfoTdscdma->signalStrengthTdscdma.rscp = 7979 rillCellInfo->CellInfo.tdscdma.signalStrengthTdscdma.rscp; 7980 break; 7981 } 7982 default: { 7983 break; 7984 } 7985 } 7986 rillCellInfo += 1; 7987 } 7988 } 7989 7990 int radio::cellInfoListInd(int slotId, 7991 int indicationType, int token, RIL_Errno e, void *response, 7992 size_t responseLen) { 7993 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) { 7994 if ((response == NULL && responseLen != 0) || responseLen % sizeof(RIL_CellInfo_v12) != 0) { 7995 RLOGE("cellInfoListInd: invalid response"); 7996 return 0; 7997 } 7998 7999 hidl_vec<CellInfo> records; 8000 convertRilCellInfoListToHal(response, responseLen, records); 8001 8002 #if VDBG 8003 RLOGD("cellInfoListInd"); 8004 #endif 8005 Return<void> retStatus = radioService[slotId]->mRadioIndication->cellInfoList( 8006 convertIntToRadioIndicationType(indicationType), records); 8007 radioService[slotId]->checkReturnStatus(retStatus); 8008 } else { 8009 RLOGE("cellInfoListInd: radioService[%d]->mRadioIndication == NULL", slotId); 8010 } 8011 8012 return 0; 8013 } 8014 8015 int radio::imsNetworkStateChangedInd(int slotId, 8016 int indicationType, int token, RIL_Errno e, void *response, 8017 size_t responseLen) { 8018 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) { 8019 #if VDBG 8020 RLOGD("imsNetworkStateChangedInd"); 8021 #endif 8022 Return<void> retStatus = radioService[slotId]->mRadioIndication->imsNetworkStateChanged( 8023 convertIntToRadioIndicationType(indicationType)); 8024 radioService[slotId]->checkReturnStatus(retStatus); 8025 } else { 8026 RLOGE("imsNetworkStateChangedInd: radioService[%d]->mRadioIndication == NULL", 8027 slotId); 8028 } 8029 8030 return 0; 8031 } 8032 8033 int radio::subscriptionStatusChangedInd(int slotId, 8034 int indicationType, int token, RIL_Errno e, void *response, 8035 size_t responseLen) { 8036 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) { 8037 if (response == NULL || responseLen != sizeof(int)) { 8038 RLOGE("subscriptionStatusChangedInd: invalid response"); 8039 return 0; 8040 } 8041 bool activate = ((int32_t *) response)[0]; 8042 #if VDBG 8043 RLOGD("subscriptionStatusChangedInd: activate %d", activate); 8044 #endif 8045 Return<void> retStatus = radioService[slotId]->mRadioIndication->subscriptionStatusChanged( 8046 convertIntToRadioIndicationType(indicationType), activate); 8047 radioService[slotId]->checkReturnStatus(retStatus); 8048 } else { 8049 RLOGE("subscriptionStatusChangedInd: radioService[%d]->mRadioIndication == NULL", 8050 slotId); 8051 } 8052 8053 return 0; 8054 } 8055 8056 int radio::srvccStateNotifyInd(int slotId, 8057 int indicationType, int token, RIL_Errno e, void *response, 8058 size_t responseLen) { 8059 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) { 8060 if (response == NULL || responseLen != sizeof(int)) { 8061 RLOGE("srvccStateNotifyInd: invalid response"); 8062 return 0; 8063 } 8064 int32_t state = ((int32_t *) response)[0]; 8065 #if VDBG 8066 RLOGD("srvccStateNotifyInd: rat %d", state); 8067 #endif 8068 Return<void> retStatus = radioService[slotId]->mRadioIndication->srvccStateNotify( 8069 convertIntToRadioIndicationType(indicationType), (SrvccState) state); 8070 radioService[slotId]->checkReturnStatus(retStatus); 8071 } else { 8072 RLOGE("srvccStateNotifyInd: radioService[%d]->mRadioIndication == NULL", slotId); 8073 } 8074 8075 return 0; 8076 } 8077 8078 void convertRilHardwareConfigListToHal(void *response, size_t responseLen, 8079 hidl_vec<HardwareConfig>& records) { 8080 int num = responseLen / sizeof(RIL_HardwareConfig); 8081 records.resize(num); 8082 8083 RIL_HardwareConfig *rilHardwareConfig = (RIL_HardwareConfig *) response; 8084 for (int i = 0; i < num; i++) { 8085 records[i].type = (HardwareConfigType) rilHardwareConfig[i].type; 8086 records[i].uuid = convertCharPtrToHidlString(rilHardwareConfig[i].uuid); 8087 records[i].state = (HardwareConfigState) rilHardwareConfig[i].state; 8088 switch (rilHardwareConfig[i].type) { 8089 case RIL_HARDWARE_CONFIG_MODEM: { 8090 records[i].modem.resize(1); 8091 records[i].sim.resize(0); 8092 HardwareConfigModem *hwConfigModem = &records[i].modem[0]; 8093 hwConfigModem->rat = rilHardwareConfig[i].cfg.modem.rat; 8094 hwConfigModem->maxVoice = rilHardwareConfig[i].cfg.modem.maxVoice; 8095 hwConfigModem->maxData = rilHardwareConfig[i].cfg.modem.maxData; 8096 hwConfigModem->maxStandby = rilHardwareConfig[i].cfg.modem.maxStandby; 8097 break; 8098 } 8099 8100 case RIL_HARDWARE_CONFIG_SIM: { 8101 records[i].sim.resize(1); 8102 records[i].modem.resize(0); 8103 records[i].sim[0].modemUuid = 8104 convertCharPtrToHidlString(rilHardwareConfig[i].cfg.sim.modemUuid); 8105 break; 8106 } 8107 } 8108 } 8109 } 8110 8111 int radio::hardwareConfigChangedInd(int slotId, 8112 int indicationType, int token, RIL_Errno e, void *response, 8113 size_t responseLen) { 8114 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) { 8115 if ((response == NULL && responseLen != 0) 8116 || responseLen % sizeof(RIL_HardwareConfig) != 0) { 8117 RLOGE("hardwareConfigChangedInd: invalid response"); 8118 return 0; 8119 } 8120 8121 hidl_vec<HardwareConfig> configs; 8122 convertRilHardwareConfigListToHal(response, responseLen, configs); 8123 8124 #if VDBG 8125 RLOGD("hardwareConfigChangedInd"); 8126 #endif 8127 Return<void> retStatus = radioService[slotId]->mRadioIndication->hardwareConfigChanged( 8128 convertIntToRadioIndicationType(indicationType), configs); 8129 radioService[slotId]->checkReturnStatus(retStatus); 8130 } else { 8131 RLOGE("hardwareConfigChangedInd: radioService[%d]->mRadioIndication == NULL", 8132 slotId); 8133 } 8134 8135 return 0; 8136 } 8137 8138 void convertRilRadioCapabilityToHal(void *response, size_t responseLen, RadioCapability& rc) { 8139 RIL_RadioCapability *rilRadioCapability = (RIL_RadioCapability *) response; 8140 rc.session = rilRadioCapability->session; 8141 rc.phase = (V1_0::RadioCapabilityPhase) rilRadioCapability->phase; 8142 rc.raf = rilRadioCapability->rat; 8143 rc.logicalModemUuid = convertCharPtrToHidlString(rilRadioCapability->logicalModemUuid); 8144 rc.status = (V1_0::RadioCapabilityStatus) rilRadioCapability->status; 8145 } 8146 8147 int radio::radioCapabilityIndicationInd(int slotId, 8148 int indicationType, int token, RIL_Errno e, void *response, 8149 size_t responseLen) { 8150 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) { 8151 if (response == NULL || responseLen != sizeof(RIL_RadioCapability)) { 8152 RLOGE("radioCapabilityIndicationInd: invalid response"); 8153 return 0; 8154 } 8155 8156 RadioCapability rc = {}; 8157 convertRilRadioCapabilityToHal(response, responseLen, rc); 8158 8159 #if VDBG 8160 RLOGD("radioCapabilityIndicationInd"); 8161 #endif 8162 Return<void> retStatus = radioService[slotId]->mRadioIndication->radioCapabilityIndication( 8163 convertIntToRadioIndicationType(indicationType), rc); 8164 radioService[slotId]->checkReturnStatus(retStatus); 8165 } else { 8166 RLOGE("radioCapabilityIndicationInd: radioService[%d]->mRadioIndication == NULL", 8167 slotId); 8168 } 8169 8170 return 0; 8171 } 8172 8173 bool isServiceTypeCfQuery(RIL_SsServiceType serType, RIL_SsRequestType reqType) { 8174 if ((reqType == SS_INTERROGATION) && 8175 (serType == SS_CFU || 8176 serType == SS_CF_BUSY || 8177 serType == SS_CF_NO_REPLY || 8178 serType == SS_CF_NOT_REACHABLE || 8179 serType == SS_CF_ALL || 8180 serType == SS_CF_ALL_CONDITIONAL)) { 8181 return true; 8182 } 8183 return false; 8184 } 8185 8186 int radio::onSupplementaryServiceIndicationInd(int slotId, 8187 int indicationType, int token, RIL_Errno e, 8188 void *response, size_t responseLen) { 8189 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) { 8190 if (response == NULL || responseLen != sizeof(RIL_StkCcUnsolSsResponse)) { 8191 RLOGE("onSupplementaryServiceIndicationInd: invalid response"); 8192 return 0; 8193 } 8194 8195 RIL_StkCcUnsolSsResponse *rilSsResponse = (RIL_StkCcUnsolSsResponse *) response; 8196 StkCcUnsolSsResult ss = {}; 8197 ss.serviceType = (SsServiceType) rilSsResponse->serviceType; 8198 ss.requestType = (SsRequestType) rilSsResponse->requestType; 8199 ss.teleserviceType = (SsTeleserviceType) rilSsResponse->teleserviceType; 8200 ss.serviceClass = rilSsResponse->serviceClass; 8201 ss.result = (RadioError) rilSsResponse->result; 8202 8203 if (isServiceTypeCfQuery(rilSsResponse->serviceType, rilSsResponse->requestType)) { 8204 #if VDBG 8205 RLOGD("onSupplementaryServiceIndicationInd CF type, num of Cf elements %d", 8206 rilSsResponse->cfData.numValidIndexes); 8207 #endif 8208 if (rilSsResponse->cfData.numValidIndexes > NUM_SERVICE_CLASSES) { 8209 RLOGE("onSupplementaryServiceIndicationInd numValidIndexes is greater than " 8210 "max value %d, truncating it to max value", NUM_SERVICE_CLASSES); 8211 rilSsResponse->cfData.numValidIndexes = NUM_SERVICE_CLASSES; 8212 } 8213 8214 ss.cfData.resize(1); 8215 ss.ssInfo.resize(0); 8216 8217 /* number of call info's */ 8218 ss.cfData[0].cfInfo.resize(rilSsResponse->cfData.numValidIndexes); 8219 8220 for (int i = 0; i < rilSsResponse->cfData.numValidIndexes; i++) { 8221 RIL_CallForwardInfo cf = rilSsResponse->cfData.cfInfo[i]; 8222 CallForwardInfo *cfInfo = &ss.cfData[0].cfInfo[i]; 8223 8224 cfInfo->status = (CallForwardInfoStatus) cf.status; 8225 cfInfo->reason = cf.reason; 8226 cfInfo->serviceClass = cf.serviceClass; 8227 cfInfo->toa = cf.toa; 8228 cfInfo->number = convertCharPtrToHidlString(cf.number); 8229 cfInfo->timeSeconds = cf.timeSeconds; 8230 #if VDBG 8231 RLOGD("onSupplementaryServiceIndicationInd: " 8232 "Data: %d,reason=%d,cls=%d,toa=%d,num=%s,tout=%d],", cf.status, 8233 cf.reason, cf.serviceClass, cf.toa, (char*)cf.number, cf.timeSeconds); 8234 #endif 8235 } 8236 } else { 8237 ss.ssInfo.resize(1); 8238 ss.cfData.resize(0); 8239 8240 /* each int */ 8241 ss.ssInfo[0].ssInfo.resize(SS_INFO_MAX); 8242 for (int i = 0; i < SS_INFO_MAX; i++) { 8243 #if VDBG 8244 RLOGD("onSupplementaryServiceIndicationInd: Data: %d", 8245 rilSsResponse->ssInfo[i]); 8246 #endif 8247 ss.ssInfo[0].ssInfo[i] = rilSsResponse->ssInfo[i]; 8248 } 8249 } 8250 8251 #if VDBG 8252 RLOGD("onSupplementaryServiceIndicationInd"); 8253 #endif 8254 Return<void> retStatus = radioService[slotId]->mRadioIndication-> 8255 onSupplementaryServiceIndication(convertIntToRadioIndicationType(indicationType), 8256 ss); 8257 radioService[slotId]->checkReturnStatus(retStatus); 8258 } else { 8259 RLOGE("onSupplementaryServiceIndicationInd: " 8260 "radioService[%d]->mRadioIndication == NULL", slotId); 8261 } 8262 8263 return 0; 8264 } 8265 8266 int radio::stkCallControlAlphaNotifyInd(int slotId, 8267 int indicationType, int token, RIL_Errno e, void *response, 8268 size_t responseLen) { 8269 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) { 8270 if (response == NULL || responseLen == 0) { 8271 RLOGE("stkCallControlAlphaNotifyInd: invalid response"); 8272 return 0; 8273 } 8274 #if VDBG 8275 RLOGD("stkCallControlAlphaNotifyInd"); 8276 #endif 8277 Return<void> retStatus = radioService[slotId]->mRadioIndication->stkCallControlAlphaNotify( 8278 convertIntToRadioIndicationType(indicationType), 8279 convertCharPtrToHidlString((char *) response)); 8280 radioService[slotId]->checkReturnStatus(retStatus); 8281 } else { 8282 RLOGE("stkCallControlAlphaNotifyInd: radioService[%d]->mRadioIndication == NULL", 8283 slotId); 8284 } 8285 8286 return 0; 8287 } 8288 8289 void convertRilLceDataInfoToHal(void *response, size_t responseLen, LceDataInfo& lce) { 8290 RIL_LceDataInfo *rilLceDataInfo = (RIL_LceDataInfo *)response; 8291 lce.lastHopCapacityKbps = rilLceDataInfo->last_hop_capacity_kbps; 8292 lce.confidenceLevel = rilLceDataInfo->confidence_level; 8293 lce.lceSuspended = rilLceDataInfo->lce_suspended; 8294 } 8295 8296 int radio::lceDataInd(int slotId, 8297 int indicationType, int token, RIL_Errno e, void *response, 8298 size_t responseLen) { 8299 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) { 8300 if (response == NULL || responseLen != sizeof(RIL_LceDataInfo)) { 8301 RLOGE("lceDataInd: invalid response"); 8302 return 0; 8303 } 8304 8305 LceDataInfo lce = {}; 8306 convertRilLceDataInfoToHal(response, responseLen, lce); 8307 #if VDBG 8308 RLOGD("lceDataInd"); 8309 #endif 8310 Return<void> retStatus = radioService[slotId]->mRadioIndication->lceData( 8311 convertIntToRadioIndicationType(indicationType), lce); 8312 radioService[slotId]->checkReturnStatus(retStatus); 8313 } else { 8314 RLOGE("lceDataInd: radioService[%d]->mRadioIndication == NULL", slotId); 8315 } 8316 8317 return 0; 8318 } 8319 8320 int radio::pcoDataInd(int slotId, 8321 int indicationType, int token, RIL_Errno e, void *response, 8322 size_t responseLen) { 8323 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) { 8324 if (response == NULL || responseLen != sizeof(RIL_PCO_Data)) { 8325 RLOGE("pcoDataInd: invalid response"); 8326 return 0; 8327 } 8328 8329 PcoDataInfo pco = {}; 8330 RIL_PCO_Data *rilPcoData = (RIL_PCO_Data *)response; 8331 pco.cid = rilPcoData->cid; 8332 pco.bearerProto = convertCharPtrToHidlString(rilPcoData->bearer_proto); 8333 pco.pcoId = rilPcoData->pco_id; 8334 pco.contents.setToExternal((uint8_t *) rilPcoData->contents, rilPcoData->contents_length); 8335 8336 #if VDBG 8337 RLOGD("pcoDataInd"); 8338 #endif 8339 Return<void> retStatus = radioService[slotId]->mRadioIndication->pcoData( 8340 convertIntToRadioIndicationType(indicationType), pco); 8341 radioService[slotId]->checkReturnStatus(retStatus); 8342 } else { 8343 RLOGE("pcoDataInd: radioService[%d]->mRadioIndication == NULL", slotId); 8344 } 8345 8346 return 0; 8347 } 8348 8349 int radio::modemResetInd(int slotId, 8350 int indicationType, int token, RIL_Errno e, void *response, 8351 size_t responseLen) { 8352 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndication != NULL) { 8353 if (response == NULL || responseLen == 0) { 8354 RLOGE("modemResetInd: invalid response"); 8355 return 0; 8356 } 8357 #if VDBG 8358 RLOGD("modemResetInd"); 8359 #endif 8360 Return<void> retStatus = radioService[slotId]->mRadioIndication->modemReset( 8361 convertIntToRadioIndicationType(indicationType), 8362 convertCharPtrToHidlString((char *) response)); 8363 radioService[slotId]->checkReturnStatus(retStatus); 8364 } else { 8365 RLOGE("modemResetInd: radioService[%d]->mRadioIndication == NULL", slotId); 8366 } 8367 8368 return 0; 8369 } 8370 8371 int radio::networkScanResultInd(int slotId, 8372 int indicationType, int token, RIL_Errno e, void *response, 8373 size_t responseLen) { 8374 #if VDBG 8375 RLOGD("networkScanResultInd"); 8376 #endif 8377 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndicationV1_1 != NULL) { 8378 if (response == NULL || responseLen == 0) { 8379 RLOGE("networkScanResultInd: invalid response"); 8380 return 0; 8381 } 8382 RLOGD("networkScanResultInd"); 8383 8384 #if VDBG 8385 RLOGD("networkScanResultInd"); 8386 #endif 8387 8388 RIL_NetworkScanResult *networkScanResult = (RIL_NetworkScanResult *) response; 8389 8390 V1_1::NetworkScanResult result; 8391 result.status = (V1_1::ScanStatus) networkScanResult->status; 8392 result.error = (RadioError) e; 8393 convertRilCellInfoListToHal( 8394 networkScanResult->network_infos, 8395 networkScanResult->network_infos_length * sizeof(RIL_CellInfo_v12), 8396 result.networkInfos); 8397 8398 Return<void> retStatus = radioService[slotId]->mRadioIndicationV1_1->networkScanResult( 8399 convertIntToRadioIndicationType(indicationType), result); 8400 radioService[slotId]->checkReturnStatus(retStatus); 8401 } else { 8402 RLOGE("networkScanResultInd: radioService[%d]->mRadioIndicationV1_1 == NULL", slotId); 8403 } 8404 return 0; 8405 } 8406 8407 int radio::carrierInfoForImsiEncryption(int slotId, 8408 int indicationType, int token, RIL_Errno e, void *response, 8409 size_t responseLen) { 8410 if (radioService[slotId] != NULL && radioService[slotId]->mRadioIndicationV1_1 != NULL) { 8411 if (response == NULL || responseLen == 0) { 8412 RLOGE("carrierInfoForImsiEncryption: invalid response"); 8413 return 0; 8414 } 8415 RLOGD("carrierInfoForImsiEncryption"); 8416 Return<void> retStatus = radioService[slotId]->mRadioIndicationV1_1-> 8417 carrierInfoForImsiEncryption(convertIntToRadioIndicationType(indicationType)); 8418 radioService[slotId]->checkReturnStatus(retStatus); 8419 } else { 8420 RLOGE("carrierInfoForImsiEncryption: radioService[%d]->mRadioIndicationV1_1 == NULL", 8421 slotId); 8422 } 8423 8424 return 0; 8425 } 8426 8427 int radio::keepaliveStatusInd(int slotId, 8428 int indicationType, int token, RIL_Errno e, void *response, 8429 size_t responseLen) { 8430 #if VDBG 8431 RLOGD("%s(): token=%d", __FUNCTION__, token); 8432 #endif 8433 if (radioService[slotId] == NULL || radioService[slotId]->mRadioIndication == NULL) { 8434 RLOGE("%s: radioService[%d]->mRadioIndication == NULL", __FUNCTION__, slotId); 8435 return 0; 8436 } 8437 8438 auto ret = V1_1::IRadioIndication::castFrom( 8439 radioService[slotId]->mRadioIndication); 8440 if (!ret.isOk()) { 8441 RLOGE("%s: ret.isOk() == false for radioService[%d]", __FUNCTION__, slotId); 8442 return 0; 8443 } 8444 sp<V1_1::IRadioIndication> radioIndicationV1_1 = ret; 8445 8446 if (response == NULL || responseLen != sizeof(V1_1::KeepaliveStatus)) { 8447 RLOGE("%s: invalid response", __FUNCTION__); 8448 return 0; 8449 } 8450 8451 V1_1::KeepaliveStatus ks; 8452 convertRilKeepaliveStatusToHal(static_cast<RIL_KeepaliveStatus*>(response), ks); 8453 8454 Return<void> retStatus = radioIndicationV1_1->keepaliveStatus( 8455 convertIntToRadioIndicationType(indicationType), ks); 8456 radioService[slotId]->checkReturnStatus(retStatus); 8457 return 0; 8458 } 8459 8460 int radio::oemHookRawInd(int slotId, 8461 int indicationType, int token, RIL_Errno e, void *response, 8462 size_t responseLen) { 8463 if (oemHookService[slotId] != NULL && oemHookService[slotId]->mOemHookIndication != NULL) { 8464 if (response == NULL || responseLen == 0) { 8465 RLOGE("oemHookRawInd: invalid response"); 8466 return 0; 8467 } 8468 8469 hidl_vec<uint8_t> data; 8470 data.setToExternal((uint8_t *) response, responseLen); 8471 #if VDBG 8472 RLOGD("oemHookRawInd"); 8473 #endif 8474 Return<void> retStatus = oemHookService[slotId]->mOemHookIndication->oemHookRaw( 8475 convertIntToRadioIndicationType(indicationType), data); 8476 checkReturnStatus(slotId, retStatus, false); 8477 } else { 8478 RLOGE("oemHookRawInd: oemHookService[%d]->mOemHookIndication == NULL", slotId); 8479 } 8480 8481 return 0; 8482 } 8483 8484 void radio::registerService(RIL_RadioFunctions *callbacks, CommandInfo *commands) { 8485 using namespace android::hardware; 8486 int simCount = 1; 8487 const char *serviceNames[] = { 8488 android::RIL_getServiceName() 8489 #if (SIM_COUNT >= 2) 8490 , RIL2_SERVICE_NAME 8491 #if (SIM_COUNT >= 3) 8492 , RIL3_SERVICE_NAME 8493 #if (SIM_COUNT >= 4) 8494 , RIL4_SERVICE_NAME 8495 #endif 8496 #endif 8497 #endif 8498 }; 8499 8500 #if (SIM_COUNT >= 2) 8501 simCount = SIM_COUNT; 8502 #endif 8503 8504 configureRpcThreadpool(1, true /* callerWillJoin */); 8505 for (int i = 0; i < simCount; i++) { 8506 pthread_rwlock_t *radioServiceRwlockPtr = getRadioServiceRwlock(i); 8507 int ret = pthread_rwlock_wrlock(radioServiceRwlockPtr); 8508 assert(ret == 0); 8509 8510 radioService[i] = new RadioImpl; 8511 radioService[i]->mSlotId = i; 8512 oemHookService[i] = new OemHookImpl; 8513 oemHookService[i]->mSlotId = i; 8514 RLOGD("registerService: starting android::hardware::radio::V1_1::IRadio %s", 8515 serviceNames[i]); 8516 android::status_t status = radioService[i]->registerAsService(serviceNames[i]); 8517 status = oemHookService[i]->registerAsService(serviceNames[i]); 8518 8519 ret = pthread_rwlock_unlock(radioServiceRwlockPtr); 8520 assert(ret == 0); 8521 } 8522 8523 s_vendorFunctions = callbacks; 8524 s_commands = commands; 8525 } 8526 8527 void rilc_thread_pool() { 8528 joinRpcThreadpool(); 8529 } 8530 8531 pthread_rwlock_t * radio::getRadioServiceRwlock(int slotId) { 8532 pthread_rwlock_t *radioServiceRwlockPtr = &radioServiceRwlock; 8533 8534 #if (SIM_COUNT >= 2) 8535 if (slotId == 2) radioServiceRwlockPtr = &radioServiceRwlock2; 8536 #if (SIM_COUNT >= 3) 8537 if (slotId == 3) radioServiceRwlockPtr = &radioServiceRwlock3; 8538 #if (SIM_COUNT >= 4) 8539 if (slotId == 4) radioServiceRwlockPtr = &radioServiceRwlock4; 8540 #endif 8541 #endif 8542 #endif 8543 8544 return radioServiceRwlockPtr; 8545 } 8546